Code Monkey home page Code Monkey logo

typescript-styled-plugin's Introduction

TypeScript Styled Plugin

โ—๏ธ This package has been deprecated in favor of Styled component's fork.

TypeScript server plugin that adds intellisense to styled component css strings

Build Status

Features

  • IntelliSense for CSS property names and values.
  • Syntax error reporting.
  • Quick fixes for misspelled property names.

Usage

This plugin requires TypeScript 2.4 or later. It can provide intellisense in both JavaScript and TypeScript files within any editor that uses TypeScript to power their language features. This includes VS Code, Sublime with the TypeScript plugin, Atom with the TypeScript plugin, Visual Studio, and others.

With VS Code

Just install the VS Code Styled Components extension. This extension adds syntax highlighting and IntelliSense for styled components in JavaScript and TypeScript files.

If you are using a workspace version of TypeScript however, you must manually install the plugin along side the version of TypeScript in your workspace:

npm install --save-dev typescript-styled-plugin typescript

Then add a plugins section to your tsconfig.json or jsconfig.json

{
  "compilerOptions": {
    "plugins": [
      {
        "name": "typescript-styled-plugin"
      }
    ]
  }
}

Finally, run the Select TypeScript version command in VS Code to switch to use the workspace version of TypeScript for VS Code's JavaScript and TypeScript language support. You can find more information about managing typescript versions in the VS Code documentation.

With Sublime

This plugin works with the Sublime TypeScript plugin.

First install the plugin and a copy of TypeScript in your workspace:

npm install --save-dev typescript-styled-plugin typescript

And configure Sublime to use the workspace version of TypeScript by setting the typescript_tsdk setting in Sublime:

{
	"typescript_tsdk": "/Users/matb/my-amazing-project/node_modules/typescript/lib"
}

Finally add a plugins section to your tsconfig.json or jsconfig.json and restart Sublime.

{
  "compilerOptions": {
    "plugins": [
      {
        "name": "typescript-styled-plugin"
      }
    ]
  }
}

With Atom

This plugin works with the Atom TypeScript plugin.

First install the plugin and a copy of TypeScript in your workspace:

npm install --save-dev typescript-styled-plugin typescript

Then add a plugins section to your tsconfig.json or jsconfig.json and restart Atom.

{
  "compilerOptions": {
    "plugins": [
      {
        "name": "typescript-styled-plugin"
      }
    ]
  }
}

To get sytnax highlighting for styled strings in Atom, consider installing the language-babel extension.

With Visual Studio

This plugin works Visual Studio 2017 using the TypeScript 2.5+ SDK.

First install the plugin in your project:

npm install --save-dev typescript-styled-plugin

Then add a plugins section to your tsconfig.json.

{
  "compilerOptions": {
    "plugins": [
      {
        "name": "typescript-styled-plugin"
      }
    ]
  }
}

Then reload your project to make sure the plugin has been loaded properly. Note that jsconfig.json projects are currently not supported in VS.

Configuration

Tags

This plugin adds styled component IntelliSense to any template literal tagged with styled, css, injectGlobal, keyframes or createGlobalStyle:

import styled from 'styled-components'

styled.button`
    color: blue;
`

You can enable IntelliSense for other tag names by configuring "tags":

{
  "compilerOptions": {
    "plugins": [
      {
        "name": "typescript-styled-plugin",
        "tags": [
          "styled",
          "css",
          "sty"
        ]
      }
    ]
  }
}

Now strings tagged with either styled, css, or sty will have styled component IntelliSense:

import sty from 'styled-components'

sty.button`
    color: blue;
`

Tags also apply to methods on styled components. This is enabled for extend by default:

import sty from 'styled-components'

const BlueButton = sty.button`
    color: blue;
`

const MyFancyBlueButton = BlueButton.extend`
    border: 10px solid hotpink;
`

Linting

To disable error reporting, set "validate": false in the plugin configuration:

{
  "compilerOptions": {
    "plugins": [
      {
        "name": "typescript-styled-plugin",
        "validate": false
      }
    ]
  }
}

