Git Product home page Git Product logo

tailwindcss-classnames's Introduction

tailwindcss-classnames NPM npm bundle size npm version

Functional typed classnames for TailwindCSS

TailwindCSS is a CSS library that has gained a lot of traction. The developer experience is pretty epic and you ensure a low footprint on your css by composing existing classes for most of your css.

So why mess with it?

TailwindCSS is based on strings and with some nice tooling on top like TailwindCSS VSCode extension you get a pretty descent experience. That said, there are limitations to a purely declarative approach of strings. When using tailwindcss-classnames you will get additional power in the form of:

  • Validation of classnames: You can not write the wrong classname, cause the API only allows you to insert valid classnames
  • Functional approach: Since we are working in Typescript we get more freedom in using functional powers like composition and dynamic composition
  • Defining by variables: Even though it is nice to write TailwindCSS inline with your elements, it does not scale. You want to move definitions outside of the component for reusability and composition
  • Support for all editors and IDEs: Because it's just TypeScript types, you get these powers in all editors and IDEs that support TypeScript.

You can not get this experience using pure TailwindCSS and the VSCode extension, but you do get it with tailwindcss-classnames.

Edit tailwindcss-classnames

Install

Please follow the guide to set up TailwindCSS. Now do:

npm install tailwindcss-classnames

NOTE: This project versions match with TailwindCSS versions except for semver patch releases

The project is literally the clsx project with custom typing. That means it arrives at your browser at approximately 2.7kB minified and gzipped (bundlephobia).

