@wow-two-beta/ui 0.0.64 → 0.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-NIFL35PJ.js → chunk-3BNEDKMS.js} +3 -3
- package/dist/{chunk-NIFL35PJ.js.map → chunk-3BNEDKMS.js.map} +1 -1
- package/dist/chunk-LS4EGKUK.js +1656 -0
- package/dist/chunk-LS4EGKUK.js.map +1 -0
- package/dist/forms/index.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -4
- package/dist/layout/index.js +3 -3
- package/dist/themes/Oklch.d.ts +42 -0
- package/dist/themes/Theme.d.ts +76 -0
- package/dist/themes/Tokens.d.ts +40 -0
- package/dist/themes/css.d.ts +20 -0
- package/dist/themes/generate.d.ts +6 -0
- package/dist/themes/index.d.ts +11 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/pool.d.ts +3 -0
- package/dist/themes/registry.d.ts +16 -0
- package/dist/themes/validate.d.ts +25 -0
- package/dist/themes/validated.d.ts +3 -0
- package/dist/themes.css +15374 -0
- package/dist/themes.json +2898 -0
- package/package.json +9 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/themes/index.ts","../src/themes/Oklch.ts","../src/themes/Tokens.ts","../src/themes/Theme.ts","../src/themes/validate.ts","../src/themes/generate.ts","../src/themes/css.ts","../src/themes/validated.ts","../src/themes/pool.ts","../src/themes/registry.ts"],"names":[],"mappings":"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","file":"chunk-LS4EGKUK.js","sourcesContent":["/* ---------------------------------------------------------------------------\n * @wow-two-beta/ui — themes (foundation module).\n *\n * A theme ENGINE: derive proven light/dark token sets from an OKLCH seed, apply\n * a curated theme by name, validate any theme for WCAG AA, and emit the scoped\n * CSS / JSON manifest an app (or Claude) uses to \"use theme X\".\n *\n * Import: `import { THEMES, getTheme, generateTheme } from '@wow-two-beta/ui/themes'`\n * Apply : add `theme-{id}` to a root element; toggle `.dark` for dark mode.\n * The matching stylesheet ships at `@wow-two-beta/ui/themes.css`.\n *\n * Foundation layer — no upward imports (ESLint enforces).\n * ------------------------------------------------------------------------- */\n\n// Color engine\nexport { Oklch } from './Oklch';\nexport type { Oklch as OklchColor } from './Oklch';\nexport {\n normalizeHue,\n isInSrgbGamut,\n clampChromaToGamut,\n oklchToHex,\n oklchToCss,\n parseColor,\n relativeLuminance,\n contrastRatio,\n contrastRatioCss,\n} from './Oklch';\n\n// Token contract\nexport type {\n SemanticToken,\n TokenSet,\n RadiusScale,\n ToneFamilyName,\n ToneSlots,\n} from './Tokens';\nexport {\n SEMANTIC_TOKENS,\n SURFACE_TOKENS,\n TONE_FAMILIES,\n applyToneSlots,\n} from './Tokens';\n\n// Theme + seed shapes\nexport type {\n Theme,\n ThemeMeta,\n ThemeSeed,\n NeutralTemp,\n AccentMode,\n SurfaceStyle,\n} from './Theme';\n// ThemeStatus is a const-object enum + a type of the same name (value + type export).\nexport { ThemeStatus } from './Theme';\n\n// Generator\nexport { generateTheme } from './generate';\n\n// Validator\nexport { validateTheme, contrastPairs, AA_TEXT, AA_UI } from './validate';\n\n// CSS / manifest emitters\nexport {\n themeToCss,\n emitAllThemesCss,\n emitThemesManifest,\n type ThemeManifestEntry,\n} from './css';\n\n// Curated registry\nexport {\n THEMES,\n THEME_SEEDS,\n THEME_IDS,\n getTheme,\n validatedThemes,\n candidateThemes,\n} from './registry';\n","/* ---------------------------------------------------------------------------\n * OKLCH color engine — hand-rolled, zero-dependency.\n *\n * Everything the theme generator/validator needs to reason about color:\n * - OKLCH <-> linear sRGB <-> sRGB (gamma) <-> hex\n * - WCAG 2.1 relative luminance + contrast ratio\n * - small gamut helpers (in-gamut check, chroma clamp)\n *\n * Color space note: OKLCH is the cylindrical form of OKLab (Björn Ottosson,\n * 2020). L ∈ [0,1] (perceptual lightness), C ≥ 0 (chroma), H ∈ [0,360) (hue°).\n * We output CSS `oklch(L C H)` strings directly for tokens, and use the sRGB\n * conversion only for contrast math (WCAG is defined on sRGB luminance).\n * ------------------------------------------------------------------------- */\n\n/** Cylindrical OKLab color: L ∈ [0,1], C ≥ 0, H ∈ [0,360). */\nexport interface Oklch {\n l: number;\n c: number;\n h: number;\n}\n\n/** Linear-light sRGB (not gamma-encoded), each channel ∈ [0,1] (may exceed for out-of-gamut). */\ninterface LinearRgb {\n r: number;\n g: number;\n b: number;\n}\n\n/** Gamma-encoded sRGB, each channel ∈ [0,1]. */\ninterface Srgb {\n r: number;\n g: number;\n b: number;\n}\n\nconst clamp01 = (x: number): number => (x < 0 ? 0 : x > 1 ? 1 : x);\n\n/** Wrap a hue into [0,360). */\nexport function normalizeHue(h: number): number {\n const m = h % 360;\n return m < 0 ? m + 360 : m;\n}\n\n// ---------------------------------------------------------------------------\n// OKLab <-> linear sRGB (matrices from Ottosson's reference implementation)\n// ---------------------------------------------------------------------------\n\nfunction oklchToLinearRgb({ l, c, h }: Oklch): LinearRgb {\n const hr = (normalizeHue(h) * Math.PI) / 180;\n const a = Math.cos(hr) * c;\n const b = Math.sin(hr) * c;\n\n const l_ = l + 0.3963377774 * a + 0.2158037573 * b;\n const m_ = l - 0.1055613458 * a - 0.0638541728 * b;\n const s_ = l - 0.0894841775 * a - 1.291485548 * b;\n\n const l3 = l_ * l_ * l_;\n const m3 = m_ * m_ * m_;\n const s3 = s_ * s_ * s_;\n\n return {\n r: +4.0767416621 * l3 - 3.3077115913 * m3 + 0.2309699292 * s3,\n g: -1.2684380046 * l3 + 2.6097574011 * m3 - 0.3413193965 * s3,\n b: -0.0041960863 * l3 - 0.7034186147 * m3 + 1.707614701 * s3,\n };\n}\n\n// ---------------------------------------------------------------------------\n// linear sRGB <-> gamma sRGB (IEC 61966-2-1)\n// ---------------------------------------------------------------------------\n\nfunction linearToSrgbChannel(x: number): number {\n const v = clamp01(x);\n return v <= 0.0031308 ? 12.92 * v : 1.055 * Math.pow(v, 1 / 2.4) - 0.055;\n}\n\nfunction srgbToLinearChannel(x: number): number {\n return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction linearRgbToSrgb(rgb: LinearRgb): Srgb {\n return {\n r: linearToSrgbChannel(rgb.r),\n g: linearToSrgbChannel(rgb.g),\n b: linearToSrgbChannel(rgb.b),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Gamut\n// ---------------------------------------------------------------------------\n\n/** True when the OKLCH color maps inside the sRGB gamut (no channel clipping). */\nexport function isInSrgbGamut(color: Oklch): boolean {\n const { r, g, b } = oklchToLinearRgb(color);\n const eps = 1e-4;\n return (\n r >= -eps && r <= 1 + eps && g >= -eps && g <= 1 + eps && b >= -eps && b <= 1 + eps\n );\n}\n\n/**\n * Reduce chroma (keeping L and H) until the color fits the sRGB gamut.\n * Binary search on chroma — cheap, deterministic, good enough for tokens.\n */\nexport function clampChromaToGamut(color: Oklch): Oklch {\n if (isInSrgbGamut(color)) return color;\n let lo = 0;\n let hi = color.c;\n for (let i = 0; i < 24; i++) {\n const mid = (lo + hi) / 2;\n if (isInSrgbGamut({ l: color.l, c: mid, h: color.h })) lo = mid;\n else hi = mid;\n }\n return { l: color.l, c: lo, h: color.h };\n}\n\n// ---------------------------------------------------------------------------\n// Hex\n// ---------------------------------------------------------------------------\n\nfunction to2Hex(v: number): string {\n return Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, '0');\n}\n\n/** Convert OKLCH → `#rrggbb`. Chroma is gamut-clamped first so output is always valid sRGB. */\nexport function oklchToHex(color: Oklch): string {\n const safe = clampChromaToGamut(color);\n const { r, g, b } = linearRgbToSrgb(oklchToLinearRgb(safe));\n return `#${to2Hex(r)}${to2Hex(g)}${to2Hex(b)}`;\n}\n\n/**\n * Format OKLCH as a CSS `oklch(L% C H)` string.\n * Rounded for compact, stable output (L→0.1%, C→4dp, H→0.1°).\n */\nexport function oklchToCss(color: Oklch): string {\n const safe = clampChromaToGamut(color);\n const l = (clamp01(safe.l) * 100).toFixed(1);\n const c = Math.max(0, safe.c).toFixed(4);\n const h = normalizeHue(safe.h).toFixed(1);\n return `oklch(${l}% ${c} ${h})`;\n}\n\n/** Parse `#rgb` / `#rrggbb` → gamma sRGB channels ∈ [0,1]. Returns null on malformed input. */\nfunction parseHex(hex: string): Srgb | null {\n let h = hex.trim().replace(/^#/, '');\n if (h.length === 3) {\n h = h.replace(/(.)/g, '$1$1');\n }\n if (h.length !== 6 || /[^0-9a-fA-F]/.test(h)) return null;\n return {\n r: parseInt(h.slice(0, 2), 16) / 255,\n g: parseInt(h.slice(2, 4), 16) / 255,\n b: parseInt(h.slice(4, 6), 16) / 255,\n };\n}\n\n// ---------------------------------------------------------------------------\n// WCAG 2.1 luminance + contrast\n// ---------------------------------------------------------------------------\n\nfunction relativeLuminanceFromSrgb({ r, g, b }: Srgb): number {\n const R = srgbToLinearChannel(r);\n const G = srgbToLinearChannel(g);\n const B = srgbToLinearChannel(b);\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n}\n\n/** WCAG relative luminance for an OKLCH color (via its in-gamut sRGB mapping). */\nexport function relativeLuminance(color: Oklch): number {\n return relativeLuminanceFromSrgb(linearRgbToSrgb(oklchToLinearRgb(clampChromaToGamut(color))));\n}\n\nfunction contrastFromLuminances(l1: number, l2: number): number {\n const hi = Math.max(l1, l2);\n const lo = Math.min(l1, l2);\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/** WCAG 2.1 contrast ratio (1–21) between two OKLCH colors. Symmetric. */\nexport function contrastRatio(a: Oklch, b: Oklch): number {\n return contrastFromLuminances(relativeLuminance(a), relativeLuminance(b));\n}\n\n/** WCAG 2.1 contrast ratio between two CSS color strings. Supports `oklch(...)` and hex. */\nexport function contrastRatioCss(a: string, b: string): number {\n const ca = parseColor(a);\n const cb = parseColor(b);\n if (!ca || !cb) return 1;\n return contrastRatio(ca, cb);\n}\n\n// ---------------------------------------------------------------------------\n// Parsing back from emitted token strings (for the validator)\n// ---------------------------------------------------------------------------\n\nconst OKLCH_RE = /^oklch\\(\\s*([\\d.]+)%?\\s+([\\d.]+)\\s+([\\d.]+)\\s*\\)$/i;\n\n/** Parse a token color string (`oklch(L% C H)` or hex) back into OKLCH. Returns null if unparseable. */\nexport function parseColor(value: string): Oklch | null {\n const v = value.trim();\n const m = OKLCH_RE.exec(v);\n if (m && m[1] && m[2] && m[3]) {\n const lRaw = parseFloat(m[1]);\n // L written as a percent (e.g. `62.5%`) or a 0–1 number.\n const l = v.includes('%') ? lRaw / 100 : lRaw;\n return { l, c: parseFloat(m[2]), h: parseFloat(m[3]) };\n }\n if (v.startsWith('#')) {\n const srgb = parseHex(v);\n if (!srgb) return null;\n return srgbToOklch(srgb);\n }\n return null;\n}\n\nfunction srgbToOklch(srgb: Srgb): Oklch {\n const r = srgbToLinearChannel(srgb.r);\n const g = srgbToLinearChannel(srgb.g);\n const b = srgbToLinearChannel(srgb.b);\n\n const l_ = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m_ = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s_ = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n\n const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;\n const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;\n const bb = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;\n\n const c = Math.hypot(a, bb);\n const h = normalizeHue((Math.atan2(bb, a) * 180) / Math.PI);\n return { l: L, c, h };\n}\n\n/** Grouped namespace export (mirrors `ColorExtensions` style elsewhere in the lib). */\nexport const Oklch = {\n normalizeHue,\n isInSrgbGamut,\n clampChromaToGamut,\n oklchToHex,\n oklchToCss,\n parseColor,\n relativeLuminance,\n contrastRatio,\n contrastRatioCss,\n} as const;\n","/* ---------------------------------------------------------------------------\n * The semantic token contract.\n *\n * Mirrors EXACTLY the semantic `--color-*` tokens declared in `src/index.css`\n * (the `@theme` block + its `.dark { }` overrides). A theme supplies a value\n * for every key in both light and dark modes; the CSS emitter writes them back\n * as `--color-{key}` under `.theme-{id}` / `.dark.theme-{id}`.\n *\n * Keep this in lock-step with `index.css`: add a semantic token there → add the\n * matching key here (and the generator will need to produce it).\n * ------------------------------------------------------------------------- */\n\n/** The six tone families that each carry base / -foreground / -soft / -soft-foreground. */\nexport const TONE_FAMILIES = [\n 'primary',\n 'accent',\n 'destructive',\n 'info',\n 'success',\n 'warning',\n] as const;\n\nexport type ToneFamilyName = (typeof TONE_FAMILIES)[number];\n\n/** Surface + chrome tokens (everything that isn't one of the tone families). */\nexport const SURFACE_TOKENS = [\n 'background',\n 'foreground',\n 'card',\n 'card-foreground',\n 'popover',\n 'popover-foreground',\n 'muted',\n 'muted-foreground',\n 'subtle-foreground',\n 'inverse',\n 'inverse-foreground',\n 'border',\n 'border-strong',\n 'input',\n 'ring',\n] as const;\n\n/** The four slot suffixes every tone family expands into. */\ntype ToneSlotSuffix = '' | '-foreground' | '-soft' | '-soft-foreground';\n\n/** A single tone family expanded to its four token keys, e.g. `primary | primary-foreground | …`. */\ntype ToneFamilyTokens<F extends string> = F extends string\n ? `${F}${ToneSlotSuffix}`\n : never;\n\n/**\n * Every semantic token key (the part after `--color-`).\n *\n * = surface/chrome tokens ∪ (each tone family × {base,-foreground,-soft,-soft-foreground}).\n * 15 surface + 6×4 tone = 39 keys total.\n */\nexport type SemanticToken =\n | (typeof SURFACE_TOKENS)[number]\n | ToneFamilyTokens<ToneFamilyName>;\n\n/** A complete set of color values — one CSS color string per semantic token. */\nexport type TokenSet = Record<SemanticToken, string>;\n\n/** Optional radius scale a theme may carry (maps to `--radius-{md,lg,xl}`). */\nexport interface RadiusScale {\n md: string;\n lg: string;\n xl: string;\n}\n\n/** The four slots of one tone family. */\nexport interface ToneSlots {\n base: string;\n foreground: string;\n soft: string;\n softForeground: string;\n}\n\n/**\n * The full, ordered list of every semantic token key — derived from the same\n * constants the type is built from, so it can never drift from `SemanticToken`.\n * Used by the validator/emitter to iterate exhaustively.\n */\nexport const SEMANTIC_TOKENS: readonly SemanticToken[] = [\n ...SURFACE_TOKENS,\n ...TONE_FAMILIES.flatMap(\n (f) =>\n [f, `${f}-foreground`, `${f}-soft`, `${f}-soft-foreground`] as SemanticToken[],\n ),\n];\n\n/** Write a tone family's four slots into a partial token set under the family's keys. */\nexport function applyToneSlots(\n target: Partial<TokenSet>,\n family: ToneFamilyName,\n slots: ToneSlots,\n): void {\n target[family] = slots.base;\n target[`${family}-foreground`] = slots.foreground;\n target[`${family}-soft`] = slots.soft;\n target[`${family}-soft-foreground`] = slots.softForeground;\n}\n","/* ---------------------------------------------------------------------------\n * Theme + Seed shapes.\n *\n * A `Theme` is a fully-resolved, validated pair of light/dark token sets plus\n * metadata. A `ThemeSeed` is the small, human-authorable recipe the OKLCH\n * generator expands into a `Theme` (see `generateTheme`).\n * ------------------------------------------------------------------------- */\n\nimport type { TokenSet } from './Tokens';\n\n/**\n * Theme lifecycle status.\n *\n * - `validated` — hand-authored from real, visually-verified app tokens; the\n * colors are locked (never auto-nudged), proven in a shipping product.\n * - `candidate` — generated/curated and AA-proven by the engine, but not yet\n * validated against a real app surface.\n */\nexport const ThemeStatus = {\n Validated: 'validated',\n Candidate: 'candidate',\n} as const;\n\n/** A theme's lifecycle status value (`\"validated\"` | `\"candidate\"`). */\nexport type ThemeStatus = (typeof ThemeStatus)[keyof typeof ThemeStatus];\n\n/** Contrast / \"is this theme proven\" metadata, produced by the validator. */\nexport interface ThemeMeta {\n /** True iff every foreground↔surface pair clears its WCAG AA threshold in BOTH modes. */\n contrastAA: boolean;\n /**\n * Human-readable pair failures (empty when `contrastAA` is true).\n * Each entry: `\"<mode>: <fg> on <bg> = <ratio> (need <threshold>)\"`.\n */\n failures?: string[];\n}\n\n/** A named, validated theme — the unit the registry stores and the emitter renders. */\nexport interface Theme {\n /** Stable kebab-case id; drives the `.theme-{id}` class. */\n id: string;\n /** Display name. */\n name: string;\n /** One-line description. */\n description: string;\n /** Free-form tags for filtering/search (e.g. `[\"dark\",\"cool\",\"brand\"]`). */\n tags: string[];\n /** Light-mode token values. */\n light: TokenSet;\n /** Dark-mode token values. */\n dark: TokenSet;\n /** Border-radius scale knob (maps to the lib's `--radius-*`). Optional. */\n radius?: 'sm' | 'md' | 'lg';\n /** Lifecycle status — `validated` (real-app proven, locked) or `candidate` (engine-proven). */\n status: ThemeStatus;\n /** Validation result — `meta.contrastAA === true` ⇒ the theme is \"proven\". */\n meta: ThemeMeta;\n}\n\n/** Neutral surface temperature — biases the grey ramp warm/cool/neutral. */\nexport type NeutralTemp = 'cool' | 'neutral' | 'warm';\n\n/** How the accent hue is derived from the primary hue. */\nexport type AccentMode = 'complementary' | 'analogous' | 'triadic' | 'mono';\n\n/** Surface character — `soft` = gentle low-contrast surfaces, `crisp` = punchier separation. */\nexport type SurfaceStyle = 'soft' | 'crisp';\n\n/**\n * The recipe a theme is generated from. Pure inputs → deterministic `Theme`\n * (no randomness; identical seeds always yield identical themes).\n */\nexport interface ThemeSeed {\n /** Stable kebab-case id for the produced theme. */\n id: string;\n /** Display name. */\n name: string;\n /** One-line description (optional — a sensible default is derived from the seed). */\n description?: string;\n /** Tags to attach (generator also auto-tags temp/mode/scheme). */\n tags?: string[];\n /** Primary brand hue in degrees, 0–360. */\n primaryHue: number;\n /** Neutral ramp temperature. Default `neutral`. */\n neutralTemp?: NeutralTemp;\n /** Accent derivation. Default `complementary`. */\n accentMode?: AccentMode;\n /** Surface character. Default `crisp`. */\n surface?: SurfaceStyle;\n /** Radius knob to carry through. Optional. */\n radius?: 'sm' | 'md' | 'lg';\n}\n","/* ---------------------------------------------------------------------------\n * Theme validator — WCAG AA contrast checks across every text/surface pair.\n *\n * \"Proven\" = every paired (-foreground vs its surface/base) clears AA in BOTH\n * light and dark modes. Text pairs need ≥ 4.5:1; the focus `ring` (a UI\n * affordance, not text) needs ≥ 3:1 against the page background.\n * ------------------------------------------------------------------------- */\n\nimport type { Theme, ThemeMeta } from './Theme';\nimport { TONE_FAMILIES, type SemanticToken, type TokenSet } from './Tokens';\nimport { contrastRatioCss } from './Oklch';\n\n/** WCAG AA thresholds. Text = normal-size body text; UI = non-text affordances. */\nexport const AA_TEXT = 4.5;\nexport const AA_UI = 3.0;\n\n/** One foreground↔background pair to verify, with its required ratio. */\ninterface ContrastPair {\n /** Foreground token (text/icon/affordance color). */\n fg: SemanticToken;\n /** Background token the fg sits on. */\n bg: SemanticToken;\n /** Required minimum ratio (AA_TEXT or AA_UI). */\n min: number;\n}\n\n/**\n * The canonical set of pairs every theme must satisfy.\n * Surface text pairs + each tone family's solid/soft foreground pairs + ring.\n */\nexport function contrastPairs(): ContrastPair[] {\n const pairs: ContrastPair[] = [\n { fg: 'foreground', bg: 'background', min: AA_TEXT },\n { fg: 'card-foreground', bg: 'card', min: AA_TEXT },\n { fg: 'popover-foreground', bg: 'popover', min: AA_TEXT },\n { fg: 'muted-foreground', bg: 'muted', min: AA_TEXT },\n { fg: 'subtle-foreground', bg: 'background', min: AA_UI },\n { fg: 'inverse-foreground', bg: 'inverse', min: AA_TEXT },\n // Focus ring is a UI affordance against the page → AA_UI.\n { fg: 'ring', bg: 'background', min: AA_UI },\n ];\n\n for (const f of TONE_FAMILIES) {\n // Solid: foreground text on the saturated base.\n pairs.push({ fg: `${f}-foreground`, bg: f, min: AA_TEXT });\n // Soft: foreground text on the tinted soft surface.\n pairs.push({ fg: `${f}-soft-foreground`, bg: `${f}-soft`, min: AA_TEXT });\n }\n\n return pairs;\n}\n\n/** Check one token set (one mode) against the pair list. Returns failure strings. */\nfunction checkMode(set: TokenSet, mode: 'light' | 'dark'): string[] {\n const failures: string[] = [];\n for (const { fg, bg, min } of contrastPairs()) {\n const ratio = contrastRatioCss(set[fg], set[bg]);\n if (ratio + 1e-3 < min) {\n failures.push(\n `${mode}: ${fg} on ${bg} = ${ratio.toFixed(2)} (need ${min.toFixed(1)})`,\n );\n }\n }\n return failures;\n}\n\n/**\n * Validate a theme's light AND dark token sets.\n * `contrastAA` is true only when both modes pass every pair.\n */\nexport function validateTheme(theme: Pick<Theme, 'light' | 'dark'>): ThemeMeta {\n const failures = [\n ...checkMode(theme.light, 'light'),\n ...checkMode(theme.dark, 'dark'),\n ];\n return failures.length === 0\n ? { contrastAA: true }\n : { contrastAA: false, failures };\n}\n","/* ---------------------------------------------------------------------------\n * OKLCH theme generator.\n *\n * `generateTheme(seed)` → a fully-resolved, validated `Theme` with both light\n * and dark `TokenSet`s. Pure & deterministic — output depends only on the seed\n * (no `Math.random`). Strategy:\n *\n * 1. Neutral ramp — low-chroma lightness steps, hue/chroma biased by\n * `neutralTemp`; `surface` widens/narrows the steps. Drives background /\n * card / popover / muted / border / input / *-foreground.\n * 2. Primary — from `primaryHue` at a readable chroma; soft = high-L\n * low-C tint; foregrounds auto-nudged to clear AA.\n * 3. Accent — primary hue rotated per `accentMode`.\n * 4. Status — success / warning / destructive / info anchored to\n * canonical hues but chroma-harmonized to the primary.\n *\n * Every *-foreground is contrast-paired and nudged (lighter/darker in L) until\n * it clears its WCAG AA threshold, so generated themes are \"proven\" by default.\n * ------------------------------------------------------------------------- */\n\nimport type {\n AccentMode,\n NeutralTemp,\n SurfaceStyle,\n Theme,\n ThemeSeed,\n} from './Theme';\nimport { ThemeStatus } from './Theme';\nimport {\n applyToneSlots,\n type ToneFamilyName,\n type ToneSlots,\n type TokenSet,\n} from './Tokens';\nimport {\n contrastRatio,\n normalizeHue,\n oklchToCss,\n relativeLuminance,\n type Oklch,\n} from './Oklch';\nimport { AA_TEXT, AA_UI, validateTheme } from './validate';\n\n// ---------------------------------------------------------------------------\n// Neutral ramp configuration\n// ---------------------------------------------------------------------------\n\n/** Hue + chroma the neutral grey ramp is tinted toward, per temperature. */\nconst NEUTRAL_TINT: Record<NeutralTemp, { hue: number; chroma: number }> = {\n cool: { hue: 250, chroma: 0.012 }, // bluish slate\n neutral: { hue: 270, chroma: 0.003 }, // near-achromatic\n warm: { hue: 70, chroma: 0.012 }, // warm stone\n};\n\n/** Canonical status hues (OKLCH degrees), tuned for sRGB. */\nconst STATUS_HUE = {\n success: 150,\n warning: 80,\n destructive: 27,\n info: 230,\n} as const;\n\n// ---------------------------------------------------------------------------\n// Small helpers\n// ---------------------------------------------------------------------------\n\nconst clampL = (l: number): number => Math.min(0.985, Math.max(0.06, l));\n\n/** Pick the foreground (near-white vs near-black, tinted to `hue`) with higher contrast on `bg`. */\nfunction bestTextOn(bg: Oklch, hue: number): Oklch {\n const white: Oklch = { l: 0.985, c: 0.004, h: hue };\n const black: Oklch = { l: 0.18, c: 0.01, h: hue };\n return contrastRatio(white, bg) >= contrastRatio(black, bg) ? white : black;\n}\n\n/**\n * Nudge a foreground's lightness toward the better-contrast end until it clears\n * `min` against `bg` (or we run out of headroom). Deterministic stepping.\n */\nfunction nudgeForeground(fg: Oklch, bg: Oklch, min: number): Oklch {\n let cur = { ...fg };\n if (contrastRatio(cur, bg) >= min) return cur;\n\n // Decide direction: move toward whichever pole increases contrast.\n const goLighter = relativeLuminance(bg) < 0.4;\n const step = goLighter ? 0.03 : -0.03;\n\n for (let i = 0; i < 32; i++) {\n cur = { ...cur, l: clampL(cur.l + step) };\n if (contrastRatio(cur, bg) >= min) return cur;\n if (cur.l <= 0.06 || cur.l >= 0.985) break;\n }\n // Last resort: pure pole (white or black) for maximum contrast.\n return goLighter ? { l: 0.985, c: 0, h: fg.h } : { l: 0.1, c: 0, h: fg.h };\n}\n\n/**\n * Resolve a {base, foreground} pair that clears `min`. First nudge the\n * foreground; if it's already maxed at a pole and still short, slide the BASE\n * lightness away from the foreground (darker when fg is light, lighter when fg\n * is dark) — preserving hue/chroma — until the pair passes. Returns both.\n */\nfunction resolveSolidPair(\n base: Oklch,\n fg: Oklch,\n min: number,\n): { base: Oklch; foreground: Oklch } {\n let curFg = nudgeForeground(fg, base, min);\n if (contrastRatio(curFg, base) >= min) return { base, foreground: curFg };\n\n // Foreground couldn't get there alone → move the base.\n const fgIsLight = relativeLuminance(curFg) >= 0.5;\n const step = fgIsLight ? -0.02 : 0.02; // push base contrast up\n let curBase = { ...base };\n for (let i = 0; i < 32; i++) {\n curBase = { ...curBase, l: clampL(curBase.l + step) };\n curFg = nudgeForeground(curFg, curBase, min);\n if (contrastRatio(curFg, curBase) >= min) break;\n if (curBase.l <= 0.06 || curBase.l >= 0.985) break;\n }\n return { base: curBase, foreground: curFg };\n}\n\n// ---------------------------------------------------------------------------\n// Per-mode build\n// ---------------------------------------------------------------------------\n\ninterface ModeConfig {\n /** Background lightness. */\n bgL: number;\n /** Step between stacked surfaces (card/popover/muted), signed toward foreground. */\n surfStep: number;\n /** Foreground (body text) lightness. */\n fgL: number;\n /** Base lightness for saturated tone bases (primary/status). */\n toneL: number;\n /** Chroma for saturated tone bases. */\n toneC: number;\n /** Soft-surface lightness. */\n softL: number;\n /** Soft-surface chroma. */\n softC: number;\n /** Is this the dark mode build? */\n isDark: boolean;\n}\n\n/** Resolve per-mode lightness/chroma knobs from the surface style. */\nfunction modeConfig(isDark: boolean, surface: SurfaceStyle): ModeConfig {\n const crisp = surface === 'crisp';\n if (isDark) {\n return {\n bgL: crisp ? 0.16 : 0.2,\n surfStep: crisp ? 0.05 : 0.04,\n fgL: 0.96,\n toneL: 0.7,\n toneC: 0.16,\n softL: 0.3,\n softC: 0.06,\n isDark: true,\n };\n }\n return {\n bgL: 1.0,\n surfStep: crisp ? -0.035 : -0.025,\n fgL: 0.2,\n toneL: 0.58,\n toneC: 0.17,\n softL: 0.95,\n softC: 0.05,\n isDark: false,\n };\n}\n\n/** Build one mode's full token set. */\nfunction buildMode(\n primaryHue: number,\n accentHue: number,\n neutralTemp: NeutralTemp,\n surface: SurfaceStyle,\n isDark: boolean,\n): TokenSet {\n const cfg = modeConfig(isDark, surface);\n const tint = NEUTRAL_TINT[neutralTemp];\n const nh = tint.hue;\n const nc = tint.chroma;\n\n // ---- neutral surfaces ----\n const background: Oklch = { l: clampL(cfg.bgL), c: nc, h: nh };\n // card/popover sit one step \"in front of\" the background.\n const card: Oklch = { l: clampL(cfg.bgL + cfg.surfStep), c: nc, h: nh };\n const popover = card;\n const muted: Oklch = { l: clampL(cfg.bgL + cfg.surfStep * 1.5), c: nc * 1.4, h: nh };\n\n // Borders / input outline — a couple steps further from bg, slightly more chroma.\n const border: Oklch = { l: clampL(cfg.bgL + cfg.surfStep * 2.2), c: nc * 1.6, h: nh };\n const borderStrong: Oklch = {\n l: clampL(cfg.bgL + cfg.surfStep * 3.4),\n c: nc * 1.8,\n h: nh,\n };\n const input = borderStrong;\n\n // Foregrounds (auto-nudged for AA).\n const foreground = nudgeForeground({ l: cfg.fgL, c: nc * 2, h: nh }, background, AA_TEXT);\n const cardFg = nudgeForeground(foreground, card, AA_TEXT);\n const popoverFg = nudgeForeground(foreground, popover, AA_TEXT);\n const mutedFg = nudgeForeground(\n { l: isDark ? 0.72 : 0.5, c: nc * 2.5, h: nh },\n muted,\n AA_TEXT,\n );\n const subtleFg = nudgeForeground(\n { l: isDark ? 0.55 : 0.62, c: nc * 2, h: nh },\n background,\n AA_UI,\n );\n\n // Inverse = flipped surface (dark chip on light theme, light chip on dark theme).\n const inverse: Oklch = isDark\n ? { l: 0.96, c: nc, h: nh }\n : { l: 0.2, c: nc * 2, h: nh };\n const inverseFg = nudgeForeground(\n { l: isDark ? 0.18 : 0.97, c: nc, h: nh },\n inverse,\n AA_TEXT,\n );\n\n // ---- tone family builder ----\n const buildTone = (hue: number, chromaScale = 1): ToneSlots => {\n const baseSeed: Oklch = { l: cfg.toneL, c: cfg.toneC * chromaScale, h: hue };\n const foregroundC = bestTextOn(baseSeed, hue);\n // Co-resolve base + foreground so the solid pair always clears AA text.\n const { base, foreground: fg } = resolveSolidPair(baseSeed, foregroundC, AA_TEXT);\n const soft: Oklch = { l: cfg.softL, c: cfg.softC * chromaScale, h: hue };\n // Soft-foreground: a deep (light mode) / bright (dark mode) tint of the same hue.\n const softFgSeed: Oklch = isDark\n ? { l: 0.85, c: cfg.softC * 1.4 * chromaScale, h: hue }\n : { l: 0.42, c: cfg.toneC * 0.9 * chromaScale, h: hue };\n const softFg = nudgeForeground(softFgSeed, soft, AA_TEXT);\n return {\n base: oklchToCss(base),\n foreground: oklchToCss(fg),\n soft: oklchToCss(soft),\n softForeground: oklchToCss(softFg),\n };\n };\n\n // Ring = primary at a vivid, mid lightness; checked as UI affordance vs bg.\n const ring = nudgeForeground(\n { l: isDark ? 0.7 : 0.55, c: 0.16, h: primaryHue },\n background,\n AA_UI,\n );\n\n const set: Partial<TokenSet> = {\n background: oklchToCss(background),\n foreground: oklchToCss(foreground),\n card: oklchToCss(card),\n 'card-foreground': oklchToCss(cardFg),\n popover: oklchToCss(popover),\n 'popover-foreground': oklchToCss(popoverFg),\n muted: oklchToCss(muted),\n 'muted-foreground': oklchToCss(mutedFg),\n 'subtle-foreground': oklchToCss(subtleFg),\n inverse: oklchToCss(inverse),\n 'inverse-foreground': oklchToCss(inverseFg),\n border: oklchToCss(border),\n 'border-strong': oklchToCss(borderStrong),\n input: oklchToCss(input),\n ring: oklchToCss(ring),\n };\n\n const tones: Record<ToneFamilyName, number> = {\n primary: primaryHue,\n accent: accentHue,\n destructive: STATUS_HUE.destructive,\n info: STATUS_HUE.info,\n success: STATUS_HUE.success,\n warning: STATUS_HUE.warning,\n };\n\n for (const [family, hue] of Object.entries(tones) as [ToneFamilyName, number][]) {\n // Warning runs a touch lower-chroma so the yellow doesn't blow out.\n const chromaScale = family === 'warning' ? 0.92 : 1;\n applyToneSlots(set, family, buildTone(hue, chromaScale));\n }\n\n return set as TokenSet;\n}\n\n// ---------------------------------------------------------------------------\n// Accent derivation\n// ---------------------------------------------------------------------------\n\nfunction accentHueFrom(primaryHue: number, mode: AccentMode): number {\n switch (mode) {\n case 'complementary':\n return normalizeHue(primaryHue + 180);\n case 'analogous':\n return normalizeHue(primaryHue + 40);\n case 'triadic':\n return normalizeHue(primaryHue + 120);\n case 'mono':\n return primaryHue;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public entry\n// ---------------------------------------------------------------------------\n\nfunction defaultDescription(seed: ThemeSeed): string {\n const temp = seed.neutralTemp ?? 'neutral';\n const surf = seed.surface ?? 'crisp';\n return `Generated theme · hue ${Math.round(seed.primaryHue)}° · ${temp} neutrals · ${surf} surfaces.`;\n}\n\n/**\n * Expand a {@link ThemeSeed} into a validated {@link Theme}.\n * Deterministic: same seed in → identical theme out.\n */\nexport function generateTheme(seed: ThemeSeed): Theme {\n const primaryHue = normalizeHue(seed.primaryHue);\n const neutralTemp = seed.neutralTemp ?? 'neutral';\n const accentMode = seed.accentMode ?? 'complementary';\n const surface = seed.surface ?? 'crisp';\n const accentHue = accentHueFrom(primaryHue, accentMode);\n\n const light = buildMode(primaryHue, accentHue, neutralTemp, surface, false);\n const dark = buildMode(primaryHue, accentHue, neutralTemp, surface, true);\n\n const meta = validateTheme({ light, dark });\n\n const autoTags = [\n neutralTemp,\n accentMode,\n surface,\n meta.contrastAA ? 'aa' : 'aa-fail',\n ];\n\n return {\n id: seed.id,\n name: seed.name,\n description: seed.description ?? defaultDescription(seed),\n tags: Array.from(new Set([...(seed.tags ?? []), ...autoTags])),\n light,\n dark,\n radius: seed.radius,\n // Generated/curated themes default to `candidate` — engine-proven, not yet\n // validated against a real app surface.\n status: ThemeStatus.Candidate,\n meta,\n };\n}\n","/* ---------------------------------------------------------------------------\n * CSS emitter — turn a Theme into scoped class blocks.\n *\n * An app applies a theme by adding `theme-{id}` to a root element. The emitted\n * CSS overrides the lib's semantic `--color-*` vars (and optional `--radius-*`)\n * under that class, so every Tailwind utility (`bg-primary`, `text-foreground`,\n * …) re-resolves to the theme's values. Dark mode reuses the lib's variant:\n * `.dark.theme-{id}` (i.e. `.dark` + the theme class on the same element, or an\n * ancestor `.dark`).\n * ------------------------------------------------------------------------- */\n\nimport type { Theme, ThemeStatus } from './Theme';\nimport { SEMANTIC_TOKENS, type TokenSet } from './Tokens';\n\n/** Radius knob → concrete `--radius-*` triple (mirrors the lib's default scale shifts). */\nconst RADIUS_SCALE: Record<NonNullable<Theme['radius']>, Record<string, string>> = {\n sm: { md: '0.375rem', lg: '0.5rem', xl: '0.75rem' },\n md: { md: '0.5rem', lg: '0.75rem', xl: '1rem' },\n lg: { md: '0.625rem', lg: '0.875rem', xl: '1.25rem' },\n};\n\n/** Render one token set as ` --color-{key}: {value};` declaration lines. */\nfunction declarations(set: TokenSet, indent = ' '): string {\n return SEMANTIC_TOKENS.map((tok) => `${indent}--color-${tok}: ${set[tok]};`).join(\n '\\n',\n );\n}\n\n/** Render the optional radius overrides as declaration lines (empty string when unset). */\nfunction radiusDeclarations(theme: Theme, indent = ' '): string {\n if (!theme.radius) return '';\n const scale = RADIUS_SCALE[theme.radius];\n return (\n '\\n' +\n Object.entries(scale)\n .map(([k, v]) => `${indent}--radius-${k}: ${v};`)\n .join('\\n')\n );\n}\n\n/**\n * Emit the CSS for a single theme: a light `.theme-{id}` block + a\n * `.dark.theme-{id}` block. Returns a string (no trailing newline).\n */\nexport function themeToCss(theme: Theme): string {\n const radius = radiusDeclarations(theme);\n const light = `.theme-${theme.id} {\\n${declarations(theme.light)}${radius}\\n}`;\n const dark = `.dark.theme-${theme.id} {\\n${declarations(theme.dark)}\\n}`;\n return `${light}\\n\\n${dark}`;\n}\n\n/** Emit a full stylesheet for many themes, with a generated-file banner. */\nexport function emitAllThemesCss(themes: Theme[]): string {\n const banner =\n '/* Generated by @wow-two-beta/ui theme engine — do not edit by hand.\\n' +\n ' * Source: src/themes/registry.ts → regenerate via the package build. */\\n';\n const body = themes.map(themeToCss).join('\\n\\n');\n return `${banner}\\n${body}\\n`;\n}\n\n/** Machine-readable manifest entry for one theme (no token payload — index only). */\nexport interface ThemeManifestEntry {\n id: string;\n name: string;\n description: string;\n tags: string[];\n /** Lifecycle status — `validated` (real-app proven) or `candidate` (engine-proven). */\n status: ThemeStatus;\n contrastAA: boolean;\n}\n\n/** Build the `themes.json` manifest payload from the registry. */\nexport function emitThemesManifest(themes: Theme[]): ThemeManifestEntry[] {\n return themes.map((t) => ({\n id: t.id,\n name: t.name,\n description: t.description,\n tags: t.tags,\n status: t.status,\n contrastAA: t.meta.contrastAA,\n }));\n}\n","/* ---------------------------------------------------------------------------\n * Validated themes — hand-authored from real, visually-verified app tokens.\n *\n * Unlike the curated registry (every preset is generated from a seed and\n * AA-nudged by the engine), a validated theme's colors are AUTHORED VERBATIM\n * from a shipping product and must never be re-derived — running them through\n * `generateTheme` would change the validated colors. So we build the full\n * 39-key light/dark TokenSets by hand: the app's bespoke overrides on top of\n * the lib's DEFAULT token values (the ones declared in `src/index.css`), which\n * the real app inherits for every token it doesn't override.\n *\n * We DO run `validateTheme` and record `meta` for transparency, but `status`\n * stays `validated` regardless of AA result — the human validated it visually.\n *\n * `VALIDATED_THEMES` is merged FIRST into the exported `THEMES` array.\n * ------------------------------------------------------------------------- */\n\nimport type { Theme } from './Theme';\nimport { ThemeStatus } from './Theme';\nimport type { TokenSet } from './Tokens';\nimport { validateTheme } from './validate';\n\n/* ---------------------------------------------------------------------------\n * Lib DEFAULT token values — copied verbatim from `src/index.css`.\n * - `LIB_DEFAULT_LIGHT` ← the `@theme { }` block\n * - `LIB_DEFAULT_DARK` ← the `.dark { }` block\n * A validated theme spreads these first, then applies its app-specific\n * overrides, so every token it doesn't define falls back to exactly the value\n * the real app inherits.\n * ------------------------------------------------------------------------- */\n\nconst LIB_DEFAULT_LIGHT: TokenSet = {\n background: '#ffffff',\n foreground: '#18181b',\n card: '#ffffff',\n 'card-foreground': '#18181b',\n popover: '#ffffff',\n 'popover-foreground': '#18181b',\n muted: '#f4f4f5',\n 'muted-foreground': '#71717a',\n 'subtle-foreground': '#a1a1aa',\n inverse: '#18181b',\n 'inverse-foreground': '#fafafa',\n border: '#e4e4e7',\n 'border-strong': '#d4d4d8',\n input: '#d4d4d8',\n ring: '#3b82f6',\n primary: '#2563eb',\n 'primary-foreground': '#ffffff',\n 'primary-soft': '#dbeafe',\n 'primary-soft-foreground': '#1d4ed8',\n accent: '#0d9488',\n 'accent-foreground': '#ffffff',\n 'accent-soft': '#ccfbf1',\n 'accent-soft-foreground': '#115e59',\n destructive: '#dc2626',\n 'destructive-foreground': '#ffffff',\n 'destructive-soft': '#fef2f2',\n 'destructive-soft-foreground': '#b91c1c',\n info: '#0891b2',\n 'info-foreground': '#ffffff',\n 'info-soft': '#ecfeff',\n 'info-soft-foreground': '#0e7490',\n success: '#16a34a',\n 'success-foreground': '#ffffff',\n 'success-soft': '#f0fdf4',\n 'success-soft-foreground': '#15803d',\n warning: '#f59e0b',\n 'warning-foreground': '#78350f',\n 'warning-soft': '#fffbeb',\n 'warning-soft-foreground': '#b45309',\n};\n\nconst LIB_DEFAULT_DARK: TokenSet = {\n background: '#09090b',\n foreground: '#fafafa',\n card: '#18181b',\n 'card-foreground': '#fafafa',\n popover: '#18181b',\n 'popover-foreground': '#fafafa',\n muted: '#18181b',\n 'muted-foreground': '#a1a1aa',\n 'subtle-foreground': '#71717a',\n inverse: '#fafafa',\n 'inverse-foreground': '#09090b',\n border: '#27272a',\n 'border-strong': '#3f3f46',\n input: '#3f3f46',\n ring: '#60a5fa',\n primary: '#3b82f6',\n 'primary-foreground': '#ffffff',\n 'primary-soft': '#1e3a8a',\n 'primary-soft-foreground': '#dbeafe',\n accent: '#2dd4bf',\n 'accent-foreground': '#042f2e',\n 'accent-soft': '#134e4a',\n 'accent-soft-foreground': '#5eead4',\n destructive: '#ef4444',\n 'destructive-foreground': '#ffffff',\n 'destructive-soft': '#7f1d1d',\n 'destructive-soft-foreground': '#fee2e2',\n info: '#06b6d4',\n 'info-foreground': '#ffffff',\n 'info-soft': '#164e63',\n 'info-soft-foreground': '#cffafe',\n success: '#22c55e',\n 'success-foreground': '#ffffff',\n 'success-soft': '#14532d',\n 'success-soft-foreground': '#dcfce7',\n warning: '#f59e0b',\n 'warning-foreground': '#78350f',\n 'warning-soft': '#78350f',\n 'warning-soft-foreground': '#fef3c7',\n};\n\n/* ---------------------------------------------------------------------------\n * Smart QR — the real, visually-validated product theme.\n *\n * Hand-authored from the shipping Smart QR app: violet brand + teal accent on\n * cool lavender-grey (light) / charcoal (dark). The overrides below are the\n * EXACT app token hex values; everything else inherits the lib defaults above\n * (so the self-contained theme renders identically to the real app).\n *\n * Tokens filled from lib defaults (NOT app-defined — the app inherits them):\n * light: card-foreground (= foreground), inverse, inverse-foreground,\n * and the destructive / info / success / warning families.\n * dark: card-foreground (= foreground), inverse, inverse-foreground,\n * primary-foreground, accent-foreground,\n * and the destructive / info / success / warning families.\n * ------------------------------------------------------------------------- */\n\nconst smartQrLight: TokenSet = {\n ...LIB_DEFAULT_LIGHT,\n background: '#d9dde8',\n card: '#ebeef4',\n popover: '#ebeef4',\n 'popover-foreground': '#1c1d26',\n muted: '#f1f2f8',\n foreground: '#1c1d26',\n 'card-foreground': '#1c1d26', // = foreground (app inherits foreground here)\n 'muted-foreground': '#6e7188',\n 'subtle-foreground': '#9b9fb5',\n border: '#e4e6f0',\n 'border-strong': '#c7cad9',\n input: '#e4e6f0',\n ring: '#8b5cf6',\n primary: '#7c3aed',\n 'primary-foreground': '#f5f3ff',\n 'primary-soft': '#ede9fe',\n 'primary-soft-foreground': '#5b21b6',\n accent: '#0d9488',\n 'accent-foreground': '#ffffff',\n 'accent-soft': '#ccfbf1',\n 'accent-soft-foreground': '#115e59',\n};\n\nconst smartQrDark: TokenSet = {\n ...LIB_DEFAULT_DARK,\n background: '#121214',\n card: '#1c1c1f',\n popover: '#1c1c1f',\n 'popover-foreground': '#e7e7e9',\n muted: '#18181b',\n foreground: '#e7e7e9',\n 'card-foreground': '#e7e7e9', // = foreground (app inherits foreground here)\n 'muted-foreground': '#a1a1aa',\n 'subtle-foreground': '#6e6e76',\n border: '#2a2a2e',\n 'border-strong': '#3a3a40',\n input: '#2a2a2e',\n ring: '#8b5cf6',\n primary: '#8b5cf6',\n 'primary-soft': '#2a2440',\n 'primary-soft-foreground': '#c4b5fd',\n accent: '#2dd4bf',\n 'accent-soft': '#103a35',\n 'accent-soft-foreground': '#5eead4',\n};\n\n/** Smart QR — the first validated, real-app-proven theme. Colors are locked. */\nconst smartQr: Theme = {\n id: 'smart-qr',\n name: 'Smart QR',\n description:\n 'Violet brand + teal accent on cool lavender-grey (light) / charcoal (dark) — the validated Smart QR product theme.',\n tags: ['brand', 'violet', 'teal', 'validated', 'product'],\n light: smartQrLight,\n dark: smartQrDark,\n status: ThemeStatus.Validated,\n // Recorded for transparency. We do NOT auto-nudge any value — status stays\n // `validated` even if a pair fails (the human validated it visually).\n meta: validateTheme({ light: smartQrLight, dark: smartQrDark }),\n};\n\n/** Validated themes, merged FIRST into the curated `THEMES` array. */\nexport const VALIDATED_THEMES: Theme[] = [smartQr];\n","/* ---------------------------------------------------------------------------\n * Candidate theme pool — a large, diverse, AA-proven catalog.\n *\n * Same contract as `THEME_SEEDS` in `registry.ts`: every entry is a `ThemeSeed`\n * expanded through `generateTheme`, so the whole pool is contrast-validated by\n * the engine and stamped `status: \"candidate\"`. These are *vibes*, not literal\n * clones — the seed captures hue family / neutral temperature / accent scheme /\n * surface character, and the OKLCH generator does the rest (AA-nudging included).\n *\n * Two cohorts:\n * 1. NAMED — popular dev/editor/brand palettes not already in the curated 24.\n * One seed each, hue chosen to evoke the palette's signature brand color.\n * 2. SPECTRUM — a systematic hue sweep (~every 20-30°) crossed with a couple\n * of accent modes / neutral temps, filling the wheel so any brand hue an\n * app picks already has a near neighbour in the pool.\n *\n * `registry.ts` imports `POOL_SEEDS` and appends it after the curated seeds, so\n * the final order is: smart-qr (validated) → 24 curated candidates → this pool.\n *\n * Foundation layer — no upward imports (ESLint enforces).\n * ------------------------------------------------------------------------- */\n\nimport type { ThemeSeed } from './Theme';\n\n/* ===========================================================================\n * 1. NAMED — editor / brand palettes (vibe-matched, not cloned).\n *\n * Hues are eyeballed from each palette's signature accent (OKLCH degrees):\n * ~25 red · ~45 orange · ~75 amber/olive · ~110 chartreuse · ~145 green ·\n * ~165 emerald/teal · ~195 teal/cyan · ~225 azure · ~255 indigo ·\n * ~285 violet · ~320 magenta · ~350 pink/rose.\n * Ids are kebab-case and unique vs the curated 24 + smart-qr.\n * ========================================================================= */\n\nconst NAMED_SEEDS: ThemeSeed[] = [\n {\n id: 'catppuccin-latte',\n name: 'Catppuccin Latte',\n description: 'Soft mauve brand on warm latte neutrals — the light Catppuccin flavour.',\n tags: ['editor', 'catppuccin', 'pastel', 'warm', 'soft'],\n primaryHue: 290,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'catppuccin-frappe',\n name: 'Catppuccin Frappé',\n description: 'Muted mauve brand on cool slate — the mid Catppuccin flavour.',\n tags: ['editor', 'catppuccin', 'pastel', 'cool', 'muted'],\n primaryHue: 287,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'catppuccin-macchiato',\n name: 'Catppuccin Macchiato',\n description: 'Lavender-mauve brand on deep cool neutrals — the darker Catppuccin flavour.',\n tags: ['editor', 'catppuccin', 'pastel', 'cool', 'soft'],\n primaryHue: 280,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'catppuccin-mocha',\n name: 'Catppuccin Mocha',\n description: 'Pastel mauve brand on the darkest Catppuccin slate — cozy and dim.',\n tags: ['editor', 'catppuccin', 'pastel', 'cool', 'soft'],\n primaryHue: 283,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'tokyo-night',\n name: 'Tokyo Night',\n description: 'Indigo-blue brand on deep cool navy — neon-city night editor palette.',\n tags: ['editor', 'tokyo-night', 'cool', 'calm'],\n primaryHue: 252,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'tokyo-night-storm',\n name: 'Tokyo Night Storm',\n description: 'Soft blue brand on stormy blue-grey — the lighter-ground Tokyo Night variant.',\n tags: ['editor', 'tokyo-night', 'cool', 'muted'],\n primaryHue: 246,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'tokyo-night-light',\n name: 'Tokyo Night Light',\n description: 'Indigo brand on crisp cool paper — the daytime Tokyo Night.',\n tags: ['editor', 'tokyo-night', 'cool', 'light'],\n primaryHue: 250,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'rose-pine',\n name: 'Rosé Pine',\n description: 'Dusky rose brand on muted plum-grey — the cozy Rosé Pine vibe.',\n tags: ['editor', 'rose-pine', 'muted', 'soft', 'cool'],\n primaryHue: 350,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'rose-pine-moon',\n name: 'Rosé Pine Moon',\n description: 'Soft rose brand on a lighter moonlit plum ground — Rosé Pine Moon.',\n tags: ['editor', 'rose-pine', 'muted', 'soft', 'cool'],\n primaryHue: 345,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'rose-pine-dawn',\n name: 'Rosé Pine Dawn',\n description: 'Rose brand on warm parchment — the light Rosé Pine Dawn.',\n tags: ['editor', 'rose-pine', 'warm', 'soft', 'light'],\n primaryHue: 352,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'one-dark',\n name: 'One Dark',\n description: 'Hyperlink-blue brand on cool gunmetal — the Atom/One Dark classic.',\n tags: ['editor', 'one-dark', 'cool', 'calm'],\n primaryHue: 240,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'one-light',\n name: 'One Light',\n description: 'Blue brand on crisp neutral paper — the One Light editor theme.',\n tags: ['editor', 'one-light', 'neutral', 'light'],\n primaryHue: 240,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'ayu-dark',\n name: 'Ayu Dark',\n description: 'Warm amber brand on near-black ink — Ayu Dark’s signature glow.',\n tags: ['editor', 'ayu', 'warm', 'vibrant'],\n primaryHue: 60,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'ayu-mirage',\n name: 'Ayu Mirage',\n description: 'Amber-gold brand on muted blue-grey — the mid Ayu Mirage tone.',\n tags: ['editor', 'ayu', 'warm', 'muted'],\n primaryHue: 55,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'ayu-light',\n name: 'Ayu Light',\n description: 'Warm orange brand on bright paper — the daytime Ayu Light.',\n tags: ['editor', 'ayu', 'warm', 'light'],\n primaryHue: 48,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'everforest',\n name: 'Everforest',\n description: 'Soft moss-green brand on warm forest-grey — the gentle Everforest palette.',\n tags: ['editor', 'everforest', 'nature', 'warm', 'muted'],\n primaryHue: 135,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'everforest-light',\n name: 'Everforest Light',\n description: 'Moss green brand on warm cream — the light Everforest.',\n tags: ['editor', 'everforest', 'nature', 'warm', 'light'],\n primaryHue: 130,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'kanagawa',\n name: 'Kanagawa',\n description: 'Wave-blue brand on warm sumi-ink grey — inspired by Hokusai’s Great Wave.',\n tags: ['editor', 'kanagawa', 'cool', 'muted', 'warm'],\n primaryHue: 220,\n neutralTemp: 'warm',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'kanagawa-lotus',\n name: 'Kanagawa Lotus',\n description: 'Indigo brand on warm parchment — the light Kanagawa Lotus.',\n tags: ['editor', 'kanagawa', 'warm', 'light', 'muted'],\n primaryHue: 235,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'night-owl',\n name: 'Night Owl',\n description: 'Cyan-teal brand on deep midnight blue — a palette tuned for late-night coding.',\n tags: ['editor', 'night-owl', 'cool', 'vibrant'],\n primaryHue: 195,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'light-owl',\n name: 'Light Owl',\n description: 'Teal brand on crisp cool paper — the daytime Light Owl.',\n tags: ['editor', 'night-owl', 'cool', 'light'],\n primaryHue: 198,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'synthwave',\n name: 'Synthwave',\n description: 'Hot-magenta brand with a cyan accent on deep purple-black — retro 80s neon.',\n tags: ['editor', 'synthwave', 'retro', 'vibrant', 'neon'],\n primaryHue: 320,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'crisp',\n },\n {\n id: 'outrun',\n name: 'Outrun',\n description: 'Sunset-orange brand with a violet accent on dark indigo — neon sunset drive.',\n tags: ['retro', 'synthwave', 'vibrant', 'warm', 'neon'],\n primaryHue: 32,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'crisp',\n },\n {\n id: 'material',\n name: 'Material',\n description: 'Indigo brand with a teal accent on neutral greys — the Material Design baseline.',\n tags: ['brand', 'material', 'neutral', 'classic'],\n primaryHue: 255,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'material-ocean',\n name: 'Material Ocean',\n description: 'Bright blue brand on deep ocean-navy — the Material Theme Ocean variant.',\n tags: ['editor', 'material', 'cool', 'calm'],\n primaryHue: 225,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'palenight',\n name: 'Palenight',\n description: 'Soft violet brand on dim blue-grey — the mellow Material Palenight.',\n tags: ['editor', 'material', 'cool', 'muted', 'soft'],\n primaryHue: 270,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'oceanic-next',\n name: 'Oceanic Next',\n description: 'Teal-blue brand on slate navy — the Oceanic Next editor palette.',\n tags: ['editor', 'oceanic', 'cool', 'calm'],\n primaryHue: 200,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'horizon',\n name: 'Horizon',\n description: 'Coral-rose brand with a cyan accent on warm plum-charcoal — the warm Horizon palette.',\n tags: ['editor', 'horizon', 'warm', 'vibrant'],\n primaryHue: 5,\n neutralTemp: 'warm',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'github-dark',\n name: 'GitHub Dark',\n description: 'GitHub-blue brand on cool slate — the dark GitHub interface palette.',\n tags: ['brand', 'github', 'cool', 'professional'],\n primaryHue: 235,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'github-light',\n name: 'GitHub Light',\n description: 'GitHub-blue brand on crisp neutral white — the light GitHub interface.',\n tags: ['brand', 'github', 'neutral', 'professional', 'light'],\n primaryHue: 235,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'github-dimmed',\n name: 'GitHub Dimmed',\n description: 'GitHub-blue brand on softened slate — the low-glare GitHub Dimmed mode.',\n tags: ['brand', 'github', 'cool', 'muted'],\n primaryHue: 233,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'soft',\n },\n {\n id: 'cobalt2',\n name: 'Cobalt2',\n description: 'Electric cobalt brand with an amber accent on deep navy — Wes Bos’ Cobalt2.',\n tags: ['editor', 'cobalt', 'cool', 'vibrant'],\n primaryHue: 228,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'panda',\n name: 'Panda',\n description: 'Pink-magenta brand with a cyan accent on near-black grey — the friendly Panda Syntax.',\n tags: ['editor', 'panda', 'vibrant', 'neutral'],\n primaryHue: 335,\n neutralTemp: 'neutral',\n accentMode: 'triadic',\n surface: 'crisp',\n },\n {\n id: 'monokai-pro',\n name: 'Monokai Pro',\n description: 'Warm yellow-amber brand with a magenta accent on warm charcoal — Monokai Pro.',\n tags: ['editor', 'monokai', 'warm', 'vibrant'],\n primaryHue: 70,\n neutralTemp: 'warm',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'solarized-dark',\n name: 'Solarized Dark',\n description: 'Cyan-blue brand on the deep teal-grey Solarized base — the dark Solarized.',\n tags: ['editor', 'solarized', 'cool', 'muted'],\n primaryHue: 205,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'soft',\n },\n {\n id: 'gruvbox-light',\n name: 'Gruvbox Light',\n description: 'Warm orange brand on retro cream — the light Gruvbox.',\n tags: ['editor', 'gruvbox', 'warm', 'retro', 'light'],\n primaryHue: 45,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'gruvbox-material',\n name: 'Gruvbox Material',\n description: 'Softened amber brand on muted warm grey — the gentler Gruvbox Material.',\n tags: ['editor', 'gruvbox', 'warm', 'retro', 'muted'],\n primaryHue: 52,\n neutralTemp: 'warm',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'nord-light',\n name: 'Nord Light',\n description: 'Frost-blue brand on bright arctic snow — the light counterpart to Nord.',\n tags: ['editor', 'nord', 'cool', 'muted', 'light'],\n primaryHue: 213,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'aurora',\n name: 'Aurora',\n description: 'Frost-green brand with a violet accent on cool slate — Nord’s Aurora highlights.',\n tags: ['editor', 'nord', 'cool', 'nature'],\n primaryHue: 150,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'dracula-pro',\n name: 'Dracula Pro',\n description: 'Refined purple brand with a pink accent on warm-tinted charcoal — Dracula Pro.',\n tags: ['editor', 'dracula', 'vibrant', 'cool'],\n primaryHue: 268,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'shades-of-purple',\n name: 'Shades of Purple',\n description: 'Royal violet brand with a gold accent on deep indigo — the bold SoP palette.',\n tags: ['editor', 'purple', 'vibrant', 'cool'],\n primaryHue: 275,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'winter-is-coming',\n name: 'Winter is Coming',\n description: 'Cool blue brand on icy slate — the crisp Winter-is-Coming editor theme.',\n tags: ['editor', 'cool', 'calm', 'muted'],\n primaryHue: 218,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'cyberpunk',\n name: 'Cyberpunk',\n description: 'Electric cyan brand with a hot-pink accent on black — high-voltage neon.',\n tags: ['retro', 'neon', 'vibrant', 'cool'],\n primaryHue: 192,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'crisp',\n },\n {\n id: 'spacegray',\n name: 'Spacegray',\n description: 'Muted blue brand on understated cool grey — the calm Spacegray UI.',\n tags: ['editor', 'cool', 'muted', 'minimal'],\n primaryHue: 210,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'github-copilot',\n name: 'Copilot',\n description: 'Teal-cyan brand on neutral slate — a calm assistant-inspired palette.',\n tags: ['brand', 'cool', 'fresh', 'professional'],\n primaryHue: 185,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'vercel',\n name: 'Vercel',\n description: 'Pure achromatic brand on stark neutral greys — the high-contrast Vercel look.',\n tags: ['brand', 'neutral', 'minimal', 'grayscale'],\n primaryHue: 0,\n neutralTemp: 'neutral',\n accentMode: 'mono',\n surface: 'crisp',\n },\n {\n id: 'stripe',\n name: 'Stripe',\n description: 'Indigo-violet brand with an analogous accent on cool neutrals — the Stripe brand feel.',\n tags: ['brand', 'cool', 'professional', 'vibrant'],\n primaryHue: 258,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'spotify',\n name: 'Spotify',\n description: 'Vivid green brand on near-black neutral — the energetic streaming-app palette.',\n tags: ['brand', 'nature', 'vibrant', 'neutral'],\n primaryHue: 145,\n neutralTemp: 'neutral',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'firewatch',\n name: 'Firewatch',\n description: 'Sunset-orange brand with a teal accent on dusky blue — inspired by the game’s vistas.',\n tags: ['nature', 'warm', 'vibrant', 'cool'],\n primaryHue: 28,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'soft',\n },\n {\n id: 'andromeda',\n name: 'Andromeda',\n description: 'Magenta-pink brand with a green accent on deep space-blue — the vivid Andromeda palette.',\n tags: ['editor', 'vibrant', 'cool', 'neon'],\n primaryHue: 330,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'bluloco-light',\n name: 'Bluloco Light',\n description: 'Saturated blue brand on crisp paper — the punchy Bluloco Light.',\n tags: ['editor', 'cool', 'vibrant', 'light'],\n primaryHue: 230,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'noctis',\n name: 'Noctis',\n description: 'Teal brand on deep blue-green ink — the legible Noctis editor palette.',\n tags: ['editor', 'cool', 'fresh', 'muted'],\n primaryHue: 180,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'min-dark',\n name: 'Min Dark',\n description: 'Restrained cyan brand on pure dark neutral — the minimal Miniml/Min theme.',\n tags: ['editor', 'minimal', 'cool', 'neutral'],\n primaryHue: 190,\n neutralTemp: 'neutral',\n accentMode: 'mono',\n surface: 'crisp',\n },\n {\n id: 'poimandres',\n name: 'Poimandres',\n description: 'Teal-cyan brand on deep blue-grey — the muted, modern Poimandres palette.',\n tags: ['editor', 'cool', 'muted', 'calm'],\n primaryHue: 188,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'flexoki',\n name: 'Flexoki',\n description: 'Warm red-brown brand on inky warm paper — the analog Flexoki palette.',\n tags: ['editor', 'warm', 'muted', 'paper'],\n primaryHue: 25,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'zenburn',\n name: 'Zenburn',\n description: 'Muted olive-tan brand on low-contrast warm grey — the classic low-glare Zenburn.',\n tags: ['editor', 'warm', 'muted', 'low-contrast'],\n primaryHue: 95,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'oxocarbon',\n name: 'Oxocarbon',\n description: 'Magenta-violet brand with a cyan accent on pure carbon grey — IBM-inspired Oxocarbon.',\n tags: ['editor', 'vibrant', 'neutral', 'cool'],\n primaryHue: 300,\n neutralTemp: 'neutral',\n accentMode: 'triadic',\n surface: 'crisp',\n },\n {\n id: 'iceberg',\n name: 'Iceberg',\n description: 'Cool periwinkle-blue brand on icy blue-grey — the restrained Iceberg palette.',\n tags: ['editor', 'cool', 'muted', 'calm'],\n primaryHue: 245,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'apprentice',\n name: 'Apprentice',\n description: 'Muted khaki-green brand on warm dark grey — the low-key Apprentice terminal palette.',\n tags: ['editor', 'warm', 'muted', 'low-contrast'],\n primaryHue: 100,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'tomorrow-night',\n name: 'Tomorrow Night',\n description: 'Calm blue brand on neutral charcoal — the balanced Tomorrow Night classic.',\n tags: ['editor', 'cool', 'calm', 'neutral'],\n primaryHue: 222,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'embark',\n name: 'Embark',\n description: 'Violet brand with a teal accent on deep blue-purple — the vivid Embark palette.',\n tags: ['editor', 'vibrant', 'cool'],\n primaryHue: 278,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'moonlight',\n name: 'Moonlight',\n description: 'Periwinkle-violet brand on deep blue night — the dreamy Moonlight II palette.',\n tags: ['editor', 'cool', 'calm', 'soft'],\n primaryHue: 262,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'bearded',\n name: 'Bearded',\n description: 'Magenta brand with a green accent on cool charcoal — a bold Bearded-style palette.',\n tags: ['editor', 'vibrant', 'cool'],\n primaryHue: 315,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'city-lights',\n name: 'City Lights',\n description: 'Steel-blue brand on deep blue-grey — the muted, urban City Lights palette.',\n tags: ['editor', 'cool', 'muted', 'calm'],\n primaryHue: 205,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'snazzy',\n name: 'Snazzy',\n description: 'Bright cyan brand with a magenta accent on near-black — the punchy Hyper Snazzy.',\n tags: ['terminal', 'vibrant', 'cool', 'neon'],\n primaryHue: 188,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'crisp',\n },\n {\n id: 'tomorrow-light',\n name: 'Tomorrow',\n description: 'Soft blue brand on clean neutral paper — the original light Tomorrow.',\n tags: ['editor', 'neutral', 'calm', 'light'],\n primaryHue: 222,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'paper-color',\n name: 'PaperColor',\n description: 'Crisp blue brand on bright paper-white — the print-like PaperColor light theme.',\n tags: ['editor', 'neutral', 'paper', 'light'],\n primaryHue: 228,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'quietlight',\n name: 'Quiet Light',\n description: 'Olive-green brand on warm cream — the soft, low-contrast Quiet Light.',\n tags: ['editor', 'warm', 'soft', 'light'],\n primaryHue: 110,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n];\n\n/* ===========================================================================\n * 2. SPECTRUM — systematic hue sweep filling the wheel.\n *\n * For a set of evenly-spaced hues (~every 24°), emit a few seeds varying the\n * accent mode / neutral temp / surface so the catalog covers the full circle\n * with diverse moods. Ids are `spectrum-{hue}-{accentInitial}{tempInitial}`,\n * e.g. `spectrum-204-ac` (hue 204, analogous, cool). Names are the hue's color\n * family + a descriptor so they read like real presets, not coordinates.\n * ========================================================================= */\n\n/** A point on the wheel: hue + a human color-family label. */\ninterface HueStop {\n hue: number;\n /** Color-family word used to name the spectrum presets at this hue. */\n family: string;\n /** Mood/lightness word that pairs with the family for the display name. */\n word: string;\n}\n\n/** Evenly-spaced stops around the wheel (~24° apart), each with a real name. */\nconst HUE_STOPS: HueStop[] = [\n { hue: 0, family: 'Scarlet', word: 'Ember' },\n { hue: 24, family: 'Coral', word: 'Flare' },\n { hue: 48, family: 'Marigold', word: 'Glow' },\n { hue: 72, family: 'Citron', word: 'Zest' },\n { hue: 96, family: 'Chartreuse', word: 'Sprout' },\n { hue: 120, family: 'Clover', word: 'Meadow' },\n { hue: 144, family: 'Jade', word: 'Grove' },\n { hue: 168, family: 'Spruce', word: 'Tide' },\n { hue: 192, family: 'Lagoon', word: 'Reef' },\n { hue: 216, family: 'Cerulean', word: 'Drift' },\n { hue: 240, family: 'Sapphire', word: 'Dusk' },\n { hue: 264, family: 'Iris', word: 'Nocturne' },\n { hue: 288, family: 'Orchid', word: 'Bloom' },\n { hue: 312, family: 'Fuchsia', word: 'Pulse' },\n { hue: 336, family: 'Magenta', word: 'Blush' },\n];\n\n/** Accent-mode → id initial + descriptive word for the description. */\nconst ACCENT_VARIANTS: { mode: ThemeSeed['accentMode']; init: string; word: string }[] = [\n { mode: 'complementary', init: 'x', word: 'complementary' },\n { mode: 'analogous', init: 'a', word: 'analogous' },\n { mode: 'triadic', init: 't', word: 'triadic' },\n];\n\n/** Neutral-temp → id initial + descriptive word. */\nconst TEMP_VARIANTS: { temp: ThemeSeed['neutralTemp']; init: string }[] = [\n { temp: 'cool', init: 'c' },\n { temp: 'warm', init: 'w' },\n];\n\n/**\n * Build the spectrum sweep: for each hue stop, cross (3 accent modes × 2 temps),\n * alternating surface so the pool isn't monotonous. 15 hues × 6 = 90 seeds.\n */\nfunction buildSpectrumSeeds(): ThemeSeed[] {\n const seeds: ThemeSeed[] = [];\n for (const stop of HUE_STOPS) {\n let i = 0;\n for (const accent of ACCENT_VARIANTS) {\n for (const temp of TEMP_VARIANTS) {\n // Alternate surface across the 6 variants for visual variety.\n const surface: ThemeSeed['surface'] = i % 2 === 0 ? 'crisp' : 'soft';\n const tempWord = temp.temp === 'cool' ? 'cool' : 'warm';\n seeds.push({\n id: `spectrum-${stop.hue}-${accent.init}${temp.init}`,\n name: `${stop.family} ${stop.word}`,\n description: `${stop.family} brand at hue ${stop.hue}° — ${accent.word} accent on ${tempWord} neutrals (${surface} surfaces).`,\n tags: ['spectrum', 'sweep', stop.family.toLowerCase(), tempWord, accent.word],\n primaryHue: stop.hue,\n neutralTemp: temp.temp,\n accentMode: accent.mode,\n surface,\n });\n i++;\n }\n }\n }\n return seeds;\n}\n\nconst SPECTRUM_SEEDS: ThemeSeed[] = buildSpectrumSeeds();\n\n/* ===========================================================================\n * Exported pool — named cohort first, then the spectrum sweep.\n * `registry.ts` appends this after the curated 24, all expanded via\n * `generateTheme` (→ `status: \"candidate\"`).\n * ========================================================================= */\n\n/** The full candidate pool seeds (named editor/brand palettes + hue sweep). */\nexport const POOL_SEEDS: ThemeSeed[] = [...NAMED_SEEDS, ...SPECTRUM_SEEDS];\n","/* ---------------------------------------------------------------------------\n * Curated theme registry.\n *\n * ~24 named presets. Every one is authored as a `ThemeSeed` and expanded through\n * `generateTheme`, so the whole catalog is contrast-validated the same way an\n * app's bespoke theme would be. Names nod to well-known palettes but the colors\n * are generated (not literal clones) — the seed captures the *vibe* (hue family,\n * neutral temperature, accent scheme, surface character).\n *\n * `THEMES` is the resolved array; `getTheme(id)` looks one up.\n * ------------------------------------------------------------------------- */\n\nimport type { Theme, ThemeSeed } from './Theme';\nimport { ThemeStatus } from './Theme';\nimport { generateTheme } from './generate';\nimport { VALIDATED_THEMES } from './validated';\nimport { POOL_SEEDS } from './pool';\n\n/** The authoring seeds. Order here = order in `THEMES` and the emitted stylesheet. */\nexport const THEME_SEEDS: ThemeSeed[] = [\n {\n id: 'wow',\n name: 'WoW',\n description: 'House blue — the @wow-two-beta/ui default vibe, regenerated in OKLCH.',\n tags: ['brand', 'default'],\n primaryHue: 264,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'midnight',\n name: 'Midnight',\n description: 'Deep indigo on cool slate — calm, focused, low-glare.',\n tags: ['cool', 'calm'],\n primaryHue: 268,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'slate',\n name: 'Slate',\n description: 'Neutral steel-blue brand on balanced greys — quiet and professional.',\n tags: ['neutral', 'professional'],\n primaryHue: 235,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'ocean',\n name: 'Ocean',\n description: 'Azure brand with a teal accent over cool neutrals.',\n tags: ['cool', 'fresh'],\n primaryHue: 222,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'forest',\n name: 'Forest',\n description: 'Pine green brand, warm-leaning neutrals, earthy accent.',\n tags: ['nature', 'warm'],\n primaryHue: 150,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'emerald',\n name: 'Emerald',\n description: 'Vivid green-teal brand on crisp cool greys.',\n tags: ['nature', 'cool'],\n primaryHue: 165,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'sunset',\n name: 'Sunset',\n description: 'Warm orange brand with a violet accent — energetic dusk palette.',\n tags: ['warm', 'vibrant'],\n primaryHue: 42,\n neutralTemp: 'warm',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'amber',\n name: 'Amber',\n description: 'Golden brand on warm stone — cozy and grounded.',\n tags: ['warm', 'cozy'],\n primaryHue: 75,\n neutralTemp: 'warm',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'rose',\n name: 'Rose',\n description: 'Soft crimson-pink brand with a warm neutral ground.',\n tags: ['warm', 'soft'],\n primaryHue: 12,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'crimson',\n name: 'Crimson',\n description: 'Bold red brand on neutral greys — high-impact and direct.',\n tags: ['warm', 'bold'],\n primaryHue: 25,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'plum',\n name: 'Plum',\n description: 'Rich magenta-purple brand with a green accent.',\n tags: ['vibrant', 'cool'],\n primaryHue: 330,\n neutralTemp: 'cool',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'grape',\n name: 'Grape',\n description: 'Royal violet brand over cool neutrals, analogous accent.',\n tags: ['cool', 'vibrant'],\n primaryHue: 295,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'lavender',\n name: 'Lavender',\n description: 'Gentle violet brand, soft surfaces, low-glare.',\n tags: ['cool', 'soft'],\n primaryHue: 285,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'soft',\n },\n {\n id: 'teal',\n name: 'Teal',\n description: 'Balanced teal brand with a coral accent on neutral greys.',\n tags: ['cool', 'fresh'],\n primaryHue: 195,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'cyan',\n name: 'Cyan',\n description: 'Bright cyan brand, cool neutrals, electric feel.',\n tags: ['cool', 'vibrant'],\n primaryHue: 210,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'crisp',\n },\n {\n id: 'mint',\n name: 'Mint',\n description: 'Light spring-green brand on soft cool greys.',\n tags: ['nature', 'soft'],\n primaryHue: 158,\n neutralTemp: 'neutral',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'nord',\n name: 'Nord',\n description: 'Arctic blue brand on desaturated cool slate — Nord-inspired.',\n tags: ['cool', 'calm', 'muted'],\n primaryHue: 213,\n neutralTemp: 'cool',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'solarized',\n name: 'Solarized',\n description: 'Cyan-blue brand on warm tan neutrals — Solarized-inspired balance.',\n tags: ['warm', 'muted'],\n primaryHue: 205,\n neutralTemp: 'warm',\n accentMode: 'complementary',\n surface: 'soft',\n },\n {\n id: 'dracula',\n name: 'Dracula',\n description: 'Purple brand with a pink-magenta accent on cool neutrals — Dracula-inspired.',\n tags: ['cool', 'vibrant'],\n primaryHue: 265,\n neutralTemp: 'cool',\n accentMode: 'triadic',\n surface: 'crisp',\n },\n {\n id: 'gruvbox',\n name: 'Gruvbox',\n description: 'Warm orange-amber brand on retro warm neutrals — Gruvbox-inspired.',\n tags: ['warm', 'retro', 'muted'],\n primaryHue: 50,\n neutralTemp: 'warm',\n accentMode: 'analogous',\n surface: 'soft',\n },\n {\n id: 'monokai',\n name: 'Monokai',\n description: 'Lime-green brand with a magenta accent on neutral greys — Monokai-inspired.',\n tags: ['vibrant', 'neutral'],\n primaryHue: 130,\n neutralTemp: 'neutral',\n accentMode: 'complementary',\n surface: 'crisp',\n },\n {\n id: 'mono',\n name: 'Mono',\n description: 'Achromatic — black/white brand on pure neutral greys. Minimal, content-first.',\n tags: ['neutral', 'minimal', 'grayscale'],\n primaryHue: 270,\n neutralTemp: 'neutral',\n accentMode: 'mono',\n surface: 'crisp',\n },\n {\n id: 'graphite',\n name: 'Graphite',\n description: 'Near-mono with a faint cool-blue brand — understated and dense.',\n tags: ['neutral', 'minimal'],\n primaryHue: 240,\n neutralTemp: 'cool',\n accentMode: 'mono',\n surface: 'crisp',\n },\n {\n id: 'sand',\n name: 'Sand',\n description: 'Warm taupe brand on soft sandy neutrals — paper-like and gentle.',\n tags: ['warm', 'soft', 'minimal'],\n primaryHue: 60,\n neutralTemp: 'warm',\n accentMode: 'mono',\n surface: 'soft',\n },\n];\n\n/**\n * Every candidate seed, in emit order: the curated 24 first, then the larger\n * diverse pool (named editor/brand palettes + the full-wheel hue sweep) from\n * `pool.ts`. Kept as a single list so `THEME_IDS`/`THEME_SEEDS` consumers and\n * the studio see the whole candidate catalog.\n */\nconst CANDIDATE_SEEDS: ThemeSeed[] = [...THEME_SEEDS, ...POOL_SEEDS];\n\n/**\n * The generator-built presets. AA-proven by the engine but not yet validated\n * against a real app surface → `generateTheme` stamps them `status: \"candidate\"`.\n */\nconst CANDIDATE_THEMES: Theme[] = CANDIDATE_SEEDS.map(generateTheme);\n\n/**\n * The full registry: validated (real-app-proven) themes FIRST, then the curated\n * candidate presets. Order here = order in the emitted stylesheet / manifest.\n */\nexport const THEMES: Theme[] = [...VALIDATED_THEMES, ...CANDIDATE_THEMES];\n\n/** Look up a theme by id. Returns `undefined` when absent. */\nexport function getTheme(id: string): Theme | undefined {\n return THEMES.find((t) => t.id === id);\n}\n\n/** Themes proven against a real app surface (`status === \"validated\"`). */\nexport function validatedThemes(): Theme[] {\n return THEMES.filter((t) => t.status === ThemeStatus.Validated);\n}\n\n/** Engine-proven curated presets not yet app-validated (`status === \"candidate\"`). */\nexport function candidateThemes(): Theme[] {\n return THEMES.filter((t) => t.status === ThemeStatus.Candidate);\n}\n\n/** Ids of all curated themes, in registry order. */\nexport const THEME_IDS: string[] = THEMES.map((t) => t.id);\n"]}
|
package/dist/forms/index.js
CHANGED
|
@@ -4,8 +4,8 @@ import '../chunk-GTBNVI77.js';
|
|
|
4
4
|
import '../chunk-ZC4H4PIN.js';
|
|
5
5
|
import '../chunk-MZZKA3ZS.js';
|
|
6
6
|
import '../chunk-NOOKDXIZ.js';
|
|
7
|
-
import '../chunk-3SWPYYRQ.js';
|
|
8
7
|
import '../chunk-NW7ULTYL.js';
|
|
8
|
+
import '../chunk-3SWPYYRQ.js';
|
|
9
9
|
import '../chunk-V267IMBH.js';
|
|
10
10
|
import '../chunk-MVMDDGW7.js';
|
|
11
11
|
import '../chunk-DX7FYAKY.js';
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * as utils from './utils';
|
|
|
2
2
|
export * as hooks from './hooks';
|
|
3
3
|
export * as icons from './icons';
|
|
4
4
|
export * as primitives from './primitives';
|
|
5
|
+
export * as themes from './themes';
|
|
5
6
|
export * from './actions';
|
|
6
7
|
export * from './display';
|
|
7
8
|
export * from './feedback';
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
+
export { Alert, AlertSimple, Banner, BannerSimple, Callout, InlineSpinner, LiveCursor, LoadingOverlay, LoadingState, MeterBar, NotificationCenter, NotificationItem, OnboardingChecklist, OnboardingChecklistTask, PresenceIndicator, ProgressBar, ProgressCircle, ProgressSteps, Skeleton, StatusIndicator, Toast, ToastSimple, Toaster, Tour, TrendIndicator, TypingIndicator, UndoBar, alertSimpleVariants, bannerSimpleVariants, progressFillVariants, progressTrackVariants, skeletonVariants, toastSimpleVariants, toaster, useOnboardingChecklist, useToaster } from './chunk-NEH4ITXL.js';
|
|
1
2
|
export { ADDRESS_COUNTRIES, AddressForm, BUILT_IN_EMOJI, BUILT_IN_FONTS, Calendar, CharacterCount, ChatComposer, Checkbox, CheckboxField, CheckboxGroup, ChoiceCard, CodeEditor, ColorArea, ColorField, ColorPicker, ColorSlider, ColorSwatch, ColorSwatchPicker, ColorWheel, Combobox, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxSeparator, CronInput, CurrencyInput, DateField, DatePicker, DateRangePicker, Editable, EditableCancel, EditableInput, EditablePreview, EditableSubmit, EmailInput, EmojiPicker, Fieldset, FilePicker, FileUpload, FontPicker, FormErrorMessage, FormField, FormHelperText, GradientPicker, IconPicker, InputAddon, InputGroup, JSONEditor, KeyboardShortcutPicker, Knob, Label, LabeledInput, Legend, Listbox, ListboxEmpty, ListboxGroup, ListboxItem, ListboxSeparator, MarkdownEditor, MaskedInput, MultiSelect, MultiSelectContent, MultiSelectItem, MultiSelectTags, MultiSelectTrigger, NumberInput, PHONE_COUNTRIES, PasswordInput, PasswordStrength, PercentInput, PhoneInput, PinInput, Radio, RadioField, RadioGroup, RangeCalendar, ReactionPicker, RecurrenceEditor, SearchInput, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Slider, Stepper, StepperList, StepperPanel, StepperStep, Switch, SwitchField, TagsInput, TelInput, TextInput, Textarea, TimeField, TimePicker, UrlInput, Wizard, WizardFooter, WizardStep, WizardSteps, colorSwatchVariants, gradientToCss, useWizard } from './chunk-5YT7XRTW.js';
|
|
2
|
-
export { AppShell, AppShellAside, AppShellContent, AppShellFooter, AppShellHeader, AppShellMain, AppShellSidebar, AspectRatio, Box, Center, Cluster, Container, Divider, Flex, Frame, Grid, HStack, Navbar, Overlay, PullToRefresh, ResizablePanel, ResizablePanels, ResizableSeparator, ScrollArea, Section, Spacer, Stack, Surface, TwoColumn, VStack, containerVariants, dividerVariants, gridVariants, navbarVariants, resolveGridColumns, resolveGridGap, sectionVariants, stackVariants, useAppShell } from './chunk-
|
|
3
|
+
export { AppShell, AppShellAside, AppShellContent, AppShellFooter, AppShellHeader, AppShellMain, AppShellSidebar, AspectRatio, Box, Center, Cluster, Container, Divider, Flex, Frame, Grid, HStack, Navbar, Overlay, PullToRefresh, ResizablePanel, ResizablePanels, ResizableSeparator, ScrollArea, Section, Spacer, Stack, Surface, TwoColumn, VStack, containerVariants, dividerVariants, gridVariants, navbarVariants, resolveGridColumns, resolveGridGap, sectionVariants, stackVariants, useAppShell } from './chunk-3BNEDKMS.js';
|
|
4
|
+
export { Spinner, spinnerVariants } from './chunk-7ZDLUNAY.js';
|
|
3
5
|
export { Breadcrumb, CommandPalette, CommandPaletteContent, CommandPaletteEmpty, CommandPaletteGroup, CommandPaletteInput, CommandPaletteItem, CommandPaletteList, CommandPaletteSeparator, ContextMenu, ContextMenuContent, ContextMenuTrigger, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, Menu, MenuGroup, MenuItem, MenuLabel, MenuSeparator, Menubar, MenubarContent, MenubarMenu, MenubarTrigger, NavItem, NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, Pagination, ScrollSpy, TableOfContents, menuItemVariants, menuLabelVariants, menuSeparatorVariants, menuVariants, useScrollSpy } from './chunk-H3WC7KRX.js';
|
|
4
6
|
import './chunk-FMTBJJP6.js';
|
|
5
7
|
export { ActionSheet, ActionSheetAction, ActionSheetCancel, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, BottomSheet, BottomSheetDescription, BottomSheetTitle, HoverCard, HoverCardArrow, HoverCardContent, HoverCardTrigger, Popover, PopoverArrow, PopoverContent, PopoverTrigger, useBottomSheet } from './chunk-GTBNVI77.js';
|
|
6
8
|
export { Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger } from './chunk-ZC4H4PIN.js';
|
|
7
9
|
export { Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from './chunk-MZZKA3ZS.js';
|
|
8
10
|
import './chunk-NOOKDXIZ.js';
|
|
11
|
+
export { Backdrop } from './chunk-NW7ULTYL.js';
|
|
12
|
+
export { themes_exports as themes } from './chunk-LS4EGKUK.js';
|
|
9
13
|
export { BackToTopButton, Button, ButtonGroup, CopyButton, DisclosureButton, FAB, Link, SegmentedControl, SpeedDial, SpeedDialAction, SpeedDialTrigger, ToggleButton, ToggleButtonGroup, Toolbar, ToolbarButton, ToolbarLink, ToolbarSeparator, buttonVariants, fabVariants, linkVariants, toggleButtonVariants } from './chunk-O4Y52ERR.js';
|
|
10
14
|
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityFeed, ActivityItem, AnimatedNumber, AnnotationMarker, AudioPlayer, AudioWaveform, Avatar, AvatarGroup, Badge, BadgeOverlay, Card, Carousel, CarouselDot, CarouselDots, CarouselNext, CarouselPrev, CarouselSlide, CarouselSlides, CarouselViewport, ChatBubble, Code, Collapsible, CollapsibleContent, CollapsibleTrigger, Comment, CommentThread, Confetti, CountBadge, CountUp, DataGrid, DataTable, DaySeparator, DescriptionList, DiffViewer, EmptyState, EventCalendar, Eyebrow, FeatureCard, Gantt, GradientText, Heading, HeatmapCalendar, Highlight, Image, InfoRow, KeyboardShortcut, List, ListItem, Mark, Marquee, MessageList, MetaInline, MetricChip, NodeEditor, NotificationDot, PDFViewer, PricingCard, Quote, ReactionBar, ScheduleView, ScrollReveal, SectionHeader, Separator, Snippet, Sortable, Sparkline, Stat, Status, StepCard, SwipeActions, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeaderCell, TableRow, Tabs, TabsList, TabsPanel, TabsTab, Text, ThreadView, Tilt, Timeline, TimelineDescription, TimelineItem, TimelineTitle, Tree, TreeGroup, TreeItem, Typewriter, VideoPlayer, avatarVariants, badgeVariants, codeVariants, headingVariants, textVariants } from './chunk-RDRFXVNX.js';
|
|
11
15
|
export { Kbd, Tag, tagVariants } from './chunk-3SWPYYRQ.js';
|
|
12
16
|
export { Inline } from './chunk-4XWLEKH2.js';
|
|
13
17
|
export { Tooltip } from './chunk-YQGEF43L.js';
|
|
14
|
-
export { Alert, AlertSimple, Banner, BannerSimple, Callout, InlineSpinner, LiveCursor, LoadingOverlay, LoadingState, MeterBar, NotificationCenter, NotificationItem, OnboardingChecklist, OnboardingChecklistTask, PresenceIndicator, ProgressBar, ProgressCircle, ProgressSteps, Skeleton, StatusIndicator, Toast, ToastSimple, Toaster, Tour, TrendIndicator, TypingIndicator, UndoBar, alertSimpleVariants, bannerSimpleVariants, progressFillVariants, progressTrackVariants, skeletonVariants, toastSimpleVariants, toaster, useOnboardingChecklist, useToaster } from './chunk-NEH4ITXL.js';
|
|
15
|
-
export { Spinner, spinnerVariants } from './chunk-7ZDLUNAY.js';
|
|
16
|
-
export { Backdrop } from './chunk-NW7ULTYL.js';
|
|
17
18
|
export { hooks_exports as hooks } from './chunk-V267IMBH.js';
|
|
18
19
|
export { icons_exports as icons } from './chunk-MVMDDGW7.js';
|
|
19
20
|
export { utils_exports as utils } from './chunk-DX7FYAKY.js';
|
package/dist/layout/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { AppShell, AppShellAside, AppShellContent, AppShellFooter, AppShellHeader, AppShellMain, AppShellSidebar, AspectRatio, Box, Center, Cluster, Container, Divider, Flex, Frame, Grid, HStack, Navbar, Overlay, PullToRefresh, ResizablePanel, ResizablePanels, ResizableSeparator, ScrollArea, Section, Spacer, Stack, Surface, TwoColumn, VStack, containerVariants, dividerVariants, gridVariants, navbarVariants, resolveGridColumns, resolveGridGap, sectionVariants, stackVariants, useAppShell } from '../chunk-
|
|
1
|
+
export { AppShell, AppShellAside, AppShellContent, AppShellFooter, AppShellHeader, AppShellMain, AppShellSidebar, AspectRatio, Box, Center, Cluster, Container, Divider, Flex, Frame, Grid, HStack, Navbar, Overlay, PullToRefresh, ResizablePanel, ResizablePanels, ResizableSeparator, ScrollArea, Section, Spacer, Stack, Surface, TwoColumn, VStack, containerVariants, dividerVariants, gridVariants, navbarVariants, resolveGridColumns, resolveGridGap, sectionVariants, stackVariants, useAppShell } from '../chunk-3BNEDKMS.js';
|
|
2
|
+
import '../chunk-7ZDLUNAY.js';
|
|
2
3
|
import '../chunk-ZC4H4PIN.js';
|
|
3
4
|
import '../chunk-NOOKDXIZ.js';
|
|
4
|
-
export { Inline } from '../chunk-4XWLEKH2.js';
|
|
5
|
-
import '../chunk-7ZDLUNAY.js';
|
|
6
5
|
import '../chunk-NW7ULTYL.js';
|
|
6
|
+
export { Inline } from '../chunk-4XWLEKH2.js';
|
|
7
7
|
import '../chunk-V267IMBH.js';
|
|
8
8
|
import '../chunk-DX7FYAKY.js';
|
|
9
9
|
import '../chunk-XLYJF3HC.js';
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Cylindrical OKLab color: L ∈ [0,1], C ≥ 0, H ∈ [0,360). */
|
|
2
|
+
export interface Oklch {
|
|
3
|
+
l: number;
|
|
4
|
+
c: number;
|
|
5
|
+
h: number;
|
|
6
|
+
}
|
|
7
|
+
/** Wrap a hue into [0,360). */
|
|
8
|
+
export declare function normalizeHue(h: number): number;
|
|
9
|
+
/** True when the OKLCH color maps inside the sRGB gamut (no channel clipping). */
|
|
10
|
+
export declare function isInSrgbGamut(color: Oklch): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Reduce chroma (keeping L and H) until the color fits the sRGB gamut.
|
|
13
|
+
* Binary search on chroma — cheap, deterministic, good enough for tokens.
|
|
14
|
+
*/
|
|
15
|
+
export declare function clampChromaToGamut(color: Oklch): Oklch;
|
|
16
|
+
/** Convert OKLCH → `#rrggbb`. Chroma is gamut-clamped first so output is always valid sRGB. */
|
|
17
|
+
export declare function oklchToHex(color: Oklch): string;
|
|
18
|
+
/**
|
|
19
|
+
* Format OKLCH as a CSS `oklch(L% C H)` string.
|
|
20
|
+
* Rounded for compact, stable output (L→0.1%, C→4dp, H→0.1°).
|
|
21
|
+
*/
|
|
22
|
+
export declare function oklchToCss(color: Oklch): string;
|
|
23
|
+
/** WCAG relative luminance for an OKLCH color (via its in-gamut sRGB mapping). */
|
|
24
|
+
export declare function relativeLuminance(color: Oklch): number;
|
|
25
|
+
/** WCAG 2.1 contrast ratio (1–21) between two OKLCH colors. Symmetric. */
|
|
26
|
+
export declare function contrastRatio(a: Oklch, b: Oklch): number;
|
|
27
|
+
/** WCAG 2.1 contrast ratio between two CSS color strings. Supports `oklch(...)` and hex. */
|
|
28
|
+
export declare function contrastRatioCss(a: string, b: string): number;
|
|
29
|
+
/** Parse a token color string (`oklch(L% C H)` or hex) back into OKLCH. Returns null if unparseable. */
|
|
30
|
+
export declare function parseColor(value: string): Oklch | null;
|
|
31
|
+
/** Grouped namespace export (mirrors `ColorExtensions` style elsewhere in the lib). */
|
|
32
|
+
export declare const Oklch: {
|
|
33
|
+
readonly normalizeHue: typeof normalizeHue;
|
|
34
|
+
readonly isInSrgbGamut: typeof isInSrgbGamut;
|
|
35
|
+
readonly clampChromaToGamut: typeof clampChromaToGamut;
|
|
36
|
+
readonly oklchToHex: typeof oklchToHex;
|
|
37
|
+
readonly oklchToCss: typeof oklchToCss;
|
|
38
|
+
readonly parseColor: typeof parseColor;
|
|
39
|
+
readonly relativeLuminance: typeof relativeLuminance;
|
|
40
|
+
readonly contrastRatio: typeof contrastRatio;
|
|
41
|
+
readonly contrastRatioCss: typeof contrastRatioCss;
|
|
42
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { TokenSet } from './Tokens';
|
|
2
|
+
/**
|
|
3
|
+
* Theme lifecycle status.
|
|
4
|
+
*
|
|
5
|
+
* - `validated` — hand-authored from real, visually-verified app tokens; the
|
|
6
|
+
* colors are locked (never auto-nudged), proven in a shipping product.
|
|
7
|
+
* - `candidate` — generated/curated and AA-proven by the engine, but not yet
|
|
8
|
+
* validated against a real app surface.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ThemeStatus: {
|
|
11
|
+
readonly Validated: "validated";
|
|
12
|
+
readonly Candidate: "candidate";
|
|
13
|
+
};
|
|
14
|
+
/** A theme's lifecycle status value (`"validated"` | `"candidate"`). */
|
|
15
|
+
export type ThemeStatus = (typeof ThemeStatus)[keyof typeof ThemeStatus];
|
|
16
|
+
/** Contrast / "is this theme proven" metadata, produced by the validator. */
|
|
17
|
+
export interface ThemeMeta {
|
|
18
|
+
/** True iff every foreground↔surface pair clears its WCAG AA threshold in BOTH modes. */
|
|
19
|
+
contrastAA: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Human-readable pair failures (empty when `contrastAA` is true).
|
|
22
|
+
* Each entry: `"<mode>: <fg> on <bg> = <ratio> (need <threshold>)"`.
|
|
23
|
+
*/
|
|
24
|
+
failures?: string[];
|
|
25
|
+
}
|
|
26
|
+
/** A named, validated theme — the unit the registry stores and the emitter renders. */
|
|
27
|
+
export interface Theme {
|
|
28
|
+
/** Stable kebab-case id; drives the `.theme-{id}` class. */
|
|
29
|
+
id: string;
|
|
30
|
+
/** Display name. */
|
|
31
|
+
name: string;
|
|
32
|
+
/** One-line description. */
|
|
33
|
+
description: string;
|
|
34
|
+
/** Free-form tags for filtering/search (e.g. `["dark","cool","brand"]`). */
|
|
35
|
+
tags: string[];
|
|
36
|
+
/** Light-mode token values. */
|
|
37
|
+
light: TokenSet;
|
|
38
|
+
/** Dark-mode token values. */
|
|
39
|
+
dark: TokenSet;
|
|
40
|
+
/** Border-radius scale knob (maps to the lib's `--radius-*`). Optional. */
|
|
41
|
+
radius?: 'sm' | 'md' | 'lg';
|
|
42
|
+
/** Lifecycle status — `validated` (real-app proven, locked) or `candidate` (engine-proven). */
|
|
43
|
+
status: ThemeStatus;
|
|
44
|
+
/** Validation result — `meta.contrastAA === true` ⇒ the theme is "proven". */
|
|
45
|
+
meta: ThemeMeta;
|
|
46
|
+
}
|
|
47
|
+
/** Neutral surface temperature — biases the grey ramp warm/cool/neutral. */
|
|
48
|
+
export type NeutralTemp = 'cool' | 'neutral' | 'warm';
|
|
49
|
+
/** How the accent hue is derived from the primary hue. */
|
|
50
|
+
export type AccentMode = 'complementary' | 'analogous' | 'triadic' | 'mono';
|
|
51
|
+
/** Surface character — `soft` = gentle low-contrast surfaces, `crisp` = punchier separation. */
|
|
52
|
+
export type SurfaceStyle = 'soft' | 'crisp';
|
|
53
|
+
/**
|
|
54
|
+
* The recipe a theme is generated from. Pure inputs → deterministic `Theme`
|
|
55
|
+
* (no randomness; identical seeds always yield identical themes).
|
|
56
|
+
*/
|
|
57
|
+
export interface ThemeSeed {
|
|
58
|
+
/** Stable kebab-case id for the produced theme. */
|
|
59
|
+
id: string;
|
|
60
|
+
/** Display name. */
|
|
61
|
+
name: string;
|
|
62
|
+
/** One-line description (optional — a sensible default is derived from the seed). */
|
|
63
|
+
description?: string;
|
|
64
|
+
/** Tags to attach (generator also auto-tags temp/mode/scheme). */
|
|
65
|
+
tags?: string[];
|
|
66
|
+
/** Primary brand hue in degrees, 0–360. */
|
|
67
|
+
primaryHue: number;
|
|
68
|
+
/** Neutral ramp temperature. Default `neutral`. */
|
|
69
|
+
neutralTemp?: NeutralTemp;
|
|
70
|
+
/** Accent derivation. Default `complementary`. */
|
|
71
|
+
accentMode?: AccentMode;
|
|
72
|
+
/** Surface character. Default `crisp`. */
|
|
73
|
+
surface?: SurfaceStyle;
|
|
74
|
+
/** Radius knob to carry through. Optional. */
|
|
75
|
+
radius?: 'sm' | 'md' | 'lg';
|
|
76
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** The six tone families that each carry base / -foreground / -soft / -soft-foreground. */
|
|
2
|
+
export declare const TONE_FAMILIES: readonly ["primary", "accent", "destructive", "info", "success", "warning"];
|
|
3
|
+
export type ToneFamilyName = (typeof TONE_FAMILIES)[number];
|
|
4
|
+
/** Surface + chrome tokens (everything that isn't one of the tone families). */
|
|
5
|
+
export declare const SURFACE_TOKENS: readonly ["background", "foreground", "card", "card-foreground", "popover", "popover-foreground", "muted", "muted-foreground", "subtle-foreground", "inverse", "inverse-foreground", "border", "border-strong", "input", "ring"];
|
|
6
|
+
/** The four slot suffixes every tone family expands into. */
|
|
7
|
+
type ToneSlotSuffix = '' | '-foreground' | '-soft' | '-soft-foreground';
|
|
8
|
+
/** A single tone family expanded to its four token keys, e.g. `primary | primary-foreground | …`. */
|
|
9
|
+
type ToneFamilyTokens<F extends string> = F extends string ? `${F}${ToneSlotSuffix}` : never;
|
|
10
|
+
/**
|
|
11
|
+
* Every semantic token key (the part after `--color-`).
|
|
12
|
+
*
|
|
13
|
+
* = surface/chrome tokens ∪ (each tone family × {base,-foreground,-soft,-soft-foreground}).
|
|
14
|
+
* 15 surface + 6×4 tone = 39 keys total.
|
|
15
|
+
*/
|
|
16
|
+
export type SemanticToken = (typeof SURFACE_TOKENS)[number] | ToneFamilyTokens<ToneFamilyName>;
|
|
17
|
+
/** A complete set of color values — one CSS color string per semantic token. */
|
|
18
|
+
export type TokenSet = Record<SemanticToken, string>;
|
|
19
|
+
/** Optional radius scale a theme may carry (maps to `--radius-{md,lg,xl}`). */
|
|
20
|
+
export interface RadiusScale {
|
|
21
|
+
md: string;
|
|
22
|
+
lg: string;
|
|
23
|
+
xl: string;
|
|
24
|
+
}
|
|
25
|
+
/** The four slots of one tone family. */
|
|
26
|
+
export interface ToneSlots {
|
|
27
|
+
base: string;
|
|
28
|
+
foreground: string;
|
|
29
|
+
soft: string;
|
|
30
|
+
softForeground: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The full, ordered list of every semantic token key — derived from the same
|
|
34
|
+
* constants the type is built from, so it can never drift from `SemanticToken`.
|
|
35
|
+
* Used by the validator/emitter to iterate exhaustively.
|
|
36
|
+
*/
|
|
37
|
+
export declare const SEMANTIC_TOKENS: readonly SemanticToken[];
|
|
38
|
+
/** Write a tone family's four slots into a partial token set under the family's keys. */
|
|
39
|
+
export declare function applyToneSlots(target: Partial<TokenSet>, family: ToneFamilyName, slots: ToneSlots): void;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Theme, ThemeStatus } from './Theme';
|
|
2
|
+
/**
|
|
3
|
+
* Emit the CSS for a single theme: a light `.theme-{id}` block + a
|
|
4
|
+
* `.dark.theme-{id}` block. Returns a string (no trailing newline).
|
|
5
|
+
*/
|
|
6
|
+
export declare function themeToCss(theme: Theme): string;
|
|
7
|
+
/** Emit a full stylesheet for many themes, with a generated-file banner. */
|
|
8
|
+
export declare function emitAllThemesCss(themes: Theme[]): string;
|
|
9
|
+
/** Machine-readable manifest entry for one theme (no token payload — index only). */
|
|
10
|
+
export interface ThemeManifestEntry {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
tags: string[];
|
|
15
|
+
/** Lifecycle status — `validated` (real-app proven) or `candidate` (engine-proven). */
|
|
16
|
+
status: ThemeStatus;
|
|
17
|
+
contrastAA: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** Build the `themes.json` manifest payload from the registry. */
|
|
20
|
+
export declare function emitThemesManifest(themes: Theme[]): ThemeManifestEntry[];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { Oklch } from './Oklch';
|
|
2
|
+
export type { Oklch as OklchColor } from './Oklch';
|
|
3
|
+
export { normalizeHue, isInSrgbGamut, clampChromaToGamut, oklchToHex, oklchToCss, parseColor, relativeLuminance, contrastRatio, contrastRatioCss, } from './Oklch';
|
|
4
|
+
export type { SemanticToken, TokenSet, RadiusScale, ToneFamilyName, ToneSlots, } from './Tokens';
|
|
5
|
+
export { SEMANTIC_TOKENS, SURFACE_TOKENS, TONE_FAMILIES, applyToneSlots, } from './Tokens';
|
|
6
|
+
export type { Theme, ThemeMeta, ThemeSeed, NeutralTemp, AccentMode, SurfaceStyle, } from './Theme';
|
|
7
|
+
export { ThemeStatus } from './Theme';
|
|
8
|
+
export { generateTheme } from './generate';
|
|
9
|
+
export { validateTheme, contrastPairs, AA_TEXT, AA_UI } from './validate';
|
|
10
|
+
export { themeToCss, emitAllThemesCss, emitThemesManifest, type ThemeManifestEntry, } from './css';
|
|
11
|
+
export { THEMES, THEME_SEEDS, THEME_IDS, getTheme, validatedThemes, candidateThemes, } from './registry';
|