You can also configure how errors are reported using linter settings.

{
  "compilerOptions": {
    "plugins": [
      {
        "name": "typescript-styled-plugin",
        "lint": {
          "vendorPrefix": "error",
          "zeroUnits": "ignore"
        }
      }
    ]
  }
}

The following lint options are supported:

validProperties

["property1", "property2", ....]

List of properties that are treated as valid.

unknownProperties

"ignore" | "warning" | "error"

Should unknown properties show an error or warning? Default is "warning".

compatibleVendorPrefixes

"ignore" | "warning" | "error"

When using a vendor-specific prefix make sure to also include all other vendor-specific properties. Default is "ignore".

vendorPrefix

"ignore" | "warning" | "error"

When using a vendor-specific prefix also include the standard property. Default is "warning".

duplicateProperties

"ignore" | "warning" | "error"

Do not use duplicate style definitions. Default is "ignore".

emptyRules

"ignore" | "warning" | "error"

Do not use empty rulesets. Default is "ignore".

importStatement

"ignore" | "warning" | "error"

Import statements do not load in parallel. Default is "ignore".

boxModel

"ignore" | "warning" | "error"

Do not use width or height when using padding or border. Default is "ignore".

universalSelector

"ignore" | "warning" | "error"

The universal selector (*) is known to be slow. Default is "ignore".

zeroUnits

"ignore" | "warning" | "error"

No unit for zero needed. Default is "ignore".

fontFaceProperties

"ignore" | "warning" | "error"

@font-face rule must define 'src' and 'font-family' properties. Default is "warning".

hexColorLength

"ignore" | "warning" | "error"

Hex colors must consist of three or six hex numbers. Default is "error".

argumentsInColorFunction

"ignore" | "warning" | "error"

Invalid number of parameters. Default is "error".

ieHack

"ignore" | "warning" | "error"

IE hacks are only necessary when supporting IE7 and older. Default is "ignore".

unknownVendorSpecificProperties

"ignore" | "warning" | "error"

Unknown vendor specific property. Default is "ignore".

propertyIgnoredDueToDisplay

"ignore" | "warning" | "error"

Property is ignored due to the display. E.g. with 'display: inline', the width, height, margin-top, margin-bottom, and float properties have no effect. Default is "warning"

important

"ignore" | "warning" | "error"

Avoid using !important. It is an indication that the specificity of the entire CSS has gotten out of control and needs to be refactored. Default is "ignore".

float

"ignore" | "warning" | "error"

Avoid using 'float'. Floats lead to fragile CSS that is easy to break if one aspect of the layout changes. Default is "ignore".

idSelector

"ignore" | "warning" | "error"

Selectors should not contain IDs because these rules are too tightly coupled with the HTML. Default is "ignore".

Emmet in completion list

You can now see your Emmet abbreviations expanded and included in the completion list. An upstream issue with typescript blocks the Emmet entry in the completion list to get updated as you type. So for now you will have to press Ctrl+Space after typing out the abbreviation.

The below settings which are in sync with general Emmet settings in VS Code control the expanded Emmet abbreviations in the auto-completion list.

showExpandedAbbreviation

"always" | "never"

Controls whether or not expanded Emmet abbreviations should show up in the completion list

showSuggestionsAsSnippets

`true` | `false`

If true, then Emmet suggestions will show up as snippets allowing you to order them as per editor.snippetSuggestions setting.

preferences

Preferences used to modify behavior of some actions and resolvers of Emmet.

Contributing

To build the typescript-styled-plugin, you'll need Git and Node.js.

First, fork the typescript-styled-plugin repo and clone your fork:

git clone https://github.com/YOUR_GITHUB_ACCOUNT_NAME/typescript-styled-plugin.git
cd typescript-styled-plugin

Then install dev dependencies:

npm install

The plugin is written in TypeScript. The source code is in the src/ directory with the compiled JavaScript output to the lib/ directory. Kick off a build using the compile script:

npm run compile

