Skip to content

✨ makeStyles is dead, long live makeStyles!

License

Notifications You must be signed in to change notification settings

jiby-aurum/tss-react

 
 

Repository files navigation

✨ makeStyles is dead, long live makeStyles! ✨

Home - Documentation

🗣 v4 is out! 🎉 Check the migration guide.
This major enables TSS and MUI to share the emotion cache. It makes using TSS transparent, things just work 🥳. This was made possible by the peoples behind Emotion and MUI that reviewed and merged our PRs. Many thanks to them.

'tss-react' is intended to be the replacement for @material-ui v4 makeStyles and 'react-jss'.

If you like TSS consider giving the project a ⭐️

$ yarn add tss-react @emotion/react

JavaScript support: YES.

exhaustive.demo.mov


Playground:


Get started 🚀

Development

yarn
yarn build
#For automatically recompiling when file change
#npx tsc -w

# To start the Single Page Application test app (create react app)
# This app is live here: https://www.tss-react.dev/test/
yarn start_spa

# To start the Server Side Rendering app (next.js)
yarn start_ssr

# To start the Server Side Rendering app that test the mui v4 integration.
yarn start_muiV4

In SSR everything should work with JavaScript disabled!

Changelog highlights

Click to expand

v4.1.0

v4.0.0

  • No need to provide an emotion cache explicitly, MUI and TSS can share the same emotion cache.
    No special instruction to make TSS work with SSR.

v3.7.1

  • Retrocompatibility with React 16. Ref

v3.3.1

  • I.E is almost supported out of the box (See note at the end of this sections)

Breaking changes in v3

FAQ

Click to expand

Why this instead of the hook API of Material UI v4?

First of all because makeStyle is deprecated in @material-ui v5 but also because it has some major flaws. Let's consider this example:

import { makeStyles, createStyles } from "@material-ui/core/styles";

type Props = {
    color: "red" | "blue";
};

const useStyles = makeStyles(theme =>
    createStyles<"root" | "label", { color: "red" | "blue" }>({
        "root": {
            "backgroundColor": theme.palette.primary.main,
        },
        "label": ({ color }) => ({
            color,
        }),
    }),
);

function MyComponent(props: Props) {
    const classes = useStyles(props);

    return (
        <div className={classes.root}>
            <span className={classes.label}>Hello World</span>
        </div>
    );
}

Two pain points:

  • Because TypeScript doesn't support partial argument inference, we have to explicitly enumerate the classes name as an union type "root" | "label".
  • We shouldn't have to import createStyles to get correct typings.

Let's now compare with tss-react

import { makeStyles } from "./makeStyles";

type Props = {
    color: "red" | "blue";
};

const { useStyles } = makeStyles<{ color: "red" | "blue" }>()(
    (theme, { color }) => ({
        "root": {
            "backgroundColor": theme.palette.primary.main,
        },
        "label": { color },
    }),
);

function MyComponent(props: Props) {
    const { classes } = useStyles(props);

    return (
        <div className={classes.root}>
            <span className={classes.label}>Hello World</span>
        </div>
    );
}

Benefits:

  • Less verbose, same type safety.
  • You don't need to remember how things are supposed to be named, just let intellisense guide you.

Besides, the hook api of material-ui, have other problems:

  • One major bug: see issue
  • JSS has poor performances compared to emotion source

Why this instead of Styled component ?

See this issue

Compile error TS1023

If you get this error:

node_modules/tss-react/index.d.ts:18:10 - error TS1023: An index signature parameter type must be either 'string' or 'number'.

18         [mediaQuery: `@media${string}`]: { [RuleName_1 in keyof ClassNameByRuleName]?: import("./types").CSSObject | undefined; };
            ~~~~~~~~~~

it means that you need to update TypeScript to a version >= 4.4.
If you can't use import { } from "tss-react/compat"; instead of import { } from "tss-react".
Only withStyles() will have slightly inferior type inference.

About

✨ makeStyles is dead, long live makeStyles!

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 100.0%