import { defaultTheme, DefaultTheme } from './default-theme'; import type { BaseTheme } from './theme'; import type { ThemeContextValue } from './theme-context'; export type AccessOrDefault = Key extends keyof Theme ? Theme[Key] : Default; export type MergeTheme = { em: AccessOrDefault; colors: AccessOrDefault< Theme, 'colors', DefaultTheme['colors'] & NonNullable['colors'] >; fonts: AccessOrDefault< Theme, 'fonts', DefaultTheme['fonts'] & NonNullable['fonts'] >; spacing: AccessOrDefault< Theme, 'spacing', DefaultTheme['spacing'] & NonNullable['spacing'] >; tracking: AccessOrDefault< Theme, 'tracking', DefaultTheme['tracking'] & NonNullable['tracking'] >; leading: AccessOrDefault< Theme, 'leading', DefaultTheme['leading'] & NonNullable['leading'] >; borderRadius: AccessOrDefault< Theme, 'borderRadius', DefaultTheme['borderRadius'] & NonNullable['borderRadius'] >; }; export function mergeTheme(theme: Theme) { return { em: theme.em ?? defaultTheme.em, colors: theme.colors ?? { ...defaultTheme.colors, ...(theme.extend?.colors ?? {}), }, fonts: theme.fonts, spacing: theme.spacing ?? { ...defaultTheme.spacing, ...(theme.extend?.spacing ?? {}), }, tracking: theme.tracking ?? { ...defaultTheme.tracking, ...(theme.extend?.tracking ?? {}), }, leading: theme.leading ?? { ...defaultTheme.leading, ...(theme.extend?.leading ?? {}), }, borderRadius: theme.borderRadius ?? { ...defaultTheme.borderRadius, ...(theme.extend?.borderRadius ?? {}), }, } as ThemeContextValue; }