feat: make the injection of theme CSS vars optional

This commit is contained in:
Hossein Mehrabi 2023-06-12 02:31:39 +03:30
parent 9d2253bd2b
commit 9a56d59c35
No known key found for this signature in database
GPG Key ID: 45C04964191AFAA1
6 changed files with 89 additions and 77 deletions

View File

@ -7,18 +7,20 @@ import { Theme } from './types'
export type ThemeProviderProps = React.PropsWithChildren<{ export type ThemeProviderProps = React.PropsWithChildren<{
theme: Theme theme: Theme
injectCssVars?: boolean
}> }>
export const ThemeProvider: React.FC<ThemeProviderProps> = ({ export const ThemeProvider: React.FC<ThemeProviderProps> = ({
theme, theme,
children, children,
injectCssVars = true,
}) => { }) => {
return ( return (
<ResizeObserverProvider> <ResizeObserverProvider>
<PortalProvider> <PortalProvider>
<ThemeContext.Provider value={{ theme }}> <ThemeContext.Provider value={{ theme }}>
<CSSBaseline theme={theme} /> <CSSBaseline theme={theme} />
<Global styles={theme.globalStyles} /> {injectCssVars && <Global styles={theme.globalStyles} />}
<EmotionThemeProvider theme={theme}>{children}</EmotionThemeProvider> <EmotionThemeProvider theme={theme}>{children}</EmotionThemeProvider>
</ThemeContext.Provider> </ThemeContext.Provider>
</PortalProvider> </PortalProvider>

View File

@ -148,6 +148,10 @@ export const baseTheme: Theme = {
}, },
}, },
globalStyles: css``, globalStyles: css``,
cssVars: '',
} }
baseTheme.globalStyles = createThemeGlobalStyles(baseTheme) const { cssVars, globalStyles } = createThemeGlobalStyles(baseTheme)
baseTheme.cssVars = cssVars
baseTheme.globalStyles = globalStyles

View File

@ -136,9 +136,13 @@ export const createTheme = (
breakpoints: createBreakpointStyles(props, from), breakpoints: createBreakpointStyles(props, from),
palette: createPaletteStyles(props, from), palette: createPaletteStyles(props, from),
globalStyles: css``, globalStyles: css``,
cssVars: '',
} }
theme.globalStyles = createThemeGlobalStyles(theme) const { cssVars, globalStyles } = createThemeGlobalStyles(theme)
theme.cssVars = cssVars
theme.globalStyles = globalStyles
return theme return theme
} }

View File

@ -5,7 +5,6 @@ import {
THEME_TYPOGRAPHY_VARIANTS, THEME_TYPOGRAPHY_VARIANTS,
} from './constants' } from './constants'
import { Theme, TypographyProperties, TypographyVariants } from './types' import { Theme, TypographyProperties, TypographyVariants } from './types'
import { withTheme } from './withTheme'
const cssUtils = { const cssUtils = {
vars: { vars: {
@ -22,7 +21,7 @@ const cssUtils = {
define: (name: string, value: string) => `${name}: ${value};`, define: (name: string, value: string) => `${name}: ${value};`,
} }
const generateThemeGlobalStyles = withTheme((theme) => { const generateThemeGlobalStyles = (theme: Theme) => {
const vars: Array<string | string[]> = [] const vars: Array<string | string[]> = []
const styles: Array<string | string[]> = [] const styles: Array<string | string[]> = []
const breakpointStyles: string[][] = THEME_BREAKPOINTS.map(() => []) const breakpointStyles: string[][] = THEME_BREAKPOINTS.map(() => [])
@ -98,18 +97,26 @@ const generateThemeGlobalStyles = withTheme((theme) => {
}`) }`)
}) })
return css` const cssVars = `
:root {
${vars.join('\n')} ${vars.join('\n')}
}
${styles.join('\n')} ${styles.join('\n')}
` `
})
return {
cssVars,
globalStyles: css`
:root {
${cssVars}
}
`,
}
}
export const createThemeGlobalStyles = (() => { export const createThemeGlobalStyles = (() => {
return (theme: Theme) => {
const cache: any = {} const cache: any = {}
return (theme: Theme): ReturnType<typeof generateThemeGlobalStyles> => {
const key = theme as any as string const key = theme as any as string
if ( if (

View File

@ -73,6 +73,7 @@ export type Theme = {
typographyGlobal: GlobalTypographyStyles typographyGlobal: GlobalTypographyStyles
palette: ThemePalette palette: ThemePalette
globalStyles: SerializedStyles globalStyles: SerializedStyles
cssVars: string
} }
export type ThemeOptionBreakpointStyles = Partial< export type ThemeOptionBreakpointStyles = Partial<

View File

@ -1,9 +1,5 @@
import { css } from '@emotion/react' import { css } from '@emotion/react'
import { import { THEME_TYPOGRAPHY_VARIANTS, TypographyVariants } from '../Theme'
THEME_TYPOGRAPHY_VARIANTS,
TypographyVariants,
withTheme,
} from '../Theme'
import { THEME_TYPOGRAPHY_ELEMENTS } from '../Theme/constants' import { THEME_TYPOGRAPHY_ELEMENTS } from '../Theme/constants'
import { typographyClasses } from './Typography.classes' import { typographyClasses } from './Typography.classes'
@ -13,8 +9,7 @@ const selectors = (variant: TypographyVariants) =>
`.${typographyClasses[variant]}`, `.${typographyClasses[variant]}`,
].join(', ') ].join(', ')
export const TypographyStyles = withTheme( export const TypographyStyles = css`
(theme) => css`
body * { body * {
font-family: var(--lsd-typography-generic-font-family); font-family: var(--lsd-typography-generic-font-family);
} }
@ -78,5 +73,4 @@ export const TypographyStyles = withTheme(
span { span {
margin: 0; margin: 0;
} }
`, `
)