switch to e2 to install or update test dependencies:

(cd e2e && npm install)

and then navigate back to the project root and run the end to end tests with the e2e script:

cd ..
npm run e2e

You can submit bug fixes and features through pull requests. To get started, first checkout a new feature branch on your local repo:

git checkout -b my-awesome-new-feature-branch

Make the desired code changes, commit them, and then push the changes up to your forked repository:

git push origin my-awesome-new-feature-branch

Then submit a pull request against the Microsoft typescript-styled-plugin repository.

Please also see our Code of Conduct.

Credits

Code originally forked from: https://github.com/Quramy/ts-graphql-plugin

typescript-styled-plugin's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

typescript-styled-plugin's Issues

Plugin doesn't activate inside subdirectory

My project has its source code in a subdirectory and tsconfig in that subdirectory. For example:

root
--project1
--project2
----tsconfig.json

I only use Typescript in project2. This works great. When adding this plugin, I don't get any errors, but it's also not activated. Here is my project2/tsconfig.json file

{
    "compilerOptions": {
        "outDir": "build/dist",
        "module": "commonjs",
        "target": "es5",
        "lib": ["es7", "dom"],
        "sourceMap": true,
        "allowJs": true,
        "jsx": "react",
        "moduleResolution": "node",
        "rootDir": "src",
        "forceConsistentCasingInFileNames": true,
        "noImplicitReturns": true,
        "noImplicitThis": true,
        "noImplicitAny": true,
        "strictNullChecks": true,
        "suppressImplicitAnyIndexErrors": true,
        "noUnusedLocals": false,
        "plugins": [
            {
                "name": "typescript-styled-plugin"
            }
        ]
    },
    "exclude": [
        "node_modules",
        "build",
        "scripts",
        "acceptance-tests",
        "webpack",
        "jest",
        "src/setupTests.ts",
        "coverage"
    ],
    "types": ["typePatches"]
}

I have tried adding typescript and typescript-styled-plugin to node_modules in both the root and subdirectory, but neither solved the issue.

Plugin doesn't work in Atom IDE

I tried to use that plugin with Atom v1.25 and [email protected] but it doesn't work. I have no styled-related syntax highlighting for .ts/.tsx files and also have no code completion at all. I am also a bit confusing about language-babel requirement for TS project because that plugin doesn't support TS-files.

Vendor specific emmet expansion does not work

Steps to reproduce

  1. For the code:
import * as styled from 'styled-components'

export const Button = styled.button`
    -trf:ro
`
  1. Trigger suggest on -trf:ro

Expected

import * as styled from 'styled-components'

export const Button = styled.button`
    -webkit-transform: rotate(angle);
    -moz-transform: rotate(angle);
    -ms-transform: rotate(angle);
    -o-transform: rotate(angle);
    transform: rotate(angle);
`

Actual

import * as styled from 'styled-components'

export const Button = styled.button`
    -trf:transform: rotate(angle);
`

jsconfig.json: Property "plugins" is not allowed

Thanks the work you've put into this! styled-components intellisense would be awesome!

Unfortunately, i can't seem to get it to work using vscode 1.16.1. i've set it up according to the docs, but there is no intellisense available. Additionally, the jsconfig.json looks like this:

plugins_not_allowed

multi-line properties incorrectly show errors

