@fluid-app/rep-core 0.1.13 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-CKQMccvm.cjs +28 -0
- package/dist/data-sources/DataAwareWidget.cjs +47 -56
- package/dist/data-sources/DataAwareWidget.cjs.map +1 -1
- package/dist/data-sources/DataAwareWidget.d.cts +27 -19
- package/dist/data-sources/DataAwareWidget.d.cts.map +1 -0
- package/dist/data-sources/DataAwareWidget.d.mts +38 -0
- package/dist/data-sources/DataAwareWidget.d.mts.map +1 -0
- package/dist/data-sources/DataAwareWidget.mjs +48 -0
- package/dist/data-sources/DataAwareWidget.mjs.map +1 -0
- package/dist/data-sources/ErrorState.cjs +18 -10
- package/dist/data-sources/ErrorState.cjs.map +1 -1
- package/dist/data-sources/ErrorState.d.cts +5 -3
- package/dist/data-sources/ErrorState.d.cts.map +1 -0
- package/dist/data-sources/ErrorState.d.mts +7 -0
- package/dist/data-sources/ErrorState.d.mts.map +1 -0
- package/dist/data-sources/ErrorState.mjs +18 -0
- package/dist/data-sources/ErrorState.mjs.map +1 -0
- package/dist/data-sources/context.cjs +22 -14
- package/dist/data-sources/context.cjs.map +1 -1
- package/dist/data-sources/context.d.cts +16 -10
- package/dist/data-sources/context.d.cts.map +1 -0
- package/dist/data-sources/context.d.mts +22 -0
- package/dist/data-sources/context.d.mts.map +1 -0
- package/dist/data-sources/context.mjs +21 -0
- package/dist/data-sources/context.mjs.map +1 -0
- package/dist/data-sources/fetchers/api.cjs +63 -10
- package/dist/data-sources/fetchers/api.cjs.map +1 -1
- package/dist/data-sources/fetchers/api.d.cts +4 -2
- package/dist/data-sources/fetchers/api.d.cts.map +1 -0
- package/dist/data-sources/fetchers/api.d.mts +10 -0
- package/dist/data-sources/fetchers/api.d.mts.map +1 -0
- package/dist/data-sources/fetchers/api.mjs +64 -0
- package/dist/data-sources/fetchers/api.mjs.map +1 -0
- package/dist/data-sources/fetchers/custom.cjs +106 -10
- package/dist/data-sources/fetchers/custom.cjs.map +1 -1
- package/dist/data-sources/fetchers/custom.d.cts +4 -2
- package/dist/data-sources/fetchers/custom.d.cts.map +1 -0
- package/dist/data-sources/fetchers/{custom.d.ts → custom.d.mts} +4 -2
- package/dist/data-sources/fetchers/custom.d.mts.map +1 -0
- package/dist/data-sources/fetchers/custom.mjs +107 -0
- package/dist/data-sources/fetchers/custom.mjs.map +1 -0
- package/dist/data-sources/fetchers/static.cjs +159 -14
- package/dist/data-sources/fetchers/static.cjs.map +1 -1
- package/dist/data-sources/fetchers/static.d.cts +12 -10
- package/dist/data-sources/fetchers/static.d.cts.map +1 -0
- package/dist/data-sources/fetchers/{static.d.ts → static.d.mts} +12 -10
- package/dist/data-sources/fetchers/static.d.mts.map +1 -0
- package/dist/data-sources/fetchers/static.mjs +158 -0
- package/dist/data-sources/fetchers/static.mjs.map +1 -0
- package/dist/data-sources/preview-context.cjs +15 -15
- package/dist/data-sources/preview-context.cjs.map +1 -1
- package/dist/data-sources/preview-context.d.cts +10 -6
- package/dist/data-sources/preview-context.d.cts.map +1 -0
- package/dist/data-sources/preview-context.d.mts +15 -0
- package/dist/data-sources/preview-context.d.mts.map +1 -0
- package/dist/data-sources/preview-context.mjs +18 -0
- package/dist/data-sources/preview-context.mjs.map +1 -0
- package/dist/data-sources/registry-context.cjs +51 -24
- package/dist/data-sources/registry-context.cjs.map +1 -1
- package/dist/data-sources/registry-context.d.cts +30 -22
- package/dist/data-sources/registry-context.d.cts.map +1 -0
- package/dist/data-sources/registry-context.d.mts +49 -0
- package/dist/data-sources/registry-context.d.mts.map +1 -0
- package/dist/data-sources/registry-context.mjs +49 -0
- package/dist/data-sources/registry-context.mjs.map +1 -0
- package/dist/data-sources/registry.cjs +29 -18
- package/dist/data-sources/registry.cjs.map +1 -1
- package/dist/data-sources/registry.d.cts +9 -7
- package/dist/data-sources/registry.d.cts.map +1 -0
- package/dist/data-sources/registry.d.mts +19 -0
- package/dist/data-sources/registry.d.mts.map +1 -0
- package/dist/data-sources/registry.mjs +29 -0
- package/dist/data-sources/registry.mjs.map +1 -0
- package/dist/data-sources/transformers.cjs +152 -10
- package/dist/data-sources/transformers.cjs.map +1 -1
- package/dist/data-sources/transformers.d.cts +4 -17
- package/dist/data-sources/transformers.d.cts.map +1 -0
- package/dist/data-sources/transformers.d.mts +10 -0
- package/dist/data-sources/transformers.d.mts.map +1 -0
- package/dist/data-sources/transformers.mjs +153 -0
- package/dist/data-sources/transformers.mjs.map +1 -0
- package/dist/data-sources/types.cjs +0 -4
- package/dist/data-sources/types.d.cts +2 -157
- package/dist/data-sources/types.d.mts +2 -0
- package/dist/data-sources/types.mjs +1 -0
- package/dist/data-sources/use-widget-data.cjs +109 -17
- package/dist/data-sources/use-widget-data.cjs.map +1 -1
- package/dist/data-sources/use-widget-data.d.cts +9 -8
- package/dist/data-sources/use-widget-data.d.cts.map +1 -0
- package/dist/data-sources/use-widget-data.d.mts +17 -0
- package/dist/data-sources/use-widget-data.d.mts.map +1 -0
- package/dist/data-sources/use-widget-data.mjs +109 -0
- package/dist/data-sources/use-widget-data.mjs.map +1 -0
- package/dist/index-Bxe_LIi8.d.cts +287 -0
- package/dist/index-Bxe_LIi8.d.cts.map +1 -0
- package/dist/index-CCAu2n19.d.mts +287 -0
- package/dist/index-CCAu2n19.d.mts.map +1 -0
- package/dist/registries/index.cjs +212 -127
- package/dist/registries/index.cjs.map +1 -1
- package/dist/registries/index.d.cts +146 -149
- package/dist/registries/index.d.cts.map +1 -0
- package/dist/registries/{index.d.ts → index.d.mts} +146 -149
- package/dist/registries/index.d.mts.map +1 -0
- package/dist/registries/index.mjs +229 -0
- package/dist/registries/index.mjs.map +1 -0
- package/dist/shell/AppShellLayout.cjs +47 -12
- package/dist/shell/AppShellLayout.cjs.map +1 -1
- package/dist/shell/AppShellLayout.d.cts +29 -19
- package/dist/shell/AppShellLayout.d.cts.map +1 -0
- package/dist/shell/AppShellLayout.d.mts +40 -0
- package/dist/shell/AppShellLayout.d.mts.map +1 -0
- package/dist/shell/AppShellLayout.mjs +46 -0
- package/dist/{chunk-45BCVWQK.cjs.map → shell/AppShellLayout.mjs.map} +1 -1
- package/dist/shell/ScreenHeader.cjs +44 -0
- package/dist/shell/ScreenHeader.cjs.map +1 -0
- package/dist/shell/ScreenHeader.d.cts +12 -0
- package/dist/shell/ScreenHeader.d.cts.map +1 -0
- package/dist/shell/ScreenHeader.d.mts +12 -0
- package/dist/shell/ScreenHeader.d.mts.map +1 -0
- package/dist/shell/ScreenHeader.mjs +42 -0
- package/dist/shell/ScreenHeader.mjs.map +1 -0
- package/dist/shell/ScreenHeaderContext.cjs +91 -0
- package/dist/shell/ScreenHeaderContext.cjs.map +1 -0
- package/dist/shell/ScreenHeaderContext.d.cts +36 -0
- package/dist/shell/ScreenHeaderContext.d.cts.map +1 -0
- package/dist/shell/ScreenHeaderContext.d.mts +36 -0
- package/dist/shell/ScreenHeaderContext.d.mts.map +1 -0
- package/dist/shell/ScreenHeaderContext.mjs +86 -0
- package/dist/shell/ScreenHeaderContext.mjs.map +1 -0
- package/dist/shell/ThemeModeContext.cjs +68 -18
- package/dist/shell/ThemeModeContext.cjs.map +1 -1
- package/dist/shell/ThemeModeContext.d.cts +23 -16
- package/dist/shell/ThemeModeContext.d.cts.map +1 -0
- package/dist/shell/ThemeModeContext.d.mts +34 -0
- package/dist/shell/ThemeModeContext.d.mts.map +1 -0
- package/dist/shell/ThemeModeContext.mjs +66 -0
- package/dist/shell/ThemeModeContext.mjs.map +1 -0
- package/dist/shell/index.cjs +43 -205
- package/dist/shell/index.d.cts +7 -43
- package/dist/shell/index.d.mts +7 -0
- package/dist/shell/index.mjs +7 -0
- package/dist/shell/sidebar.cjs +372 -87
- package/dist/shell/sidebar.cjs.map +1 -1
- package/dist/shell/sidebar.d.cts +38 -36
- package/dist/shell/sidebar.d.cts.map +1 -0
- package/dist/shell/{sidebar.d.ts → sidebar.d.mts} +38 -36
- package/dist/shell/sidebar.d.mts.map +1 -0
- package/dist/shell/sidebar.mjs +364 -0
- package/dist/{chunk-PFDBULOI.cjs.map → shell/sidebar.mjs.map} +1 -1
- package/dist/shell/use-mobile.cjs +49 -18
- package/dist/shell/use-mobile.cjs.map +1 -1
- package/dist/shell/use-mobile.d.cts +3 -1
- package/dist/shell/use-mobile.d.cts.map +1 -0
- package/dist/shell/{use-mobile.d.ts → use-mobile.d.mts} +3 -1
- package/dist/shell/use-mobile.d.mts.map +1 -0
- package/dist/shell/use-mobile.mjs +47 -0
- package/dist/shell/use-mobile.mjs.map +1 -0
- package/dist/theme/index.cjs +662 -549
- package/dist/theme/index.cjs.map +1 -1
- package/dist/theme/index.d.cts +32 -32
- package/dist/theme/index.d.cts.map +1 -0
- package/dist/theme/{index.d.ts → index.d.mts} +32 -32
- package/dist/theme/index.d.mts.map +1 -0
- package/dist/theme/index.mjs +727 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/types/index.cjs +18 -72
- package/dist/types/index.d.cts +4 -268
- package/dist/types/index.d.mts +4 -0
- package/dist/types/index.mjs +2 -0
- package/dist/types-BIXtQlHB.d.cts +155 -0
- package/dist/types-BIXtQlHB.d.cts.map +1 -0
- package/dist/types-BXFX9bXp.cjs +303 -0
- package/dist/types-BXFX9bXp.cjs.map +1 -0
- package/dist/types-Bjmd7Fdx.mjs +208 -0
- package/dist/types-Bjmd7Fdx.mjs.map +1 -0
- package/dist/types-ByG6Xy3C.d.mts +85 -0
- package/dist/types-ByG6Xy3C.d.mts.map +1 -0
- package/dist/types-C5OFJy-O.d.mts +155 -0
- package/dist/types-C5OFJy-O.d.mts.map +1 -0
- package/dist/types-Ctu-Zio6.d.cts +85 -0
- package/dist/types-Ctu-Zio6.d.cts.map +1 -0
- package/dist/{widget-schema-D-ca3--K.d.ts → widget-schema--PY1uMWx.d.cts} +38 -41
- package/dist/widget-schema--PY1uMWx.d.cts.map +1 -0
- package/dist/{widget-schema-DvJdg1-B.d.cts → widget-schema-YkD5p3v4.d.mts} +38 -41
- package/dist/widget-schema-YkD5p3v4.d.mts.map +1 -0
- package/dist/widget-utils/index.cjs +96 -89
- package/dist/widget-utils/index.cjs.map +1 -1
- package/dist/widget-utils/index.d.cts +8 -6
- package/dist/widget-utils/index.d.cts.map +1 -0
- package/dist/widget-utils/{index.d.ts → index.d.mts} +8 -6
- package/dist/widget-utils/index.d.mts.map +1 -0
- package/dist/widget-utils/index.mjs +119 -0
- package/dist/widget-utils/index.mjs.map +1 -0
- package/package.json +4 -4
- package/dist/chunk-2SPTFZRC.js +0 -72
- package/dist/chunk-2SPTFZRC.js.map +0 -1
- package/dist/chunk-3I5Y3PEO.js +0 -23
- package/dist/chunk-3I5Y3PEO.js.map +0 -1
- package/dist/chunk-3ZRE7GX6.js +0 -620
- package/dist/chunk-3ZRE7GX6.js.map +0 -1
- package/dist/chunk-45BCVWQK.cjs +0 -38
- package/dist/chunk-46PUWB7C.cjs +0 -69
- package/dist/chunk-46PUWB7C.cjs.map +0 -1
- package/dist/chunk-5NYM4UTW.cjs +0 -58
- package/dist/chunk-5NYM4UTW.cjs.map +0 -1
- package/dist/chunk-B2NTWEDF.cjs +0 -130
- package/dist/chunk-B2NTWEDF.cjs.map +0 -1
- package/dist/chunk-GDY76JA6.cjs +0 -153
- package/dist/chunk-GDY76JA6.cjs.map +0 -1
- package/dist/chunk-HGVSPZEL.cjs +0 -119
- package/dist/chunk-HGVSPZEL.cjs.map +0 -1
- package/dist/chunk-HIDJYVKJ.js +0 -54
- package/dist/chunk-HIDJYVKJ.js.map +0 -1
- package/dist/chunk-KTXGU7OP.cjs +0 -136
- package/dist/chunk-KTXGU7OP.cjs.map +0 -1
- package/dist/chunk-KW5E2H5T.js +0 -128
- package/dist/chunk-KW5E2H5T.js.map +0 -1
- package/dist/chunk-LBLHDGMT.js +0 -25
- package/dist/chunk-LBLHDGMT.js.map +0 -1
- package/dist/chunk-MNVDL4FX.js +0 -134
- package/dist/chunk-MNVDL4FX.js.map +0 -1
- package/dist/chunk-MOTOSPAO.cjs +0 -15
- package/dist/chunk-MOTOSPAO.cjs.map +0 -1
- package/dist/chunk-N2K6W7FX.cjs +0 -169
- package/dist/chunk-N2K6W7FX.cjs.map +0 -1
- package/dist/chunk-PFDBULOI.cjs +0 -665
- package/dist/chunk-PVTQWD4I.js +0 -166
- package/dist/chunk-PVTQWD4I.js.map +0 -1
- package/dist/chunk-SJQPHJL4.cjs +0 -26
- package/dist/chunk-SJQPHJL4.cjs.map +0 -1
- package/dist/chunk-TML66UEU.js +0 -13
- package/dist/chunk-TML66UEU.js.map +0 -1
- package/dist/chunk-U3CQLX2Z.cjs +0 -28
- package/dist/chunk-U3CQLX2Z.cjs.map +0 -1
- package/dist/chunk-UUNEVOA5.js +0 -36
- package/dist/chunk-UUNEVOA5.js.map +0 -1
- package/dist/chunk-VRF7QEID.js +0 -67
- package/dist/chunk-VRF7QEID.js.map +0 -1
- package/dist/chunk-VSZWXSQA.js +0 -38
- package/dist/chunk-VSZWXSQA.js.map +0 -1
- package/dist/chunk-WYOHFNNW.js +0 -117
- package/dist/chunk-WYOHFNNW.js.map +0 -1
- package/dist/chunk-YKF5ZFF5.js +0 -136
- package/dist/chunk-YKF5ZFF5.js.map +0 -1
- package/dist/chunk-YXJMBVXO.cjs +0 -76
- package/dist/chunk-YXJMBVXO.cjs.map +0 -1
- package/dist/chunk-ZA4AE7KF.cjs +0 -42
- package/dist/chunk-ZA4AE7KF.cjs.map +0 -1
- package/dist/data-sources/DataAwareWidget.d.ts +0 -30
- package/dist/data-sources/DataAwareWidget.js +0 -57
- package/dist/data-sources/DataAwareWidget.js.map +0 -1
- package/dist/data-sources/ErrorState.d.ts +0 -5
- package/dist/data-sources/ErrorState.js +0 -3
- package/dist/data-sources/ErrorState.js.map +0 -1
- package/dist/data-sources/context.d.ts +0 -16
- package/dist/data-sources/context.js +0 -3
- package/dist/data-sources/context.js.map +0 -1
- package/dist/data-sources/fetchers/api.d.ts +0 -8
- package/dist/data-sources/fetchers/api.js +0 -3
- package/dist/data-sources/fetchers/api.js.map +0 -1
- package/dist/data-sources/fetchers/custom.js +0 -3
- package/dist/data-sources/fetchers/custom.js.map +0 -1
- package/dist/data-sources/fetchers/static.js +0 -3
- package/dist/data-sources/fetchers/static.js.map +0 -1
- package/dist/data-sources/preview-context.d.ts +0 -11
- package/dist/data-sources/preview-context.js +0 -18
- package/dist/data-sources/preview-context.js.map +0 -1
- package/dist/data-sources/registry-context.d.ts +0 -41
- package/dist/data-sources/registry-context.js +0 -9
- package/dist/data-sources/registry-context.js.map +0 -1
- package/dist/data-sources/registry.d.ts +0 -17
- package/dist/data-sources/registry.js +0 -7
- package/dist/data-sources/registry.js.map +0 -1
- package/dist/data-sources/transformers.d.ts +0 -23
- package/dist/data-sources/transformers.js +0 -3
- package/dist/data-sources/transformers.js.map +0 -1
- package/dist/data-sources/types.cjs.map +0 -1
- package/dist/data-sources/types.d.ts +0 -157
- package/dist/data-sources/types.js +0 -3
- package/dist/data-sources/types.js.map +0 -1
- package/dist/data-sources/use-widget-data.d.ts +0 -16
- package/dist/data-sources/use-widget-data.js +0 -10
- package/dist/data-sources/use-widget-data.js.map +0 -1
- package/dist/registries/index.js +0 -144
- package/dist/registries/index.js.map +0 -1
- package/dist/shareable-item-DkgWpwoU.d.cts +0 -21
- package/dist/shareable-item-DkgWpwoU.d.ts +0 -21
- package/dist/shell/AppShellLayout.d.ts +0 -30
- package/dist/shell/AppShellLayout.js +0 -5
- package/dist/shell/AppShellLayout.js.map +0 -1
- package/dist/shell/ThemeModeContext.d.ts +0 -27
- package/dist/shell/ThemeModeContext.js +0 -3
- package/dist/shell/ThemeModeContext.js.map +0 -1
- package/dist/shell/index.cjs.map +0 -1
- package/dist/shell/index.d.ts +0 -43
- package/dist/shell/index.js +0 -76
- package/dist/shell/index.js.map +0 -1
- package/dist/shell/sidebar.js +0 -4
- package/dist/shell/sidebar.js.map +0 -1
- package/dist/shell/use-mobile.js +0 -3
- package/dist/shell/use-mobile.js.map +0 -1
- package/dist/theme/index.js +0 -611
- package/dist/theme/index.js.map +0 -1
- package/dist/types/index.cjs.map +0 -1
- package/dist/types/index.d.ts +0 -268
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
- package/dist/types-CNIhy4JD.d.cts +0 -83
- package/dist/types-CNIhy4JD.d.ts +0 -83
- package/dist/widget-utils/index.js +0 -111
- package/dist/widget-utils/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"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 rep-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 rep-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 ...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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"}
|
package/dist/types/index.cjs
CHANGED
|
@@ -1,72 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
Object.defineProperty(exports, "COLOR_OPTIONS", {
|
|
20
|
-
enumerable: true,
|
|
21
|
-
get: function () { return chunkGDY76JA6_cjs.COLOR_OPTIONS; }
|
|
22
|
-
});
|
|
23
|
-
Object.defineProperty(exports, "FONT_SIZE_OPTIONS", {
|
|
24
|
-
enumerable: true,
|
|
25
|
-
get: function () { return chunkGDY76JA6_cjs.FONT_SIZE_OPTIONS; }
|
|
26
|
-
});
|
|
27
|
-
Object.defineProperty(exports, "GAP_OPTIONS", {
|
|
28
|
-
enumerable: true,
|
|
29
|
-
get: function () { return chunkGDY76JA6_cjs.GAP_OPTIONS; }
|
|
30
|
-
});
|
|
31
|
-
Object.defineProperty(exports, "HORIZONTAL_ALIGN_OPTIONS", {
|
|
32
|
-
enumerable: true,
|
|
33
|
-
get: function () { return chunkGDY76JA6_cjs.HORIZONTAL_ALIGN_OPTIONS; }
|
|
34
|
-
});
|
|
35
|
-
Object.defineProperty(exports, "PADDING_VALUES", {
|
|
36
|
-
enumerable: true,
|
|
37
|
-
get: function () { return chunkGDY76JA6_cjs.PADDING_VALUES; }
|
|
38
|
-
});
|
|
39
|
-
Object.defineProperty(exports, "SECTION_LAYOUT_CONFIG", {
|
|
40
|
-
enumerable: true,
|
|
41
|
-
get: function () { return chunkGDY76JA6_cjs.SECTION_LAYOUT_CONFIG; }
|
|
42
|
-
});
|
|
43
|
-
Object.defineProperty(exports, "VERTICAL_ALIGN_OPTIONS", {
|
|
44
|
-
enumerable: true,
|
|
45
|
-
get: function () { return chunkGDY76JA6_cjs.VERTICAL_ALIGN_OPTIONS; }
|
|
46
|
-
});
|
|
47
|
-
Object.defineProperty(exports, "WIDGET_TYPE_NAMES", {
|
|
48
|
-
enumerable: true,
|
|
49
|
-
get: function () { return chunkGDY76JA6_cjs.WIDGET_TYPE_NAMES; }
|
|
50
|
-
});
|
|
51
|
-
Object.defineProperty(exports, "assertDefined", {
|
|
52
|
-
enumerable: true,
|
|
53
|
-
get: function () { return chunkGDY76JA6_cjs.assertDefined; }
|
|
54
|
-
});
|
|
55
|
-
Object.defineProperty(exports, "assertNever", {
|
|
56
|
-
enumerable: true,
|
|
57
|
-
get: function () { return chunkGDY76JA6_cjs.assertNever; }
|
|
58
|
-
});
|
|
59
|
-
Object.defineProperty(exports, "isWidgetType", {
|
|
60
|
-
enumerable: true,
|
|
61
|
-
get: function () { return chunkGDY76JA6_cjs.isWidgetType; }
|
|
62
|
-
});
|
|
63
|
-
Object.defineProperty(exports, "isWidgetTypeName", {
|
|
64
|
-
enumerable: true,
|
|
65
|
-
get: function () { return chunkGDY76JA6_cjs.isWidgetTypeName; }
|
|
66
|
-
});
|
|
67
|
-
Object.defineProperty(exports, "sectionLayoutConfig", {
|
|
68
|
-
enumerable: true,
|
|
69
|
-
get: function () { return chunkGDY76JA6_cjs.sectionLayoutConfig; }
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=index.cjs.map
|
|
72
|
-
//# sourceMappingURL=index.cjs.map
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_types = require("../types-BXFX9bXp.cjs");
|
|
3
|
+
exports.BACKGROUND_TYPES = require_types.BACKGROUND_TYPES;
|
|
4
|
+
exports.BORDER_RADIUS_OPTIONS = require_types.BORDER_RADIUS_OPTIONS;
|
|
5
|
+
exports.BUTTON_SIZE_OPTIONS = require_types.BUTTON_SIZE_OPTIONS;
|
|
6
|
+
exports.COLOR_OPTIONS = require_types.COLOR_OPTIONS;
|
|
7
|
+
exports.FONT_SIZE_OPTIONS = require_types.FONT_SIZE_OPTIONS;
|
|
8
|
+
exports.GAP_OPTIONS = require_types.GAP_OPTIONS;
|
|
9
|
+
exports.HORIZONTAL_ALIGN_OPTIONS = require_types.HORIZONTAL_ALIGN_OPTIONS;
|
|
10
|
+
exports.PADDING_VALUES = require_types.PADDING_VALUES;
|
|
11
|
+
exports.SECTION_LAYOUT_CONFIG = require_types.SECTION_LAYOUT_CONFIG;
|
|
12
|
+
exports.VERTICAL_ALIGN_OPTIONS = require_types.VERTICAL_ALIGN_OPTIONS;
|
|
13
|
+
exports.WIDGET_TYPE_NAMES = require_types.WIDGET_TYPE_NAMES;
|
|
14
|
+
exports.assertDefined = require_types.assertDefined;
|
|
15
|
+
exports.assertNever = require_types.assertNever;
|
|
16
|
+
exports.isWidgetType = require_types.isWidgetType;
|
|
17
|
+
exports.isWidgetTypeName = require_types.isWidgetTypeName;
|
|
18
|
+
exports.sectionLayoutConfig = require_types.sectionLayoutConfig;
|
package/dist/types/index.d.cts
CHANGED
|
@@ -1,268 +1,4 @@
|
|
|
1
|
-
import { a as WidgetSchema } from
|
|
2
|
-
|
|
3
|
-
import { b as
|
|
4
|
-
export {
|
|
5
|
-
import { components } from '@fluid-app/fluidos-api-client';
|
|
6
|
-
import { S as ShareableItem } from '../shareable-item-DkgWpwoU.cjs';
|
|
7
|
-
import 'react';
|
|
8
|
-
import '../data-sources/types.cjs';
|
|
9
|
-
import 'colorjs.io';
|
|
10
|
-
|
|
11
|
-
/** The API schema type — single source of truth for navigation item fields. */
|
|
12
|
-
type ApiNavigationItem = components["schemas"]["FluidOSNavigationItem"];
|
|
13
|
-
/**
|
|
14
|
-
* Strip `null` from a union type, converting `T | null` → `T`.
|
|
15
|
-
* Used to convert API's null convention to rep-core's undefined convention.
|
|
16
|
-
*/
|
|
17
|
-
type StripNull<T> = Exclude<T, null>;
|
|
18
|
-
/**
|
|
19
|
-
* Navigation item in the sidebar/menu structure.
|
|
20
|
-
*
|
|
21
|
-
* Derived from `FluidOSNavigationItem` (the API schema) so field types
|
|
22
|
-
* track upstream changes. Differences from the API type:
|
|
23
|
-
* - `id` is optional (system/default items may not have one)
|
|
24
|
-
* - `label` is required (transforms default null to "Untitled")
|
|
25
|
-
* - `section` is a frontend-only extension (not in API)
|
|
26
|
-
* - Nullable fields use `undefined` instead of `null` (except `parent_id`)
|
|
27
|
-
*/
|
|
28
|
-
interface NavigationItem {
|
|
29
|
-
/** Database-generated identifier — optional because system/default items may not have one */
|
|
30
|
-
readonly id?: ApiNavigationItem["id"];
|
|
31
|
-
/** URL slug for routing */
|
|
32
|
-
slug?: StripNull<ApiNavigationItem["slug"]>;
|
|
33
|
-
/** Display label — required; transforms default null API values to "Untitled" */
|
|
34
|
-
label: string;
|
|
35
|
-
/** Icon identifier (e.g., FontAwesome name) */
|
|
36
|
-
icon?: StripNull<ApiNavigationItem["icon"]>;
|
|
37
|
-
/** Section grouping for quick links (frontend-only, not in API) */
|
|
38
|
-
section?: string;
|
|
39
|
-
/** Associated screen ID */
|
|
40
|
-
screen_id?: StripNull<ApiNavigationItem["screen_id"]>;
|
|
41
|
-
/** Sort order */
|
|
42
|
-
position?: StripNull<ApiNavigationItem["position"]>;
|
|
43
|
-
/** Parent navigation item ID (null for root items) */
|
|
44
|
-
parent_id?: ApiNavigationItem["parent_id"];
|
|
45
|
-
/** Origin of this navigation item */
|
|
46
|
-
source?: ApiNavigationItem["source"];
|
|
47
|
-
/** Nested navigation items */
|
|
48
|
-
children: NavigationItem[];
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Screen definition with its component tree
|
|
52
|
-
*/
|
|
53
|
-
interface ScreenDefinition {
|
|
54
|
-
readonly id: number;
|
|
55
|
-
slug: string;
|
|
56
|
-
name: string;
|
|
57
|
-
component_tree: WidgetSchema[];
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Navigation configuration for the rep portal
|
|
61
|
-
*/
|
|
62
|
-
interface Navigation {
|
|
63
|
-
readonly definition_id: number;
|
|
64
|
-
readonly id: number;
|
|
65
|
-
name: string;
|
|
66
|
-
navigation_items: NavigationItem[];
|
|
67
|
-
screens: ScreenDefinition[];
|
|
68
|
-
}
|
|
69
|
-
/** A rep app profile — themes, navigation, and definition reference. */
|
|
70
|
-
interface RepAppProfile {
|
|
71
|
-
name: string;
|
|
72
|
-
themes: ThemeDefinition[];
|
|
73
|
-
activeThemeId?: string;
|
|
74
|
-
navigation: Navigation;
|
|
75
|
-
mobile_navigation?: Navigation;
|
|
76
|
-
definition_id: number;
|
|
77
|
-
}
|
|
78
|
-
/** Full rep app data returned by the fluidos API or builder preview. */
|
|
79
|
-
interface RepAppData {
|
|
80
|
-
definition_id: number;
|
|
81
|
-
published_version: number;
|
|
82
|
-
screens: ScreenDefinition[];
|
|
83
|
-
profile: RepAppProfile;
|
|
84
|
-
}
|
|
85
|
-
/** Wrapper for the `/fluid_os/definitions/active` API response. */
|
|
86
|
-
interface RepAppManifest {
|
|
87
|
-
manifest: RepAppData;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Color options constant - single source of truth for color values.
|
|
92
|
-
* Use COLOR_OPTIONS.primary instead of "primary" for type-safe comparisons.
|
|
93
|
-
*/
|
|
94
|
-
declare const COLOR_OPTIONS: {
|
|
95
|
-
readonly background: "background";
|
|
96
|
-
readonly foreground: "foreground";
|
|
97
|
-
readonly primary: "primary";
|
|
98
|
-
readonly secondary: "secondary";
|
|
99
|
-
readonly accent: "accent";
|
|
100
|
-
readonly muted: "muted";
|
|
101
|
-
readonly destructive: "destructive";
|
|
102
|
-
};
|
|
103
|
-
/**
|
|
104
|
-
* Union type of all color options, derived from COLOR_OPTIONS constant.
|
|
105
|
-
* @see deriving-typeof-for-object-keys pattern
|
|
106
|
-
*/
|
|
107
|
-
type ColorOptions = (typeof COLOR_OPTIONS)[keyof typeof COLOR_OPTIONS];
|
|
108
|
-
declare const FONT_SIZE_OPTIONS: {
|
|
109
|
-
readonly "2xl": "2xl";
|
|
110
|
-
readonly xl: "xl";
|
|
111
|
-
readonly lg: "lg";
|
|
112
|
-
readonly md: "md";
|
|
113
|
-
readonly sm: "sm";
|
|
114
|
-
readonly xs: "xs";
|
|
115
|
-
};
|
|
116
|
-
type FontSizeOptions = (typeof FONT_SIZE_OPTIONS)[keyof typeof FONT_SIZE_OPTIONS];
|
|
117
|
-
declare const BORDER_RADIUS_OPTIONS: {
|
|
118
|
-
readonly none: "none";
|
|
119
|
-
readonly sm: "sm";
|
|
120
|
-
readonly md: "md";
|
|
121
|
-
readonly lg: "lg";
|
|
122
|
-
readonly xl: "xl";
|
|
123
|
-
readonly full: "full";
|
|
124
|
-
};
|
|
125
|
-
type BorderRadiusOptions = (typeof BORDER_RADIUS_OPTIONS)[keyof typeof BORDER_RADIUS_OPTIONS];
|
|
126
|
-
/** Padding values - numeric, so we use a tuple for derivation */
|
|
127
|
-
declare const PADDING_VALUES: readonly [0, 2, 4, 6, 8, 10];
|
|
128
|
-
type PaddingOptions = (typeof PADDING_VALUES)[number];
|
|
129
|
-
declare const BUTTON_SIZE_OPTIONS: {
|
|
130
|
-
readonly sm: "sm";
|
|
131
|
-
readonly default: "default";
|
|
132
|
-
readonly lg: "lg";
|
|
133
|
-
readonly xl: "xl";
|
|
134
|
-
};
|
|
135
|
-
type ButtonSizeOptions = (typeof BUTTON_SIZE_OPTIONS)[keyof typeof BUTTON_SIZE_OPTIONS];
|
|
136
|
-
declare const GAP_OPTIONS: {
|
|
137
|
-
readonly none: "none";
|
|
138
|
-
readonly xs: "xs";
|
|
139
|
-
readonly sm: "sm";
|
|
140
|
-
readonly md: "md";
|
|
141
|
-
readonly lg: "lg";
|
|
142
|
-
readonly xl: "xl";
|
|
143
|
-
};
|
|
144
|
-
type GapOptions = (typeof GAP_OPTIONS)[keyof typeof GAP_OPTIONS];
|
|
145
|
-
declare const VERTICAL_ALIGN_OPTIONS: {
|
|
146
|
-
readonly top: "top";
|
|
147
|
-
readonly center: "center";
|
|
148
|
-
readonly bottom: "bottom";
|
|
149
|
-
};
|
|
150
|
-
type VerticalAlign = (typeof VERTICAL_ALIGN_OPTIONS)[keyof typeof VERTICAL_ALIGN_OPTIONS];
|
|
151
|
-
declare const HORIZONTAL_ALIGN_OPTIONS: {
|
|
152
|
-
readonly left: "left";
|
|
153
|
-
readonly center: "center";
|
|
154
|
-
readonly right: "right";
|
|
155
|
-
};
|
|
156
|
-
type HorizontalAlign = (typeof HORIZONTAL_ALIGN_OPTIONS)[keyof typeof HORIZONTAL_ALIGN_OPTIONS];
|
|
157
|
-
type AlignOptions = {
|
|
158
|
-
vertical?: VerticalAlign;
|
|
159
|
-
horizontal?: HorizontalAlign;
|
|
160
|
-
};
|
|
161
|
-
declare const BACKGROUND_TYPES: {
|
|
162
|
-
readonly solid: "solid";
|
|
163
|
-
readonly image: "image";
|
|
164
|
-
};
|
|
165
|
-
type BackgroundType = (typeof BACKGROUND_TYPES)[keyof typeof BACKGROUND_TYPES];
|
|
166
|
-
interface BackgroundValue {
|
|
167
|
-
type: BackgroundType;
|
|
168
|
-
color?: ColorOptions;
|
|
169
|
-
resource?: ShareableItem;
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Section layout configuration - single source of truth for layout types.
|
|
173
|
-
* SectionLayoutType is derived from these keys to prevent drift.
|
|
174
|
-
*/
|
|
175
|
-
declare const SECTION_LAYOUT_CONFIG: {
|
|
176
|
-
readonly "single-column": {
|
|
177
|
-
readonly columns: 1;
|
|
178
|
-
readonly widths: readonly ["1fr"];
|
|
179
|
-
readonly gridClasses: "";
|
|
180
|
-
};
|
|
181
|
-
readonly "2c-equal": {
|
|
182
|
-
readonly columns: 2;
|
|
183
|
-
readonly widths: readonly ["1fr", "1fr"];
|
|
184
|
-
readonly gridClasses: "@md:grid-cols-2";
|
|
185
|
-
};
|
|
186
|
-
readonly "2c-left-wider": {
|
|
187
|
-
readonly columns: 2;
|
|
188
|
-
readonly widths: readonly ["2fr", "1fr"];
|
|
189
|
-
readonly gridClasses: "@md:grid-cols-[2fr_1fr]";
|
|
190
|
-
};
|
|
191
|
-
readonly "2c-right-wider": {
|
|
192
|
-
readonly columns: 2;
|
|
193
|
-
readonly widths: readonly ["1fr", "2fr"];
|
|
194
|
-
readonly gridClasses: "@md:grid-cols-[1fr_2fr]";
|
|
195
|
-
};
|
|
196
|
-
readonly "2c-left-narrow": {
|
|
197
|
-
readonly columns: 2;
|
|
198
|
-
readonly widths: readonly ["1fr", "3fr"];
|
|
199
|
-
readonly gridClasses: "@md:grid-cols-[1fr_3fr]";
|
|
200
|
-
};
|
|
201
|
-
readonly "2c-right-narrow": {
|
|
202
|
-
readonly columns: 2;
|
|
203
|
-
readonly widths: readonly ["3fr", "1fr"];
|
|
204
|
-
readonly gridClasses: "@md:grid-cols-[3fr_1fr]";
|
|
205
|
-
};
|
|
206
|
-
readonly "3c-equal": {
|
|
207
|
-
readonly columns: 3;
|
|
208
|
-
readonly widths: readonly ["1fr", "1fr", "1fr"];
|
|
209
|
-
readonly gridClasses: "@md:grid-cols-3";
|
|
210
|
-
};
|
|
211
|
-
readonly "3c-middle-wider": {
|
|
212
|
-
readonly columns: 3;
|
|
213
|
-
readonly widths: readonly ["1fr", "2fr", "1fr"];
|
|
214
|
-
readonly gridClasses: "@md:grid-cols-[1fr_2fr_1fr]";
|
|
215
|
-
};
|
|
216
|
-
};
|
|
217
|
-
/**
|
|
218
|
-
* Union type of all section layout types, derived from SECTION_LAYOUT_CONFIG keys.
|
|
219
|
-
* @see deriving-typeof-for-object-keys pattern
|
|
220
|
-
*/
|
|
221
|
-
type SectionLayoutType = keyof typeof SECTION_LAYOUT_CONFIG;
|
|
222
|
-
/** @deprecated Use SECTION_LAYOUT_CONFIG instead */
|
|
223
|
-
declare const sectionLayoutConfig: {
|
|
224
|
-
readonly "single-column": {
|
|
225
|
-
readonly columns: 1;
|
|
226
|
-
readonly widths: readonly ["1fr"];
|
|
227
|
-
readonly gridClasses: "";
|
|
228
|
-
};
|
|
229
|
-
readonly "2c-equal": {
|
|
230
|
-
readonly columns: 2;
|
|
231
|
-
readonly widths: readonly ["1fr", "1fr"];
|
|
232
|
-
readonly gridClasses: "@md:grid-cols-2";
|
|
233
|
-
};
|
|
234
|
-
readonly "2c-left-wider": {
|
|
235
|
-
readonly columns: 2;
|
|
236
|
-
readonly widths: readonly ["2fr", "1fr"];
|
|
237
|
-
readonly gridClasses: "@md:grid-cols-[2fr_1fr]";
|
|
238
|
-
};
|
|
239
|
-
readonly "2c-right-wider": {
|
|
240
|
-
readonly columns: 2;
|
|
241
|
-
readonly widths: readonly ["1fr", "2fr"];
|
|
242
|
-
readonly gridClasses: "@md:grid-cols-[1fr_2fr]";
|
|
243
|
-
};
|
|
244
|
-
readonly "2c-left-narrow": {
|
|
245
|
-
readonly columns: 2;
|
|
246
|
-
readonly widths: readonly ["1fr", "3fr"];
|
|
247
|
-
readonly gridClasses: "@md:grid-cols-[1fr_3fr]";
|
|
248
|
-
};
|
|
249
|
-
readonly "2c-right-narrow": {
|
|
250
|
-
readonly columns: 2;
|
|
251
|
-
readonly widths: readonly ["3fr", "1fr"];
|
|
252
|
-
readonly gridClasses: "@md:grid-cols-[3fr_1fr]";
|
|
253
|
-
};
|
|
254
|
-
readonly "3c-equal": {
|
|
255
|
-
readonly columns: 3;
|
|
256
|
-
readonly widths: readonly ["1fr", "1fr", "1fr"];
|
|
257
|
-
readonly gridClasses: "@md:grid-cols-3";
|
|
258
|
-
};
|
|
259
|
-
readonly "3c-middle-wider": {
|
|
260
|
-
readonly columns: 3;
|
|
261
|
-
readonly widths: readonly ["1fr", "2fr", "1fr"];
|
|
262
|
-
readonly gridClasses: "@md:grid-cols-[1fr_2fr_1fr]";
|
|
263
|
-
};
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
type StrictOmit<T, K extends keyof T> = Omit<T, K>;
|
|
267
|
-
|
|
268
|
-
export { type AlignOptions, BACKGROUND_TYPES, BORDER_RADIUS_OPTIONS, BUTTON_SIZE_OPTIONS, type BackgroundType, type BackgroundValue, type BorderRadiusOptions, type ButtonSizeOptions, COLOR_OPTIONS, type ColorOptions, FONT_SIZE_OPTIONS, type FontSizeOptions, GAP_OPTIONS, type GapOptions, HORIZONTAL_ALIGN_OPTIONS, type HorizontalAlign, type Navigation, type NavigationItem, PADDING_VALUES, type PaddingOptions, type RepAppData, type RepAppManifest, type RepAppProfile, SECTION_LAYOUT_CONFIG, type ScreenDefinition, type SectionLayoutType, ShareableItem, type StrictOmit, ThemeDefinition, VERTICAL_ALIGN_OPTIONS, type VerticalAlign, WidgetSchema, sectionLayoutConfig };
|
|
1
|
+
import { a as WidgetSchema, c as assertDefined, d as isWidgetTypeName, i as WidgetRegistry, l as assertNever, n as WIDGET_TYPE_NAMES, o as WidgetType, r as WidgetPath, s as WidgetTypeName, t as TypedWidgetSchema, u as isWidgetType } from "../widget-schema--PY1uMWx.cjs";
|
|
2
|
+
import { _ as ThemeDefinition, h as ThemeColorInput, u as ResolvedTheme, v as ThemePayload } from "../types-Ctu-Zio6.cjs";
|
|
3
|
+
import { A as RepAppProfile, C as VerticalAlign, D as NavigationItem, E as Navigation, O as RepAppData, S as VERTICAL_ALIGN_OPTIONS, T as ShareableItem, _ as HorizontalAlign, a as BUTTON_SIZE_OPTIONS, b as SECTION_LAYOUT_CONFIG, c as BorderRadiusOptions, d as ColorOptions, f as FONT_SIZE_OPTIONS, g as HORIZONTAL_ALIGN_OPTIONS, h as GapOptions, i as BORDER_RADIUS_OPTIONS, j as ScreenDefinition, k as RepAppManifest, l as ButtonSizeOptions, m as GAP_OPTIONS, n as AlignOptions, o as BackgroundType, p as FontSizeOptions, r as BACKGROUND_TYPES, s as BackgroundValue, t as StrictOmit, u as COLOR_OPTIONS, v as PADDING_VALUES, w as sectionLayoutConfig, x as SectionLayoutType, y as PaddingOptions } from "../index-Bxe_LIi8.cjs";
|
|
4
|
+
export { AlignOptions, BACKGROUND_TYPES, BORDER_RADIUS_OPTIONS, BUTTON_SIZE_OPTIONS, BackgroundType, BackgroundValue, BorderRadiusOptions, ButtonSizeOptions, COLOR_OPTIONS, ColorOptions, FONT_SIZE_OPTIONS, FontSizeOptions, GAP_OPTIONS, GapOptions, HORIZONTAL_ALIGN_OPTIONS, HorizontalAlign, Navigation, NavigationItem, PADDING_VALUES, PaddingOptions, RepAppData, RepAppManifest, RepAppProfile, ResolvedTheme, SECTION_LAYOUT_CONFIG, ScreenDefinition, SectionLayoutType, ShareableItem, StrictOmit, ThemeColorInput, ThemeDefinition, ThemePayload, TypedWidgetSchema, VERTICAL_ALIGN_OPTIONS, VerticalAlign, WIDGET_TYPE_NAMES, WidgetPath, WidgetRegistry, WidgetSchema, WidgetType, WidgetTypeName, assertDefined, assertNever, isWidgetType, isWidgetTypeName, sectionLayoutConfig };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { a as WidgetSchema, c as assertDefined, d as isWidgetTypeName, i as WidgetRegistry, l as assertNever, n as WIDGET_TYPE_NAMES, o as WidgetType, r as WidgetPath, s as WidgetTypeName, t as TypedWidgetSchema, u as isWidgetType } from "../widget-schema-YkD5p3v4.mjs";
|
|
2
|
+
import { _ as ThemeDefinition, h as ThemeColorInput, u as ResolvedTheme, v as ThemePayload } from "../types-ByG6Xy3C.mjs";
|
|
3
|
+
import { A as RepAppProfile, C as VerticalAlign, D as NavigationItem, E as Navigation, O as RepAppData, S as VERTICAL_ALIGN_OPTIONS, T as ShareableItem, _ as HorizontalAlign, a as BUTTON_SIZE_OPTIONS, b as SECTION_LAYOUT_CONFIG, c as BorderRadiusOptions, d as ColorOptions, f as FONT_SIZE_OPTIONS, g as HORIZONTAL_ALIGN_OPTIONS, h as GapOptions, i as BORDER_RADIUS_OPTIONS, j as ScreenDefinition, k as RepAppManifest, l as ButtonSizeOptions, m as GAP_OPTIONS, n as AlignOptions, o as BackgroundType, p as FontSizeOptions, r as BACKGROUND_TYPES, s as BackgroundValue, t as StrictOmit, u as COLOR_OPTIONS, v as PADDING_VALUES, w as sectionLayoutConfig, x as SectionLayoutType, y as PaddingOptions } from "../index-CCAu2n19.mjs";
|
|
4
|
+
export { AlignOptions, BACKGROUND_TYPES, BORDER_RADIUS_OPTIONS, BUTTON_SIZE_OPTIONS, BackgroundType, BackgroundValue, BorderRadiusOptions, ButtonSizeOptions, COLOR_OPTIONS, ColorOptions, FONT_SIZE_OPTIONS, FontSizeOptions, GAP_OPTIONS, GapOptions, HORIZONTAL_ALIGN_OPTIONS, HorizontalAlign, Navigation, NavigationItem, PADDING_VALUES, PaddingOptions, RepAppData, RepAppManifest, RepAppProfile, ResolvedTheme, SECTION_LAYOUT_CONFIG, ScreenDefinition, SectionLayoutType, ShareableItem, StrictOmit, ThemeColorInput, ThemeDefinition, ThemePayload, TypedWidgetSchema, VERTICAL_ALIGN_OPTIONS, VerticalAlign, WIDGET_TYPE_NAMES, WidgetPath, WidgetRegistry, WidgetSchema, WidgetType, WidgetTypeName, assertDefined, assertNever, isWidgetType, isWidgetTypeName, sectionLayoutConfig };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as FONT_SIZE_OPTIONS, c as PADDING_VALUES, d as sectionLayoutConfig, f as WIDGET_TYPE_NAMES, g as isWidgetTypeName, h as isWidgetType, i as COLOR_OPTIONS, l as SECTION_LAYOUT_CONFIG, m as assertNever, n as BORDER_RADIUS_OPTIONS, o as GAP_OPTIONS, p as assertDefined, r as BUTTON_SIZE_OPTIONS, s as HORIZONTAL_ALIGN_OPTIONS, t as BACKGROUND_TYPES, u as VERTICAL_ALIGN_OPTIONS } from "../types-Bjmd7Fdx.mjs";
|
|
2
|
+
export { BACKGROUND_TYPES, BORDER_RADIUS_OPTIONS, BUTTON_SIZE_OPTIONS, COLOR_OPTIONS, FONT_SIZE_OPTIONS, GAP_OPTIONS, HORIZONTAL_ALIGN_OPTIONS, PADDING_VALUES, SECTION_LAYOUT_CONFIG, VERTICAL_ALIGN_OPTIONS, WIDGET_TYPE_NAMES, assertDefined, assertNever, isWidgetType, isWidgetTypeName, sectionLayoutConfig };
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
//#region src/data-sources/types.d.ts
|
|
2
|
+
type DataSourceType = "api" | "custom" | "static";
|
|
3
|
+
type StaticSourceType = "collections" | "categories" | "tags";
|
|
4
|
+
type ShareableType = "Medium" | "Page" | "EnrollmentPack" | "Library" | "Product";
|
|
5
|
+
interface SelectedItem {
|
|
6
|
+
/** The unique ID of the selected item */
|
|
7
|
+
id: string | number;
|
|
8
|
+
/** The type of shareable content */
|
|
9
|
+
shareableType: ShareableType;
|
|
10
|
+
/** Optional cached data for preview/display purposes in the editor UI */
|
|
11
|
+
cachedData?: {
|
|
12
|
+
title?: string;
|
|
13
|
+
imageUrl?: string;
|
|
14
|
+
kind?: string;
|
|
15
|
+
};
|
|
16
|
+
/** Widget-specific per-item configuration overrides */
|
|
17
|
+
widgetConfig?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
interface ApiDataSource {
|
|
20
|
+
type: "api";
|
|
21
|
+
/** API endpoint URL (can include {variable} placeholders, e.g., /api/reps/{rep_id}/items) */
|
|
22
|
+
endpoint: string;
|
|
23
|
+
/** HTTP method (defaults to GET) */
|
|
24
|
+
method?: "GET" | "POST" | "PUT" | "DELETE";
|
|
25
|
+
/** Request headers */
|
|
26
|
+
headers?: Record<string, string>;
|
|
27
|
+
/** Request body for POST/PUT (will be JSON.stringify'd) */
|
|
28
|
+
body?: unknown;
|
|
29
|
+
/**
|
|
30
|
+
* Path to extract from response using dot notation
|
|
31
|
+
* e.g., "data.items" extracts response.data.items
|
|
32
|
+
*/
|
|
33
|
+
resultPath?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Which widget props this source populates
|
|
36
|
+
* e.g., ['data'] means the fetched result goes to props.data
|
|
37
|
+
*/
|
|
38
|
+
targetProps: string[];
|
|
39
|
+
/**
|
|
40
|
+
* Name of a registered transform function to process the data
|
|
41
|
+
* Transform is applied after resultPath extraction
|
|
42
|
+
*/
|
|
43
|
+
transform?: string;
|
|
44
|
+
/** Per-source variables for endpoint template interpolation (e.g., { limit: "10" }) */
|
|
45
|
+
variables?: Record<string, string>;
|
|
46
|
+
/**
|
|
47
|
+
* Auto-refresh interval in milliseconds
|
|
48
|
+
* 0 or undefined = no auto-refresh
|
|
49
|
+
*/
|
|
50
|
+
refreshInterval?: number;
|
|
51
|
+
}
|
|
52
|
+
interface CustomDataSource {
|
|
53
|
+
type: "custom";
|
|
54
|
+
/** Array of selected items to fetch */
|
|
55
|
+
selectedItems: SelectedItem[];
|
|
56
|
+
/**
|
|
57
|
+
* Which widget props this source populates
|
|
58
|
+
* e.g., ['slides'] means the fetched results go to props.slides
|
|
59
|
+
*/
|
|
60
|
+
targetProps: string[];
|
|
61
|
+
/**
|
|
62
|
+
* Name of a registered transform function to process the data
|
|
63
|
+
* Transform is applied after all items are fetched
|
|
64
|
+
*/
|
|
65
|
+
transform?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Auto-refresh interval in milliseconds
|
|
68
|
+
* 0 or undefined = no auto-refresh
|
|
69
|
+
*/
|
|
70
|
+
refreshInterval?: number;
|
|
71
|
+
}
|
|
72
|
+
interface StaticDataSource {
|
|
73
|
+
type: "static";
|
|
74
|
+
/** The type of static data (collections, categories, tags) */
|
|
75
|
+
staticType: StaticSourceType;
|
|
76
|
+
/** The selected item ID */
|
|
77
|
+
selectedId: string | number;
|
|
78
|
+
/** Cached data for preview/display in editor UI */
|
|
79
|
+
cachedData?: {
|
|
80
|
+
title?: string;
|
|
81
|
+
imageUrl?: string;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Which widget props this source populates
|
|
85
|
+
*/
|
|
86
|
+
targetProps: string[];
|
|
87
|
+
/**
|
|
88
|
+
* Name of a registered transform function to process the data
|
|
89
|
+
*/
|
|
90
|
+
transform?: string;
|
|
91
|
+
/**
|
|
92
|
+
* Auto-refresh interval in milliseconds
|
|
93
|
+
* 0 or undefined = no auto-refresh
|
|
94
|
+
*/
|
|
95
|
+
refreshInterval?: number;
|
|
96
|
+
}
|
|
97
|
+
type DataSource = ApiDataSource | CustomDataSource | StaticDataSource;
|
|
98
|
+
interface DataSourceConfig {
|
|
99
|
+
/** Array of data sources (usually just one, but supports multiple) */
|
|
100
|
+
sources: DataSource[];
|
|
101
|
+
/** Loading state configuration */
|
|
102
|
+
loading?: {
|
|
103
|
+
/** Show skeleton placeholder while loading (default: true) */showSkeleton?: boolean;
|
|
104
|
+
};
|
|
105
|
+
/** Error handling configuration */
|
|
106
|
+
error?: {
|
|
107
|
+
/** Fallback props to use when fetch fails */fallback?: Record<string, unknown>; /** Number of retry attempts (default: 0) */
|
|
108
|
+
retryCount?: number; /** Delay between retries in ms (default: 1000) */
|
|
109
|
+
retryDelay?: number;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Item returned by static data fetchers */
|
|
113
|
+
interface StaticItem {
|
|
114
|
+
id: string | number;
|
|
115
|
+
title: string;
|
|
116
|
+
imageUrl?: string | undefined;
|
|
117
|
+
}
|
|
118
|
+
/** Context passed to fetchers and transforms */
|
|
119
|
+
interface DataSourceContext {
|
|
120
|
+
/** The widget's unique ID */
|
|
121
|
+
widgetId: string;
|
|
122
|
+
/** The widget type (e.g., "ChartWidget") */
|
|
123
|
+
widgetType: string;
|
|
124
|
+
/** AbortSignal for request cancellation */
|
|
125
|
+
signal: AbortSignal;
|
|
126
|
+
/** Base URL for API calls (e.g., "https://api.fluid.app/api") */
|
|
127
|
+
baseUrl?: string | undefined;
|
|
128
|
+
/** Get API headers function */
|
|
129
|
+
getApiHeaders?: (() => Record<string, string>) | undefined;
|
|
130
|
+
/** Dynamic variables for endpoint path substitution (e.g., { rep_id: "123" }) */
|
|
131
|
+
variables?: Record<string, string> | undefined;
|
|
132
|
+
}
|
|
133
|
+
/** Function signature for data fetchers */
|
|
134
|
+
type DataFetcher<T extends DataSource = DataSource> = (source: T, context: DataSourceContext) => Promise<unknown>;
|
|
135
|
+
/** Function signature for data transforms */
|
|
136
|
+
type DataTransformer = (data: unknown, source?: DataSource, context?: DataSourceContext) => unknown;
|
|
137
|
+
/** The data source registry configuration */
|
|
138
|
+
interface DataSourceRegistry {
|
|
139
|
+
fetchers: Record<DataSourceType, DataFetcher>;
|
|
140
|
+
transformers: Record<string, DataTransformer>;
|
|
141
|
+
}
|
|
142
|
+
/** Result from useWidgetData hook */
|
|
143
|
+
interface WidgetDataResult<T = unknown> {
|
|
144
|
+
/** The resolved data (undefined while loading) */
|
|
145
|
+
data: T | undefined;
|
|
146
|
+
/** True while any source is loading */
|
|
147
|
+
isLoading: boolean;
|
|
148
|
+
/** Error if any source failed */
|
|
149
|
+
error: Error | null;
|
|
150
|
+
/** Manually trigger a refetch */
|
|
151
|
+
refetch: () => void;
|
|
152
|
+
}
|
|
153
|
+
//#endregion
|
|
154
|
+
export { DataSourceConfig as a, DataSourceType as c, ShareableType as d, StaticDataSource as f, WidgetDataResult as h, DataSource as i, DataTransformer as l, StaticSourceType as m, CustomDataSource as n, DataSourceContext as o, StaticItem as p, DataFetcher as r, DataSourceRegistry as s, ApiDataSource as t, SelectedItem as u };
|
|
155
|
+
//# sourceMappingURL=types-BIXtQlHB.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-BIXtQlHB.d.cts","names":[],"sources":["../src/data-sources/types.ts"],"mappings":";KACY,cAAA;AAAA,KAGA,gBAAA;AAAA,KAGA,aAAA;AAAA,UAQK,YAAA;EAdS;EAgBxB,EAAA;EAbU;EAeV,aAAA,EAAe,aAAA;;EAEf,UAAA;IACE,KAAA;IACA,QAAA;IACA,IAAA;EAAA;EAjBqB;EAoBvB,YAAA,GAAe,MAAA;AAAA;AAAA,UAGA,aAAA;EACf,IAAA;EAJqB;EAMrB,QAAA;EAdA;EAgBA,MAAA;EAdA;EAgBA,OAAA,GAAU,MAAA;EAdR;EAgBF,IAAA;EAZA;;;;EAiBA,UAAA;EAd4B;;;;EAmB5B,WAAA;EAdA;;;;EAmBA,SAAA;EALA;EAOA,SAAA,GAAY,MAAA;EAAZ;;;;EAKA,eAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EAE2B;EAA3B,aAAA,EAAe,YAAA;EAAf;;;;EAKA,WAAA;EAUe;;AAGjB;;EARE,SAAA;EAW4B;;;;EAN5B,eAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EAaA;EAXA,UAAA,EAAY,gBAAA;EAoBZ;EAlBA,UAAA;EAkBe;EAhBf,UAAA;IACE,KAAA;IACA,QAAA;EAAA;EAkBqC;;;EAbvC,WAAA;EAauB;;;EATvB,SAAA;EAS0E;AAE5E;;;EANE,eAAA;AAAA;AAAA,KAIU,UAAA,GAAa,aAAA,GAAgB,gBAAA,GAAmB,gBAAA;AAAA,UAE3C,gBAAA;EAMb;EAJF,OAAA,EAAS,UAAA;EASP;EAPF,OAAA;IASE,8DAPA,YAAA;EAAA;EASU;EANZ,KAAA;IAWyB,6CATvB,QAAA,GAAW,MAAA,mBASY;IAPvB,UAAA,WASF;IAPE,UAAA;EAAA;AAAA;AAgBJ;AAAA,UAXiB,UAAA;EACf,EAAA;EACA,KAAA;EACA,QAAA;AAAA;;UAQe,iBAAA;EAEf;EAAA,QAAA;EAIA;EAFA,UAAA;EAIA;EAFA,MAAA,EAAQ,WAAA;EAIe;EAFvB,OAAA;EAIY;EAFZ,aAAA,UAAuB,MAAA;EAEL;EAAlB,SAAA,GAAY,MAAA;AAAA;;KAIF,WAAA,WAAsB,UAAA,GAAa,UAAA,KAC7C,MAAA,EAAQ,CAAA,EACR,OAAA,EAAS,iBAAA,KACN,OAAA;;KAGO,eAAA,IACV,IAAA,WACA,MAAA,GAAS,UAAA,EACT,OAAA,GAAU,iBAAA;;UAIK,kBAAA;EACf,QAAA,EAAU,MAAA,CAAO,cAAA,EAAgB,WAAA;EACjC,YAAA,EAAc,MAAA,SAAe,eAAA;AAAA;;UAId,gBAAA;EAlBP;EAoBR,IAAA,EAAM,CAAA;EAnBG;EAqBT,SAAA;EApBG;EAsBH,KAAA,EAAO,KAAA;EAtBG;EAwBV,OAAA;AAAA"}
|