@hakuna-matata-ui/styled-system
Version:
Style function for css-in-js building component libraries
50 lines (42 loc) • 1.62 kB
text/typescript
import { analyzeBreakpoints, Dict } from "@hakuna-matata-ui/utils"
import type { WithCSSVar } from "../utils/types"
import { createThemeVars } from "./create-theme-vars"
import { extractTokens, omitVars } from "./theme-tokens"
export function toCSSVar<T extends Dict>(rawTheme: T) {
/**
* In the case the theme has already been converted to css-var (e.g extending the theme),
* we can omit the computed css vars and recompute it for the extended theme.
*/
const theme = omitVars(rawTheme)
// omit components and breakpoints from css variable map
const tokens = extractTokens(theme)
const cssVarPrefix = theme.config?.cssVarPrefix
const {
/**
* This is more like a dictionary of tokens users will type `green.500`,
* and their equivalent css variable.
*/
cssMap,
/**
* The extracted css variables will be stored here, and used in
* the emotion's <Global/> component to attach variables to `:root`
*/
cssVars,
} = createThemeVars(tokens, { cssVarPrefix })
const defaultCssVars: Dict = {
"--chakra-ring-inset": "var(--chakra-empty,/*!*/ /*!*/)",
"--chakra-ring-offset-width": "0px",
"--chakra-ring-offset-color": "#fff",
"--chakra-ring-color": "rgba(66, 153, 225, 0.6)",
"--chakra-ring-offset-shadow": "0 0 #0000",
"--chakra-ring-shadow": "0 0 #0000",
"--chakra-space-x-reverse": "0",
"--chakra-space-y-reverse": "0",
}
Object.assign(theme, {
__cssVars: { ...defaultCssVars, ...cssVars },
__cssMap: cssMap,
__breakpoints: analyzeBreakpoints(theme.breakpoints),
})
return theme as WithCSSVar<T>
}