@kilivi/payloadcms-theme-management 0.1.10 → 0.1.11
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.
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type { SiteSetting } from '../payload-types.js';
|
|
2
1
|
import type { Mode, ThemeDefaults } from '../providers/Theme/types.js';
|
|
3
2
|
import type { ThemeTypographyPreset } from '../presets.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generic theme configuration structure that matches Payload's generated types
|
|
5
|
+
* without depending on specific payload-types versions
|
|
6
|
+
*/
|
|
4
7
|
interface ThemeTypographyOverride {
|
|
5
8
|
bodyFont?: string | null;
|
|
6
9
|
headingFont?: string | null;
|
|
@@ -9,9 +12,41 @@ interface ThemeTypographyOverride {
|
|
|
9
12
|
baseFontSize?: string | null;
|
|
10
13
|
lineHeight?: string | null;
|
|
11
14
|
}
|
|
12
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Generic theme configuration interface that accepts any compatible structure
|
|
17
|
+
* This avoids type conflicts between different versions of payload-types
|
|
18
|
+
*/
|
|
19
|
+
interface GenericThemeConfiguration {
|
|
20
|
+
theme?: string | null;
|
|
21
|
+
colorMode?: string | null;
|
|
22
|
+
allowColorModeToggle?: boolean | null;
|
|
23
|
+
borderRadius?: string | null;
|
|
24
|
+
fontScale?: string | null;
|
|
25
|
+
spacing?: string | null;
|
|
26
|
+
animationLevel?: string | null;
|
|
27
|
+
customCSS?: string | null;
|
|
28
|
+
lightMode?: {
|
|
29
|
+
primary?: string | null;
|
|
30
|
+
secondary?: string | null;
|
|
31
|
+
accent?: string | null;
|
|
32
|
+
neutral?: string | null;
|
|
33
|
+
success?: string | null;
|
|
34
|
+
warning?: string | null;
|
|
35
|
+
error?: string | null;
|
|
36
|
+
info?: string | null;
|
|
37
|
+
} | null;
|
|
38
|
+
darkMode?: {
|
|
39
|
+
primary?: string | null;
|
|
40
|
+
secondary?: string | null;
|
|
41
|
+
accent?: string | null;
|
|
42
|
+
neutral?: string | null;
|
|
43
|
+
success?: string | null;
|
|
44
|
+
warning?: string | null;
|
|
45
|
+
error?: string | null;
|
|
46
|
+
info?: string | null;
|
|
47
|
+
} | null;
|
|
13
48
|
typography?: ThemeTypographyOverride | null;
|
|
14
|
-
}
|
|
49
|
+
}
|
|
15
50
|
declare const BORDER_RADIUS_VALUES: readonly ["none", "small", "medium", "large", "xl"];
|
|
16
51
|
declare const FONT_SCALE_VALUES: readonly ["small", "medium", "large"];
|
|
17
52
|
declare const SPACING_VALUES: readonly ["compact", "medium", "spacious"];
|
|
@@ -20,7 +55,7 @@ type BorderRadiusOption = (typeof BORDER_RADIUS_VALUES)[number];
|
|
|
20
55
|
type FontScaleOption = (typeof FONT_SCALE_VALUES)[number];
|
|
21
56
|
type SpacingOption = (typeof SPACING_VALUES)[number];
|
|
22
57
|
type AnimationLevelOption = (typeof ANIMATION_LEVEL_VALUES)[number];
|
|
23
|
-
type ThemeColorConfiguration = NonNullable<
|
|
58
|
+
type ThemeColorConfiguration = NonNullable<GenericThemeConfiguration['lightMode']>;
|
|
24
59
|
export interface ResolvedThemeConfiguration {
|
|
25
60
|
theme: ThemeDefaults;
|
|
26
61
|
colorMode: Mode;
|
|
@@ -35,6 +70,6 @@ export interface ResolvedThemeConfiguration {
|
|
|
35
70
|
typography: ThemeTypographyPreset | null;
|
|
36
71
|
}
|
|
37
72
|
export declare const DEFAULT_THEME_CONFIGURATION: ResolvedThemeConfiguration;
|
|
38
|
-
export declare function resolveThemeConfiguration(themeConfiguration?:
|
|
73
|
+
export declare function resolveThemeConfiguration(themeConfiguration?: GenericThemeConfiguration | null): ResolvedThemeConfiguration;
|
|
39
74
|
export {};
|
|
40
75
|
//# 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,
|
|
1
|
+
{"version":3,"file":"resolveThemeConfiguration.d.ts","sourceRoot":"","sources":["../../src/utils/resolveThemeConfiguration.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/resolveThemeConfiguration.ts"],"sourcesContent":["import { FONT_VALUE_TO_CSS } from '../constants/themeFonts.js'\r\nimport type { SiteSetting } from '../payload-types.js'\r\nimport type { Mode, ThemeDefaults } from '../providers/Theme/types.js'\r\nimport { themeIsValid } from '../providers/Theme/types.js'\r\nimport type { ThemeTypographyPreset } from '../presets.js'\r\nimport { defaultThemePresets } from '../presets.js'\r\n\r\ninterface ThemeTypographyOverride {\r\n bodyFont?: string | null\r\n headingFont?: string | null\r\n bodyFontCustom?: string | null\r\n headingFontCustom?: string | null\r\n baseFontSize?: string | null\r\n lineHeight?: string | null\r\n}\r\n\r\ntype SiteThemeConfiguration = SiteSetting['themeConfiguration'] & {\r\n typography?: ThemeTypographyOverride | null\r\n}\r\n\r\nconst BORDER_RADIUS_VALUES = ['none', 'small', 'medium', 'large', 'xl'] as const\r\nconst LEGACY_BORDER_RADIUS_ALIASES: Record<string, (typeof BORDER_RADIUS_VALUES)[number]> = {\r\n full: 'xl',\r\n}\r\nconst FONT_SCALE_VALUES = ['small', 'medium', 'large'] as const\r\nconst SPACING_VALUES = ['compact', 'medium', 'spacious'] as const\r\nconst ANIMATION_LEVEL_VALUES = ['none', 'reduced', 'medium', 'high'] as const\r\nconst LEGACY_ANIMATION_ALIASES: Record<string, (typeof ANIMATION_LEVEL_VALUES)[number]> = {\r\n full: 'high',\r\n}\r\nconst MODE_VALUES = ['auto', 'light', 'dark'] as const\r\n\r\ntype BorderRadiusOption = (typeof BORDER_RADIUS_VALUES)[number]\r\ntype FontScaleOption = (typeof FONT_SCALE_VALUES)[number]\r\ntype SpacingOption = (typeof SPACING_VALUES)[number]\r\ntype AnimationLevelOption = (typeof ANIMATION_LEVEL_VALUES)[number]\r\n\r\ntype ThemeModeOption = (typeof MODE_VALUES)[number]\r\n\r\ntype ThemeColorConfiguration = NonNullable<SiteThemeConfiguration['lightMode']>\r\n\r\nconst DEFAULT_THEME_NAME: ThemeDefaults = 'cool'\r\nconst DEFAULT_THEME_PRESET = defaultThemePresets.find(\r\n (preset) => preset.name === DEFAULT_THEME_NAME,\r\n)\r\n\r\nexport interface ResolvedThemeConfiguration {\r\n theme: ThemeDefaults\r\n colorMode: Mode\r\n allowColorModeToggle: boolean\r\n borderRadius: BorderRadiusOption\r\n fontScale: FontScaleOption\r\n spacing: SpacingOption\r\n animationLevel: AnimationLevelOption\r\n customCSS: string | null\r\n lightMode?: ThemeColorConfiguration\r\n darkMode?: ThemeColorConfiguration\r\n typography: ThemeTypographyPreset | null\r\n}\r\n\r\nexport const DEFAULT_THEME_CONFIGURATION: ResolvedThemeConfiguration = {\r\n theme: DEFAULT_THEME_NAME,\r\n colorMode: 'auto',\r\n allowColorModeToggle: true,\r\n borderRadius: 'medium',\r\n fontScale: 'medium',\r\n spacing: 'medium',\r\n animationLevel: 'medium',\r\n customCSS: null,\r\n lightMode: DEFAULT_THEME_PRESET?.lightMode,\r\n darkMode: DEFAULT_THEME_PRESET?.darkMode,\r\n typography: DEFAULT_THEME_PRESET?.typography ?? null,\r\n}\r\n\r\nfunction resolveBorderRadius(value: unknown): BorderRadiusOption {\r\n if (typeof value === 'string') {\r\n if (BORDER_RADIUS_VALUES.includes(value as BorderRadiusOption)) {\r\n return value as BorderRadiusOption\r\n }\r\n\r\n const legacyMatch = LEGACY_BORDER_RADIUS_ALIASES[value]\r\n if (legacyMatch) {\r\n return legacyMatch\r\n }\r\n }\r\n\r\n return DEFAULT_THEME_CONFIGURATION.borderRadius\r\n}\r\n\r\nfunction isFontScale(value: unknown): value is FontScaleOption {\r\n return typeof value === 'string' && FONT_SCALE_VALUES.includes(value as FontScaleOption)\r\n}\r\n\r\nfunction isSpacing(value: unknown): value is SpacingOption {\r\n return typeof value === 'string' && SPACING_VALUES.includes(value as SpacingOption)\r\n}\r\n\r\nfunction resolveAnimationLevel(value: unknown): AnimationLevelOption {\r\n if (typeof value === 'string') {\r\n if (ANIMATION_LEVEL_VALUES.includes(value as AnimationLevelOption)) {\r\n return value as AnimationLevelOption\r\n }\r\n\r\n const legacyMatch = LEGACY_ANIMATION_ALIASES[value]\r\n if (legacyMatch) {\r\n return legacyMatch\r\n }\r\n }\r\n\r\n return DEFAULT_THEME_CONFIGURATION.animationLevel\r\n}\r\n\r\nfunction isMode(value: unknown): value is ThemeModeOption {\r\n return typeof value === 'string' && MODE_VALUES.includes(value as ThemeModeOption)\r\n}\r\n\r\nexport function resolveThemeConfiguration(\r\n themeConfiguration?: SiteThemeConfiguration | null,\r\n): ResolvedThemeConfiguration {\r\n if (!themeConfiguration) {\r\n return DEFAULT_THEME_CONFIGURATION\r\n }\r\n\r\n const {\r\n theme,\r\n colorMode,\r\n allowColorModeToggle,\r\n borderRadius,\r\n fontScale,\r\n spacing,\r\n animationLevel,\r\n customCSS,\r\n lightMode,\r\n darkMode,\r\n typography,\r\n } = themeConfiguration\r\n\r\n const resolvedTheme =\r\n typeof theme === 'string' && themeIsValid(theme)\r\n ? (theme as ThemeDefaults)\r\n : DEFAULT_THEME_CONFIGURATION.theme\r\n const resolvedMode = isMode(colorMode)\r\n ? (colorMode as Mode)\r\n : DEFAULT_THEME_CONFIGURATION.colorMode\r\n const resolvedBorderRadius = resolveBorderRadius(borderRadius)\r\n const resolvedFontScale = isFontScale(fontScale)\r\n ? fontScale\r\n : DEFAULT_THEME_CONFIGURATION.fontScale\r\n const resolvedSpacing = isSpacing(spacing) ? spacing : DEFAULT_THEME_CONFIGURATION.spacing\r\n const resolvedAnimationLevel = resolveAnimationLevel(animationLevel)\r\n const resolvedAllowToggle =\r\n typeof allowColorModeToggle === 'boolean'\r\n ? allowColorModeToggle\r\n : DEFAULT_THEME_CONFIGURATION.allowColorModeToggle\r\n const resolvedCustomCSS = typeof customCSS === 'string' ? customCSS : null\r\n const preset = defaultThemePresets.find((candidate) => candidate.name === resolvedTheme)\r\n const baseLightMode = preset?.lightMode ?? DEFAULT_THEME_CONFIGURATION.lightMode\r\n const baseDarkMode = preset?.darkMode ?? DEFAULT_THEME_CONFIGURATION.darkMode\r\n const resolvedLightMode = mergeColorModes(baseLightMode, lightMode)\r\n const resolvedDarkMode = mergeColorModes(baseDarkMode, darkMode)\r\n const resolvedTypography =\r\n mergeTypography(preset?.typography, typography) ?? preset?.typography ?? null\r\n\r\n return {\r\n theme: resolvedTheme,\r\n colorMode: resolvedMode,\r\n allowColorModeToggle: resolvedAllowToggle,\r\n borderRadius: resolvedBorderRadius,\r\n fontScale: resolvedFontScale,\r\n spacing: resolvedSpacing,\r\n animationLevel: resolvedAnimationLevel,\r\n customCSS: resolvedCustomCSS,\r\n lightMode: resolvedLightMode,\r\n darkMode: resolvedDarkMode,\r\n typography: resolvedTypography,\r\n }\r\n}\r\n\r\nfunction mergeColorModes(\r\n base?: ThemeColorConfiguration,\r\n overrides?: SiteThemeConfiguration['lightMode'],\r\n): ThemeColorConfiguration | undefined {\r\n const merged: Record<string, string> = {}\r\n\r\n if (base) {\r\n Object.entries(base).forEach(([key, value]) => {\r\n if (typeof value === 'string' && value.trim().length > 0) {\r\n merged[key] = value\r\n }\r\n })\r\n }\r\n\r\n if (overrides) {\r\n Object.entries(overrides).forEach(([key, value]) => {\r\n if (typeof value === 'string' && value.trim().length > 0) {\r\n merged[key] = value\r\n } else if (value === null) {\r\n delete merged[key]\r\n }\r\n })\r\n }\r\n\r\n return Object.keys(merged).length > 0 ? (merged as ThemeColorConfiguration) : undefined\r\n}\r\n\r\nfunction mergeTypography(\r\n base?: ThemeTypographyPreset | null,\r\n overrides?: ThemeTypographyOverride | null,\r\n): ThemeTypographyPreset | null {\r\n if (!base && !overrides) {\r\n return base ?? null\r\n }\r\n\r\n const result: ThemeTypographyPreset = {\r\n fontFamily: base?.fontFamily ?? 'var(--font-geist-sans)',\r\n headingFamily: base?.headingFamily ?? 'var(--font-geist-sans)',\r\n baseFontSize: base?.baseFontSize ?? '16px',\r\n lineHeight: base?.lineHeight ?? '1.6',\r\n fontWeights: { ...(base?.fontWeights ?? {}) },\r\n letterSpacing: { ...(base?.letterSpacing ?? {}) },\r\n }\r\n\r\n if (overrides) {\r\n const resolvedBodyFont = resolveFontSelection(\r\n overrides.bodyFont,\r\n overrides.bodyFontCustom,\r\n base?.fontFamily,\r\n )\r\n if (resolvedBodyFont) {\r\n result.fontFamily = resolvedBodyFont\r\n }\r\n\r\n const resolvedHeadingFont = resolveFontSelection(\r\n overrides.headingFont,\r\n overrides.headingFontCustom,\r\n base?.headingFamily,\r\n )\r\n if (resolvedHeadingFont) {\r\n result.headingFamily = resolvedHeadingFont\r\n }\r\n\r\n if (overrides.baseFontSize && overrides.baseFontSize !== 'preset') {\r\n result.baseFontSize = overrides.baseFontSize\r\n }\r\n\r\n if (overrides.lineHeight && overrides.lineHeight !== 'preset') {\r\n result.lineHeight = overrides.lineHeight\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nfunction resolveFontSelection(\r\n selection?: string | null,\r\n custom?: string | null,\r\n fallback?: string | null,\r\n): string | null {\r\n if (!selection || selection === 'preset') {\r\n return fallback ?? null\r\n }\r\n\r\n if (selection === 'custom') {\r\n const trimmed = custom?.trim()\r\n return trimmed && trimmed.length > 0 ? trimmed : (fallback ?? null)\r\n }\r\n\r\n const mapped = FONT_VALUE_TO_CSS[selection]\r\n return mapped ?? fallback ?? null\r\n}\r\n"],"names":["FONT_VALUE_TO_CSS","themeIsValid","defaultThemePresets","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":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/resolveThemeConfiguration.ts"],"sourcesContent":["import { FONT_VALUE_TO_CSS } from '../constants/themeFonts.js'\r\nimport type { Mode, ThemeDefaults } from '../providers/Theme/types.js'\r\nimport { themeIsValid } from '../providers/Theme/types.js'\r\nimport type { ThemeTypographyPreset } from '../presets.js'\r\nimport { defaultThemePresets } from '../presets.js'\r\n\r\n/**\r\n * Generic theme configuration structure that matches Payload's generated types\r\n * without depending on specific payload-types versions\r\n */\r\ninterface ThemeTypographyOverride {\r\n bodyFont?: string | null\r\n headingFont?: string | null\r\n bodyFontCustom?: string | null\r\n headingFontCustom?: string | null\r\n baseFontSize?: string | null\r\n lineHeight?: string | null\r\n}\r\n\r\n/**\r\n * Generic theme configuration interface that accepts any compatible structure\r\n * This avoids type conflicts between different versions of payload-types\r\n */\r\ninterface GenericThemeConfiguration {\r\n theme?: string | null\r\n colorMode?: string | null\r\n allowColorModeToggle?: boolean | null\r\n borderRadius?: string | null\r\n fontScale?: string | null\r\n spacing?: string | null\r\n animationLevel?: string | null\r\n customCSS?: string | null\r\n lightMode?: {\r\n primary?: string | null\r\n secondary?: string | null\r\n accent?: string | null\r\n neutral?: string | null\r\n success?: string | null\r\n warning?: string | null\r\n error?: string | null\r\n info?: string | null\r\n } | null\r\n darkMode?: {\r\n primary?: string | null\r\n secondary?: string | null\r\n accent?: string | null\r\n neutral?: string | null\r\n success?: string | null\r\n warning?: string | null\r\n error?: string | null\r\n info?: string | null\r\n } | null\r\n typography?: ThemeTypographyOverride | null\r\n}\r\n\r\nconst BORDER_RADIUS_VALUES = ['none', 'small', 'medium', 'large', 'xl'] as const\r\nconst LEGACY_BORDER_RADIUS_ALIASES: Record<string, (typeof BORDER_RADIUS_VALUES)[number]> = {\r\n full: 'xl',\r\n}\r\nconst FONT_SCALE_VALUES = ['small', 'medium', 'large'] as const\r\nconst SPACING_VALUES = ['compact', 'medium', 'spacious'] as const\r\nconst ANIMATION_LEVEL_VALUES = ['none', 'reduced', 'medium', 'high'] as const\r\nconst LEGACY_ANIMATION_ALIASES: Record<string, (typeof ANIMATION_LEVEL_VALUES)[number]> = {\r\n full: 'high',\r\n}\r\nconst MODE_VALUES = ['auto', 'light', 'dark'] as const\r\n\r\ntype BorderRadiusOption = (typeof BORDER_RADIUS_VALUES)[number]\r\ntype FontScaleOption = (typeof FONT_SCALE_VALUES)[number]\r\ntype SpacingOption = (typeof SPACING_VALUES)[number]\r\ntype AnimationLevelOption = (typeof ANIMATION_LEVEL_VALUES)[number]\r\n\r\ntype ThemeModeOption = (typeof MODE_VALUES)[number]\r\n\r\ntype ThemeColorConfiguration = NonNullable<GenericThemeConfiguration['lightMode']>\r\n\r\nconst DEFAULT_THEME_NAME: ThemeDefaults = 'cool'\r\nconst DEFAULT_THEME_PRESET = defaultThemePresets.find(\r\n (preset) => preset.name === DEFAULT_THEME_NAME,\r\n)\r\n\r\nexport interface ResolvedThemeConfiguration {\r\n theme: ThemeDefaults\r\n colorMode: Mode\r\n allowColorModeToggle: boolean\r\n borderRadius: BorderRadiusOption\r\n fontScale: FontScaleOption\r\n spacing: SpacingOption\r\n animationLevel: AnimationLevelOption\r\n customCSS: string | null\r\n lightMode?: ThemeColorConfiguration\r\n darkMode?: ThemeColorConfiguration\r\n typography: ThemeTypographyPreset | null\r\n}\r\n\r\nexport const DEFAULT_THEME_CONFIGURATION: ResolvedThemeConfiguration = {\r\n theme: DEFAULT_THEME_NAME,\r\n colorMode: 'auto',\r\n allowColorModeToggle: true,\r\n borderRadius: 'medium',\r\n fontScale: 'medium',\r\n spacing: 'medium',\r\n animationLevel: 'medium',\r\n customCSS: null,\r\n lightMode: DEFAULT_THEME_PRESET?.lightMode,\r\n darkMode: DEFAULT_THEME_PRESET?.darkMode,\r\n typography: DEFAULT_THEME_PRESET?.typography ?? null,\r\n}\r\n\r\nfunction resolveBorderRadius(value: unknown): BorderRadiusOption {\r\n if (typeof value === 'string') {\r\n if (BORDER_RADIUS_VALUES.includes(value as BorderRadiusOption)) {\r\n return value as BorderRadiusOption\r\n }\r\n\r\n const legacyMatch = LEGACY_BORDER_RADIUS_ALIASES[value]\r\n if (legacyMatch) {\r\n return legacyMatch\r\n }\r\n }\r\n\r\n return DEFAULT_THEME_CONFIGURATION.borderRadius\r\n}\r\n\r\nfunction isFontScale(value: unknown): value is FontScaleOption {\r\n return typeof value === 'string' && FONT_SCALE_VALUES.includes(value as FontScaleOption)\r\n}\r\n\r\nfunction isSpacing(value: unknown): value is SpacingOption {\r\n return typeof value === 'string' && SPACING_VALUES.includes(value as SpacingOption)\r\n}\r\n\r\nfunction resolveAnimationLevel(value: unknown): AnimationLevelOption {\r\n if (typeof value === 'string') {\r\n if (ANIMATION_LEVEL_VALUES.includes(value as AnimationLevelOption)) {\r\n return value as AnimationLevelOption\r\n }\r\n\r\n const legacyMatch = LEGACY_ANIMATION_ALIASES[value]\r\n if (legacyMatch) {\r\n return legacyMatch\r\n }\r\n }\r\n\r\n return DEFAULT_THEME_CONFIGURATION.animationLevel\r\n}\r\n\r\nfunction isMode(value: unknown): value is ThemeModeOption {\r\n return typeof value === 'string' && MODE_VALUES.includes(value as ThemeModeOption)\r\n}\r\n\r\nexport function resolveThemeConfiguration(\r\n themeConfiguration?: GenericThemeConfiguration | null,\r\n): ResolvedThemeConfiguration {\r\n if (!themeConfiguration) {\r\n return DEFAULT_THEME_CONFIGURATION\r\n }\r\n\r\n const {\r\n theme,\r\n colorMode,\r\n allowColorModeToggle,\r\n borderRadius,\r\n fontScale,\r\n spacing,\r\n animationLevel,\r\n customCSS,\r\n lightMode,\r\n darkMode,\r\n typography,\r\n } = themeConfiguration\r\n\r\n const resolvedTheme =\r\n typeof theme === 'string' && themeIsValid(theme)\r\n ? (theme as ThemeDefaults)\r\n : DEFAULT_THEME_CONFIGURATION.theme\r\n const resolvedMode = isMode(colorMode)\r\n ? (colorMode as Mode)\r\n : DEFAULT_THEME_CONFIGURATION.colorMode\r\n const resolvedBorderRadius = resolveBorderRadius(borderRadius)\r\n const resolvedFontScale = isFontScale(fontScale)\r\n ? fontScale\r\n : DEFAULT_THEME_CONFIGURATION.fontScale\r\n const resolvedSpacing = isSpacing(spacing) ? spacing : DEFAULT_THEME_CONFIGURATION.spacing\r\n const resolvedAnimationLevel = resolveAnimationLevel(animationLevel)\r\n const resolvedAllowToggle =\r\n typeof allowColorModeToggle === 'boolean'\r\n ? allowColorModeToggle\r\n : DEFAULT_THEME_CONFIGURATION.allowColorModeToggle\r\n const resolvedCustomCSS = typeof customCSS === 'string' ? customCSS : null\r\n const preset = defaultThemePresets.find((candidate) => candidate.name === resolvedTheme)\r\n const baseLightMode = preset?.lightMode ?? DEFAULT_THEME_CONFIGURATION.lightMode\r\n const baseDarkMode = preset?.darkMode ?? DEFAULT_THEME_CONFIGURATION.darkMode\r\n const resolvedLightMode = mergeColorModes(baseLightMode, lightMode)\r\n const resolvedDarkMode = mergeColorModes(baseDarkMode, darkMode)\r\n const resolvedTypography =\r\n mergeTypography(preset?.typography, typography) ?? preset?.typography ?? null\r\n\r\n return {\r\n theme: resolvedTheme,\r\n colorMode: resolvedMode,\r\n allowColorModeToggle: resolvedAllowToggle,\r\n borderRadius: resolvedBorderRadius,\r\n fontScale: resolvedFontScale,\r\n spacing: resolvedSpacing,\r\n animationLevel: resolvedAnimationLevel,\r\n customCSS: resolvedCustomCSS,\r\n lightMode: resolvedLightMode,\r\n darkMode: resolvedDarkMode,\r\n typography: resolvedTypography,\r\n }\r\n}\r\n\r\nfunction mergeColorModes(\r\n base?: ThemeColorConfiguration,\r\n overrides?: GenericThemeConfiguration['lightMode'],\r\n): ThemeColorConfiguration | undefined {\r\n const merged: Record<string, string> = {}\r\n\r\n if (base) {\r\n Object.entries(base).forEach(([key, value]) => {\r\n if (typeof value === 'string' && value.trim().length > 0) {\r\n merged[key] = value\r\n }\r\n })\r\n }\r\n\r\n if (overrides) {\r\n Object.entries(overrides).forEach(([key, value]) => {\r\n if (typeof value === 'string' && value.trim().length > 0) {\r\n merged[key] = value\r\n } else if (value === null) {\r\n delete merged[key]\r\n }\r\n })\r\n }\r\n\r\n return Object.keys(merged).length > 0 ? (merged as ThemeColorConfiguration) : undefined\r\n}\r\n\r\nfunction mergeTypography(\r\n base?: ThemeTypographyPreset | null,\r\n overrides?: ThemeTypographyOverride | null,\r\n): ThemeTypographyPreset | null {\r\n if (!base && !overrides) {\r\n return base ?? null\r\n }\r\n\r\n const result: ThemeTypographyPreset = {\r\n fontFamily: base?.fontFamily ?? 'var(--font-geist-sans)',\r\n headingFamily: base?.headingFamily ?? 'var(--font-geist-sans)',\r\n baseFontSize: base?.baseFontSize ?? '16px',\r\n lineHeight: base?.lineHeight ?? '1.6',\r\n fontWeights: { ...(base?.fontWeights ?? {}) },\r\n letterSpacing: { ...(base?.letterSpacing ?? {}) },\r\n }\r\n\r\n if (overrides) {\r\n const resolvedBodyFont = resolveFontSelection(\r\n overrides.bodyFont,\r\n overrides.bodyFontCustom,\r\n base?.fontFamily,\r\n )\r\n if (resolvedBodyFont) {\r\n result.fontFamily = resolvedBodyFont\r\n }\r\n\r\n const resolvedHeadingFont = resolveFontSelection(\r\n overrides.headingFont,\r\n overrides.headingFontCustom,\r\n base?.headingFamily,\r\n )\r\n if (resolvedHeadingFont) {\r\n result.headingFamily = resolvedHeadingFont\r\n }\r\n\r\n if (overrides.baseFontSize && overrides.baseFontSize !== 'preset') {\r\n result.baseFontSize = overrides.baseFontSize\r\n }\r\n\r\n if (overrides.lineHeight && overrides.lineHeight !== 'preset') {\r\n result.lineHeight = overrides.lineHeight\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nfunction resolveFontSelection(\r\n selection?: string | null,\r\n custom?: string | null,\r\n fallback?: string | null,\r\n): string | null {\r\n if (!selection || selection === 'preset') {\r\n return fallback ?? null\r\n }\r\n\r\n if (selection === 'custom') {\r\n const trimmed = custom?.trim()\r\n return trimmed && trimmed.length > 0 ? trimmed : (fallback ?? null)\r\n }\r\n\r\n const mapped = FONT_VALUE_TO_CSS[selection]\r\n return mapped ?? fallback ?? null\r\n}\r\n"],"names":["FONT_VALUE_TO_CSS","themeIsValid","defaultThemePresets","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":"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"}
|