diff --git a/bun.lock b/bun.lock index eb943e3..a471227 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "forge", diff --git a/src/index.tsx b/src/index.tsx index ae1a65f..0e260d4 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -4,26 +4,13 @@ import { type TagDef, UnitlessProps, NonStyleKeys } from './types' export const styles: Record> = {} const themes: Record> = {} -// Type registry for theme variables (will be auto-populated) -let registeredThemeKeys: Set = new Set() - -// Clear all registered styles export function clearStyles() { for (const key in styles) delete styles[key] for (const key in themes) delete themes[key] - registeredThemeKeys.clear() } -// Register a theme with CSS custom properties -export function createTheme>( - name: string, - values: T -): T { - themes[name] = values as Record - - // track for runtime validation - Object.keys(values).forEach(key => registeredThemeKeys.add(key)) - +export function createTheme>(name: string, values: T): T { + themes[name] = values as Record return values } @@ -52,16 +39,20 @@ export function createThemedVar>(_themes: T) { } } -// Simplified API: register multiple themes and get typed themeVar in one call type Theme = Record -export function createThemes>(themes: T) { - const registeredThemes = {} as T - for (const [name, values] of Object.entries(themes)) { - (registeredThemes as any)[name] = createTheme(name, values) - } +export function createThemes>(themeDefs: T) { + for (const [name, values] of Object.entries(themeDefs)) + createTheme(name, values) - return createThemedVar(registeredThemes) + return (name: keyof T[keyof T]) => `var(--theme-${name as string})` +} + +export function extendThemes(overrides: Record) { + for (const [name, values] of Object.entries(overrides)) + themes[name] = { ...themes[name], ...values } + + return (name: string) => `var(--theme-${name})` } // Generic themeVar (untyped fallback)