@kilivi/payloadcms-theme-management 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/components/ServerThemeInjector.js +3 -3
  2. package/dist/components/ServerThemeInjector.js.map +1 -1
  3. package/dist/components/ThemePreview.js.map +1 -1
  4. package/dist/components/typographyPreviewUtils.js.map +1 -1
  5. package/dist/constants/themeFonts.js.map +1 -1
  6. package/dist/fields/ColorPickerField.js.map +1 -1
  7. package/dist/fields/RadiusField.js.map +1 -1
  8. package/dist/fields/ThemeColorPickerField.css +138 -138
  9. package/dist/fields/ThemeColorPickerField.js.map +1 -1
  10. package/dist/fields/ThemePreviewField.js.map +1 -1
  11. package/dist/fields/ThemeTokenSelectField.js.map +1 -1
  12. package/dist/fields/colorModeFields.js.map +1 -1
  13. package/dist/fields/themeConfigurationField.js +3 -3
  14. package/dist/fields/themeConfigurationField.js.map +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/payload-types.js +3 -3
  17. package/dist/payload-types.js.map +1 -1
  18. package/dist/plugin.js.map +1 -1
  19. package/dist/presets.js.map +1 -1
  20. package/dist/providers/Theme/index.js.map +1 -1
  21. package/dist/providers/Theme/shared.js.map +1 -1
  22. package/dist/providers/Theme/themeConfig.js.map +1 -1
  23. package/dist/providers/Theme/types.js.map +1 -1
  24. package/dist/server.js.map +1 -1
  25. package/dist/types.js.map +1 -1
  26. package/dist/utils/resolveThemeConfiguration.js.map +1 -1
  27. package/dist/utils/themeAssets.js.map +1 -1
  28. package/dist/utils/themeColors.js.map +1 -1
  29. package/dist/utils/themeUtils.js +6 -6
  30. package/dist/utils/themeUtils.js.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/src/--verbose/dist/fields/ThemeColorPickerField.scss +0 -138
  33. package/dist/src/dist/fields/ThemeColorPickerField.scss +0 -138
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/presets.ts"],"sourcesContent":["export interface ThemeTypographyPreset {\r\n fontFamily: string\r\n headingFamily: string\r\n baseFontSize: string\r\n lineHeight: string\r\n fontWeights: {\r\n light?: string\r\n normal?: string\r\n medium?: string\r\n semibold?: string\r\n bold?: string\r\n black?: string\r\n }\r\n letterSpacing: {\r\n tight?: string\r\n normal?: string\r\n wide?: string\r\n wider?: string\r\n }\r\n}\r\n\r\nexport interface ThemePreset {\r\n name: string\r\n label: string\r\n borderRadius: 'none' | 'small' | 'medium' | 'large' | 'xl'\r\n cssFile?: string\r\n preview?: {\r\n colors: {\r\n primary: string\r\n background: string\r\n accent: string\r\n }\r\n }\r\n theme?: string\r\n colorMode?: 'auto' | 'light' | 'dark'\r\n fontScale?: 'small' | 'medium' | 'large'\r\n spacing?: 'small' | 'medium' | 'large'\r\n animationLevel?: 'low' | 'medium' | 'high'\r\n lightMode?: Record<string, string>\r\n darkMode?: Record<string, string>\r\n typography?: ThemeTypographyPreset\r\n}\r\n\r\nexport const defaultThemePresets: ThemePreset[] = [\r\n {\r\n name: 'cool',\r\n label: 'Cool & Professional',\r\n borderRadius: 'medium',\r\n preview: {\r\n colors: {\r\n primary: '#3b82f6',\r\n background: '#ffffff',\r\n accent: '#f1f5f9',\r\n },\r\n },\r\n lightMode: {\r\n background: '#ffffff',\r\n foreground: '#0a0a0a',\r\n card: '#ffffff',\r\n cardForeground: '#0a0a0a',\r\n popover: '#ffffff',\r\n popoverForeground: '#0a0a0a',\r\n primary: '#3b82f6',\r\n primaryForeground: '#ffffff',\r\n secondary: '#f1f5f9',\r\n secondaryForeground: '#0f172a',\r\n muted: '#f1f5f9',\r\n mutedForeground: '#64748b',\r\n accent: '#f1f5f9',\r\n accentForeground: '#0f172a',\r\n destructive: '#ef4444',\r\n destructiveForeground: '#ffffff',\r\n border: '#e2e8f0',\r\n input: '#e2e8f0',\r\n ring: '#3b82f6',\r\n },\r\n darkMode: {\r\n background: '#0a0a0a',\r\n foreground: '#fafafa',\r\n card: '#1a1a1a',\r\n cardForeground: '#fafafa',\r\n popover: '#1a1a1a',\r\n popoverForeground: '#fafafa',\r\n primary: '#60a5fa',\r\n primaryForeground: '#0a0a0a',\r\n secondary: '#27272a',\r\n secondaryForeground: '#fafafa',\r\n muted: '#27272a',\r\n mutedForeground: '#a1a1aa',\r\n accent: '#27272a',\r\n accentForeground: '#fafafa',\r\n destructive: '#f87171',\r\n destructiveForeground: '#0a0a0a',\r\n border: '#27272a',\r\n input: '#27272a',\r\n ring: '#60a5fa',\r\n },\r\n typography: {\r\n fontFamily: 'var(--font-geist-sans)',\r\n headingFamily: 'var(--font-outfit)',\r\n baseFontSize: '16px',\r\n lineHeight: '1.6',\r\n fontWeights: {\r\n normal: '400',\r\n medium: '500',\r\n semibold: '600',\r\n bold: '700',\r\n },\r\n letterSpacing: {\r\n tight: '-0.02em',\r\n normal: '0',\r\n wide: '0.02em',\r\n },\r\n },\r\n },\r\n {\r\n name: 'brutal',\r\n label: 'Modern Brutalism',\r\n borderRadius: 'none',\r\n preview: {\r\n colors: {\r\n primary: '#000000',\r\n background: '#ffffff',\r\n accent: '#ef4444',\r\n },\r\n },\r\n lightMode: {\r\n background: '#ffffff',\r\n foreground: '#000000',\r\n card: '#ffffff',\r\n cardForeground: '#000000',\r\n popover: '#ffffff',\r\n popoverForeground: '#000000',\r\n primary: '#000000',\r\n primaryForeground: '#ffffff',\r\n secondary: '#f5f5f5',\r\n secondaryForeground: '#000000',\r\n muted: '#f5f5f5',\r\n mutedForeground: '#737373',\r\n accent: '#ef4444',\r\n accentForeground: '#ffffff',\r\n destructive: '#ef4444',\r\n destructiveForeground: '#ffffff',\r\n border: '#000000',\r\n input: '#e5e5e5',\r\n ring: '#000000',\r\n },\r\n darkMode: {\r\n background: '#000000',\r\n foreground: '#ffffff',\r\n card: '#0a0a0a',\r\n cardForeground: '#ffffff',\r\n popover: '#0a0a0a',\r\n popoverForeground: '#ffffff',\r\n primary: '#ffffff',\r\n primaryForeground: '#000000',\r\n secondary: '#262626',\r\n secondaryForeground: '#ffffff',\r\n muted: '#262626',\r\n mutedForeground: '#a3a3a3',\r\n accent: '#ef4444',\r\n accentForeground: '#ffffff',\r\n destructive: '#dc2626',\r\n destructiveForeground: '#ffffff',\r\n border: '#ffffff',\r\n input: '#262626',\r\n ring: '#ffffff',\r\n },\r\n typography: {\r\n fontFamily: 'var(--font-geist-mono)',\r\n headingFamily: 'var(--font-geist-mono)',\r\n baseFontSize: '16px',\r\n lineHeight: '1.5',\r\n fontWeights: {\r\n normal: '400',\r\n medium: '600',\r\n semibold: '700',\r\n bold: '800',\r\n },\r\n letterSpacing: {\r\n tight: '0',\r\n normal: '0.05em',\r\n wide: '0.1em',\r\n },\r\n },\r\n },\r\n {\r\n name: 'neon',\r\n label: 'Neon Cyberpunk',\r\n borderRadius: 'medium',\r\n preview: {\r\n colors: {\r\n primary: '#9333ea',\r\n background: '#0d0f1a',\r\n accent: '#00ffff',\r\n },\r\n },\r\n lightMode: {\r\n background: '#0d0f1a',\r\n foreground: '#ffffff',\r\n card: '#12141f',\r\n cardForeground: '#ffffff',\r\n popover: '#12141f',\r\n popoverForeground: '#ffffff',\r\n primary: '#9333ea',\r\n primaryForeground: '#ffffff',\r\n secondary: '#1a1d2e',\r\n secondaryForeground: '#ffffff',\r\n muted: '#1a1d2e',\r\n mutedForeground: '#b3b3cc',\r\n accent: '#00ffff',\r\n accentForeground: '#0d0f1a',\r\n destructive: '#ff0000',\r\n destructiveForeground: '#ffffff',\r\n border: '#2d3348',\r\n input: '#2d3348',\r\n ring: '#9333ea',\r\n },\r\n darkMode: {\r\n background: '#0d0f1a',\r\n foreground: '#ffffff',\r\n card: '#12141f',\r\n cardForeground: '#ffffff',\r\n popover: '#12141f',\r\n popoverForeground: '#ffffff',\r\n primary: '#9333ea',\r\n primaryForeground: '#ffffff',\r\n secondary: '#1a1d2e',\r\n secondaryForeground: '#ffffff',\r\n muted: '#1a1d2e',\r\n mutedForeground: '#b3b3cc',\r\n accent: '#00ffff',\r\n accentForeground: '#0d0f1a',\r\n destructive: '#ff0000',\r\n destructiveForeground: '#0d0f1a',\r\n border: '#2d3348',\r\n input: '#2d3348',\r\n ring: '#9333ea',\r\n },\r\n typography: {\r\n fontFamily: 'var(--font-geist-sans)',\r\n headingFamily: 'var(--font-geist-mono)',\r\n baseFontSize: '16px',\r\n lineHeight: '1.7',\r\n fontWeights: {\r\n normal: '400',\r\n medium: '500',\r\n semibold: '700',\r\n bold: '900',\r\n },\r\n letterSpacing: {\r\n tight: '0',\r\n normal: '0.05em',\r\n wide: '0.15em',\r\n },\r\n },\r\n },\r\n {\r\n name: 'solar',\r\n label: 'Solar',\r\n borderRadius: 'large',\r\n preview: {\r\n colors: {\r\n primary: '#c85a19',\r\n background: '#fffbf5',\r\n accent: '#ffcc00',\r\n },\r\n },\r\n lightMode: {\r\n background: '#fffbf5',\r\n foreground: '#2d1a09',\r\n card: '#ffffff',\r\n cardForeground: '#2d1a09',\r\n popover: '#ffffff',\r\n popoverForeground: '#2d1a09',\r\n primary: '#c85a19',\r\n primaryForeground: '#ffffff',\r\n secondary: '#fff7e6',\r\n secondaryForeground: '#2d1a09',\r\n muted: '#f5ebe0',\r\n mutedForeground: '#665544',\r\n accent: '#ffcc00',\r\n accentForeground: '#2d1a09',\r\n destructive: '#e34850',\r\n destructiveForeground: '#ffffff',\r\n border: '#e8d4c4',\r\n input: '#e8d4c4',\r\n ring: '#c85a19',\r\n },\r\n darkMode: {\r\n background: '#1f1610',\r\n foreground: '#f0dcc7',\r\n card: '#271c15',\r\n cardForeground: '#f0dcc7',\r\n popover: '#271c15',\r\n popoverForeground: '#f0dcc7',\r\n primary: '#e37a3d',\r\n primaryForeground: '#ffffff',\r\n secondary: '#3d2f26',\r\n secondaryForeground: '#f0dcc7',\r\n muted: '#3d2f26',\r\n mutedForeground: '#ccb8a6',\r\n accent: '#ffd633',\r\n accentForeground: '#1f1610',\r\n destructive: '#993438',\r\n destructiveForeground: '#ffffff',\r\n border: '#453828',\r\n input: '#453828',\r\n ring: '#e37a3d',\r\n },\r\n typography: {\r\n fontFamily: 'var(--font-geist-sans)',\r\n headingFamily: 'var(--font-outfit)',\r\n baseFontSize: '16px',\r\n lineHeight: '1.6',\r\n fontWeights: {\r\n normal: '400',\r\n medium: '500',\r\n semibold: '600',\r\n bold: '700',\r\n },\r\n letterSpacing: {\r\n tight: '-0.01em',\r\n normal: '0',\r\n wide: '0.025em',\r\n },\r\n },\r\n },\r\n {\r\n name: 'dealership',\r\n label: 'Dealership',\r\n borderRadius: 'medium',\r\n preview: {\r\n colors: {\r\n primary: '#1a2f50',\r\n background: '#f9fafb',\r\n accent: '#3b9ad6',\r\n },\r\n },\r\n lightMode: {\r\n background: '#f9fafb',\r\n foreground: '#1f2937',\r\n card: '#ffffff',\r\n cardForeground: '#1f2937',\r\n popover: '#ffffff',\r\n popoverForeground: '#1f2937',\r\n primary: '#1a2f50',\r\n primaryForeground: '#ffffff',\r\n secondary: '#e6ebf0',\r\n secondaryForeground: '#1f2937',\r\n muted: '#e6ebf0',\r\n mutedForeground: '#6b7280',\r\n accent: '#3b9ad6',\r\n accentForeground: '#ffffff',\r\n destructive: '#bc3535',\r\n destructiveForeground: '#ffffff',\r\n border: '#d1d5db',\r\n input: '#d1d5db',\r\n ring: '#1a2f50',\r\n },\r\n darkMode: {\r\n background: '#111827',\r\n foreground: '#f3f4f6',\r\n card: '#1f2937',\r\n cardForeground: '#f3f4f6',\r\n popover: '#1f2937',\r\n popoverForeground: '#f3f4f6',\r\n primary: '#3b82f6',\r\n primaryForeground: '#ffffff',\r\n secondary: '#374151',\r\n secondaryForeground: '#f3f4f6',\r\n muted: '#374151',\r\n mutedForeground: '#9ca3af',\r\n accent: '#60a5fa',\r\n accentForeground: '#111827',\r\n destructive: '#ef4444',\r\n destructiveForeground: '#ffffff',\r\n border: '#4b5563',\r\n input: '#4b5563',\r\n ring: '#3b82f6',\r\n },\r\n typography: {\r\n fontFamily: 'var(--font-geist-sans)',\r\n headingFamily: 'var(--font-outfit)',\r\n baseFontSize: '16px',\r\n lineHeight: '1.6',\r\n fontWeights: {\r\n normal: '400',\r\n medium: '500',\r\n semibold: '600',\r\n bold: '700',\r\n },\r\n letterSpacing: {\r\n tight: '-0.01em',\r\n normal: '0.01em',\r\n wide: '0.05em',\r\n },\r\n },\r\n },\r\n {\r\n name: 'real-estate',\r\n label: 'Real Estate Blue',\r\n borderRadius: 'large',\r\n preview: {\r\n colors: {\r\n primary: '#1e40af',\r\n background: '#fafbff',\r\n accent: '#3b9ad6',\r\n },\r\n },\r\n lightMode: {\r\n background: '#fafbff',\r\n foreground: '#1e293b',\r\n card: '#ffffff',\r\n cardForeground: '#1e293b',\r\n popover: '#ffffff',\r\n popoverForeground: '#1e293b',\r\n primary: '#1e40af',\r\n primaryForeground: '#ffffff',\r\n secondary: '#e0ecff',\r\n secondaryForeground: '#1e293b',\r\n muted: '#f1f5f9',\r\n mutedForeground: '#64748b',\r\n accent: '#3b9ad6',\r\n accentForeground: '#ffffff',\r\n destructive: '#dc2626',\r\n destructiveForeground: '#ffffff',\r\n border: '#cbd5e1',\r\n input: '#f1f5f9',\r\n ring: '#1e40af',\r\n },\r\n darkMode: {\r\n background: '#0f172a',\r\n foreground: '#f1f5f9',\r\n card: '#1e293b',\r\n cardForeground: '#f1f5f9',\r\n popover: '#1e293b',\r\n popoverForeground: '#f1f5f9',\r\n primary: '#3b82f6',\r\n primaryForeground: '#ffffff',\r\n secondary: '#334155',\r\n secondaryForeground: '#f1f5f9',\r\n muted: '#334155',\r\n mutedForeground: '#94a3b8',\r\n accent: '#60a5fa',\r\n accentForeground: '#0f172a',\r\n destructive: '#ef4444',\r\n destructiveForeground: '#ffffff',\r\n border: '#475569',\r\n input: '#334155',\r\n ring: '#3b82f6',\r\n },\r\n typography: {\r\n fontFamily: 'var(--font-geist-sans)',\r\n headingFamily: 'var(--font-outfit)',\r\n baseFontSize: '16px',\r\n lineHeight: '1.75',\r\n fontWeights: {\r\n light: '300',\r\n normal: '400',\r\n medium: '500',\r\n semibold: '600',\r\n bold: '700',\r\n black: '900',\r\n },\r\n letterSpacing: {\r\n tight: '-0.02em',\r\n normal: '0',\r\n wide: '0.025em',\r\n wider: '0.05em',\r\n },\r\n },\r\n },\r\n {\r\n name: 'real-estate-gold',\r\n label: 'Real Estate Gold',\r\n borderRadius: 'large',\r\n preview: {\r\n colors: {\r\n primary: '#b8860b',\r\n background: '#fffbf0',\r\n accent: '#f5d547',\r\n },\r\n },\r\n lightMode: {\r\n background: '#fffbf0',\r\n foreground: '#302618',\r\n card: '#ffffff',\r\n cardForeground: '#302618',\r\n popover: '#ffffff',\r\n popoverForeground: '#302618',\r\n primary: '#b8860b',\r\n primaryForeground: '#fffbf0',\r\n secondary: '#f7eed6',\r\n secondaryForeground: '#302618',\r\n muted: '#f3e9d8',\r\n mutedForeground: '#6d5d47',\r\n accent: '#f5d547',\r\n accentForeground: '#302618',\r\n destructive: '#dc2f2f',\r\n destructiveForeground: '#ffffff',\r\n border: '#e5d9c0',\r\n input: '#f3e9d8',\r\n ring: '#b8860b',\r\n },\r\n darkMode: {\r\n background: '#1a1510',\r\n foreground: '#f5f0e6',\r\n card: '#262014',\r\n cardForeground: '#f5f0e6',\r\n popover: '#262014',\r\n popoverForeground: '#f5f0e6',\r\n primary: '#daa520',\r\n primaryForeground: '#1a1510',\r\n secondary: '#3d3426',\r\n secondaryForeground: '#f5f0e6',\r\n muted: '#3d3426',\r\n mutedForeground: '#b8a68f',\r\n accent: '#ffd700',\r\n accentForeground: '#1a1510',\r\n destructive: '#ef4444',\r\n destructiveForeground: '#ffffff',\r\n border: '#554729',\r\n input: '#3d3426',\r\n ring: '#daa520',\r\n },\r\n typography: {\r\n fontFamily: 'var(--font-geist-sans)',\r\n headingFamily: 'var(--font-outfit)',\r\n baseFontSize: '16px',\r\n lineHeight: '1.75',\r\n fontWeights: {\r\n light: '300',\r\n normal: '400',\r\n medium: '500',\r\n semibold: '600',\r\n bold: '700',\r\n black: '900',\r\n },\r\n letterSpacing: {\r\n tight: '-0.02em',\r\n normal: '0',\r\n wide: '0.025em',\r\n wider: '0.05em',\r\n },\r\n },\r\n },\r\n {\r\n name: 'real-estate-neutral',\r\n label: 'Real Estate Neutral',\r\n borderRadius: 'large',\r\n preview: {\r\n colors: {\r\n primary: '#57534e',\r\n background: '#fafaf9',\r\n accent: '#78716c',\r\n },\r\n },\r\n lightMode: {\r\n background: '#fafaf9',\r\n foreground: '#292524',\r\n card: '#ffffff',\r\n cardForeground: '#292524',\r\n popover: '#ffffff',\r\n popoverForeground: '#292524',\r\n primary: '#57534e',\r\n primaryForeground: '#ffffff',\r\n secondary: '#e7e5e4',\r\n secondaryForeground: '#292524',\r\n muted: '#f5f5f4',\r\n mutedForeground: '#78716c',\r\n accent: '#78716c',\r\n accentForeground: '#ffffff',\r\n destructive: '#dc2626',\r\n destructiveForeground: '#ffffff',\r\n border: '#d6d3d1',\r\n input: '#f5f5f4',\r\n ring: '#57534e',\r\n },\r\n darkMode: {\r\n background: '#1c1917',\r\n foreground: '#fafaf9',\r\n card: '#292524',\r\n cardForeground: '#fafaf9',\r\n popover: '#292524',\r\n popoverForeground: '#fafaf9',\r\n primary: '#78716c',\r\n primaryForeground: '#ffffff',\r\n secondary: '#44403c',\r\n secondaryForeground: '#fafaf9',\r\n muted: '#44403c',\r\n mutedForeground: '#a8a29e',\r\n accent: '#a8a29e',\r\n accentForeground: '#1c1917',\r\n destructive: '#ef4444',\r\n destructiveForeground: '#ffffff',\r\n border: '#57534e',\r\n input: '#44403c',\r\n ring: '#78716c',\r\n },\r\n typography: {\r\n fontFamily: 'var(--font-geist-sans)',\r\n headingFamily: 'var(--font-outfit)',\r\n baseFontSize: '16px',\r\n lineHeight: '1.75',\r\n fontWeights: {\r\n light: '300',\r\n normal: '400',\r\n medium: '500',\r\n semibold: '600',\r\n bold: '700',\r\n black: '900',\r\n },\r\n letterSpacing: {\r\n tight: '-0.02em',\r\n normal: '0',\r\n wide: '0.025em',\r\n wider: '0.05em',\r\n },\r\n },\r\n },\r\n]\r\n"],"names":["defaultThemePresets","name","label","borderRadius","preview","colors","primary","background","accent","lightMode","foreground","card","cardForeground","popover","popoverForeground","primaryForeground","secondary","secondaryForeground","muted","mutedForeground","accentForeground","destructive","destructiveForeground","border","input","ring","darkMode","typography","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","normal","medium","semibold","bold","letterSpacing","tight","wide","light","black","wider"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/presets.ts"],"sourcesContent":["export interface ThemeTypographyPreset {\n fontFamily: string\n headingFamily: string\n baseFontSize: string\n lineHeight: string\n fontWeights: {\n light?: string\n normal?: string\n medium?: string\n semibold?: string\n bold?: string\n black?: string\n }\n letterSpacing: {\n tight?: string\n normal?: string\n wide?: string\n wider?: string\n }\n}\n\nexport interface ThemePreset {\n name: string\n label: string\n borderRadius: 'none' | 'small' | 'medium' | 'large' | 'xl'\n cssFile?: string\n preview?: {\n colors: {\n primary: string\n background: string\n accent: string\n }\n }\n theme?: string\n colorMode?: 'auto' | 'light' | 'dark'\n fontScale?: 'small' | 'medium' | 'large'\n spacing?: 'small' | 'medium' | 'large'\n animationLevel?: 'low' | 'medium' | 'high'\n lightMode?: Record<string, string>\n darkMode?: Record<string, string>\n typography?: ThemeTypographyPreset\n}\n\nexport const defaultThemePresets: ThemePreset[] = [\n {\n name: 'cool',\n label: 'Cool & Professional',\n borderRadius: 'medium',\n preview: {\n colors: {\n primary: '#3b82f6',\n background: '#ffffff',\n accent: '#f1f5f9',\n },\n },\n lightMode: {\n background: '#ffffff',\n foreground: '#0a0a0a',\n card: '#ffffff',\n cardForeground: '#0a0a0a',\n popover: '#ffffff',\n popoverForeground: '#0a0a0a',\n primary: '#3b82f6',\n primaryForeground: '#ffffff',\n secondary: '#f1f5f9',\n secondaryForeground: '#0f172a',\n muted: '#f1f5f9',\n mutedForeground: '#64748b',\n accent: '#f1f5f9',\n accentForeground: '#0f172a',\n destructive: '#ef4444',\n destructiveForeground: '#ffffff',\n border: '#e2e8f0',\n input: '#e2e8f0',\n ring: '#3b82f6',\n },\n darkMode: {\n background: '#0a0a0a',\n foreground: '#fafafa',\n card: '#1a1a1a',\n cardForeground: '#fafafa',\n popover: '#1a1a1a',\n popoverForeground: '#fafafa',\n primary: '#60a5fa',\n primaryForeground: '#0a0a0a',\n secondary: '#27272a',\n secondaryForeground: '#fafafa',\n muted: '#27272a',\n mutedForeground: '#a1a1aa',\n accent: '#27272a',\n accentForeground: '#fafafa',\n destructive: '#f87171',\n destructiveForeground: '#0a0a0a',\n border: '#27272a',\n input: '#27272a',\n ring: '#60a5fa',\n },\n typography: {\n fontFamily: 'var(--font-geist-sans)',\n headingFamily: 'var(--font-outfit)',\n baseFontSize: '16px',\n lineHeight: '1.6',\n fontWeights: {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n },\n letterSpacing: {\n tight: '-0.02em',\n normal: '0',\n wide: '0.02em',\n },\n },\n },\n {\n name: 'brutal',\n label: 'Modern Brutalism',\n borderRadius: 'none',\n preview: {\n colors: {\n primary: '#000000',\n background: '#ffffff',\n accent: '#ef4444',\n },\n },\n lightMode: {\n background: '#ffffff',\n foreground: '#000000',\n card: '#ffffff',\n cardForeground: '#000000',\n popover: '#ffffff',\n popoverForeground: '#000000',\n primary: '#000000',\n primaryForeground: '#ffffff',\n secondary: '#f5f5f5',\n secondaryForeground: '#000000',\n muted: '#f5f5f5',\n mutedForeground: '#737373',\n accent: '#ef4444',\n accentForeground: '#ffffff',\n destructive: '#ef4444',\n destructiveForeground: '#ffffff',\n border: '#000000',\n input: '#e5e5e5',\n ring: '#000000',\n },\n darkMode: {\n background: '#000000',\n foreground: '#ffffff',\n card: '#0a0a0a',\n cardForeground: '#ffffff',\n popover: '#0a0a0a',\n popoverForeground: '#ffffff',\n primary: '#ffffff',\n primaryForeground: '#000000',\n secondary: '#262626',\n secondaryForeground: '#ffffff',\n muted: '#262626',\n mutedForeground: '#a3a3a3',\n accent: '#ef4444',\n accentForeground: '#ffffff',\n destructive: '#dc2626',\n destructiveForeground: '#ffffff',\n border: '#ffffff',\n input: '#262626',\n ring: '#ffffff',\n },\n typography: {\n fontFamily: 'var(--font-geist-mono)',\n headingFamily: 'var(--font-geist-mono)',\n baseFontSize: '16px',\n lineHeight: '1.5',\n fontWeights: {\n normal: '400',\n medium: '600',\n semibold: '700',\n bold: '800',\n },\n letterSpacing: {\n tight: '0',\n normal: '0.05em',\n wide: '0.1em',\n },\n },\n },\n {\n name: 'neon',\n label: 'Neon Cyberpunk',\n borderRadius: 'medium',\n preview: {\n colors: {\n primary: '#9333ea',\n background: '#0d0f1a',\n accent: '#00ffff',\n },\n },\n lightMode: {\n background: '#0d0f1a',\n foreground: '#ffffff',\n card: '#12141f',\n cardForeground: '#ffffff',\n popover: '#12141f',\n popoverForeground: '#ffffff',\n primary: '#9333ea',\n primaryForeground: '#ffffff',\n secondary: '#1a1d2e',\n secondaryForeground: '#ffffff',\n muted: '#1a1d2e',\n mutedForeground: '#b3b3cc',\n accent: '#00ffff',\n accentForeground: '#0d0f1a',\n destructive: '#ff0000',\n destructiveForeground: '#ffffff',\n border: '#2d3348',\n input: '#2d3348',\n ring: '#9333ea',\n },\n darkMode: {\n background: '#0d0f1a',\n foreground: '#ffffff',\n card: '#12141f',\n cardForeground: '#ffffff',\n popover: '#12141f',\n popoverForeground: '#ffffff',\n primary: '#9333ea',\n primaryForeground: '#ffffff',\n secondary: '#1a1d2e',\n secondaryForeground: '#ffffff',\n muted: '#1a1d2e',\n mutedForeground: '#b3b3cc',\n accent: '#00ffff',\n accentForeground: '#0d0f1a',\n destructive: '#ff0000',\n destructiveForeground: '#0d0f1a',\n border: '#2d3348',\n input: '#2d3348',\n ring: '#9333ea',\n },\n typography: {\n fontFamily: 'var(--font-geist-sans)',\n headingFamily: 'var(--font-geist-mono)',\n baseFontSize: '16px',\n lineHeight: '1.7',\n fontWeights: {\n normal: '400',\n medium: '500',\n semibold: '700',\n bold: '900',\n },\n letterSpacing: {\n tight: '0',\n normal: '0.05em',\n wide: '0.15em',\n },\n },\n },\n {\n name: 'solar',\n label: 'Solar',\n borderRadius: 'large',\n preview: {\n colors: {\n primary: '#c85a19',\n background: '#fffbf5',\n accent: '#ffcc00',\n },\n },\n lightMode: {\n background: '#fffbf5',\n foreground: '#2d1a09',\n card: '#ffffff',\n cardForeground: '#2d1a09',\n popover: '#ffffff',\n popoverForeground: '#2d1a09',\n primary: '#c85a19',\n primaryForeground: '#ffffff',\n secondary: '#fff7e6',\n secondaryForeground: '#2d1a09',\n muted: '#f5ebe0',\n mutedForeground: '#665544',\n accent: '#ffcc00',\n accentForeground: '#2d1a09',\n destructive: '#e34850',\n destructiveForeground: '#ffffff',\n border: '#e8d4c4',\n input: '#e8d4c4',\n ring: '#c85a19',\n },\n darkMode: {\n background: '#1f1610',\n foreground: '#f0dcc7',\n card: '#271c15',\n cardForeground: '#f0dcc7',\n popover: '#271c15',\n popoverForeground: '#f0dcc7',\n primary: '#e37a3d',\n primaryForeground: '#ffffff',\n secondary: '#3d2f26',\n secondaryForeground: '#f0dcc7',\n muted: '#3d2f26',\n mutedForeground: '#ccb8a6',\n accent: '#ffd633',\n accentForeground: '#1f1610',\n destructive: '#993438',\n destructiveForeground: '#ffffff',\n border: '#453828',\n input: '#453828',\n ring: '#e37a3d',\n },\n typography: {\n fontFamily: 'var(--font-geist-sans)',\n headingFamily: 'var(--font-outfit)',\n baseFontSize: '16px',\n lineHeight: '1.6',\n fontWeights: {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n },\n letterSpacing: {\n tight: '-0.01em',\n normal: '0',\n wide: '0.025em',\n },\n },\n },\n {\n name: 'dealership',\n label: 'Dealership',\n borderRadius: 'medium',\n preview: {\n colors: {\n primary: '#1a2f50',\n background: '#f9fafb',\n accent: '#3b9ad6',\n },\n },\n lightMode: {\n background: '#f9fafb',\n foreground: '#1f2937',\n card: '#ffffff',\n cardForeground: '#1f2937',\n popover: '#ffffff',\n popoverForeground: '#1f2937',\n primary: '#1a2f50',\n primaryForeground: '#ffffff',\n secondary: '#e6ebf0',\n secondaryForeground: '#1f2937',\n muted: '#e6ebf0',\n mutedForeground: '#6b7280',\n accent: '#3b9ad6',\n accentForeground: '#ffffff',\n destructive: '#bc3535',\n destructiveForeground: '#ffffff',\n border: '#d1d5db',\n input: '#d1d5db',\n ring: '#1a2f50',\n },\n darkMode: {\n background: '#111827',\n foreground: '#f3f4f6',\n card: '#1f2937',\n cardForeground: '#f3f4f6',\n popover: '#1f2937',\n popoverForeground: '#f3f4f6',\n primary: '#3b82f6',\n primaryForeground: '#ffffff',\n secondary: '#374151',\n secondaryForeground: '#f3f4f6',\n muted: '#374151',\n mutedForeground: '#9ca3af',\n accent: '#60a5fa',\n accentForeground: '#111827',\n destructive: '#ef4444',\n destructiveForeground: '#ffffff',\n border: '#4b5563',\n input: '#4b5563',\n ring: '#3b82f6',\n },\n typography: {\n fontFamily: 'var(--font-geist-sans)',\n headingFamily: 'var(--font-outfit)',\n baseFontSize: '16px',\n lineHeight: '1.6',\n fontWeights: {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n },\n letterSpacing: {\n tight: '-0.01em',\n normal: '0.01em',\n wide: '0.05em',\n },\n },\n },\n {\n name: 'real-estate',\n label: 'Real Estate Blue',\n borderRadius: 'large',\n preview: {\n colors: {\n primary: '#1e40af',\n background: '#fafbff',\n accent: '#3b9ad6',\n },\n },\n lightMode: {\n background: '#fafbff',\n foreground: '#1e293b',\n card: '#ffffff',\n cardForeground: '#1e293b',\n popover: '#ffffff',\n popoverForeground: '#1e293b',\n primary: '#1e40af',\n primaryForeground: '#ffffff',\n secondary: '#e0ecff',\n secondaryForeground: '#1e293b',\n muted: '#f1f5f9',\n mutedForeground: '#64748b',\n accent: '#3b9ad6',\n accentForeground: '#ffffff',\n destructive: '#dc2626',\n destructiveForeground: '#ffffff',\n border: '#cbd5e1',\n input: '#f1f5f9',\n ring: '#1e40af',\n },\n darkMode: {\n background: '#0f172a',\n foreground: '#f1f5f9',\n card: '#1e293b',\n cardForeground: '#f1f5f9',\n popover: '#1e293b',\n popoverForeground: '#f1f5f9',\n primary: '#3b82f6',\n primaryForeground: '#ffffff',\n secondary: '#334155',\n secondaryForeground: '#f1f5f9',\n muted: '#334155',\n mutedForeground: '#94a3b8',\n accent: '#60a5fa',\n accentForeground: '#0f172a',\n destructive: '#ef4444',\n destructiveForeground: '#ffffff',\n border: '#475569',\n input: '#334155',\n ring: '#3b82f6',\n },\n typography: {\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 name: 'real-estate-gold',\n label: 'Real Estate Gold',\n borderRadius: 'large',\n preview: {\n colors: {\n primary: '#b8860b',\n background: '#fffbf0',\n accent: '#f5d547',\n },\n },\n lightMode: {\n background: '#fffbf0',\n foreground: '#302618',\n card: '#ffffff',\n cardForeground: '#302618',\n popover: '#ffffff',\n popoverForeground: '#302618',\n primary: '#b8860b',\n primaryForeground: '#fffbf0',\n secondary: '#f7eed6',\n secondaryForeground: '#302618',\n muted: '#f3e9d8',\n mutedForeground: '#6d5d47',\n accent: '#f5d547',\n accentForeground: '#302618',\n destructive: '#dc2f2f',\n destructiveForeground: '#ffffff',\n border: '#e5d9c0',\n input: '#f3e9d8',\n ring: '#b8860b',\n },\n darkMode: {\n background: '#1a1510',\n foreground: '#f5f0e6',\n card: '#262014',\n cardForeground: '#f5f0e6',\n popover: '#262014',\n popoverForeground: '#f5f0e6',\n primary: '#daa520',\n primaryForeground: '#1a1510',\n secondary: '#3d3426',\n secondaryForeground: '#f5f0e6',\n muted: '#3d3426',\n mutedForeground: '#b8a68f',\n accent: '#ffd700',\n accentForeground: '#1a1510',\n destructive: '#ef4444',\n destructiveForeground: '#ffffff',\n border: '#554729',\n input: '#3d3426',\n ring: '#daa520',\n },\n typography: {\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 name: 'real-estate-neutral',\n label: 'Real Estate Neutral',\n borderRadius: 'large',\n preview: {\n colors: {\n primary: '#57534e',\n background: '#fafaf9',\n accent: '#78716c',\n },\n },\n lightMode: {\n background: '#fafaf9',\n foreground: '#292524',\n card: '#ffffff',\n cardForeground: '#292524',\n popover: '#ffffff',\n popoverForeground: '#292524',\n primary: '#57534e',\n primaryForeground: '#ffffff',\n secondary: '#e7e5e4',\n secondaryForeground: '#292524',\n muted: '#f5f5f4',\n mutedForeground: '#78716c',\n accent: '#78716c',\n accentForeground: '#ffffff',\n destructive: '#dc2626',\n destructiveForeground: '#ffffff',\n border: '#d6d3d1',\n input: '#f5f5f4',\n ring: '#57534e',\n },\n darkMode: {\n background: '#1c1917',\n foreground: '#fafaf9',\n card: '#292524',\n cardForeground: '#fafaf9',\n popover: '#292524',\n popoverForeground: '#fafaf9',\n primary: '#78716c',\n primaryForeground: '#ffffff',\n secondary: '#44403c',\n secondaryForeground: '#fafaf9',\n muted: '#44403c',\n mutedForeground: '#a8a29e',\n accent: '#a8a29e',\n accentForeground: '#1c1917',\n destructive: '#ef4444',\n destructiveForeground: '#ffffff',\n border: '#57534e',\n input: '#44403c',\n ring: '#78716c',\n },\n typography: {\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"],"names":["defaultThemePresets","name","label","borderRadius","preview","colors","primary","background","accent","lightMode","foreground","card","cardForeground","popover","popoverForeground","primaryForeground","secondary","secondaryForeground","muted","mutedForeground","accentForeground","destructive","destructiveForeground","border","input","ring","darkMode","typography","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","normal","medium","semibold","bold","letterSpacing","tight","wide","light","black","wider"],"mappings":"AA2CA,OAAO,MAAMA,sBAAqC;IAChD;QACEC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;QACAC,WAAW;YACTF,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAC,UAAU;YACRnB,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAE,YAAY;YACVC,YAAY;YACZC,eAAe;YACfC,cAAc;YACdC,YAAY;YACZC,aAAa;gBACXC,QAAQ;gBACRC,QAAQ;gBACRC,UAAU;gBACVC,MAAM;YACR;YACAC,eAAe;gBACbC,OAAO;gBACPL,QAAQ;gBACRM,MAAM;YACR;QACF;IACF;IACA;QACEtC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;QACAC,WAAW;YACTF,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAC,UAAU;YACRnB,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAE,YAAY;YACVC,YAAY;YACZC,eAAe;YACfC,cAAc;YACdC,YAAY;YACZC,aAAa;gBACXC,QAAQ;gBACRC,QAAQ;gBACRC,UAAU;gBACVC,MAAM;YACR;YACAC,eAAe;gBACbC,OAAO;gBACPL,QAAQ;gBACRM,MAAM;YACR;QACF;IACF;IACA;QACEtC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;QACAC,WAAW;YACTF,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAC,UAAU;YACRnB,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAE,YAAY;YACVC,YAAY;YACZC,eAAe;YACfC,cAAc;YACdC,YAAY;YACZC,aAAa;gBACXC,QAAQ;gBACRC,QAAQ;gBACRC,UAAU;gBACVC,MAAM;YACR;YACAC,eAAe;gBACbC,OAAO;gBACPL,QAAQ;gBACRM,MAAM;YACR;QACF;IACF;IACA;QACEtC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;QACAC,WAAW;YACTF,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAC,UAAU;YACRnB,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAE,YAAY;YACVC,YAAY;YACZC,eAAe;YACfC,cAAc;YACdC,YAAY;YACZC,aAAa;gBACXC,QAAQ;gBACRC,QAAQ;gBACRC,UAAU;gBACVC,MAAM;YACR;YACAC,eAAe;gBACbC,OAAO;gBACPL,QAAQ;gBACRM,MAAM;YACR;QACF;IACF;IACA;QACEtC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;QACAC,WAAW;YACTF,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAC,UAAU;YACRnB,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAE,YAAY;YACVC,YAAY;YACZC,eAAe;YACfC,cAAc;YACdC,YAAY;YACZC,aAAa;gBACXC,QAAQ;gBACRC,QAAQ;gBACRC,UAAU;gBACVC,MAAM;YACR;YACAC,eAAe;gBACbC,OAAO;gBACPL,QAAQ;gBACRM,MAAM;YACR;QACF;IACF;IACA;QACEtC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;QACAC,WAAW;YACTF,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAC,UAAU;YACRnB,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAE,YAAY;YACVC,YAAY;YACZC,eAAe;YACfC,cAAc;YACdC,YAAY;YACZC,aAAa;gBACXQ,OAAO;gBACPP,QAAQ;gBACRC,QAAQ;gBACRC,UAAU;gBACVC,MAAM;gBACNK,OAAO;YACT;YACAJ,eAAe;gBACbC,OAAO;gBACPL,QAAQ;gBACRM,MAAM;gBACNG,OAAO;YACT;QACF;IACF;IACA;QACEzC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;QACAC,WAAW;YACTF,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAC,UAAU;YACRnB,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAE,YAAY;YACVC,YAAY;YACZC,eAAe;YACfC,cAAc;YACdC,YAAY;YACZC,aAAa;gBACXQ,OAAO;gBACPP,QAAQ;gBACRC,QAAQ;gBACRC,UAAU;gBACVC,MAAM;gBACNK,OAAO;YACT;YACAJ,eAAe;gBACbC,OAAO;gBACPL,QAAQ;gBACRM,MAAM;gBACNG,OAAO;YACT;QACF;IACF;IACA;QACEzC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;QACAC,WAAW;YACTF,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAC,UAAU;YACRnB,YAAY;YACZG,YAAY;YACZC,MAAM;YACNC,gBAAgB;YAChBC,SAAS;YACTC,mBAAmB;YACnBR,SAAS;YACTS,mBAAmB;YACnBC,WAAW;YACXC,qBAAqB;YACrBC,OAAO;YACPC,iBAAiB;YACjBX,QAAQ;YACRY,kBAAkB;YAClBC,aAAa;YACbC,uBAAuB;YACvBC,QAAQ;YACRC,OAAO;YACPC,MAAM;QACR;QACAE,YAAY;YACVC,YAAY;YACZC,eAAe;YACfC,cAAc;YACdC,YAAY;YACZC,aAAa;gBACXQ,OAAO;gBACPP,QAAQ;gBACRC,QAAQ;gBACRC,UAAU;gBACVC,MAAM;gBACNK,OAAO;YACT;YACAJ,eAAe;gBACbC,OAAO;gBACPL,QAAQ;gBACRM,MAAM;gBACNG,OAAO;YACT;QACF;IACF;CACD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/Theme/index.tsx"],"sourcesContent":["'use client'\r\n\r\nimport React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'\r\nimport { defaultMode, modeLocalStorageKey } from './shared.js'\r\nimport type { Mode, ThemeContextType, ThemeDefaults } from './types.js'\r\n\r\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined)\r\n\r\nexport const useTheme = (): ThemeContextType => {\r\n const context = useContext(ThemeContext)\r\n if (!context) {\r\n throw new Error('useTheme must be used within a ThemeProvider')\r\n }\r\n return context\r\n}\r\n\r\ninterface ThemeProviderProps {\r\n children: React.ReactNode\r\n initialTheme?: ThemeDefaults\r\n initialMode?: Mode\r\n allowColorModeToggle?: boolean\r\n}\r\n\r\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\r\n children,\r\n initialTheme,\r\n initialMode,\r\n allowColorModeToggle = true,\r\n}) => {\r\n // State pro light/dark mode switching\r\n const [mode, setMode] = useState<Mode | null>(initialMode || defaultMode)\r\n const [theme] = useState<ThemeDefaults | null>(initialTheme || null)\r\n\r\n // Funkce pro získání skutečného módu (resolve \"auto\" mode)\r\n const getResolvedMode = useCallback((currentMode: Mode | null): 'light' | 'dark' => {\r\n if (currentMode === 'auto' && typeof window !== 'undefined') {\r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\r\n return mediaQuery.matches ? 'dark' : 'light'\r\n }\r\n return currentMode === 'dark' ? 'dark' : 'light'\r\n }, [])\r\n\r\n // Aplikace módu na DOM a CSS variables\r\n const applyMode = useCallback(\r\n (currentMode: Mode | null) => {\r\n if (typeof window !== 'undefined') {\r\n const resolvedMode = getResolvedMode(currentMode)\r\n\r\n // Získej aktuální theme z DOM nebo použij fallback\r\n const currentTheme =\r\n document.documentElement.getAttribute('data-theme') ||\r\n (typeof theme === 'string' ? theme : 'cool')\r\n\r\n // Aplikuj data atributy a třídy (kompatibilní s CSS selektory)\r\n document.documentElement.setAttribute('data-color-mode', resolvedMode)\r\n document.documentElement.setAttribute('data-theme-mode', resolvedMode)\r\n document.documentElement.setAttribute('data-theme', currentTheme)\r\n document.documentElement.classList.remove('light', 'dark', 'auto')\r\n document.documentElement.classList.add(resolvedMode)\r\n\r\n // Force re-computation of CSS custom properties\r\n document.documentElement.style.setProperty('--color-mode', resolvedMode)\r\n\r\n // Force repaint to ensure CSS variables update\r\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\r\n document.documentElement.offsetHeight\r\n\r\n // Dispatch custom event for components that need to react to theme changes\r\n window.dispatchEvent(\r\n new CustomEvent('themeChange', {\r\n detail: { mode: resolvedMode, originalMode: currentMode, theme: currentTheme },\r\n }),\r\n )\r\n }\r\n },\r\n [getResolvedMode, theme],\r\n )\r\n\r\n // Uložení light/dark mode do localStorage a aplikace\r\n const updateMode = useCallback(\r\n (newMode: Mode | null) => {\r\n setMode(newMode)\r\n if (newMode && typeof window !== 'undefined') {\r\n localStorage.setItem(modeLocalStorageKey, newMode)\r\n applyMode(newMode)\r\n }\r\n },\r\n [applyMode],\r\n )\r\n\r\n // Načtení mode z localStorage při startu\r\n useEffect(() => {\r\n if (typeof window !== 'undefined') {\r\n const storedMode = localStorage.getItem(modeLocalStorageKey) as Mode | null\r\n if (storedMode && ['light', 'dark', 'auto'].includes(storedMode)) {\r\n setMode(storedMode)\r\n applyMode(storedMode)\r\n } else {\r\n // Fallback na default mode\r\n applyMode(defaultMode)\r\n }\r\n }\r\n }, [applyMode])\r\n\r\n // Listener pro změny system preference (pouze při auto mode)\r\n useEffect(() => {\r\n if (mode === 'auto' && typeof window !== 'undefined') {\r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\r\n\r\n const handleChange = () => {\r\n applyMode('auto') // Re-resolve auto mode\r\n }\r\n\r\n mediaQuery.addEventListener('change', handleChange)\r\n\r\n return () => {\r\n mediaQuery.removeEventListener('change', handleChange)\r\n }\r\n }\r\n }, [mode, applyMode])\r\n\r\n const refreshTheme = useCallback(() => {\r\n // Refresh theme - aplikuj aktuální mode\r\n applyMode(mode)\r\n }, [mode, applyMode])\r\n\r\n const contextValue = useMemo(\r\n () => ({\r\n theme,\r\n mode,\r\n setTheme: () => {}, // Nepoužíváme - theme se nastavuje přes SSR\r\n setMode: updateMode,\r\n isColorModeToggleAllowed: allowColorModeToggle,\r\n refreshTheme,\r\n }),\r\n [theme, mode, updateMode, allowColorModeToggle, refreshTheme],\r\n )\r\n\r\n return <ThemeContext.Provider value={contextValue}>{children}</ThemeContext.Provider>\r\n}\r\n"],"names":["React","createContext","useCallback","useContext","useEffect","useMemo","useState","defaultMode","modeLocalStorageKey","ThemeContext","undefined","useTheme","context","Error","ThemeProvider","children","initialTheme","initialMode","allowColorModeToggle","mode","setMode","theme","getResolvedMode","currentMode","window","mediaQuery","matchMedia","matches","applyMode","resolvedMode","currentTheme","document","documentElement","getAttribute","setAttribute","classList","remove","add","style","setProperty","offsetHeight","dispatchEvent","CustomEvent","detail","originalMode","updateMode","newMode","localStorage","setItem","storedMode","getItem","includes","handleChange","addEventListener","removeEventListener","refreshTheme","contextValue","setTheme","isColorModeToggleAllowed","Provider","value"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/providers/Theme/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'\nimport { defaultMode, modeLocalStorageKey } from './shared.js'\nimport type { Mode, ThemeContextType, ThemeDefaults } from './types.js'\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined)\n\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n return context\n}\n\ninterface ThemeProviderProps {\n children: React.ReactNode\n initialTheme?: ThemeDefaults\n initialMode?: Mode\n allowColorModeToggle?: boolean\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n initialTheme,\n initialMode,\n allowColorModeToggle = true,\n}) => {\n // State pro light/dark mode switching\n const [mode, setMode] = useState<Mode | null>(initialMode || defaultMode)\n const [theme] = useState<ThemeDefaults | null>(initialTheme || null)\n\n // Funkce pro získání skutečného módu (resolve \"auto\" mode)\n const getResolvedMode = useCallback((currentMode: Mode | null): 'light' | 'dark' => {\n if (currentMode === 'auto' && typeof window !== 'undefined') {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n return mediaQuery.matches ? 'dark' : 'light'\n }\n return currentMode === 'dark' ? 'dark' : 'light'\n }, [])\n\n // Aplikace módu na DOM a CSS variables\n const applyMode = useCallback(\n (currentMode: Mode | null) => {\n if (typeof window !== 'undefined') {\n const resolvedMode = getResolvedMode(currentMode)\n\n // Získej aktuální theme z DOM nebo použij fallback\n const currentTheme =\n document.documentElement.getAttribute('data-theme') ||\n (typeof theme === 'string' ? theme : 'cool')\n\n // Aplikuj data atributy a třídy (kompatibilní s CSS selektory)\n document.documentElement.setAttribute('data-color-mode', resolvedMode)\n document.documentElement.setAttribute('data-theme-mode', resolvedMode)\n document.documentElement.setAttribute('data-theme', currentTheme)\n document.documentElement.classList.remove('light', 'dark', 'auto')\n document.documentElement.classList.add(resolvedMode)\n\n // Force re-computation of CSS custom properties\n document.documentElement.style.setProperty('--color-mode', resolvedMode)\n\n // Force repaint to ensure CSS variables update\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n document.documentElement.offsetHeight\n\n // Dispatch custom event for components that need to react to theme changes\n window.dispatchEvent(\n new CustomEvent('themeChange', {\n detail: { mode: resolvedMode, originalMode: currentMode, theme: currentTheme },\n }),\n )\n }\n },\n [getResolvedMode, theme],\n )\n\n // Uložení light/dark mode do localStorage a aplikace\n const updateMode = useCallback(\n (newMode: Mode | null) => {\n setMode(newMode)\n if (newMode && typeof window !== 'undefined') {\n localStorage.setItem(modeLocalStorageKey, newMode)\n applyMode(newMode)\n }\n },\n [applyMode],\n )\n\n // Načtení mode z localStorage při startu\n useEffect(() => {\n if (typeof window !== 'undefined') {\n const storedMode = localStorage.getItem(modeLocalStorageKey) as Mode | null\n if (storedMode && ['light', 'dark', 'auto'].includes(storedMode)) {\n setMode(storedMode)\n applyMode(storedMode)\n } else {\n // Fallback na default mode\n applyMode(defaultMode)\n }\n }\n }, [applyMode])\n\n // Listener pro změny system preference (pouze při auto mode)\n useEffect(() => {\n if (mode === 'auto' && typeof window !== 'undefined') {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n const handleChange = () => {\n applyMode('auto') // Re-resolve auto mode\n }\n\n mediaQuery.addEventListener('change', handleChange)\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange)\n }\n }\n }, [mode, applyMode])\n\n const refreshTheme = useCallback(() => {\n // Refresh theme - aplikuj aktuální mode\n applyMode(mode)\n }, [mode, applyMode])\n\n const contextValue = useMemo(\n () => ({\n theme,\n mode,\n setTheme: () => {}, // Nepoužíváme - theme se nastavuje přes SSR\n setMode: updateMode,\n isColorModeToggleAllowed: allowColorModeToggle,\n refreshTheme,\n }),\n [theme, mode, updateMode, allowColorModeToggle, refreshTheme],\n )\n\n return <ThemeContext.Provider value={contextValue}>{children}</ThemeContext.Provider>\n}\n"],"names":["React","createContext","useCallback","useContext","useEffect","useMemo","useState","defaultMode","modeLocalStorageKey","ThemeContext","undefined","useTheme","context","Error","ThemeProvider","children","initialTheme","initialMode","allowColorModeToggle","mode","setMode","theme","getResolvedMode","currentMode","window","mediaQuery","matchMedia","matches","applyMode","resolvedMode","currentTheme","document","documentElement","getAttribute","setAttribute","classList","remove","add","style","setProperty","offsetHeight","dispatchEvent","CustomEvent","detail","originalMode","updateMode","newMode","localStorage","setItem","storedMode","getItem","includes","handleChange","addEventListener","removeEventListener","refreshTheme","contextValue","setTheme","isColorModeToggleAllowed","Provider","value"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/Theme/shared.ts"],"sourcesContent":["import type { Mode, ThemeOption, ThemeDefaults } from './types.js'\r\n\r\nexport const themeLocalStorageKey = 'payload-theme'\r\nexport const modeLocalStorageKey = 'payload-theme-mode'\r\n\r\nexport const defaultTheme = 'cool' as ThemeDefaults\r\nexport const defaultMode = 'auto' as Mode\r\n\r\nexport const themeOptions = [\r\n { label: 'Cool & Professional', value: 'cool' },\r\n { label: 'Modern Brutalism', value: 'brutal' },\r\n { label: 'Neon Cyberpunk', value: 'neon' },\r\n { label: 'Dealership', value: 'dealership' },\r\n { label: 'Solar', value: 'solar' },\r\n { label: 'Real Estate Blue', value: 'real-estate' },\r\n { label: 'Real Estate Gold', value: 'real-estate-gold' },\r\n { label: 'Real Estate Neutral', value: 'real-estate-neutral' },\r\n] as ThemeOption[]\r\n\r\nexport const getImplicitModePreference = (): Mode | null => {\r\n const mediaQuery = '(prefers-color-scheme: dark)'\r\n const mql = window.matchMedia(mediaQuery)\r\n const hasImplicitPreference = typeof mql.matches === 'boolean'\r\n\r\n if (hasImplicitPreference) {\r\n return mql.matches ? 'dark' : 'light'\r\n }\r\n\r\n return null\r\n}\r\n"],"names":["themeLocalStorageKey","modeLocalStorageKey","defaultTheme","defaultMode","themeOptions","label","value","getImplicitModePreference","mediaQuery","mql","window","matchMedia","hasImplicitPreference","matches"],"mappings":"AAEA,OAAO,MAAMA,uBAAuB,gBAAe;AACnD,OAAO,MAAMC,sBAAsB,qBAAoB;AAEvD,OAAO,MAAMC,eAAe,OAAuB;AACnD,OAAO,MAAMC,cAAc,OAAc;AAEzC,OAAO,MAAMC,eAAe;IAC1B;QAAEC,OAAO;QAAuBC,OAAO;IAAO;IAC9C;QAAED,OAAO;QAAoBC,OAAO;IAAS;IAC7C;QAAED,OAAO;QAAkBC,OAAO;IAAO;IACzC;QAAED,OAAO;QAAcC,OAAO;IAAa;IAC3C;QAAED,OAAO;QAASC,OAAO;IAAQ;IACjC;QAAED,OAAO;QAAoBC,OAAO;IAAc;IAClD;QAAED,OAAO;QAAoBC,OAAO;IAAmB;IACvD;QAAED,OAAO;QAAuBC,OAAO;IAAsB;CAC9D,CAAiB;AAElB,OAAO,MAAMC,4BAA4B;IACvC,MAAMC,aAAa;IACnB,MAAMC,MAAMC,OAAOC,UAAU,CAACH;IAC9B,MAAMI,wBAAwB,OAAOH,IAAII,OAAO,KAAK;IAErD,IAAID,uBAAuB;QACzB,OAAOH,IAAII,OAAO,GAAG,SAAS;IAChC;IAEA,OAAO;AACT,EAAC"}
1
+ {"version":3,"sources":["../../../src/providers/Theme/shared.ts"],"sourcesContent":["import type { Mode, ThemeOption, ThemeDefaults } from './types.js'\n\nexport const themeLocalStorageKey = 'payload-theme'\nexport const modeLocalStorageKey = 'payload-theme-mode'\n\nexport const defaultTheme = 'cool' as ThemeDefaults\nexport const defaultMode = 'auto' as Mode\n\nexport const themeOptions = [\n { label: 'Cool & Professional', value: 'cool' },\n { label: 'Modern Brutalism', value: 'brutal' },\n { label: 'Neon Cyberpunk', value: 'neon' },\n { label: 'Dealership', value: 'dealership' },\n { label: 'Solar', value: 'solar' },\n { label: 'Real Estate Blue', value: 'real-estate' },\n { label: 'Real Estate Gold', value: 'real-estate-gold' },\n { label: 'Real Estate Neutral', value: 'real-estate-neutral' },\n] as ThemeOption[]\n\nexport const getImplicitModePreference = (): Mode | null => {\n const mediaQuery = '(prefers-color-scheme: dark)'\n const mql = window.matchMedia(mediaQuery)\n const hasImplicitPreference = typeof mql.matches === 'boolean'\n\n if (hasImplicitPreference) {\n return mql.matches ? 'dark' : 'light'\n }\n\n return null\n}\n"],"names":["themeLocalStorageKey","modeLocalStorageKey","defaultTheme","defaultMode","themeOptions","label","value","getImplicitModePreference","mediaQuery","mql","window","matchMedia","hasImplicitPreference","matches"],"mappings":"AAEA,OAAO,MAAMA,uBAAuB,gBAAe;AACnD,OAAO,MAAMC,sBAAsB,qBAAoB;AAEvD,OAAO,MAAMC,eAAe,OAAuB;AACnD,OAAO,MAAMC,cAAc,OAAc;AAEzC,OAAO,MAAMC,eAAe;IAC1B;QAAEC,OAAO;QAAuBC,OAAO;IAAO;IAC9C;QAAED,OAAO;QAAoBC,OAAO;IAAS;IAC7C;QAAED,OAAO;QAAkBC,OAAO;IAAO;IACzC;QAAED,OAAO;QAAcC,OAAO;IAAa;IAC3C;QAAED,OAAO;QAASC,OAAO;IAAQ;IACjC;QAAED,OAAO;QAAoBC,OAAO;IAAc;IAClD;QAAED,OAAO;QAAoBC,OAAO;IAAmB;IACvD;QAAED,OAAO;QAAuBC,OAAO;IAAsB;CAC9D,CAAiB;AAElB,OAAO,MAAMC,4BAA4B;IACvC,MAAMC,aAAa;IACnB,MAAMC,MAAMC,OAAOC,UAAU,CAACH;IAC9B,MAAMI,wBAAwB,OAAOH,IAAII,OAAO,KAAK;IAErD,IAAID,uBAAuB;QACzB,OAAOH,IAAII,OAAO,GAAG,SAAS;IAChC;IAEA,OAAO;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/Theme/themeConfig.ts"],"sourcesContent":["import type { ThemeConfig, ThemeDefaults } from './types.js'\r\n\r\nexport const themeConfigs: Record<ThemeDefaults, ThemeConfig> = {\r\n cool: {\r\n name: 'cool',\r\n label: 'Cool & Professional',\r\n borderRadius: 'medium',\r\n cssFile: '/themes/cool.css',\r\n preview: {\r\n colors: {\r\n primary: 'hsl(221 83% 53%)',\r\n background: 'hsl(0 0% 100%)',\r\n accent: 'hsl(210 40% 95%)',\r\n },\r\n },\r\n },\r\n brutal: {\r\n name: 'brutal',\r\n label: 'Modern Brutalism',\r\n borderRadius: 'none',\r\n cssFile: '/themes/brutal.css',\r\n preview: {\r\n colors: {\r\n primary: 'hsl(0 0% 0%)',\r\n background: 'hsl(0 0% 100%)',\r\n accent: 'hsl(0 72% 51%)',\r\n },\r\n },\r\n },\r\n neon: {\r\n name: 'neon',\r\n label: 'Neon Cyberpunk',\r\n borderRadius: 'medium',\r\n cssFile: '/themes/neon.css',\r\n preview: {\r\n colors: {\r\n primary: 'hsl(263 90% 51%)',\r\n background: 'hsl(230 25% 5%)',\r\n accent: 'hsl(180 100% 50%)',\r\n },\r\n },\r\n },\r\n solar: {\r\n name: 'solar',\r\n label: 'Solar',\r\n borderRadius: 'large',\r\n cssFile: '/themes/solar.css',\r\n preview: {\r\n colors: {\r\n primary: 'hsl(20 90% 45%)',\r\n background: 'hsl(40 30% 95%)',\r\n accent: 'hsl(40 100% 50%)',\r\n },\r\n },\r\n },\r\n dealership: {\r\n name: 'dealership',\r\n label: 'Dealership',\r\n borderRadius: 'medium',\r\n cssFile: '/themes/dealership.css',\r\n preview: {\r\n colors: {\r\n primary: 'hsl(225 25% 25%)',\r\n background: 'hsl(0 0% 98%)',\r\n accent: 'hsl(15 85% 55%)',\r\n },\r\n },\r\n },\r\n 'real-estate': {\r\n name: 'real-estate',\r\n label: 'Real Estate Blue',\r\n borderRadius: 'large',\r\n cssFile: '/themes/real-estate.css',\r\n preview: {\r\n colors: {\r\n primary: 'hsl(220 90% 48%)',\r\n background: 'hsl(220 40% 98.5%)',\r\n accent: 'hsl(210 85% 55%)',\r\n },\r\n },\r\n },\r\n 'real-estate-gold': {\r\n name: 'real-estate-gold',\r\n label: 'Real Estate Gold',\r\n borderRadius: 'large',\r\n cssFile: '/themes/real-estate-gold.css',\r\n preview: {\r\n colors: {\r\n primary: 'hsl(38 75% 45%)',\r\n background: 'hsl(45 25% 97%)',\r\n accent: 'hsl(42 85% 55%)',\r\n },\r\n },\r\n },\r\n 'real-estate-neutral': {\r\n name: 'real-estate-neutral',\r\n label: 'Real Estate Neutral',\r\n borderRadius: 'large',\r\n cssFile: '/themes/real-estate-neutral.css',\r\n preview: {\r\n colors: {\r\n primary: 'hsl(25 35% 25%)',\r\n background: 'hsl(30 8% 98%)',\r\n accent: 'hsl(35 25% 45%)',\r\n },\r\n },\r\n },\r\n}\r\n\r\nexport const borderRadiusPresets = {\r\n none: {\r\n label: 'None',\r\n value: 'none',\r\n css: {\r\n '--radius-xs': '0',\r\n '--radius-small': '0',\r\n '--radius-default': '0',\r\n '--radius-medium': '0',\r\n '--radius-large': '0',\r\n '--radius-xl': '0',\r\n },\r\n },\r\n small: {\r\n label: 'Small',\r\n value: 'small',\r\n css: {\r\n '--radius-xs': '0.125rem',\r\n '--radius-small': '0.25rem',\r\n '--radius-default': '0.375rem',\r\n '--radius-medium': '0.5rem',\r\n '--radius-large': '0.75rem',\r\n '--radius-xl': '1rem',\r\n },\r\n },\r\n medium: {\r\n label: 'Medium',\r\n value: 'medium',\r\n css: {\r\n '--radius-xs': '0.25rem',\r\n '--radius-small': '0.5rem',\r\n '--radius-default': '0.75rem',\r\n '--radius-medium': '1rem',\r\n '--radius-large': '1.5rem',\r\n '--radius-xl': '2rem',\r\n },\r\n },\r\n large: {\r\n label: 'Large',\r\n value: 'large',\r\n css: {\r\n '--radius-xs': '0.5rem',\r\n '--radius-small': '0.75rem',\r\n '--radius-default': '1rem',\r\n '--radius-medium': '1.5rem',\r\n '--radius-large': '2rem',\r\n '--radius-xl': '2.5rem',\r\n },\r\n },\r\n xl: {\r\n label: 'Extra Large',\r\n value: 'xl',\r\n css: {\r\n '--radius-xs': '0.75rem',\r\n '--radius-small': '1rem',\r\n '--radius-default': '1.5rem',\r\n '--radius-medium': '2rem',\r\n '--radius-large': '2.5rem',\r\n '--radius-xl': '3rem',\r\n },\r\n },\r\n} as const\r\n\r\nexport function getThemeConfig(theme: ThemeDefaults): ThemeConfig {\r\n return themeConfigs[theme]\r\n}\r\n\r\nexport function getBorderRadiusConfig(preset: keyof typeof borderRadiusPresets) {\r\n return borderRadiusPresets[preset]\r\n}\r\n"],"names":["themeConfigs","cool","name","label","borderRadius","cssFile","preview","colors","primary","background","accent","brutal","neon","solar","dealership","borderRadiusPresets","none","value","css","small","medium","large","xl","getThemeConfig","theme","getBorderRadiusConfig","preset"],"mappings":"AAEA,OAAO,MAAMA,eAAmD;IAC9DC,MAAM;QACJC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACAC,QAAQ;QACNT,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACAE,MAAM;QACJV,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACAG,OAAO;QACLX,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACAI,YAAY;QACVZ,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACA,eAAe;QACbR,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACA,oBAAoB;QAClBR,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACA,uBAAuB;QACrBR,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;AACF,EAAC;AAED,OAAO,MAAMK,sBAAsB;IACjCC,MAAM;QACJb,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;IACAC,OAAO;QACLhB,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;IACAE,QAAQ;QACNjB,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;IACAG,OAAO;QACLlB,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;IACAI,IAAI;QACFnB,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;AACF,EAAU;AAEV,OAAO,SAASK,eAAeC,KAAoB;IACjD,OAAOxB,YAAY,CAACwB,MAAM;AAC5B;AAEA,OAAO,SAASC,sBAAsBC,MAAwC;IAC5E,OAAOX,mBAAmB,CAACW,OAAO;AACpC"}
1
+ {"version":3,"sources":["../../../src/providers/Theme/themeConfig.ts"],"sourcesContent":["import type { ThemeConfig, ThemeDefaults } from './types.js'\n\nexport const themeConfigs: Record<ThemeDefaults, ThemeConfig> = {\n cool: {\n name: 'cool',\n label: 'Cool & Professional',\n borderRadius: 'medium',\n cssFile: '/themes/cool.css',\n preview: {\n colors: {\n primary: 'hsl(221 83% 53%)',\n background: 'hsl(0 0% 100%)',\n accent: 'hsl(210 40% 95%)',\n },\n },\n },\n brutal: {\n name: 'brutal',\n label: 'Modern Brutalism',\n borderRadius: 'none',\n cssFile: '/themes/brutal.css',\n preview: {\n colors: {\n primary: 'hsl(0 0% 0%)',\n background: 'hsl(0 0% 100%)',\n accent: 'hsl(0 72% 51%)',\n },\n },\n },\n neon: {\n name: 'neon',\n label: 'Neon Cyberpunk',\n borderRadius: 'medium',\n cssFile: '/themes/neon.css',\n preview: {\n colors: {\n primary: 'hsl(263 90% 51%)',\n background: 'hsl(230 25% 5%)',\n accent: 'hsl(180 100% 50%)',\n },\n },\n },\n solar: {\n name: 'solar',\n label: 'Solar',\n borderRadius: 'large',\n cssFile: '/themes/solar.css',\n preview: {\n colors: {\n primary: 'hsl(20 90% 45%)',\n background: 'hsl(40 30% 95%)',\n accent: 'hsl(40 100% 50%)',\n },\n },\n },\n dealership: {\n name: 'dealership',\n label: 'Dealership',\n borderRadius: 'medium',\n cssFile: '/themes/dealership.css',\n preview: {\n colors: {\n primary: 'hsl(225 25% 25%)',\n background: 'hsl(0 0% 98%)',\n accent: 'hsl(15 85% 55%)',\n },\n },\n },\n 'real-estate': {\n name: 'real-estate',\n label: 'Real Estate Blue',\n borderRadius: 'large',\n cssFile: '/themes/real-estate.css',\n preview: {\n colors: {\n primary: 'hsl(220 90% 48%)',\n background: 'hsl(220 40% 98.5%)',\n accent: 'hsl(210 85% 55%)',\n },\n },\n },\n 'real-estate-gold': {\n name: 'real-estate-gold',\n label: 'Real Estate Gold',\n borderRadius: 'large',\n cssFile: '/themes/real-estate-gold.css',\n preview: {\n colors: {\n primary: 'hsl(38 75% 45%)',\n background: 'hsl(45 25% 97%)',\n accent: 'hsl(42 85% 55%)',\n },\n },\n },\n 'real-estate-neutral': {\n name: 'real-estate-neutral',\n label: 'Real Estate Neutral',\n borderRadius: 'large',\n cssFile: '/themes/real-estate-neutral.css',\n preview: {\n colors: {\n primary: 'hsl(25 35% 25%)',\n background: 'hsl(30 8% 98%)',\n accent: 'hsl(35 25% 45%)',\n },\n },\n },\n}\n\nexport const borderRadiusPresets = {\n none: {\n label: 'None',\n value: 'none',\n css: {\n '--radius-xs': '0',\n '--radius-small': '0',\n '--radius-default': '0',\n '--radius-medium': '0',\n '--radius-large': '0',\n '--radius-xl': '0',\n },\n },\n small: {\n label: 'Small',\n value: 'small',\n css: {\n '--radius-xs': '0.125rem',\n '--radius-small': '0.25rem',\n '--radius-default': '0.375rem',\n '--radius-medium': '0.5rem',\n '--radius-large': '0.75rem',\n '--radius-xl': '1rem',\n },\n },\n medium: {\n label: 'Medium',\n value: 'medium',\n css: {\n '--radius-xs': '0.25rem',\n '--radius-small': '0.5rem',\n '--radius-default': '0.75rem',\n '--radius-medium': '1rem',\n '--radius-large': '1.5rem',\n '--radius-xl': '2rem',\n },\n },\n large: {\n label: 'Large',\n value: 'large',\n css: {\n '--radius-xs': '0.5rem',\n '--radius-small': '0.75rem',\n '--radius-default': '1rem',\n '--radius-medium': '1.5rem',\n '--radius-large': '2rem',\n '--radius-xl': '2.5rem',\n },\n },\n xl: {\n label: 'Extra Large',\n value: 'xl',\n css: {\n '--radius-xs': '0.75rem',\n '--radius-small': '1rem',\n '--radius-default': '1.5rem',\n '--radius-medium': '2rem',\n '--radius-large': '2.5rem',\n '--radius-xl': '3rem',\n },\n },\n} as const\n\nexport function getThemeConfig(theme: ThemeDefaults): ThemeConfig {\n return themeConfigs[theme]\n}\n\nexport function getBorderRadiusConfig(preset: keyof typeof borderRadiusPresets) {\n return borderRadiusPresets[preset]\n}\n"],"names":["themeConfigs","cool","name","label","borderRadius","cssFile","preview","colors","primary","background","accent","brutal","neon","solar","dealership","borderRadiusPresets","none","value","css","small","medium","large","xl","getThemeConfig","theme","getBorderRadiusConfig","preset"],"mappings":"AAEA,OAAO,MAAMA,eAAmD;IAC9DC,MAAM;QACJC,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACAC,QAAQ;QACNT,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACAE,MAAM;QACJV,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACAG,OAAO;QACLX,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACAI,YAAY;QACVZ,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACA,eAAe;QACbR,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACA,oBAAoB;QAClBR,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;IACA,uBAAuB;QACrBR,MAAM;QACNC,OAAO;QACPC,cAAc;QACdC,SAAS;QACTC,SAAS;YACPC,QAAQ;gBACNC,SAAS;gBACTC,YAAY;gBACZC,QAAQ;YACV;QACF;IACF;AACF,EAAC;AAED,OAAO,MAAMK,sBAAsB;IACjCC,MAAM;QACJb,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;IACAC,OAAO;QACLhB,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;IACAE,QAAQ;QACNjB,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;IACAG,OAAO;QACLlB,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;IACAI,IAAI;QACFnB,OAAO;QACPc,OAAO;QACPC,KAAK;YACH,eAAe;YACf,kBAAkB;YAClB,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;QACjB;IACF;AACF,EAAU;AAEV,OAAO,SAASK,eAAeC,KAAoB;IACjD,OAAOxB,YAAY,CAACwB,MAAM;AAC5B;AAEA,OAAO,SAASC,sBAAsBC,MAAwC;IAC5E,OAAOX,mBAAmB,CAACW,OAAO;AACpC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/Theme/types.ts"],"sourcesContent":["export type ThemeDefaults =\r\n | 'cool'\r\n | 'brutal'\r\n | 'neon'\r\n | 'solar'\r\n | 'dealership'\r\n | 'real-estate'\r\n | 'real-estate-gold'\r\n | 'real-estate-neutral';\r\n\r\nexport type Mode = 'dark' | 'light' | 'auto';\r\n\r\nexport type BorderRadiusPreset = 'none' | 'small' | 'medium' | 'large' | 'xl';\r\n\r\nexport type FontScalePreset = 'small' | 'medium' | 'large' | 'xl';\r\n\r\nexport type SpacingPreset = 'compact' | 'medium' | 'spacious';\r\n\r\nexport type AnimationLevelPreset = 'none' | 'reduced' | 'medium' | 'high';\r\n\r\nexport type ColorModePreset = 'auto' | 'light' | 'dark';\r\n\r\nexport interface ThemeConfig {\r\n name: string;\r\n label: string;\r\n borderRadius: BorderRadiusPreset;\r\n cssFile: string;\r\n preview?: {\r\n colors: {\r\n primary: string;\r\n background: string;\r\n accent: string;\r\n };\r\n };\r\n}\r\n\r\nexport interface ThemeContextType {\r\n // Theme management\r\n theme?: ThemeDefaults | null;\r\n setTheme?: (theme: ThemeDefaults) => void; // Add setTheme for enhanced functionality\r\n refreshTheme: () => void; // Refresh theme (now handled server-side)\r\n\r\n // Color mode\r\n mode?: Mode | null;\r\n setMode: (mode: Mode | null) => void;\r\n isColorModeToggleAllowed?: boolean; // Whether admin allows color mode changes\r\n\r\n // Design controls\r\n borderRadius?: BorderRadiusPreset;\r\n setBorderRadius?: (radius: BorderRadiusPreset) => void;\r\n fontScale?: FontScalePreset;\r\n setFontScale?: (scale: FontScalePreset) => void;\r\n spacing?: SpacingPreset;\r\n setSpacing?: (spacing: SpacingPreset) => void;\r\n animationLevel?: AnimationLevelPreset;\r\n setAnimationLevel?: (level: AnimationLevelPreset) => void;\r\n\r\n // Theme loading\r\n preloadTheme?: (theme: ThemeDefaults) => Promise<boolean>;\r\n isThemeLoaded?: (theme: ThemeDefaults) => boolean;\r\n\r\n // Enhanced configuration\r\n themeConfig?: any; // Enhanced theme configuration from plugin\r\n}\r\n\r\nexport interface ThemeOption {\r\n label: string;\r\n value: ThemeDefaults;\r\n config?: ThemeConfig;\r\n}\r\n\r\nexport function themeIsValid(string: null | string): string is ThemeDefaults {\r\n return string\r\n ? [\r\n 'cool',\r\n 'brutal',\r\n 'neon',\r\n 'solar',\r\n 'dealership',\r\n 'real-estate',\r\n 'real-estate-gold',\r\n 'real-estate-neutral',\r\n ].includes(string)\r\n : false;\r\n}\r\n\r\nexport function modeIsValid(string: null | string): string is Mode {\r\n return string ? ['dark', 'light'].includes(string) : false;\r\n}\r\n"],"names":["themeIsValid","string","includes","modeIsValid"],"mappings":"AAuEA,OAAO,SAASA,aAAaC,MAAqB;IAChD,OAAOA,SACH;QACE;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD,CAACC,QAAQ,CAACD,UACX;AACN;AAEA,OAAO,SAASE,YAAYF,MAAqB;IAC/C,OAAOA,SAAS;QAAC;QAAQ;KAAQ,CAACC,QAAQ,CAACD,UAAU;AACvD"}
1
+ {"version":3,"sources":["../../../src/providers/Theme/types.ts"],"sourcesContent":["export type ThemeDefaults =\n | 'cool'\n | 'brutal'\n | 'neon'\n | 'solar'\n | 'dealership'\n | 'real-estate'\n | 'real-estate-gold'\n | 'real-estate-neutral';\n\nexport type Mode = 'dark' | 'light' | 'auto';\n\nexport type BorderRadiusPreset = 'none' | 'small' | 'medium' | 'large' | 'xl';\n\nexport type FontScalePreset = 'small' | 'medium' | 'large' | 'xl';\n\nexport type SpacingPreset = 'compact' | 'medium' | 'spacious';\n\nexport type AnimationLevelPreset = 'none' | 'reduced' | 'medium' | 'high';\n\nexport type ColorModePreset = 'auto' | 'light' | 'dark';\n\nexport interface ThemeConfig {\n name: string;\n label: string;\n borderRadius: BorderRadiusPreset;\n cssFile: string;\n preview?: {\n colors: {\n primary: string;\n background: string;\n accent: string;\n };\n };\n}\n\nexport interface ThemeContextType {\n // Theme management\n theme?: ThemeDefaults | null;\n setTheme?: (theme: ThemeDefaults) => void; // Add setTheme for enhanced functionality\n refreshTheme: () => void; // Refresh theme (now handled server-side)\n\n // Color mode\n mode?: Mode | null;\n setMode: (mode: Mode | null) => void;\n isColorModeToggleAllowed?: boolean; // Whether admin allows color mode changes\n\n // Design controls\n borderRadius?: BorderRadiusPreset;\n setBorderRadius?: (radius: BorderRadiusPreset) => void;\n fontScale?: FontScalePreset;\n setFontScale?: (scale: FontScalePreset) => void;\n spacing?: SpacingPreset;\n setSpacing?: (spacing: SpacingPreset) => void;\n animationLevel?: AnimationLevelPreset;\n setAnimationLevel?: (level: AnimationLevelPreset) => void;\n\n // Theme loading\n preloadTheme?: (theme: ThemeDefaults) => Promise<boolean>;\n isThemeLoaded?: (theme: ThemeDefaults) => boolean;\n\n // Enhanced configuration\n themeConfig?: any; // Enhanced theme configuration from plugin\n}\n\nexport interface ThemeOption {\n label: string;\n value: ThemeDefaults;\n config?: ThemeConfig;\n}\n\nexport function themeIsValid(string: null | string): string is ThemeDefaults {\n return string\n ? [\n 'cool',\n 'brutal',\n 'neon',\n 'solar',\n 'dealership',\n 'real-estate',\n 'real-estate-gold',\n 'real-estate-neutral',\n ].includes(string)\n : false;\n}\n\nexport function modeIsValid(string: null | string): string is Mode {\n return string ? ['dark', 'light'].includes(string) : false;\n}\n"],"names":["themeIsValid","string","includes","modeIsValid"],"mappings":"AAuEA,OAAO,SAASA,aAAaC,MAAqB;IAChD,OAAOA,SACH;QACE;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD,CAACC,QAAQ,CAACD,UACX;AACN;AAEA,OAAO,SAASE,YAAYF,MAAqB;IAC/C,OAAOA,SAAS;QAAC;QAAQ;KAAQ,CAACC,QAAQ,CAACD,UAAU;AACvD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts"],"sourcesContent":["import 'server-only'\r\n\r\nexport { ServerThemeInjector } from './components/ServerThemeInjector.js'\r\n\r\nexport {\r\n createFallbackCriticalCSS,\r\n generateThemePreloadLinks,\r\n getThemeCriticalCSS,\r\n getThemeCSSPath,\r\n} from './utils/themeAssets.js'\r\n"],"names":["ServerThemeInjector","createFallbackCriticalCSS","generateThemePreloadLinks","getThemeCriticalCSS","getThemeCSSPath"],"mappings":"AAAA,OAAO,cAAa;AAEpB,SAASA,mBAAmB,QAAQ,sCAAqC;AAEzE,SACEC,yBAAyB,EACzBC,yBAAyB,EACzBC,mBAAmB,EACnBC,eAAe,QACV,yBAAwB"}
1
+ {"version":3,"sources":["../src/server.ts"],"sourcesContent":["import 'server-only'\n\nexport { ServerThemeInjector } from './components/ServerThemeInjector.js'\n\nexport {\n createFallbackCriticalCSS,\n generateThemePreloadLinks,\n getThemeCriticalCSS,\n getThemeCSSPath,\n} from './utils/themeAssets.js'\n"],"names":["ServerThemeInjector","createFallbackCriticalCSS","generateThemePreloadLinks","getThemeCriticalCSS","getThemeCSSPath"],"mappings":"AAAA,OAAO,cAAa;AAEpB,SAASA,mBAAmB,QAAQ,sCAAqC;AAEzE,SACEC,yBAAyB,EACzBC,yBAAyB,EACzBC,mBAAmB,EACnBC,eAAe,QACV,yBAAwB"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { ThemePreset } from './presets.js'\r\n\r\nexport interface ThemeManagementPluginOptions {\r\n\t/** Whether the plugin should register itself */\r\n\tenabled?: boolean\r\n\t/** Collection slug that stores site-level settings (default: `site-settings`) */\r\n\ttargetCollection?: string\r\n\t/** Theme presets available to editors */\r\n\tthemePresets?: ThemePreset[]\r\n\t/** Default preset name when no value is stored */\r\n\tdefaultTheme?: string\r\n\t/** Allow editors to toggle between light / dark / auto modes */\r\n\tincludeColorModeToggle?: boolean\r\n\t/** Expose custom CSS editor */\r\n\tincludeCustomCSS?: boolean\r\n\t/** Reserved for future use, keeps API parity */\r\n\tincludeBrandIdentity?: boolean\r\n\t/** Enable advanced controls such as animation level */\r\n\tenableAdvancedFeatures?: boolean\r\n\t/** Log helpful messages during config mutation */\r\n\tenableLogging?: boolean\r\n}\r\n\r\nexport interface FetchThemeConfigurationOptions {\r\n\t/** Optional tenant identifier if your project is multi-tenant */\r\n\ttenantSlug?: string\r\n\t/** Collection slug override (default: `site-settings`) */\r\n\tcollectionSlug?: string\r\n\t/** Depth parameter passed to Payload REST API */\r\n\tdepth?: number\r\n\t/** Locale parameter passed to Payload REST API */\r\n\tlocale?: string\r\n\t/** Include draft documents */\r\n\tdraft?: boolean\r\n\t/** Extra query parameters to append to the request */\r\n\tqueryParams?: Record<string, string | number | boolean>\r\n}\r\n\r\n"],"names":[],"mappings":"AAuBA,WAaC"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { ThemePreset } from './presets.js'\n\nexport interface ThemeManagementPluginOptions {\n\t/** Whether the plugin should register itself */\n\tenabled?: boolean\n\t/** Collection slug that stores site-level settings (default: `site-settings`) */\n\ttargetCollection?: string\n\t/** Theme presets available to editors */\n\tthemePresets?: ThemePreset[]\n\t/** Default preset name when no value is stored */\n\tdefaultTheme?: string\n\t/** Allow editors to toggle between light / dark / auto modes */\n\tincludeColorModeToggle?: boolean\n\t/** Expose custom CSS editor */\n\tincludeCustomCSS?: boolean\n\t/** Reserved for future use, keeps API parity */\n\tincludeBrandIdentity?: boolean\n\t/** Enable advanced controls such as animation level */\n\tenableAdvancedFeatures?: boolean\n\t/** Log helpful messages during config mutation */\n\tenableLogging?: boolean\n}\n\nexport interface FetchThemeConfigurationOptions {\n\t/** Optional tenant identifier if your project is multi-tenant */\n\ttenantSlug?: string\n\t/** Collection slug override (default: `site-settings`) */\n\tcollectionSlug?: string\n\t/** Depth parameter passed to Payload REST API */\n\tdepth?: number\n\t/** Locale parameter passed to Payload REST API */\n\tlocale?: string\n\t/** Include draft documents */\n\tdraft?: boolean\n\t/** Extra query parameters to append to the request */\n\tqueryParams?: Record<string, string | number | boolean>\n}\n\n"],"names":[],"mappings":"AAuBA,WAaC"}
@@ -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'\nimport type { SiteSetting } from '../payload-types.js'\nimport type { Mode, ThemeDefaults } from '../providers/Theme/types.js'\nimport { themeIsValid } from '../providers/Theme/types.js'\nimport type { ThemeTypographyPreset } from '../presets.js'\nimport { defaultThemePresets } from '../presets.js'\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\ntype SiteThemeConfiguration = SiteSetting['themeConfiguration'] & {\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<SiteThemeConfiguration['lightMode']>\n\nconst DEFAULT_THEME_NAME: ThemeDefaults = 'cool'\nconst DEFAULT_THEME_PRESET = defaultThemePresets.find(\n (preset) => preset.name === DEFAULT_THEME_NAME,\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}\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?: SiteThemeConfiguration | 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 = defaultThemePresets.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?: SiteThemeConfiguration['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","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 +1 @@
1
- {"version":3,"sources":["../../src/utils/themeAssets.ts"],"sourcesContent":["import { readFile } from 'fs/promises'\r\nimport { join } from 'path'\r\nimport type { ThemeDefaults } from '../providers/Theme/types.js'\r\n\r\nconst themeCriticalFiles: Record<string, string> = {\r\n cool: 'cool-critical.css',\r\n brutal: 'brutal-critical.css',\r\n neon: 'neon-critical.css',\r\n solar: 'solar-critical.css',\r\n dealership: 'dealership-critical.css',\r\n 'real-estate': 'real-estate-critical.css',\r\n 'real-estate-gold': 'real-estate-gold-critical.css',\r\n 'real-estate-neutral': 'real-estate-neutral-critical.css',\r\n}\r\n\r\nconst themeFullFiles: Record<string, string> = {\r\n cool: 'cool.css',\r\n brutal: 'brutal.css',\r\n neon: 'neon.css',\r\n solar: 'solar.css',\r\n dealership: 'dealership.css',\r\n 'real-estate': 'real-estate.css',\r\n 'real-estate-gold': 'real-estate-gold.css',\r\n 'real-estate-neutral': 'real-estate-neutral.css',\r\n}\r\n\r\nexport async function getThemeCriticalCSS(theme: ThemeDefaults): Promise<string | null> {\r\n try {\r\n const filename = themeCriticalFiles[theme]\r\n if (!filename) {\r\n console.warn(`Critical CSS file not found for theme: ${theme}`)\r\n return null\r\n }\r\n\r\n const filePath = join(process.cwd(), 'public', 'themes', filename)\r\n const css = await readFile(filePath, 'utf-8')\r\n\r\n return css.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\r\n } catch (error) {\r\n console.error(`Error reading critical CSS for theme ${theme}:`, error)\r\n return null\r\n }\r\n}\r\n\r\nexport function getThemeCSSPath(theme: ThemeDefaults): string {\r\n const filename = themeFullFiles[theme]\r\n return `/themes/${filename}`\r\n}\r\n\r\nexport function generateThemePreloadLinks(theme: ThemeDefaults): string {\r\n const cssPath = getThemeCSSPath(theme)\r\n return `<link rel=\"preload\" href=\"${cssPath}\" as=\"style\" onload=\"this.onload=null;this.rel='stylesheet'\">`\r\n}\r\n\r\nexport function createFallbackCriticalCSS(theme: ThemeDefaults): string {\r\n return `\r\n/* Fallback critical CSS for ${theme} theme */\r\n[data-theme=\"${theme}\"] {\r\n --background: hsl(0 0% 100%);\r\n --foreground: hsl(222 47% 11%);\r\n --primary: hsl(221 83% 53%);\r\n --primary-foreground: hsl(210 40% 98%);\r\n color-scheme: light;\r\n}\r\n\r\n[data-theme=\"${theme}\"][data-theme-mode=\"dark\"] {\r\n --background: hsl(222 47% 11%);\r\n --foreground: hsl(210 40% 98%);\r\n --primary: hsl(217 91% 60%);\r\n --primary-foreground: hsl(222 47% 11%);\r\n color-scheme: dark;\r\n}\r\n`.trim()\r\n}\r\n"],"names":["readFile","join","themeCriticalFiles","cool","brutal","neon","solar","dealership","themeFullFiles","getThemeCriticalCSS","theme","filename","console","warn","filePath","process","cwd","css","replace","error","getThemeCSSPath","generateThemePreloadLinks","cssPath","createFallbackCriticalCSS","trim"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAa;AACtC,SAASC,IAAI,QAAQ,OAAM;AAG3B,MAAMC,qBAA6C;IACjDC,MAAM;IACNC,QAAQ;IACRC,MAAM;IACNC,OAAO;IACPC,YAAY;IACZ,eAAe;IACf,oBAAoB;IACpB,uBAAuB;AACzB;AAEA,MAAMC,iBAAyC;IAC7CL,MAAM;IACNC,QAAQ;IACRC,MAAM;IACNC,OAAO;IACPC,YAAY;IACZ,eAAe;IACf,oBAAoB;IACpB,uBAAuB;AACzB;AAEA,OAAO,eAAeE,oBAAoBC,KAAoB;IAC5D,IAAI;QACF,MAAMC,WAAWT,kBAAkB,CAACQ,MAAM;QAC1C,IAAI,CAACC,UAAU;YACbC,QAAQC,IAAI,CAAC,CAAC,uCAAuC,EAAEH,OAAO;YAC9D,OAAO;QACT;QAEA,MAAMI,WAAWb,KAAKc,QAAQC,GAAG,IAAI,UAAU,UAAUL;QACzD,MAAMM,MAAM,MAAMjB,SAASc,UAAU;QAErC,OAAOG,IAAIC,OAAO,CAAC,SAAS,MAAMA,OAAO,CAAC,OAAO;IACnD,EAAE,OAAOC,OAAO;QACdP,QAAQO,KAAK,CAAC,CAAC,qCAAqC,EAAET,MAAM,CAAC,CAAC,EAAES;QAChE,OAAO;IACT;AACF;AAEA,OAAO,SAASC,gBAAgBV,KAAoB;IAClD,MAAMC,WAAWH,cAAc,CAACE,MAAM;IACtC,OAAO,CAAC,QAAQ,EAAEC,UAAU;AAC9B;AAEA,OAAO,SAASU,0BAA0BX,KAAoB;IAC5D,MAAMY,UAAUF,gBAAgBV;IAChC,OAAO,CAAC,0BAA0B,EAAEY,QAAQ,6DAA6D,CAAC;AAC5G;AAEA,OAAO,SAASC,0BAA0Bb,KAAoB;IAC5D,OAAO,CAAC;6BACmB,EAAEA,MAAM;aACxB,EAAEA,MAAM;;;;;;;;aAQR,EAAEA,MAAM;;;;;;;AAOrB,CAAC,CAACc,IAAI;AACN"}
1
+ {"version":3,"sources":["../../src/utils/themeAssets.ts"],"sourcesContent":["import { readFile } from 'fs/promises'\nimport { join } from 'path'\nimport type { ThemeDefaults } from '../providers/Theme/types.js'\n\nconst themeCriticalFiles: Record<string, string> = {\n cool: 'cool-critical.css',\n brutal: 'brutal-critical.css',\n neon: 'neon-critical.css',\n solar: 'solar-critical.css',\n dealership: 'dealership-critical.css',\n 'real-estate': 'real-estate-critical.css',\n 'real-estate-gold': 'real-estate-gold-critical.css',\n 'real-estate-neutral': 'real-estate-neutral-critical.css',\n}\n\nconst themeFullFiles: Record<string, string> = {\n cool: 'cool.css',\n brutal: 'brutal.css',\n neon: 'neon.css',\n solar: 'solar.css',\n dealership: 'dealership.css',\n 'real-estate': 'real-estate.css',\n 'real-estate-gold': 'real-estate-gold.css',\n 'real-estate-neutral': 'real-estate-neutral.css',\n}\n\nexport async function getThemeCriticalCSS(theme: ThemeDefaults): Promise<string | null> {\n try {\n const filename = themeCriticalFiles[theme]\n if (!filename) {\n console.warn(`Critical CSS file not found for theme: ${theme}`)\n return null\n }\n\n const filePath = join(process.cwd(), 'public', 'themes', filename)\n const css = await readFile(filePath, 'utf-8')\n\n return css.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n } catch (error) {\n console.error(`Error reading critical CSS for theme ${theme}:`, error)\n return null\n }\n}\n\nexport function getThemeCSSPath(theme: ThemeDefaults): string {\n const filename = themeFullFiles[theme]\n return `/themes/${filename}`\n}\n\nexport function generateThemePreloadLinks(theme: ThemeDefaults): string {\n const cssPath = getThemeCSSPath(theme)\n return `<link rel=\"preload\" href=\"${cssPath}\" as=\"style\" onload=\"this.onload=null;this.rel='stylesheet'\">`\n}\n\nexport function createFallbackCriticalCSS(theme: ThemeDefaults): string {\n return `\n/* Fallback critical CSS for ${theme} theme */\n[data-theme=\"${theme}\"] {\n --background: hsl(0 0% 100%);\n --foreground: hsl(222 47% 11%);\n --primary: hsl(221 83% 53%);\n --primary-foreground: hsl(210 40% 98%);\n color-scheme: light;\n}\n\n[data-theme=\"${theme}\"][data-theme-mode=\"dark\"] {\n --background: hsl(222 47% 11%);\n --foreground: hsl(210 40% 98%);\n --primary: hsl(217 91% 60%);\n --primary-foreground: hsl(222 47% 11%);\n color-scheme: dark;\n}\n`.trim()\n}\n"],"names":["readFile","join","themeCriticalFiles","cool","brutal","neon","solar","dealership","themeFullFiles","getThemeCriticalCSS","theme","filename","console","warn","filePath","process","cwd","css","replace","error","getThemeCSSPath","generateThemePreloadLinks","cssPath","createFallbackCriticalCSS","trim"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAa;AACtC,SAASC,IAAI,QAAQ,OAAM;AAG3B,MAAMC,qBAA6C;IACjDC,MAAM;IACNC,QAAQ;IACRC,MAAM;IACNC,OAAO;IACPC,YAAY;IACZ,eAAe;IACf,oBAAoB;IACpB,uBAAuB;AACzB;AAEA,MAAMC,iBAAyC;IAC7CL,MAAM;IACNC,QAAQ;IACRC,MAAM;IACNC,OAAO;IACPC,YAAY;IACZ,eAAe;IACf,oBAAoB;IACpB,uBAAuB;AACzB;AAEA,OAAO,eAAeE,oBAAoBC,KAAoB;IAC5D,IAAI;QACF,MAAMC,WAAWT,kBAAkB,CAACQ,MAAM;QAC1C,IAAI,CAACC,UAAU;YACbC,QAAQC,IAAI,CAAC,CAAC,uCAAuC,EAAEH,OAAO;YAC9D,OAAO;QACT;QAEA,MAAMI,WAAWb,KAAKc,QAAQC,GAAG,IAAI,UAAU,UAAUL;QACzD,MAAMM,MAAM,MAAMjB,SAASc,UAAU;QAErC,OAAOG,IAAIC,OAAO,CAAC,SAAS,MAAMA,OAAO,CAAC,OAAO;IACnD,EAAE,OAAOC,OAAO;QACdP,QAAQO,KAAK,CAAC,CAAC,qCAAqC,EAAET,MAAM,CAAC,CAAC,EAAES;QAChE,OAAO;IACT;AACF;AAEA,OAAO,SAASC,gBAAgBV,KAAoB;IAClD,MAAMC,WAAWH,cAAc,CAACE,MAAM;IACtC,OAAO,CAAC,QAAQ,EAAEC,UAAU;AAC9B;AAEA,OAAO,SAASU,0BAA0BX,KAAoB;IAC5D,MAAMY,UAAUF,gBAAgBV;IAChC,OAAO,CAAC,0BAA0B,EAAEY,QAAQ,6DAA6D,CAAC;AAC5G;AAEA,OAAO,SAASC,0BAA0Bb,KAAoB;IAC5D,OAAO,CAAC;6BACmB,EAAEA,MAAM;aACxB,EAAEA,MAAM;;;;;;;;aAQR,EAAEA,MAAM;;;;;;;AAOrB,CAAC,CAACc,IAAI;AACN"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/themeColors.ts"],"sourcesContent":["interface ColorMode {\r\n background?: string | null\r\n foreground?: string | null\r\n card?: string | null\r\n cardForeground?: string | null\r\n popover?: string | null\r\n popoverForeground?: string | null\r\n primary?: string | null\r\n primaryForeground?: string | null\r\n secondary?: string | null\r\n secondaryForeground?: string | null\r\n muted?: string | null\r\n mutedForeground?: string | null\r\n accent?: string | null\r\n accentForeground?: string | null\r\n destructive?: string | null\r\n destructiveForeground?: string | null\r\n border?: string | null\r\n input?: string | null\r\n ring?: string | null\r\n}\r\n\r\nexport interface ThemeColors {\r\n lightMode?: ColorMode\r\n darkMode?: ColorMode\r\n}\r\n\r\ninterface GenerateThemeColorsOptions extends ThemeColors {\r\n themeName?: string\r\n}\r\n\r\nconst COLOR_VARIABLE_MAP: Array<{ key: keyof ColorMode; variable: string }> = [\r\n { key: 'background', variable: '--background' },\r\n { key: 'foreground', variable: '--foreground' },\r\n { key: 'card', variable: '--card' },\r\n { key: 'cardForeground', variable: '--card-foreground' },\r\n { key: 'popover', variable: '--popover' },\r\n { key: 'popoverForeground', variable: '--popover-foreground' },\r\n { key: 'primary', variable: '--primary' },\r\n { key: 'primaryForeground', variable: '--primary-foreground' },\r\n { key: 'secondary', variable: '--secondary' },\r\n { key: 'secondaryForeground', variable: '--secondary-foreground' },\r\n { key: 'muted', variable: '--muted' },\r\n { key: 'mutedForeground', variable: '--muted-foreground' },\r\n { key: 'accent', variable: '--accent' },\r\n { key: 'accentForeground', variable: '--accent-foreground' },\r\n { key: 'destructive', variable: '--destructive' },\r\n { key: 'destructiveForeground', variable: '--destructive-foreground' },\r\n { key: 'border', variable: '--border' },\r\n { key: 'input', variable: '--input' },\r\n { key: 'ring', variable: '--ring' },\r\n]\r\n\r\nexport function hexToHsl(hex: string): string {\r\n if (!hex) return '0 0% 0%'\r\n\r\n hex = hex.replace('#', '')\r\n\r\n if (hex.length === 3) {\r\n hex = hex\r\n .split('')\r\n .map((char) => char + char)\r\n .join('')\r\n }\r\n\r\n const r = Number.parseInt(hex.substring(0, 2), 16) / 255\r\n const g = Number.parseInt(hex.substring(2, 4), 16) / 255\r\n const b = Number.parseInt(hex.substring(4, 6), 16) / 255\r\n\r\n const max = Math.max(r, g, b)\r\n const min = Math.min(r, g, b)\r\n let h = 0\r\n let s = 0\r\n const l = (max + min) / 2\r\n\r\n if (max !== min) {\r\n const d = max - min\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\r\n\r\n switch (max) {\r\n case r:\r\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6\r\n break\r\n case g:\r\n h = ((b - r) / d + 2) / 6\r\n break\r\n case b:\r\n h = ((r - g) / d + 4) / 6\r\n break\r\n }\r\n }\r\n\r\n h = Math.round(h * 360)\r\n s = Math.round(s * 100)\r\n const lRounded = Math.round(l * 100)\r\n\r\n return `${h} ${s}% ${lRounded}%`\r\n}\r\n\r\nexport function generateColorModeCss(\r\n colors: ColorMode,\r\n options: { themeName?: string; isDark?: boolean } = {},\r\n): string {\r\n if (!colors) return ''\r\n\r\n const { themeName, isDark = false } = options\r\n\r\n const cssVariables = COLOR_VARIABLE_MAP.reduce<string[]>((acc, { key, variable }) => {\r\n const value = normalizeColor(colors[key])\r\n if (!value) return acc\r\n acc.push(`${variable}: hsl(${hexToHsl(value)});`)\r\n return acc\r\n }, [])\r\n\r\n if (cssVariables.length === 0) return ''\r\n\r\n const selector = buildSelector(themeName, isDark)\r\n return `${selector} {\r\n ${cssVariables.join('\\n ')}\r\n}`\r\n}\r\n\r\nexport function generateThemeColorsCss(options: GenerateThemeColorsOptions): string {\r\n const cssBlocks: string[] = []\r\n const { themeName, lightMode, darkMode } = options\r\n\r\n if (lightMode) {\r\n const lightModeCss = generateColorModeCss(lightMode, { themeName, isDark: false })\r\n if (lightModeCss) cssBlocks.push(lightModeCss)\r\n }\r\n\r\n if (darkMode) {\r\n const darkModeCss = generateColorModeCss(darkMode, { themeName, isDark: true })\r\n if (darkModeCss) cssBlocks.push(darkModeCss)\r\n }\r\n\r\n return cssBlocks.join('\\n\\n')\r\n}\r\n\r\nfunction buildSelector(themeName: string | undefined, isDark: boolean): string {\r\n if (themeName) {\r\n if (isDark) {\r\n return `:root[data-theme='${themeName}'][data-theme-mode='dark'], .dark[data-theme='${themeName}']`\r\n }\r\n return `:root[data-theme='${themeName}']`\r\n }\r\n\r\n if (isDark) {\r\n return \":root[data-theme-mode='dark'], .dark\"\r\n }\r\n\r\n return ':root'\r\n}\r\n\r\nfunction normalizeColor(value: string | null | undefined): string | null {\r\n if (typeof value !== 'string') return null\r\n const trimmed = value.trim()\r\n return trimmed.length === 0 ? null : trimmed\r\n}\r\n"],"names":["COLOR_VARIABLE_MAP","key","variable","hexToHsl","hex","replace","length","split","map","char","join","r","Number","parseInt","substring","g","b","max","Math","min","h","s","l","d","round","lRounded","generateColorModeCss","colors","options","themeName","isDark","cssVariables","reduce","acc","value","normalizeColor","push","selector","buildSelector","generateThemeColorsCss","cssBlocks","lightMode","darkMode","lightModeCss","darkModeCss","trimmed","trim"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/themeColors.ts"],"sourcesContent":["interface ColorMode {\n background?: string | null\n foreground?: string | null\n card?: string | null\n cardForeground?: string | null\n popover?: string | null\n popoverForeground?: string | null\n primary?: string | null\n primaryForeground?: string | null\n secondary?: string | null\n secondaryForeground?: string | null\n muted?: string | null\n mutedForeground?: string | null\n accent?: string | null\n accentForeground?: string | null\n destructive?: string | null\n destructiveForeground?: string | null\n border?: string | null\n input?: string | null\n ring?: string | null\n}\n\nexport interface ThemeColors {\n lightMode?: ColorMode\n darkMode?: ColorMode\n}\n\ninterface GenerateThemeColorsOptions extends ThemeColors {\n themeName?: string\n}\n\nconst COLOR_VARIABLE_MAP: Array<{ key: keyof ColorMode; variable: string }> = [\n { key: 'background', variable: '--background' },\n { key: 'foreground', variable: '--foreground' },\n { key: 'card', variable: '--card' },\n { key: 'cardForeground', variable: '--card-foreground' },\n { key: 'popover', variable: '--popover' },\n { key: 'popoverForeground', variable: '--popover-foreground' },\n { key: 'primary', variable: '--primary' },\n { key: 'primaryForeground', variable: '--primary-foreground' },\n { key: 'secondary', variable: '--secondary' },\n { key: 'secondaryForeground', variable: '--secondary-foreground' },\n { key: 'muted', variable: '--muted' },\n { key: 'mutedForeground', variable: '--muted-foreground' },\n { key: 'accent', variable: '--accent' },\n { key: 'accentForeground', variable: '--accent-foreground' },\n { key: 'destructive', variable: '--destructive' },\n { key: 'destructiveForeground', variable: '--destructive-foreground' },\n { key: 'border', variable: '--border' },\n { key: 'input', variable: '--input' },\n { key: 'ring', variable: '--ring' },\n]\n\nexport function hexToHsl(hex: string): string {\n if (!hex) return '0 0% 0%'\n\n hex = hex.replace('#', '')\n\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((char) => char + char)\n .join('')\n }\n\n const r = Number.parseInt(hex.substring(0, 2), 16) / 255\n const g = Number.parseInt(hex.substring(2, 4), 16) / 255\n const b = Number.parseInt(hex.substring(4, 6), 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 h = Math.round(h * 360)\n s = Math.round(s * 100)\n const lRounded = Math.round(l * 100)\n\n return `${h} ${s}% ${lRounded}%`\n}\n\nexport function generateColorModeCss(\n colors: ColorMode,\n options: { themeName?: string; isDark?: boolean } = {},\n): string {\n if (!colors) return ''\n\n const { themeName, isDark = false } = options\n\n const cssVariables = COLOR_VARIABLE_MAP.reduce<string[]>((acc, { key, variable }) => {\n const value = normalizeColor(colors[key])\n if (!value) return acc\n acc.push(`${variable}: hsl(${hexToHsl(value)});`)\n return acc\n }, [])\n\n if (cssVariables.length === 0) return ''\n\n const selector = buildSelector(themeName, isDark)\n return `${selector} {\n ${cssVariables.join('\\n ')}\n}`\n}\n\nexport function generateThemeColorsCss(options: GenerateThemeColorsOptions): string {\n const cssBlocks: string[] = []\n const { themeName, lightMode, darkMode } = options\n\n if (lightMode) {\n const lightModeCss = generateColorModeCss(lightMode, { themeName, isDark: false })\n if (lightModeCss) cssBlocks.push(lightModeCss)\n }\n\n if (darkMode) {\n const darkModeCss = generateColorModeCss(darkMode, { themeName, isDark: true })\n if (darkModeCss) cssBlocks.push(darkModeCss)\n }\n\n return cssBlocks.join('\\n\\n')\n}\n\nfunction buildSelector(themeName: string | undefined, isDark: boolean): string {\n if (themeName) {\n if (isDark) {\n return `:root[data-theme='${themeName}'][data-theme-mode='dark'], .dark[data-theme='${themeName}']`\n }\n return `:root[data-theme='${themeName}']`\n }\n\n if (isDark) {\n return \":root[data-theme-mode='dark'], .dark\"\n }\n\n return ':root'\n}\n\nfunction normalizeColor(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length === 0 ? null : trimmed\n}\n"],"names":["COLOR_VARIABLE_MAP","key","variable","hexToHsl","hex","replace","length","split","map","char","join","r","Number","parseInt","substring","g","b","max","Math","min","h","s","l","d","round","lRounded","generateColorModeCss","colors","options","themeName","isDark","cssVariables","reduce","acc","value","normalizeColor","push","selector","buildSelector","generateThemeColorsCss","cssBlocks","lightMode","darkMode","lightModeCss","darkModeCss","trimmed","trim"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { borderRadiusPresets } from '../providers/Theme/themeConfig.js';
2
- /**
3
- * Generates CSS custom properties from theme configuration
2
+ /**
3
+ * Generates CSS custom properties from theme configuration
4
4
  */ export function generateThemeCSS(config) {
5
5
  const cssRules = [];
6
6
  const customization = config.customization;
@@ -22,8 +22,8 @@ import { borderRadiusPresets } from '../providers/Theme/themeConfig.js';
22
22
  appendCustomCSS(cssRules, customization);
23
23
  return cssRules.join('\n');
24
24
  }
25
- /**
26
- * Determines if a color is light or dark
25
+ /**
26
+ * Determines if a color is light or dark
27
27
  */ function isLightBackground(color) {
28
28
  // Simple heuristic: if it contains 'white', '#fff', or high RGB values, it's light
29
29
  const lightPatterns = [
@@ -34,8 +34,8 @@ import { borderRadiusPresets } from '../providers/Theme/themeConfig.js';
34
34
  ];
35
35
  return lightPatterns.some((pattern)=>pattern.test(color));
36
36
  }
37
- /**
38
- * Generate theme styles for use in components
37
+ /**
38
+ * Generate theme styles for use in components
39
39
  */ export function getThemeStyles(config) {
40
40
  const styles = {};
41
41
  const customization = config.customization;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/themeUtils.ts"],"sourcesContent":["import type { SiteSetting } from '../payload-types.js'\r\nimport { borderRadiusPresets } from '../providers/Theme/themeConfig.js'\r\nimport type { ThemeTypographyPreset } from '../presets.js'\r\n\r\ntype ThemeTypographyConfiguration = {\r\n typography?: ThemeTypographyPreset | null\r\n}\r\n\r\ntype ThemeConfiguration = Omit<NonNullable<SiteSetting['themeConfiguration']>, 'typography'> &\r\n ThemeTypographyConfiguration\r\n\r\ninterface ThemeCustomization {\r\n primaryColor?: string | null\r\n accentColor?: string | null\r\n backgroundColor?: string | null\r\n textColor?: string | null\r\n customCSS?: string | null\r\n}\r\n\r\ntype ThemeConfigurationWithCustomization = ThemeConfiguration & {\r\n customization?: ThemeCustomization | null\r\n}\r\n/**\r\n * Generates CSS custom properties from theme configuration\r\n */\r\nexport function generateThemeCSS(config: ThemeConfiguration): string {\r\n const cssRules: string[] = []\r\n const customization = (config as ThemeConfigurationWithCustomization).customization\r\n const themeSelector = config.theme ? `:root[data-theme='${config.theme}']` : ':root'\r\n\r\n // Start root CSS rules\r\n cssRules.push(`${themeSelector} {`)\r\n applyCustomizationRootRules(cssRules, customization)\r\n applyBorderRadiusRule(cssRules, config)\r\n applyFontScaleRules(cssRules, config)\r\n applySpacingRule(cssRules, config)\r\n applyAnimationRule(cssRules, config)\r\n applyTypographyRules(cssRules, config)\r\n\r\n cssRules.push('}')\r\n\r\n // Color mode specific overrides\r\n applyDarkModeOverrides(cssRules, config, customization, themeSelector)\r\n\r\n // Animation level: none - respect prefers-reduced-motion\r\n applyReducedMotionOverride(cssRules, config)\r\n\r\n // Custom CSS\r\n appendCustomCSS(cssRules, customization)\r\n\r\n return cssRules.join('\\n')\r\n}\r\n\r\n/**\r\n * Determines if a color is light or dark\r\n */\r\nfunction isLightBackground(color: string): boolean {\r\n // Simple heuristic: if it contains 'white', '#fff', or high RGB values, it's light\r\n const lightPatterns = [\r\n /white/i,\r\n /#f{3,6}/i,\r\n /rgb\\s*\\(\\s*([2-9]\\d{2}|1[5-9]\\d|1\\d{2}),/,\r\n /hsl\\s*\\([^)]*,\\s*[^,)]*,\\s*([7-9]\\d|100)%\\)/,\r\n ]\r\n\r\n return lightPatterns.some((pattern) => pattern.test(color))\r\n}\r\n\r\n/**\r\n * Generate theme styles for use in components\r\n */\r\nexport function getThemeStyles(config: ThemeConfiguration) {\r\n const styles: Record<string, string> = {}\r\n const customization = (config as ThemeConfigurationWithCustomization).customization\r\n\r\n applyCustomizationStyleOverrides(styles, customization)\r\n applyTypographyStyleOverrides(styles, config.typography)\r\n\r\n return styles\r\n}\r\n\r\nfunction applyCustomizationRootRules(\r\n rules: string[],\r\n customization: ThemeCustomization | null | undefined,\r\n): void {\r\n if (!customization) return\r\n\r\n if (customization.primaryColor) {\r\n rules.push(` --primary-custom: ${customization.primaryColor};`)\r\n }\r\n\r\n if (customization.accentColor) {\r\n rules.push(` --accent-custom: ${customization.accentColor};`)\r\n }\r\n\r\n if (customization.backgroundColor) {\r\n rules.push(` --background: ${customization.backgroundColor};`)\r\n rules.push(` --card: ${customization.backgroundColor};`)\r\n rules.push(` --popover: ${customization.backgroundColor};`)\r\n }\r\n\r\n if (customization.textColor) {\r\n rules.push(` --foreground: ${customization.textColor};`)\r\n }\r\n}\r\n\r\nfunction applyBorderRadiusRule(rules: string[], config: ThemeConfiguration): void {\r\n if (!config.borderRadius) return\r\n\r\n const preset = borderRadiusPresets[config.borderRadius]\r\n if (!preset) return\r\n\r\n const cssEntries = Object.entries(preset.css)\r\n cssEntries.forEach(([property, value]) => {\r\n rules.push(` ${property}: ${value};`)\r\n })\r\n\r\n const defaultRadius =\r\n preset.css['--radius-default'] ?? preset.css['--radius-medium'] ?? preset.css['--radius-large']\r\n if (defaultRadius) {\r\n rules.push(` --radius: ${defaultRadius};`)\r\n }\r\n}\r\n\r\nfunction applyFontScaleRules(rules: string[], config: ThemeConfiguration): void {\r\n if (!config.fontScale) return\r\n\r\n const scaleValues: Record<string, string> = {\r\n small: '0.9',\r\n medium: '1',\r\n large: '1.1',\r\n xl: '1.25',\r\n }\r\n\r\n const scale = scaleValues[config.fontScale] ?? '1'\r\n rules.push(` --font-scale: ${scale};`)\r\n rules.push(` --theme-font-scale: ${scale};`)\r\n\r\n const baseSizes: Record<string, string> = {\r\n 'text-xs': '0.75rem',\r\n 'text-sm': '0.875rem',\r\n 'text-base': '1rem',\r\n 'text-lg': '1.125rem',\r\n 'text-xl': '1.25rem',\r\n 'text-2xl': '1.5rem',\r\n 'text-3xl': '1.875rem',\r\n 'text-4xl': '2.25rem',\r\n }\r\n\r\n Object.entries(baseSizes).forEach(([className, baseSize]) => {\r\n const scaledSize = parseFloat(baseSize) * parseFloat(scale)\r\n rules.push(` --${className}: ${scaledSize}rem;`)\r\n })\r\n}\r\n\r\nfunction applySpacingRule(rules: string[], config: ThemeConfiguration): void {\r\n if (!config.spacing) return\r\n\r\n const spacingMultipliers: Record<string, string> = {\r\n compact: '0.75',\r\n medium: '1',\r\n spacious: '1.5',\r\n }\r\n\r\n const multiplier = spacingMultipliers[config.spacing] ?? '1'\r\n rules.push(` --spacing-scale: ${multiplier};`)\r\n rules.push(` --theme-spacing: ${multiplier};`)\r\n}\r\n\r\nfunction applyAnimationRule(rules: string[], config: ThemeConfiguration): void {\r\n if (!config.animationLevel) return\r\n\r\n const animationSettings: Record<string, { duration: string; easing: string; scale: string }> = {\r\n none: {\r\n duration: '0s',\r\n easing: 'linear',\r\n scale: '0',\r\n },\r\n reduced: {\r\n duration: '0.1s',\r\n easing: 'ease-out',\r\n scale: '0.5',\r\n },\r\n medium: {\r\n duration: '0.2s',\r\n easing: 'ease-out',\r\n scale: '1',\r\n },\r\n full: {\r\n duration: '0.3s',\r\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\r\n scale: '1.2',\r\n },\r\n }\r\n\r\n const level = config.animationLevel as keyof typeof animationSettings\r\n const settings = animationSettings[level] ?? animationSettings.medium\r\n if (!settings) return\r\n rules.push(` --animation-duration: ${settings.duration};`)\r\n rules.push(` --animation-easing: ${settings.easing};`)\r\n rules.push(` --animation-scale: ${settings.scale};`)\r\n rules.push(` --theme-animation-level: ${config.animationLevel};`)\r\n}\r\n\r\nfunction applyTypographyRules(rules: string[], config: ThemeConfiguration): void {\r\n const typography = config.typography\r\n if (!typography) return\r\n\r\n if (typography.fontFamily) {\r\n rules.push(` --typography-fontFamily: ${typography.fontFamily};`)\r\n }\r\n\r\n if (typography.headingFamily) {\r\n rules.push(` --typography-headingFamily: ${typography.headingFamily};`)\r\n }\r\n\r\n if (typography.baseFontSize) {\r\n rules.push(` --typography-baseFontSize: ${typography.baseFontSize};`)\r\n }\r\n\r\n if (typography.lineHeight) {\r\n rules.push(` --typography-lineHeight: ${typography.lineHeight};`)\r\n }\r\n\r\n if (typography.fontWeights) {\r\n Object.entries(typography.fontWeights).forEach(([token, weight]) => {\r\n if (weight) {\r\n rules.push(` --typography-fontWeights-${token}: ${weight};`)\r\n }\r\n })\r\n }\r\n\r\n if (typography.letterSpacing) {\r\n Object.entries(typography.letterSpacing).forEach(([token, value]) => {\r\n if (value) {\r\n rules.push(` --typography-letterSpacing-${token}: ${value};`)\r\n }\r\n })\r\n }\r\n}\r\n\r\nfunction applyDarkModeOverrides(\r\n rules: string[],\r\n config: ThemeConfiguration,\r\n customization: ThemeCustomization | null | undefined,\r\n selector: string,\r\n): void {\r\n if (config.colorMode !== 'dark' && config.colorMode !== 'auto') return\r\n\r\n rules.push('')\r\n rules.push('@media (prefers-color-scheme: dark) {')\r\n rules.push(` ${selector} {`)\r\n\r\n if (customization?.backgroundColor && isLightBackground(customization.backgroundColor)) {\r\n rules.push(` --background: hsl(224 71% 4%);`)\r\n rules.push(` --card: hsl(224 71% 4%);`)\r\n rules.push(` --popover: hsl(224 71% 4%);`)\r\n }\r\n\r\n if (customization?.textColor && !isLightBackground(customization.textColor)) {\r\n rules.push(` --foreground: hsl(213 31% 91%);`)\r\n }\r\n\r\n rules.push(' }')\r\n rules.push('}')\r\n}\r\n\r\nfunction applyReducedMotionOverride(rules: string[], config: ThemeConfiguration): void {\r\n if (config.animationLevel !== 'none') return\r\n\r\n rules.push('')\r\n rules.push('@media (prefers-reduced-motion: reduce) {')\r\n rules.push(' *, *::before, *::after {')\r\n rules.push(' animation-duration: 0.01ms !important;')\r\n rules.push(' animation-iteration-count: 1 !important;')\r\n rules.push(' transition-duration: 0.01ms !important;')\r\n rules.push(' scroll-behavior: auto !important;')\r\n rules.push(' }')\r\n rules.push('}')\r\n}\r\n\r\nfunction appendCustomCSS(\r\n rules: string[],\r\n customization: ThemeCustomization | null | undefined,\r\n): void {\r\n if (!customization?.customCSS) return\r\n\r\n rules.push('')\r\n rules.push('/* Custom CSS */')\r\n rules.push(customization.customCSS)\r\n}\r\n\r\nfunction applyCustomizationStyleOverrides(\r\n styles: Record<string, string>,\r\n customization: ThemeCustomization | null | undefined,\r\n): void {\r\n if (!customization) return\r\n\r\n if (customization.primaryColor) {\r\n styles['--primary'] = customization.primaryColor\r\n }\r\n\r\n if (customization.accentColor) {\r\n styles['--accent'] = customization.accentColor\r\n }\r\n\r\n if (customization.backgroundColor) {\r\n styles['--background'] = customization.backgroundColor\r\n styles['--card'] = customization.backgroundColor\r\n styles['--popover'] = customization.backgroundColor\r\n }\r\n\r\n if (customization.textColor) {\r\n styles['--foreground'] = customization.textColor\r\n }\r\n}\r\n\r\nfunction applyTypographyStyleOverrides(\r\n styles: Record<string, string>,\r\n typography: ThemeTypographyPreset | null | undefined,\r\n): void {\r\n if (!typography) return\r\n\r\n if (typography.fontFamily) {\r\n styles['--font-family-base'] = typography.fontFamily\r\n }\r\n\r\n if (typography.headingFamily) {\r\n styles['--font-family-heading'] = typography.headingFamily\r\n }\r\n\r\n if (typography.baseFontSize) {\r\n styles['--font-size-base'] = typography.baseFontSize\r\n }\r\n\r\n if (typography.lineHeight) {\r\n styles['--line-height-base'] = typography.lineHeight\r\n }\r\n}\r\n"],"names":["borderRadiusPresets","generateThemeCSS","config","cssRules","customization","themeSelector","theme","push","applyCustomizationRootRules","applyBorderRadiusRule","applyFontScaleRules","applySpacingRule","applyAnimationRule","applyTypographyRules","applyDarkModeOverrides","applyReducedMotionOverride","appendCustomCSS","join","isLightBackground","color","lightPatterns","some","pattern","test","getThemeStyles","styles","applyCustomizationStyleOverrides","applyTypographyStyleOverrides","typography","rules","primaryColor","accentColor","backgroundColor","textColor","borderRadius","preset","cssEntries","Object","entries","css","forEach","property","value","defaultRadius","fontScale","scaleValues","small","medium","large","xl","scale","baseSizes","className","baseSize","scaledSize","parseFloat","spacing","spacingMultipliers","compact","spacious","multiplier","animationLevel","animationSettings","none","duration","easing","reduced","full","level","settings","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","token","weight","letterSpacing","selector","colorMode","customCSS"],"mappings":"AACA,SAASA,mBAAmB,QAAQ,oCAAmC;AAqBvE;;CAEC,GACD,OAAO,SAASC,iBAAiBC,MAA0B;IACzD,MAAMC,WAAqB,EAAE;IAC7B,MAAMC,gBAAgB,AAACF,OAA+CE,aAAa;IACnF,MAAMC,gBAAgBH,OAAOI,KAAK,GAAG,CAAC,kBAAkB,EAAEJ,OAAOI,KAAK,CAAC,EAAE,CAAC,GAAG;IAE7E,uBAAuB;IACvBH,SAASI,IAAI,CAAC,GAAGF,cAAc,EAAE,CAAC;IAClCG,4BAA4BL,UAAUC;IACtCK,sBAAsBN,UAAUD;IAChCQ,oBAAoBP,UAAUD;IAC9BS,iBAAiBR,UAAUD;IAC3BU,mBAAmBT,UAAUD;IAC7BW,qBAAqBV,UAAUD;IAE/BC,SAASI,IAAI,CAAC;IAEd,gCAAgC;IAChCO,uBAAuBX,UAAUD,QAAQE,eAAeC;IAExD,yDAAyD;IACzDU,2BAA2BZ,UAAUD;IAErC,aAAa;IACbc,gBAAgBb,UAAUC;IAE1B,OAAOD,SAASc,IAAI,CAAC;AACvB;AAEA;;CAEC,GACD,SAASC,kBAAkBC,KAAa;IACtC,mFAAmF;IACnF,MAAMC,gBAAgB;QACpB;QACA;QACA;QACA;KACD;IAED,OAAOA,cAAcC,IAAI,CAAC,CAACC,UAAYA,QAAQC,IAAI,CAACJ;AACtD;AAEA;;CAEC,GACD,OAAO,SAASK,eAAetB,MAA0B;IACvD,MAAMuB,SAAiC,CAAC;IACxC,MAAMrB,gBAAgB,AAACF,OAA+CE,aAAa;IAEnFsB,iCAAiCD,QAAQrB;IACzCuB,8BAA8BF,QAAQvB,OAAO0B,UAAU;IAEvD,OAAOH;AACT;AAEA,SAASjB,4BACPqB,KAAe,EACfzB,aAAoD;IAEpD,IAAI,CAACA,eAAe;IAEpB,IAAIA,cAAc0B,YAAY,EAAE;QAC9BD,MAAMtB,IAAI,CAAC,CAAC,oBAAoB,EAAEH,cAAc0B,YAAY,CAAC,CAAC,CAAC;IACjE;IAEA,IAAI1B,cAAc2B,WAAW,EAAE;QAC7BF,MAAMtB,IAAI,CAAC,CAAC,mBAAmB,EAAEH,cAAc2B,WAAW,CAAC,CAAC,CAAC;IAC/D;IAEA,IAAI3B,cAAc4B,eAAe,EAAE;QACjCH,MAAMtB,IAAI,CAAC,CAAC,gBAAgB,EAAEH,cAAc4B,eAAe,CAAC,CAAC,CAAC;QAC9DH,MAAMtB,IAAI,CAAC,CAAC,UAAU,EAAEH,cAAc4B,eAAe,CAAC,CAAC,CAAC;QACxDH,MAAMtB,IAAI,CAAC,CAAC,aAAa,EAAEH,cAAc4B,eAAe,CAAC,CAAC,CAAC;IAC7D;IAEA,IAAI5B,cAAc6B,SAAS,EAAE;QAC3BJ,MAAMtB,IAAI,CAAC,CAAC,gBAAgB,EAAEH,cAAc6B,SAAS,CAAC,CAAC,CAAC;IAC1D;AACF;AAEA,SAASxB,sBAAsBoB,KAAe,EAAE3B,MAA0B;IACxE,IAAI,CAACA,OAAOgC,YAAY,EAAE;IAE1B,MAAMC,SAASnC,mBAAmB,CAACE,OAAOgC,YAAY,CAAC;IACvD,IAAI,CAACC,QAAQ;IAEb,MAAMC,aAAaC,OAAOC,OAAO,CAACH,OAAOI,GAAG;IAC5CH,WAAWI,OAAO,CAAC,CAAC,CAACC,UAAUC,MAAM;QACnCb,MAAMtB,IAAI,CAAC,CAAC,EAAE,EAAEkC,SAAS,EAAE,EAAEC,MAAM,CAAC,CAAC;IACvC;IAEA,MAAMC,gBACJR,OAAOI,GAAG,CAAC,mBAAmB,IAAIJ,OAAOI,GAAG,CAAC,kBAAkB,IAAIJ,OAAOI,GAAG,CAAC,iBAAiB;IACjG,IAAII,eAAe;QACjBd,MAAMtB,IAAI,CAAC,CAAC,YAAY,EAAEoC,cAAc,CAAC,CAAC;IAC5C;AACF;AAEA,SAASjC,oBAAoBmB,KAAe,EAAE3B,MAA0B;IACtE,IAAI,CAACA,OAAO0C,SAAS,EAAE;IAEvB,MAAMC,cAAsC;QAC1CC,OAAO;QACPC,QAAQ;QACRC,OAAO;QACPC,IAAI;IACN;IAEA,MAAMC,QAAQL,WAAW,CAAC3C,OAAO0C,SAAS,CAAC,IAAI;IAC/Cf,MAAMtB,IAAI,CAAC,CAAC,gBAAgB,EAAE2C,MAAM,CAAC,CAAC;IACtCrB,MAAMtB,IAAI,CAAC,CAAC,sBAAsB,EAAE2C,MAAM,CAAC,CAAC;IAE5C,MAAMC,YAAoC;QACxC,WAAW;QACX,WAAW;QACX,aAAa;QACb,WAAW;QACX,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,YAAY;IACd;IAEAd,OAAOC,OAAO,CAACa,WAAWX,OAAO,CAAC,CAAC,CAACY,WAAWC,SAAS;QACtD,MAAMC,aAAaC,WAAWF,YAAYE,WAAWL;QACrDrB,MAAMtB,IAAI,CAAC,CAAC,IAAI,EAAE6C,UAAU,EAAE,EAAEE,WAAW,IAAI,CAAC;IAClD;AACF;AAEA,SAAS3C,iBAAiBkB,KAAe,EAAE3B,MAA0B;IACnE,IAAI,CAACA,OAAOsD,OAAO,EAAE;IAErB,MAAMC,qBAA6C;QACjDC,SAAS;QACTX,QAAQ;QACRY,UAAU;IACZ;IAEA,MAAMC,aAAaH,kBAAkB,CAACvD,OAAOsD,OAAO,CAAC,IAAI;IACzD3B,MAAMtB,IAAI,CAAC,CAAC,mBAAmB,EAAEqD,WAAW,CAAC,CAAC;IAC9C/B,MAAMtB,IAAI,CAAC,CAAC,mBAAmB,EAAEqD,WAAW,CAAC,CAAC;AAChD;AAEA,SAAShD,mBAAmBiB,KAAe,EAAE3B,MAA0B;IACrE,IAAI,CAACA,OAAO2D,cAAc,EAAE;IAE5B,MAAMC,oBAAyF;QAC7FC,MAAM;YACJC,UAAU;YACVC,QAAQ;YACRf,OAAO;QACT;QACAgB,SAAS;YACPF,UAAU;YACVC,QAAQ;YACRf,OAAO;QACT;QACAH,QAAQ;YACNiB,UAAU;YACVC,QAAQ;YACRf,OAAO;QACT;QACAiB,MAAM;YACJH,UAAU;YACVC,QAAQ;YACRf,OAAO;QACT;IACF;IAEA,MAAMkB,QAAQlE,OAAO2D,cAAc;IACnC,MAAMQ,WAAWP,iBAAiB,CAACM,MAAM,IAAIN,kBAAkBf,MAAM;IACrE,IAAI,CAACsB,UAAU;IACfxC,MAAMtB,IAAI,CAAC,CAAC,wBAAwB,EAAE8D,SAASL,QAAQ,CAAC,CAAC,CAAC;IAC1DnC,MAAMtB,IAAI,CAAC,CAAC,sBAAsB,EAAE8D,SAASJ,MAAM,CAAC,CAAC,CAAC;IACtDpC,MAAMtB,IAAI,CAAC,CAAC,qBAAqB,EAAE8D,SAASnB,KAAK,CAAC,CAAC,CAAC;IACpDrB,MAAMtB,IAAI,CAAC,CAAC,2BAA2B,EAAEL,OAAO2D,cAAc,CAAC,CAAC,CAAC;AACnE;AAEA,SAAShD,qBAAqBgB,KAAe,EAAE3B,MAA0B;IACvE,MAAM0B,aAAa1B,OAAO0B,UAAU;IACpC,IAAI,CAACA,YAAY;IAEjB,IAAIA,WAAW0C,UAAU,EAAE;QACzBzC,MAAMtB,IAAI,CAAC,CAAC,2BAA2B,EAAEqB,WAAW0C,UAAU,CAAC,CAAC,CAAC;IACnE;IAEA,IAAI1C,WAAW2C,aAAa,EAAE;QAC5B1C,MAAMtB,IAAI,CAAC,CAAC,8BAA8B,EAAEqB,WAAW2C,aAAa,CAAC,CAAC,CAAC;IACzE;IAEA,IAAI3C,WAAW4C,YAAY,EAAE;QAC3B3C,MAAMtB,IAAI,CAAC,CAAC,6BAA6B,EAAEqB,WAAW4C,YAAY,CAAC,CAAC,CAAC;IACvE;IAEA,IAAI5C,WAAW6C,UAAU,EAAE;QACzB5C,MAAMtB,IAAI,CAAC,CAAC,2BAA2B,EAAEqB,WAAW6C,UAAU,CAAC,CAAC,CAAC;IACnE;IAEA,IAAI7C,WAAW8C,WAAW,EAAE;QAC1BrC,OAAOC,OAAO,CAACV,WAAW8C,WAAW,EAAElC,OAAO,CAAC,CAAC,CAACmC,OAAOC,OAAO;YAC7D,IAAIA,QAAQ;gBACV/C,MAAMtB,IAAI,CAAC,CAAC,2BAA2B,EAAEoE,MAAM,EAAE,EAAEC,OAAO,CAAC,CAAC;YAC9D;QACF;IACF;IAEA,IAAIhD,WAAWiD,aAAa,EAAE;QAC5BxC,OAAOC,OAAO,CAACV,WAAWiD,aAAa,EAAErC,OAAO,CAAC,CAAC,CAACmC,OAAOjC,MAAM;YAC9D,IAAIA,OAAO;gBACTb,MAAMtB,IAAI,CAAC,CAAC,6BAA6B,EAAEoE,MAAM,EAAE,EAAEjC,MAAM,CAAC,CAAC;YAC/D;QACF;IACF;AACF;AAEA,SAAS5B,uBACPe,KAAe,EACf3B,MAA0B,EAC1BE,aAAoD,EACpD0E,QAAgB;IAEhB,IAAI5E,OAAO6E,SAAS,KAAK,UAAU7E,OAAO6E,SAAS,KAAK,QAAQ;IAEhElD,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC,CAAC,EAAE,EAAEuE,SAAS,EAAE,CAAC;IAE5B,IAAI1E,eAAe4B,mBAAmBd,kBAAkBd,cAAc4B,eAAe,GAAG;QACtFH,MAAMtB,IAAI,CAAC,CAAC,kCAAkC,CAAC;QAC/CsB,MAAMtB,IAAI,CAAC,CAAC,4BAA4B,CAAC;QACzCsB,MAAMtB,IAAI,CAAC,CAAC,+BAA+B,CAAC;IAC9C;IAEA,IAAIH,eAAe6B,aAAa,CAACf,kBAAkBd,cAAc6B,SAAS,GAAG;QAC3EJ,MAAMtB,IAAI,CAAC,CAAC,mCAAmC,CAAC;IAClD;IAEAsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;AACb;AAEA,SAASQ,2BAA2Bc,KAAe,EAAE3B,MAA0B;IAC7E,IAAIA,OAAO2D,cAAc,KAAK,QAAQ;IAEtChC,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;AACb;AAEA,SAASS,gBACPa,KAAe,EACfzB,aAAoD;IAEpD,IAAI,CAACA,eAAe4E,WAAW;IAE/BnD,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAAC;IACXsB,MAAMtB,IAAI,CAACH,cAAc4E,SAAS;AACpC;AAEA,SAAStD,iCACPD,MAA8B,EAC9BrB,aAAoD;IAEpD,IAAI,CAACA,eAAe;IAEpB,IAAIA,cAAc0B,YAAY,EAAE;QAC9BL,MAAM,CAAC,YAAY,GAAGrB,cAAc0B,YAAY;IAClD;IAEA,IAAI1B,cAAc2B,WAAW,EAAE;QAC7BN,MAAM,CAAC,WAAW,GAAGrB,cAAc2B,WAAW;IAChD;IAEA,IAAI3B,cAAc4B,eAAe,EAAE;QACjCP,MAAM,CAAC,eAAe,GAAGrB,cAAc4B,eAAe;QACtDP,MAAM,CAAC,SAAS,GAAGrB,cAAc4B,eAAe;QAChDP,MAAM,CAAC,YAAY,GAAGrB,cAAc4B,eAAe;IACrD;IAEA,IAAI5B,cAAc6B,SAAS,EAAE;QAC3BR,MAAM,CAAC,eAAe,GAAGrB,cAAc6B,SAAS;IAClD;AACF;AAEA,SAASN,8BACPF,MAA8B,EAC9BG,UAAoD;IAEpD,IAAI,CAACA,YAAY;IAEjB,IAAIA,WAAW0C,UAAU,EAAE;QACzB7C,MAAM,CAAC,qBAAqB,GAAGG,WAAW0C,UAAU;IACtD;IAEA,IAAI1C,WAAW2C,aAAa,EAAE;QAC5B9C,MAAM,CAAC,wBAAwB,GAAGG,WAAW2C,aAAa;IAC5D;IAEA,IAAI3C,WAAW4C,YAAY,EAAE;QAC3B/C,MAAM,CAAC,mBAAmB,GAAGG,WAAW4C,YAAY;IACtD;IAEA,IAAI5C,WAAW6C,UAAU,EAAE;QACzBhD,MAAM,CAAC,qBAAqB,GAAGG,WAAW6C,UAAU;IACtD;AACF"}
1
+ {"version":3,"sources":["../../src/utils/themeUtils.ts"],"sourcesContent":["import type { SiteSetting } from '../payload-types.js'\nimport { borderRadiusPresets } from '../providers/Theme/themeConfig.js'\nimport type { ThemeTypographyPreset } from '../presets.js'\n\ntype ThemeTypographyConfiguration = {\n typography?: ThemeTypographyPreset | null\n}\n\ntype ThemeConfiguration = Omit<NonNullable<SiteSetting['themeConfiguration']>, 'typography'> &\n ThemeTypographyConfiguration\n\ninterface ThemeCustomization {\n primaryColor?: string | null\n accentColor?: string | null\n backgroundColor?: string | null\n textColor?: string | null\n customCSS?: string | null\n}\n\ntype ThemeConfigurationWithCustomization = ThemeConfiguration & {\n customization?: ThemeCustomization | null\n}\n/**\n * Generates CSS custom properties from theme configuration\n */\nexport function generateThemeCSS(config: ThemeConfiguration): string {\n const cssRules: string[] = []\n const customization = (config as ThemeConfigurationWithCustomization).customization\n const themeSelector = config.theme ? `:root[data-theme='${config.theme}']` : ':root'\n\n // Start root CSS rules\n cssRules.push(`${themeSelector} {`)\n applyCustomizationRootRules(cssRules, customization)\n applyBorderRadiusRule(cssRules, config)\n applyFontScaleRules(cssRules, config)\n applySpacingRule(cssRules, config)\n applyAnimationRule(cssRules, config)\n applyTypographyRules(cssRules, config)\n\n cssRules.push('}')\n\n // Color mode specific overrides\n applyDarkModeOverrides(cssRules, config, customization, themeSelector)\n\n // Animation level: none - respect prefers-reduced-motion\n applyReducedMotionOverride(cssRules, config)\n\n // Custom CSS\n appendCustomCSS(cssRules, customization)\n\n return cssRules.join('\\n')\n}\n\n/**\n * Determines if a color is light or dark\n */\nfunction isLightBackground(color: string): boolean {\n // Simple heuristic: if it contains 'white', '#fff', or high RGB values, it's light\n const lightPatterns = [\n /white/i,\n /#f{3,6}/i,\n /rgb\\s*\\(\\s*([2-9]\\d{2}|1[5-9]\\d|1\\d{2}),/,\n /hsl\\s*\\([^)]*,\\s*[^,)]*,\\s*([7-9]\\d|100)%\\)/,\n ]\n\n return lightPatterns.some((pattern) => pattern.test(color))\n}\n\n/**\n * Generate theme styles for use in components\n */\nexport function getThemeStyles(config: ThemeConfiguration) {\n const styles: Record<string, string> = {}\n const customization = (config as ThemeConfigurationWithCustomization).customization\n\n applyCustomizationStyleOverrides(styles, customization)\n applyTypographyStyleOverrides(styles, config.typography)\n\n return styles\n}\n\nfunction applyCustomizationRootRules(\n rules: string[],\n customization: ThemeCustomization | null | undefined,\n): void {\n if (!customization) return\n\n if (customization.primaryColor) {\n rules.push(` --primary-custom: ${customization.primaryColor};`)\n }\n\n if (customization.accentColor) {\n rules.push(` --accent-custom: ${customization.accentColor};`)\n }\n\n if (customization.backgroundColor) {\n rules.push(` --background: ${customization.backgroundColor};`)\n rules.push(` --card: ${customization.backgroundColor};`)\n rules.push(` --popover: ${customization.backgroundColor};`)\n }\n\n if (customization.textColor) {\n rules.push(` --foreground: ${customization.textColor};`)\n }\n}\n\nfunction applyBorderRadiusRule(rules: string[], config: ThemeConfiguration): void {\n if (!config.borderRadius) return\n\n const preset = borderRadiusPresets[config.borderRadius]\n if (!preset) return\n\n const cssEntries = Object.entries(preset.css)\n cssEntries.forEach(([property, value]) => {\n rules.push(` ${property}: ${value};`)\n })\n\n const defaultRadius =\n preset.css['--radius-default'] ?? preset.css['--radius-medium'] ?? preset.css['--radius-large']\n if (defaultRadius) {\n rules.push(` --radius: ${defaultRadius};`)\n }\n}\n\nfunction applyFontScaleRules(rules: string[], config: ThemeConfiguration): void {\n if (!config.fontScale) return\n\n const scaleValues: Record<string, string> = {\n small: '0.9',\n medium: '1',\n large: '1.1',\n xl: '1.25',\n }\n\n const scale = scaleValues[config.fontScale] ?? '1'\n rules.push(` --font-scale: ${scale};`)\n rules.push(` --theme-font-scale: ${scale};`)\n\n const baseSizes: Record<string, string> = {\n 'text-xs': '0.75rem',\n 'text-sm': '0.875rem',\n 'text-base': '1rem',\n 'text-lg': '1.125rem',\n 'text-xl': '1.25rem',\n 'text-2xl': '1.5rem',\n 'text-3xl': '1.875rem',\n 'text-4xl': '2.25rem',\n }\n\n Object.entries(baseSizes).forEach(([className, baseSize]) => {\n const scaledSize = parseFloat(baseSize) * parseFloat(scale)\n rules.push(` --${className}: ${scaledSize}rem;`)\n })\n}\n\nfunction applySpacingRule(rules: string[], config: ThemeConfiguration): void {\n if (!config.spacing) return\n\n const spacingMultipliers: Record<string, string> = {\n compact: '0.75',\n medium: '1',\n spacious: '1.5',\n }\n\n const multiplier = spacingMultipliers[config.spacing] ?? '1'\n rules.push(` --spacing-scale: ${multiplier};`)\n rules.push(` --theme-spacing: ${multiplier};`)\n}\n\nfunction applyAnimationRule(rules: string[], config: ThemeConfiguration): void {\n if (!config.animationLevel) return\n\n const animationSettings: Record<string, { duration: string; easing: string; scale: string }> = {\n none: {\n duration: '0s',\n easing: 'linear',\n scale: '0',\n },\n reduced: {\n duration: '0.1s',\n easing: 'ease-out',\n scale: '0.5',\n },\n medium: {\n duration: '0.2s',\n easing: 'ease-out',\n scale: '1',\n },\n full: {\n duration: '0.3s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n scale: '1.2',\n },\n }\n\n const level = config.animationLevel as keyof typeof animationSettings\n const settings = animationSettings[level] ?? animationSettings.medium\n if (!settings) return\n rules.push(` --animation-duration: ${settings.duration};`)\n rules.push(` --animation-easing: ${settings.easing};`)\n rules.push(` --animation-scale: ${settings.scale};`)\n rules.push(` --theme-animation-level: ${config.animationLevel};`)\n}\n\nfunction applyTypographyRules(rules: string[], config: ThemeConfiguration): void {\n const typography = config.typography\n if (!typography) return\n\n if (typography.fontFamily) {\n rules.push(` --typography-fontFamily: ${typography.fontFamily};`)\n }\n\n if (typography.headingFamily) {\n rules.push(` --typography-headingFamily: ${typography.headingFamily};`)\n }\n\n if (typography.baseFontSize) {\n rules.push(` --typography-baseFontSize: ${typography.baseFontSize};`)\n }\n\n if (typography.lineHeight) {\n rules.push(` --typography-lineHeight: ${typography.lineHeight};`)\n }\n\n if (typography.fontWeights) {\n Object.entries(typography.fontWeights).forEach(([token, weight]) => {\n if (weight) {\n rules.push(` --typography-fontWeights-${token}: ${weight};`)\n }\n })\n }\n\n if (typography.letterSpacing) {\n Object.entries(typography.letterSpacing).forEach(([token, value]) => {\n if (value) {\n rules.push(` --typography-letterSpacing-${token}: ${value};`)\n }\n })\n }\n}\n\nfunction applyDarkModeOverrides(\n rules: string[],\n config: ThemeConfiguration,\n customization: ThemeCustomization | null | undefined,\n selector: string,\n): void {\n if (config.colorMode !== 'dark' && config.colorMode !== 'auto') return\n\n rules.push('')\n rules.push('@media (prefers-color-scheme: dark) {')\n rules.push(` ${selector} {`)\n\n if (customization?.backgroundColor && isLightBackground(customization.backgroundColor)) {\n rules.push(` --background: hsl(224 71% 4%);`)\n rules.push(` --card: hsl(224 71% 4%);`)\n rules.push(` --popover: hsl(224 71% 4%);`)\n }\n\n if (customization?.textColor && !isLightBackground(customization.textColor)) {\n rules.push(` --foreground: hsl(213 31% 91%);`)\n }\n\n rules.push(' }')\n rules.push('}')\n}\n\nfunction applyReducedMotionOverride(rules: string[], config: ThemeConfiguration): void {\n if (config.animationLevel !== 'none') return\n\n rules.push('')\n rules.push('@media (prefers-reduced-motion: reduce) {')\n rules.push(' *, *::before, *::after {')\n rules.push(' animation-duration: 0.01ms !important;')\n rules.push(' animation-iteration-count: 1 !important;')\n rules.push(' transition-duration: 0.01ms !important;')\n rules.push(' scroll-behavior: auto !important;')\n rules.push(' }')\n rules.push('}')\n}\n\nfunction appendCustomCSS(\n rules: string[],\n customization: ThemeCustomization | null | undefined,\n): void {\n if (!customization?.customCSS) return\n\n rules.push('')\n rules.push('/* Custom CSS */')\n rules.push(customization.customCSS)\n}\n\nfunction applyCustomizationStyleOverrides(\n styles: Record<string, string>,\n customization: ThemeCustomization | null | undefined,\n): void {\n if (!customization) return\n\n if (customization.primaryColor) {\n styles['--primary'] = customization.primaryColor\n }\n\n if (customization.accentColor) {\n styles['--accent'] = customization.accentColor\n }\n\n if (customization.backgroundColor) {\n styles['--background'] = customization.backgroundColor\n styles['--card'] = customization.backgroundColor\n styles['--popover'] = customization.backgroundColor\n }\n\n if (customization.textColor) {\n styles['--foreground'] = customization.textColor\n }\n}\n\nfunction applyTypographyStyleOverrides(\n styles: Record<string, string>,\n typography: ThemeTypographyPreset | null | undefined,\n): void {\n if (!typography) return\n\n if (typography.fontFamily) {\n styles['--font-family-base'] = typography.fontFamily\n }\n\n if (typography.headingFamily) {\n styles['--font-family-heading'] = typography.headingFamily\n }\n\n if (typography.baseFontSize) {\n styles['--font-size-base'] = typography.baseFontSize\n }\n\n if (typography.lineHeight) {\n styles['--line-height-base'] = typography.lineHeight\n }\n}\n"],"names":["borderRadiusPresets","generateThemeCSS","config","cssRules","customization","themeSelector","theme","push","applyCustomizationRootRules","applyBorderRadiusRule","applyFontScaleRules","applySpacingRule","applyAnimationRule","applyTypographyRules","applyDarkModeOverrides","applyReducedMotionOverride","appendCustomCSS","join","isLightBackground","color","lightPatterns","some","pattern","test","getThemeStyles","styles","applyCustomizationStyleOverrides","applyTypographyStyleOverrides","typography","rules","primaryColor","accentColor","backgroundColor","textColor","borderRadius","preset","cssEntries","Object","entries","css","forEach","property","value","defaultRadius","fontScale","scaleValues","small","medium","large","xl","scale","baseSizes","className","baseSize","scaledSize","parseFloat","spacing","spacingMultipliers","compact","spacious","multiplier","animationLevel","animationSettings","none","duration","easing","reduced","full","level","settings","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","token","weight","letterSpacing","selector","colorMode","customCSS"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kilivi/payloadcms-theme-management",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Theme configuration plugin for Payload CMS v3",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",