@fluid-app/portal-core 0.1.16

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 (195) hide show
  1. package/dist/chunk-CKQMccvm.cjs +28 -0
  2. package/dist/data-sources/DataAwareWidget.cjs +50 -0
  3. package/dist/data-sources/DataAwareWidget.cjs.map +1 -0
  4. package/dist/data-sources/DataAwareWidget.d.cts +24 -0
  5. package/dist/data-sources/DataAwareWidget.d.cts.map +1 -0
  6. package/dist/data-sources/DataAwareWidget.d.mts +24 -0
  7. package/dist/data-sources/DataAwareWidget.d.mts.map +1 -0
  8. package/dist/data-sources/DataAwareWidget.mjs +48 -0
  9. package/dist/data-sources/DataAwareWidget.mjs.map +1 -0
  10. package/dist/data-sources/ErrorState.cjs +20 -0
  11. package/dist/data-sources/ErrorState.cjs.map +1 -0
  12. package/dist/data-sources/ErrorState.d.cts +7 -0
  13. package/dist/data-sources/ErrorState.d.cts.map +1 -0
  14. package/dist/data-sources/ErrorState.d.mts +7 -0
  15. package/dist/data-sources/ErrorState.d.mts.map +1 -0
  16. package/dist/data-sources/ErrorState.mjs +18 -0
  17. package/dist/data-sources/ErrorState.mjs.map +1 -0
  18. package/dist/data-sources/context.cjs +24 -0
  19. package/dist/data-sources/context.cjs.map +1 -0
  20. package/dist/data-sources/context.d.cts +21 -0
  21. package/dist/data-sources/context.d.cts.map +1 -0
  22. package/dist/data-sources/context.d.mts +21 -0
  23. package/dist/data-sources/context.d.mts.map +1 -0
  24. package/dist/data-sources/context.mjs +21 -0
  25. package/dist/data-sources/context.mjs.map +1 -0
  26. package/dist/data-sources/fetchers/api.cjs +65 -0
  27. package/dist/data-sources/fetchers/api.cjs.map +1 -0
  28. package/dist/data-sources/fetchers/api.d.cts +10 -0
  29. package/dist/data-sources/fetchers/api.d.cts.map +1 -0
  30. package/dist/data-sources/fetchers/api.d.mts +10 -0
  31. package/dist/data-sources/fetchers/api.d.mts.map +1 -0
  32. package/dist/data-sources/fetchers/api.mjs +64 -0
  33. package/dist/data-sources/fetchers/api.mjs.map +1 -0
  34. package/dist/data-sources/fetchers/custom.cjs +108 -0
  35. package/dist/data-sources/fetchers/custom.cjs.map +1 -0
  36. package/dist/data-sources/fetchers/custom.d.cts +17 -0
  37. package/dist/data-sources/fetchers/custom.d.cts.map +1 -0
  38. package/dist/data-sources/fetchers/custom.d.mts +17 -0
  39. package/dist/data-sources/fetchers/custom.d.mts.map +1 -0
  40. package/dist/data-sources/fetchers/custom.mjs +107 -0
  41. package/dist/data-sources/fetchers/custom.mjs.map +1 -0
  42. package/dist/data-sources/fetchers/static.cjs +161 -0
  43. package/dist/data-sources/fetchers/static.cjs.map +1 -0
  44. package/dist/data-sources/fetchers/static.d.cts +40 -0
  45. package/dist/data-sources/fetchers/static.d.cts.map +1 -0
  46. package/dist/data-sources/fetchers/static.d.mts +40 -0
  47. package/dist/data-sources/fetchers/static.d.mts.map +1 -0
  48. package/dist/data-sources/fetchers/static.mjs +158 -0
  49. package/dist/data-sources/fetchers/static.mjs.map +1 -0
  50. package/dist/data-sources/preview-context.cjs +21 -0
  51. package/dist/data-sources/preview-context.cjs.map +1 -0
  52. package/dist/data-sources/preview-context.d.cts +13 -0
  53. package/dist/data-sources/preview-context.d.cts.map +1 -0
  54. package/dist/data-sources/preview-context.d.mts +13 -0
  55. package/dist/data-sources/preview-context.d.mts.map +1 -0
  56. package/dist/data-sources/preview-context.mjs +18 -0
  57. package/dist/data-sources/preview-context.mjs.map +1 -0
  58. package/dist/data-sources/registry-context.cjs +53 -0
  59. package/dist/data-sources/registry-context.cjs.map +1 -0
  60. package/dist/data-sources/registry-context.d.cts +48 -0
  61. package/dist/data-sources/registry-context.d.cts.map +1 -0
  62. package/dist/data-sources/registry-context.d.mts +48 -0
  63. package/dist/data-sources/registry-context.d.mts.map +1 -0
  64. package/dist/data-sources/registry-context.mjs +49 -0
  65. package/dist/data-sources/registry-context.mjs.map +1 -0
  66. package/dist/data-sources/registry.cjs +31 -0
  67. package/dist/data-sources/registry.cjs.map +1 -0
  68. package/dist/data-sources/registry.d.cts +19 -0
  69. package/dist/data-sources/registry.d.cts.map +1 -0
  70. package/dist/data-sources/registry.d.mts +19 -0
  71. package/dist/data-sources/registry.d.mts.map +1 -0
  72. package/dist/data-sources/registry.mjs +29 -0
  73. package/dist/data-sources/registry.mjs.map +1 -0
  74. package/dist/data-sources/transformers.cjs +154 -0
  75. package/dist/data-sources/transformers.cjs.map +1 -0
  76. package/dist/data-sources/transformers.d.cts +10 -0
  77. package/dist/data-sources/transformers.d.cts.map +1 -0
  78. package/dist/data-sources/transformers.d.mts +10 -0
  79. package/dist/data-sources/transformers.d.mts.map +1 -0
  80. package/dist/data-sources/transformers.mjs +153 -0
  81. package/dist/data-sources/transformers.mjs.map +1 -0
  82. package/dist/data-sources/types.cjs +0 -0
  83. package/dist/data-sources/types.d.cts +2 -0
  84. package/dist/data-sources/types.d.mts +2 -0
  85. package/dist/data-sources/types.mjs +1 -0
  86. package/dist/data-sources/use-widget-data.cjs +111 -0
  87. package/dist/data-sources/use-widget-data.cjs.map +1 -0
  88. package/dist/data-sources/use-widget-data.d.cts +17 -0
  89. package/dist/data-sources/use-widget-data.d.cts.map +1 -0
  90. package/dist/data-sources/use-widget-data.d.mts +17 -0
  91. package/dist/data-sources/use-widget-data.d.mts.map +1 -0
  92. package/dist/data-sources/use-widget-data.mjs +109 -0
  93. package/dist/data-sources/use-widget-data.mjs.map +1 -0
  94. package/dist/index-B5cTNde-.d.cts +246 -0
  95. package/dist/index-B5cTNde-.d.cts.map +1 -0
  96. package/dist/index-Cqt2JzkQ.d.mts +246 -0
  97. package/dist/index-Cqt2JzkQ.d.mts.map +1 -0
  98. package/dist/registries/index.cjs +243 -0
  99. package/dist/registries/index.cjs.map +1 -0
  100. package/dist/registries/index.d.cts +338 -0
  101. package/dist/registries/index.d.cts.map +1 -0
  102. package/dist/registries/index.d.mts +338 -0
  103. package/dist/registries/index.d.mts.map +1 -0
  104. package/dist/registries/index.mjs +229 -0
  105. package/dist/registries/index.mjs.map +1 -0
  106. package/dist/shell/AppShellLayout.cjs +49 -0
  107. package/dist/shell/AppShellLayout.cjs.map +1 -0
  108. package/dist/shell/AppShellLayout.d.cts +39 -0
  109. package/dist/shell/AppShellLayout.d.cts.map +1 -0
  110. package/dist/shell/AppShellLayout.d.mts +39 -0
  111. package/dist/shell/AppShellLayout.d.mts.map +1 -0
  112. package/dist/shell/AppShellLayout.mjs +46 -0
  113. package/dist/shell/AppShellLayout.mjs.map +1 -0
  114. package/dist/shell/ScreenHeader.cjs +44 -0
  115. package/dist/shell/ScreenHeader.cjs.map +1 -0
  116. package/dist/shell/ScreenHeader.d.cts +12 -0
  117. package/dist/shell/ScreenHeader.d.cts.map +1 -0
  118. package/dist/shell/ScreenHeader.d.mts +12 -0
  119. package/dist/shell/ScreenHeader.d.mts.map +1 -0
  120. package/dist/shell/ScreenHeader.mjs +42 -0
  121. package/dist/shell/ScreenHeader.mjs.map +1 -0
  122. package/dist/shell/ScreenHeaderContext.cjs +91 -0
  123. package/dist/shell/ScreenHeaderContext.cjs.map +1 -0
  124. package/dist/shell/ScreenHeaderContext.d.cts +35 -0
  125. package/dist/shell/ScreenHeaderContext.d.cts.map +1 -0
  126. package/dist/shell/ScreenHeaderContext.d.mts +35 -0
  127. package/dist/shell/ScreenHeaderContext.d.mts.map +1 -0
  128. package/dist/shell/ScreenHeaderContext.mjs +86 -0
  129. package/dist/shell/ScreenHeaderContext.mjs.map +1 -0
  130. package/dist/shell/ThemeModeContext.cjs +70 -0
  131. package/dist/shell/ThemeModeContext.cjs.map +1 -0
  132. package/dist/shell/ThemeModeContext.d.cts +33 -0
  133. package/dist/shell/ThemeModeContext.d.cts.map +1 -0
  134. package/dist/shell/ThemeModeContext.d.mts +33 -0
  135. package/dist/shell/ThemeModeContext.d.mts.map +1 -0
  136. package/dist/shell/ThemeModeContext.mjs +66 -0
  137. package/dist/shell/ThemeModeContext.mjs.map +1 -0
  138. package/dist/shell/index.cjs +43 -0
  139. package/dist/shell/index.d.cts +7 -0
  140. package/dist/shell/index.d.mts +7 -0
  141. package/dist/shell/index.mjs +7 -0
  142. package/dist/shell/sidebar.cjs +390 -0
  143. package/dist/shell/sidebar.cjs.map +1 -0
  144. package/dist/shell/sidebar.d.cts +85 -0
  145. package/dist/shell/sidebar.d.cts.map +1 -0
  146. package/dist/shell/sidebar.d.mts +85 -0
  147. package/dist/shell/sidebar.d.mts.map +1 -0
  148. package/dist/shell/sidebar.mjs +364 -0
  149. package/dist/shell/sidebar.mjs.map +1 -0
  150. package/dist/shell/use-mobile.cjs +51 -0
  151. package/dist/shell/use-mobile.cjs.map +1 -0
  152. package/dist/shell/use-mobile.d.cts +7 -0
  153. package/dist/shell/use-mobile.d.cts.map +1 -0
  154. package/dist/shell/use-mobile.d.mts +7 -0
  155. package/dist/shell/use-mobile.d.mts.map +1 -0
  156. package/dist/shell/use-mobile.mjs +47 -0
  157. package/dist/shell/use-mobile.mjs.map +1 -0
  158. package/dist/theme/index.cjs +758 -0
  159. package/dist/theme/index.cjs.map +1 -0
  160. package/dist/theme/index.d.cts +131 -0
  161. package/dist/theme/index.d.cts.map +1 -0
  162. package/dist/theme/index.d.mts +131 -0
  163. package/dist/theme/index.d.mts.map +1 -0
  164. package/dist/theme/index.mjs +728 -0
  165. package/dist/theme/index.mjs.map +1 -0
  166. package/dist/types/index.cjs +18 -0
  167. package/dist/types/index.d.cts +4 -0
  168. package/dist/types/index.d.mts +4 -0
  169. package/dist/types/index.mjs +2 -0
  170. package/dist/types-27AHMek-.d.cts +85 -0
  171. package/dist/types-27AHMek-.d.cts.map +1 -0
  172. package/dist/types-BXFX9bXp.cjs +303 -0
  173. package/dist/types-BXFX9bXp.cjs.map +1 -0
  174. package/dist/types-Bjmd7Fdx.mjs +208 -0
  175. package/dist/types-Bjmd7Fdx.mjs.map +1 -0
  176. package/dist/types-C5Zs5V3E.d.mts +155 -0
  177. package/dist/types-C5Zs5V3E.d.mts.map +1 -0
  178. package/dist/types-CeCPKvOv.d.mts +85 -0
  179. package/dist/types-CeCPKvOv.d.mts.map +1 -0
  180. package/dist/types-DrzvahW8.d.cts +155 -0
  181. package/dist/types-DrzvahW8.d.cts.map +1 -0
  182. package/dist/widget-schema-BKZgsNG7.d.mts +119 -0
  183. package/dist/widget-schema-BKZgsNG7.d.mts.map +1 -0
  184. package/dist/widget-schema-BSX2fVhW.d.cts +119 -0
  185. package/dist/widget-schema-BSX2fVhW.d.cts.map +1 -0
  186. package/dist/widget-utils/index.cjs +130 -0
  187. package/dist/widget-utils/index.cjs.map +1 -0
  188. package/dist/widget-utils/index.d.cts +47 -0
  189. package/dist/widget-utils/index.d.cts.map +1 -0
  190. package/dist/widget-utils/index.d.mts +47 -0
  191. package/dist/widget-utils/index.d.mts.map +1 -0
  192. package/dist/widget-utils/index.mjs +119 -0
  193. package/dist/widget-utils/index.mjs.map +1 -0
  194. package/package.json +200 -0
  195. package/src/styles/globals.css +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["Color","Color","Color"],"sources":["../../src/theme/types.ts","../../src/theme/color-engine.ts","../../src/theme/tailwind-overrides.ts","../../src/theme/css-generator.ts","../../src/theme/defaults.ts","../../src/theme/serialisation.ts","../../src/theme/transforms.ts","../../src/theme/theme-applicator.ts"],"sourcesContent":["import type Color from \"colorjs.io\";\n\n// Semantic color names - matches portal-widgets tailwind.config.ts and field-types.ts\nexport const SEMANTIC_COLOR_NAMES = [\n \"background\",\n \"foreground\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"muted\",\n \"destructive\",\n] as const;\nexport type SemanticColorName = (typeof SEMANTIC_COLOR_NAMES)[number];\n\nexport const SHADE_STEPS = [\n 100, 200, 300, 400, 500, 600, 700, 800, 900,\n] as const;\nexport type ShadeStep = (typeof SHADE_STEPS)[number];\n\nexport const FONT_SIZE_KEYS = [\n \"extraSmall\",\n \"small\",\n \"regular\",\n \"large\",\n \"extraLarge\",\n \"giant\",\n] as const;\nexport type FontSizeKey = (typeof FONT_SIZE_KEYS)[number];\n\nexport const FONT_FAMILY_KEYS = [\"header\", \"body\"] as const;\nexport type FontFamilyKey = (typeof FONT_FAMILY_KEYS)[number];\n\nexport const RADIUS_KEYS = [\"small\", \"medium\", \"large\", \"extraLarge\"] as const;\nexport type RadiusKey = (typeof RADIUS_KEYS)[number];\n\n/** Author-time color input (what the user configures) */\nexport interface ThemeColorInput {\n base: Color;\n foreground: Color;\n}\n\n/** Complete theme definition — stored in-memory with Color objects */\nexport interface ThemeDefinition {\n id: string;\n name: string;\n /** Light mode — always fully specified */\n light: Record<SemanticColorName, ThemeColorInput>;\n /**\n * Dark mode — only user-overridden colors.\n * Missing keys are auto-derived from `light` at resolve time.\n */\n dark: Partial<Record<SemanticColorName, Partial<ThemeColorInput>>>;\n fontSizes: Record<FontSizeKey, string>;\n fontFamilies: Record<FontFamilyKey, string>;\n spacing: string;\n radii: Record<RadiusKey, string>;\n /** When true, theme colors are re-derived from brand guidelines on every load */\n syncWithBrandColors?: boolean;\n}\n\n/** Resolved semantic color with generated shade ramp */\nexport interface ResolvedSemanticColor {\n base: Color;\n foreground: Color;\n shades: Record<ShadeStep, Color>;\n}\n\n/** Complete resolved color set for one mode */\nexport type ResolvedColorSet = Record<SemanticColorName, ResolvedSemanticColor>;\n\n/** Fully resolved theme — all colors materialised for both modes */\nexport interface ResolvedTheme {\n id: string;\n name: string;\n light: ResolvedColorSet;\n dark: ResolvedColorSet;\n fontSizes: ThemeDefinition[\"fontSizes\"];\n fontFamilies: ThemeDefinition[\"fontFamilies\"];\n spacing: string;\n radii: ThemeDefinition[\"radii\"];\n}\n\n/** Plain OKLCH triplet for JSON serialisation (no Color dependency) */\nexport interface OklchPlain {\n l: number;\n c: number;\n h: number;\n}\n\n/** Serialised color pair as stored in the backend payload */\nexport interface ThemeColorPlain {\n base: OklchPlain;\n foreground: OklchPlain;\n}\n\n/** Backend payload — plain JSON, no Color objects */\nexport interface ThemePayload {\n [key: string]: unknown;\n id: string;\n name: string;\n light: Record<SemanticColorName, ThemeColorPlain>;\n dark: Partial<\n Record<SemanticColorName, { base?: OklchPlain; foreground?: OklchPlain }>\n >;\n fontSizes: Record<FontSizeKey, string>;\n fontFamilies: Record<FontFamilyKey, string>;\n spacing: string;\n radii: Record<RadiusKey, string>;\n syncWithBrandColors?: boolean;\n}\n","import Color from \"colorjs.io\";\nimport {\n SEMANTIC_COLOR_NAMES,\n SHADE_STEPS,\n type SemanticColorName,\n type ShadeStep,\n type ThemeColorInput,\n type ThemeDefinition,\n type ResolvedColorSet,\n type ResolvedTheme,\n} from \"./types\";\n\n/**\n * Attempt to convert any string into a Color using colorjs.io.\n * If the string is exactly 6 characters it is assumed to be a bare hex value\n * (e.g. \"3b82f6\") and a \"#\" prefix is added before parsing.\n *\n * @returns the parsed Color, or a neutral gray (`oklch(0.5 0 0)`) on failure\n */\nexport function parseColor(value: string): Color {\n if (value.length === 6) {\n value = `#${value}`;\n }\n try {\n return new Color(value);\n } catch (error) {\n console.warn(\"[theme] Failed to parse color:\", value, error);\n return new Color(\"oklch\", [0.5, 0, 0]);\n }\n}\n\n/**\n * Returns either the original foreground or a corrected lightness variant,\n * whichever provides better contrast against `color`.\n * Inversion triggers when the APCA contrast is below 50.\n */\nexport function getForegroundColor(foreground: Color, color: Color): Color {\n if (foreground.oklch.l == null || color.oklch.l == null) {\n return foreground;\n }\n const contrast = color.contrastAPCA(foreground);\n\n if (contrast < 50) {\n return new Color(\"oklch\", [\n color.oklch.l < 0.7 ? 0.95 : 0.15,\n foreground.oklch.c || 0,\n foreground.oklch.h || 0,\n ]);\n }\n return foreground;\n}\n\n/**\n * Generate a 100–900 shade ramp from a base color.\n * Base anchors at 500. Light shades (100–400) step toward white,\n * dark shades (600–900) step toward black. Dark steps use an asymmetric\n * multiplier (1.6×, 1.875×, 3×, 4× of `darkStep`) for a more gradual\n * initial descent. Chroma is nudged per step for perceptually natural ramps.\n */\nexport function generateShades(base: Color): Record<ShadeStep, Color> {\n const l = base.oklch.l ?? 0;\n const c = base.oklch.c ?? 0;\n const h = base.oklch.h ?? 0;\n\n const safeMax = l >= 0.885 ? 0.995 : 0.97;\n const safeMin = l <= 0.33 ? 0 : 0.21;\n\n const lightStep = (safeMax - l) / 5;\n const darkStep = -(l - safeMin) / 8;\n\n const shade = (lDelta: number, cDelta: number): Color => {\n return new Color(\"oklch\", [\n Math.max(0, Math.min(1, l + lDelta)),\n c <= 0.001 ? c : Math.max(0, c + cDelta),\n h,\n ]);\n };\n\n return {\n 100: shade(5 * lightStep, -0.00375),\n 200: shade(4 * lightStep, -0.00375),\n 300: shade(3 * lightStep, -0.00375),\n 400: shade(2 * lightStep, -0.00375),\n 500: new Color(\"oklch\", [l, c, h]),\n 600: shade(1.6 * darkStep, 0.025),\n 700: shade(1.875 * 2 * darkStep, 0.05),\n 800: shade(3 * 2 * darkStep, 0.075),\n 900: shade(4 * 2 * darkStep, 0.1),\n };\n}\n\n// ── Dark Mode Derivation ────────────────────────────────────────────\n//\n// Dark-mode colors are derived from their light counterparts by adjusting\n// OKLCH lightness and optionally scaling chroma. Neutral slots (background,\n// foreground, muted) use fixed lightness values while chromatic slots\n// (primary, secondary, accent, destructive) invert lightness around 0.5.\n\nconst DARK_DERIVATION_CONFIG: Record<\n SemanticColorName,\n {\n baseLightness: number | \"invert\";\n fgLightness: number | \"invert\";\n chromaScale?: number;\n }\n> = {\n background: { baseLightness: 0.15, fgLightness: 0.93 },\n foreground: { baseLightness: 0.93, fgLightness: 0.15 },\n muted: { baseLightness: 0.22, fgLightness: 0.75 },\n primary: { baseLightness: \"invert\", fgLightness: 0.95, chromaScale: 0.9 },\n secondary: { baseLightness: \"invert\", fgLightness: 0.93, chromaScale: 0.85 },\n accent: { baseLightness: \"invert\", fgLightness: 0.95, chromaScale: 0.9 },\n destructive: {\n baseLightness: \"invert\",\n fgLightness: 0.95,\n chromaScale: 0.95,\n },\n};\n\n/** Invert OKLCH lightness (1 - l), clamped to [0.35, 0.75] to avoid extremes. */\nfunction invertLightness(l: number): number {\n const inverted = 1 - l;\n return Math.max(0.35, Math.min(0.75, inverted));\n}\n\n/**\n * Derive a dark-mode ThemeColorInput from its light-mode counterpart.\n */\nexport function deriveDarkVariant(\n name: SemanticColorName,\n light: ThemeColorInput,\n): ThemeColorInput {\n const config = DARK_DERIVATION_CONFIG[name];\n const chromaScale = config.chromaScale ?? 1;\n\n const baseLightness =\n config.baseLightness === \"invert\"\n ? invertLightness(light.base.oklch.l ?? 0)\n : config.baseLightness;\n\n const fgLightness =\n config.fgLightness === \"invert\"\n ? invertLightness(light.foreground.oklch.l ?? 0)\n : config.fgLightness;\n\n return {\n base: new Color(\"oklch\", [\n baseLightness,\n (light.base.oklch.c || 0) * chromaScale,\n light.base.oklch.h || 0,\n ]),\n foreground: new Color(\"oklch\", [\n fgLightness,\n (light.foreground.oklch.c || 0) * chromaScale,\n light.foreground.oklch.h || 0,\n ]),\n };\n}\n\n// ── Dark Mode Merge ─────────────────────────────────────────────────\n\n/**\n * Merge auto-derived dark colors with any user-specified overrides.\n * For each semantic color, if the user has fully overridden both base and\n * foreground those are used; otherwise the missing channels are derived.\n */\nexport function mergeDarkOverrides(\n def: ThemeDefinition,\n): Record<SemanticColorName, ThemeColorInput> {\n const darkColors = {} as Record<SemanticColorName, ThemeColorInput>;\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const lightInput = def.light[name];\n const darkOverride = def.dark[name];\n\n if (darkOverride?.base && darkOverride?.foreground) {\n darkColors[name] = darkOverride as ThemeColorInput;\n } else if (darkOverride) {\n const base =\n darkOverride.base ?? deriveDarkVariant(name, lightInput).base;\n darkColors[name] = {\n base: base,\n foreground:\n darkOverride.foreground ??\n getForegroundColor(def.light.foreground.base, base),\n };\n } else {\n darkColors[name] = deriveDarkVariant(name, lightInput);\n }\n }\n\n return darkColors;\n}\n\n// ── Theme Resolution ────────────────────────────────────────────────\n\nfunction resolveColorSet(\n colors: Record<SemanticColorName, ThemeColorInput>,\n): ResolvedColorSet {\n const resolved = {} as ResolvedColorSet;\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const input = colors[name];\n const shades = generateShades(input.base);\n const resolvedShades = {} as Record<ShadeStep, Color>;\n\n for (const step of SHADE_STEPS) {\n resolvedShades[step] = shades[step];\n }\n\n resolved[name] = {\n base: input.base.clone(),\n foreground: input.foreground.clone(),\n shades: resolvedShades,\n };\n }\n\n return resolved;\n}\n\n/**\n * Resolve a ThemeDefinition into a complete ResolvedTheme.\n * Dark mode colors are derived from light where not overridden.\n */\nexport function resolveTheme(def: ThemeDefinition): ResolvedTheme {\n return {\n id: def.id,\n name: def.name,\n light: resolveColorSet(def.light),\n dark: resolveColorSet(mergeDarkOverrides(def)),\n fontSizes: { ...def.fontSizes },\n fontFamilies: { ...def.fontFamilies },\n spacing: def.spacing,\n radii: { ...def.radii },\n };\n}\n","import { SHADE_STEPS, type SemanticColorName, type ShadeStep } from \"./types\";\n\n/**\n * Specific overrides, otherwise all the overrides are generated using emitTailwindOverrides\n */\nconst OVERRIDES: Partial<Record<string, string>> = {\n \"--color-gray-50\": \"var(--color-muted)\",\n \"--color-gray-100\": \"var(--color-muted-600)\",\n \"--color-gray-200\": \"var(--color-border)\",\n} as const;\n\n/**\n * Returns the inverted shade for dark mode foreground colors.\n * In dark mode, light shades (50, 100) should map to dark values (950, 900) and vice versa.\n */\nfunction getInvertedStep(shade: ShadeStep): ShadeStep {\n const shadeIndex = SHADE_STEPS.indexOf(shade);\n const invertedIndex = SHADE_STEPS.length - 1 - shadeIndex;\n return SHADE_STEPS[invertedIndex] || 500;\n}\n\n/**\n * Map semantic colors to Tailwind built-in color names.\n */\nexport function emitTailwindOverrides(darkMode: boolean = false): string[] {\n const TAILWIND_COLOR_MAP: Record<string, SemanticColorName> = {\n gray: \"foreground\",\n red: \"destructive\",\n blue: \"primary\",\n green: \"accent\",\n };\n\n const TAILWIND_SHADES = [\n 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950,\n ] as const;\n const SHADE_REMAP: Partial<Record<number, ShadeStep>> = {\n 50: 100,\n 950: 900,\n };\n\n const lines: string[] = [];\n for (const [twName, semantic] of Object.entries(TAILWIND_COLOR_MAP)) {\n for (const shade of TAILWIND_SHADES) {\n const step = (SHADE_REMAP[shade] ?? shade) as ShadeStep;\n const override = OVERRIDES[`--color-${twName}-${shade}`];\n lines.push(\n `--color-${twName}-${shade}: ${override ? override : `var(--color-${semantic}-${semantic === \"foreground\" && darkMode === true ? getInvertedStep(step) : step})`};`,\n );\n }\n }\n\n lines.push(\"--color-white: var(--color-background);\");\n lines.push(\"--color-black: var(--color-foreground);\");\n\n return lines;\n}\n","import { emitTailwindOverrides } from \"./tailwind-overrides\";\nimport {\n SEMANTIC_COLOR_NAMES,\n SHADE_STEPS,\n FONT_SIZE_KEYS,\n FONT_FAMILY_KEYS,\n RADIUS_KEYS,\n type ResolvedColorSet,\n type ResolvedTheme,\n} from \"./types\";\n\nfunction colorToCSS(color: import(\"colorjs.io\").default): string {\n const result = color.toString({ format: \"oklch\" });\n if (result.includes(\"NaN\")) {\n console.warn(\n \"[theme] colorToCSS produced NaN, using neutral fallback:\",\n result,\n );\n return \"oklch(0.5 0 0)\";\n }\n return result;\n}\n\nfunction camelToKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\n/**\n * Emit --color-{name}, --color-{name}-foreground, --color-{name}-{shade} vars.\n * Uses --color- prefix to match portal-widgets/tailwind.config.ts.\n */\nfunction emitColorVars(colors: ResolvedColorSet): string[] {\n const lines: string[] = [];\n\n for (const name of SEMANTIC_COLOR_NAMES) {\n const color = colors[name];\n lines.push(`--color-${name}: ${colorToCSS(color.base)};`);\n lines.push(`--color-${name}-foreground: ${colorToCSS(color.foreground)};`);\n for (const step of SHADE_STEPS) {\n lines.push(`--color-${name}-${step}: ${colorToCSS(color.shades[step])};`);\n }\n }\n\n return lines;\n}\n\n/**\n * Emit non-color CSS variables (font sizes, families, spacing, radii).\n */\nfunction emitNonColorVars(theme: ResolvedTheme): string[] {\n const lines: string[] = [];\n for (const key of FONT_SIZE_KEYS) {\n lines.push(`--font-size-${camelToKebab(key)}: ${theme.fontSizes[key]};`);\n }\n for (const key of FONT_FAMILY_KEYS) {\n lines.push(`--font-${key}: ${theme.fontFamilies[key]};`);\n }\n lines.push(`--spacing: ${theme.spacing};`);\n for (const key of RADIUS_KEYS) {\n lines.push(`--radius-${camelToKebab(key)}: ${theme.radii[key]};`);\n }\n return lines;\n}\n\n/**\n * Static CSS alias variables that bridge theme var names to Tailwind/component conventions.\n * These are always emitted and not mode-dependent.\n */\nconst globalCSSOverride = [\n \"--color-background-foreground: var(--color-foreground);\",\n \"--color-foreground-foreground: var(--color-background);\",\n \"--color-contrast: var(--color-foreground);\",\n ...SEMANTIC_COLOR_NAMES.map((value) => `--${value}: var(--color-${value});`),\n ...SEMANTIC_COLOR_NAMES.map(\n (value) => `--${value}-foreground: var(--color-${value}-foreground);`,\n ),\n\n \"--sidebar-ring: var(--color-primary);\",\n \"--sidebar-border: var(--color-border);\",\n \"--sidebar-accent-foreground: var(--color-accent-foreground);\",\n \"--sidebar-accent: var(--color-accent);\",\n \"--sidebar-primary-foreground: var(--color-primary-foreground);\",\n \"--sidebar-primary: var(--color-primary);\",\n \"--sidebar-foreground: var(--color-muted-foreground);\",\n \"--sidebar: var(--color-muted);\",\n \"--border: var(--color-background-600);\",\n \"--ring: var(--color-primary);\",\n \"--popover: var(--color-background);\",\n \"--popover-foreground: var(--color-foreground);\",\n \"--card: var(--color-muted);\",\n \"--card-foreground: var(--color-muted-foreground);\",\n\n \"--radius-sm: var(--radius-small);\",\n \"--radius-md: var(--radius-medium);\",\n \"--radius-lg: var(--radius-large);\",\n \"--radius-xl: var(--radius-extra-large);\",\n \"--text-xs: var(--font-size-extra-small);\",\n \"--text-sm: var(--font-size-small);\",\n \"--text-base: var(--font-size-regular);\",\n \"--text-lg: var(--font-size-large);\",\n \"--text-xl: var(--font-size-extra-large);\",\n \"--text-2xl: var(--font-size-giant);\",\n \"--font-sans: var(--font-body);\",\n // Tailwind's font-mono is repurposed as the display/header font\n \"--font-mono: var(--font-header);\",\n];\n\n/**\n * Overrides for global tailwindcss for specifically dark mode.\n */\nconst globalDarkCSSOverride = [\"--border: var(--color-background-400);\"];\n\nexport interface GenerateThemeCSSOptions {\n /** Whether or not to allow prefers-color-scheme to choose the theme mode */\n disableAutoTheme?: boolean;\n /** Whether to emit Tailwind built-in color overrides (default true) */\n mapTailwindColors?: boolean;\n}\n\n/**\n * Generate a complete CSS string for a resolved theme.\n * Outputs 2–3 blocks: light default, dark explicit via `[data-theme-mode=\"dark\"]`,\n * and (unless `disableAutoTheme`) a `prefers-color-scheme: dark` media query block.\n */\nexport function generateThemeCSS(\n theme: ResolvedTheme,\n options: GenerateThemeCSSOptions = {},\n): string {\n const sel = `[data-theme=\"${theme.id}\"]`;\n const tw = options.mapTailwindColors ?? true;\n const blocks: string[] = [];\n\n // Light mode (default)\n blocks.push(`${sel} {`);\n blocks.push(...globalCSSOverride);\n blocks.push(...emitNonColorVars(theme));\n blocks.push(...emitColorVars(theme.light));\n if (tw) blocks.push(...emitTailwindOverrides());\n blocks.push(`}`);\n\n // Dark mode: explicit via attribute\n blocks.push(`${sel}[data-theme-mode=\"dark\"] {`);\n blocks.push(...globalDarkCSSOverride);\n blocks.push(...emitColorVars(theme.dark));\n if (tw) blocks.push(...emitTailwindOverrides(true));\n blocks.push(`}`);\n\n // Dark mode: auto via system preference\n if (!options.disableAutoTheme) {\n blocks.push(`@media (prefers-color-scheme: dark) {`);\n blocks.push(`${sel}:not([data-theme-mode]) {`);\n blocks.push(...globalDarkCSSOverride);\n blocks.push(...emitColorVars(theme.dark).map((l) => `${l}`));\n if (tw) blocks.push(...emitTailwindOverrides(true).map((l) => `${l}`));\n blocks.push(`}`);\n blocks.push(`}`);\n }\n\n return blocks.join(\"\\n\");\n}\n","import Color from \"colorjs.io\";\nimport type {\n FontSizeKey,\n FontFamilyKey,\n RadiusKey,\n ThemeDefinition,\n} from \"./types\";\nimport { getForegroundColor } from \"./color-engine\";\n\n// ── Non-color defaults ──────────────────────────────────────────────\n\nexport const DEFAULT_FONT_SIZES: Record<FontSizeKey, string> = {\n extraSmall: \"0.75rem\",\n small: \"0.875rem\",\n regular: \"1rem\",\n large: \"1.125rem\",\n extraLarge: \"1.25rem\",\n giant: \"1.5rem\",\n};\n\nexport const DEFAULT_FONT_FAMILIES: Record<FontFamilyKey, string> = {\n header: \"var(--font-inter)\",\n body: \"var(--font-inter)\",\n};\n\nexport const DEFAULT_SPACING = \"0.25rem\";\n\nexport const DEFAULT_RADII: Record<RadiusKey, string> = {\n small: \"0.25rem\",\n medium: \"0.5rem\",\n large: \"0.75rem\",\n extraLarge: \"1rem\",\n};\n\n// ── Default colors (hex) ────────────────────────────────────────────\n\nexport const DEFAULT_COLORS = {\n background: \"#ffffff\",\n foreground: \"#1a1a1a\",\n primary: \"#3b82f6\",\n secondary: \"#6b7280\",\n accent: \"#10b981\",\n muted: \"#f3f4f6\",\n destructive: \"#ef4444\",\n mutedForeground: \"#6b7280\",\n} as const;\n\n// ── Default theme identity ──────────────────────────────────────────\n\nexport const DEFAULT_THEME_ID = \"default\";\nexport const DEFAULT_THEME_NAME = \"Default Theme\";\n\n// ── Factory ─────────────────────────────────────────────────────────\n\n/**\n * Build a fresh ThemeDefinition populated with all defaults.\n * Returns a new object each call because Color instances are mutable — do not cache the result.\n */\nexport function getDefaultThemeDefinition(): ThemeDefinition {\n const bg = new Color(DEFAULT_COLORS.background);\n const fg = new Color(DEFAULT_COLORS.foreground);\n const primary = new Color(DEFAULT_COLORS.primary);\n const secondary = new Color(DEFAULT_COLORS.secondary);\n const accent = new Color(DEFAULT_COLORS.accent);\n const muted = new Color(DEFAULT_COLORS.muted);\n const destructive = new Color(DEFAULT_COLORS.destructive);\n const mutedFg = new Color(DEFAULT_COLORS.mutedForeground);\n\n const darkBg = new Color(\"#0a0a0a\");\n const darkFg = new Color(\"#fafafa\");\n const darkMuted = new Color(\"#171717\");\n const darkMutedForeground = new Color(\"#dddddd\");\n\n return {\n id: DEFAULT_THEME_ID,\n name: DEFAULT_THEME_NAME,\n light: {\n background: { base: bg, foreground: fg },\n foreground: { base: fg, foreground: bg },\n primary: {\n base: primary,\n foreground: getForegroundColor(fg, primary),\n },\n secondary: {\n base: secondary,\n foreground: getForegroundColor(fg, secondary),\n },\n accent: {\n base: accent,\n foreground: getForegroundColor(fg, accent),\n },\n muted: { base: muted, foreground: mutedFg },\n destructive: {\n base: destructive,\n foreground: getForegroundColor(fg, destructive),\n },\n },\n dark: {\n background: { base: darkBg, foreground: darkFg },\n foreground: { base: darkFg, foreground: darkBg },\n muted: { base: darkMuted, foreground: darkMutedForeground },\n },\n fontSizes: { ...DEFAULT_FONT_SIZES },\n fontFamilies: { ...DEFAULT_FONT_FAMILIES },\n spacing: DEFAULT_SPACING,\n radii: { ...DEFAULT_RADII },\n };\n}\n","import Color from \"colorjs.io\";\nimport {\n SEMANTIC_COLOR_NAMES,\n type SemanticColorName,\n type ThemeColorInput,\n type ThemeDefinition,\n type ThemePayload,\n type OklchPlain,\n type FontSizeKey,\n type FontFamilyKey,\n type RadiusKey,\n} from \"./types\";\nimport {\n DEFAULT_FONT_SIZES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_SPACING,\n DEFAULT_RADII,\n getDefaultThemeDefinition,\n} from \"./defaults\";\n\nfunction colorToPlain(color: Color): OklchPlain {\n return {\n l: color.oklch.l ?? 0,\n c: color.oklch.c ?? 0,\n h: color.oklch.h ?? 0,\n };\n}\n\nfunction plainToColor(plain: OklchPlain): Color {\n return new Color(\"oklch\", [plain.l, plain.c, plain.h]);\n}\n\n/**\n * Serialise a ThemeDefinition (with Color objects) to a plain JSON payload\n * suitable for backend storage.\n */\nexport function serialiseTheme(def: ThemeDefinition): ThemePayload {\n const light = {} as ThemePayload[\"light\"];\n for (const name of SEMANTIC_COLOR_NAMES) {\n light[name] = {\n base: colorToPlain(def.light[name].base),\n foreground: colorToPlain(def.light[name].foreground),\n };\n }\n\n const dark: ThemePayload[\"dark\"] = {};\n for (const [name, value] of Object.entries(def.dark)) {\n if (!value) continue;\n dark[name as SemanticColorName] = {\n ...(value.base ? { base: colorToPlain(value.base) } : {}),\n ...(value.foreground\n ? { foreground: colorToPlain(value.foreground) }\n : {}),\n };\n }\n\n return {\n id: def.id,\n name: def.name,\n light,\n dark,\n fontSizes: { ...def.fontSizes },\n fontFamilies: { ...def.fontFamilies },\n spacing: def.spacing,\n radii: { ...def.radii },\n ...(def.syncWithBrandColors ? { syncWithBrandColors: true } : {}),\n };\n}\n\n/**\n * Deserialise a backend payload into a ThemeDefinition with Color objects.\n * Accepts `Record<string, unknown>` because API data is untyped at the boundary.\n * Falls back to default colors for any missing light-mode entries.\n */\nexport function deserialiseTheme(\n payload: Record<string, unknown>,\n): ThemeDefinition {\n const lightRaw = ((payload.light as Record<string, unknown> | undefined) ??\n {}) as Record<string, { base: OklchPlain; foreground: OklchPlain }>;\n const darkRaw = ((payload.dark as Record<string, unknown> | undefined) ??\n {}) as Record<string, { base?: OklchPlain; foreground?: OklchPlain }>;\n\n const defaults = getDefaultThemeDefinition();\n const light = {} as Record<SemanticColorName, ThemeColorInput>;\n for (const name of SEMANTIC_COLOR_NAMES) {\n const entry = lightRaw[name];\n if (entry) {\n light[name] = {\n base: plainToColor(entry.base),\n foreground: plainToColor(entry.foreground),\n };\n } else {\n console.warn(\n `[theme] deserialiseTheme: missing light color \"${name}\", using default`,\n );\n light[name] = defaults.light[name];\n }\n }\n\n const dark: Partial<Record<SemanticColorName, Partial<ThemeColorInput>>> = {};\n for (const [name, value] of Object.entries(darkRaw)) {\n if (!value) continue;\n dark[name as SemanticColorName] = {\n ...(value.base ? { base: plainToColor(value.base) } : {}),\n ...(value.foreground\n ? { foreground: plainToColor(value.foreground) }\n : {}),\n };\n }\n\n return {\n id: payload.id as string,\n name: payload.name as string,\n light,\n dark,\n fontSizes: (payload.fontSizes ?? DEFAULT_FONT_SIZES) as Record<\n FontSizeKey,\n string\n >,\n fontFamilies: (payload.fontFamilies ?? DEFAULT_FONT_FAMILIES) as Record<\n FontFamilyKey,\n string\n >,\n spacing: (payload.spacing as string) ?? DEFAULT_SPACING,\n radii: (payload.radii ?? DEFAULT_RADII) as Record<RadiusKey, string>,\n ...(payload.syncWithBrandColors === true\n ? { syncWithBrandColors: true }\n : {}),\n };\n}\n","/**\n * Theme Transforms\n * Convert raw API theme objects to ThemeDefinition format.\n * Handles both new structured format (OKLCH) and legacy flat format (hex strings).\n */\n\nimport type { ThemeDefinition } from \"./types\";\nimport { deserialiseTheme } from \"./serialisation\";\nimport { parseColor, getForegroundColor } from \"./color-engine\";\nimport {\n DEFAULT_COLORS,\n DEFAULT_FONT_SIZES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_SPACING,\n DEFAULT_RADII,\n} from \"./defaults\";\n\n/** Shape of a raw theme from the FluidOS API */\nexport interface RawApiTheme {\n id: number;\n config?: Record<string, unknown> | null;\n active?: boolean | null;\n name?: string | null;\n}\n\n/**\n * Check if a theme config uses the new structured format (has a `light` key\n * that is an object) vs the legacy flat format.\n */\nfunction isNewThemeFormat(config: Record<string, unknown>): boolean {\n return config.light != null && typeof config.light === \"object\";\n}\n\n/**\n * Convert a legacy flat config to a ThemeDefinition.\n * Legacy format: { base: \"#fff\", text: \"#000\", primary: \"oklch(0.6 0.2 250)\", ... }\n */\nfunction legacyConfigToDefinition(\n id: number,\n name: string,\n config: Record<string, string>,\n): ThemeDefinition {\n const bg = parseColor(\n config.base ?? config.background ?? DEFAULT_COLORS.background,\n );\n const fg = parseColor(\n config.text ?? config.foreground ?? DEFAULT_COLORS.foreground,\n );\n const primary = parseColor(config.primary ?? DEFAULT_COLORS.primary);\n const secondary = parseColor(config.secondary ?? DEFAULT_COLORS.secondary);\n const accent = parseColor(config.accent ?? DEFAULT_COLORS.accent);\n const muted = parseColor(config.muted ?? DEFAULT_COLORS.muted);\n const destructive = parseColor(\n config.destructive ?? DEFAULT_COLORS.destructive,\n );\n const mutedFg = parseColor(\n config.mutedForeground ?? DEFAULT_COLORS.mutedForeground,\n );\n\n return {\n id: String(id),\n name,\n light: {\n background: { base: bg, foreground: fg },\n foreground: { base: fg, foreground: bg },\n primary: {\n base: primary,\n foreground: getForegroundColor(fg, primary),\n },\n secondary: {\n base: secondary,\n foreground: getForegroundColor(fg, secondary),\n },\n accent: {\n base: accent,\n foreground: getForegroundColor(fg, accent),\n },\n muted: { base: muted, foreground: mutedFg },\n destructive: {\n base: destructive,\n foreground: getForegroundColor(fg, destructive),\n },\n },\n dark: {},\n fontSizes: {\n extraSmall: config.extraSmall ?? DEFAULT_FONT_SIZES.extraSmall,\n small: config.small ?? DEFAULT_FONT_SIZES.small,\n regular: config.regular ?? DEFAULT_FONT_SIZES.regular,\n large: config.large ?? DEFAULT_FONT_SIZES.large,\n extraLarge: config.extraLarge ?? DEFAULT_FONT_SIZES.extraLarge,\n giant: config.giant ?? DEFAULT_FONT_SIZES.giant,\n },\n fontFamilies: {\n header: config.headerFont ?? DEFAULT_FONT_FAMILIES.header,\n body: config.bodyFont ?? DEFAULT_FONT_FAMILIES.body,\n },\n spacing: config.globalSpacing ?? DEFAULT_SPACING,\n radii: {\n small: config.radiusSmall ?? DEFAULT_RADII.small,\n medium: config.radiusMedium ?? DEFAULT_RADII.medium,\n large: config.radiusLarge ?? DEFAULT_RADII.large,\n extraLarge: config.radiusExtraLarge ?? DEFAULT_RADII.extraLarge,\n },\n };\n}\n\n/**\n * Build a ThemeDefinition from a single API theme object.\n * Handles both new structured format and legacy flat format.\n */\nexport function buildThemeDefinition(theme: RawApiTheme): ThemeDefinition {\n const config = (theme.config ?? {}) as Record<string, unknown>;\n\n if (isNewThemeFormat(config)) {\n return deserialiseTheme({\n ...config,\n id: String(theme.id),\n name: theme.name ?? \"Untitled Theme\",\n });\n }\n\n return legacyConfigToDefinition(\n theme.id,\n theme.name ?? \"Untitled Theme\",\n config as Record<string, string>,\n );\n}\n\n/**\n * Transform raw API themes to ThemeDefinition[].\n * Catches and logs errors per theme (graceful degradation).\n */\nexport function transformThemes(themes: RawApiTheme[]): ThemeDefinition[] {\n return themes.flatMap((theme) => {\n try {\n return [buildThemeDefinition(theme)];\n } catch (error) {\n console.error(`[theme] Failed to build theme id=${theme.id}:`, error);\n return [];\n }\n });\n}\n\n/**\n * Get the active theme ID from a list of raw API themes.\n * Falls back to the first theme if none is marked active.\n */\nexport function getActiveThemeId(themes: RawApiTheme[]): string | undefined {\n const active = themes.find((t) => t.active) ?? themes[0];\n return active ? String(active.id) : undefined;\n}\n","import { generateThemeCSS } from \"./css-generator\";\nimport type { ResolvedTheme } from \"./types\";\nimport type { GenerateThemeCSSOptions } from \"./css-generator\";\n\nconst STYLE_PREFIX = \"theme-style-\";\n\n/**\n * Inject or update a `<style>` element in `<head>` for the given theme.\n * The element ID is deterministic (`theme-style-{themeId}`) so repeated calls\n * for the same theme are idempotent — the existing element is updated in place.\n * No-op when `document` is unavailable (SSR).\n */\nexport function applyTheme(\n theme: ResolvedTheme,\n options?: GenerateThemeCSSOptions,\n): void {\n if (typeof document === \"undefined\") return;\n\n try {\n const styleId = `${STYLE_PREFIX}${theme.id}`;\n let el = document.getElementById(styleId) as HTMLStyleElement | null;\n\n if (!el) {\n el = document.createElement(\"style\");\n el.id = styleId;\n document.head.appendChild(el);\n }\n\n el.textContent = generateThemeCSS(theme, options);\n } catch (error) {\n console.error(`[theme] applyTheme failed for \"${theme.id}\":`, error);\n }\n}\n\n/** Remove an injected theme stylesheet. No-op during SSR. */\nexport function removeTheme(themeId: string): void {\n if (typeof document === \"undefined\") return;\n document.getElementById(`${STYLE_PREFIX}${themeId}`)?.remove();\n}\n\n/** Remove all injected theme stylesheets. No-op during SSR. */\nexport function removeAllThemes(): void {\n if (typeof document === \"undefined\") return;\n document\n .querySelectorAll(`style[id^=\"${STYLE_PREFIX}\"]`)\n .forEach((el) => el.remove());\n}\n"],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import { _ as ThemeDefinition, a as OklchPlain, c as ResolvedColorSet, d as SEMANTIC_COLOR_NAMES, f as SHADE_STEPS, g as ThemeColorPlain, h as ThemeColorInput, i as FontSizeKey, l as ResolvedSemanticColor, m as ShadeStep, n as FONT_SIZE_KEYS, o as RADIUS_KEYS, p as SemanticColorName, r as FontFamilyKey, s as RadiusKey, t as FONT_FAMILY_KEYS, u as ResolvedTheme, v as ThemePayload } from "../types-27AHMek-.cjs";
