@kilivi/payloadcms-theme-management 1.1.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +318 -847
- package/dist/components/AppearanceSessionControls.d.ts +15 -0
- package/dist/components/AppearanceSessionControls.d.ts.map +1 -0
- package/dist/components/AppearanceSessionControls.js +152 -0
- package/dist/components/AppearanceSessionControls.js.map +1 -0
- package/dist/components/ColorModeToggle.css +42 -0
- package/dist/components/ColorModeToggle.d.ts +40 -0
- package/dist/components/ColorModeToggle.d.ts.map +1 -0
- package/dist/components/ColorModeToggle.js +111 -0
- package/dist/components/ColorModeToggle.js.map +1 -0
- package/dist/components/ServerThemeInjector.d.ts.map +1 -1
- package/dist/components/ServerThemeInjector.js +41 -14
- package/dist/components/ServerThemeInjector.js.map +1 -1
- package/dist/components/ThemeLivePreviewSync.d.ts +1 -0
- package/dist/components/ThemeLivePreviewSync.d.ts.map +1 -1
- package/dist/components/ThemeLivePreviewSync.js +1 -1
- package/dist/components/ThemeLivePreviewSync.js.map +1 -1
- package/dist/components/ThemeSwitcher.d.ts +36 -0
- package/dist/components/ThemeSwitcher.d.ts.map +1 -0
- package/dist/components/ThemeSwitcher.js +89 -0
- package/dist/components/ThemeSwitcher.js.map +1 -0
- package/dist/components/typographyPreviewUtils.d.ts.map +1 -1
- package/dist/components/typographyPreviewUtils.js +8 -1
- package/dist/components/typographyPreviewUtils.js.map +1 -1
- package/dist/constants/devicePreviews.d.ts +35 -0
- package/dist/constants/devicePreviews.d.ts.map +1 -0
- package/dist/constants/devicePreviews.js +43 -0
- package/dist/constants/devicePreviews.js.map +1 -0
- package/dist/constants/themeFonts.js +9 -9
- package/dist/constants/themeFonts.js.map +1 -1
- package/dist/extended-presets.d.ts +0 -4
- package/dist/extended-presets.d.ts.map +1 -1
- package/dist/extended-presets.js +1 -18
- package/dist/extended-presets.js.map +1 -1
- package/dist/extended-themes.d.ts.map +1 -1
- package/dist/extended-themes.js +428 -0
- package/dist/extended-themes.js.map +1 -1
- package/dist/fields/AccessibilityAuditField.d.ts +2 -0
- package/dist/fields/AccessibilityAuditField.d.ts.map +1 -0
- package/dist/fields/AccessibilityAuditField.js +303 -0
- package/dist/fields/AccessibilityAuditField.js.map +1 -0
- package/dist/fields/AppearancePreviewField.d.ts +2 -0
- package/dist/fields/AppearancePreviewField.d.ts.map +1 -0
- package/dist/fields/AppearancePreviewField.js +763 -0
- package/dist/fields/AppearancePreviewField.js.map +1 -0
- package/dist/fields/ColorPickerField.d.ts.map +1 -1
- package/dist/fields/ColorPickerField.js +89 -85
- package/dist/fields/ColorPickerField.js.map +1 -1
- package/dist/fields/FontSelectField.d.ts +6 -0
- package/dist/fields/FontSelectField.d.ts.map +1 -1
- package/dist/fields/FontSelectField.js +195 -122
- package/dist/fields/FontSelectField.js.map +1 -1
- package/dist/fields/PaletteGeneratorField.d.ts +7 -0
- package/dist/fields/PaletteGeneratorField.d.ts.map +1 -0
- package/dist/fields/PaletteGeneratorField.js +327 -0
- package/dist/fields/PaletteGeneratorField.js.map +1 -0
- package/dist/fields/StylePresetField.d.ts +3 -0
- package/dist/fields/StylePresetField.d.ts.map +1 -0
- package/dist/fields/StylePresetField.js +462 -0
- package/dist/fields/StylePresetField.js.map +1 -0
- package/dist/fields/ThemeColorPickerField.css +115 -35
- package/dist/fields/ThemeColorPickerField.d.ts.map +1 -1
- package/dist/fields/ThemeColorPickerField.js +204 -70
- package/dist/fields/ThemeColorPickerField.js.map +1 -1
- package/dist/fields/ThemeExportField.d.ts +6 -0
- package/dist/fields/ThemeExportField.d.ts.map +1 -0
- package/dist/fields/ThemeExportField.js +202 -0
- package/dist/fields/ThemeExportField.js.map +1 -0
- package/dist/fields/ThemePresetImportField.d.ts.map +1 -1
- package/dist/fields/ThemePresetImportField.js +56 -25
- package/dist/fields/ThemePresetImportField.js.map +1 -1
- package/dist/fields/ThemePreviewField.css +382 -5
- package/dist/fields/ThemePreviewField.d.ts.map +1 -1
- package/dist/fields/ThemePreviewField.js +268 -170
- package/dist/fields/ThemePreviewField.js.map +1 -1
- package/dist/fields/ThemeTokenSelectField.d.ts.map +1 -1
- package/dist/fields/ThemeTokenSelectField.js +278 -80
- package/dist/fields/ThemeTokenSelectField.js.map +1 -1
- package/dist/fields/colorFieldHelpers.d.ts +90 -0
- package/dist/fields/colorFieldHelpers.d.ts.map +1 -0
- package/dist/fields/colorFieldHelpers.js +133 -0
- package/dist/fields/colorFieldHelpers.js.map +1 -0
- package/dist/fields/colorModeFields.d.ts +1 -1
- package/dist/fields/colorModeFields.d.ts.map +1 -1
- package/dist/fields/colorModeFields.js +49 -7
- package/dist/fields/colorModeFields.js.map +1 -1
- package/dist/fields/themeConfigurationField.d.ts +8 -1
- package/dist/fields/themeConfigurationField.d.ts.map +1 -1
- package/dist/fields/themeConfigurationField.js +961 -29
- package/dist/fields/themeConfigurationField.js.map +1 -1
- package/dist/globals/ThemeSettings/FontPicker/FontPreview.d.ts.map +1 -1
- package/dist/globals/ThemeSettings/FontPicker/FontPreview.js +8 -4
- package/dist/globals/ThemeSettings/FontPicker/FontPreview.js.map +1 -1
- package/dist/globals/ThemeSettings/FontPicker/index.d.ts.map +1 -1
- package/dist/globals/ThemeSettings/FontPicker/index.js +81 -26
- package/dist/globals/ThemeSettings/FontPicker/index.js.map +1 -1
- package/dist/globals/ThemeSettings/FontPicker/styles.css +98 -41
- package/dist/globals/ThemeSettings/FontPicker/translations.d.ts +6 -0
- package/dist/globals/ThemeSettings/FontPicker/translations.d.ts.map +1 -1
- package/dist/globals/ThemeSettings/FontPicker/translations.js +14 -2
- package/dist/globals/ThemeSettings/FontPicker/translations.js.map +1 -1
- package/dist/globals/ThemeSettings/config.d.ts.map +1 -1
- package/dist/globals/ThemeSettings/config.js +76 -79
- package/dist/globals/ThemeSettings/config.js.map +1 -1
- package/dist/globals/ThemeSettings/fields/FontLoadingGuideField.d.ts.map +1 -1
- package/dist/globals/ThemeSettings/fields/FontLoadingGuideField.js +63 -62
- package/dist/globals/ThemeSettings/fields/FontLoadingGuideField.js.map +1 -1
- package/dist/globals/ThemeSettings/fields/TypographyInfoField.d.ts.map +1 -1
- package/dist/globals/ThemeSettings/fields/TypographyInfoField.js +22 -25
- package/dist/globals/ThemeSettings/fields/TypographyInfoField.js.map +1 -1
- package/dist/hooks/useAppearanceSession.d.ts +50 -0
- package/dist/hooks/useAppearanceSession.d.ts.map +1 -0
- package/dist/hooks/useAppearanceSession.js +91 -0
- package/dist/hooks/useAppearanceSession.js.map +1 -0
- package/dist/hooks/useThemeTranslations.d.ts +13 -0
- package/dist/hooks/useThemeTranslations.d.ts.map +1 -0
- package/dist/hooks/useThemeTranslations.js +22 -0
- package/dist/hooks/useThemeTranslations.js.map +1 -0
- package/dist/i18n.d.ts +53 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +53 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +130 -32
- package/dist/index.js.map +1 -1
- package/dist/payload-types.d.ts +24 -0
- package/dist/payload-types.d.ts.map +1 -1
- package/dist/payload-types.js.map +1 -1
- package/dist/presets.d.ts +8 -0
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js.map +1 -1
- package/dist/providers/Theme/index.d.ts.map +1 -1
- package/dist/providers/Theme/index.js +75 -11
- package/dist/providers/Theme/index.js.map +1 -1
- package/dist/providers/Theme/themeConfig.d.ts.map +1 -1
- package/dist/providers/Theme/themeConfig.js +104 -0
- package/dist/providers/Theme/themeConfig.js.map +1 -1
- package/dist/providers/Theme/types.d.ts +1 -1
- package/dist/providers/Theme/types.d.ts.map +1 -1
- package/dist/providers/Theme/types.js +10 -1
- package/dist/providers/Theme/types.js.map +1 -1
- package/dist/style-presets.d.ts +66 -0
- package/dist/style-presets.d.ts.map +1 -0
- package/dist/style-presets.js +556 -0
- package/dist/style-presets.js.map +1 -0
- package/dist/translations.d.ts +159 -1
- package/dist/translations.d.ts.map +1 -1
- package/dist/translations.js +310 -9
- package/dist/translations.js.map +1 -1
- package/dist/tweakcn-special-themes.d.ts.map +1 -1
- package/dist/tweakcn-special-themes.js +585 -9
- package/dist/tweakcn-special-themes.js.map +1 -1
- package/dist/types/css.d.js +3 -0
- package/dist/types/css.d.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/getThemeSettings.d.ts.map +1 -1
- package/dist/utilities/getThemeSettings.js +2 -14
- package/dist/utilities/getThemeSettings.js.map +1 -1
- package/dist/utils/contrast.d.ts +63 -0
- package/dist/utils/contrast.d.ts.map +1 -0
- package/dist/utils/contrast.js +158 -0
- package/dist/utils/contrast.js.map +1 -0
- package/dist/utils/exportTokens.d.ts +30 -0
- package/dist/utils/exportTokens.d.ts.map +1 -0
- package/dist/utils/exportTokens.js +183 -0
- package/dist/utils/exportTokens.js.map +1 -0
- package/dist/utils/generatePalette.d.ts +46 -0
- package/dist/utils/generatePalette.d.ts.map +1 -0
- package/dist/utils/generatePalette.js +127 -0
- package/dist/utils/generatePalette.js.map +1 -0
- package/dist/utils/generateThemeCSS.d.ts.map +1 -1
- package/dist/utils/generateThemeCSS.js +2 -40
- package/dist/utils/generateThemeCSS.js.map +1 -1
- package/dist/utils/livePreviewThemeRuntime.d.ts +16 -2
- package/dist/utils/livePreviewThemeRuntime.d.ts.map +1 -1
- package/dist/utils/livePreviewThemeRuntime.js +37 -14
- package/dist/utils/livePreviewThemeRuntime.js.map +1 -1
- package/dist/utils/localizedText.d.ts +8 -0
- package/dist/utils/localizedText.d.ts.map +1 -0
- package/dist/utils/localizedText.js +21 -0
- package/dist/utils/localizedText.js.map +1 -0
- package/dist/utils/resolveThemeConfiguration.d.ts +45 -1
- package/dist/utils/resolveThemeConfiguration.d.ts.map +1 -1
- package/dist/utils/resolveThemeConfiguration.js +12 -5
- package/dist/utils/resolveThemeConfiguration.js.map +1 -1
- package/dist/utils/themeColors.d.ts +3 -0
- package/dist/utils/themeColors.d.ts.map +1 -1
- package/dist/utils/themeColors.js +30 -1
- package/dist/utils/themeColors.js.map +1 -1
- package/dist/utils/themeHtmlAttributes.d.ts +32 -12
- package/dist/utils/themeHtmlAttributes.d.ts.map +1 -1
- package/dist/utils/themeHtmlAttributes.js +38 -5
- package/dist/utils/themeHtmlAttributes.js.map +1 -1
- package/dist/utils/themeUtils.d.ts +3 -5
- package/dist/utils/themeUtils.d.ts.map +1 -1
- package/dist/utils/themeUtils.js +416 -6
- package/dist/utils/themeUtils.js.map +1 -1
- package/dist/utils/tweakcnConverter.d.ts +1 -3
- package/dist/utils/tweakcnConverter.d.ts.map +1 -1
- package/dist/utils/tweakcnConverter.js +1 -3
- package/dist/utils/tweakcnConverter.js.map +1 -1
- package/package.json +11 -5
- package/dist/components/ThemePreview.d.ts +0 -3
- package/dist/components/ThemePreview.d.ts.map +0 -1
- package/dist/components/ThemePreview.js +0 -321
- package/dist/components/ThemePreview.js.map +0 -1
- package/dist/plugin.d.ts +0 -2
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -3
- package/dist/plugin.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { borderRadiusPresets } from '../providers/Theme/themeConfig.js';
|
|
2
|
+
import { hexToHsl } from './themeColors.js';
|
|
2
3
|
/**
|
|
3
4
|
* Generates complete CSS for a theme preset
|
|
4
5
|
* Creates both light and dark mode CSS variables
|
|
@@ -31,45 +32,6 @@ import { borderRadiusPresets } from '../providers/Theme/themeConfig.js';
|
|
|
31
32
|
sections.push(buildCssBlock(`[data-theme='${name}'][data-theme-mode='dark']`, darkLines));
|
|
32
33
|
return sections.join('\n').trim();
|
|
33
34
|
}
|
|
34
|
-
/**
|
|
35
|
-
* Convert HEX color to HSL format
|
|
36
|
-
* Example: #3b82f6 -> hsl(221, 83%, 53%)
|
|
37
|
-
*/ function hexToHsl(hex) {
|
|
38
|
-
let normalized = hex.trim();
|
|
39
|
-
if (!normalized.startsWith('#')) {
|
|
40
|
-
normalized = `#${normalized}`;
|
|
41
|
-
}
|
|
42
|
-
if (normalized.length === 4) {
|
|
43
|
-
normalized = `#${normalized[1]}${normalized[1]}${normalized[2]}${normalized[2]}${normalized[3]}${normalized[3]}`;
|
|
44
|
-
}
|
|
45
|
-
const r = parseInt(normalized.substring(1, 3), 16) / 255;
|
|
46
|
-
const g = parseInt(normalized.substring(3, 5), 16) / 255;
|
|
47
|
-
const b = parseInt(normalized.substring(5, 7), 16) / 255;
|
|
48
|
-
const max = Math.max(r, g, b);
|
|
49
|
-
const min = Math.min(r, g, b);
|
|
50
|
-
let h = 0;
|
|
51
|
-
let s = 0;
|
|
52
|
-
const l = (max + min) / 2;
|
|
53
|
-
if (max !== min) {
|
|
54
|
-
const d = max - min;
|
|
55
|
-
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
56
|
-
switch(max){
|
|
57
|
-
case r:
|
|
58
|
-
h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
|
|
59
|
-
break;
|
|
60
|
-
case g:
|
|
61
|
-
h = ((b - r) / d + 2) / 6;
|
|
62
|
-
break;
|
|
63
|
-
case b:
|
|
64
|
-
h = ((r - g) / d + 4) / 6;
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const hDeg = Math.round(h * 360);
|
|
69
|
-
const sPercent = Math.round(s * 100);
|
|
70
|
-
const lPercent = Math.round(l * 100);
|
|
71
|
-
return `hsl(${hDeg}, ${sPercent}%, ${lPercent}%)`;
|
|
72
|
-
}
|
|
73
35
|
function toCssColor(color) {
|
|
74
36
|
if (!color) return null;
|
|
75
37
|
const trimmed = color.trim();
|
|
@@ -280,7 +242,7 @@ function toKebab(token) {
|
|
|
280
242
|
}
|
|
281
243
|
function getDefaultTypography() {
|
|
282
244
|
return {
|
|
283
|
-
fontFamily: 'var(--font-geist-sans)',
|
|
245
|
+
fontFamily: 'var(--font-inter, var(--font-geist-sans), system-ui, sans-serif)',
|
|
284
246
|
headingFamily: 'var(--font-outfit)',
|
|
285
247
|
baseFontSize: '16px',
|
|
286
248
|
lineHeight: '1.75',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/generateThemeCSS.ts"],"sourcesContent":["import type { ThemePreset } from '../presets.js'\nimport { borderRadiusPresets } from '../providers/Theme/themeConfig.js'\n\n/**\n * Generates complete CSS for a theme preset\n * Creates both light and dark mode CSS variables\n */\nexport function generateThemeCSS(preset: ThemePreset): string {\n const { name, label, borderRadius, typography, lightMode, darkMode } = preset\n\n const rootLines: string[] = []\n const darkLines: string[] = []\n\n // Typography\n const typographyPreset = typography ?? getDefaultTypography()\n pushTypography(rootLines, typographyPreset)\n\n // Layout (shared across themes)\n pushLayoutDefaults(rootLines)\n\n // Border radius based on preset definition\n pushBorderRadius(rootLines, borderRadius)\n\n // Component system defaults derived from colors\n pushComponentDefaults(rootLines, lightMode)\n\n // Light mode colours\n pushColorTokens(rootLines, lightMode, 'light')\n\n // Shared status colors (can be overridden later)\n pushStatusColors(rootLines, 'light')\n\n // Dark mode colors\n pushColorTokens(darkLines, darkMode, 'dark')\n pushStatusColors(darkLines, 'dark')\n pushDarkModeComponentOverrides(darkLines, darkMode)\n\n const sections: string[] = []\n sections.push(`/* ${label} Theme */`)\n sections.push(buildCssBlock(`[data-theme='${name}']`, rootLines))\n\n sections.push(`\n/* ${label} Theme - Dark Mode */`)\n sections.push(buildCssBlock(`[data-theme='${name}'][data-theme-mode='dark']`, darkLines))\n\n return sections.join('\\n').trim()\n}\n\n/**\n * Convert HEX color to HSL format\n * Example: #3b82f6 -> hsl(221, 83%, 53%)\n */\nfunction hexToHsl(hex: string): string {\n let normalized = hex.trim()\n if (!normalized.startsWith('#')) {\n normalized = `#${normalized}`\n }\n\n if (normalized.length === 4) {\n normalized = `#${normalized[1]}${normalized[1]}${normalized[2]}${normalized[2]}${normalized[3]}${normalized[3]}`\n }\n\n const r = parseInt(normalized.substring(1, 3), 16) / 255\n const g = parseInt(normalized.substring(3, 5), 16) / 255\n const b = parseInt(normalized.substring(5, 7), 16) / 255\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n let h = 0\n let s = 0\n const l = (max + min) / 2\n\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6\n break\n case g:\n h = ((b - r) / d + 2) / 6\n break\n case b:\n h = ((r - g) / d + 4) / 6\n break\n }\n }\n\n const hDeg = Math.round(h * 360)\n const sPercent = Math.round(s * 100)\n const lPercent = Math.round(l * 100)\n\n return `hsl(${hDeg}, ${sPercent}%, ${lPercent}%)`\n}\n\nfunction toCssColor(color?: string | null): string | null {\n if (!color) return null\n const trimmed = color.trim()\n if (/^var\\(/i.test(trimmed) || /^hsl\\(/i.test(trimmed) || /^rgb(a)?\\(/i.test(trimmed)) {\n return trimmed\n }\n if (/^#?[0-9a-f]{6}$/i.test(trimmed) || /^#?[0-9a-f]{3}$/i.test(trimmed)) {\n return hexToHsl(trimmed)\n }\n return trimmed\n}\n\nfunction buildCssBlock(selector: string, lines: string[]): string {\n if (!lines.length) {\n return `${selector} {}`\n }\n\n const body = lines.map((line) => (line.startsWith('--') ? ` ${line}` : line)).join('\\n')\n return `${selector} {\\n${body}\\n}`\n}\n\nfunction pushTypography(lines: string[], typography: NonNullable<ThemePreset['typography']>): void {\n const {\n fontFamily,\n headingFamily,\n baseFontSize,\n lineHeight,\n fontWeights = {},\n letterSpacing = {},\n } = typography\n\n if (fontFamily) lines.push(`--typography-fontFamily: ${fontFamily};`)\n if (headingFamily) lines.push(`--typography-headingFamily: ${headingFamily};`)\n if (baseFontSize) lines.push(`--typography-baseFontSize: ${baseFontSize};`)\n if (lineHeight) lines.push(`--typography-lineHeight: ${lineHeight};`)\n\n Object.entries(fontWeights).forEach(([token, weight]) => {\n if (weight) {\n lines.push(`--typography-fontWeights-${token}: ${weight};`)\n }\n })\n\n Object.entries(letterSpacing).forEach(([token, value]) => {\n if (value) {\n lines.push(`--typography-letterSpacing-${token}: ${value};`)\n }\n })\n}\n\nfunction pushLayoutDefaults(lines: string[]): void {\n lines.push('--layout-containerWidth: 1440px;')\n lines.push('--layout-containerPadding: 1.5rem;')\n lines.push('--layout-containerPaddingTablet: 2.5rem;')\n lines.push('--layout-containerPaddingDesktop: 3rem;')\n lines.push('--layout-sectionSpacing: 5rem;')\n lines.push('--layout-sectionSpacingTablet: 7rem;')\n lines.push('--layout-sectionSpacingDesktop: 9rem;')\n lines.push('--layout-gridGap: 2rem;')\n lines.push('--layout-gridGapTablet: 2.5rem;')\n lines.push('--layout-gridGapDesktop: 3rem;')\n}\n\nfunction pushBorderRadius(lines: string[], borderRadius?: ThemePreset['borderRadius']): void {\n const presetKey = borderRadius ?? 'medium'\n const preset = borderRadiusPresets[presetKey]\n\n if (preset?.css) {\n Object.entries(preset.css).forEach(([token, value]) => {\n lines.push(`${token}: ${value};`)\n })\n\n const defaultRadius =\n preset.css['--radius-default'] ??\n preset.css['--radius-medium'] ??\n preset.css['--radius-large'] ??\n preset.css['--radius']\n\n if (defaultRadius) {\n lines.push(`--radius: ${defaultRadius};`)\n }\n }\n}\n\nfunction pushComponentDefaults(lines: string[], lightMode?: ThemePreset['lightMode']): void {\n lines.push('--components-button-padding: 1rem 2.5rem;')\n lines.push('--components-button-padding-large: 1.25rem 3rem;')\n lines.push('--components-button-transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);')\n lines.push('--components-button-hover-scale: 1.02;')\n lines.push('--components-button-hover-opacity: 0.9;')\n lines.push('--components-button-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);')\n lines.push('--components-button-hover-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);')\n\n lines.push('--components-card-padding: 2.5rem;')\n lines.push('--components-card-padding-compact: 1.5rem;')\n lines.push(\n '--components-card-shadow: 0 4px 16px -4px rgba(34, 42, 69, 0.12), 0 2px 8px -2px rgba(34, 42, 69, 0.08);',\n )\n lines.push(\n '--components-card-hover-shadow: 0 12px 48px -12px rgba(34, 42, 69, 0.2), 0 8px 32px -8px rgba(34, 42, 69, 0.12);',\n )\n lines.push('--components-card-hover-transform: translateY(-8px) scale(1.02);')\n\n const borderColor = toCssColor(lightMode?.border)\n if (borderColor) {\n lines.push(`--components-card-border: 1px solid ${borderColor};`)\n lines.push(`--components-input-border: 1.5px solid ${borderColor};`)\n }\n\n const primaryColor = toCssColor(lightMode?.primary)\n if (primaryColor) {\n lines.push(`--components-input-focus-border: 2px solid ${primaryColor};`)\n }\n\n lines.push('--components-input-height: 3.5rem;')\n lines.push('--components-input-padding: 1.25rem 1.75rem;')\n}\n\nconst COLOR_TOKENS: Array<{\n key: keyof NonNullable<ThemePreset['lightMode']>\n wrapWithVar?: boolean\n}> = [\n { key: 'background' },\n { key: 'foreground' },\n { key: 'card' },\n { key: 'cardForeground' },\n { key: 'popover' },\n { key: 'popoverForeground' },\n { key: 'primary', wrapWithVar: true },\n { key: 'primaryForeground' },\n { key: 'secondary' },\n { key: 'secondaryForeground' },\n { key: 'muted' },\n { key: 'mutedForeground' },\n { key: 'accent', wrapWithVar: true },\n { key: 'accentForeground' },\n { key: 'destructive' },\n { key: 'destructiveForeground' },\n { key: 'border' },\n { key: 'input' },\n { key: 'ring' },\n]\n\nfunction pushColorTokens(\n lines: string[],\n colors: ThemePreset['lightMode'] | ThemePreset['darkMode'],\n mode: 'light' | 'dark',\n): void {\n if (!colors) return\n\n COLOR_TOKENS.forEach(({ key, wrapWithVar }) => {\n const value = toCssColor(colors[key])\n if (!value) return\n\n if (key === 'ring') {\n lines.push('--ring: var(--primary);')\n return\n }\n\n if (wrapWithVar) {\n const customVar = key === 'accent' ? '--accent-custom' : '--primary-custom'\n lines.push(`--${toKebab(key)}: var(${customVar}, ${value});`)\n } else {\n lines.push(`--${toKebab(key)}: ${value};`)\n }\n })\n\n if (mode === 'light') {\n lines.push('--primary-hover: color-mix(in hsl, var(--primary), black 10%);')\n lines.push('--secondary-hover: color-mix(in hsl, var(--secondary), black 10%);')\n lines.push('--accent-hover: color-mix(in hsl, var(--accent), white 10%);')\n } else {\n lines.push('--primary-hover: color-mix(in hsl, var(--primary), white 10%);')\n lines.push('--secondary-hover: color-mix(in hsl, var(--secondary), white 10%);')\n lines.push('--accent-hover: color-mix(in hsl, var(--accent), white 10%);')\n }\n}\n\nfunction pushStatusColors(lines: string[], mode: 'light' | 'dark'): void {\n if (mode === 'light') {\n lines.push('--success: hsl(120, 60%, 40%);')\n lines.push('--success-foreground: hsl(0, 0%, 100%);')\n lines.push('--warning: hsl(42, 85%, 55%);')\n lines.push('--warning-foreground: hsl(25, 15%, 15%);')\n lines.push('--error: hsl(0, 85%, 52%);')\n lines.push('--error-foreground: hsl(0, 0%, 100%);')\n lines.push('--info: var(--primary);')\n lines.push('--info-foreground: var(--primary-foreground);')\n } else {\n lines.push('--success: hsl(120, 60%, 50%);')\n lines.push('--success-foreground: hsl(0, 0%, 10%);')\n lines.push('--warning: hsl(42, 85%, 55%);')\n lines.push('--warning-foreground: hsl(0, 0%, 10%);')\n lines.push('--error: hsl(0, 85%, 52%);')\n lines.push('--error-foreground: hsl(0, 0%, 100%);')\n lines.push('--info: var(--primary);')\n lines.push('--info-foreground: var(--primary-foreground);')\n }\n}\n\nfunction pushDarkModeComponentOverrides(lines: string[], darkMode?: ThemePreset['darkMode']): void {\n lines.push(\n '--components-card-shadow: 0 8px 32px -8px rgba(0, 0, 0, 0.6), 0 4px 16px -4px rgba(0, 0, 0, 0.4);',\n )\n lines.push(\n '--components-card-hover-shadow: 0 16px 64px -16px rgba(0, 0, 0, 0.8), 0 12px 40px -12px rgba(0, 0, 0, 0.6);',\n )\n\n const borderColor = toCssColor(darkMode?.border)\n if (borderColor) {\n lines.push(`--components-card-border: 1px solid ${borderColor};`)\n }\n\n const primaryColor = toCssColor(darkMode?.primary)\n if (primaryColor) {\n lines.push(`--components-input-focus-border: 2px solid ${primaryColor};`)\n }\n}\n\nfunction toKebab(token: string): string {\n return token.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)\n}\n\nfunction getDefaultTypography(): NonNullable<ThemePreset['typography']> {\n return {\n fontFamily: 'var(--font-geist-sans)',\n headingFamily: 'var(--font-outfit)',\n baseFontSize: '16px',\n lineHeight: '1.75',\n fontWeights: {\n light: '300',\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n black: '900',\n },\n letterSpacing: {\n tight: '-0.02em',\n normal: '0',\n wide: '0.025em',\n wider: '0.05em',\n },\n }\n}\n\n/**\n * Generate CSS for all themes\n */\nexport function generateAllThemesCSS(presets: ThemePreset[]): string {\n return presets.map((preset) => generateThemeCSS(preset)).join('\\n\\n')\n}\n"],"names":["borderRadiusPresets","generateThemeCSS","preset","name","label","borderRadius","typography","lightMode","darkMode","rootLines","darkLines","typographyPreset","getDefaultTypography","pushTypography","pushLayoutDefaults","pushBorderRadius","pushComponentDefaults","pushColorTokens","pushStatusColors","pushDarkModeComponentOverrides","sections","push","buildCssBlock","join","trim","hexToHsl","hex","normalized","startsWith","length","r","parseInt","substring","g","b","max","Math","min","h","s","l","d","hDeg","round","sPercent","lPercent","toCssColor","color","trimmed","test","selector","lines","body","map","line","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","letterSpacing","Object","entries","forEach","token","weight","value","presetKey","css","defaultRadius","borderColor","border","primaryColor","primary","COLOR_TOKENS","key","wrapWithVar","colors","mode","customVar","toKebab","replace","match","toLowerCase","light","normal","medium","semibold","bold","black","tight","wide","wider","generateAllThemesCSS","presets"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/generateThemeCSS.ts"],"sourcesContent":["import type { ThemePreset } from '../presets.js'\nimport { borderRadiusPresets } from '../providers/Theme/themeConfig.js'\nimport { hexToHsl } from './themeColors.js'\n\n/**\n * Generates complete CSS for a theme preset\n * Creates both light and dark mode CSS variables\n */\nexport function generateThemeCSS(preset: ThemePreset): string {\n const { name, label, borderRadius, typography, lightMode, darkMode } = preset\n\n const rootLines: string[] = []\n const darkLines: string[] = []\n\n // Typography\n const typographyPreset = typography ?? getDefaultTypography()\n pushTypography(rootLines, typographyPreset)\n\n // Layout (shared across themes)\n pushLayoutDefaults(rootLines)\n\n // Border radius based on preset definition\n pushBorderRadius(rootLines, borderRadius)\n\n // Component system defaults derived from colors\n pushComponentDefaults(rootLines, lightMode)\n\n // Light mode colours\n pushColorTokens(rootLines, lightMode, 'light')\n\n // Shared status colors (can be overridden later)\n pushStatusColors(rootLines, 'light')\n\n // Dark mode colors\n pushColorTokens(darkLines, darkMode, 'dark')\n pushStatusColors(darkLines, 'dark')\n pushDarkModeComponentOverrides(darkLines, darkMode)\n\n const sections: string[] = []\n sections.push(`/* ${label} Theme */`)\n sections.push(buildCssBlock(`[data-theme='${name}']`, rootLines))\n\n sections.push(`\n/* ${label} Theme - Dark Mode */`)\n sections.push(buildCssBlock(`[data-theme='${name}'][data-theme-mode='dark']`, darkLines))\n\n return sections.join('\\n').trim()\n}\n\nfunction toCssColor(color?: string | null): string | null {\n if (!color) return null\n const trimmed = color.trim()\n if (/^var\\(/i.test(trimmed) || /^hsl\\(/i.test(trimmed) || /^rgb(a)?\\(/i.test(trimmed)) {\n return trimmed\n }\n if (/^#?[0-9a-f]{6}$/i.test(trimmed) || /^#?[0-9a-f]{3}$/i.test(trimmed)) {\n return hexToHsl(trimmed)\n }\n return trimmed\n}\n\nfunction buildCssBlock(selector: string, lines: string[]): string {\n if (!lines.length) {\n return `${selector} {}`\n }\n\n const body = lines.map((line) => (line.startsWith('--') ? ` ${line}` : line)).join('\\n')\n return `${selector} {\\n${body}\\n}`\n}\n\nfunction pushTypography(lines: string[], typography: NonNullable<ThemePreset['typography']>): void {\n const {\n fontFamily,\n headingFamily,\n baseFontSize,\n lineHeight,\n fontWeights = {},\n letterSpacing = {},\n } = typography\n\n if (fontFamily) lines.push(`--typography-fontFamily: ${fontFamily};`)\n if (headingFamily) lines.push(`--typography-headingFamily: ${headingFamily};`)\n if (baseFontSize) lines.push(`--typography-baseFontSize: ${baseFontSize};`)\n if (lineHeight) lines.push(`--typography-lineHeight: ${lineHeight};`)\n\n Object.entries(fontWeights).forEach(([token, weight]) => {\n if (weight) {\n lines.push(`--typography-fontWeights-${token}: ${weight};`)\n }\n })\n\n Object.entries(letterSpacing).forEach(([token, value]) => {\n if (value) {\n lines.push(`--typography-letterSpacing-${token}: ${value};`)\n }\n })\n}\n\nfunction pushLayoutDefaults(lines: string[]): void {\n lines.push('--layout-containerWidth: 1440px;')\n lines.push('--layout-containerPadding: 1.5rem;')\n lines.push('--layout-containerPaddingTablet: 2.5rem;')\n lines.push('--layout-containerPaddingDesktop: 3rem;')\n lines.push('--layout-sectionSpacing: 5rem;')\n lines.push('--layout-sectionSpacingTablet: 7rem;')\n lines.push('--layout-sectionSpacingDesktop: 9rem;')\n lines.push('--layout-gridGap: 2rem;')\n lines.push('--layout-gridGapTablet: 2.5rem;')\n lines.push('--layout-gridGapDesktop: 3rem;')\n}\n\nfunction pushBorderRadius(lines: string[], borderRadius?: ThemePreset['borderRadius']): void {\n const presetKey = borderRadius ?? 'medium'\n const preset = borderRadiusPresets[presetKey]\n\n if (preset?.css) {\n Object.entries(preset.css).forEach(([token, value]) => {\n lines.push(`${token}: ${value};`)\n })\n\n const defaultRadius =\n preset.css['--radius-default'] ??\n preset.css['--radius-medium'] ??\n preset.css['--radius-large'] ??\n preset.css['--radius']\n\n if (defaultRadius) {\n lines.push(`--radius: ${defaultRadius};`)\n }\n }\n}\n\nfunction pushComponentDefaults(lines: string[], lightMode?: ThemePreset['lightMode']): void {\n lines.push('--components-button-padding: 1rem 2.5rem;')\n lines.push('--components-button-padding-large: 1.25rem 3rem;')\n lines.push('--components-button-transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);')\n lines.push('--components-button-hover-scale: 1.02;')\n lines.push('--components-button-hover-opacity: 0.9;')\n lines.push('--components-button-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);')\n lines.push('--components-button-hover-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);')\n\n lines.push('--components-card-padding: 2.5rem;')\n lines.push('--components-card-padding-compact: 1.5rem;')\n lines.push(\n '--components-card-shadow: 0 4px 16px -4px rgba(34, 42, 69, 0.12), 0 2px 8px -2px rgba(34, 42, 69, 0.08);',\n )\n lines.push(\n '--components-card-hover-shadow: 0 12px 48px -12px rgba(34, 42, 69, 0.2), 0 8px 32px -8px rgba(34, 42, 69, 0.12);',\n )\n lines.push('--components-card-hover-transform: translateY(-8px) scale(1.02);')\n\n const borderColor = toCssColor(lightMode?.border)\n if (borderColor) {\n lines.push(`--components-card-border: 1px solid ${borderColor};`)\n lines.push(`--components-input-border: 1.5px solid ${borderColor};`)\n }\n\n const primaryColor = toCssColor(lightMode?.primary)\n if (primaryColor) {\n lines.push(`--components-input-focus-border: 2px solid ${primaryColor};`)\n }\n\n lines.push('--components-input-height: 3.5rem;')\n lines.push('--components-input-padding: 1.25rem 1.75rem;')\n}\n\nconst COLOR_TOKENS: Array<{\n key: keyof NonNullable<ThemePreset['lightMode']>\n wrapWithVar?: boolean\n}> = [\n { key: 'background' },\n { key: 'foreground' },\n { key: 'card' },\n { key: 'cardForeground' },\n { key: 'popover' },\n { key: 'popoverForeground' },\n { key: 'primary', wrapWithVar: true },\n { key: 'primaryForeground' },\n { key: 'secondary' },\n { key: 'secondaryForeground' },\n { key: 'muted' },\n { key: 'mutedForeground' },\n { key: 'accent', wrapWithVar: true },\n { key: 'accentForeground' },\n { key: 'destructive' },\n { key: 'destructiveForeground' },\n { key: 'border' },\n { key: 'input' },\n { key: 'ring' },\n]\n\nfunction pushColorTokens(\n lines: string[],\n colors: ThemePreset['lightMode'] | ThemePreset['darkMode'],\n mode: 'light' | 'dark',\n): void {\n if (!colors) return\n\n COLOR_TOKENS.forEach(({ key, wrapWithVar }) => {\n const value = toCssColor(colors[key])\n if (!value) return\n\n if (key === 'ring') {\n lines.push('--ring: var(--primary);')\n return\n }\n\n if (wrapWithVar) {\n const customVar = key === 'accent' ? '--accent-custom' : '--primary-custom'\n lines.push(`--${toKebab(key)}: var(${customVar}, ${value});`)\n } else {\n lines.push(`--${toKebab(key)}: ${value};`)\n }\n })\n\n if (mode === 'light') {\n lines.push('--primary-hover: color-mix(in hsl, var(--primary), black 10%);')\n lines.push('--secondary-hover: color-mix(in hsl, var(--secondary), black 10%);')\n lines.push('--accent-hover: color-mix(in hsl, var(--accent), white 10%);')\n } else {\n lines.push('--primary-hover: color-mix(in hsl, var(--primary), white 10%);')\n lines.push('--secondary-hover: color-mix(in hsl, var(--secondary), white 10%);')\n lines.push('--accent-hover: color-mix(in hsl, var(--accent), white 10%);')\n }\n}\n\nfunction pushStatusColors(lines: string[], mode: 'light' | 'dark'): void {\n if (mode === 'light') {\n lines.push('--success: hsl(120, 60%, 40%);')\n lines.push('--success-foreground: hsl(0, 0%, 100%);')\n lines.push('--warning: hsl(42, 85%, 55%);')\n lines.push('--warning-foreground: hsl(25, 15%, 15%);')\n lines.push('--error: hsl(0, 85%, 52%);')\n lines.push('--error-foreground: hsl(0, 0%, 100%);')\n lines.push('--info: var(--primary);')\n lines.push('--info-foreground: var(--primary-foreground);')\n } else {\n lines.push('--success: hsl(120, 60%, 50%);')\n lines.push('--success-foreground: hsl(0, 0%, 10%);')\n lines.push('--warning: hsl(42, 85%, 55%);')\n lines.push('--warning-foreground: hsl(0, 0%, 10%);')\n lines.push('--error: hsl(0, 85%, 52%);')\n lines.push('--error-foreground: hsl(0, 0%, 100%);')\n lines.push('--info: var(--primary);')\n lines.push('--info-foreground: var(--primary-foreground);')\n }\n}\n\nfunction pushDarkModeComponentOverrides(lines: string[], darkMode?: ThemePreset['darkMode']): void {\n lines.push(\n '--components-card-shadow: 0 8px 32px -8px rgba(0, 0, 0, 0.6), 0 4px 16px -4px rgba(0, 0, 0, 0.4);',\n )\n lines.push(\n '--components-card-hover-shadow: 0 16px 64px -16px rgba(0, 0, 0, 0.8), 0 12px 40px -12px rgba(0, 0, 0, 0.6);',\n )\n\n const borderColor = toCssColor(darkMode?.border)\n if (borderColor) {\n lines.push(`--components-card-border: 1px solid ${borderColor};`)\n }\n\n const primaryColor = toCssColor(darkMode?.primary)\n if (primaryColor) {\n lines.push(`--components-input-focus-border: 2px solid ${primaryColor};`)\n }\n}\n\nfunction toKebab(token: string): string {\n return token.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)\n}\n\nfunction getDefaultTypography(): NonNullable<ThemePreset['typography']> {\n return {\n fontFamily: 'var(--font-inter, var(--font-geist-sans), system-ui, sans-serif)',\n headingFamily: 'var(--font-outfit)',\n baseFontSize: '16px',\n lineHeight: '1.75',\n fontWeights: {\n light: '300',\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n black: '900',\n },\n letterSpacing: {\n tight: '-0.02em',\n normal: '0',\n wide: '0.025em',\n wider: '0.05em',\n },\n }\n}\n\n/**\n * Generate CSS for all themes\n */\nexport function generateAllThemesCSS(presets: ThemePreset[]): string {\n return presets.map((preset) => generateThemeCSS(preset)).join('\\n\\n')\n}\n"],"names":["borderRadiusPresets","hexToHsl","generateThemeCSS","preset","name","label","borderRadius","typography","lightMode","darkMode","rootLines","darkLines","typographyPreset","getDefaultTypography","pushTypography","pushLayoutDefaults","pushBorderRadius","pushComponentDefaults","pushColorTokens","pushStatusColors","pushDarkModeComponentOverrides","sections","push","buildCssBlock","join","trim","toCssColor","color","trimmed","test","selector","lines","length","body","map","line","startsWith","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","letterSpacing","Object","entries","forEach","token","weight","value","presetKey","css","defaultRadius","borderColor","border","primaryColor","primary","COLOR_TOKENS","key","wrapWithVar","colors","mode","customVar","toKebab","replace","match","toLowerCase","light","normal","medium","semibold","bold","black","tight","wide","wider","generateAllThemesCSS","presets"],"mappings":"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"}
|
|
@@ -1,6 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Keys that strongly indicate a live-preview payload is (or contains) a theme
|
|
3
|
+
* configuration object. Used to avoid applying default theme CSS when an
|
|
4
|
+
* unrelated form (e.g. a page editor) emits live-preview data.
|
|
5
|
+
*/
|
|
6
|
+
export declare const THEME_LIKE_KEYS: readonly ["theme", "colorMode", "allowColorModeToggle", "lightMode", "darkMode", "customCSS", "borderRadius", "fontScale", "spacing", "animationLevel"];
|
|
7
|
+
export declare const isThemeLikeObject: (value: unknown) => value is Record<string, unknown>;
|
|
8
|
+
/**
|
|
9
|
+
* Safely extract the theme configuration object from a live-preview payload.
|
|
10
|
+
*
|
|
11
|
+
* Returns `null` when the payload is unrelated (e.g. page form data) so callers
|
|
12
|
+
* can skip re-applying theme CSS instead of falling back to defaults — which
|
|
13
|
+
* would visibly reset the theme while editing other documents.
|
|
14
|
+
*/
|
|
15
|
+
export declare const extractThemeConfigurationFromLiveData: (liveData: Record<string, unknown> | undefined, themeConfigurationKey?: string) => Record<string, unknown> | null;
|
|
2
16
|
export declare const buildLivePreviewThemeRuntime: (themeConfiguration: unknown) => {
|
|
3
|
-
theme: "cyberpunk" | "minimal" | "retro" | "brutal" | "pastel" | "ocean" | "forest" | "sunset" | "lavender" | "neutral" | "blue" | "green" | "red" | "orange" | "rose" | "violet" | "zinc" | "slate" | "stone" | "gray" | "cool" | "neon" | "solar" | "dealership" | "real-estate" | "real-estate-gold" | "real-estate-neutral";
|
|
17
|
+
theme: "cyberpunk" | "minimal" | "retro" | "brutal" | "pastel" | "ocean" | "forest" | "sunset" | "lavender" | "glassmorphism" | "claymorphism" | "neumorphism" | "aurora" | "luxury" | "healthcare" | "nordic" | "warm-earth" | "neutral" | "blue" | "green" | "red" | "orange" | "rose" | "violet" | "zinc" | "slate" | "stone" | "gray" | "cool" | "neon" | "solar" | "dealership" | "real-estate" | "real-estate-gold" | "real-estate-neutral";
|
|
4
18
|
mode: "light" | "dark";
|
|
5
19
|
css: string;
|
|
6
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"livePreviewThemeRuntime.d.ts","sourceRoot":"","sources":["../../src/utils/livePreviewThemeRuntime.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qCAAqC,GAChD,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"livePreviewThemeRuntime.d.ts","sourceRoot":"","sources":["../../src/utils/livePreviewThemeRuntime.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,eAAO,MAAM,eAAe,yJAWlB,CAAA;AAEV,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAKjF,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qCAAqC,GAChD,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC7C,8BAA4C,KAC3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAa5B,CAAA;AAkBD,eAAO,MAAM,4BAA4B,GAAI,oBAAoB,OAAO;;;;CA+BvE,CAAA"}
|
|
@@ -2,12 +2,45 @@ import { getBorderRadiusConfig } from '../providers/Theme/themeConfig.js';
|
|
|
2
2
|
import { resolveThemeConfiguration } from './resolveThemeConfiguration.js';
|
|
3
3
|
import { generateThemeColorsCss } from './themeColors.js';
|
|
4
4
|
import { generateThemeCSS } from './themeUtils.js';
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Keys that strongly indicate a live-preview payload is (or contains) a theme
|
|
7
|
+
* configuration object. Used to avoid applying default theme CSS when an
|
|
8
|
+
* unrelated form (e.g. a page editor) emits live-preview data.
|
|
9
|
+
*/ export const THEME_LIKE_KEYS = [
|
|
10
|
+
'theme',
|
|
11
|
+
'colorMode',
|
|
12
|
+
'allowColorModeToggle',
|
|
13
|
+
'lightMode',
|
|
14
|
+
'darkMode',
|
|
15
|
+
'customCSS',
|
|
16
|
+
'borderRadius',
|
|
17
|
+
'fontScale',
|
|
18
|
+
'spacing',
|
|
19
|
+
'animationLevel'
|
|
20
|
+
];
|
|
21
|
+
export const isThemeLikeObject = (value)=>{
|
|
22
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return THEME_LIKE_KEYS.some((key)=>key in value);
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Safely extract the theme configuration object from a live-preview payload.
|
|
29
|
+
*
|
|
30
|
+
* Returns `null` when the payload is unrelated (e.g. page form data) so callers
|
|
31
|
+
* can skip re-applying theme CSS instead of falling back to defaults — which
|
|
32
|
+
* would visibly reset the theme while editing other documents.
|
|
33
|
+
*/ export const extractThemeConfigurationFromLiveData = (liveData, themeConfigurationKey = 'themeConfiguration')=>{
|
|
6
34
|
const candidate = liveData?.[themeConfigurationKey];
|
|
7
|
-
if (candidate && typeof candidate === 'object') {
|
|
35
|
+
if (candidate && typeof candidate === 'object' && !Array.isArray(candidate)) {
|
|
8
36
|
return candidate;
|
|
9
37
|
}
|
|
10
|
-
|
|
38
|
+
// Some forms emit the theme config object directly at the root.
|
|
39
|
+
if (isThemeLikeObject(liveData)) {
|
|
40
|
+
return liveData;
|
|
41
|
+
}
|
|
42
|
+
// Ignore unrelated live-preview payloads to avoid fallback defaults.
|
|
43
|
+
return null;
|
|
11
44
|
};
|
|
12
45
|
const resolveColorMode = (mode)=>{
|
|
13
46
|
if (mode === 'dark') {
|
|
@@ -19,18 +52,8 @@ const resolveColorMode = (mode)=>{
|
|
|
19
52
|
return 'light';
|
|
20
53
|
};
|
|
21
54
|
export const buildLivePreviewThemeRuntime = (themeConfiguration)=>{
|
|
22
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
23
55
|
const resolved = resolveThemeConfiguration(themeConfiguration);
|
|
24
|
-
const
|
|
25
|
-
none: 'none',
|
|
26
|
-
small: 'small',
|
|
27
|
-
medium: 'medium',
|
|
28
|
-
large: 'large',
|
|
29
|
-
xl: 'xl',
|
|
30
|
-
full: 'xl'
|
|
31
|
-
};
|
|
32
|
-
const mappedBorderRadius = borderRadiusMap[resolved.borderRadius ?? 'medium'] ?? 'medium';
|
|
33
|
-
const borderRadiusConfig = getBorderRadiusConfig(mappedBorderRadius);
|
|
56
|
+
const borderRadiusConfig = getBorderRadiusConfig(resolved.borderRadius ?? 'medium');
|
|
34
57
|
const cssRecord = typeof borderRadiusConfig?.css === 'string' ? {
|
|
35
58
|
'--radius-default': borderRadiusConfig.css
|
|
36
59
|
} : borderRadiusConfig?.css ?? {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/livePreviewThemeRuntime.ts"],"sourcesContent":["import { getBorderRadiusConfig } from '../providers/Theme/themeConfig.js'\nimport { resolveThemeConfiguration } from './resolveThemeConfiguration.js'\nimport { generateThemeColorsCss } from './themeColors.js'\nimport { generateThemeCSS } from './themeUtils.js'\n\nexport const extractThemeConfigurationFromLiveData = (\n liveData: Record<string, unknown
|
|
1
|
+
{"version":3,"sources":["../../src/utils/livePreviewThemeRuntime.ts"],"sourcesContent":["import { getBorderRadiusConfig } from '../providers/Theme/themeConfig.js'\nimport { resolveThemeConfiguration } from './resolveThemeConfiguration.js'\nimport { generateThemeColorsCss } from './themeColors.js'\nimport { generateThemeCSS } from './themeUtils.js'\n\n/**\n * Keys that strongly indicate a live-preview payload is (or contains) a theme\n * configuration object. Used to avoid applying default theme CSS when an\n * unrelated form (e.g. a page editor) emits live-preview data.\n */\nexport const THEME_LIKE_KEYS = [\n 'theme',\n 'colorMode',\n 'allowColorModeToggle',\n 'lightMode',\n 'darkMode',\n 'customCSS',\n 'borderRadius',\n 'fontScale',\n 'spacing',\n 'animationLevel',\n] as const\n\nexport const isThemeLikeObject = (value: unknown): value is Record<string, unknown> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n return THEME_LIKE_KEYS.some((key) => key in (value as Record<string, unknown>))\n}\n\n/**\n * Safely extract the theme configuration object from a live-preview payload.\n *\n * Returns `null` when the payload is unrelated (e.g. page form data) so callers\n * can skip re-applying theme CSS instead of falling back to defaults — which\n * would visibly reset the theme while editing other documents.\n */\nexport const extractThemeConfigurationFromLiveData = (\n liveData: Record<string, unknown> | undefined,\n themeConfigurationKey = 'themeConfiguration',\n): Record<string, unknown> | null => {\n const candidate = liveData?.[themeConfigurationKey]\n if (candidate && typeof candidate === 'object' && !Array.isArray(candidate)) {\n return candidate as Record<string, unknown>\n }\n\n // Some forms emit the theme config object directly at the root.\n if (isThemeLikeObject(liveData)) {\n return liveData as Record<string, unknown>\n }\n\n // Ignore unrelated live-preview payloads to avoid fallback defaults.\n return null\n}\n\nconst resolveColorMode = (mode: string): 'light' | 'dark' => {\n if (mode === 'dark') {\n return 'dark'\n }\n\n if (\n mode === 'auto' &&\n globalThis.window !== undefined &&\n typeof globalThis.window.matchMedia === 'function'\n ) {\n return globalThis.window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n }\n\n return 'light'\n}\n\nexport const buildLivePreviewThemeRuntime = (themeConfiguration: unknown) => {\n const resolved = resolveThemeConfiguration(themeConfiguration)\n\n const borderRadiusConfig = getBorderRadiusConfig(resolved.borderRadius ?? 'medium')\n const cssRecord =\n typeof borderRadiusConfig?.css === 'string'\n ? { '--radius-default': borderRadiusConfig.css }\n : (borderRadiusConfig?.css ?? {})\n\n const borderRadiusCSS = Object.entries(cssRecord)\n .map(([property, value]) => ` ${property}: ${value};`)\n .join('\\n')\n\n const borderRadiusBlock = borderRadiusCSS ? `:root {\\n${borderRadiusCSS}\\n}` : ''\n\n const themeConfigurationCSS = generateThemeCSS(resolved)\n const colorModesCSS = generateThemeColorsCss({\n themeName: resolved.theme,\n lightMode: resolved.lightMode,\n darkMode: resolved.darkMode,\n })\n\n const customCSSBlock = typeof resolved.customCSS === 'string' ? resolved.customCSS.trim() : ''\n\n return {\n theme: resolved.theme,\n mode: resolveColorMode(resolved.colorMode),\n css: [borderRadiusBlock, themeConfigurationCSS, colorModesCSS, customCSSBlock]\n .filter((block) => Boolean(block?.trim?.().length))\n .join('\\n\\n'),\n }\n}\n"],"names":["getBorderRadiusConfig","resolveThemeConfiguration","generateThemeColorsCss","generateThemeCSS","THEME_LIKE_KEYS","isThemeLikeObject","value","Array","isArray","some","key","extractThemeConfigurationFromLiveData","liveData","themeConfigurationKey","candidate","resolveColorMode","mode","globalThis","window","undefined","matchMedia","matches","buildLivePreviewThemeRuntime","themeConfiguration","resolved","borderRadiusConfig","borderRadius","cssRecord","css","borderRadiusCSS","Object","entries","map","property","join","borderRadiusBlock","themeConfigurationCSS","colorModesCSS","themeName","theme","lightMode","darkMode","customCSSBlock","customCSS","trim","colorMode","filter","block","Boolean","length"],"mappings":"AAAA,SAASA,qBAAqB,QAAQ,oCAAmC;AACzE,SAASC,yBAAyB,QAAQ,iCAAgC;AAC1E,SAASC,sBAAsB,QAAQ,mBAAkB;AACzD,SAASC,gBAAgB,QAAQ,kBAAiB;AAElD;;;;CAIC,GACD,OAAO,MAAMC,kBAAkB;IAC7B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAS;AAEV,OAAO,MAAMC,oBAAoB,CAACC;IAChC,IAAI,CAACA,SAAS,OAAOA,UAAU,YAAYC,MAAMC,OAAO,CAACF,QAAQ;QAC/D,OAAO;IACT;IACA,OAAOF,gBAAgBK,IAAI,CAAC,CAACC,MAAQA,OAAQJ;AAC/C,EAAC;AAED;;;;;;CAMC,GACD,OAAO,MAAMK,wCAAwC,CACnDC,UACAC,wBAAwB,oBAAoB;IAE5C,MAAMC,YAAYF,UAAU,CAACC,sBAAsB;IACnD,IAAIC,aAAa,OAAOA,cAAc,YAAY,CAACP,MAAMC,OAAO,CAACM,YAAY;QAC3E,OAAOA;IACT;IAEA,gEAAgE;IAChE,IAAIT,kBAAkBO,WAAW;QAC/B,OAAOA;IACT;IAEA,qEAAqE;IACrE,OAAO;AACT,EAAC;AAED,MAAMG,mBAAmB,CAACC;IACxB,IAAIA,SAAS,QAAQ;QACnB,OAAO;IACT;IAEA,IACEA,SAAS,UACTC,WAAWC,MAAM,KAAKC,aACtB,OAAOF,WAAWC,MAAM,CAACE,UAAU,KAAK,YACxC;QACA,OAAOH,WAAWC,MAAM,CAACE,UAAU,CAAC,gCAAgCC,OAAO,GAAG,SAAS;IACzF;IAEA,OAAO;AACT;AAEA,OAAO,MAAMC,+BAA+B,CAACC;IAC3C,MAAMC,WAAWvB,0BAA0BsB;IAE3C,MAAME,qBAAqBzB,sBAAsBwB,SAASE,YAAY,IAAI;IAC1E,MAAMC,YACJ,OAAOF,oBAAoBG,QAAQ,WAC/B;QAAE,oBAAoBH,mBAAmBG,GAAG;IAAC,IAC5CH,oBAAoBG,OAAO,CAAC;IAEnC,MAAMC,kBAAkBC,OAAOC,OAAO,CAACJ,WACpCK,GAAG,CAAC,CAAC,CAACC,UAAU3B,MAAM,GAAK,CAAC,EAAE,EAAE2B,SAAS,EAAE,EAAE3B,MAAM,CAAC,CAAC,EACrD4B,IAAI,CAAC;IAER,MAAMC,oBAAoBN,kBAAkB,CAAC,SAAS,EAAEA,gBAAgB,GAAG,CAAC,GAAG;IAE/E,MAAMO,wBAAwBjC,iBAAiBqB;IAC/C,MAAMa,gBAAgBnC,uBAAuB;QAC3CoC,WAAWd,SAASe,KAAK;QACzBC,WAAWhB,SAASgB,SAAS;QAC7BC,UAAUjB,SAASiB,QAAQ;IAC7B;IAEA,MAAMC,iBAAiB,OAAOlB,SAASmB,SAAS,KAAK,WAAWnB,SAASmB,SAAS,CAACC,IAAI,KAAK;IAE5F,OAAO;QACLL,OAAOf,SAASe,KAAK;QACrBvB,MAAMD,iBAAiBS,SAASqB,SAAS;QACzCjB,KAAK;YAACO;YAAmBC;YAAuBC;YAAeK;SAAe,CAC3EI,MAAM,CAAC,CAACC,QAAUC,QAAQD,OAAOH,SAASK,SAC1Cf,IAAI,CAAC;IACV;AACF,EAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payload field labels, descriptions and placeholders arrive either as plain
|
|
3
|
+
* strings or as `{ en, cs, … }` objects. Resolve them against the active admin
|
|
4
|
+
* language (full tag, then base language), falling back to English and then to
|
|
5
|
+
* the first available translation.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveLocalizedText(value: unknown, language: string, fallback?: string): string;
|
|
8
|
+
//# sourceMappingURL=localizedText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localizedText.d.ts","sourceRoot":"","sources":["../../src/utils/localizedText.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,SAAK,GACZ,MAAM,CASR"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payload field labels, descriptions and placeholders arrive either as plain
|
|
3
|
+
* strings or as `{ en, cs, … }` objects. Resolve them against the active admin
|
|
4
|
+
* language (full tag, then base language), falling back to English and then to
|
|
5
|
+
* the first available translation.
|
|
6
|
+
*/ export function resolveLocalizedText(value, language, fallback = '') {
|
|
7
|
+
if (typeof value === 'string') return value;
|
|
8
|
+
if (!value || typeof value !== 'object') return fallback;
|
|
9
|
+
const localized = value;
|
|
10
|
+
const base = language.split('-')[0];
|
|
11
|
+
const candidates = [
|
|
12
|
+
localized[language],
|
|
13
|
+
localized[base],
|
|
14
|
+
localized.en,
|
|
15
|
+
...Object.values(localized)
|
|
16
|
+
];
|
|
17
|
+
const resolved = candidates.find((candidate)=>typeof candidate === 'string');
|
|
18
|
+
return resolved ?? fallback;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=localizedText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/localizedText.ts"],"sourcesContent":["/**\n * Payload field labels, descriptions and placeholders arrive either as plain\n * strings or as `{ en, cs, … }` objects. Resolve them against the active admin\n * language (full tag, then base language), falling back to English and then to\n * the first available translation.\n */\nexport function resolveLocalizedText(\n value: unknown,\n language: string,\n fallback = '',\n): string {\n if (typeof value === 'string') return value\n if (!value || typeof value !== 'object') return fallback\n\n const localized = value as Record<string, unknown>\n const base = language.split('-')[0]\n const candidates = [localized[language], localized[base], localized.en, ...Object.values(localized)]\n const resolved = candidates.find((candidate): candidate is string => typeof candidate === 'string')\n return resolved ?? fallback\n}\n"],"names":["resolveLocalizedText","value","language","fallback","localized","base","split","candidates","en","Object","values","resolved","find","candidate"],"mappings":"AAAA;;;;;CAKC,GACD,OAAO,SAASA,qBACdC,KAAc,EACdC,QAAgB,EAChBC,WAAW,EAAE;IAEb,IAAI,OAAOF,UAAU,UAAU,OAAOA;IACtC,IAAI,CAACA,SAAS,OAAOA,UAAU,UAAU,OAAOE;IAEhD,MAAMC,YAAYH;IAClB,MAAMI,OAAOH,SAASI,KAAK,CAAC,IAAI,CAAC,EAAE;IACnC,MAAMC,aAAa;QAACH,SAAS,CAACF,SAAS;QAAEE,SAAS,CAACC,KAAK;QAAED,UAAUI,EAAE;WAAKC,OAAOC,MAAM,CAACN;KAAW;IACpG,MAAMO,WAAWJ,WAAWK,IAAI,CAAC,CAACC,YAAmC,OAAOA,cAAc;IAC1F,OAAOF,YAAYR;AACrB"}
|
|
@@ -46,6 +46,27 @@ interface GenericThemeConfiguration {
|
|
|
46
46
|
info?: string | null;
|
|
47
47
|
} | null;
|
|
48
48
|
typography?: ThemeTypographyOverride | null;
|
|
49
|
+
visualEffects?: {
|
|
50
|
+
effectStyle?: string | null;
|
|
51
|
+
shadowIntensity?: string | null;
|
|
52
|
+
backdropBlur?: string | null;
|
|
53
|
+
borderStyle?: string | null;
|
|
54
|
+
borderWidth?: string | null;
|
|
55
|
+
glassOpacity?: number | null;
|
|
56
|
+
} | null;
|
|
57
|
+
componentStyles?: {
|
|
58
|
+
buttonVariant?: string | null;
|
|
59
|
+
buttonSize?: string | null;
|
|
60
|
+
cardStyle?: string | null;
|
|
61
|
+
cardHoverEffect?: string | null;
|
|
62
|
+
imageStyle?: string | null;
|
|
63
|
+
iconSet?: string | null;
|
|
64
|
+
navbarStyle?: string | null;
|
|
65
|
+
footerStyle?: string | null;
|
|
66
|
+
linkStyle?: string | null;
|
|
67
|
+
enableScrollReveal?: boolean | null;
|
|
68
|
+
enableHoverAnimations?: boolean | null;
|
|
69
|
+
} | null;
|
|
49
70
|
}
|
|
50
71
|
declare const BORDER_RADIUS_VALUES: readonly ["none", "small", "medium", "large", "xl"];
|
|
51
72
|
declare const FONT_SCALE_VALUES: readonly ["small", "medium", "large"];
|
|
@@ -56,6 +77,27 @@ type FontScaleOption = (typeof FONT_SCALE_VALUES)[number];
|
|
|
56
77
|
type SpacingOption = (typeof SPACING_VALUES)[number];
|
|
57
78
|
type AnimationLevelOption = (typeof ANIMATION_LEVEL_VALUES)[number];
|
|
58
79
|
type ThemeColorConfiguration = NonNullable<GenericThemeConfiguration['lightMode']>;
|
|
80
|
+
export interface ResolvedVisualEffects {
|
|
81
|
+
effectStyle?: string | null;
|
|
82
|
+
shadowIntensity?: string | null;
|
|
83
|
+
backdropBlur?: string | null;
|
|
84
|
+
borderStyle?: string | null;
|
|
85
|
+
borderWidth?: string | null;
|
|
86
|
+
glassOpacity?: number | null;
|
|
87
|
+
}
|
|
88
|
+
export interface ResolvedComponentStyles {
|
|
89
|
+
buttonVariant?: string | null;
|
|
90
|
+
buttonSize?: string | null;
|
|
91
|
+
cardStyle?: string | null;
|
|
92
|
+
cardHoverEffect?: string | null;
|
|
93
|
+
imageStyle?: string | null;
|
|
94
|
+
iconSet?: string | null;
|
|
95
|
+
navbarStyle?: string | null;
|
|
96
|
+
footerStyle?: string | null;
|
|
97
|
+
linkStyle?: string | null;
|
|
98
|
+
enableScrollReveal?: boolean | null;
|
|
99
|
+
enableHoverAnimations?: boolean | null;
|
|
100
|
+
}
|
|
59
101
|
export interface ResolvedThemeConfiguration {
|
|
60
102
|
theme: ThemeDefaults;
|
|
61
103
|
colorMode: Mode;
|
|
@@ -68,8 +110,10 @@ export interface ResolvedThemeConfiguration {
|
|
|
68
110
|
lightMode?: ThemeColorConfiguration;
|
|
69
111
|
darkMode?: ThemeColorConfiguration;
|
|
70
112
|
typography: ThemeTypographyPreset | null;
|
|
113
|
+
visualEffects?: ResolvedVisualEffects | null;
|
|
114
|
+
componentStyles?: ResolvedComponentStyles | null;
|
|
71
115
|
}
|
|
72
116
|
export declare const DEFAULT_THEME_CONFIGURATION: ResolvedThemeConfiguration;
|
|
73
|
-
export declare function resolveThemeConfiguration(themeConfiguration?:
|
|
117
|
+
export declare function resolveThemeConfiguration(themeConfiguration?: unknown): ResolvedThemeConfiguration;
|
|
74
118
|
export {};
|
|
75
119
|
//# sourceMappingURL=resolveThemeConfiguration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveThemeConfiguration.d.ts","sourceRoot":"","sources":["../../src/utils/resolveThemeConfiguration.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAE1D,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAGtE;;;GAGG;AACH,UAAU,uBAAuB;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED;;;GAGG;AACH,UAAU,yBAAyB;IACjC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,oBAAoB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACrB,GAAG,IAAI,CAAA;IACR,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACrB,GAAG,IAAI,CAAA;IACR,UAAU,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"resolveThemeConfiguration.d.ts","sourceRoot":"","sources":["../../src/utils/resolveThemeConfiguration.ts"],"names":[],"mappings":"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"}
|
|
@@ -84,10 +84,12 @@ function isMode(value) {
|
|
|
84
84
|
return typeof value === 'string' && MODE_VALUES.includes(value);
|
|
85
85
|
}
|
|
86
86
|
export function resolveThemeConfiguration(themeConfiguration) {
|
|
87
|
-
|
|
87
|
+
// Accept `unknown` so callers don't need to cast from app-specific payload-types
|
|
88
|
+
const cfg = themeConfiguration !== null && typeof themeConfiguration === 'object' && !Array.isArray(themeConfiguration) ? themeConfiguration : null;
|
|
89
|
+
if (!cfg) {
|
|
88
90
|
return DEFAULT_THEME_CONFIGURATION;
|
|
89
91
|
}
|
|
90
|
-
const { theme, colorMode, allowColorModeToggle, borderRadius, fontScale, spacing, animationLevel, customCSS, lightMode, darkMode, typography } =
|
|
92
|
+
const { theme, colorMode, allowColorModeToggle, borderRadius, fontScale, spacing, animationLevel, customCSS, lightMode, darkMode, typography, visualEffects, componentStyles } = cfg;
|
|
91
93
|
const resolvedTheme = typeof theme === 'string' && themeIsValid(theme) ? theme : DEFAULT_THEME_CONFIGURATION.theme;
|
|
92
94
|
const resolvedMode = isMode(colorMode) ? colorMode : DEFAULT_THEME_CONFIGURATION.colorMode;
|
|
93
95
|
const resolvedBorderRadius = resolveBorderRadius(borderRadius);
|
|
@@ -102,6 +104,9 @@ export function resolveThemeConfiguration(themeConfiguration) {
|
|
|
102
104
|
const resolvedLightMode = mergeColorModes(baseLightMode, lightMode);
|
|
103
105
|
const resolvedDarkMode = mergeColorModes(baseDarkMode, darkMode);
|
|
104
106
|
const resolvedTypography = mergeTypography(preset?.typography, typography) ?? preset?.typography ?? null;
|
|
107
|
+
// Pass visualEffects and componentStyles through as-is (no normalization needed)
|
|
108
|
+
const resolvedVisualEffects = visualEffects ?? null;
|
|
109
|
+
const resolvedComponentStyles = componentStyles ?? null;
|
|
105
110
|
return {
|
|
106
111
|
theme: resolvedTheme,
|
|
107
112
|
colorMode: resolvedMode,
|
|
@@ -113,7 +118,9 @@ export function resolveThemeConfiguration(themeConfiguration) {
|
|
|
113
118
|
customCSS: resolvedCustomCSS,
|
|
114
119
|
lightMode: resolvedLightMode,
|
|
115
120
|
darkMode: resolvedDarkMode,
|
|
116
|
-
typography: resolvedTypography
|
|
121
|
+
typography: resolvedTypography,
|
|
122
|
+
visualEffects: resolvedVisualEffects,
|
|
123
|
+
componentStyles: resolvedComponentStyles
|
|
117
124
|
};
|
|
118
125
|
}
|
|
119
126
|
function mergeColorModes(base, overrides) {
|
|
@@ -141,8 +148,8 @@ function mergeTypography(base, overrides) {
|
|
|
141
148
|
return base ?? null;
|
|
142
149
|
}
|
|
143
150
|
const result = {
|
|
144
|
-
fontFamily: base?.fontFamily ?? 'var(--font-geist-sans)',
|
|
145
|
-
headingFamily: base?.headingFamily ?? 'var(--font-geist-sans)',
|
|
151
|
+
fontFamily: base?.fontFamily ?? 'var(--font-inter, var(--font-geist-sans), system-ui, sans-serif)',
|
|
152
|
+
headingFamily: base?.headingFamily ?? 'var(--font-outfit, var(--font-geist-sans), system-ui, sans-serif)',
|
|
146
153
|
baseFontSize: base?.baseFontSize ?? '16px',
|
|
147
154
|
lineHeight: base?.lineHeight ?? '1.6',
|
|
148
155
|
fontWeights: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/resolveThemeConfiguration.ts"],"sourcesContent":["import { FONT_VALUE_TO_CSS } from '../constants/themeFonts.js'\nimport type { ThemeTypographyPreset } from '../presets.js'\nimport { allThemePresets } from '../presets.js'\nimport type { Mode, ThemeDefaults } from '../providers/Theme/types.js'\nimport { themeIsValid } from '../providers/Theme/types.js'\n\n/**\n * Generic theme configuration structure that matches Payload's generated types\n * without depending on specific payload-types versions\n */\ninterface ThemeTypographyOverride {\n bodyFont?: string | null\n headingFont?: string | null\n bodyFontCustom?: string | null\n headingFontCustom?: string | null\n baseFontSize?: string | null\n lineHeight?: string | null\n}\n\n/**\n * Generic theme configuration interface that accepts any compatible structure\n * This avoids type conflicts between different versions of payload-types\n */\ninterface GenericThemeConfiguration {\n theme?: string | null\n colorMode?: string | null\n allowColorModeToggle?: boolean | null\n borderRadius?: string | null\n fontScale?: string | null\n spacing?: string | null\n animationLevel?: string | null\n customCSS?: string | null\n lightMode?: {\n primary?: string | null\n secondary?: string | null\n accent?: string | null\n neutral?: string | null\n success?: string | null\n warning?: string | null\n error?: string | null\n info?: string | null\n } | null\n darkMode?: {\n primary?: string | null\n secondary?: string | null\n accent?: string | null\n neutral?: string | null\n success?: string | null\n warning?: string | null\n error?: string | null\n info?: string | null\n } | null\n typography?: ThemeTypographyOverride | null\n}\n\nconst BORDER_RADIUS_VALUES = ['none', 'small', 'medium', 'large', 'xl'] as const\nconst LEGACY_BORDER_RADIUS_ALIASES: Record<string, (typeof BORDER_RADIUS_VALUES)[number]> = {\n full: 'xl',\n}\nconst FONT_SCALE_VALUES = ['small', 'medium', 'large'] as const\nconst SPACING_VALUES = ['compact', 'medium', 'spacious'] as const\nconst ANIMATION_LEVEL_VALUES = ['none', 'reduced', 'medium', 'high'] as const\nconst LEGACY_ANIMATION_ALIASES: Record<string, (typeof ANIMATION_LEVEL_VALUES)[number]> = {\n full: 'high',\n}\nconst MODE_VALUES = ['auto', 'light', 'dark'] as const\n\ntype BorderRadiusOption = (typeof BORDER_RADIUS_VALUES)[number]\ntype FontScaleOption = (typeof FONT_SCALE_VALUES)[number]\ntype SpacingOption = (typeof SPACING_VALUES)[number]\ntype AnimationLevelOption = (typeof ANIMATION_LEVEL_VALUES)[number]\n\ntype ThemeModeOption = (typeof MODE_VALUES)[number]\n\ntype ThemeColorConfiguration = NonNullable<GenericThemeConfiguration['lightMode']>\n\nconst DEFAULT_THEME_NAME: ThemeDefaults = 'cool'\nconst DEFAULT_THEME_PRESET = allThemePresets.find((preset) => preset.name === DEFAULT_THEME_NAME)\n\nexport interface ResolvedThemeConfiguration {\n theme: ThemeDefaults\n colorMode: Mode\n allowColorModeToggle: boolean\n borderRadius: BorderRadiusOption\n fontScale: FontScaleOption\n spacing: SpacingOption\n animationLevel: AnimationLevelOption\n customCSS: string | null\n lightMode?: ThemeColorConfiguration\n darkMode?: ThemeColorConfiguration\n typography: ThemeTypographyPreset | null\n}\n\nexport const DEFAULT_THEME_CONFIGURATION: ResolvedThemeConfiguration = {\n theme: DEFAULT_THEME_NAME,\n colorMode: 'auto',\n allowColorModeToggle: true,\n borderRadius: 'medium',\n fontScale: 'medium',\n spacing: 'medium',\n animationLevel: 'medium',\n customCSS: null,\n lightMode: DEFAULT_THEME_PRESET?.lightMode,\n darkMode: DEFAULT_THEME_PRESET?.darkMode,\n typography: DEFAULT_THEME_PRESET?.typography ?? null,\n}\n\nfunction resolveBorderRadius(value: unknown): BorderRadiusOption {\n if (typeof value === 'string') {\n if (BORDER_RADIUS_VALUES.includes(value as BorderRadiusOption)) {\n return value as BorderRadiusOption\n }\n\n const legacyMatch = LEGACY_BORDER_RADIUS_ALIASES[value]\n if (legacyMatch) {\n return legacyMatch\n }\n }\n\n return DEFAULT_THEME_CONFIGURATION.borderRadius\n}\n\nfunction isFontScale(value: unknown): value is FontScaleOption {\n return typeof value === 'string' && FONT_SCALE_VALUES.includes(value as FontScaleOption)\n}\n\nfunction isSpacing(value: unknown): value is SpacingOption {\n return typeof value === 'string' && SPACING_VALUES.includes(value as SpacingOption)\n}\n\nfunction resolveAnimationLevel(value: unknown): AnimationLevelOption {\n if (typeof value === 'string') {\n if (ANIMATION_LEVEL_VALUES.includes(value as AnimationLevelOption)) {\n return value as AnimationLevelOption\n }\n\n const legacyMatch = LEGACY_ANIMATION_ALIASES[value]\n if (legacyMatch) {\n return legacyMatch\n }\n }\n\n return DEFAULT_THEME_CONFIGURATION.animationLevel\n}\n\nfunction isMode(value: unknown): value is ThemeModeOption {\n return typeof value === 'string' && MODE_VALUES.includes(value as ThemeModeOption)\n}\n\nexport function resolveThemeConfiguration(\n themeConfiguration?: GenericThemeConfiguration | null,\n): ResolvedThemeConfiguration {\n if (!themeConfiguration) {\n return DEFAULT_THEME_CONFIGURATION\n }\n\n const {\n theme,\n colorMode,\n allowColorModeToggle,\n borderRadius,\n fontScale,\n spacing,\n animationLevel,\n customCSS,\n lightMode,\n darkMode,\n typography,\n } = themeConfiguration\n\n const resolvedTheme =\n typeof theme === 'string' && themeIsValid(theme)\n ? (theme as ThemeDefaults)\n : DEFAULT_THEME_CONFIGURATION.theme\n const resolvedMode = isMode(colorMode)\n ? (colorMode as Mode)\n : DEFAULT_THEME_CONFIGURATION.colorMode\n const resolvedBorderRadius = resolveBorderRadius(borderRadius)\n const resolvedFontScale = isFontScale(fontScale)\n ? fontScale\n : DEFAULT_THEME_CONFIGURATION.fontScale\n const resolvedSpacing = isSpacing(spacing) ? spacing : DEFAULT_THEME_CONFIGURATION.spacing\n const resolvedAnimationLevel = resolveAnimationLevel(animationLevel)\n const resolvedAllowToggle =\n typeof allowColorModeToggle === 'boolean'\n ? allowColorModeToggle\n : DEFAULT_THEME_CONFIGURATION.allowColorModeToggle\n const resolvedCustomCSS = typeof customCSS === 'string' ? customCSS : null\n const preset = allThemePresets.find((candidate) => candidate.name === resolvedTheme)\n const baseLightMode = preset?.lightMode ?? DEFAULT_THEME_CONFIGURATION.lightMode\n const baseDarkMode = preset?.darkMode ?? DEFAULT_THEME_CONFIGURATION.darkMode\n const resolvedLightMode = mergeColorModes(baseLightMode, lightMode)\n const resolvedDarkMode = mergeColorModes(baseDarkMode, darkMode)\n const resolvedTypography =\n mergeTypography(preset?.typography, typography) ?? preset?.typography ?? null\n\n return {\n theme: resolvedTheme,\n colorMode: resolvedMode,\n allowColorModeToggle: resolvedAllowToggle,\n borderRadius: resolvedBorderRadius,\n fontScale: resolvedFontScale,\n spacing: resolvedSpacing,\n animationLevel: resolvedAnimationLevel,\n customCSS: resolvedCustomCSS,\n lightMode: resolvedLightMode,\n darkMode: resolvedDarkMode,\n typography: resolvedTypography,\n }\n}\n\nfunction mergeColorModes(\n base?: ThemeColorConfiguration,\n overrides?: GenericThemeConfiguration['lightMode'],\n): ThemeColorConfiguration | undefined {\n const merged: Record<string, string> = {}\n\n if (base) {\n Object.entries(base).forEach(([key, value]) => {\n if (typeof value === 'string' && value.trim().length > 0) {\n merged[key] = value\n }\n })\n }\n\n if (overrides) {\n Object.entries(overrides).forEach(([key, value]) => {\n if (typeof value === 'string' && value.trim().length > 0) {\n merged[key] = value\n } else if (value === null) {\n delete merged[key]\n }\n })\n }\n\n return Object.keys(merged).length > 0 ? (merged as ThemeColorConfiguration) : undefined\n}\n\nfunction mergeTypography(\n base?: ThemeTypographyPreset | null,\n overrides?: ThemeTypographyOverride | null,\n): ThemeTypographyPreset | null {\n if (!base && !overrides) {\n return base ?? null\n }\n\n const result: ThemeTypographyPreset = {\n fontFamily: base?.fontFamily ?? 'var(--font-geist-sans)',\n headingFamily: base?.headingFamily ?? 'var(--font-geist-sans)',\n baseFontSize: base?.baseFontSize ?? '16px',\n lineHeight: base?.lineHeight ?? '1.6',\n fontWeights: { ...(base?.fontWeights ?? {}) },\n letterSpacing: { ...(base?.letterSpacing ?? {}) },\n }\n\n if (overrides) {\n const resolvedBodyFont = resolveFontSelection(\n overrides.bodyFont,\n overrides.bodyFontCustom,\n base?.fontFamily,\n )\n if (resolvedBodyFont) {\n result.fontFamily = resolvedBodyFont\n }\n\n const resolvedHeadingFont = resolveFontSelection(\n overrides.headingFont,\n overrides.headingFontCustom,\n base?.headingFamily,\n )\n if (resolvedHeadingFont) {\n result.headingFamily = resolvedHeadingFont\n }\n\n if (overrides.baseFontSize && overrides.baseFontSize !== 'preset') {\n result.baseFontSize = overrides.baseFontSize\n }\n\n if (overrides.lineHeight && overrides.lineHeight !== 'preset') {\n result.lineHeight = overrides.lineHeight\n }\n }\n\n return result\n}\n\nfunction resolveFontSelection(\n selection?: string | null,\n custom?: string | null,\n fallback?: string | null,\n): string | null {\n if (!selection || selection === 'preset') {\n return fallback ?? null\n }\n\n if (selection === 'custom') {\n const trimmed = custom?.trim()\n return trimmed && trimmed.length > 0 ? trimmed : (fallback ?? null)\n }\n\n const mapped = FONT_VALUE_TO_CSS[selection]\n return mapped ?? fallback ?? null\n}\n"],"names":["FONT_VALUE_TO_CSS","allThemePresets","themeIsValid","BORDER_RADIUS_VALUES","LEGACY_BORDER_RADIUS_ALIASES","full","FONT_SCALE_VALUES","SPACING_VALUES","ANIMATION_LEVEL_VALUES","LEGACY_ANIMATION_ALIASES","MODE_VALUES","DEFAULT_THEME_NAME","DEFAULT_THEME_PRESET","find","preset","name","DEFAULT_THEME_CONFIGURATION","theme","colorMode","allowColorModeToggle","borderRadius","fontScale","spacing","animationLevel","customCSS","lightMode","darkMode","typography","resolveBorderRadius","value","includes","legacyMatch","isFontScale","isSpacing","resolveAnimationLevel","isMode","resolveThemeConfiguration","themeConfiguration","resolvedTheme","resolvedMode","resolvedBorderRadius","resolvedFontScale","resolvedSpacing","resolvedAnimationLevel","resolvedAllowToggle","resolvedCustomCSS","candidate","baseLightMode","baseDarkMode","resolvedLightMode","mergeColorModes","resolvedDarkMode","resolvedTypography","mergeTypography","base","overrides","merged","Object","entries","forEach","key","trim","length","keys","undefined","result","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","letterSpacing","resolvedBodyFont","resolveFontSelection","bodyFont","bodyFontCustom","resolvedHeadingFont","headingFont","headingFontCustom","selection","custom","fallback","trimmed","mapped"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,6BAA4B;AAE9D,SAASC,eAAe,QAAQ,gBAAe;AAE/C,SAASC,YAAY,QAAQ,8BAA6B;AAmD1D,MAAMC,uBAAuB;IAAC;IAAQ;IAAS;IAAU;IAAS;CAAK;AACvE,MAAMC,+BAAsF;IAC1FC,MAAM;AACR;AACA,MAAMC,oBAAoB;IAAC;IAAS;IAAU;CAAQ;AACtD,MAAMC,iBAAiB;IAAC;IAAW;IAAU;CAAW;AACxD,MAAMC,yBAAyB;IAAC;IAAQ;IAAW;IAAU;CAAO;AACpE,MAAMC,2BAAoF;IACxFJ,MAAM;AACR;AACA,MAAMK,cAAc;IAAC;IAAQ;IAAS;CAAO;AAW7C,MAAMC,qBAAoC;AAC1C,MAAMC,uBAAuBX,gBAAgBY,IAAI,CAAC,CAACC,SAAWA,OAAOC,IAAI,KAAKJ;AAgB9E,OAAO,MAAMK,8BAA0D;IACrEC,OAAON;IACPO,WAAW;IACXC,sBAAsB;IACtBC,cAAc;IACdC,WAAW;IACXC,SAAS;IACTC,gBAAgB;IAChBC,WAAW;IACXC,WAAWb,sBAAsBa;IACjCC,UAAUd,sBAAsBc;IAChCC,YAAYf,sBAAsBe,cAAc;AAClD,EAAC;AAED,SAASC,oBAAoBC,KAAc;IACzC,IAAI,OAAOA,UAAU,UAAU;QAC7B,IAAI1B,qBAAqB2B,QAAQ,CAACD,QAA8B;YAC9D,OAAOA;QACT;QAEA,MAAME,cAAc3B,4BAA4B,CAACyB,MAAM;QACvD,IAAIE,aAAa;YACf,OAAOA;QACT;IACF;IAEA,OAAOf,4BAA4BI,YAAY;AACjD;AAEA,SAASY,YAAYH,KAAc;IACjC,OAAO,OAAOA,UAAU,YAAYvB,kBAAkBwB,QAAQ,CAACD;AACjE;AAEA,SAASI,UAAUJ,KAAc;IAC/B,OAAO,OAAOA,UAAU,YAAYtB,eAAeuB,QAAQ,CAACD;AAC9D;AAEA,SAASK,sBAAsBL,KAAc;IAC3C,IAAI,OAAOA,UAAU,UAAU;QAC7B,IAAIrB,uBAAuBsB,QAAQ,CAACD,QAAgC;YAClE,OAAOA;QACT;QAEA,MAAME,cAActB,wBAAwB,CAACoB,MAAM;QACnD,IAAIE,aAAa;YACf,OAAOA;QACT;IACF;IAEA,OAAOf,4BAA4BO,cAAc;AACnD;AAEA,SAASY,OAAON,KAAc;IAC5B,OAAO,OAAOA,UAAU,YAAYnB,YAAYoB,QAAQ,CAACD;AAC3D;AAEA,OAAO,SAASO,0BACdC,kBAAqD;IAErD,IAAI,CAACA,oBAAoB;QACvB,OAAOrB;IACT;IAEA,MAAM,EACJC,KAAK,EACLC,SAAS,EACTC,oBAAoB,EACpBC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,cAAc,EACdC,SAAS,EACTC,SAAS,EACTC,QAAQ,EACRC,UAAU,EACX,GAAGU;IAEJ,MAAMC,gBACJ,OAAOrB,UAAU,YAAYf,aAAae,SACrCA,QACDD,4BAA4BC,KAAK;IACvC,MAAMsB,eAAeJ,OAAOjB,aACvBA,YACDF,4BAA4BE,SAAS;IACzC,MAAMsB,uBAAuBZ,oBAAoBR;IACjD,MAAMqB,oBAAoBT,YAAYX,aAClCA,YACAL,4BAA4BK,SAAS;IACzC,MAAMqB,kBAAkBT,UAAUX,WAAWA,UAAUN,4BAA4BM,OAAO;IAC1F,MAAMqB,yBAAyBT,sBAAsBX;IACrD,MAAMqB,sBACJ,OAAOzB,yBAAyB,YAC5BA,uBACAH,4BAA4BG,oBAAoB;IACtD,MAAM0B,oBAAoB,OAAOrB,cAAc,WAAWA,YAAY;IACtE,MAAMV,SAASb,gBAAgBY,IAAI,CAAC,CAACiC,YAAcA,UAAU/B,IAAI,KAAKuB;IACtE,MAAMS,gBAAgBjC,QAAQW,aAAaT,4BAA4BS,SAAS;IAChF,MAAMuB,eAAelC,QAAQY,YAAYV,4BAA4BU,QAAQ;IAC7E,MAAMuB,oBAAoBC,gBAAgBH,eAAetB;IACzD,MAAM0B,mBAAmBD,gBAAgBF,cAActB;IACvD,MAAM0B,qBACJC,gBAAgBvC,QAAQa,YAAYA,eAAeb,QAAQa,cAAc;IAE3E,OAAO;QACLV,OAAOqB;QACPpB,WAAWqB;QACXpB,sBAAsByB;QACtBxB,cAAcoB;QACdnB,WAAWoB;QACXnB,SAASoB;QACTnB,gBAAgBoB;QAChBnB,WAAWqB;QACXpB,WAAWwB;QACXvB,UAAUyB;QACVxB,YAAYyB;IACd;AACF;AAEA,SAASF,gBACPI,IAA8B,EAC9BC,SAAkD;IAElD,MAAMC,SAAiC,CAAC;IAExC,IAAIF,MAAM;QACRG,OAAOC,OAAO,CAACJ,MAAMK,OAAO,CAAC,CAAC,CAACC,KAAK/B,MAAM;YACxC,IAAI,OAAOA,UAAU,YAAYA,MAAMgC,IAAI,GAAGC,MAAM,GAAG,GAAG;gBACxDN,MAAM,CAACI,IAAI,GAAG/B;YAChB;QACF;IACF;IAEA,IAAI0B,WAAW;QACbE,OAAOC,OAAO,CAACH,WAAWI,OAAO,CAAC,CAAC,CAACC,KAAK/B,MAAM;YAC7C,IAAI,OAAOA,UAAU,YAAYA,MAAMgC,IAAI,GAAGC,MAAM,GAAG,GAAG;gBACxDN,MAAM,CAACI,IAAI,GAAG/B;YAChB,OAAO,IAAIA,UAAU,MAAM;gBACzB,OAAO2B,MAAM,CAACI,IAAI;YACpB;QACF;IACF;IAEA,OAAOH,OAAOM,IAAI,CAACP,QAAQM,MAAM,GAAG,IAAKN,SAAqCQ;AAChF;AAEA,SAASX,gBACPC,IAAmC,EACnCC,SAA0C;IAE1C,IAAI,CAACD,QAAQ,CAACC,WAAW;QACvB,OAAOD,QAAQ;IACjB;IAEA,MAAMW,SAAgC;QACpCC,YAAYZ,MAAMY,cAAc;QAChCC,eAAeb,MAAMa,iBAAiB;QACtCC,cAAcd,MAAMc,gBAAgB;QACpCC,YAAYf,MAAMe,cAAc;QAChCC,aAAa;YAAE,GAAIhB,MAAMgB,eAAe,CAAC,CAAC;QAAE;QAC5CC,eAAe;YAAE,GAAIjB,MAAMiB,iBAAiB,CAAC,CAAC;QAAE;IAClD;IAEA,IAAIhB,WAAW;QACb,MAAMiB,mBAAmBC,qBACvBlB,UAAUmB,QAAQ,EAClBnB,UAAUoB,cAAc,EACxBrB,MAAMY;QAER,IAAIM,kBAAkB;YACpBP,OAAOC,UAAU,GAAGM;QACtB;QAEA,MAAMI,sBAAsBH,qBAC1BlB,UAAUsB,WAAW,EACrBtB,UAAUuB,iBAAiB,EAC3BxB,MAAMa;QAER,IAAIS,qBAAqB;YACvBX,OAAOE,aAAa,GAAGS;QACzB;QAEA,IAAIrB,UAAUa,YAAY,IAAIb,UAAUa,YAAY,KAAK,UAAU;YACjEH,OAAOG,YAAY,GAAGb,UAAUa,YAAY;QAC9C;QAEA,IAAIb,UAAUc,UAAU,IAAId,UAAUc,UAAU,KAAK,UAAU;YAC7DJ,OAAOI,UAAU,GAAGd,UAAUc,UAAU;QAC1C;IACF;IAEA,OAAOJ;AACT;AAEA,SAASQ,qBACPM,SAAyB,EACzBC,MAAsB,EACtBC,QAAwB;IAExB,IAAI,CAACF,aAAaA,cAAc,UAAU;QACxC,OAAOE,YAAY;IACrB;IAEA,IAAIF,cAAc,UAAU;QAC1B,MAAMG,UAAUF,QAAQnB;QACxB,OAAOqB,WAAWA,QAAQpB,MAAM,GAAG,IAAIoB,UAAWD,YAAY;IAChE;IAEA,MAAME,SAASnF,iBAAiB,CAAC+E,UAAU;IAC3C,OAAOI,UAAUF,YAAY;AAC/B"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/resolveThemeConfiguration.ts"],"sourcesContent":["import { FONT_VALUE_TO_CSS } from '../constants/themeFonts.js'\nimport type { ThemeTypographyPreset } from '../presets.js'\nimport { allThemePresets } from '../presets.js'\nimport type { Mode, ThemeDefaults } from '../providers/Theme/types.js'\nimport { themeIsValid } from '../providers/Theme/types.js'\n\n/**\n * Generic theme configuration structure that matches Payload's generated types\n * without depending on specific payload-types versions\n */\ninterface ThemeTypographyOverride {\n bodyFont?: string | null\n headingFont?: string | null\n bodyFontCustom?: string | null\n headingFontCustom?: string | null\n baseFontSize?: string | null\n lineHeight?: string | null\n}\n\n/**\n * Generic theme configuration interface that accepts any compatible structure\n * This avoids type conflicts between different versions of payload-types\n */\ninterface GenericThemeConfiguration {\n theme?: string | null\n colorMode?: string | null\n allowColorModeToggle?: boolean | null\n borderRadius?: string | null\n fontScale?: string | null\n spacing?: string | null\n animationLevel?: string | null\n customCSS?: string | null\n lightMode?: {\n primary?: string | null\n secondary?: string | null\n accent?: string | null\n neutral?: string | null\n success?: string | null\n warning?: string | null\n error?: string | null\n info?: string | null\n } | null\n darkMode?: {\n primary?: string | null\n secondary?: string | null\n accent?: string | null\n neutral?: string | null\n success?: string | null\n warning?: string | null\n error?: string | null\n info?: string | null\n } | null\n typography?: ThemeTypographyOverride | null\n visualEffects?: {\n effectStyle?: string | null\n shadowIntensity?: string | null\n backdropBlur?: string | null\n borderStyle?: string | null\n borderWidth?: string | null\n glassOpacity?: number | null\n } | null\n componentStyles?: {\n buttonVariant?: string | null\n buttonSize?: string | null\n cardStyle?: string | null\n cardHoverEffect?: string | null\n imageStyle?: string | null\n iconSet?: string | null\n navbarStyle?: string | null\n footerStyle?: string | null\n linkStyle?: string | null\n enableScrollReveal?: boolean | null\n enableHoverAnimations?: boolean | null\n } | null\n}\n\nconst BORDER_RADIUS_VALUES = ['none', 'small', 'medium', 'large', 'xl'] as const\nconst LEGACY_BORDER_RADIUS_ALIASES: Record<string, (typeof BORDER_RADIUS_VALUES)[number]> = {\n full: 'xl',\n}\nconst FONT_SCALE_VALUES = ['small', 'medium', 'large'] as const\nconst SPACING_VALUES = ['compact', 'medium', 'spacious'] as const\nconst ANIMATION_LEVEL_VALUES = ['none', 'reduced', 'medium', 'high'] as const\nconst LEGACY_ANIMATION_ALIASES: Record<string, (typeof ANIMATION_LEVEL_VALUES)[number]> = {\n full: 'high',\n}\nconst MODE_VALUES = ['auto', 'light', 'dark'] as const\n\ntype BorderRadiusOption = (typeof BORDER_RADIUS_VALUES)[number]\ntype FontScaleOption = (typeof FONT_SCALE_VALUES)[number]\ntype SpacingOption = (typeof SPACING_VALUES)[number]\ntype AnimationLevelOption = (typeof ANIMATION_LEVEL_VALUES)[number]\n\ntype ThemeModeOption = (typeof MODE_VALUES)[number]\n\ntype ThemeColorConfiguration = NonNullable<GenericThemeConfiguration['lightMode']>\n\nconst DEFAULT_THEME_NAME: ThemeDefaults = 'cool'\nconst DEFAULT_THEME_PRESET = allThemePresets.find((preset) => preset.name === DEFAULT_THEME_NAME)\n\nexport interface ResolvedVisualEffects {\n effectStyle?: string | null\n shadowIntensity?: string | null\n backdropBlur?: string | null\n borderStyle?: string | null\n borderWidth?: string | null\n glassOpacity?: number | null\n}\n\nexport interface ResolvedComponentStyles {\n buttonVariant?: string | null\n buttonSize?: string | null\n cardStyle?: string | null\n cardHoverEffect?: string | null\n imageStyle?: string | null\n iconSet?: string | null\n navbarStyle?: string | null\n footerStyle?: string | null\n linkStyle?: string | null\n enableScrollReveal?: boolean | null\n enableHoverAnimations?: boolean | null\n}\n\nexport interface ResolvedThemeConfiguration {\n theme: ThemeDefaults\n colorMode: Mode\n allowColorModeToggle: boolean\n borderRadius: BorderRadiusOption\n fontScale: FontScaleOption\n spacing: SpacingOption\n animationLevel: AnimationLevelOption\n customCSS: string | null\n lightMode?: ThemeColorConfiguration\n darkMode?: ThemeColorConfiguration\n typography: ThemeTypographyPreset | null\n visualEffects?: ResolvedVisualEffects | null\n componentStyles?: ResolvedComponentStyles | null\n}\n\nexport const DEFAULT_THEME_CONFIGURATION: ResolvedThemeConfiguration = {\n theme: DEFAULT_THEME_NAME,\n colorMode: 'auto',\n allowColorModeToggle: true,\n borderRadius: 'medium',\n fontScale: 'medium',\n spacing: 'medium',\n animationLevel: 'medium',\n customCSS: null,\n lightMode: DEFAULT_THEME_PRESET?.lightMode,\n darkMode: DEFAULT_THEME_PRESET?.darkMode,\n typography: DEFAULT_THEME_PRESET?.typography ?? null,\n}\n\nfunction resolveBorderRadius(value: unknown): BorderRadiusOption {\n if (typeof value === 'string') {\n if (BORDER_RADIUS_VALUES.includes(value as BorderRadiusOption)) {\n return value as BorderRadiusOption\n }\n\n const legacyMatch = LEGACY_BORDER_RADIUS_ALIASES[value]\n if (legacyMatch) {\n return legacyMatch\n }\n }\n\n return DEFAULT_THEME_CONFIGURATION.borderRadius\n}\n\nfunction isFontScale(value: unknown): value is FontScaleOption {\n return typeof value === 'string' && FONT_SCALE_VALUES.includes(value as FontScaleOption)\n}\n\nfunction isSpacing(value: unknown): value is SpacingOption {\n return typeof value === 'string' && SPACING_VALUES.includes(value as SpacingOption)\n}\n\nfunction resolveAnimationLevel(value: unknown): AnimationLevelOption {\n if (typeof value === 'string') {\n if (ANIMATION_LEVEL_VALUES.includes(value as AnimationLevelOption)) {\n return value as AnimationLevelOption\n }\n\n const legacyMatch = LEGACY_ANIMATION_ALIASES[value]\n if (legacyMatch) {\n return legacyMatch\n }\n }\n\n return DEFAULT_THEME_CONFIGURATION.animationLevel\n}\n\nfunction isMode(value: unknown): value is ThemeModeOption {\n return typeof value === 'string' && MODE_VALUES.includes(value as ThemeModeOption)\n}\n\nexport function resolveThemeConfiguration(\n themeConfiguration?: unknown,\n): ResolvedThemeConfiguration {\n // Accept `unknown` so callers don't need to cast from app-specific payload-types\n const cfg =\n themeConfiguration !== null &&\n typeof themeConfiguration === 'object' &&\n !Array.isArray(themeConfiguration)\n ? (themeConfiguration as GenericThemeConfiguration)\n : null\n\n if (!cfg) {\n return DEFAULT_THEME_CONFIGURATION\n }\n\n const {\n theme,\n colorMode,\n allowColorModeToggle,\n borderRadius,\n fontScale,\n spacing,\n animationLevel,\n customCSS,\n lightMode,\n darkMode,\n typography,\n visualEffects,\n componentStyles,\n } = cfg\n\n const resolvedTheme =\n typeof theme === 'string' && themeIsValid(theme)\n ? (theme as ThemeDefaults)\n : DEFAULT_THEME_CONFIGURATION.theme\n const resolvedMode = isMode(colorMode)\n ? (colorMode as Mode)\n : DEFAULT_THEME_CONFIGURATION.colorMode\n const resolvedBorderRadius = resolveBorderRadius(borderRadius)\n const resolvedFontScale = isFontScale(fontScale)\n ? fontScale\n : DEFAULT_THEME_CONFIGURATION.fontScale\n const resolvedSpacing = isSpacing(spacing) ? spacing : DEFAULT_THEME_CONFIGURATION.spacing\n const resolvedAnimationLevel = resolveAnimationLevel(animationLevel)\n const resolvedAllowToggle =\n typeof allowColorModeToggle === 'boolean'\n ? allowColorModeToggle\n : DEFAULT_THEME_CONFIGURATION.allowColorModeToggle\n const resolvedCustomCSS = typeof customCSS === 'string' ? customCSS : null\n const preset = allThemePresets.find((candidate) => candidate.name === resolvedTheme)\n const baseLightMode = preset?.lightMode ?? DEFAULT_THEME_CONFIGURATION.lightMode\n const baseDarkMode = preset?.darkMode ?? DEFAULT_THEME_CONFIGURATION.darkMode\n const resolvedLightMode = mergeColorModes(baseLightMode, lightMode)\n const resolvedDarkMode = mergeColorModes(baseDarkMode, darkMode)\n const resolvedTypography =\n mergeTypography(preset?.typography, typography) ?? preset?.typography ?? null\n\n // Pass visualEffects and componentStyles through as-is (no normalization needed)\n const resolvedVisualEffects = visualEffects ?? null\n const resolvedComponentStyles = componentStyles ?? null\n\n return {\n theme: resolvedTheme,\n colorMode: resolvedMode,\n allowColorModeToggle: resolvedAllowToggle,\n borderRadius: resolvedBorderRadius,\n fontScale: resolvedFontScale,\n spacing: resolvedSpacing,\n animationLevel: resolvedAnimationLevel,\n customCSS: resolvedCustomCSS,\n lightMode: resolvedLightMode,\n darkMode: resolvedDarkMode,\n typography: resolvedTypography,\n visualEffects: resolvedVisualEffects,\n componentStyles: resolvedComponentStyles,\n }\n}\n\nfunction mergeColorModes(\n base?: ThemeColorConfiguration,\n overrides?: GenericThemeConfiguration['lightMode'],\n): ThemeColorConfiguration | undefined {\n const merged: Record<string, string> = {}\n\n if (base) {\n Object.entries(base).forEach(([key, value]) => {\n if (typeof value === 'string' && value.trim().length > 0) {\n merged[key] = value\n }\n })\n }\n\n if (overrides) {\n Object.entries(overrides).forEach(([key, value]) => {\n if (typeof value === 'string' && value.trim().length > 0) {\n merged[key] = value\n } else if (value === null) {\n delete merged[key]\n }\n })\n }\n\n return Object.keys(merged).length > 0 ? (merged as ThemeColorConfiguration) : undefined\n}\n\nfunction mergeTypography(\n base?: ThemeTypographyPreset | null,\n overrides?: ThemeTypographyOverride | null,\n): ThemeTypographyPreset | null {\n if (!base && !overrides) {\n return base ?? null\n }\n\n const result: ThemeTypographyPreset = {\n fontFamily:\n base?.fontFamily ?? 'var(--font-inter, var(--font-geist-sans), system-ui, sans-serif)',\n headingFamily:\n base?.headingFamily ?? 'var(--font-outfit, var(--font-geist-sans), system-ui, sans-serif)',\n baseFontSize: base?.baseFontSize ?? '16px',\n lineHeight: base?.lineHeight ?? '1.6',\n fontWeights: { ...(base?.fontWeights ?? {}) },\n letterSpacing: { ...(base?.letterSpacing ?? {}) },\n }\n\n if (overrides) {\n const resolvedBodyFont = resolveFontSelection(\n overrides.bodyFont,\n overrides.bodyFontCustom,\n base?.fontFamily,\n )\n if (resolvedBodyFont) {\n result.fontFamily = resolvedBodyFont\n }\n\n const resolvedHeadingFont = resolveFontSelection(\n overrides.headingFont,\n overrides.headingFontCustom,\n base?.headingFamily,\n )\n if (resolvedHeadingFont) {\n result.headingFamily = resolvedHeadingFont\n }\n\n if (overrides.baseFontSize && overrides.baseFontSize !== 'preset') {\n result.baseFontSize = overrides.baseFontSize\n }\n\n if (overrides.lineHeight && overrides.lineHeight !== 'preset') {\n result.lineHeight = overrides.lineHeight\n }\n }\n\n return result\n}\n\nfunction resolveFontSelection(\n selection?: string | null,\n custom?: string | null,\n fallback?: string | null,\n): string | null {\n if (!selection || selection === 'preset') {\n return fallback ?? null\n }\n\n if (selection === 'custom') {\n const trimmed = custom?.trim()\n return trimmed && trimmed.length > 0 ? trimmed : (fallback ?? null)\n }\n\n const mapped = FONT_VALUE_TO_CSS[selection]\n return mapped ?? fallback ?? null\n}\n"],"names":["FONT_VALUE_TO_CSS","allThemePresets","themeIsValid","BORDER_RADIUS_VALUES","LEGACY_BORDER_RADIUS_ALIASES","full","FONT_SCALE_VALUES","SPACING_VALUES","ANIMATION_LEVEL_VALUES","LEGACY_ANIMATION_ALIASES","MODE_VALUES","DEFAULT_THEME_NAME","DEFAULT_THEME_PRESET","find","preset","name","DEFAULT_THEME_CONFIGURATION","theme","colorMode","allowColorModeToggle","borderRadius","fontScale","spacing","animationLevel","customCSS","lightMode","darkMode","typography","resolveBorderRadius","value","includes","legacyMatch","isFontScale","isSpacing","resolveAnimationLevel","isMode","resolveThemeConfiguration","themeConfiguration","cfg","Array","isArray","visualEffects","componentStyles","resolvedTheme","resolvedMode","resolvedBorderRadius","resolvedFontScale","resolvedSpacing","resolvedAnimationLevel","resolvedAllowToggle","resolvedCustomCSS","candidate","baseLightMode","baseDarkMode","resolvedLightMode","mergeColorModes","resolvedDarkMode","resolvedTypography","mergeTypography","resolvedVisualEffects","resolvedComponentStyles","base","overrides","merged","Object","entries","forEach","key","trim","length","keys","undefined","result","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","letterSpacing","resolvedBodyFont","resolveFontSelection","bodyFont","bodyFontCustom","resolvedHeadingFont","headingFont","headingFontCustom","selection","custom","fallback","trimmed","mapped"],"mappings":"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"}
|
|
@@ -18,6 +18,9 @@ interface ColorMode {
|
|
|
18
18
|
border?: string | null;
|
|
19
19
|
input?: string | null;
|
|
20
20
|
ring?: string | null;
|
|
21
|
+
gradientFrom?: string | null;
|
|
22
|
+
gradientVia?: string | null;
|
|
23
|
+
gradientTo?: string | null;
|
|
21
24
|
}
|
|
22
25
|
export interface ThemeColors {
|
|
23
26
|
lightMode?: ColorMode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"themeColors.d.ts","sourceRoot":"","sources":["../../src/utils/themeColors.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"themeColors.d.ts","sourceRoot":"","sources":["../../src/utils/themeColors.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,UAAU,0BAA2B,SAAQ,WAAW;IACtD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA2BD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA4C5C;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACrD,MAAM,CAkBR;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,CAelF"}
|