@theokit/ui 0.13.0 → 0.14.0

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.
Files changed (48) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +5 -5
  3. package/dist/chunk-DMVWZWU5.js +62 -0
  4. package/dist/chunk-DMVWZWU5.js.map +1 -0
  5. package/dist/{chunk-M6JIC5PU.js → chunk-ETMMPUFO.js} +3 -3
  6. package/dist/{chunk-M6JIC5PU.js.map → chunk-ETMMPUFO.js.map} +1 -1
  7. package/dist/{chunk-VT7VSYH5.js → chunk-KE773ODY.js} +4 -4
  8. package/dist/{chunk-VT7VSYH5.js.map → chunk-KE773ODY.js.map} +1 -1
  9. package/dist/{chunk-BYZ6OFH4.js → chunk-KPYORAP6.js} +6 -6
  10. package/dist/chunk-KPYORAP6.js.map +1 -0
  11. package/dist/chunk-UCGROAS4.js +61 -0
  12. package/dist/chunk-UCGROAS4.js.map +1 -0
  13. package/dist/{chunk-LKRNUSKZ.js → chunk-W6KORCLX.js} +4 -4
  14. package/dist/chunk-W6KORCLX.js.map +1 -0
  15. package/dist/components.css +1 -1
  16. package/dist/composites/metric-card/index.js +5 -0
  17. package/dist/composites/metric-card/index.js.map +1 -0
  18. package/dist/composites/stability-bundle-viewer/index.js +1 -1
  19. package/dist/composites/status-indicator/index.js +4 -0
  20. package/dist/composites/status-indicator/index.js.map +1 -0
  21. package/dist/index.d.ts +165 -40
  22. package/dist/index.js +863 -612
  23. package/dist/index.js.map +1 -1
  24. package/dist/{plugin-D5xmXqYb.d.ts → plugin-Atb0VKtr.d.ts} +1 -1
  25. package/dist/preset-v3-legacy.js +1 -1
  26. package/dist/preset-v3-legacy.js.map +1 -1
  27. package/dist/primitives/gateway-status-indicator/index.js +1 -1
  28. package/dist/primitives/run-status-pill/index.js +1 -1
  29. package/dist/primitives/update-banner/index.js +1 -1
  30. package/dist/slide/index.d.ts +2 -2
  31. package/dist/slide/plugins/emoji/index.d.ts +1 -1
  32. package/dist/slide/plugins/math/index.d.ts +1 -1
  33. package/dist/slide/plugins/mermaid/index.d.ts +1 -1
  34. package/dist/slide/plugins/shiki/index.d.ts +1 -1
  35. package/dist/slide-deck/index.d.ts +1 -1
  36. package/dist/tokens-v4.css +77 -41
  37. package/dist/tokens.css +158 -73
  38. package/dist/whiteboard/index.d.ts +2 -2
  39. package/package.json +18 -2
  40. package/registry/index.json +12 -0
  41. package/registry/r/metric-card.json +23 -0
  42. package/registry/r/safe-href.json +1 -1
  43. package/registry/r/status-indicator.json +20 -0
  44. package/registry/r/tailwind-preset.json +1 -1
  45. package/registry/r/theme-provider.json +6 -6
  46. package/registry/r/tokens.json +1 -1
  47. package/dist/chunk-BYZ6OFH4.js.map +0 -1
  48. package/dist/chunk-LKRNUSKZ.js.map +0 -1