I have a fairly long css property that prettier has decided should be spread onto multiple lines:
image
This compiles and works totally fine, but ts-styled-plugin seems to mistakenly think there are errors, as you can see by the red squiggly lines in the screenshot. The first "error" is semi-colon expected and the second is { expected

Support for React-Native specific properties

There are several CSS properties that are specific to React-Native that are supported by styled-components/native. For example the following properties are part of React-Native but appear as errors when using this plugin:

const Main = styled.View`
  shadow-color: black;
  shadow-opacity: 0.5;
  shadow-offset: 2px 2px;
`

Would React-Native specific properties be something to consider supporting?

Unknown property 'scroll-snap-align'

I'm not sure I should file the issue in this repo โ€“ it's probably related to a dependency, and I don't which.

I get "Unknown property" warning when using scroll-snap-align css property in a styled component.

Parsing broken on complex selectors

I do employ a few complex selectors in my UI, unfortunately, and it seems that sometimes parsing seems to break, for example:

import React from 'react'
import styled from 'styled-components'
import fullWidth from '../../helpers/fullWidth'
import withTheme from '../../theme/withTheme'
import Button from './Button'

function ButtonGroup({ ...rest }) {
  return <div {...rest} />
}

const styledButtonGroup = styled(ButtonGroup)`
  display: flex;
  ${fullWidth()};

  ${Button} {
    width: 100%;
    
    &:not(:first-child):not(:last-child) {
      margin-left: 0;
      margin-right: 0;
      border-radius: 0;
    }
  }
`

export default withTheme(styledButtonGroup)

For the following code I get: [ts-styled-plugin] } expected (15, 13), however it compiles and works as expected

I have initially created styled-components/vscode-styled-components#50, but it looks like this issue should belong here

Linting error for pseudo-classes

Hello, I got this linting error in my VSCode editor specifically when I use CSS pseudo-classes in styled-components way (like hover in the screenshot below for example), I hope that this bug will be fixed soon to make this extension even better ๐Ÿ™‚

screenshot 54

monaco support

Do you support Monaco editor, or do you plan to support it?

ts-styled-plugin not respect the rules in stylelint.config.js

My environment:

  1. Visual Studio Code under Mac, Version 1.19.2
  2. "styled-components": "^2.4.0",
  3. "stylelint": "^8.4.0",
  4. "stylelint-config-standard": "^18.0.0",
  5. "stylelint-config-styled-components": "^0.1.1",
  6. "stylelint-processor-styled-components": "^1.2.1",
  7. "typescript": "^2.6.2",
  8. "typescript-styled-plugin": "^0.4.0"

stylelint.config.js is shown below with a rule of ignoreProperties: resize-mode

module.exports = {
  processors: ["stylelint-processor-styled-components"],
  extends: ["stylelint-config-standard", "stylelint-config-styled-components"],
  syntax: "scss",
  rules: {
    "property-no-unknown": [
      true,
      {
        ignoreProperties: ["/shadow/", "resize-mode"]
      }
    ]
  }
};

However, I still can see the error of "[ts-styled-plugin] Unknown property."
image

Any way to match a wrapper function?

One nasty parts of using styled-components with TS is the lack of typing when you pass props to your style literal.

One solution can be found in styled-components-ts which wraps the styled-components function to expose correct types for props. Where you get:

const StyledComponents = styledComponentWithProps<MyProps>(styled.div)`
    ${props => props.myValue}
`

And there's no need to write ${(props: MyProps) => {...}} with type annotations every time.

Only problem is that this fairly neatly breaks vscode's syntax highlighting and typescript-styled-plugin.

Any way to resolve this...? I've tried adding styledComponentWithProps to tags under the extension configuration in tsconfig... no joy...

Syntax error with placeholders as value

Steps to reproduce

  1. Type this code
const navBarWidth = 15

interface ContainerProps {
  withNavBar?: boolean
}

const Container = styled.div`
  flex: 1;

  & > ${Content} {
    margin-left: ${({ withNavBar }: ContainerProps) => (withNavBar ? `${navBarWidth}em` : 0)};
  }

  & > ${StyledNavBar} {
    margin-left: ${({ withNavBar }: ContainerProps) =>
      withNavBar ? 0 : `-${navBarWidth}em`} !important;
  }
`

Expected

No error

Actual

The property value expected error is raised.

capture d ecran 2018-02-20 a 14 30 21

Split generic template string language logic out into own library

Problem
There are a number of libraries and frameworks that embed languages in js/ts template strings. Editors could all benefit from having proper editor support for these embedded languages and TypeScript server plugins provide a good way to implement this functionality. However implementing a TS plugin for a template string currently requires a lot of boilerplate code

