Giter VIP home page Giter VIP logo

nano-css's Introduction

nano-css

Tiny 5th generation CSS-in-JS library that you can actually use in production. Motto of nano-css is simple: create the smallest possible CSS-in-JS library and provide all features of any other library through addons.

  • Only 0.5 Kb in base configuration, e.g. styled-components is 15.1Kb
  • Library-agnostic — use it standalone, with React, Preact, Vue.js, or any other library
  • Isomorphic — render on server and browser, generates stable class names, and re-hydrates
  • Performantsimply the fastest library; does not create wrapper components, does not use inline styles or inline <style> elements, but caches all styles for re-use and injects CSS using .insertRule() for performance
  • @media queries and animation @keyframes are supported
  • Auto-prefixes your styles
  • Extract CSS into external style sheet
  • Public domainUnlicense license

For pre-configured simple-to-use package see nano-theme, which builds on top of nano-css.

Reference

nano-css's People

Contributors

dependabot[bot] avatar estrattonbailey avatar harryzcy avatar jameswesc avatar jdsxzhao avatar phoenisx avatar renovate-bot avatar renovate[bot] avatar russelgal avatar semantic-release-bot avatar steadicat avatar streamich avatar thebosz avatar vinspee avatar xobotyi avatar

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

nano-css's Issues

"important" addon adds double "!important"

With the fix for #196, now the stylesheet gets generated with extra "!important" lines:

.__sjcenb-data-fields {
    min-height:88px !important; !important;
}

Luckily, the extra lines get dropped since they're invalid, but it's not ideal.

Handle css rules specificity

Hello, I have a problem using nano-css in combination with global pre-existing styles.

For example:

/* style.css */
.myapp button {
  font-size: inherit;
}

Then I create a button with jsx:

const Button = jsx('button', {
  fontSize: '24px'
});

Which generates a random class name for my button component. Problem is, due to css rules specificity the global rule is more specific than the one generated for the component and so the custom font-size is ignored.

Other css-in-js handled that problem with a custom namespace that could be added to every class, like this one for stylis.

It could be possible to implement something like that for nano-css? Maybe it could be enough to just allow to pass a custom stylis instance to the stylis addon, which could also be useful for other reasons.

Thank you.

Extract: add ability to replace calls to nano with generated classnames

I'm very excited by this project; it ticks a lot of the needs we have for a CSS-in-JS solution.

One thing would make it fit exactly: the ability to not have a runtime at all.

I know that goes against some of the CSS-in-JS "rules".

The way I would see it would be that I could use the sheet interface to add classes to my components. Then I could run an extract that would generate the CSS file. This would also replace the references to the classes with the actual class names.

It could be like this: It would replace the calls to nano with the results
Input:

const cssMap = {
    input: {
        border: '1px solid grey',
    },
    button: {
        border: '1px solid red',
        color: 'red',
    }
};
const styles = sheet(cssMap);

<input className={styles.input}>
<button className={styles.button}>Click me!</button>

And output:

const styles = {
	input: 'class-b-1px-solid-grey',
	button: 'class-b-1-px-solid-grey-c-red',
};

<input className={styles.input}>
<button className={styles.button}>Click me!</button>

This way, the actual calls to nano would be removed and then pruned. The size of my app wouldn't be any bigger, but it would have the advantages of CSS-in-JS except for dynamic classes/styles, which is a known limitation and one which I accept.

Using with Preact/TypeScript

I'm trying to use nano-css with a new preact project using TypeScript and it's not finding/working with the type definitions in the package.

tsconfig.json:

{
  "compilerOptions": {
    "target": "es5",
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "jsx": "react",
    "jsxFactory": "h",
    "lib": ["es5", "es6", "dom"],
    "rootDirs": ["src"]
  }
}

src/nano.ts:

import { preset } from 'nano-css/preset/sheet';

const { rule, sheet } = preset();

export {
  rule,
  sheet,
};

