Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[POC] Material UI CSS variables typing #33133

Closed
wants to merge 38 commits into from

Conversation

siriwatknp
Copy link
Member

@siriwatknp siriwatknp commented Jun 13, 2022

Demo: https://codesandbox.io/s/create-react-app-with-typescript-forked-1vjqxn?file=/src/App.tsx

Target experience

extendTheme

This is the new API for creating a theme for CssVarsProvider. The theme options type is extended from the existing Theme types so it should work with the existing projects that have custom module augmentation.

const theme = extendTheme({
  colorSchemes: {
    light: {
      palette: { // extended from `ThemeOptions['palette]` types
        common: {
          // also typed-safe for new tokens
          background: '...',
          onBackground: '...',
        }
      }
    }
  },
  components: {
    MuiButton: {
      styleOverrides: {
        root: ({ theme }) => ({
          // typed-safe
          color: theme.vars.palette.primary.main,
        })
      }
    }
  }
})

<CssVarsProvider theme={theme}>

See the demo above.

Existing Theme types

The CSS variables support is considered a new feature that developers can opt-in. The types augmentation should be minimal. It should work with existing APIs, eg. styled, sx, useTheme.

With this goal, we can use the same approach to the lab by exporting themeCssVarsAugmentation.d.ts from Material UI package.

All they need to do is:

// usually in the main App.ts
import type {} from '@mui/material/themeCssVarsAugmentation';

<Box sx={theme => ({
  // typed-safe
  color: theme.vars.palette.primary.main,
})>

It will extend the theme type that used in styled, sx, useTheme to have theme.vars and the new tokens.

See the demo above.

Existing createTheme

The options type remains the same because this API is not intended to be used with CSS variables.

This is nice because the CSS variables types related won't be included if developers want to use <ThemeProvider theme={createTheme()}>.


@siriwatknp siriwatknp added typescript package: material-ui Specific to @mui/material proof of concept Studying and/or experimenting with a to be validated approach labels Jun 13, 2022
@mui-bot
Copy link

mui-bot commented Jun 13, 2022

Details of bundle changes

@material-ui/core: parsed: +1.65% , gzip: +0.95%
@material-ui/lab: parsed: +0.35% , gzip: +0.16%

Generated by 🚫 dangerJS against b7d393b

@github-actions github-actions bot added the PR: out-of-date The pull request has merge conflicts and can't be merged label Jun 17, 2022
@siriwatknp
Copy link
Member Author

Closed in favor of #33211

@siriwatknp siriwatknp closed this Jun 20, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
package: material-ui Specific to @mui/material PR: out-of-date The pull request has merge conflicts and can't be merged proof of concept Studying and/or experimenting with a to be validated approach typescript
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants