import { type TagDef, type HTMLTag, UnitlessProps, NonStyleKeys } from './types'
type ForgeComponent =
((props: Record) => any) &
{ [K in keyof Parts]: (props: Record) => any }
export const styles: Record> = {}
const themes: Record> = {}
export function clearStyles() {
for (const key in styles) delete styles[key]
for (const key in themes) delete themes[key]
}
export function createTheme>(name: string, values: T): T {
themes[name] = values as Record
return values
}
// Generate CSS for all registered themes
export function themesToCSS(): string {
let out: string[] = []
for (const [name, vars] of Object.entries(themes)) {
out.push(`[data-theme="${name}"] {`)
for (const [key, value] of Object.entries(vars)) {
out.push(` --theme-${key}: ${value};`)
}
out.push(`}\n`)
}
return out.join('\n')
}
// Helper type to extract theme keys from multiple theme objects
type ThemeKeys = T extends Record ? keyof T : never
// Create a typed themeVar function from your themes
export function createThemedVar>(_themes: T) {
return function themeVar>(name: K): string {
return `var(--theme-${name as string})`
}
}
type Theme = Record
export function createThemes>(themeDefs: T) {
for (const [name, values] of Object.entries(themeDefs))
createTheme(name, values)
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)
export function themeVar(name: string): string {
return `var(--theme-${name as string})`
}
// All CSS styles inside