import type { JSX } from 'hono/jsx' import { type TagDef, UnitlessProps, NonStyleKeys } from './types' 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] } // HMR support - clear styles when module is replaced if (import.meta.hot) { import.meta.hot.dispose(() => clearStyles()) } 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