@@ -169,4 +169,4 @@ interface PluginComposer {
169
169
  */
170
170
  declare function composePlugins(plugins: SlidePlugin[]): PluginComposer;
171
171
 
172
- export { type MergedSanitizeExtensions as M, type PluginComposer as P, type SlideFrontmatter as S, type SlideInput as a, type SlidePlugin as b, type SlideSanitizeExtension as c, type SlideValidationError as d, type SlideValidationErrorCode as e, composePlugins as f, slideInput as g, slideTheme as h, slideFrontmatter as s };
172
+ export { type MergedSanitizeExtensions as M, type PluginComposer as P, type SlideValidationError as S, type SlidePlugin as a, type SlideFrontmatter as b, type SlideInput as c, type SlideSanitizeExtension as d, type SlideValidationErrorCode as e, composePlugins as f, slideInput as g, slideTheme as h, slideFrontmatter as s };
@@ -1,7 +1,7 @@
1
1
  import animate from 'tailwindcss-animate';
2
2
 
3
3
  // src/styles/tailwind-preset.ts
4
- var hsl = (token) => `hsl(var(${token}) / <alpha-value>)`;
4
+ var hsl = (token) => `oklch(from var(${token}) l c h / <alpha-value>)`;
5
5
  var theoUIPreset = {
6
6
  theme: {
7
7
  container: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles/tailwind-preset.ts","../src/preset-v3-legacy.ts"],"names":[],"mappings":"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","file":"preset-v3-legacy.js","sourcesContent":["/**\n * Theo UI Tailwind preset — Violet Forge identity.\n *\n * Single source of truth for the design system's utility-level tokens:\n * - colors mapped to CSS variables (HSL split via `hsl(var(--x) / <alpha>)`)\n * - Geist-inspired typescale (display / title / body / label / code tiers)\n * - radii, shadows, motion timing & duration, keyframes\n * - tailwindcss-animate plugin\n *\n * Consumed by:\n * - `tailwind.config.ts` (this repo) via `presets: [theoUIPreset]`\n * - registry/r/tailwind-preset.json (shipped to consumers via shadcn CLI)\n *\n * Consumers integrate as:\n *\n * import type { Config } from \"tailwindcss\";\n * import { theoUIPreset } from \"./styles/tailwind-preset\";\n *\n * export default {\n * darkMode: \"class\",\n * content: [\"./src/**\\/*.{ts,tsx}\"],\n * presets: [theoUIPreset],\n * } satisfies Config;\n *\n * Note: `darkMode` and `content` are NOT in the preset — they are consumer\n * decisions. The preset only contains `theme.extend.*` and `plugins`.\n */\n\nimport type { Config } from \"tailwindcss\";\nimport animate from \"tailwindcss-animate\";\n\nconst hsl = (token: string) => `hsl(var(${token}) / <alpha-value>)`;\n\nexport const theoUIPreset: Partial<Config> = {\n theme: {\n container: {\n center: true,\n padding: \"1rem\",\n screens: {\n \"2xl\": \"1280px\",\n },\n },\n extend: {\n colors: {\n background: hsl(\"--background\"),\n foreground: hsl(\"--foreground\"),\n card: {\n DEFAULT: hsl(\"--card\"),\n foreground: hsl(\"--card-foreground\"),\n },\n popover: {\n DEFAULT: hsl(\"--popover\"),\n foreground: hsl(\"--popover-foreground\"),\n },\n primary: {\n DEFAULT: hsl(\"--primary\"),\n deep: hsl(\"--primary-deep\"),\n glow: hsl(\"--primary-glow\"),\n foreground: hsl(\"--primary-foreground\"),\n },\n secondary: {\n DEFAULT: hsl(\"--secondary\"),\n foreground: hsl(\"--secondary-foreground\"),\n },\n accent: {\n DEFAULT: hsl(\"--accent\"),\n deep: hsl(\"--accent-deep\"),\n foreground: hsl(\"--accent-foreground\"),\n },\n muted: {\n DEFAULT: hsl(\"--muted\"),\n foreground: hsl(\"--muted-foreground\"),\n },\n success: {\n DEFAULT: hsl(\"--success\"),\n foreground: hsl(\"--success-foreground\"),\n },\n warning: {\n DEFAULT: hsl(\"--warning\"),\n foreground: hsl(\"--warning-foreground\"),\n },\n destructive: {\n DEFAULT: hsl(\"--destructive\"),\n foreground: hsl(\"--destructive-foreground\"),\n },\n info: {\n DEFAULT: hsl(\"--info\"),\n foreground: hsl(\"--info-foreground\"),\n },\n border: hsl(\"--border\"),\n input: hsl(\"--input\"),\n ring: hsl(\"--ring\"),\n },\n fontFamily: {\n display: \"var(--font-display)\",\n sans: \"var(--font-body)\",\n mono: \"var(--font-mono)\",\n },\n /* Geist-inspired Violet Forge typescale.\n *\n * Three strict weights: 400 (body), 500 (UI), 600 (display/headings).\n * Letter-spacing scales with size — aggressive negative on display.\n * Mirrors the Vercel/Geist vocabulary while keeping Theo's identity.\n */\n fontSize: {\n // Display tier — aggressive compression, content-led headlines\n \"display-2xl\": [\"64px\", { lineHeight: \"1\", letterSpacing: \"-0.0464em\", fontWeight: \"600\" }],\n \"display-xl\": [\"48px\", { lineHeight: \"1.05\", letterSpacing: \"-0.05em\", fontWeight: \"600\" }],\n \"display-lg\": [\"40px\", { lineHeight: \"1.1\", letterSpacing: \"-0.05em\", fontWeight: \"600\" }],\n \"display-md\": [\"32px\", { lineHeight: \"1.2\", letterSpacing: \"-0.04em\", fontWeight: \"600\" }],\n headline: [\"28px\", { lineHeight: \"1.25\", letterSpacing: \"-0.035em\", fontWeight: \"600\" }],\n // Title tier — section / card heads\n \"title-lg\": [\"24px\", { lineHeight: \"1.33\", letterSpacing: \"-0.04em\", fontWeight: \"600\" }],\n \"title-md\": [\"20px\", { lineHeight: \"1.4\", letterSpacing: \"-0.03em\", fontWeight: \"600\" }],\n // Body tier — FAANG-density realignment 2026-05-22: body-md is the\n // industry-standard 14px (shadcn / Vercel Geist / Linear / Stripe /\n // Mantine). The previous 15px was idiosyncratic. body-sm (14px label\n // weight) remains separate via its line-height / weight signature.\n \"body-lg\": [\"18px\", { lineHeight: \"1.56\", letterSpacing: \"-0.01em\", fontWeight: \"400\" }],\n \"body-md\": [\"14px\", { lineHeight: \"1.43\", letterSpacing: \"0\", fontWeight: \"400\" }],\n \"body-sm\": [\"13px\", { lineHeight: \"1.46\", fontWeight: \"400\" }],\n // Label tier — used on buttons, nav, secondary actions\n label: [\"14px\", { lineHeight: \"1.43\", fontWeight: \"500\" }],\n \"label-caps\": [\"12px\", { lineHeight: \"1.33\", letterSpacing: \"0.04em\", fontWeight: \"500\" }],\n // Mono — code surfaces, technical labels\n \"code-md\": [\"14px\", { lineHeight: \"1.5\", fontWeight: \"400\" }],\n \"code-sm\": [\"13px\", { lineHeight: \"1.54\", fontWeight: \"500\" }],\n },\n borderRadius: {\n none: \"var(--radius-none)\",\n sm: \"var(--radius-sm)\",\n md: \"var(--radius-md)\",\n lg: \"var(--radius-lg)\",\n xl: \"var(--radius-xl)\",\n \"2xl\": \"var(--radius-2xl)\",\n full: \"var(--radius-full)\",\n },\n boxShadow: {\n sm: \"var(--shadow-sm)\",\n md: \"var(--shadow-md)\",\n lg: \"var(--shadow-lg)\",\n glow: \"var(--shadow-glow)\",\n \"glow-strong\": \"var(--shadow-glow-strong)\",\n },\n transitionTimingFunction: {\n \"out-soft\": \"var(--ease-out-soft)\",\n snap: \"var(--ease-snap)\",\n },\n transitionDuration: {\n fast: \"var(--duration-fast)\",\n base: \"var(--duration-base)\",\n slow: \"var(--duration-slow)\",\n },\n keyframes: {\n \"fade-in-up\": {\n \"0%\": { opacity: \"0\", transform: \"translateY(8px)\" },\n \"100%\": { opacity: \"1\", transform: \"translateY(0)\" },\n },\n \"pulse-glow\": {\n \"0%, 100%\": { boxShadow: \"0 0 0 0 hsl(var(--primary) / 0.5)\" },\n \"50%\": { boxShadow: \"0 0 0 8px hsl(var(--primary) / 0)\" },\n },\n },\n animation: {\n \"fade-in-up\": \"fade-in-up var(--duration-base) var(--ease-out-soft) both\",\n \"pulse-glow\": \"pulse-glow 1.5s var(--ease-in-out) infinite\",\n },\n },\n },\n plugins: [animate],\n};\n","/**\n * `@theokit/ui/preset-v3-legacy` — Tailwind v3 JS preset (legacy path).\n *\n * Default-export a `Partial<Config>` mirroring the design tokens shipped\n * in `@theokit/ui/tokens.css`. Adds a `content` field covering the\n * library's published artifact tree so v3-based Tailwind builds emit\n * the utilities used by `@theokit/ui` components.\n *\n * **Tailwind v4 consumers MUST use `@theokit/ui/preset.css`**, not this\n * file — Tailwind v4 dropped the JS preset format entirely. This file\n * exists for any remaining `tailwindcss@^3` consumer (notably the\n * shadcn-style copy-paste registry path); new code should not import\n * from this subpath.\n *\n * The token surface is delegated to `./styles/tailwind-preset.ts` (the\n * existing source of truth used by the local Ladle dev surface and the\n * shadcn registry).\n *\n * v3 consumer usage:\n *\n * // tailwind.config.ts (Tailwind v3 only)\n * import preset from \"@theokit/ui/preset-v3-legacy\";\n * export default {\n * presets: [preset],\n * content: [\"./app/**\\/*.{ts,tsx}\"],\n * };\n *\n * See RFC 0008 follow-up.\n */\nimport type { Config } from \"tailwindcss\";\nimport { theoUIPreset } from \"./styles/tailwind-preset.js\";\n\nconst LIBRARY_CONTENT_GLOBS: string[] = [\n // Resolved relative to the consumer's `tailwind.config.{ts,js}`.\n \"./node_modules/@theokit/ui/dist/**/*.{js,mjs,cjs}\",\n // Yarn PnP / pnpm hoist fallback — Tailwind's globbing tolerates both.\n \"./node_modules/@theokit/ui/dist/**/*.{ts,tsx}\",\n];\n\n// `theoUIPreset` is shape-compatible with v3 `Partial<Config>` at runtime\n// (tokens, theme, plugins, darkMode, etc are all carried through), but the\n// pnpm hoist places `tailwindcss@3` types alongside `tailwindcss@4` types in\n// the workspace — `theoUIPreset`'s inferred shape uses the v4 `UserConfig`\n// presets array type, which TS sees as incompatible with v3's `Config.presets`\n// (different element type). This file is the v3 LEGACY entry; its runtime\n// works for v3 consumers regardless. The cast bridges the v3/v4 type seam.\nconst preset = {\n ...theoUIPreset,\n content: LIBRARY_CONTENT_GLOBS,\n} as unknown as Partial<Config>;\n\nexport default preset;\n"]}
1
+ {"version":3,"sources":["../src/styles/tailwind-preset.ts","../src/preset-v3-legacy.ts"],"names":[],"mappings":"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","file":"preset-v3-legacy.js","sourcesContent":["/**\n * Theo UI Tailwind preset — Violet Forge identity.\n *\n * Single source of truth for the design system's utility-level tokens:\n * - colors mapped to CSS variables (HSL split via `hsl(var(--x) / <alpha>)`)\n * - Geist-inspired typescale (display / title / body / label / code tiers)\n * - radii, shadows, motion timing & duration, keyframes\n * - tailwindcss-animate plugin\n *\n * Consumed by:\n * - `tailwind.config.ts` (this repo) via `presets: [theoUIPreset]`\n * - registry/r/tailwind-preset.json (shipped to consumers via shadcn CLI)\n *\n * Consumers integrate as:\n *\n * import type { Config } from \"tailwindcss\";\n * import { theoUIPreset } from \"./styles/tailwind-preset\";\n *\n * export default {\n * darkMode: \"class\",\n * content: [\"./src/**\\/*.{ts,tsx}\"],\n * presets: [theoUIPreset],\n * } satisfies Config;\n *\n * Note: `darkMode` and `content` are NOT in the preset — they are consumer\n * decisions. The preset only contains `theme.extend.*` and `plugins`.\n */\n\nimport type { Config } from \"tailwindcss\";\nimport animate from \"tailwindcss-animate\";\n\n// Post-T2.4 (ADR-0005): tokens are OKLCH. The previous `hsl(var(--x) / <alpha>)`\n// pattern resolves to `hsl(oklch(...))` which is invalid CSS — utilities\n// silently fall back to transparent. OKLCH relative-color syntax preserves\n// Tailwind's `<alpha-value>` slot for opacity modifiers (e.g. `bg-primary/50`).\nconst hsl = (token: string) => `oklch(from var(${token}) l c h / <alpha-value>)`;\n\nexport const theoUIPreset: Partial<Config> = {\n theme: {\n container: {\n center: true,\n padding: \"1rem\",\n screens: {\n \"2xl\": \"1280px\",\n },\n },\n extend: {\n colors: {\n background: hsl(\"--background\"),\n foreground: hsl(\"--foreground\"),\n card: {\n DEFAULT: hsl(\"--card\"),\n foreground: hsl(\"--card-foreground\"),\n },\n popover: {\n DEFAULT: hsl(\"--popover\"),\n foreground: hsl(\"--popover-foreground\"),\n },\n primary: {\n DEFAULT: hsl(\"--primary\"),\n deep: hsl(\"--primary-deep\"),\n glow: hsl(\"--primary-glow\"),\n foreground: hsl(\"--primary-foreground\"),\n },\n secondary: {\n DEFAULT: hsl(\"--secondary\"),\n foreground: hsl(\"--secondary-foreground\"),\n },\n accent: {\n DEFAULT: hsl(\"--accent\"),\n deep: hsl(\"--accent-deep\"),\n foreground: hsl(\"--accent-foreground\"),\n },\n muted: {\n DEFAULT: hsl(\"--muted\"),\n foreground: hsl(\"--muted-foreground\"),\n },\n success: {\n DEFAULT: hsl(\"--success\"),\n foreground: hsl(\"--success-foreground\"),\n },\n warning: {\n DEFAULT: hsl(\"--warning\"),\n foreground: hsl(\"--warning-foreground\"),\n },\n destructive: {\n DEFAULT: hsl(\"--destructive\"),\n foreground: hsl(\"--destructive-foreground\"),\n },\n info: {\n DEFAULT: hsl(\"--info\"),\n foreground: hsl(\"--info-foreground\"),\n },\n border: hsl(\"--border\"),\n input: hsl(\"--input\"),\n ring: hsl(\"--ring\"),\n },\n fontFamily: {\n display: \"var(--font-display)\",\n sans: \"var(--font-body)\",\n mono: \"var(--font-mono)\",\n },\n /* Geist-inspired Violet Forge typescale.\n *\n * Three strict weights: 400 (body), 500 (UI), 600 (display/headings).\n * Letter-spacing scales with size — aggressive negative on display.\n * Mirrors the Vercel/Geist vocabulary while keeping Theo's identity.\n */\n fontSize: {\n // Display tier — aggressive compression, content-led headlines\n \"display-2xl\": [\"64px\", { lineHeight: \"1\", letterSpacing: \"-0.0464em\", fontWeight: \"600\" }],\n \"display-xl\": [\"48px\", { lineHeight: \"1.05\", letterSpacing: \"-0.05em\", fontWeight: \"600\" }],\n \"display-lg\": [\"40px\", { lineHeight: \"1.1\", letterSpacing: \"-0.05em\", fontWeight: \"600\" }],\n \"display-md\": [\"32px\", { lineHeight: \"1.2\", letterSpacing: \"-0.04em\", fontWeight: \"600\" }],\n headline: [\"28px\", { lineHeight: \"1.25\", letterSpacing: \"-0.035em\", fontWeight: \"600\" }],\n // Title tier — section / card heads\n \"title-lg\": [\"24px\", { lineHeight: \"1.33\", letterSpacing: \"-0.04em\", fontWeight: \"600\" }],\n \"title-md\": [\"20px\", { lineHeight: \"1.4\", letterSpacing: \"-0.03em\", fontWeight: \"600\" }],\n // Body tier — FAANG-density realignment 2026-05-22: body-md is the\n // industry-standard 14px (shadcn / Vercel Geist / Linear / Stripe /\n // Mantine). The previous 15px was idiosyncratic. body-sm (14px label\n // weight) remains separate via its line-height / weight signature.\n \"body-lg\": [\"18px\", { lineHeight: \"1.56\", letterSpacing: \"-0.01em\", fontWeight: \"400\" }],\n \"body-md\": [\"14px\", { lineHeight: \"1.43\", letterSpacing: \"0\", fontWeight: \"400\" }],\n \"body-sm\": [\"13px\", { lineHeight: \"1.46\", fontWeight: \"400\" }],\n // Label tier — used on buttons, nav, secondary actions\n label: [\"14px\", { lineHeight: \"1.43\", fontWeight: \"500\" }],\n \"label-caps\": [\"12px\", { lineHeight: \"1.33\", letterSpacing: \"0.04em\", fontWeight: \"500\" }],\n // Mono — code surfaces, technical labels\n \"code-md\": [\"14px\", { lineHeight: \"1.5\", fontWeight: \"400\" }],\n \"code-sm\": [\"13px\", { lineHeight: \"1.54\", fontWeight: \"500\" }],\n },\n borderRadius: {\n none: \"var(--radius-none)\",\n sm: \"var(--radius-sm)\",\n md: \"var(--radius-md)\",\n lg: \"var(--radius-lg)\",\n xl: \"var(--radius-xl)\",\n \"2xl\": \"var(--radius-2xl)\",\n full: \"var(--radius-full)\",\n },\n boxShadow: {\n sm: \"var(--shadow-sm)\",\n md: \"var(--shadow-md)\",\n lg: \"var(--shadow-lg)\",\n glow: \"var(--shadow-glow)\",\n \"glow-strong\": \"var(--shadow-glow-strong)\",\n },\n transitionTimingFunction: {\n \"out-soft\": \"var(--ease-out-soft)\",\n snap: \"var(--ease-snap)\",\n },\n transitionDuration: {\n fast: \"var(--duration-fast)\",\n base: \"var(--duration-base)\",\n slow: \"var(--duration-slow)\",\n },\n keyframes: {\n \"fade-in-up\": {\n \"0%\": { opacity: \"0\", transform: \"translateY(8px)\" },\n \"100%\": { opacity: \"1\", transform: \"translateY(0)\" },\n },\n \"pulse-glow\": {\n \"0%, 100%\": { boxShadow: \"0 0 0 0 hsl(var(--primary) / 0.5)\" },\n \"50%\": { boxShadow: \"0 0 0 8px hsl(var(--primary) / 0)\" },\n },\n },\n animation: {\n \"fade-in-up\": \"fade-in-up var(--duration-base) var(--ease-out-soft) both\",\n \"pulse-glow\": \"pulse-glow 1.5s var(--ease-in-out) infinite\",\n },\n },\n },\n plugins: [animate],\n};\n","/**\n * `@theokit/ui/preset-v3-legacy` — Tailwind v3 JS preset (legacy path).\n *\n * Default-export a `Partial<Config>` mirroring the design tokens shipped\n * in `@theokit/ui/tokens.css`. Adds a `content` field covering the\n * library's published artifact tree so v3-based Tailwind builds emit\n * the utilities used by `@theokit/ui` components.\n *\n * **Tailwind v4 consumers MUST use `@theokit/ui/preset.css`**, not this\n * file — Tailwind v4 dropped the JS preset format entirely. This file\n * exists for any remaining `tailwindcss@^3` consumer (notably the\n * shadcn-style copy-paste registry path); new code should not import\n * from this subpath.\n *\n * The token surface is delegated to `./styles/tailwind-preset.ts` (the\n * existing source of truth used by the local Ladle dev surface and the\n * shadcn registry).\n *\n * v3 consumer usage:\n *\n * // tailwind.config.ts (Tailwind v3 only)\n * import preset from \"@theokit/ui/preset-v3-legacy\";\n * export default {\n * presets: [preset],\n * content: [\"./app/**\\/*.{ts,tsx}\"],\n * };\n *\n * See RFC 0008 follow-up.\n */\nimport type { Config } from \"tailwindcss\";\nimport { theoUIPreset } from \"./styles/tailwind-preset.js\";\n\nconst LIBRARY_CONTENT_GLOBS: string[] = [\n // Resolved relative to the consumer's `tailwind.config.{ts,js}`.\n \"./node_modules/@theokit/ui/dist/**/*.{js,mjs,cjs}\",\n // Yarn PnP / pnpm hoist fallback — Tailwind's globbing tolerates both.\n \"./node_modules/@theokit/ui/dist/**/*.{ts,tsx}\",\n];\n\n// `theoUIPreset` is shape-compatible with v3 `Partial<Config>` at runtime\n// (tokens, theme, plugins, darkMode, etc are all carried through), but the\n// pnpm hoist places `tailwindcss@3` types alongside `tailwindcss@4` types in\n// the workspace — `theoUIPreset`'s inferred shape uses the v4 `UserConfig`\n// presets array type, which TS sees as incompatible with v3's `Config.presets`\n// (different element type). This file is the v3 LEGACY entry; its runtime\n// works for v3 consumers regardless. The cast bridges the v3/v4 type seam.\nconst preset = {\n ...theoUIPreset,\n content: LIBRARY_CONTENT_GLOBS,\n} as unknown as Partial<Config>;\n\nexport default preset;\n"]}
@@ -1,4 +1,4 @@
1
- export { GatewayStatusIndicator } from '../../chunk-BYZ6OFH4.js';
1
+ export { GatewayStatusIndicator } from '../../chunk-KPYORAP6.js';
2
2
  import '../../chunk-EWDN56AS.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { RunStatusPill } from '../../chunk-VT7VSYH5.js';
1
+ export { RunStatusPill } from '../../chunk-KE773ODY.js';
2
2
  import '../../chunk-EWDN56AS.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { UpdateBanner } from '../../chunk-M6JIC5PU.js';
1
+ export { UpdateBanner } from '../../chunk-ETMMPUFO.js';
2
2
  import '../../chunk-EWDN56AS.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  import { FC, ReactElement, RefObject } from 'react';
2
- import { d as SlideValidationError, b as SlidePlugin, S as SlideFrontmatter, M as MergedSanitizeExtensions, a as SlideInput } from '../plugin-D5xmXqYb.js';
3
- export { P as PluginComposer, c as SlideSanitizeExtension, e as SlideValidationErrorCode, f as composePlugins, s as slideFrontmatter, g as slideInput, h as slideTheme } from '../plugin-D5xmXqYb.js';
2
+ import { S as SlideValidationError, a as SlidePlugin, b as SlideFrontmatter, M as MergedSanitizeExtensions, c as SlideInput } from '../plugin-Atb0VKtr.js';
3
+ export { P as PluginComposer, d as SlideSanitizeExtension, e as SlideValidationErrorCode, f as composePlugins, s as slideFrontmatter, g as slideInput, h as slideTheme } from '../plugin-Atb0VKtr.js';
4
4
  import { Root, Element } from 'hast';
5
5
  import { Root as Root$1 } from 'mdast';
6
6
  import * as hast_util_sanitize from 'hast-util-sanitize';
@@ -1,4 +1,4 @@
1
- import { b as SlidePlugin } from '../../../plugin-D5xmXqYb.js';
1
+ import { a as SlidePlugin } from '../../../plugin-Atb0VKtr.js';
2
2
  import 'hast';
3
3
  import 'mdast';
4
4
  import 'react';
@@ -1,4 +1,4 @@
1
- import { b as SlidePlugin } from '../../../plugin-D5xmXqYb.js';
1
+ import { a as SlidePlugin } from '../../../plugin-Atb0VKtr.js';
2
2
  import 'hast';
3
3
  import 'mdast';
4
4
  import 'react';
@@ -1,5 +1,5 @@
1
1
  import { FC } from 'react';
2
- import { b as SlidePlugin } from '../../../plugin-D5xmXqYb.js';
2
+ import { a as SlidePlugin } from '../../../plugin-Atb0VKtr.js';
3
3
  import 'hast';
4
4
  import 'mdast';
5
5
  import 'zod';
@@ -1,4 +1,4 @@
1
- import { b as SlidePlugin } from '../../../plugin-D5xmXqYb.js';
1
+ import { a as SlidePlugin } from '../../../plugin-Atb0VKtr.js';
2
2
  import 'hast';
3
3
  import 'mdast';
4
4
  import 'react';
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { FC, ReactNode, Dispatch, RefObject } from 'react';
3
- import { b as SlidePlugin } from '../plugin-D5xmXqYb.js';
3
+ import { a as SlidePlugin } from '../plugin-Atb0VKtr.js';
4
4
  import { z } from 'zod';
5
5
  import 'hast';
6
6
  import 'mdast';
@@ -14,51 +14,67 @@
14
14
  * `bg-primary`, `text-muted-foreground`, `border-border`, etc. emit
15
15
  * a className with no matching CSS rule.
16
16
  *
17
- * The indirection (`--color-primary: hsl(var(--primary))`) preserves the
17
+ * The indirection (`--color-primary: var(--primary)`) preserves the
18
18
  * runtime theme cascade — browsers resolve `var(--color-primary)` →
19
- * `hsl(var(--primary))` → current `[data-theme]` value at paint time.
19
+ * `var(--primary)` → current `[data-theme]` value at paint time.
20
20
  *
21
21
  * See RFC 0008 follow-up.
22
22
  */
23
23
 
24
- @theme {
24
+ /* `@theme inline` (Tailwind v4 keyword) preserves the var() reference at
25
+ * runtime instead of inlining the value at build time. Without `inline`,
26
+ * `--color-primary: var(--primary)` would resolve to whatever `--primary`
27
+ * was when Tailwind compiled the CSS — breaking the theme cascade.
28
+ * See https://tailwindcss.com/docs/theme#using-your-theme-variables-in-arbitrary-values
29
+ */
30
+ @theme inline {
25
31
  /* Color tokens ------------------------------------------------------ */
26
- --color-background: hsl(var(--background));
27
- --color-foreground: hsl(var(--foreground));
28
-
29
- --color-card: hsl(var(--card));
30
- --color-card-foreground: hsl(var(--card-foreground));
31
-
32
- --color-popover: hsl(var(--popover));
33
- --color-popover-foreground: hsl(var(--popover-foreground));
34
-
35
- --color-primary: hsl(var(--primary));
36
- --color-primary-deep: hsl(var(--primary-deep));
37
- --color-primary-glow: hsl(var(--primary-glow));
38
- --color-primary-foreground: hsl(var(--primary-foreground));
39
-
40
- --color-secondary: hsl(var(--secondary));
41
- --color-secondary-foreground: hsl(var(--secondary-foreground));
42
-
43
- --color-accent: hsl(var(--accent));
44
- --color-accent-deep: hsl(var(--accent-deep));
45
- --color-accent-foreground: hsl(var(--accent-foreground));
46
-
47
- --color-muted: hsl(var(--muted));
48
- --color-muted-foreground: hsl(var(--muted-foreground));
49
-
50
- --color-border: hsl(var(--border));
51
- --color-input: hsl(var(--input));
52
- --color-ring: hsl(var(--ring));
53
-
54
- --color-success: hsl(var(--success));
55
- --color-success-foreground: hsl(var(--success-foreground));
56
- --color-warning: hsl(var(--warning));
57
- --color-warning-foreground: hsl(var(--warning-foreground));
58
- --color-destructive: hsl(var(--destructive));
59
- --color-destructive-foreground: hsl(var(--destructive-foreground));
60
- --color-info: hsl(var(--info));
61
- --color-info-foreground: hsl(var(--info-foreground));
32
+ --color-background: var(--background);
33
+ --color-foreground: var(--foreground);
34
+
35
+ --color-card: var(--card);
36
+ --color-card-foreground: var(--card-foreground);
37
+
38
+ --color-popover: var(--popover);
39
+ --color-popover-foreground: var(--popover-foreground);
40
+
41
+ --color-primary: var(--primary);
42
+ --color-primary-deep: var(--primary-deep);
43
+ --color-primary-glow: var(--primary-glow);
44
+ --color-primary-foreground: var(--primary-foreground);
45
+
46
+ --color-secondary: var(--secondary);
47
+ --color-secondary-foreground: var(--secondary-foreground);
48
+
49
+ --color-accent: var(--accent);
50
+ --color-accent-deep: var(--accent-deep);
51
+ --color-accent-foreground: var(--accent-foreground);
52
+
53
+ --color-muted: var(--muted);
54
+ --color-muted-foreground: var(--muted-foreground);
55
+
56
+ --color-border: var(--border);
57
+ --color-input: var(--input);
58
+ --color-ring: var(--ring);
59
+
60
+ --color-success: var(--success);
61
+ --color-success-foreground: var(--success-foreground);
62
+ --color-warning: var(--warning);
63
+ --color-warning-foreground: var(--warning-foreground);
64
+ --color-destructive: var(--destructive);
65
+ --color-destructive-foreground: var(--destructive-foreground);
66
+ --color-info: var(--info);
67
+ --color-info-foreground: var(--info-foreground);
68
+
69
+ /* Status group (D4) ------------------------------------------------- */
70
+ --color-status-online: var(--status-online);
71
+ --color-status-online-foreground: var(--status-online-foreground);
72
+ --color-status-offline: var(--status-offline);
73
+ --color-status-offline-foreground: var(--status-offline-foreground);
74
+ --color-status-degraded: var(--status-degraded);
75
+ --color-status-degraded-foreground: var(--status-degraded-foreground);
76
+ --color-status-info: var(--status-info);
77
+ --color-status-info-foreground: var(--status-info-foreground);
62
78
 
63
79
  /* Fonts ------------------------------------------------------------- */
64
80
  --font-display: var(--font-display);
@@ -157,6 +173,26 @@
157
173
  --ease-out-soft: var(--ease-out-soft);
158
174
  --ease-snap: var(--ease-snap);
159
175
 
176
+ /* Container queries (T5.5) — Tailwind v4 native @container support.
177
+ * Sizes drive `@<size>:<utility>` variants for container-relative responsive
178
+ * design (components that adapt to their parent's width, not the viewport).
179
+ * Default sizes mirror Tailwind v4 defaults; declared explicitly so the
180
+ * preset ships consistent values.
181
+ */
182
+ --container-3xs: 16rem;
183
+ --container-2xs: 18rem;
184
+ --container-xs: 20rem;
185
+ --container-sm: 24rem;
186
+ --container-md: 28rem;
187
+ --container-lg: 32rem;
188
+ --container-xl: 36rem;
189
+ --container-2xl: 42rem;
190
+ --container-3xl: 48rem;
191
+ --container-4xl: 56rem;
192
+ --container-5xl: 64rem;
193
+ --container-6xl: 72rem;
194
+ --container-7xl: 80rem;
195
+
160
196
  /* Animations — declare so `animate-fade-in-up` and `animate-pulse-glow`
161
197
  * resolve. Keyframes are declared below (outside @theme — Tailwind v4
162
198
  * picks them up via the @keyframes namespace).
@@ -179,9 +215,9 @@
179
215
  @keyframes pulse-glow {
180
216
  0%,
181
217
  100% {
182
- box-shadow: 0 0 0 0 hsl(var(--primary) / 0.5);
218
+ box-shadow: 0 0 0 0 color-mix(in oklch, var(--primary) 50%, transparent);
183
219
  }
184
220
  50% {
185
- box-shadow: 0 0 0 8px hsl(var(--primary) / 0);
221
+ box-shadow: 0 0 0 8px transparent;
186
222
  }
187
223
  }
package/dist/tokens.css CHANGED
@@ -24,48 +24,70 @@
24
24
  * primary (violet) + accent (burnt sienna) tokens below — never from
25
25
  * surface tints.
26
26
  */
27
- --background: 0 0% 100%; /* #FFFFFF */
28
- --foreground: 0 0% 4%; /* #0A0A0A */
27
+ --background: oklch(1 0 0); /* #FFFFFF */
28
+ --foreground: oklch(0.146 0 0); /* #0A0A0A */
29
29
 
30
- --card: 0 0% 100%; /* #FFFFFF */
31
- --card-foreground: 0 0% 4%;
30
+ --card: oklch(1 0 0); /* #FFFFFF */
31
+ --card-foreground: oklch(0.146 0 0);
32
32
 
33
- --popover: 0 0% 100%;
34
- --popover-foreground: 0 0% 4%;
33
+ --popover: oklch(1 0 0);
34
+ --popover-foreground: oklch(0.146 0 0);
35
35
 
36
- /* Primary — Theo violet (equity) ------------------------------------- */
37
- --primary: 262 83% 58%; /* #7C3AED */
38
- --primary-deep: 263 70% 42%; /* #5B21B6 pressed */
39
- --primary-glow: 263 90% 76%; /* #A78BFA hover halo */
40
- --primary-foreground: 0 0% 100%;
36
+ /* Primary — Theo violet (equity) ------------------------------------- *
37
+ * Post-T3.1 (ADR-0006): -deep and -glow are derived algorithmically via
38
+ * OKLCH relative-color syntax. Themes that need a per-token override may
39
+ * still declare these explicitlythe cascade resolves the override.
40
+ * `max()`/`min()` clamps protect dark/light themes from L overflow (EC-7).
41
+ */
42
+ --primary: oklch(0.542 0.245 293); /* #7C3AED */
43
+ --primary-deep: oklch(from var(--primary) max(0.05, calc(l - 0.16)) c h);
44
+ --primary-glow: oklch(from var(--primary) min(0.95, calc(l + 0.18)) c h);
45
+ --primary-foreground: oklch(1 0 0);
41
46
 
42
47
  /* Secondary — neutral muted ----------------------------------------- */
43
- --secondary: 0 0% 96%; /* #F5F5F5 */
44
- --secondary-foreground: 0 0% 4%;
48
+ --secondary: oklch(0.97 0 0); /* #F5F5F5 */
49
+ --secondary-foreground: oklch(0.146 0 0);
45
50
 
46
- /* Accent — burnt sienna --------------------------------------------- */
47
- --accent: 15 54% 53%; /* #C96442 */
48
- --accent-deep: 15 55% 40%; /* #9C4A2E */
49
- --accent-foreground: 0 0% 100%;
51
+ /* Accent — burnt sienna --------------------------------------------- *
52
+ * T3.1: accent-deep derived. Override path identical to primary.
53
+ */
54
+ --accent: oklch(0.621 0.132 39); /* #C96442 */
55
+ --accent-deep: oklch(from var(--accent) max(0.05, calc(l - 0.13)) c h);
56
+ --accent-foreground: oklch(1 0 0);
50
57
 
51
58
  /* Muted ------------------------------------------------------------- */
52
- --muted: 0 0% 96%;
53
- --muted-foreground: 0 0% 45%; /* #737373 */
59
+ --muted: oklch(0.97 0 0);
60
+ --muted-foreground: oklch(0.555 0 0); /* #737373 */
54
61
 
55
62
  /* Surfaces, borders, inputs ----------------------------------------- */
56
- --border: 0 0% 91%; /* #E8E8E8 — Vercel-style hairline */
57
- --input: 0 0% 91%;
58
- --ring: 262 83% 58%; /* matches primary */
63
+ --border: oklch(0.931 0 0); /* #E8E8E8 — Vercel-style hairline */
64
+ --input: oklch(0.931 0 0);
65
+ --ring: oklch(0.542 0.245 293); /* matches primary */
59
66
 
60
67
  /* Semantics --------------------------------------------------------- */
61
- --success: 142 71% 36%; /* #16A34A */
62
- --success-foreground: 0 0% 100%;
63
- --warning: 33 92% 44%; /* #D97706 */
64
- --warning-foreground: 0 0% 100%;
65
- --destructive: 0 72% 51%; /* #DC2626 */
66
- --destructive-foreground: 0 0% 100%;
67
- --info: 217 91% 60%; /* #3B82F6 */
68
- --info-foreground: 0 0% 100%;
68
+ --success: oklch(0.611 0.161 149.7); /* #16A34A */
69
+ --success-foreground: oklch(1 0 0);
70
+ --warning: oklch(0.67 0.154 60.6); /* #D97706 */
71
+ --warning-foreground: oklch(1 0 0);
72
+ --destructive: oklch(0.579 0.214 27.2); /* #DC2626 */
73
+ --destructive-foreground: oklch(1 0 0);
74
+ --info: oklch(0.626 0.186 259.6); /* #3B82F6 */
75
+ --info-foreground: oklch(1 0 0);
76
+
77
+ /* Status (D4 — operational state group) ----------------------------- *
78
+ * Separate from semantic group (success/destructive/warning/info, which
79
+ * are action-result colors). Status describes component liveness:
80
+ * online (alive), offline (dead), degraded (alive-but-slow), info (flag).
81
+ * Defaults mirror semantic counterparts; themes override for distinction.
82
+ */
83
+ --status-online: oklch(0.611 0.161 149.7);
84
+ --status-online-foreground: oklch(1 0 0);
85
+ --status-offline: oklch(0.579 0.214 27.2);
86
+ --status-offline-foreground: oklch(1 0 0);
87
+ --status-degraded: oklch(0.67 0.154 60.6);
88
+ --status-degraded-foreground: oklch(1 0 0);
89
+ --status-info: oklch(0.626 0.186 259.6);
90
+ --status-info-foreground: oklch(1 0 0);
69
91
 
70
92
  /* Radii ------------------------------------------------------------- */
71
93
  --radius-none: 0px;
@@ -95,13 +117,16 @@
95
117
 
96
118
  /* Elevation — theme-aware (uses --foreground for shadow ink,
97
119
  * --primary for the signature glow, so swapping themes recolors them).
120
+ * Post-T2.5: tokens are OKLCH; we compose alpha via color-mix(in oklch, ...)
121
+ * which is perceptually correct AND works with any color-space variable.
98
122
  */
99
- --shadow-sm: 0 1px 2px 0 hsl(var(--foreground) / 0.06);
100
- --shadow-md: 0 2px 8px -2px hsl(var(--foreground) / 0.08), 0 1px 3px hsl(var(--foreground) / 0.06);
101
- --shadow-lg: 0 12px 32px -8px hsl(var(--foreground) / 0.12), 0 4px 12px
102
- hsl(var(--foreground) / 0.08);
103
- --shadow-glow: 0 0 24px hsl(var(--primary) / 0.25);
104
- --shadow-glow-strong: 0 0 32px hsl(var(--primary) / 0.4);
123
+ --shadow-sm: 0 1px 2px 0 color-mix(in oklch, var(--foreground) 6%, transparent);
124
+ --shadow-md: 0 2px 8px -2px color-mix(in oklch, var(--foreground) 8%, transparent), 0 1px 3px
125
+ color-mix(in oklch, var(--foreground) 6%, transparent);
126
+ --shadow-lg: 0 12px 32px -8px color-mix(in oklch, var(--foreground) 12%, transparent), 0 4px 12px
127
+ color-mix(in oklch, var(--foreground) 8%, transparent);
128
+ --shadow-glow: 0 0 24px color-mix(in oklch, var(--primary) 25%, transparent);
129
+ --shadow-glow-strong: 0 0 32px color-mix(in oklch, var(--primary) 40%, transparent);
105
130
 
106
131
  /* Motion ------------------------------------------------------------ */
107
132
  --ease-out-soft: cubic-bezier(0.22, 1, 0.36, 1);
@@ -129,51 +154,102 @@
129
154
  * the theme NAME, never the literal `"dark"`.
130
155
  */
131
156
  .dark {
132
- --background: 0 0% 4%; /* #0A0A0A */
133
- --foreground: 0 0% 96%; /* #F5F5F5 */
157
+ --background: oklch(0.146 0 0); /* #0A0A0A */
158
+ --foreground: oklch(0.97 0 0); /* #F5F5F5 */
159
+
160
+ --card: oklch(0.182 0 0); /* #121212 */
161
+ --card-foreground: oklch(0.97 0 0);
134
162
 
135
- --card: 0 0% 7%; /* #121212 */
136
- --card-foreground: 0 0% 96%;
163
+ --popover: oklch(0.204 0 0); /* #171717 */
164
+ --popover-foreground: oklch(0.97 0 0);
137
165
 
138
- --popover: 0 0% 9%; /* #171717 */
139
- --popover-foreground: 0 0% 96%;
166
+ --primary: oklch(0.542 0.245 293);
167
+ --primary-deep: oklch(from var(--primary) max(0.05, calc(l - 0.16)) c h);
168
+ --primary-glow: oklch(from var(--primary) min(0.95, calc(l + 0.18)) c h);
169
+ --primary-foreground: oklch(1 0 0);
140
170
 
141
- --primary: 262 83% 58%;
142
- --primary-deep: 263 70% 42%;
143
- --primary-glow: 263 90% 76%;
144
- --primary-foreground: 0 0% 100%;
171
+ --secondary: oklch(0.227 0 0); /* #1C1C1C */
172
+ --secondary-foreground: oklch(0.97 0 0);
145
173
 
146
- --secondary: 0 0% 11%; /* #1C1C1C */
147
- --secondary-foreground: 0 0% 96%;
174
+ --accent: oklch(0.621 0.132 39);
175
+ --accent-deep: oklch(from var(--accent) max(0.05, calc(l - 0.13)) c h);
176
+ --accent-foreground: oklch(1 0 0);
148
177
 
149
- --accent: 15 54% 53%;
150
- --accent-deep: 15 55% 40%;
151
- --accent-foreground: 0 0% 100%;
178
+ --muted: oklch(0.227 0 0);
179
+ --muted-foreground: oklch(0.683 0 0); /* #999 — Vercel gray-500 */
152
180
 
153
- --muted: 0 0% 11%;
154
- --muted-foreground: 0 0% 60%; /* #999 — Vercel gray-500 */
181
+ --border: oklch(0.28 0 0); /* #292929 */
182
+ --input: oklch(0.227 0 0);
183
+ --ring: oklch(0.542 0.245 293);
155
184
 
156
- --border: 0 0% 16%; /* #292929 */
157
- --input: 0 0% 11%;
158
- --ring: 262 83% 58%;
185
+ --success: oklch(0.814 0.192 155.7); /* #22E58C */
186
+ --success-foreground: oklch(0.146 0 0);
187
+ --warning: oklch(0.77 0.165 70.6); /* #F59E0B */
188
+ --warning-foreground: oklch(0.146 0 0);
189
+ --destructive: oklch(0.677 0.213 15.6); /* #FF4F6D */
190
+ --destructive-foreground: oklch(0.146 0 0);
191
+ --info: oklch(0.732 0.142 254.4); /* #5FB3FF */
192
+ --info-foreground: oklch(0.146 0 0);
159
193
 
160
- --success: 152 79% 52%; /* #22E58C */
161
- --success-foreground: 0 0% 4%;
162
- --warning: 38 92% 50%; /* #F59E0B */
163
- --warning-foreground: 0 0% 4%;
164
- --destructive: 350 100% 65%; /* #FF4F6D */
165
- --destructive-foreground: 0 0% 4%;
166
- --info: 213 100% 70%; /* #5FB3FF */
167
- --info-foreground: 0 0% 4%;
194
+ /* Status (D4 dark mode mirror of light defaults) ------------------ */
195
+ --status-online: oklch(0.814 0.192 155.7);
196
+ --status-online-foreground: oklch(0.146 0 0);
197
+ --status-offline: oklch(0.677 0.213 15.6);
198
+ --status-offline-foreground: oklch(0.146 0 0);
199
+ --status-degraded: oklch(0.77 0.165 70.6);
200
+ --status-degraded-foreground: oklch(0.146 0 0);
201
+ --status-info: oklch(0.732 0.142 254.4);
202
+ --status-info-foreground: oklch(0.146 0 0);
168
203
 
169
204
  /* In dark mode, shadows are heavier ink (against the dark surface) and
170
205
  * the glow brightens. Both still derive from theme tokens.
206
+ * Post-T2.5: OKLCH-aware composition via color-mix() — black ink via
207
+ * the literal oklch(0 0 0) (no theme indirection needed).
171
208
  */
172
- --shadow-sm: 0 1px 2px 0 hsl(0 0% 0% / 0.4);
173
- --shadow-md: 0 2px 8px -2px hsl(0 0% 0% / 0.5), 0 1px 3px hsl(0 0% 0% / 0.4);
174
- --shadow-lg: 0 12px 32px -8px hsl(0 0% 0% / 0.6), 0 4px 12px hsl(0 0% 0% / 0.4);
175
- --shadow-glow: 0 0 24px hsl(var(--primary-glow) / 0.4);
176
- --shadow-glow-strong: 0 0 36px hsl(var(--primary-glow) / 0.6);
209
+ --shadow-sm: 0 1px 2px 0 oklch(0 0 0 / 0.4);
210
+ --shadow-md: 0 2px 8px -2px oklch(0 0 0 / 0.5), 0 1px 3px oklch(0 0 0 / 0.4);
211
+ --shadow-lg: 0 12px 32px -8px oklch(0 0 0 / 0.6), 0 4px 12px oklch(0 0 0 / 0.4);
212
+ --shadow-glow: 0 0 24px color-mix(in oklch, var(--primary-glow) 40%, transparent);
213
+ --shadow-glow-strong: 0 0 36px color-mix(in oklch, var(--primary-glow) 60%, transparent);
214
+ }
215
+
216
+ /* Forced colors (Windows High Contrast Mode) — D7 / ADR-0008 ----------- *
217
+ * Maps Theo's semantic tokens to system colors so the UI remains usable
218
+ * (and required by WCAG 1.4.1) when the OS forces a high-contrast palette.
219
+ * Decorative textures opt out via `forced-color-adjust: none` (the dotted
220
+ * patterns and hero glow would invert into solid blocks otherwise).
221
+ *
222
+ * Reference: MDN forced-colors media query, WCAG 2.2 SC 1.4.1.
223
+ */
224
+ @media (forced-colors: active) {
225
+ :root,
226
+ .dark {
227
+ --background: Canvas;
228
+ --foreground: CanvasText;
229
+ --card: Canvas;
230
+ --card-foreground: CanvasText;
231
+ --popover: Canvas;
232
+ --popover-foreground: CanvasText;
233
+ --primary: Highlight;
234
+ --primary-foreground: HighlightText;
235
+ --secondary: ButtonFace;
236
+ --secondary-foreground: ButtonText;
237
+ --accent: Highlight;
238
+ --accent-foreground: HighlightText;
239
+ --muted: ButtonFace;
240
+ --muted-foreground: GrayText;
241
+ --border: ButtonBorder;
242
+ --input: ButtonBorder;
243
+ --ring: Highlight;
244
+ }
245
+
246
+ /* Texture utilities are decorative — keep them out of the system-color map. */
247
+ .bg-dotted-violet,
248
+ .bg-dotted-violet-strong,
249
+ .bg-hero-glow,
250
+ .bg-paper-grain {
251
+ forced-color-adjust: none;
252
+ }
177
253
  }
178
254
 
179
255
  /* Reduced motion — neutralizes durations and transitions for users who
@@ -200,22 +276,31 @@
200
276
  }
201
277
  }
202
278
 
203
- /* Texture utilities (signature) ---------------------------------------- */
279
+ /* Texture utilities (signature) ---------------------------------------- *
280
+ * Post-T2.5: tokens are OKLCH; we compose alpha via color-mix(in oklch, …),
281
+ * which is perceptually correct and works with any color-space variable.
282
+ */
204
283
  @layer utilities {
205
284
  .bg-dotted-violet {
206
- background-image: radial-gradient(hsl(var(--primary) / 0.08) 1px, transparent 1px);
285
+ background-image: radial-gradient(
286
+ color-mix(in oklch, var(--primary) 8%, transparent) 1px,
287
+ transparent 1px
288
+ );
207
289
  background-size: 20px 20px;
208
290
  }
209
291
 
210
292
  .bg-dotted-violet-strong {
211
- background-image: radial-gradient(hsl(var(--primary) / 0.16) 1px, transparent 1px);
293
+ background-image: radial-gradient(
294
+ color-mix(in oklch, var(--primary) 16%, transparent) 1px,
295
+ transparent 1px
296
+ );
212
297
  background-size: 20px 20px;
213
298
  }
214
299
 
215
300
  .bg-hero-glow {
216
301
  background-image: radial-gradient(
217
302
  ellipse 60% 50% at 70% 0%,
218
- hsl(var(--primary) / 0.18) 0%,
303
+ color-mix(in oklch, var(--primary) 18%, transparent) 0%,
219
304
  transparent 60%
220
305
  );
221
306
  }
@@ -1,4 +1,4 @@
1
- import * as react from 'react';
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { z } from 'zod';
3
3
 
4
4
  /**
@@ -253,6 +253,6 @@ interface WhiteboardProps {
253
253
  /** Accessible label for the SVG (defaults to "Whiteboard diagram"). */
254
254
  "aria-label"?: string;
255
255
  }
256
- declare function Whiteboard({ data, className, initialZoom, initialCenter, fitOnLoad, onValidationError, "aria-label": ariaLabel, }: WhiteboardProps): react.JSX.Element;
256
+ declare function Whiteboard({ data, className, initialZoom, initialCenter, fitOnLoad, onValidationError, "aria-label": ariaLabel, }: WhiteboardProps): react_jsx_runtime.JSX.Element;
257
257
 
258
258
  export { type ValidationError, type ValidationResult, Whiteboard, type WhiteboardData, type WhiteboardProps, validateScene };