Proposal
Split the generic template string logic from this plugin out into a new npm library that other plugin authors could consume. This plugin's code already maintains a fairly clean separation between the generic template string logic and the styled-component specific logic

Add emmet support

From #33

Feature request to add support for emmet inside of styled components strings.

No autocompletion in nested selectors

In styled-components it is possible to nest the selectors, just like in SCSS, so you can write &:hover { ... } or .wrapper & { ... } or even ${OtherComponent} { ... }. Unfortunately the autocompletion breaks inside the curly brackets.

When looking at this issue, I replaced the this.cssLanguageService.doComplete with this.scssLanguageService.doComplete in plugin source. Now, it can properly suggest css inside a nested selector. Downside of this solution is that now it also suggests all sort of SCSS functions which are not supported by the styled-components. Still better than having no autocomplete at all, but not enough to create a PR for that I guess.

I see two ways of resolving that problem. First: restrict the results returned from scssLanguageService.doComplete so they don't contain SCSS functions. Second: parse the code with SCSS and perform CSS version of doComplete only on the code part enclosed by current selector scope.

Does not support strings with placeholders

Support is currently disabled for template strings that use any placeholder values:

import styled from 'styled-components'

const color = '#f0f'
styled.button`
    color: ${color};
`

Most autocomplete items are missing

For some reason, my typescript-styled-plugin is triggering, but not displaying most autocompletion items.

Typescript version 2.6.1
VSCode version 1.18.1
typescript-styled-plugin version 0.2.2

tsautocompletebug

Unknown property: 'appearance'

Trying to set appearance: none on VS Code generates warning message:
[ts-styled-plugin]: Unknown property: 'appearance'

For the following code:

import React from 'react';
import PropTypes from 'prop-types';
import styled from 'react-emotion';

const StyledButton = styled('button')`
  appearance: none;

  &:hover {
    color: pink;
  }
`;

const Button = ({ children, ...rest }) => (
  <StyledButton {...rest}>{children}</StyledButton>
);

Button.propTypes = {
  children: PropTypes.node.isRequired,
};

export default Button;

Working example setup

I've tried to set this plugin with VS Code in my project, but couldn't make it for whatever reasons, wondering if that's a bug or I'm doing something wrong.

Having an example app set up in this repo (unless we get the VS Code extension #10) would definitely be helpful in such cases.

Thanks!

Bundle plugin into a VS Code extension

We have an experimental means for a VS Code extension to contribute TypeScript plugins. This would have a few benefits:

  1. Simplified installation
  2. No jsconfig or tsconfig configuration required.
  3. No need to npm install the plugin into each workspace or put it in your package.json
  4. Will work with loose js/ts files (files that are not part of any js/tsconfig project)
  5. Extension can also contribute other goodness, such as syntax highlighting

To be clear, the TypeScript server plugin itself would continue to work across all editors that use the TypeScript language service. This issue merely tracks bundling up the plugin into a VS Code extension

False Positive Error When Interpolating Props In Declaration Name

I'm encountering a false-positive from ts-styled-plugin when using thevscode-styled-components plugin for which this plugin is a dependency. The error is thrown up by the use of interpolation in a declaration name.

Code
cap

Alternative Example
cap

Error Message:

[ts-styled-plugin] } expected

vscode-styled-components 0.0.18 < typescript-styled-plugin0.6.3
babel-javascript: 0.0.14
vscode 1.23.0 (1.23.0)

Link to original issue on vscode-styled-components to track.

[ts-styled-plugin] property value expected

Hey,
I'm getting this error: [ts-styled-plugin] property value expected

screen shot 2018-03-30 at 10 06 46 am

const activeClassName = 'active-nav-link'

const Link = styled(NavLink).attrs({ activeClassName })`
  &.${activeClassName} {
    background-color: ${color.lightest};
  }

  &:hover {
    background-color: ${color.lightest};
  }
`

I get an error above. But not in the code below.

const activeClassName = 'active-nav-link'