The error I am getting is:

7016[QF available]: Could not find a declaration file for module 'nano-css/preset/sheet'. 
'/Users/tombell/Code/[redacted]/node_modules/nano-css/preset/sheet.js' implicitly has an 'any' type. 
Try `npm install @types/nano-css` if it exists or add a new declaration (.d.ts) file containing `declare module 'nano-css/preset/sheet';

I can disable the error by turning off noImplicitAny, but I would rather not disable that for my actual project.

React and react-dom in peer dependencies

Hi, first of all thank you for so good library.

I'm using nano-css in my project based on Vue.js and every time during install dependencies I get warnings, that react and react-dom are not installed.

Everything works fine, except of that moment.

Can You fix that? Thanks

"content" styles aren't handled well

When I use "content" styles, the styles have to be surrounded by an extra pair of quotes or it'll get messed up.

An example original CSS:

.divider {
  &:after {
    content: '|';
  }
}

Code:

nano.rule({
  divider: {
    '&:after': {
      content: '|',
    },
  },
});

Resulting CSS:

.__1elt25k-divider:after {
    content:|;
}

Notice that the quotes have been stripped from the content character. If I use a doubly-quoted string content: '"|"', it works just fine.

I'm not sure that this is a bug or more of a "I have to look out for content rules since they're special" thing.

Why useStyles is not a hook?

According to react convention, components starting with use- prefix are hooks.
That's a bit confusing that this component is called like hook but indeed it is not.

Would be nice to just

props => {
let classes = useStyles({
root: {...},
secondary: {...}
})

return <div className={classes.root}></div>
}

Server-rendering (a.k.a. hydrate) broken with virtual addon

Unless I’m misunderstanding the (very scant) docs, when the virtual addon is enabled, hydrate does not seem to do what it's supposed to, i.e. it does not reuse the rules injected by the server into the DOM.

Here’s a simple test case to reproduce:

import { create } from "nano-css";
import { addon as addonRule } from "nano-css/addon/rule";
import { addon as addonVirtual } from 'nano-css/addon/virtual';
import { addon as addonHydrate } from "nano-css/addon/hydrate";

const style = document.createElement("style");
style.innerText = "._a {color: red;}._b {color: blue;}";
document.head.appendChild(style);

const nano = create({ sh: style });
addonRule(nano);
addonVirtual(nano);
addonHydrate(nano);

console.log(nano.rule({ color: "blue" }));
console.log(nano.rule({ color: "red" }));

(Run it in CodeSandbox)

I would expect color: blue to return the existing _a class and color: red to return the existing _b class. Instead they return new class names, which clash with the server-rendered ones. This breaks all the styles!

As an aside, the docs mention injecting nano.raw into the server rendered HTML. However, there is no mention of the fact that you're supposed to clear the accumulated rules after every page render, or how to do that. The only way I’ve found so far that works reliably is to create a new nano instance for every request.

Allow stylis to upgrade by semver?

Stylis dependency is fixed in package.json to 3.5.0 when there is several patch versions with bug fixes.

Consider to allow update version by semver? (~3.5.0 or ^3.5.0)

Guide?

nano-css may be good after look through all of the documents. It's overwhelming for new comers. How to grab the recommended practice quickly?

The automated release is failing 🚨

🚨 The automated release from the master branch failed. 🚨

I recommend you give this issue a high priority, so other packages depending on you could benefit from your bug fixes and new features.

You can find below the list of errors reported by semantic-release. Each one of them has to be resolved in order to automatically publish your package. I’m sure you can resolve this 💪.

Errors are usually caused by a misconfiguration or an authentication problem. With each error reported below you will find explanation and guidance to help you to resolve it.

Once all the errors are resolved, semantic-release will release your package the next time you push a commit to the master branch. You can also manually restart the failed CI job that runs semantic-release.

If you are not sure how to resolve this, here is some links that can help you:

If those don’t help, or if this issue is reporting something you think isn’t right, you can always ask the humans behind semantic-release.


Invalid npm token.

The npm token configured in the NPM_TOKEN environment variable must be a valid token allowing to publish to the registry https://registry.npmjs.org/.

If you are using Two-Factor Authentication, make configure the auth-only level is supported. semantic-release cannot publish with the default auth-and-writes level.

Please make sure to set the NPM_TOKEN environment variable in your CI with the exact value of the npm token.


Good luck with your project ✨

Your semantic-release bot 📦🚀

Painfully slow in development

Currently nano.rule and nano.put use individual calls to appendChild to add rules to a <style> tag while in development. As the stylesheet grows, some appendChild calls can take up to 30ms (see screenshot), which for large updates can add up to several seconds (3.6s in my example below).

This could be made a lot faster by batching updates together and setting the <style> tag content using innerText.

Simple batching using requestAnimationFrame is not super efficient – due to the overhead of lots of requestAnimationFrame/cancelAnimationFrame calls – but it cuts the time down by ~30x, which is acceptable. Would making the updates to the stylesheet asynchronous have any major downsides?

Alternatively, an explicit batching/transaction API could be introduced, but that seems overkill for something that’s only an issue in development.

Any other ideas?

image

You can't use virtual with keyframes

Virtual will murder keyframes.

The following:

@keyframes sk-foldCubeAngle {
	0%, 10% {
		transform: perspective(140px) rotateX(-180deg);
		opacity: 0;
	}
	25%, 75% {
		transform: perspective(140px) rotateX(0deg);
		opacity: 1;
	}
	90%, 100% {
		transform: perspective(140px) rotateY(180deg);
		opacity: 0;
	}
}

Gets murdered into something like this:

@keyframes sk-foldCubeAngle{._ne:before 0%,._ne:before  10%{transform:perspective(140px) rotateX(-180deg)}}@keyframes sk-foldCubeAngle{._nf:before 0%,._nf:before  10%{opacity:0}}@keyframes sk-foldCubeAngle{._ng:before 25%,._ng:before  75%{transform:perspective(140px) rotateX(0deg)}}@keyframes sk-foldCubeAngle{._nh:before 25%,._nh:before  75%{opacity:1}}@keyframes sk-foldCubeAngle{._ni:before 90%,._ni:before  100%{transform:perspective(140px) rotateY(180deg)}}@keyframes sk-foldCubeAngle{._nj:before 90%,._nj:before  100%{opacity:0}}._nk:before{transform-origin:100% 100%}._nl{transform:scale(1.1) rotateZ(90deg)}._nm:before{animation-delay:0.3s}._nn{transform:scale(1.1) rotateZ(180deg)}._no:before{animation-delay:0.6s}._np{transform:scale(1.1) rotateZ(270deg)}._nq:before{animation-delay:0.9s}

When it should really just be:

@keyframes sk-foldCubeAngle{0%, 10%{transform:perspective(140px) rotateX(-180deg);opacity:0;}25%, 75%{transform:perspective(140px) rotateX(0deg);opacity:1;}90%, 100%{transform:perspective(140px) rotateY(180deg);opacity:0;}}

"important" addon adds "!important" in the middle of a data url

Because it's just looking for a semicolon, it's inserting an "!important" in the middle of this url:

{
  'background-image': 'url("data:image/svg+xml;utf8,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\' width=\'48\' height=\'36\' viewBox=\'0 0 48 36\' fill=\'rgb(28,28,28)\'%3E%3Crect x=\'16\' y=\'12\' width=\'16\' height=\'2\' /%3E%3Crect x=\'16\' y=\'17\' width=\'16\' height=\'2\' /%3E%3Crect x=\'16\' y=\'22\' width=\'16\' height=\'2\' /%3E%3C/svg>")',
}

Result:

background-image:url("data:image/svg+xml !important;utf8,%3-csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='48' height='36' viewBox='0 0 48 36' fill='rgb(28,28,28)'%3E%3Crect x='16' y='12' width='16' height='2' /%3E%3Crect x='16' y='17' width='16' height='2' /%3E%3Crect x='16' y='22' width='16' height='2' /%3E%3C/svg>") !important;

Note that the part xml;utf8, got converted to xml !important;utf8

Addon for vertical/horizontal

Would you be able to add an addon to support horizontal and vertical for margin and padding?
It would be used like:

{
  marginHorizontal = '20px'
}

Which would be equivalent to:

{
  marginLeft = '20px',
  marginRight = '20px'
}

And vertical would be used for both top and bottom values.
Could even add them to atoms with v and h.
I'm just used to using those in React Native and I would love to see support for it in here!

The automated release is failing 🚨

🚨 The automated release from the master branch failed. 🚨

I recommend you give this issue a high priority, so other packages depending on you could benefit from your bug fixes and new features.

You can find below the list of errors reported by semantic-release. Each one of them has to be resolved in order to automatically publish your package. I’m sure you can resolve this 💪.

Errors are usually caused by a misconfiguration or an authentication problem. With each error reported below you will find explanation and guidance to help you to resolve it.

Once all the errors are resolved, semantic-release will release your package the next time you push a commit to the master branch. You can also manually restart the failed CI job that runs semantic-release.

If you are not sure how to resolve this, here is some links that can help you:

If those don’t help, or if this issue is reporting something you think isn’t right, you can always ask the humans behind semantic-release.


Invalid npm token.

The npm token configured in the NPM_TOKEN environment variable must be a valid token allowing to publish to the registry https://registry.npmjs.org/.

If you are using Two-Factor Authentication, make configure the auth-only level is supported. semantic-release cannot publish with the default auth-and-writes level.

Please make sure to set the NPM_TOKEN environment variable in your CI with the exact value of the npm token.


Good luck with your project ✨

Your semantic-release bot 📦🚀

Nesting with the "+" selector

I'm in the process of converting our project over to using NanoCSS (which we're loving, by the way) and I came across an interesting situation.

We have an element that needs padding between it and any copies of itself.

The sass uses this:

.new-data-field {
	border: 1px solid $white;
	border-radius: 2px;
	padding: 5px;

	+ .new-data-field {
		margin-top: 5px;
	}
}

Translated into JSON, I have this:

'new-data-field': {
	border: `1px solid ${Colors.$white}`,
	'border-radius': '2px',
	padding: '5px',

	'+ &': {
		'margin-top': '5px',
	},
},

That generates incorrect classes:

.__1mqbk4w-new-data-field {
    border:1px solid #fff !important;
    border-radius:2px !important;
    padding:5px !important;
}

+ .__1mqbk4w-new-data-field {
    margin-top:5px !important;
}

If I try to manually set the relationship using '& + &' like this:

'new-data-field': {
	border: `1px solid ${Colors.$white}`,
	'border-radius': '2px',
	padding: '5px',

	'& + &': {
		'margin-top': '5px',
	},
},

I get the following, also-incorrect, CSS:

.__1lol306-new-data-field {
    border:1px solid #fff !important;
    border-radius:2px !important;
    padding:5px !important;
}

.__1lol306-new-data-field + & {
    margin-top:5px !important;
}

Is there something I'm missing here? How can I support this situation?

I know I could make another class for just the elements beyond the first, but I was wondering if there was a way to do it using the "+" selector.

Thanks!

No insertRule cache?

I’ve been using the virtual add-on mainly because it has the side effect of not inserting new rules on every render and infinitely growing the stylesheet. Since I noticed that virtual has issues with server rendering, I tried disabling it, and I was surprised to see that by default, Nano does not keep a cache rules previously injected in the stylesheet.

If you inline rule definitions in your React render methods, new rules get added on every render, even if they are identical.

Here's a screenshots from logging before insertRule. I've got 600 rules right after load, and identical rules are injected all the time:

image

With a quick custom solution I wrote that does caching, the number of rules on the same page plateaus somewhere around 80:

image

I think Emotion and most other CSS libraries optimize this part. It seems like a relatively simple optimization. Any reason not to do it?

The automated release is failing 🚨

🚨 The automated release from the master branch failed. 🚨

I recommend you give this issue a high priority, so other packages depending on you could benefit from your bug fixes and new features.

You can find below the list of errors reported by semantic-release. Each one of them has to be resolved in order to automatically publish your package. I’m sure you can resolve this 💪.

Errors are usually caused by a misconfiguration or an authentication problem. With each error reported below you will find explanation and guidance to help you to resolve it.

Once all the errors are resolved, semantic-release will release your package the next time you push a commit to the master branch. You can also manually restart the failed CI job that runs semantic-release.

If you are not sure how to resolve this, here is some links that can help you:

If those don’t help, or if this issue is reporting something you think isn’t right, you can always ask the humans behind semantic-release.


Invalid npm token.

The npm token configured in the NPM_TOKEN environment variable must be a valid token allowing to publish to the registry https://registry.npmjs.org/.

If you are using Two-Factor Authentication, make configure the auth-only level is supported. semantic-release cannot publish with the default auth-and-writes level.

Please make sure to set the NPM_TOKEN environment variable in your CI with the exact value of the npm token.


Good luck with your project ✨

Your semantic-release bot 📦🚀

Demo is not updated

package.json has a script for demo, but their is no webpack.config.js present, that is used by the script.

If it is intentionally done, I can raise a PR updating demos for the library.

extract add on crashes with ES6-style imports

If I run the extract add on using the JSX demo, node throws an error:

C:\projects\nano-css-extract-demo\demo>node extract.js
C:\projects\nano-css-extract-demo\demo\src\nano.js:1
(function (exports, require, module, __filename, __dirname) { import { createEle
ment } from "react";
                                                              ^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (C:\projects\nano-css-extract-demo\demo\extract.js:1:7
6)

Can you provide an updated example that uses the JSX demo?

Kebab method doesn't properly kebab -ms prefix

Using the prefix addon with "user-select" generates invalid CSS.

It's because the kebab method doesn't properly handle the result from inline-style-prefixer.

Here's the result from running prefixer: https://runkit.com/embed/68hf1a20xhsd

{
	"WebkitUserSelect" : "none",
	"MozUserSelect" : "none",
	"msUserSelect" : "none",
	"userSelect" : "none"
}

Note that the ms version has a lower-case m. That makes the kebab return 'ms-user-select' instead of the proper '-ms-user-select'.

Webpack plugin for extract

Is there any plugin for Webpack to extract static CSS?

The current solution to extract CSS using Node script is very inconvenient because it cannot be added to Webpack build.

The automated release is failing 🚨

🚨 The automated release from the master branch failed. 🚨

I recommend you give this issue a high priority, so other packages depending on you could benefit from your bug fixes and new features.

You can find below the list of errors reported by semantic-release. Each one of them has to be resolved in order to automatically publish your package. I’m sure you can resolve this 💪.

Errors are usually caused by a misconfiguration or an authentication problem. With each error reported below you will find explanation and guidance to help you to resolve it.

Once all the errors are resolved, semantic-release will release your package the next time you push a commit to the master branch. You can also manually restart the failed CI job that runs semantic-release.

If you are not sure how to resolve this, here is some links that can help you:

If those don’t help, or if this issue is reporting something you think isn’t right, you can always ask the humans behind semantic-release.


The push permission to the Git repository is required.

semantic-release cannot push the version tag to the branch master on remote Git repository with URL https://github.com/streamich/nano-css.git.

Please refer to the authentication configuration documentation to configure the Git credentials on your CI environment and make sure the repositoryUrl is configured with a valid Git URL.


Good luck with your project ✨

Your semantic-release bot 📦🚀

Source maps

Hi @streamich,

Awesome and thorough work on this! :) I believe css-in-js is the future and am always glad to see new and ambitious projects.
I also like how everything is optional, pluggable and that nothing is opinionated and that it is framework/runtime agnostic.

I realize it's a new project and probably still lacks some features, and I bet you've got a list of these too :). One thing which I personally, can't live without in css-in-js (and JS transpilers) is source maps.
In the world of css-in-js, I've only used styled-components and emotion so far. The latter supports source maps, while the former doesn't. To me, it is such a detrimental feature that I may switch from styled to emotion in a large project I lead.

Hope you add source maps to nano-css at some point. I'll be keeping an eye on your project, since it seems promising.

@font-face results to invalid CSS

I run the following code

nano.global({
    '@font-face': {
        fontFamily: 'Panton Regular',
        src: 'url("/fonts/Panton-Regular.woff2") format("woff2")',
        fontWeight: 'normal',
        fontStyle: 'normal'
    }
});

and it results to this CSS which is invalid

@font-face{
 {
    font-family:Panton Regular;
    src:url("/fonts/Panton-Regular.woff2") format("woff2");
    font-weight:normal;
    font-style:normal;
}
}

Valid CSS looks like this:

@font-face
 {
    font-family:Panton Regular;
    src:url("/fonts/Panton-Regular.woff2") format("woff2");
    font-weight:normal;
    font-style:normal;
}

Improve Readme

  • Improve README
  • Add quick getting started usage example, using a preset

"kebab" method improperly used on style value in data URL

This is related to #203, but slightly different.

We stopped using the "important" addon because we finally excised all SASS files, but this is causing issues.

We have a style definition of this:

{
  'background-image': 'url("data:image/svg+xml;utf8,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\' width=\'48\' height=\'36\' viewBox=\'0 0 48 36\' fill=\'rgb(28,28,28)\'%3E%3Crect x=\'16\' y=\'12\' width=\'16\' height=\'2\' /%3E%3Crect x=\'16\' y=\'17\' width=\'16\' height=\'2\' /%3E%3Crect x=\'16\' y=\'22\' width=\'16\' height=\'2\' /%3E%3C/svg>")',
}

It generates the following style:

background-image:url("data:image/svg+xml;utf8,%3-csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='48' height='36' viewBox='0 0 48 36' fill='rgb(28,28,28)'%3E%3Crect x='16' y='12' width='16' height='2' /%3E%3Crect x='16' y='17' width='16' height='2' /%3E%3Crect x='16' y='22' width='16' height='2' /%3E%3C/svg>");

Notice how the characters "utf8,%3Csvg" got converted to "utf8,%3-csvg". That breaks the XML and causes the rule to be dropped by the browser.

The correct rule is:

background-image: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='48' height='36' viewBox='0 0 48 36' fill='rgb(28,28,28)'%3E%3Crect x='16' y='12' width='16' height='2' /%3E%3Crect x='16' y='17' width='16' height='2' /%3E%3Crect x='16' y='22' width='16' height='2' /%3E%3C/svg>");

Note: I'm assuming that kebab is to blame here, but I don't really know. It's quite possible that kebab shouldn't be run on url() values.

Remove leading space

Firstly, great work on this library! It's the smallest and most performant CSSinJS solution that I have found so far!

Is there any way to remove the leading space from the generated class name other than always having to manually trim them?

I feel like it would be easier for those using in React concatenating to just add a space. Whenever I try to use it with classList.add on a normal element, it blows up because of the leading space.

"keyframes" addon doesn't like sheet()

In process of converting our project from sass, I ran across a problem with how I was implementing Keyframes for an animation.

I was just using sheet() for all my rules, but noticed that the keyframes addon didn't work.

I switched to using rule() and it worked fine.

I thought sheet() was just a fancy wrapper around rule. If it is, it should handle keyframes the same as rule(). If not, maybe note that in the documentation?

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.