2
+ import Color from "colorjs.io";
3
+
4
+ //#region src/theme/color-engine.d.ts
5
+ /**
6
+ * Attempt to convert any string into a Color using colorjs.io.
7
+ * If the string is exactly 6 characters it is assumed to be a bare hex value
8
+ * (e.g. "3b82f6") and a "#" prefix is added before parsing.
9
+ *
10
+ * @returns the parsed Color, or a neutral gray (`oklch(0.5 0 0)`) on failure
11
+ */
12
+ declare function parseColor(value: string): Color;
13
+ /**
14
+ * Returns either the original foreground or a corrected lightness variant,
15
+ * whichever provides better contrast against `color`.
16
+ * Inversion triggers when the APCA contrast is below 50.
17
+ */
18
+ declare function getForegroundColor(foreground: Color, color: Color): Color;
19
+ /**
20
+ * Generate a 100–900 shade ramp from a base color.
21
+ * Base anchors at 500. Light shades (100–400) step toward white,
22
+ * dark shades (600–900) step toward black. Dark steps use an asymmetric
23
+ * multiplier (1.6×, 1.875×, 3×, 4× of `darkStep`) for a more gradual
24
+ * initial descent. Chroma is nudged per step for perceptually natural ramps.
25
+ */
26
+ declare function generateShades(base: Color): Record<ShadeStep, Color>;
27
+ /**
28
+ * Derive a dark-mode ThemeColorInput from its light-mode counterpart.
29
+ */
30
+ declare function deriveDarkVariant(name: SemanticColorName, light: ThemeColorInput): ThemeColorInput;
31
+ /**
32
+ * Merge auto-derived dark colors with any user-specified overrides.
33
+ * For each semantic color, if the user has fully overridden both base and
34
+ * foreground those are used; otherwise the missing channels are derived.
35
+ */
36
+ declare function mergeDarkOverrides(def: ThemeDefinition): Record<SemanticColorName, ThemeColorInput>;
37
+ /**
38
+ * Resolve a ThemeDefinition into a complete ResolvedTheme.
39
+ * Dark mode colors are derived from light where not overridden.
40
+ */
41
+ declare function resolveTheme(def: ThemeDefinition): ResolvedTheme;
42
+ //#endregion
43
+ //#region src/theme/css-generator.d.ts
44
+ interface GenerateThemeCSSOptions {
45
+ /** Whether or not to allow prefers-color-scheme to choose the theme mode */
46
+ disableAutoTheme?: boolean;
47
+ /** Whether to emit Tailwind built-in color overrides (default true) */
48
+ mapTailwindColors?: boolean;
49
+ }
50
+ /**
51
+ * Generate a complete CSS string for a resolved theme.
52
+ * Outputs 2–3 blocks: light default, dark explicit via `[data-theme-mode="dark"]`,
53
+ * and (unless `disableAutoTheme`) a `prefers-color-scheme: dark` media query block.
54
+ */
55
+ declare function generateThemeCSS(theme: ResolvedTheme, options?: GenerateThemeCSSOptions): string;
56
+ //#endregion
57
+ //#region src/theme/serialisation.d.ts
58
+ /**
59
+ * Serialise a ThemeDefinition (with Color objects) to a plain JSON payload
60
+ * suitable for backend storage.
61
+ */
62
+ declare function serialiseTheme(def: ThemeDefinition): ThemePayload;
63
+ /**
64
+ * Deserialise a backend payload into a ThemeDefinition with Color objects.
65
+ * Accepts `Record<string, unknown>` because API data is untyped at the boundary.
66
+ * Falls back to default colors for any missing light-mode entries.
67
+ */
68
+ declare function deserialiseTheme(payload: Record<string, unknown>): ThemeDefinition;
69
+ //#endregion
70
+ //#region src/theme/transforms.d.ts
71
+ /** Shape of a raw theme from the FluidOS API */
72
+ interface RawApiTheme {
73
+ id: number;
74
+ config?: Record<string, unknown> | null;
75
+ active?: boolean | null;
76
+ name?: string | null;
77
+ }
78
+ /**
79
+ * Build a ThemeDefinition from a single API theme object.
80
+ * Handles both new structured format and legacy flat format.
81
+ */
82
+ declare function buildThemeDefinition(theme: RawApiTheme): ThemeDefinition;
83
+ /**
84
+ * Transform raw API themes to ThemeDefinition[].
85
+ * Catches and logs errors per theme (graceful degradation).
86
+ */
87
+ declare function transformThemes(themes: RawApiTheme[]): ThemeDefinition[];
88
+ /**
89
+ * Get the active theme ID from a list of raw API themes.
90
+ * Falls back to the first theme if none is marked active.
91
+ */
92
+ declare function getActiveThemeId(themes: RawApiTheme[]): string | undefined;
93
+ //#endregion
94
+ //#region src/theme/theme-applicator.d.ts
95
+ /**
96
+ * Inject or update a `<style>` element in `<head>` for the given theme.
97
+ * The element ID is deterministic (`theme-style-{themeId}`) so repeated calls
98
+ * for the same theme are idempotent — the existing element is updated in place.
99
+ * No-op when `document` is unavailable (SSR).
100
+ */
101
+ declare function applyTheme(theme: ResolvedTheme, options?: GenerateThemeCSSOptions): void;
102
+ /** Remove an injected theme stylesheet. No-op during SSR. */
103
+ declare function removeTheme(themeId: string): void;
104
+ /** Remove all injected theme stylesheets. No-op during SSR. */
105
+ declare function removeAllThemes(): void;
106
+ //#endregion
107
+ //#region src/theme/defaults.d.ts
108
+ declare const DEFAULT_FONT_SIZES: Record<FontSizeKey, string>;
109
+ declare const DEFAULT_FONT_FAMILIES: Record<FontFamilyKey, string>;
110
+ declare const DEFAULT_SPACING = "0.25rem";
111
+ declare const DEFAULT_RADII: Record<RadiusKey, string>;
112
+ declare const DEFAULT_COLORS: {
113
+ readonly background: "#ffffff";
114
+ readonly foreground: "#1a1a1a";
115
+ readonly primary: "#3b82f6";
116
+ readonly secondary: "#6b7280";
117
+ readonly accent: "#10b981";
118
+ readonly muted: "#f3f4f6";
119
+ readonly destructive: "#ef4444";
120
+ readonly mutedForeground: "#6b7280";
121
+ };
122
+ declare const DEFAULT_THEME_ID = "default";
123
+ declare const DEFAULT_THEME_NAME = "Default Theme";
124
+ /**
125
+ * Build a fresh ThemeDefinition populated with all defaults.
126
+ * Returns a new object each call because Color instances are mutable — do not cache the result.
127
+ */
128
+ declare function getDefaultThemeDefinition(): ThemeDefinition;
129
+ //#endregion
130
+ export { DEFAULT_COLORS, DEFAULT_FONT_FAMILIES, DEFAULT_FONT_SIZES, DEFAULT_RADII, DEFAULT_SPACING, DEFAULT_THEME_ID, DEFAULT_THEME_NAME, FONT_FAMILY_KEYS, FONT_SIZE_KEYS, type FontFamilyKey, type FontSizeKey, type GenerateThemeCSSOptions, type OklchPlain, RADIUS_KEYS, type RadiusKey, type RawApiTheme, type ResolvedColorSet, type ResolvedSemanticColor, type ResolvedTheme, SEMANTIC_COLOR_NAMES, SHADE_STEPS, type SemanticColorName, type ShadeStep, type ThemeColorInput, type ThemeColorPlain, type ThemeDefinition, type ThemePayload, applyTheme, buildThemeDefinition, deriveDarkVariant, deserialiseTheme, generateShades, generateThemeCSS, getActiveThemeId, getDefaultThemeDefinition, getForegroundColor, mergeDarkOverrides, parseColor, removeAllThemes, removeTheme, resolveTheme, serialiseTheme, transformThemes };
131
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/theme/color-engine.ts","../../src/theme/css-generator.ts","../../src/theme/serialisation.ts","../../src/theme/transforms.ts","../../src/theme/theme-applicator.ts","../../src/theme/defaults.ts"],"mappings":";;;;;;AAmBA;;;;;iBAAgB,UAAA,CAAW,KAAA,WAAgB,KAAA;;;;;;iBAiB3B,kBAAA,CAAmB,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,KAAA,GAAQ,KAAA;;;;;;;;iBAuBrD,cAAA,CAAe,IAAA,EAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,EAAW,KAAA;AAA/D;;;AAAA,iBAqEgB,iBAAA,CACd,IAAA,EAAM,iBAAA,EACN,KAAA,EAAO,eAAA,GACN,eAAA;;;;;;iBAmCa,kBAAA,CACd,GAAA,EAAK,eAAA,GACJ,MAAA,CAAO,iBAAA,EAAmB,eAAA;;;;;iBAwDb,YAAA,CAAa,GAAA,EAAK,eAAA,GAAkB,aAAA;;;UChHnC,uBAAA;;EAEf,gBAAA;ED/FF;ECiGE,iBAAA;AAAA;;;ADhFF;;;iBCwFgB,gBAAA,CACd,KAAA,EAAO,aAAA,EACP,OAAA,GAAS,uBAAA;;;;;;AD3GX;iBEiBgB,cAAA,CAAe,GAAA,EAAK,eAAA,GAAkB,YAAA;;;;AFAtD;;iBEsCgB,gBAAA,CACd,OAAA,EAAS,MAAA,oBACR,eAAA;;;;UC1Dc,WAAA;EACf,EAAA;EACA,MAAA,GAAS,MAAA;EACT,MAAA;EACA,IAAA;AAAA;;;;;iBAwFc,oBAAA,CAAqB,KAAA,EAAO,WAAA,GAAc,eAAA;;;;;iBAsB1C,eAAA,CAAgB,MAAA,EAAQ,WAAA,KAAgB,eAAA;;AHzExD;;;iBGwFgB,gBAAA,CAAiB,MAAA,EAAQ,WAAA;;;;;AHhIzC;;;;iBIPgB,UAAA,CACd,KAAA,EAAO,aAAA,EACP,OAAA,GAAU,uBAAA;AJsBZ;AAAA,iBIDgB,WAAA,CAAY,OAAA;;iBAMZ,eAAA,CAAA;;;cC9BH,kBAAA,EAAoB,MAAA,CAAO,WAAA;AAAA,cAS3B,qBAAA,EAAuB,MAAA,CAAO,aAAA;AAAA,cAK9B,eAAA;AAAA,cAEA,aAAA,EAAe,MAAA,CAAO,SAAA;AAAA,cAStB,cAAA;EAAA,SACX,UAAA;EAAA,SACA,UAAA;EAAA,SACA,OAAA;EAAA,SACA,SAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA;EAAA,SACA,WAAA;EAAA,SACA,eAAA;AAAA;AAAA,cAKW,gBAAA;AAAA,cACA,kBAAA;;;;;iBAQG,yBAAA,CAAA,GAA6B,eAAA"}
@@ -0,0 +1,131 @@
1
+ import { _ as ThemeDefinition, a as OklchPlain, c as ResolvedColorSet, d as SEMANTIC_COLOR_NAMES, f as SHADE_STEPS, g as ThemeColorPlain, h as ThemeColorInput, i as FontSizeKey, l as ResolvedSemanticColor, m as ShadeStep, n as FONT_SIZE_KEYS, o as RADIUS_KEYS, p as SemanticColorName, r as FontFamilyKey, s as RadiusKey, t as FONT_FAMILY_KEYS, u as ResolvedTheme, v as ThemePayload } from "../types-CeCPKvOv.mjs";
2
+ import Color from "colorjs.io";
3
+
4
+ //#region src/theme/color-engine.d.ts
5
+ /**
6
+ * Attempt to convert any string into a Color using colorjs.io.
7
+ * If the string is exactly 6 characters it is assumed to be a bare hex value
8
+ * (e.g. "3b82f6") and a "#" prefix is added before parsing.
9
+ *
10
+ * @returns the parsed Color, or a neutral gray (`oklch(0.5 0 0)`) on failure
11
+ */
12
+ declare function parseColor(value: string): Color;
13
+ /**
14
+ * Returns either the original foreground or a corrected lightness variant,
15
+ * whichever provides better contrast against `color`.
16
+ * Inversion triggers when the APCA contrast is below 50.
17
+ */
18
+ declare function getForegroundColor(foreground: Color, color: Color): Color;
19
+ /**
20
+ * Generate a 100–900 shade ramp from a base color.
21
+ * Base anchors at 500. Light shades (100–400) step toward white,
22
+ * dark shades (600–900) step toward black. Dark steps use an asymmetric
23
+ * multiplier (1.6×, 1.875×, 3×, 4× of `darkStep`) for a more gradual
24
+ * initial descent. Chroma is nudged per step for perceptually natural ramps.
25
+ */
26
+ declare function generateShades(base: Color): Record<ShadeStep, Color>;
27
+ /**
28
+ * Derive a dark-mode ThemeColorInput from its light-mode counterpart.
29
+ */
30
+ declare function deriveDarkVariant(name: SemanticColorName, light: ThemeColorInput): ThemeColorInput;
31
+ /**
32
+ * Merge auto-derived dark colors with any user-specified overrides.
33
+ * For each semantic color, if the user has fully overridden both base and
34
+ * foreground those are used; otherwise the missing channels are derived.
35
+ */
36
+ declare function mergeDarkOverrides(def: ThemeDefinition): Record<SemanticColorName, ThemeColorInput>;
37
+ /**
38
+ * Resolve a ThemeDefinition into a complete ResolvedTheme.
39
+ * Dark mode colors are derived from light where not overridden.
40
+ */
41
+ declare function resolveTheme(def: ThemeDefinition): ResolvedTheme;
42
+ //#endregion
43
+ //#region src/theme/css-generator.d.ts
44
+ interface GenerateThemeCSSOptions {
45
+ /** Whether or not to allow prefers-color-scheme to choose the theme mode */
46
+ disableAutoTheme?: boolean;
47
+ /** Whether to emit Tailwind built-in color overrides (default true) */
48
+ mapTailwindColors?: boolean;
49
+ }
50
+ /**
51
+ * Generate a complete CSS string for a resolved theme.
52
+ * Outputs 2–3 blocks: light default, dark explicit via `[data-theme-mode="dark"]`,
53
+ * and (unless `disableAutoTheme`) a `prefers-color-scheme: dark` media query block.
54
+ */
55
+ declare function generateThemeCSS(theme: ResolvedTheme, options?: GenerateThemeCSSOptions): string;
56
+ //#endregion
57
+ //#region src/theme/serialisation.d.ts
58
+ /**
59
+ * Serialise a ThemeDefinition (with Color objects) to a plain JSON payload
60
+ * suitable for backend storage.
61
+ */
62
+ declare function serialiseTheme(def: ThemeDefinition): ThemePayload;
63
+ /**
64
+ * Deserialise a backend payload into a ThemeDefinition with Color objects.
65
+ * Accepts `Record<string, unknown>` because API data is untyped at the boundary.
66
+ * Falls back to default colors for any missing light-mode entries.
67
+ */
68
+ declare function deserialiseTheme(payload: Record<string, unknown>): ThemeDefinition;
69
+ //#endregion
70
+ //#region src/theme/transforms.d.ts
71
+ /** Shape of a raw theme from the FluidOS API */
72
+ interface RawApiTheme {
73
+ id: number;
74
+ config?: Record<string, unknown> | null;
75
+ active?: boolean | null;
76
+ name?: string | null;
77
+ }
78
+ /**
79
+ * Build a ThemeDefinition from a single API theme object.
80
+ * Handles both new structured format and legacy flat format.
81
+ */
82
+ declare function buildThemeDefinition(theme: RawApiTheme): ThemeDefinition;
83
+ /**
84
+ * Transform raw API themes to ThemeDefinition[].
85
+ * Catches and logs errors per theme (graceful degradation).
86
+ */
87
+ declare function transformThemes(themes: RawApiTheme[]): ThemeDefinition[];
88
+ /**
89
+ * Get the active theme ID from a list of raw API themes.
90
+ * Falls back to the first theme if none is marked active.
91
+ */
92
+ declare function getActiveThemeId(themes: RawApiTheme[]): string | undefined;
93
+ //#endregion
94
+ //#region src/theme/theme-applicator.d.ts
95
+ /**
96
+ * Inject or update a `<style>` element in `<head>` for the given theme.
97
+ * The element ID is deterministic (`theme-style-{themeId}`) so repeated calls
98
+ * for the same theme are idempotent — the existing element is updated in place.
99
+ * No-op when `document` is unavailable (SSR).
100
+ */
101
+ declare function applyTheme(theme: ResolvedTheme, options?: GenerateThemeCSSOptions): void;
102
+ /** Remove an injected theme stylesheet. No-op during SSR. */
103
+ declare function removeTheme(themeId: string): void;
104
+ /** Remove all injected theme stylesheets. No-op during SSR. */
105
+ declare function removeAllThemes(): void;
106
+ //#endregion
107
+ //#region src/theme/defaults.d.ts
108
+ declare const DEFAULT_FONT_SIZES: Record<FontSizeKey, string>;
109
+ declare const DEFAULT_FONT_FAMILIES: Record<FontFamilyKey, string>;
110
+ declare const DEFAULT_SPACING = "0.25rem";
111
+ declare const DEFAULT_RADII: Record<RadiusKey, string>;
112
+ declare const DEFAULT_COLORS: {
113
+ readonly background: "#ffffff";
114
+ readonly foreground: "#1a1a1a";
115
+ readonly primary: "#3b82f6";
116
+ readonly secondary: "#6b7280";
117
+ readonly accent: "#10b981";
118
+ readonly muted: "#f3f4f6";
119
+ readonly destructive: "#ef4444";
120
+ readonly mutedForeground: "#6b7280";
121
+ };
122
+ declare const DEFAULT_THEME_ID = "default";
123
+ declare const DEFAULT_THEME_NAME = "Default Theme";
124
+ /**
125
+ * Build a fresh ThemeDefinition populated with all defaults.
126
+ * Returns a new object each call because Color instances are mutable — do not cache the result.
127
+ */
128
+ declare function getDefaultThemeDefinition(): ThemeDefinition;
129
+ //#endregion
130
+ export { DEFAULT_COLORS, DEFAULT_FONT_FAMILIES, DEFAULT_FONT_SIZES, DEFAULT_RADII, DEFAULT_SPACING, DEFAULT_THEME_ID, DEFAULT_THEME_NAME, FONT_FAMILY_KEYS, FONT_SIZE_KEYS, type FontFamilyKey, type FontSizeKey, type GenerateThemeCSSOptions, type OklchPlain, RADIUS_KEYS, type RadiusKey, type RawApiTheme, type ResolvedColorSet, type ResolvedSemanticColor, type ResolvedTheme, SEMANTIC_COLOR_NAMES, SHADE_STEPS, type SemanticColorName, type ShadeStep, type ThemeColorInput, type ThemeColorPlain, type ThemeDefinition, type ThemePayload, applyTheme, buildThemeDefinition, deriveDarkVariant, deserialiseTheme, generateShades, generateThemeCSS, getActiveThemeId, getDefaultThemeDefinition, getForegroundColor, mergeDarkOverrides, parseColor, removeAllThemes, removeTheme, resolveTheme, serialiseTheme, transformThemes };
131
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/theme/color-engine.ts","../../src/theme/css-generator.ts","../../src/theme/serialisation.ts","../../src/theme/transforms.ts","../../src/theme/theme-applicator.ts","../../src/theme/defaults.ts"],"mappings":";;;;;;AAmBA;;;;;iBAAgB,UAAA,CAAW,KAAA,WAAgB,KAAA;;;;;;iBAiB3B,kBAAA,CAAmB,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,KAAA,GAAQ,KAAA;;;;;;;;iBAuBrD,cAAA,CAAe,IAAA,EAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,EAAW,KAAA;AAA/D;;;AAAA,iBAqEgB,iBAAA,CACd,IAAA,EAAM,iBAAA,EACN,KAAA,EAAO,eAAA,GACN,eAAA;;;;;;iBAmCa,kBAAA,CACd,GAAA,EAAK,eAAA,GACJ,MAAA,CAAO,iBAAA,EAAmB,eAAA;;;;;iBAwDb,YAAA,CAAa,GAAA,EAAK,eAAA,GAAkB,aAAA;;;UChHnC,uBAAA;;EAEf,gBAAA;ED/FF;ECiGE,iBAAA;AAAA;;;ADhFF;;;iBCwFgB,gBAAA,CACd,KAAA,EAAO,aAAA,EACP,OAAA,GAAS,uBAAA;;;;;;AD3GX;iBEiBgB,cAAA,CAAe,GAAA,EAAK,eAAA,GAAkB,YAAA;;;;AFAtD;;iBEsCgB,gBAAA,CACd,OAAA,EAAS,MAAA,oBACR,eAAA;;;;UC1Dc,WAAA;EACf,EAAA;EACA,MAAA,GAAS,MAAA;EACT,MAAA;EACA,IAAA;AAAA;;;;;iBAwFc,oBAAA,CAAqB,KAAA,EAAO,WAAA,GAAc,eAAA;;;;;iBAsB1C,eAAA,CAAgB,MAAA,EAAQ,WAAA,KAAgB,eAAA;;AHzExD;;;iBGwFgB,gBAAA,CAAiB,MAAA,EAAQ,WAAA;;;;;AHhIzC;;;;iBIPgB,UAAA,CACd,KAAA,EAAO,aAAA,EACP,OAAA,GAAU,uBAAA;AJsBZ;AAAA,iBIDgB,WAAA,CAAY,OAAA;;iBAMZ,eAAA,CAAA;;;cC9BH,kBAAA,EAAoB,MAAA,CAAO,WAAA;AAAA,cAS3B,qBAAA,EAAuB,MAAA,CAAO,aAAA;AAAA,cAK9B,eAAA;AAAA,cAEA,aAAA,EAAe,MAAA,CAAO,SAAA;AAAA,cAStB,cAAA;EAAA,SACX,UAAA;EAAA,SACA,UAAA;EAAA,SACA,OAAA;EAAA,SACA,SAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA;EAAA,SACA,WAAA;EAAA,SACA,eAAA;AAAA;AAAA,cAKW,gBAAA;AAAA,cACA,kBAAA;;;;;iBAQG,yBAAA,CAAA,GAA6B,eAAA"}