const Link = styled(NavLink).attrs({ activeClassName })`
  &:hover {
    background-color: ${color.lightest};
  }  

  &.${activeClassName} {
    background-color: ${color.lightest};
  }
`

It is not working when use `export default`.

It works just fine when:

import styled from 'styled-components'

const Button = styled.a`
    color: blue;
`

export default Button;

But when it comes to:

import styled from 'styled-components'

export default styled.a`
    color: blue;
`;

The plugin seems not working at this time.

ts: 2.5.3
vscode: 1.16.1

Emmet suggestions do not use snippets

Steps to reproduce

  1. For the code

    import * as styled from 'styled-components'
    
    export const Button = styled.button`
        bdlw
    `
  2. Trigger suggest on bdlw

Expected

import * as styled from 'styled-components'

export const Button = styled.button`
    border-left-width: |;
`

Where | is the cursor

Actual

import * as styled from 'styled-components'

export const Button = styled.button`
    border-left-width: ;|
`

Usage with themes

Hi there, great plugin. Only issue I've run into is that I have to jump through a few hoops to get it to work with styled components themes since they require some type composition using the & operator. This means wrapping the ES6 string template in a function which seems to break the plugin's syntax highlighting.

Take the following example where Spinner gets syntax highlighting properly but Spinner2 does not:

import themed, { withProps, keyframes } from './themed-components';

interface IProps {
  active?: boolean;
}

// Any html styled components can go here
// Req'd due to: 
const styled = {
  div: withProps<IProps>()(themed.div)
};

// take a type and a string, return a styled component

export const Rotate360 = keyframes`
  0% {
    transform: rotate(0deg);
  }

  100% {
    transform: rotate(360deg);
  }
`;

export const Spinner = styled.div`
  animation: ${Rotate360} 1.1s infinite linear;
  border-color: ${props => props.theme.color.blue400} ${props =>
  props.theme.color.blue400} ${props => props.theme.color.blue400} ${props =>
  props.theme.color.blue200};
  border-radius: 50%;
  border-style: solid;
  border-width: 1.1em;
  display: inline-block;
  font-size: 10px;
  height: 10em;
  margin: 60px auto;
  overflow: hidden;
  position: relative;
  text-indent: -9999px;
  transform: translateZ(0);
  width: 10em;
`;

export const Spinner2 = withProps<IProps>()(themed.div)`
animation: ${Rotate360} 1.1s infinite linear;
border-color: ${props => props.theme.color.blue400} ${props =>
props.theme.color.blue400} ${props => props.theme.color.blue400} ${props =>
props.theme.color.blue200};
border-radius: 50%;
border-style: solid;
border-width: 1.1em;
display: inline-block;
font-size: 10px;
height: 10em;
margin: 60px auto;
overflow: hidden;
position: relative;
text-indent: -9999px;
transform: translateZ(0);
width: 10em;
`;

themed-components looks like this:

import * as styledComponents from 'styled-components';

import { ThemedStyledComponentsModule } from 'styled-components';
import { ThemedStyledFunction } from 'styled-components';

import { ITheme } from './theme/standard';

function withProps<U>() {
    return <P,T,O>(
        fn: ThemedStyledFunction<P, T, O>
    ): ThemedStyledFunction<P & U, T, O & U> => fn
}

const {
  default: styled,
  css,
  injectGlobal,
  keyframes,
  ThemeProvider,
  withTheme,
} = styledComponents as ThemedStyledComponentsModule<ITheme>;

export {
  css,
  injectGlobal,
  keyframes,
  ThemeProvider,
  withProps,
  ITheme,
  withTheme,
};
export default styled;

Effectively I am just wrapping styled-components in themed-components so that I can provide a theme using ThemeProvider. It actually works really well but there is one caveat, the vs code plugin requires that I have this broken out in my file because it seems not to like composition around the styled template tag:

const styled = {
  div: withProps<IProps>()(themed.div)
};

If I try to inline those lines in the string template like in Spinner2 then css formatting is gone. It seems like it really wants styled.div syntax right by the template syntax.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.