What's New in v3

  • Way better performance overall (thanks to @dylanvann's idea and suggestions):

    • Generated file size is reduced to be < 200 KB (default config). Previous version was generating a file sized about 100 MB.
    • Fast autocompletion: this is due to usage of more specific utility functions and using template string types
  • BREAKING: Dropped support for JIT engine's Colors Opacity suffix feature (due to TypesScript TS2590 error)

  • BREAKING: Create Utility functions that accepts classnames (and pseudoclassnames) of that category. The classnames function won't accept or show autocompletion of all classnames anymore, but it will accept a function of these category functions (#293)

    ✅ Correct

    classnames(
      display('flex', 'md:block'),
      textColor('text-black', 'hover:text-red-600'),
      flexDirection('flex-row-reverse'),
    );

    OR

    classnames(
      flexBox('flex', 'md:block', 'flex-row-reverse'),
      typography('text-black', 'hover:text-red-600', 'text-3xl', 'text-center', 'italic'),
    );

    ❌ Incorrect

    classnames('flex', 'md:block', 'text-black', 'hover:text-red-600', 'flex-row-reverse');

    twcn3

    To make the migrtion easier, Ryan Goree created twcn3 which is a CLI that converts old codebase using the single classnames function into multiple utility functions.

Create classes

import {classnames} from 'tailwindcss-classnames';

classnames('border-none', 'rounded-sm');

The arguments passed to classnames is typed, which means you get discoverability. You can even search for the supported classes:

DISCOVER

Dynamic classes

Since we are using classnames you can also add your classes dynamically:

import {classnames} from 'tailwindcss-classnames';

classnames('border-none', 'rounded-sm', {
  ['bg-gray-200']: true,
});

Composing classes

Even though classnames just returns a string, it is a special typed string that you can compose into other definitions.

import {classnames} from 'tailwindcss-classnames';

export const button = classnames('border-none', 'rounded-sm');

export const redButton = classnames(button, 'bg-red-100');

Using with React

Since React has excellent typing support I want to give an example of how you could use it.

// styles.ts
import {classnames} from 'tailwindcss-classnames';

export const form = classnames('container', 'w-full');

export const button = classnames('border-none', 'rounded-sm');

export const alertButton = classnames(button, 'bg-red-100');

export const disabled = classnames('opacity-25', 'bg-gray-100');

export const submitButton = (disabled: boolean) =>
  classnames(styles.button, {
    [styles.disabled]: disabled,
  });

// App.tsx
import * as React from 'react';
import * as styles from './styles';

export const App: React.FC<{disabled}> = ({disabled}) => {
  return (
    <form className={styles.form}>
      <button type="submit" className={styles.submitButton(disabled)}>
        Submit
      </button>
      <button className={styles.alertButton}>Cancel</button>
    </form>
  );
};

Using the CLI

The types included in this package are the default tailwindcss classes, but if you modified your tailwind config file and/or want to add external custom classes, you can use the CLI tool to do this.

CLI arguments

  • -i, --input Name or relative path of the TailwindCSS config file (if not provided, tries to find 'tailwind.config.js')
  • -o, --output Name or relative path of the generated types file (optional, default: "tailwindcss-classnames.ts")
  • -x, --extra Name or relative path of the file with the custom extra types (optional)
  • -h, --help display help for command

Example of CLI usage

Add the CLI to npm scripts in your package.json then run npm run generate-css-types or yarn generate-css-types:

"scripts": {
  "generate-css-types": "tailwindcss-classnames -i path/to/tailwind.config.js -o path/to/output-file.ts"
}

⚠️ NOTE: that if you want to add custom types from external file, the type must be a default export:

export default MyCustomType;
type MyCustomType =
  | "btn"
  | "sidebar"
  ...

How to use generated types

Method 1

import the generated file (and NOT the actual library) into your code in order to get the customized classnames, like this:

import {classnames} from 'path/to/generated/tailwindcss-classnames';

Method 2

A more elegant approach is to add the generated file to your projects tsconfig.json compilerOptions paths which should allow you to keep the import the same and use your generated version of tailwindcss-classnames instead of the node_modules one.

{
  "compilerOptions": {
    "paths": {
      "tailwindcss-classnames": ["path/to/generated/tailwindcss-classnames"]
    }
  }
}

then:

import {classnames} from 'tailwindcss-classnames';

From original comment by @andykenward

Known limitiations

  • Relative imports inside the config does not work. use __dirname instead. See #120 .
  • npx tailwindcss-classnames won't work. Use as an npm script as mentioned above.
  • Only official TailwindLabs plugins are supported.
  • Some JIT features are not supported (#204).

Any help with these issues is very much appreciated.

Contributing

All contributions from everyone are very welcome.

Please read the contributing guidelines before submitting a Pull Request.

Credits

This project was started by Christian Alfoni and is now maintained by Muhammad Sammy. The full list of contributors can be found here.

tailwindcss-classnames's People

Contributors

aathikahamed avatar alecf avatar boompikachu avatar bstro avatar carlosvini avatar christianalfoni avatar dadom avatar dependabot[bot] avatar dotellie avatar eezi avatar github-actions[bot] avatar hank121314 avatar imrishabh18 avatar joesobo avatar krzysztofzuraw avatar mattpocock avatar muhammadsammy avatar philipparndt avatar pspeter3 avatar punitda avatar rockmusicmaker avatar strothj avatar xpapla 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

tailwindcss-classnames's Issues

Are tailwindcss-classnames releases matching tailwindcss?

Trying again this lib, and having a lot of errors with arguments not assignable to parameter of type 'TArgs' .

Custom tailwind plugins don't seem supported. But also a lot of new tailwindcss utilities.

Is it correct that tailwindcss-classnames only supports tailwind v1.4.0 (we're at v1.7.1 now) ?

`group` variant is not prefixed

I was excited to see the group stuff land! The one problem is that group is not prefixed. When I regenerated I got:

   | 'lg:tw-align-text-bottom'
   | 'xl:tw-align-text-bottom'
   | 'group-hover:tw-visible'
+  | 'group'
   | 'sm:tw-visible'
   | 'md:tw-visible'
   | 'lg:tw-visible'

but we are using the prefix tw so we expected tw-group

Extending createCustom with custom types

The Problem

Currently, it's not easy (or possible?) to extend the default tailwind types with other types.

import { createCustom } from 'tailwindcss-classnames';

createCustom<CustomClasses>();

type CustomClasses = 'bg-smoke-100';

Produces an error:

Type '"bg-smoke-100"' does not satisfy the constraint 'TClasses'.

The Solution

There is probably a technical solution to this, but I couldn't find it immediately and wanted advice before I send a PR to the repo.

It also struck me what a pain it would be to have to add custom types: to add a color, you'd have to specify:

bg-<color>-100
...etc
text-<color>-100
...etc
placeholder-<color>-100
...etc

And other variations I'm not considering.

Would it be useful to have a CLI tool which could target your tailwind config and generate these types?

missing default types

Related to #15 where you fixed the default color type.

 TS2345: Argument of type '"transition"' is not assignable to  parameter of type 'TArg'

I am not setting transition in my config, because it's recommended.

Every section of the config file is optional, so you only have to specify what you'd like to change. Any missing sections will fall back to Tailwind's default configuration.
For most users we encourage you to keep your config file as minimal as possible, and only specify the things you want to customize.

And the transition doc shows the transition property, but tailwindscss-classnames generates the following types:

export type TTransitionProperty = 
  | 'transition-none'
  | 'transition-all'
  | 'transition-default'
  | 'transition-colors'
  | 'transition-opacity'
  | 'transition-shadow'
  | 'transition-transform';

both transition and transition-default should be in the type.

From the theme configuration, I see

You'll notice that using a key of default in the theme configuration created the class rounded with no suffix. This is a common convention in Tailwind supported by many (although not all) of the core plugins.

The fact that it's not supported by all core plugins is annoying, Maybe you can manage a blacklist of plugins, and auto-add the no-suffix type for all plugins not listed in that blacklist?

missing type for default color

given the tailwind config:

module.exports = {
    colors: {
      transparent: "transparent",
      current: "currentColor",

      blue: {
        default: "#0099D7",
        lighter: lighten("#0099D7", 0.1),
      },
}

We can add the class "bg-blue-lighten" and "bg-blue" (notice the lack of '-default' suffix).

From https://tailwindcss.com/docs/customizing-colors#nested-object-syntax

Like many other places in Tailwind, the default key is special and means "no modifier"

tailwindcss-classnames will generate the following types:

export type TBackgroundColor =
  | 'bg-transparent'
  | 'bg-current'
  | 'bg-blue-default'
  | 'bg-blue-lighter'

Can you make it so it generate the following instead?

export type TBackgroundColor =
  | 'bg-transparent'
  | 'bg-current'
  | 'bg-blue'
  | 'bg-blue-default'
  | 'bg-blue-lighter'

functions in extend is not extended in types

Following the extending the default theme doc, I changed my settings as follow:

   theme: {
-    boxShadow: (theme) => ({
-      default:
-        "0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)",
-      md:
-        "0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)",
-      xl:
-        "0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)",
-      outline: `0 0 0 3px ${theme("colors.black.alpha")}`,
-      goblue: `0 0 0 3px ${theme("colors.goblue.alpha")}`,
-      gopink: `0 0 0 3px ${theme("colors.gopink.alpha")}`,
-    }),
+    extend: {
+      boxShadow: (theme) => ({
+        outline: `0 0 0 3px ${theme("colors.black.alpha")}`,
+        goblue: `0 0 0 3px ${theme("colors.goblue.alpha")}`,
+        gopink: `0 0 0 3px ${theme("colors.gopink.alpha")}`,
+      }),
+    },
}

I'm expecting the types to be:

export type TBoxShadow = 
  | 'shadow'
  | 'shadow-md'
  | 'shadow-xl'
  | 'shadow-outline'
  | 'shadow-goblue'
  | 'shadow-gopink';

But I'm getting

export type TBoxShadow = 
  | 'shadow-outline'
  | 'shadow-goblue'
  | 'shadow-gopink';

types don't account for plain string in classnames() args

i'm trying to add className to a custom component, passing className in as a prop

i'm not super familiar with how the types are structured, but my typescript is complaining if i attempt to pass a plain string into the classnames function along with some tailwind properties

const avatarStyle = cn('rounded-full', 'border-4', 'border-white');

function Avatar({
  className,
  src,
  name,
}: { name: string, className: string } & Pick<ImgHTMLAttributes<HTMLImageElement>, 'src'>) {
  return (
    <img
      className={cn(className as any, avatarStyle)}
      src={src}
      alt={`${name} profile image`}
    ></img>
  );
}

export default Avatar;

in order to make typescript happy, i have to cast it to any (className as any) and then it'll compile

thoughts?

TailwindCSS v2 support

TailwindCSS version 2 support

Relevant additions

  • Add redesigned color palette (#2623, 700866c, #2633)
  • Add dark mode support (#2279, #2631)
  • Extend default spacing scale (#2630, 7f05204)
  • Add new 2xl breakpoint at 1536px by default (#2609)
  • Extend default font size scale (#2609, #2619)
  • Added 5 and 95 to opacity scale (#2747)
  • Add transform-gpu to force hardware acceleration on transforms when desired (#1380)
  • Added new ring utilities for creating outline/focus rings using box shadows (#2747, 879f088, e0788ef)
  • Add max-w-prose class by default (#2574)
  • Add overflow-ellipsis and overflow-clip utilities (#1289)
  • Add spacing scale to inset plugin (#2630)
  • Add percentage sizes to translate, inset, and height plugins (#2630, 5259560)
  • Enable group-hover for color plugins, boxShadow, and textDecoration by default (28985b6, f6923b1)
  • Enable focus for z-index utilities by default (ae5b3d3)
  • Enable focus-within for all plugins that have focus enabled by default (1a21f072, f6923b1)
  • Support extend in variants configuration (#2651)

Relevant Changes

  • Removed shadow-outline, shadow-solid, and shadow-xs by default in favor of new ring API (#2747)
  • Rename whitespace-no-wrap to whitespace-nowrap (#2664)
  • Rename flex-no-wrap to flex-nowrap (#2676)
  • Remove clearfix utility, recommend flow-root instead (#2766)
  • Disable hover and focus for fontWeight utilities by default (f6923b1)
  • Remove grid-gap fallbacks needed for old versions of Safari (5ec45fa)
  • Change special use of 'default' in config to 'DEFAULT' (#2580)
  • Remove scrolling-touch and scrolling-auto utilities (#2573)

tailwindcss-classnames CLI changes:

  • Rename CLI arguments to make it more consistent. Use --input (-i) and --output (-o) for main file names
  • Do not require passing type name of custom classes instead, force export default of it.

The settings of tailwind.config.js are not reflected in the `h-*` class.

SSIA

It works correctly on tailwind, so the style will be given.

Example

tailwind.config.js

module.exports = {
  future: {
    // removeDeprecatedGapUtilities: true,
    // purgeLayersByDefault: true,
  },
  purge: ['./components/**/*.tsx', './pages/**/*.tsx'],
  theme: {
    colors: {
      old: {
        button: 'rgb(82, 165, 165)',
      },
    },
    extend: {
      spacing: {
        '10px': '0.625rem',
        '15px': '0.9375rem',
        '30px': '1.875rem',
      },
    },
  },
  variants: {},
  plugins: [],
};

Build command

tailwindcss-classnames -c tailwind.config.js -o ./src/types/autogenTailwind.ts

autogenTailwind.ts

// ...

export type TPadding = 
  | 'p-0'
  | 'p-1'
  | 'p-2'
  | 'p-3'
  | 'p-4'
  | 'p-5'
  | 'p-6'
  | 'p-8'
  | 'p-10'
  | 'p-12'
  | 'p-16'
  | 'p-20'
  | 'p-24'
  | 'p-32'
  | 'p-40'
  | 'p-48'
  | 'p-56'
  | 'p-64'
  | 'p-px'
  | 'p-10px' // p-* class is built correctly
  | 'p-15px'
  | 'p-30px' 

// ...

export type THeight = 
  | 'h-0'
  | 'h-1'
  | 'h-2'
  | 'h-3'
  | 'h-4'
  | 'h-5'
  | 'h-6'
  | 'h-8'
  | 'h-10'
  | 'h-12'
  | 'h-16'
  | 'h-20'
  | 'h-24'
  | 'h-32'
  | 'h-40'
  | 'h-48'
  | 'h-56'
  | 'h-64'
  | 'h-auto'
  | 'h-px'
  | 'h-full'
  | 'h-screen';  // h-* class is not built correctly

// ...

Bug: Missing TPseudoClasses type when extends variants (tailwind.config.js)

Reproduce step: (v1.3.1)

  • add custom variant in tailwind.config.js
    variants: { borderWidth: ['hover'], },
  • generate new types:
    tailwindcss-classnames --config tailwind.config.js -o ./src/tailwindcss-classnames.ts

Expected:

All tailwind default TPseudoClasses with extended variants

Actually happening

Only get type for custom variants:
export type TPseudoClasses = | 'hover:border' | 'hover:border-0' ...

P/S: Request feature: Generate type for custom plugin

plugins: [require('@tailwindcss/ui')]

missing group-focus types

module.exports = {
  ...
  variants: {
    visibility: ["responsive", "hover", "focus", "group-hover", "group-focus"],
  }
};

The generated types contain the group-hover types, but not the group-focus ones:

export type TPseudoClasses =
  ...
  | 'group-hover:visible'
  | 'group-hover:invisible'

As per the documentation, group-focus works just like group-hover, so should their types :)

spacing (-x,-y) not working on Typescript

missing space-x and space-y in typescript

classnames("space-x-2")

resolve an error

Argument of type '"space-x-2"' is not assignable to parameter of type 'TArgs<TClasses>'.ts(2345)

Support variant as functions

The issue tailwindlabs/tailwindcss#2309 has been released in v1.8, and I'm getting this error:

> tailwindcss-classnames --config src/utilities/tailwind.js -o src/utilities/tailwind.ts

(node:755354) UnhandledPromiseRejectionWarning: TypeError: variantsForKey.map is not a function

Code changed:

  variants: {
-    fontSize: ["responsive", "hover", "focus"],
+    fontSize: ({ after }) => after(["hover", "focus"]),
  }

Support typography by default

It seems like you support official Tailwind plugins, like Custom Forms. It would be great to add support for the Typography plugin as well.

configuration file parameter

Hi @muhammadsammy , I just found out about this project, and it looks great so I'll start using it right away :)

Can you let us specify the tailwind.config.js file and only fall back to the inquirer prompt when the parameter is missing?
I'd like to get my types auto-updated when starting the devServer.

{
  "scripts": {
    "start": "npm run build:types && npm run build:css && npm run dev",
    "build:types": "tailwindcss-classnames --config ./src/tailwind.js"
  }
}

Unrelated question: Have you been monitoring performances using your library? I'm a bit concerned about the overhead at runtime and bundle size.
Ideally, I'd like a webpack plugin to execute the tailwindcss-classnames related code and convert it to dumb strings as it'd be without this library (resulting in a zero footprint).
Any thoughts on this?

VSCode might get string comments

Hi there!

Just wanted to bump you with this: microsoft/vscode#95408

Been trying to figure out why VSCode does not show string TSDocs. Basically if this get fixed the classnames in this project can get proper documentation, allowing you to show what css the classnames produce, with links to their documentation etc. Would be an awesome addition 😄

Default export?

Is it possible to add default export for main function?

Like so, I guess:

export const tw = classnames;
export default tw

I can make PR if yes.

Empty TPseudoClasses

I'm getting an empty TPseudoClasses type when generating from my tailwind config file:

function generateColors(opacityVar) {
  const color = (variable) => `rgba(var(${variable}), var(${opacityVar}, 1))`;

  return {
    background: color("--background"),
    foreground: color("--foreground"),
    pink: color("--pink"),
    purple: color("--purple"),
    darkPurple: color("--dark-purple"),
    red: color("--red"),
    yellow: color("--yellow"),
    green: color("--green"),
    blue: color("--blue"),
    transparent: "transparent",
    current: "currentColor",
  };
}

module.exports = {
  theme: {
    fontFamily: {
      sans: ["Assistant", "sans-serif"],
    },
    colors: generateColors("--text-opacity"),
    backgroundColor: generateColors("--bg-opacity"),
    borderColor: generateColors("--border-opacity"),
    divideColor: generateColors("--divide-opacity"),
    placeholderColor: generateColors("--placeholder-opacity"),
    boxShadow: {
      default: "0px 3px 10px rgba(0, 0, 0, 0.15)",
    },
    opacity: {
      "90": "0.9",
      "80": "0.8",
      "70": "0.7",
      "60": "0.6",
      "40": "0.4",
      "20": "0.2",
      "0": "0",
    },
    borderRadius: {
      none: "0",
      sm: "0.25rem",
      default: "0.625rem",
      full: "9999px",
    },
  },
};

Any ideas?

Edit:
Realized I should probably put the generated output here as well, so here's the relevant snippet of it:

export type TPseudoClasses =
  | ;

Support dark mode

Tailwind is adding dark mode for v2 and is currently experimental.

missing types for border extended colors

Colors defined in theme/extend/colors are typed in many places (placeholder, bg, text,from/via etc) but not in border (class TBorderColor)

  theme: {
    extend: {
      colors: {
         goblue: '#00f'
       }
     }
    }

Expecting

export type TBorderColor = 
  ...
  | 'border-goblue';

export type TPseudoClasses =
  ...
  | 'focus:border-goblue''

Versions:

    "tailwindcss": "1.8.10",
    "tailwindcss-classnames": "1.8.3",

Lint and build commands could be added to a GitHub Action

For example the build and lint commands from the scripts section ...

"scripts": {
    "build": "npm run build:lib & npm run build:umd",
    "build:lib": "tsc --outDir lib --module commonjs",
    "build:es": "tsc --outDir es --module es2015",
    "build:umd": "npm run build:es && rollup --config && dts-bundle --name dist/bundle --main es --outputAsModuleFolder",
    "clean": "rimraf dist es lib coverage tailwindcss-classnames.ts tailwind.config.js",
    "typecheck": "tsc --noEmit",
    "lint": "eslint \"src/**/*.{js,ts}\" --quiet --fix && npm run format",
    "format": "prettier \"**/*.{md,js,jsx,json,ts,tsx}\" --write",
    "test": "jest --env=jsdom --coverage --passWithNoTests",
    "test:watch": "jest --env=jsdom --watch --updateSnapshot",
    "prepublishOnly": "npm run build",
    "prebuild": "npm run clean",
    "postbuild": "rimraf {lib,es}/**/__tests__ {lib,es}/**/*.{spec,test}.{js,d.ts,js.map}",
    "posttest": "npm run typecheck && npm run lint",
    "preversion": "npm test",
    "postversion": "git push && git push --tags",
    "release": "standard-version",
    "pregenerate": "npm run clean && npm run build:lib",
    "generate": "tailwindcss init --full && node lib/cli/index.js --config tailwind.config.js --output src/index.ts",
    "postgenerate": "npm run clean",
    "preupdateConfig": "npm run clean",
    "updateConfig": "tailwindcss init --full && node helpers/updateDefaultConfig.js",
    "postupdateConfig": "npm run clean && prettier src/cli/lib/defaultTailwindConfig.ts --write"
  },

How is src/index.ts created?

I see that you have a CLI to generate the class names. Are you using that for src/index.ts as well? Or is that hand written?

Question on custom classes and CLI

I've been trying to get to include custom classes generated with cli but still can't get around it.
My setup:
tsconfig.json
{ ..., "typeRoots": [ "./src/@types", "./node_modules/@types" ] }
src/@types/css-types.d.ts
... | 'text-pink-600' | 'text-pink-700' | 'text-pink-800' | 'text-pink-900' | 'text-primary' | 'text-nermin' | 'text-ribbon-200';

button.tsx
Screen Shot 2020-10-13 at 07 54 20

Looking for Maintainers

Hello and thanks to all contributors and users of this project!

Unfortunately, I will not be able to maintain this project well for the next three months.
If anyone is interrested in becoming a maintainer, please contact me!

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.