UNPKG

@nex-ui/system

Version:

A lightweight and performant styling library based on Emotion, focusing on component architecture and developer experience.

87 lines (84 loc) 2.77 kB
import { jsx, jsxs } from 'react/jsx-runtime'; import { useMemo } from 'react'; import { Global } from '@emotion/react'; import { merge } from '@nex-ui/utils'; import { createSystem } from '../system.mjs'; import { InnerSystemProvider } from './SystemContext.mjs'; import { createGetColorSchemeSelector, ColorSchemeProvider } from '../colorScheme/ColorSchemeProvider.mjs'; const SystemProvider = ({ children, cssVarsPrefix, aliases, tokens, semanticTokens, scales, breakpoints, selectors, colorSchemeNode, forcedMode, defaultMode = 'system', modeStorageKey = 'color-scheme', colorSchemeSelector = 'data' })=>{ const getColorSchemeSelector = useMemo(()=>createGetColorSchemeSelector(colorSchemeSelector), [ colorSchemeSelector ]); const { css, getGlobalCssVars } = useMemo(()=>{ return createSystem({ cssVarsPrefix, aliases, tokens, semanticTokens, scales, breakpoints, selectors: { ...selectors, dark: getColorSchemeSelector('dark'), light: getColorSchemeSelector('light') } }); }, [ aliases, breakpoints, cssVarsPrefix, getColorSchemeSelector, scales, selectors, semanticTokens, tokens ]); const globalStyles = useMemo(()=>{ const cssVarMap = getGlobalCssVars(); const result = {}; cssVarMap.forEach((value, key)=>{ const cssVar = Object.fromEntries(value.entries()); if (key === 'base') { merge(result, { ':root': cssVar }); return; } merge(result, { [getColorSchemeSelector(key)]: { ':root': { colorScheme: key, ...cssVar } } }); }); return result; }, [ getColorSchemeSelector, getGlobalCssVars ]); const methods = useMemo(()=>({ css }), [ css ]); return /*#__PURE__*/ jsx(InnerSystemProvider, { value: methods, children: /*#__PURE__*/ jsxs(ColorSchemeProvider, { forcedMode: forcedMode, defaultMode: defaultMode, modeStorageKey: modeStorageKey, colorSchemeSelector: colorSchemeSelector, colorSchemeNode: colorSchemeNode, children: [ /*#__PURE__*/ jsx(Global, { styles: globalStyles }), children ] }) }); }; SystemProvider.displayName = 'SystemProvider'; export { SystemProvider };