@kilivi/payloadcms-theme-management 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +318 -847
  2. package/dist/components/AppearanceSessionControls.d.ts +15 -0
  3. package/dist/components/AppearanceSessionControls.d.ts.map +1 -0
  4. package/dist/components/AppearanceSessionControls.js +152 -0
  5. package/dist/components/AppearanceSessionControls.js.map +1 -0
  6. package/dist/components/ColorModeToggle.css +42 -0
  7. package/dist/components/ColorModeToggle.d.ts +40 -0
  8. package/dist/components/ColorModeToggle.d.ts.map +1 -0
  9. package/dist/components/ColorModeToggle.js +111 -0
  10. package/dist/components/ColorModeToggle.js.map +1 -0
  11. package/dist/components/ServerThemeInjector.d.ts.map +1 -1
  12. package/dist/components/ServerThemeInjector.js +41 -14
  13. package/dist/components/ServerThemeInjector.js.map +1 -1
  14. package/dist/components/ThemeLivePreviewSync.d.ts +1 -0
  15. package/dist/components/ThemeLivePreviewSync.d.ts.map +1 -1
  16. package/dist/components/ThemeLivePreviewSync.js +1 -1
  17. package/dist/components/ThemeLivePreviewSync.js.map +1 -1
  18. package/dist/components/ThemeSwitcher.d.ts +36 -0
  19. package/dist/components/ThemeSwitcher.d.ts.map +1 -0
  20. package/dist/components/ThemeSwitcher.js +89 -0
  21. package/dist/components/ThemeSwitcher.js.map +1 -0
  22. package/dist/components/typographyPreviewUtils.d.ts.map +1 -1
  23. package/dist/components/typographyPreviewUtils.js +8 -1
  24. package/dist/components/typographyPreviewUtils.js.map +1 -1
  25. package/dist/constants/devicePreviews.d.ts +35 -0
  26. package/dist/constants/devicePreviews.d.ts.map +1 -0
  27. package/dist/constants/devicePreviews.js +43 -0
  28. package/dist/constants/devicePreviews.js.map +1 -0
  29. package/dist/constants/themeFonts.js +9 -9
  30. package/dist/constants/themeFonts.js.map +1 -1
  31. package/dist/extended-presets.d.ts +0 -4
  32. package/dist/extended-presets.d.ts.map +1 -1
  33. package/dist/extended-presets.js +1 -18
  34. package/dist/extended-presets.js.map +1 -1
  35. package/dist/extended-themes.d.ts.map +1 -1
  36. package/dist/extended-themes.js +428 -0
  37. package/dist/extended-themes.js.map +1 -1
  38. package/dist/fields/AccessibilityAuditField.d.ts +2 -0
  39. package/dist/fields/AccessibilityAuditField.d.ts.map +1 -0
  40. package/dist/fields/AccessibilityAuditField.js +303 -0
  41. package/dist/fields/AccessibilityAuditField.js.map +1 -0
  42. package/dist/fields/AppearancePreviewField.d.ts +2 -0
  43. package/dist/fields/AppearancePreviewField.d.ts.map +1 -0
  44. package/dist/fields/AppearancePreviewField.js +763 -0
  45. package/dist/fields/AppearancePreviewField.js.map +1 -0
  46. package/dist/fields/ColorPickerField.d.ts.map +1 -1
  47. package/dist/fields/ColorPickerField.js +89 -85
  48. package/dist/fields/ColorPickerField.js.map +1 -1
  49. package/dist/fields/FontSelectField.d.ts +6 -0
  50. package/dist/fields/FontSelectField.d.ts.map +1 -1
  51. package/dist/fields/FontSelectField.js +195 -122
  52. package/dist/fields/FontSelectField.js.map +1 -1
  53. package/dist/fields/PaletteGeneratorField.d.ts +7 -0
  54. package/dist/fields/PaletteGeneratorField.d.ts.map +1 -0
  55. package/dist/fields/PaletteGeneratorField.js +327 -0
  56. package/dist/fields/PaletteGeneratorField.js.map +1 -0
  57. package/dist/fields/StylePresetField.d.ts +3 -0
  58. package/dist/fields/StylePresetField.d.ts.map +1 -0
  59. package/dist/fields/StylePresetField.js +462 -0
  60. package/dist/fields/StylePresetField.js.map +1 -0
  61. package/dist/fields/ThemeColorPickerField.css +115 -35
  62. package/dist/fields/ThemeColorPickerField.d.ts.map +1 -1
  63. package/dist/fields/ThemeColorPickerField.js +204 -70
  64. package/dist/fields/ThemeColorPickerField.js.map +1 -1
  65. package/dist/fields/ThemeExportField.d.ts +6 -0
  66. package/dist/fields/ThemeExportField.d.ts.map +1 -0
  67. package/dist/fields/ThemeExportField.js +202 -0
  68. package/dist/fields/ThemeExportField.js.map +1 -0
  69. package/dist/fields/ThemePresetImportField.d.ts.map +1 -1
  70. package/dist/fields/ThemePresetImportField.js +56 -25
  71. package/dist/fields/ThemePresetImportField.js.map +1 -1
  72. package/dist/fields/ThemePreviewField.css +382 -5
  73. package/dist/fields/ThemePreviewField.d.ts.map +1 -1
  74. package/dist/fields/ThemePreviewField.js +268 -170
  75. package/dist/fields/ThemePreviewField.js.map +1 -1
  76. package/dist/fields/ThemeTokenSelectField.d.ts.map +1 -1
  77. package/dist/fields/ThemeTokenSelectField.js +278 -80
  78. package/dist/fields/ThemeTokenSelectField.js.map +1 -1
  79. package/dist/fields/colorFieldHelpers.d.ts +90 -0
  80. package/dist/fields/colorFieldHelpers.d.ts.map +1 -0
  81. package/dist/fields/colorFieldHelpers.js +133 -0
  82. package/dist/fields/colorFieldHelpers.js.map +1 -0
  83. package/dist/fields/colorModeFields.d.ts +1 -1
  84. package/dist/fields/colorModeFields.d.ts.map +1 -1
  85. package/dist/fields/colorModeFields.js +49 -7
  86. package/dist/fields/colorModeFields.js.map +1 -1
  87. package/dist/fields/themeConfigurationField.d.ts +8 -1
  88. package/dist/fields/themeConfigurationField.d.ts.map +1 -1
  89. package/dist/fields/themeConfigurationField.js +961 -29
  90. package/dist/fields/themeConfigurationField.js.map +1 -1
  91. package/dist/globals/ThemeSettings/FontPicker/FontPreview.d.ts.map +1 -1
  92. package/dist/globals/ThemeSettings/FontPicker/FontPreview.js +8 -4
  93. package/dist/globals/ThemeSettings/FontPicker/FontPreview.js.map +1 -1
  94. package/dist/globals/ThemeSettings/FontPicker/index.d.ts.map +1 -1
  95. package/dist/globals/ThemeSettings/FontPicker/index.js +81 -26
  96. package/dist/globals/ThemeSettings/FontPicker/index.js.map +1 -1
  97. package/dist/globals/ThemeSettings/FontPicker/styles.css +98 -41
  98. package/dist/globals/ThemeSettings/FontPicker/translations.d.ts +6 -0
  99. package/dist/globals/ThemeSettings/FontPicker/translations.d.ts.map +1 -1
  100. package/dist/globals/ThemeSettings/FontPicker/translations.js +14 -2
  101. package/dist/globals/ThemeSettings/FontPicker/translations.js.map +1 -1
  102. package/dist/globals/ThemeSettings/config.d.ts.map +1 -1
  103. package/dist/globals/ThemeSettings/config.js +76 -79
  104. package/dist/globals/ThemeSettings/config.js.map +1 -1
  105. package/dist/globals/ThemeSettings/fields/FontLoadingGuideField.d.ts.map +1 -1
  106. package/dist/globals/ThemeSettings/fields/FontLoadingGuideField.js +63 -62
  107. package/dist/globals/ThemeSettings/fields/FontLoadingGuideField.js.map +1 -1
  108. package/dist/globals/ThemeSettings/fields/TypographyInfoField.d.ts.map +1 -1
  109. package/dist/globals/ThemeSettings/fields/TypographyInfoField.js +22 -25
  110. package/dist/globals/ThemeSettings/fields/TypographyInfoField.js.map +1 -1
  111. package/dist/hooks/useAppearanceSession.d.ts +50 -0
  112. package/dist/hooks/useAppearanceSession.d.ts.map +1 -0
  113. package/dist/hooks/useAppearanceSession.js +91 -0
  114. package/dist/hooks/useAppearanceSession.js.map +1 -0
  115. package/dist/hooks/useThemeTranslations.d.ts +13 -0
  116. package/dist/hooks/useThemeTranslations.d.ts.map +1 -0
  117. package/dist/hooks/useThemeTranslations.js +22 -0
  118. package/dist/hooks/useThemeTranslations.js.map +1 -0
  119. package/dist/i18n.d.ts +53 -0
  120. package/dist/i18n.d.ts.map +1 -0
  121. package/dist/i18n.js +53 -0
  122. package/dist/i18n.js.map +1 -0
  123. package/dist/index.d.ts +10 -4
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +50 -29
  126. package/dist/index.js.map +1 -1
  127. package/dist/payload-types.d.ts +24 -0
  128. package/dist/payload-types.d.ts.map +1 -1
  129. package/dist/payload-types.js.map +1 -1
  130. package/dist/presets.d.ts +8 -0
  131. package/dist/presets.d.ts.map +1 -1
  132. package/dist/presets.js.map +1 -1
  133. package/dist/providers/Theme/index.d.ts.map +1 -1
  134. package/dist/providers/Theme/index.js +75 -11
  135. package/dist/providers/Theme/index.js.map +1 -1
  136. package/dist/providers/Theme/themeConfig.d.ts.map +1 -1
  137. package/dist/providers/Theme/themeConfig.js +104 -0
  138. package/dist/providers/Theme/themeConfig.js.map +1 -1
  139. package/dist/providers/Theme/types.d.ts +1 -1
  140. package/dist/providers/Theme/types.d.ts.map +1 -1
  141. package/dist/providers/Theme/types.js +10 -1
  142. package/dist/providers/Theme/types.js.map +1 -1
  143. package/dist/style-presets.d.ts +66 -0
  144. package/dist/style-presets.d.ts.map +1 -0
  145. package/dist/style-presets.js +556 -0
  146. package/dist/style-presets.js.map +1 -0
  147. package/dist/translations.d.ts +159 -1
  148. package/dist/translations.d.ts.map +1 -1
  149. package/dist/translations.js +310 -9
  150. package/dist/translations.js.map +1 -1
  151. package/dist/tweakcn-special-themes.d.ts.map +1 -1
  152. package/dist/tweakcn-special-themes.js +585 -9
  153. package/dist/tweakcn-special-themes.js.map +1 -1
  154. package/dist/types/css.d.js +3 -0
  155. package/dist/types/css.d.js.map +1 -0
  156. package/dist/types.d.ts +26 -0
  157. package/dist/types.d.ts.map +1 -1
  158. package/dist/types.js +1 -1
  159. package/dist/types.js.map +1 -1
  160. package/dist/utilities/getThemeSettings.d.ts.map +1 -1
  161. package/dist/utilities/getThemeSettings.js +2 -14
  162. package/dist/utilities/getThemeSettings.js.map +1 -1
  163. package/dist/utils/contrast.d.ts +63 -0
  164. package/dist/utils/contrast.d.ts.map +1 -0
  165. package/dist/utils/contrast.js +158 -0
  166. package/dist/utils/contrast.js.map +1 -0
  167. package/dist/utils/exportTokens.d.ts +30 -0
  168. package/dist/utils/exportTokens.d.ts.map +1 -0
  169. package/dist/utils/exportTokens.js +183 -0
  170. package/dist/utils/exportTokens.js.map +1 -0
  171. package/dist/utils/generatePalette.d.ts +46 -0
  172. package/dist/utils/generatePalette.d.ts.map +1 -0
  173. package/dist/utils/generatePalette.js +127 -0
  174. package/dist/utils/generatePalette.js.map +1 -0
  175. package/dist/utils/generateThemeCSS.d.ts.map +1 -1
  176. package/dist/utils/generateThemeCSS.js +2 -40
  177. package/dist/utils/generateThemeCSS.js.map +1 -1
  178. package/dist/utils/livePreviewThemeRuntime.d.ts +16 -2
  179. package/dist/utils/livePreviewThemeRuntime.d.ts.map +1 -1
  180. package/dist/utils/livePreviewThemeRuntime.js +37 -14
  181. package/dist/utils/livePreviewThemeRuntime.js.map +1 -1
  182. package/dist/utils/localizedText.d.ts +8 -0
  183. package/dist/utils/localizedText.d.ts.map +1 -0
  184. package/dist/utils/localizedText.js +21 -0
  185. package/dist/utils/localizedText.js.map +1 -0
  186. package/dist/utils/resolveThemeConfiguration.d.ts +45 -1
  187. package/dist/utils/resolveThemeConfiguration.d.ts.map +1 -1
  188. package/dist/utils/resolveThemeConfiguration.js +12 -5
  189. package/dist/utils/resolveThemeConfiguration.js.map +1 -1
  190. package/dist/utils/themeColors.d.ts +3 -0
  191. package/dist/utils/themeColors.d.ts.map +1 -1
  192. package/dist/utils/themeColors.js +30 -1
  193. package/dist/utils/themeColors.js.map +1 -1
  194. package/dist/utils/themeHtmlAttributes.d.ts +32 -12
  195. package/dist/utils/themeHtmlAttributes.d.ts.map +1 -1
  196. package/dist/utils/themeHtmlAttributes.js +38 -5
  197. package/dist/utils/themeHtmlAttributes.js.map +1 -1
  198. package/dist/utils/themeUtils.d.ts +3 -5
  199. package/dist/utils/themeUtils.d.ts.map +1 -1
  200. package/dist/utils/themeUtils.js +416 -6
  201. package/dist/utils/themeUtils.js.map +1 -1
  202. package/dist/utils/tweakcnConverter.d.ts +1 -3
  203. package/dist/utils/tweakcnConverter.d.ts.map +1 -1
  204. package/dist/utils/tweakcnConverter.js +1 -3
  205. package/dist/utils/tweakcnConverter.js.map +1 -1
  206. package/package.json +11 -5
  207. package/dist/components/ThemePreview.d.ts +0 -3
  208. package/dist/components/ThemePreview.d.ts.map +0 -1
  209. package/dist/components/ThemePreview.js +0 -321
  210. package/dist/components/ThemePreview.js.map +0 -1
  211. package/dist/plugin.d.ts +0 -2
  212. package/dist/plugin.d.ts.map +0 -1
  213. package/dist/plugin.js +0 -3
  214. package/dist/plugin.js.map +0 -1
@@ -1 +1 @@
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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"}
1
+ {"version":3,"sources":["../../src/utils/themeUtils.ts"],"sourcesContent":["import type { ThemeTypographyPreset } from '../presets.js'\nimport { borderRadiusPresets } from '../providers/Theme/themeConfig.js'\nimport type { ResolvedThemeConfiguration } from './resolveThemeConfiguration.js'\n\ntype ThemeConfiguration = Omit<ResolvedThemeConfiguration, 'typography'> & {\n typography?: ResolvedThemeConfiguration['typography']\n}\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 // ── :root block — CSS custom properties ─────────────────────────────────\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 applyVisualEffectsCSSVars(cssRules, config)\n applyComponentStyleCSSVars(cssRules, config)\n cssRules.push('}')\n\n // ── Element-level effect rules (outside :root) ──────────────────────────\n applyEffectElementRules(cssRules, config)\n\n // ── Color mode overrides ────────────────────────────────────────────────\n applyDarkModeOverrides(cssRules, config, customization, themeSelector)\n\n // ── Animation: 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 high: {\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 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\n// ─── Visual Effects ────────────────────────────────────────────────────────\n\ntype VEConfig = {\n effectStyle?: string | null\n shadowIntensity?: string | null\n backdropBlur?: string | null\n borderStyle?: string | null\n borderWidth?: string | null\n glassOpacity?: number | null\n}\n\ntype CSConfig = {\n buttonVariant?: string | null\n buttonSize?: string | null\n cardStyle?: string | null\n cardHoverEffect?: string | null\n imageStyle?: string | null\n iconSet?: string | null\n navbarStyle?: string | null\n footerStyle?: string | null\n linkStyle?: string | null\n enableScrollReveal?: boolean | null\n enableHoverAnimations?: boolean | null\n}\n\nfunction getVE(config: ThemeConfiguration): VEConfig | null {\n return (config as unknown as { visualEffects?: VEConfig | null }).visualEffects ?? null\n}\n\nfunction getCS(config: ThemeConfiguration): CSConfig | null {\n return (config as unknown as { componentStyles?: CSConfig | null }).componentStyles ?? null\n}\n\nconst SHADOW_MAP: Record<string, string> = {\n none: 'none',\n subtle: '0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04)',\n medium: '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)',\n strong: '0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)',\n dramatic: '0 25px 50px -12px rgba(0,0,0,0.25)',\n}\n\nconst BLUR_PX_MAP: Record<string, string> = {\n none: '0px',\n slight: '4px',\n medium: '8px',\n strong: '16px',\n heavy: '24px',\n}\n\n/**\n * CSS custom properties for visual effects (emitted inside :root {})\n */\nfunction applyVisualEffectsCSSVars(rules: string[], config: ThemeConfiguration): void {\n const ve = getVE(config)\n if (!ve) return\n\n if (ve.effectStyle) rules.push(` --effect-style: ${ve.effectStyle};`)\n if (ve.shadowIntensity) {\n rules.push(` --shadow-intensity: ${ve.shadowIntensity};`)\n const shadow = SHADOW_MAP[ve.shadowIntensity]\n if (shadow) rules.push(` --card-shadow: ${shadow};`)\n }\n if (ve.backdropBlur) {\n const blurPx = BLUR_PX_MAP[ve.backdropBlur] ?? '0px'\n rules.push(` --backdrop-blur: ${blurPx};`)\n // Token form (none|slight|...) — read by the client ThemeProvider to mirror\n // the SSR data-backdrop-blur attribute.\n rules.push(` --backdrop-blur-level: ${ve.backdropBlur};`)\n }\n if (ve.borderStyle) rules.push(` --border-style: ${ve.borderStyle};`)\n if (ve.borderWidth) rules.push(` --border-width: ${ve.borderWidth};`)\n if (ve.glassOpacity != null) {\n const opacity = Math.min(100, Math.max(0, ve.glassOpacity)) / 100\n rules.push(` --glass-opacity: ${opacity.toFixed(2)};`)\n }\n\n // Always emit --card-bg-opacity and --card-backdrop-filter so .glass-card / .glass\n // fallback rules in consumer globals.css can be overridden regardless of cached state.\n // Glass effect: translucent card; all other effects: reset to opaque/none.\n const opacity = ve.glassOpacity != null ? (ve.glassOpacity / 100).toFixed(2) : '0.60'\n const blur = BLUR_PX_MAP[ve.backdropBlur ?? 'medium'] ?? '8px'\n rules.push(` --card-bg-opacity: ${opacity};`)\n rules.push(` --card-backdrop-filter: blur(${blur});`)\n rules.push(` --card-bg-opacity-non-glass: 1.0;`)\n rules.push(` --card-backdrop-filter-non-glass: none;`)\n}\n\n/**\n * CSS custom properties for component styles (emitted inside :root {})\n */\nfunction applyComponentStyleCSSVars(rules: string[], config: ThemeConfiguration): void {\n // Brand gradient composite — always emitted so gradient buttons / cards / text\n // can reference a single token. Falls back to primary→accent when the editor\n // has not set explicit gradient stops.\n rules.push(\n ' --gradient-brand: linear-gradient(' +\n 'var(--gradient-angle, 135deg), ' +\n 'var(--gradient-from, var(--primary)), ' +\n 'var(--gradient-via, var(--gradient-from, var(--primary))), ' +\n 'var(--gradient-to, var(--accent)));',\n )\n\n const cs = getCS(config)\n if (!cs) return\n\n if (cs.buttonVariant) rules.push(` --button-variant: ${cs.buttonVariant};`)\n if (cs.buttonSize) rules.push(` --button-size: ${cs.buttonSize};`)\n if (cs.cardStyle) rules.push(` --card-style: ${cs.cardStyle};`)\n if (cs.cardHoverEffect) rules.push(` --card-hover-effect: ${cs.cardHoverEffect};`)\n if (cs.imageStyle) rules.push(` --image-style: ${cs.imageStyle};`)\n if (cs.navbarStyle) rules.push(` --navbar-style: ${cs.navbarStyle};`)\n if (cs.footerStyle) rules.push(` --footer-style: ${cs.footerStyle};`)\n if (cs.linkStyle) rules.push(` --link-style: ${cs.linkStyle};`)\n if (cs.enableScrollReveal != null) {\n rules.push(` --scroll-reveal: ${cs.enableScrollReveal ? '1' : '0'};`)\n }\n if (cs.enableHoverAnimations != null) {\n rules.push(` --hover-animations: ${cs.enableHoverAnimations ? '1' : '0'};`)\n }\n}\n\n/**\n * Element-level CSS overrides based on effect + component styles.\n * These rules are emitted OUTSIDE the :root {} block so they target\n * actual DOM elements. They rely on data-effect-style / data-card-style\n * attributes set on <html> by layout.tsx (SSR) and ThemeProvider (client).\n */\nfunction applyEffectElementRules(rules: string[], config: ThemeConfiguration): void {\n const ve = getVE(config)\n const cs = getCS(config)\n if (!ve && !cs) return\n\n rules.push('')\n rules.push('/* ── Effect element overrides ── */')\n\n // ── Glass effect ──────────────────────────────────────────────────────\n // NOTE: All effect-style blocks are ALWAYS emitted regardless of the saved\n // effectStyle value. The CSS selectors are scoped by html[data-effect-style='X']\n // so only the matching data-attribute activates the rules. This means the CSS\n // is always correct even when stale cached/draft data is served.\n {\n const opacity = ve?.glassOpacity != null ? ve.glassOpacity : 60\n const blur = BLUR_PX_MAP[ve?.backdropBlur ?? 'strong'] ?? '16px'\n rules.push(`html[data-effect-style='glass'] [data-card],`)\n rules.push(`html[data-effect-style='glass'] .glass-card,`)\n rules.push(`html[data-effect-style='glass'] .glass {`)\n rules.push(\n ` background-color: color-mix(in srgb, var(--card) ${opacity}%, transparent) !important;`,\n )\n rules.push(` backdrop-filter: blur(${blur}) saturate(150%) !important;`)\n rules.push(` -webkit-backdrop-filter: blur(${blur}) saturate(150%) !important;`)\n rules.push(` border-color: color-mix(in srgb, var(--border) 40%, transparent) !important;`)\n rules.push(\n ` box-shadow: 0 4px 24px rgba(0,0,0,0.08), inset 0 1px 0 rgba(255,255,255,0.1) !important;`,\n )\n rules.push(`}`)\n rules.push(`html[data-effect-style='glass'] [data-card]:hover,`)\n rules.push(`html[data-effect-style='glass'] .glass-card:hover,`)\n rules.push(`html[data-effect-style='glass'] .glass:hover {`)\n rules.push(\n ` background-color: color-mix(in srgb, var(--card) ${Math.min(opacity + 10, 90)}%, transparent) !important;`,\n )\n rules.push(\n ` box-shadow: 0 8px 32px rgba(0,0,0,0.12), inset 0 1px 0 rgba(255,255,255,0.15) !important;`,\n )\n rules.push(`}`)\n // Apply the glass surface to the navbar container, but never to a <nav>\n // nested inside a <header> (or <footer>) — otherwise the inner nav paints a\n // second glass layer on top of the header's, producing a visible double-tint.\n // A standalone top-level <nav> (header-less layouts) still gets the surface.\n rules.push(\n `html[data-effect-style='glass'] header, html[data-effect-style='glass'] nav:not(header nav):not(footer nav) {`,\n )\n rules.push(\n ` background-color: color-mix(in srgb, var(--background) 65%, transparent) !important;`,\n )\n rules.push(` backdrop-filter: blur(${blur}) saturate(150%) !important;`)\n rules.push(` -webkit-backdrop-filter: blur(${blur}) saturate(150%) !important;`)\n rules.push(`}`)\n }\n\n // ── Neumorphic effect ──────────────────────────────────────────────────\n {\n rules.push(`html[data-effect-style='neumorphic'] [data-card],`)\n rules.push(`html[data-effect-style='neumorphic'] .glass-card,`)\n rules.push(`html[data-effect-style='neumorphic'] .glass {`)\n rules.push(` background-color: var(--background) !important;`)\n rules.push(` border: none !important;`)\n rules.push(` backdrop-filter: none !important;`)\n rules.push(` -webkit-backdrop-filter: none !important;`)\n rules.push(\n ` box-shadow: 6px 6px 12px rgba(0,0,0,0.12), -6px -6px 12px rgba(255,255,255,0.75) !important;`,\n )\n rules.push(`}`)\n rules.push(`html[data-effect-style='neumorphic'] [data-card]:hover,`)\n rules.push(`html[data-effect-style='neumorphic'] .glass-card:hover,`)\n rules.push(`html[data-effect-style='neumorphic'] .glass:hover {`)\n rules.push(\n ` box-shadow: 8px 8px 16px rgba(0,0,0,0.15), -8px -8px 16px rgba(255,255,255,0.85) !important;`,\n )\n rules.push(`}`)\n rules.push(`html[data-effect-style='neumorphic'][data-theme-mode='dark'] [data-card],`)\n rules.push(`html[data-effect-style='neumorphic'].dark [data-card],`)\n rules.push(`html[data-effect-style='neumorphic'][data-theme-mode='dark'] .glass-card,`)\n rules.push(`html[data-effect-style='neumorphic'].dark .glass-card {`)\n rules.push(\n ` box-shadow: 6px 6px 12px rgba(0,0,0,0.4), -6px -6px 12px rgba(255,255,255,0.04) !important;`,\n )\n rules.push(`}`)\n }\n\n // ── Clay effect ────────────────────────────────────────────────────────\n {\n rules.push(`html[data-effect-style='clay'] [data-card],`)\n rules.push(`html[data-effect-style='clay'] .glass-card,`)\n rules.push(`html[data-effect-style='clay'] .glass {`)\n rules.push(` border-radius: var(--radius-large, 1.5rem) !important;`)\n rules.push(\n ` box-shadow: 4px 4px 0px rgba(0,0,0,0.22), 0 8px 20px rgba(0,0,0,0.08) !important;`,\n )\n rules.push(` border: none !important;`)\n rules.push(` backdrop-filter: none !important;`)\n rules.push(` -webkit-backdrop-filter: none !important;`)\n rules.push(` transition: transform 200ms ease, box-shadow 200ms ease !important;`)\n rules.push(`}`)\n rules.push(`html[data-effect-style='clay'] [data-card]:hover,`)\n rules.push(`html[data-effect-style='clay'] .glass-card:hover,`)\n rules.push(`html[data-effect-style='clay'] .glass:hover {`)\n rules.push(` transform: translateY(-3px) !important;`)\n rules.push(\n ` box-shadow: 6px 6px 0px rgba(0,0,0,0.25), 0 12px 24px rgba(0,0,0,0.12) !important;`,\n )\n rules.push(`}`)\n }\n\n // ── Elevated effect ────────────────────────────────────────────────────\n {\n const shadow = ve?.shadowIntensity\n ? (SHADOW_MAP[ve.shadowIntensity] ?? SHADOW_MAP.medium)\n : SHADOW_MAP.medium\n rules.push(`html[data-effect-style='elevated'] [data-card],`)\n rules.push(`html[data-effect-style='elevated'] .glass-card,`)\n rules.push(`html[data-effect-style='elevated'] .glass {`)\n rules.push(` box-shadow: ${shadow} !important;`)\n rules.push(` border: none !important;`)\n rules.push(` backdrop-filter: none !important;`)\n rules.push(` -webkit-backdrop-filter: none !important;`)\n rules.push(` transition: box-shadow 200ms ease, transform 200ms ease !important;`)\n rules.push(`}`)\n rules.push(`html[data-effect-style='elevated'] [data-card]:hover,`)\n rules.push(`html[data-effect-style='elevated'] .glass-card:hover,`)\n rules.push(`html[data-effect-style='elevated'] .glass:hover {`)\n rules.push(\n ` box-shadow: 0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1) !important;`,\n )\n rules.push(` transform: translateY(-2px) !important;`)\n rules.push(`}`)\n }\n\n // ── Flat effect ────────────────────────────────────────────────────────\n {\n rules.push(`html[data-effect-style='flat'] [data-card],`)\n rules.push(`html[data-effect-style='flat'] .glass-card,`)\n rules.push(`html[data-effect-style='flat'] .glass {`)\n rules.push(` box-shadow: none !important;`)\n rules.push(` backdrop-filter: none !important;`)\n rules.push(` -webkit-backdrop-filter: none !important;`)\n rules.push(`}`)\n }\n // ── Border overrides ───────────────────────────────────────────────────\n if (ve?.borderWidth && ve.borderWidth !== '1px' && ve.borderWidth !== '0px') {\n rules.push(`html[data-border-width='${ve.borderWidth}'] [data-card],`)\n rules.push(`html[data-border-width='${ve.borderWidth}'] .glass-card {`)\n rules.push(` border-width: ${ve.borderWidth} !important;`)\n rules.push(`}`)\n }\n\n // ── Card style: bordered (used by brutalism etc.) ──────────────────────\n if (cs?.cardStyle === 'bordered') {\n const bw = ve?.borderWidth ?? '2px'\n rules.push(`html[data-card-style='bordered'] [data-card],`)\n rules.push(`html[data-card-style='bordered'] .glass-card {`)\n rules.push(` border-width: ${bw} !important;`)\n rules.push(` border-style: solid !important;`)\n rules.push(` border-color: var(--foreground) !important;`)\n rules.push(` box-shadow: 4px 4px 0 var(--foreground) !important;`)\n rules.push(` border-radius: 0 !important;`)\n rules.push(` background-color: var(--card) !important;`)\n rules.push(` backdrop-filter: none !important;`)\n rules.push(` -webkit-backdrop-filter: none !important;`)\n rules.push(`}`)\n rules.push(`html[data-card-style='bordered'] [data-card]:hover,`)\n rules.push(`html[data-card-style='bordered'] .glass-card:hover {`)\n rules.push(` box-shadow: 6px 6px 0 var(--foreground) !important;`)\n rules.push(` transform: translate(-2px, -2px) !important;`)\n rules.push(`}`)\n }\n\n // ── Card style: gradient-border ────────────────────────────────────────\n if (cs?.cardStyle === 'gradient-border') {\n rules.push(`html[data-card-style='gradient-border'] [data-card],`)\n rules.push(`html[data-card-style='gradient-border'] .glass-card {`)\n rules.push(` border-image: var(--gradient-brand) 1 !important;`)\n rules.push(` border-width: 2px !important;`)\n rules.push(` border-style: solid !important;`)\n rules.push(`}`)\n }\n\n // ── Navbar styles ──────────────────────────────────────────────────────\n const navbarStyle = cs?.navbarStyle\n if (navbarStyle === 'blur') {\n rules.push(`html[data-navbar-style='blur'] header {`)\n rules.push(\n ` background-color: color-mix(in srgb, var(--background) 70%, transparent) !important;`,\n )\n rules.push(` backdrop-filter: blur(12px) !important;`)\n rules.push(` -webkit-backdrop-filter: blur(12px) !important;`)\n rules.push(`}`)\n } else if (navbarStyle === 'transparent') {\n rules.push(`html[data-navbar-style='transparent'] header {`)\n rules.push(` background-color: transparent !important;`)\n rules.push(` border-bottom-color: transparent !important;`)\n rules.push(`}`)\n } else if (navbarStyle === 'floating') {\n rules.push(`html[data-navbar-style='floating'] header {`)\n rules.push(` margin: 12px 16px 0;`)\n rules.push(` border-radius: var(--radius-large, 1.5rem);`)\n rules.push(` border: 1px solid var(--border);`)\n rules.push(` box-shadow: 0 4px 24px rgba(0,0,0,0.08);`)\n rules.push(`}`)\n } else if (navbarStyle === 'minimal') {\n rules.push(`html[data-navbar-style='minimal'] header {`)\n rules.push(` border-bottom-color: transparent !important;`)\n rules.push(` box-shadow: none !important;`)\n rules.push(`}`)\n }\n\n // ── Button variant: brutal ─────────────────────────────────────────────\n if (cs?.buttonVariant === 'brutal') {\n rules.push(`html[data-button-variant='brutal'] [data-btn] {`)\n rules.push(` border: 2px solid var(--foreground) !important;`)\n rules.push(` border-radius: 0 !important;`)\n rules.push(` box-shadow: 3px 3px 0 var(--foreground) !important;`)\n rules.push(` transition: box-shadow 100ms ease, transform 100ms ease !important;`)\n rules.push(`}`)\n rules.push(`html[data-button-variant='brutal'] [data-btn]:hover {`)\n rules.push(` box-shadow: 5px 5px 0 var(--foreground) !important;`)\n rules.push(` transform: translate(-2px, -2px) !important;`)\n rules.push(`}`)\n rules.push(`html[data-button-variant='brutal'] [data-btn]:active {`)\n rules.push(` box-shadow: 1px 1px 0 var(--foreground) !important;`)\n rules.push(` transform: translate(2px, 2px) !important;`)\n rules.push(`}`)\n }\n\n // ── Button variant: pill ───────────────────────────────────────────────\n if (cs?.buttonVariant === 'pill') {\n rules.push(`html[data-button-variant='pill'] [data-btn] {`)\n rules.push(` border-radius: 9999px !important;`)\n rules.push(`}`)\n }\n\n // ── Button variant: ghost ──────────────────────────────────────────────\n if (cs?.buttonVariant === 'outlined') {\n rules.push(`html[data-button-variant='outlined'] [data-btn] {`)\n rules.push(` background-color: transparent !important;`)\n rules.push(` border: 1px solid var(--border) !important;`)\n rules.push(` box-shadow: none !important;`)\n rules.push(`}`)\n }\n\n // ── Card hover effects ─────────────────────────────────────────────────\n if (cs?.cardHoverEffect === 'lift') {\n rules.push(`html[data-card-hover='lift'] [data-card]:hover,`)\n rules.push(`html[data-card-hover='lift'] .glass-card:hover {`)\n rules.push(` transform: translateY(-6px) !important;`)\n rules.push(` box-shadow: 0 20px 40px rgba(0,0,0,0.12) !important;`)\n rules.push(`}`)\n } else if (cs?.cardHoverEffect === 'scale') {\n rules.push(`html[data-card-hover='scale'] [data-card]:hover,`)\n rules.push(`html[data-card-hover='scale'] .glass-card:hover {`)\n rules.push(` transform: scale(1.02) !important;`)\n rules.push(`}`)\n } else if (cs?.cardHoverEffect === 'glow') {\n rules.push(`html[data-card-hover='glow'] [data-card]:hover,`)\n rules.push(`html[data-card-hover='glow'] .glass-card:hover {`)\n rules.push(\n ` box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 25%, transparent), 0 8px 32px rgba(0,0,0,0.1) !important;`,\n )\n rules.push(`}`)\n } else if (cs?.cardHoverEffect === 'tilt') {\n rules.push(`html[data-card-hover='tilt'] [data-card],`)\n rules.push(`html[data-card-hover='tilt'] .glass-card {`)\n rules.push(` transition: transform 200ms ease !important;`)\n rules.push(`}`)\n rules.push(`html[data-card-hover='tilt'] [data-card]:hover,`)\n rules.push(`html[data-card-hover='tilt'] .glass-card:hover {`)\n rules.push(` transform: perspective(1000px) rotateX(2deg) rotateY(-2deg) !important;`)\n rules.push(`}`)\n }\n\n // ── Button variant: gradient ───────────────────────────────────────────\n if (cs?.buttonVariant === 'gradient') {\n rules.push(`html[data-button-variant='gradient'] [data-btn] {`)\n rules.push(` background-image: var(--gradient-brand) !important;`)\n rules.push(` background-color: transparent !important;`)\n rules.push(` color: var(--primary-foreground) !important;`)\n rules.push(` border: none !important;`)\n rules.push(`}`)\n }\n\n // ── Button sizes ────────────────────────────────────────────────────────\n if (cs?.buttonSize) {\n const sizeMap: Record<string, { py: string; px: string; fs: string }> = {\n small: { py: '0.375rem', px: '0.75rem', fs: '0.8125rem' },\n medium: { py: '0.5rem', px: '1rem', fs: '0.875rem' },\n large: { py: '0.625rem', px: '1.5rem', fs: '1rem' },\n xl: { py: '0.875rem', px: '2rem', fs: '1.125rem' },\n }\n const s = sizeMap[cs.buttonSize] ?? sizeMap.medium!\n rules.push(`html[data-button-size='${cs.buttonSize}'] [data-btn] {`)\n rules.push(` padding: ${s.py} ${s.px} !important;`)\n rules.push(` font-size: ${s.fs} !important;`)\n rules.push(`}`)\n }\n\n // ── Image styles ───────────────────────────────────────────────────────\n // Target both [data-img] attributes and the .themed-image helper class.\n if (cs?.imageStyle && cs.imageStyle !== 'default') {\n const style = cs.imageStyle\n const sel = `html[data-image-style='${style}'] [data-img], html[data-image-style='${style}'] .themed-image`\n const hoverSel = `html[data-image-style='${style}'] [data-img]:hover, html[data-image-style='${style}'] .themed-image:hover`\n if (style === 'rounded') {\n rules.push(`${sel} { border-radius: var(--radius-large, 1rem) !important; overflow: hidden; }`)\n } else if (style === 'circle') {\n rules.push(\n `${sel} { border-radius: 9999px !important; aspect-ratio: 1 / 1; object-fit: cover; }`,\n )\n } else if (style === 'grayscale') {\n rules.push(`${sel} { filter: grayscale(1); transition: filter 300ms ease; }`)\n rules.push(`${hoverSel} { filter: grayscale(0); }`)\n } else if (style === 'duotone') {\n rules.push(`${sel} { filter: grayscale(1) contrast(1.05); mix-blend-mode: luminosity; }`)\n } else if (style === 'vignette') {\n rules.push(`${sel} { box-shadow: inset 0 0 60px rgba(0,0,0,0.45); }`)\n } else if (style === 'polaroid') {\n rules.push(\n `${sel} { background: #fff; padding: 10px 10px 36px; box-shadow: 0 6px 16px rgba(0,0,0,0.18); border-radius: 2px; }`,\n )\n }\n }\n\n // ── Link styles ─────────────────────────────────────────────────────────\n if (cs?.linkStyle) {\n const style = cs.linkStyle\n const sel = `html[data-link-style='${style}'] [data-link], html[data-link-style='${style}'] .themed-link`\n const hoverSel = `html[data-link-style='${style}'] [data-link]:hover, html[data-link-style='${style}'] .themed-link:hover`\n if (style === 'underline') {\n rules.push(`${sel} { text-decoration: underline; text-underline-offset: 0.15em; }`)\n } else if (style === 'none') {\n rules.push(`${sel} { text-decoration: none; }`)\n } else if (style === 'underline-hover') {\n rules.push(`${sel} { text-decoration: none; }`)\n rules.push(`${hoverSel} { text-decoration: underline; text-underline-offset: 0.15em; }`)\n } else if (style === 'highlight') {\n rules.push(\n `${sel} { text-decoration: none; background-image: linear-gradient(transparent 60%, color-mix(in srgb, var(--primary) 28%, transparent) 0); }`,\n )\n } else if (style === 'animated') {\n rules.push(\n `${sel} { text-decoration: none; background-image: var(--gradient-brand); background-size: 0% 2px; background-position: 0 100%; background-repeat: no-repeat; transition: background-size 300ms ease; }`,\n )\n rules.push(`${hoverSel} { background-size: 100% 2px; }`)\n }\n }\n\n // ── Footer styles ─────────────────────────────────────────────────────────\n if (cs?.footerStyle === 'dark') {\n rules.push(\n `html[data-footer-style='dark'] footer { background-color: var(--foreground) !important; color: var(--background) !important; }`,\n )\n } else if (cs?.footerStyle === 'full-color') {\n rules.push(\n `html[data-footer-style='full-color'] footer { background-color: var(--primary) !important; color: var(--primary-foreground) !important; }`,\n )\n } else if (cs?.footerStyle === 'gradient-top') {\n rules.push(\n `html[data-footer-style='gradient-top'] footer { border-top: 3px solid transparent; border-image: var(--gradient-brand) 1; }`,\n )\n } else if (cs?.footerStyle === 'minimal') {\n rules.push(\n `html[data-footer-style='minimal'] footer { background: transparent !important; border-top: 1px solid var(--border) !important; box-shadow: none !important; }`,\n )\n }\n\n // ── Hover animations off — neutralise interactive transforms ──────────────\n if (cs?.enableHoverAnimations === false) {\n rules.push(\n `html[data-hover-animations='off'] [data-card]:hover, html[data-hover-animations='off'] .glass-card:hover, html[data-hover-animations='off'] [data-btn]:hover { transform: none !important; }`,\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","applyVisualEffectsCSSVars","applyComponentStyleCSSVars","applyEffectElementRules","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","high","level","settings","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","token","weight","letterSpacing","getVE","visualEffects","getCS","componentStyles","SHADOW_MAP","subtle","strong","dramatic","BLUR_PX_MAP","slight","heavy","ve","effectStyle","shadowIntensity","shadow","backdropBlur","blurPx","borderStyle","borderWidth","glassOpacity","opacity","Math","min","max","toFixed","blur","cs","buttonVariant","buttonSize","cardStyle","cardHoverEffect","imageStyle","navbarStyle","footerStyle","linkStyle","enableScrollReveal","enableHoverAnimations","bw","sizeMap","py","px","fs","s","style","sel","hoverSel","selector","colorMode","customCSS"],"mappings":"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"}
@@ -1,7 +1,5 @@
1
1
  /**
2
- * Converts TweakCN theme presets to sta // Extract lightness from oklch(L C H) or oklch(L C H / A)
3
- const match = color.match(/oklch\(([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*[\d.]+%?)?\)/)
4
- if (!match) return 'hsl(217, 91%, 60%)' // fallback bluerd ThemePreset format
2
+ * Converts TweakCN theme presets to standard ThemePreset format
5
3
  */
6
4
  import type { ExtendedThemePreset } from '../extended-presets.js';
7
5
  import type { ThemePreset } from '../presets.js';
@@ -1 +1 @@
1
- {"version":3,"file":"tweakcnConverter.d.ts","sourceRoot":"","sources":["../../src/utils/tweakcnConverter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AA6OhD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,WAAW,CAwG/E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,EAAE,CAEpD"}
1
+ {"version":3,"file":"tweakcnConverter.d.ts","sourceRoot":"","sources":["../../src/utils/tweakcnConverter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AA6OhD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,WAAW,CAwG/E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,EAAE,CAEpD"}
@@ -1,7 +1,5 @@
1
1
  /**
2
- * Converts TweakCN theme presets to sta // Extract lightness from oklch(L C H) or oklch(L C H / A)
3
- const match = color.match(/oklch\(([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*[\d.]+%?)?\)/)
4
- if (!match) return 'hsl(217, 91%, 60%)' // fallback bluerd ThemePreset format
2
+ * Converts TweakCN theme presets to standard ThemePreset format
5
3
  */ import { tweakcnThemePresets } from '../tweakcn-presets.js';
6
4
  /**
7
5
  * Converts OKLCH color to HSL for preview
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/tweakcnConverter.ts"],"sourcesContent":["/**\n * Converts TweakCN theme presets to sta // Extract lightness from oklch(L C H) or oklch(L C H / A)\n const match = color.match(/oklch\\(([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)(?:\\s*\\/\\s*[\\d.]+%?)?\\)/)\n if (!match) return 'hsl(217, 91%, 60%)' // fallback bluerd ThemePreset format\n */\n\nimport type { ExtendedThemePreset } from '../extended-presets.js'\nimport type { ThemePreset } from '../presets.js'\nimport { tweakcnThemePresets } from '../tweakcn-presets.js'\n\n/**\n * Converts OKLCH color to HSL for preview\n * Handles CSS variables by using fallback values\n */\nfunction oklchToPreviewColor(color: string): string {\n // Handle CSS variables - convert to HSL approximation\n if (color.startsWith('var(')) {\n const hexFallback = colorVarFallbacks[color]\n if (hexFallback) {\n // Convert HEX to HSL for preview\n const r = parseInt(hexFallback.slice(1, 3), 16) / 255\n const g = parseInt(hexFallback.slice(3, 5), 16) / 255\n const b = parseInt(hexFallback.slice(5, 7), 16) / 255\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n let h = 0\n let s = 0\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 return `hsl(${Math.round(h * 360)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`\n }\n return 'hsl(217, 91%, 60%)' // fallback blue\n }\n\n // Extract lightness from oklch(L C H)\n const match = color.match(/oklch\\(([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\)/)\n if (!match) return '#3b82f6' // fallback blue\n\n const [, l, c, h] = match\n const lightness = Math.round(parseFloat(l) * 100)\n const chroma = parseFloat(c)\n const hue = parseFloat(h)\n\n // Convert to HSL approximation for preview\n const saturation = Math.min(100, Math.round(chroma * 100))\n\n return `hsl(${hue}, ${saturation}%, ${lightness}%)`\n}\n\n/**\n * Common CSS color variable fallbacks\n * Maps var(--color-X-Y) to approximate HEX values\n */\nconst colorVarFallbacks: Record<string, string> = {\n // Blue\n 'var(--color-blue-50)': '#eff6ff',\n 'var(--color-blue-100)': '#dbeafe',\n 'var(--color-blue-200)': '#bfdbfe',\n 'var(--color-blue-300)': '#93c5fd',\n 'var(--color-blue-400)': '#60a5fa',\n 'var(--color-blue-500)': '#3b82f6',\n 'var(--color-blue-600)': '#2563eb',\n 'var(--color-blue-700)': '#1d4ed8',\n 'var(--color-blue-800)': '#1e40af',\n 'var(--color-blue-900)': '#1e3a8a',\n // Violet\n 'var(--color-violet-50)': '#f5f3ff',\n 'var(--color-violet-100)': '#ede9fe',\n 'var(--color-violet-200)': '#ddd6fe',\n 'var(--color-violet-300)': '#c4b5fd',\n 'var(--color-violet-400)': '#a78bfa',\n 'var(--color-violet-500)': '#8b5cf6',\n 'var(--color-violet-600)': '#7c3aed',\n 'var(--color-violet-700)': '#6d28d9',\n 'var(--color-violet-800)': '#5b21b6',\n 'var(--color-violet-900)': '#4c1d95',\n // Green\n 'var(--color-green-50)': '#f0fdf4',\n 'var(--color-green-100)': '#dcfce7',\n 'var(--color-green-200)': '#bbf7d0',\n 'var(--color-green-300)': '#86efac',\n 'var(--color-green-400)': '#4ade80',\n 'var(--color-green-500)': '#22c55e',\n 'var(--color-green-600)': '#16a34a',\n 'var(--color-green-700)': '#15803d',\n 'var(--color-green-800)': '#166534',\n 'var(--color-green-900)': '#14532d',\n // Red\n 'var(--color-red-50)': '#fef2f2',\n 'var(--color-red-100)': '#fee2e2',\n 'var(--color-red-200)': '#fecaca',\n 'var(--color-red-300)': '#fca5a5',\n 'var(--color-red-400)': '#f87171',\n 'var(--color-red-500)': '#ef4444',\n 'var(--color-red-600)': '#dc2626',\n 'var(--color-red-700)': '#b91c1c',\n 'var(--color-red-800)': '#991b1b',\n 'var(--color-red-900)': '#7f1d1d',\n // Yellow\n 'var(--color-yellow-50)': '#fefce8',\n 'var(--color-yellow-100)': '#fef9c3',\n 'var(--color-yellow-200)': '#fef08a',\n 'var(--color-yellow-300)': '#fde047',\n 'var(--color-yellow-400)': '#facc15',\n 'var(--color-yellow-500)': '#eab308',\n 'var(--color-yellow-600)': '#ca8a04',\n 'var(--color-yellow-700)': '#a16207',\n 'var(--color-yellow-800)': '#854d0e',\n 'var(--color-yellow-900)': '#713f12',\n // Lime\n 'var(--color-lime-50)': '#f7fee7',\n 'var(--color-lime-100)': '#ecfccb',\n 'var(--color-lime-200)': '#d9f99d',\n 'var(--color-lime-300)': '#bef264',\n 'var(--color-lime-400)': '#a3e635',\n 'var(--color-lime-500)': '#84cc16',\n 'var(--color-lime-600)': '#65a30d',\n 'var(--color-lime-700)': '#4d7c0f',\n 'var(--color-lime-800)': '#3f6212',\n 'var(--color-lime-900)': '#365314',\n // Orange\n 'var(--color-orange-50)': '#fff7ed',\n 'var(--color-orange-100)': '#ffedd5',\n 'var(--color-orange-200)': '#fed7aa',\n 'var(--color-orange-300)': '#fdba74',\n 'var(--color-orange-400)': '#fb923c',\n 'var(--color-orange-500)': '#f97316',\n 'var(--color-orange-600)': '#ea580c',\n 'var(--color-orange-700)': '#c2410c',\n 'var(--color-orange-800)': '#9a3412',\n 'var(--color-orange-900)': '#7c2d12',\n // Rose\n 'var(--color-rose-50)': '#fff1f2',\n 'var(--color-rose-100)': '#ffe4e6',\n 'var(--color-rose-200)': '#fecdd3',\n 'var(--color-rose-300)': '#fda4af',\n 'var(--color-rose-400)': '#fb7185',\n 'var(--color-rose-500)': '#f43f5e',\n 'var(--color-rose-600)': '#e11d48',\n 'var(--color-rose-700)': '#be123c',\n 'var(--color-rose-800)': '#9f1239',\n 'var(--color-rose-900)': '#881337',\n // Zinc (neutral grays)\n 'var(--color-zinc-50)': '#fafafa',\n 'var(--color-zinc-100)': '#f4f4f5',\n 'var(--color-zinc-200)': '#e4e4e7',\n 'var(--color-zinc-300)': '#d4d4d8',\n 'var(--color-zinc-400)': '#a1a1aa',\n 'var(--color-zinc-500)': '#71717a',\n 'var(--color-zinc-600)': '#52525b',\n 'var(--color-zinc-700)': '#3f3f46',\n 'var(--color-zinc-800)': '#27272a',\n 'var(--color-zinc-900)': '#18181b',\n}\n\n/**\n * Maps OKLCH color to HEX for Payload compatibility\n * Converts OKLCH to RGB then to HEX, or uses fallback for CSS variables\n */\nfunction convertOklchColor(color: string): string {\n // Handle CSS variables\n if (color.startsWith('var(')) {\n const fallback = colorVarFallbacks[color]\n if (fallback) {\n return fallback\n }\n console.warn(`No fallback found for CSS variable: ${color}`)\n return '#3b82f6' // fallback blue\n }\n\n // Extract values from oklch(L C H) or oklch(L C H / A)\n const match = color.match(/oklch\\(([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)(?:\\s*\\/\\s*[\\d.]+%?)?\\)/)\n if (!match) {\n console.warn(`Invalid OKLCH format: ${color}`)\n return '#3b82f6' // fallback blue\n }\n\n const [, l, c, h] = match\n const lightness = parseFloat(l)\n const chroma = parseFloat(c)\n const hue = parseFloat(h)\n\n // Convert OKLCH to linear RGB\n // This is a simplified conversion - OKLCH->OKLab->Linear RGB->sRGB\n const hueRad = (hue * Math.PI) / 180\n\n // OKLab coordinates\n const a = chroma * Math.cos(hueRad)\n const b = chroma * Math.sin(hueRad)\n\n // OKLab to linear RGB (simplified matrix multiplication)\n const l_ = lightness + 0.3963377774 * a + 0.2158037573 * b\n const m_ = lightness - 0.1055613458 * a - 0.0638541728 * b\n const s_ = lightness - 0.0894841775 * a - 1.291485548 * b\n\n const l3 = l_ * l_ * l_\n const m3 = m_ * m_ * m_\n const s3 = s_ * s_ * s_\n\n let r = +4.0767416621 * l3 - 3.3077115913 * m3 + 0.2309699292 * s3\n let g = -1.2684380046 * l3 + 2.6097574011 * m3 - 0.3413193965 * s3\n let bl = -0.0041960863 * l3 - 0.7034186147 * m3 + 1.707614701 * s3\n\n // Clamp to [0, 1]\n r = Math.max(0, Math.min(1, r))\n g = Math.max(0, Math.min(1, g))\n bl = Math.max(0, Math.min(1, bl))\n\n // Convert to sRGB (gamma correction)\n const toSRGB = (c: number) => {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055\n }\n\n r = toSRGB(r)\n g = toSRGB(g)\n bl = toSRGB(bl)\n\n // Convert to HEX\n const toHex = (c: number) => {\n const hex = Math.round(c * 255).toString(16)\n return hex.length === 1 ? '0' + hex : hex\n }\n\n return `#${toHex(r)}${toHex(g)}${toHex(bl)}`\n}\n\n/**\n * Converts ExtendedThemePreset to ThemePreset\n */\nexport function convertTweakCNPreset(extended: ExtendedThemePreset): ThemePreset {\n const { label, value, styles } = extended\n const { light, dark } = styles\n\n // Extract border radius\n const radiusValue = light.radius ?? '0.5rem'\n let borderRadius: ThemePreset['borderRadius']\n\n if (radiusValue === '0' || radiusValue === '0px' || radiusValue === '0rem') {\n borderRadius = 'none'\n } else if (parseFloat(radiusValue) <= 0.25) {\n borderRadius = 'small'\n } else if (parseFloat(radiusValue) <= 0.5) {\n borderRadius = 'medium'\n } else if (parseFloat(radiusValue) <= 0.75) {\n borderRadius = 'large'\n } else {\n borderRadius = 'xl'\n }\n\n // Convert light mode colors\n const lightMode: Record<string, string> = {\n background: convertOklchColor(light.background),\n foreground: convertOklchColor(light.foreground),\n card: convertOklchColor(light.card),\n cardForeground: convertOklchColor(light['card-foreground']),\n popover: convertOklchColor(light.popover),\n popoverForeground: convertOklchColor(light['popover-foreground']),\n primary: convertOklchColor(light.primary),\n primaryForeground: convertOklchColor(light['primary-foreground']),\n secondary: convertOklchColor(light.secondary),\n secondaryForeground: convertOklchColor(light['secondary-foreground']),\n muted: convertOklchColor(light.muted),\n mutedForeground: convertOklchColor(light['muted-foreground']),\n accent: convertOklchColor(light.accent),\n accentForeground: convertOklchColor(light['accent-foreground']),\n destructive: convertOklchColor(light.destructive),\n destructiveForeground: convertOklchColor(light['destructive-foreground']),\n border: convertOklchColor(light.border),\n input: convertOklchColor(light.input),\n ring: convertOklchColor(light.ring),\n }\n\n // Convert dark mode colors\n const darkMode: Record<string, string> = {\n background: convertOklchColor(dark.background),\n foreground: convertOklchColor(dark.foreground),\n card: convertOklchColor(dark.card),\n cardForeground: convertOklchColor(dark['card-foreground']),\n popover: convertOklchColor(dark.popover),\n popoverForeground: convertOklchColor(dark['popover-foreground']),\n primary: convertOklchColor(dark.primary),\n primaryForeground: convertOklchColor(dark['primary-foreground']),\n secondary: convertOklchColor(dark.secondary),\n secondaryForeground: convertOklchColor(dark['secondary-foreground']),\n muted: convertOklchColor(dark.muted),\n mutedForeground: convertOklchColor(dark['muted-foreground']),\n accent: convertOklchColor(dark.accent),\n accentForeground: convertOklchColor(dark['accent-foreground']),\n destructive: convertOklchColor(dark.destructive),\n destructiveForeground: convertOklchColor(dark['destructive-foreground']),\n border: convertOklchColor(dark.border),\n input: convertOklchColor(dark.input),\n ring: convertOklchColor(dark.ring),\n }\n\n // Generate preview colors\n const preview = {\n colors: {\n primary: oklchToPreviewColor(light.primary),\n background: oklchToPreviewColor(light.background),\n accent: oklchToPreviewColor(light.accent),\n },\n }\n\n // Typography configuration\n const typography = light['font-sans']\n ? {\n fontFamily: light['font-sans'],\n headingFamily: light['font-sans'],\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 normal: '0',\n wide: '0.025em',\n },\n }\n : undefined\n\n return {\n name: `tweakcn-${value}`,\n label: `${label} (TweakCN)`,\n borderRadius,\n preview,\n lightMode,\n darkMode,\n typography,\n }\n}\n\n/**\n * Converts all TweakCN presets to ThemePreset format\n */\nexport function getAllTweakCNPresets(): ThemePreset[] {\n return Object.values(tweakcnThemePresets).map(convertTweakCNPreset)\n}\n"],"names":["tweakcnThemePresets","oklchToPreviewColor","color","startsWith","hexFallback","colorVarFallbacks","r","parseInt","slice","g","b","max","Math","min","l","h","s","d","round","match","c","lightness","parseFloat","chroma","hue","saturation","convertOklchColor","fallback","console","warn","hueRad","PI","a","cos","sin","l_","m_","s_","l3","m3","s3","bl","toSRGB","pow","toHex","hex","toString","length","convertTweakCNPreset","extended","label","value","styles","light","dark","radiusValue","radius","borderRadius","lightMode","background","foreground","card","cardForeground","popover","popoverForeground","primary","primaryForeground","secondary","secondaryForeground","muted","mutedForeground","accent","accentForeground","destructive","destructiveForeground","border","input","ring","darkMode","preview","colors","typography","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","normal","medium","semibold","bold","letterSpacing","wide","undefined","name","getAllTweakCNPresets","Object","values","map"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/tweakcnConverter.ts"],"sourcesContent":["/**\n * Converts TweakCN theme presets to standard ThemePreset format\n */\n\nimport type { ExtendedThemePreset } from '../extended-presets.js'\nimport type { ThemePreset } from '../presets.js'\nimport { tweakcnThemePresets } from '../tweakcn-presets.js'\n\n/**\n * Converts OKLCH color to HSL for preview\n * Handles CSS variables by using fallback values\n */\nfunction oklchToPreviewColor(color: string): string {\n // Handle CSS variables - convert to HSL approximation\n if (color.startsWith('var(')) {\n const hexFallback = colorVarFallbacks[color]\n if (hexFallback) {\n // Convert HEX to HSL for preview\n const r = parseInt(hexFallback.slice(1, 3), 16) / 255\n const g = parseInt(hexFallback.slice(3, 5), 16) / 255\n const b = parseInt(hexFallback.slice(5, 7), 16) / 255\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n let h = 0\n let s = 0\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 return `hsl(${Math.round(h * 360)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`\n }\n return 'hsl(217, 91%, 60%)' // fallback blue\n }\n\n // Extract lightness from oklch(L C H)\n const match = color.match(/oklch\\(([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)\\)/)\n if (!match) return '#3b82f6' // fallback blue\n\n const [, l, c, h] = match\n const lightness = Math.round(parseFloat(l) * 100)\n const chroma = parseFloat(c)\n const hue = parseFloat(h)\n\n // Convert to HSL approximation for preview\n const saturation = Math.min(100, Math.round(chroma * 100))\n\n return `hsl(${hue}, ${saturation}%, ${lightness}%)`\n}\n\n/**\n * Common CSS color variable fallbacks\n * Maps var(--color-X-Y) to approximate HEX values\n */\nconst colorVarFallbacks: Record<string, string> = {\n // Blue\n 'var(--color-blue-50)': '#eff6ff',\n 'var(--color-blue-100)': '#dbeafe',\n 'var(--color-blue-200)': '#bfdbfe',\n 'var(--color-blue-300)': '#93c5fd',\n 'var(--color-blue-400)': '#60a5fa',\n 'var(--color-blue-500)': '#3b82f6',\n 'var(--color-blue-600)': '#2563eb',\n 'var(--color-blue-700)': '#1d4ed8',\n 'var(--color-blue-800)': '#1e40af',\n 'var(--color-blue-900)': '#1e3a8a',\n // Violet\n 'var(--color-violet-50)': '#f5f3ff',\n 'var(--color-violet-100)': '#ede9fe',\n 'var(--color-violet-200)': '#ddd6fe',\n 'var(--color-violet-300)': '#c4b5fd',\n 'var(--color-violet-400)': '#a78bfa',\n 'var(--color-violet-500)': '#8b5cf6',\n 'var(--color-violet-600)': '#7c3aed',\n 'var(--color-violet-700)': '#6d28d9',\n 'var(--color-violet-800)': '#5b21b6',\n 'var(--color-violet-900)': '#4c1d95',\n // Green\n 'var(--color-green-50)': '#f0fdf4',\n 'var(--color-green-100)': '#dcfce7',\n 'var(--color-green-200)': '#bbf7d0',\n 'var(--color-green-300)': '#86efac',\n 'var(--color-green-400)': '#4ade80',\n 'var(--color-green-500)': '#22c55e',\n 'var(--color-green-600)': '#16a34a',\n 'var(--color-green-700)': '#15803d',\n 'var(--color-green-800)': '#166534',\n 'var(--color-green-900)': '#14532d',\n // Red\n 'var(--color-red-50)': '#fef2f2',\n 'var(--color-red-100)': '#fee2e2',\n 'var(--color-red-200)': '#fecaca',\n 'var(--color-red-300)': '#fca5a5',\n 'var(--color-red-400)': '#f87171',\n 'var(--color-red-500)': '#ef4444',\n 'var(--color-red-600)': '#dc2626',\n 'var(--color-red-700)': '#b91c1c',\n 'var(--color-red-800)': '#991b1b',\n 'var(--color-red-900)': '#7f1d1d',\n // Yellow\n 'var(--color-yellow-50)': '#fefce8',\n 'var(--color-yellow-100)': '#fef9c3',\n 'var(--color-yellow-200)': '#fef08a',\n 'var(--color-yellow-300)': '#fde047',\n 'var(--color-yellow-400)': '#facc15',\n 'var(--color-yellow-500)': '#eab308',\n 'var(--color-yellow-600)': '#ca8a04',\n 'var(--color-yellow-700)': '#a16207',\n 'var(--color-yellow-800)': '#854d0e',\n 'var(--color-yellow-900)': '#713f12',\n // Lime\n 'var(--color-lime-50)': '#f7fee7',\n 'var(--color-lime-100)': '#ecfccb',\n 'var(--color-lime-200)': '#d9f99d',\n 'var(--color-lime-300)': '#bef264',\n 'var(--color-lime-400)': '#a3e635',\n 'var(--color-lime-500)': '#84cc16',\n 'var(--color-lime-600)': '#65a30d',\n 'var(--color-lime-700)': '#4d7c0f',\n 'var(--color-lime-800)': '#3f6212',\n 'var(--color-lime-900)': '#365314',\n // Orange\n 'var(--color-orange-50)': '#fff7ed',\n 'var(--color-orange-100)': '#ffedd5',\n 'var(--color-orange-200)': '#fed7aa',\n 'var(--color-orange-300)': '#fdba74',\n 'var(--color-orange-400)': '#fb923c',\n 'var(--color-orange-500)': '#f97316',\n 'var(--color-orange-600)': '#ea580c',\n 'var(--color-orange-700)': '#c2410c',\n 'var(--color-orange-800)': '#9a3412',\n 'var(--color-orange-900)': '#7c2d12',\n // Rose\n 'var(--color-rose-50)': '#fff1f2',\n 'var(--color-rose-100)': '#ffe4e6',\n 'var(--color-rose-200)': '#fecdd3',\n 'var(--color-rose-300)': '#fda4af',\n 'var(--color-rose-400)': '#fb7185',\n 'var(--color-rose-500)': '#f43f5e',\n 'var(--color-rose-600)': '#e11d48',\n 'var(--color-rose-700)': '#be123c',\n 'var(--color-rose-800)': '#9f1239',\n 'var(--color-rose-900)': '#881337',\n // Zinc (neutral grays)\n 'var(--color-zinc-50)': '#fafafa',\n 'var(--color-zinc-100)': '#f4f4f5',\n 'var(--color-zinc-200)': '#e4e4e7',\n 'var(--color-zinc-300)': '#d4d4d8',\n 'var(--color-zinc-400)': '#a1a1aa',\n 'var(--color-zinc-500)': '#71717a',\n 'var(--color-zinc-600)': '#52525b',\n 'var(--color-zinc-700)': '#3f3f46',\n 'var(--color-zinc-800)': '#27272a',\n 'var(--color-zinc-900)': '#18181b',\n}\n\n/**\n * Maps OKLCH color to HEX for Payload compatibility\n * Converts OKLCH to RGB then to HEX, or uses fallback for CSS variables\n */\nfunction convertOklchColor(color: string): string {\n // Handle CSS variables\n if (color.startsWith('var(')) {\n const fallback = colorVarFallbacks[color]\n if (fallback) {\n return fallback\n }\n console.warn(`No fallback found for CSS variable: ${color}`)\n return '#3b82f6' // fallback blue\n }\n\n // Extract values from oklch(L C H) or oklch(L C H / A)\n const match = color.match(/oklch\\(([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)(?:\\s*\\/\\s*[\\d.]+%?)?\\)/)\n if (!match) {\n console.warn(`Invalid OKLCH format: ${color}`)\n return '#3b82f6' // fallback blue\n }\n\n const [, l, c, h] = match\n const lightness = parseFloat(l)\n const chroma = parseFloat(c)\n const hue = parseFloat(h)\n\n // Convert OKLCH to linear RGB\n // This is a simplified conversion - OKLCH->OKLab->Linear RGB->sRGB\n const hueRad = (hue * Math.PI) / 180\n\n // OKLab coordinates\n const a = chroma * Math.cos(hueRad)\n const b = chroma * Math.sin(hueRad)\n\n // OKLab to linear RGB (simplified matrix multiplication)\n const l_ = lightness + 0.3963377774 * a + 0.2158037573 * b\n const m_ = lightness - 0.1055613458 * a - 0.0638541728 * b\n const s_ = lightness - 0.0894841775 * a - 1.291485548 * b\n\n const l3 = l_ * l_ * l_\n const m3 = m_ * m_ * m_\n const s3 = s_ * s_ * s_\n\n let r = +4.0767416621 * l3 - 3.3077115913 * m3 + 0.2309699292 * s3\n let g = -1.2684380046 * l3 + 2.6097574011 * m3 - 0.3413193965 * s3\n let bl = -0.0041960863 * l3 - 0.7034186147 * m3 + 1.707614701 * s3\n\n // Clamp to [0, 1]\n r = Math.max(0, Math.min(1, r))\n g = Math.max(0, Math.min(1, g))\n bl = Math.max(0, Math.min(1, bl))\n\n // Convert to sRGB (gamma correction)\n const toSRGB = (c: number) => {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055\n }\n\n r = toSRGB(r)\n g = toSRGB(g)\n bl = toSRGB(bl)\n\n // Convert to HEX\n const toHex = (c: number) => {\n const hex = Math.round(c * 255).toString(16)\n return hex.length === 1 ? '0' + hex : hex\n }\n\n return `#${toHex(r)}${toHex(g)}${toHex(bl)}`\n}\n\n/**\n * Converts ExtendedThemePreset to ThemePreset\n */\nexport function convertTweakCNPreset(extended: ExtendedThemePreset): ThemePreset {\n const { label, value, styles } = extended\n const { light, dark } = styles\n\n // Extract border radius\n const radiusValue = light.radius ?? '0.5rem'\n let borderRadius: ThemePreset['borderRadius']\n\n if (radiusValue === '0' || radiusValue === '0px' || radiusValue === '0rem') {\n borderRadius = 'none'\n } else if (parseFloat(radiusValue) <= 0.25) {\n borderRadius = 'small'\n } else if (parseFloat(radiusValue) <= 0.5) {\n borderRadius = 'medium'\n } else if (parseFloat(radiusValue) <= 0.75) {\n borderRadius = 'large'\n } else {\n borderRadius = 'xl'\n }\n\n // Convert light mode colors\n const lightMode: Record<string, string> = {\n background: convertOklchColor(light.background),\n foreground: convertOklchColor(light.foreground),\n card: convertOklchColor(light.card),\n cardForeground: convertOklchColor(light['card-foreground']),\n popover: convertOklchColor(light.popover),\n popoverForeground: convertOklchColor(light['popover-foreground']),\n primary: convertOklchColor(light.primary),\n primaryForeground: convertOklchColor(light['primary-foreground']),\n secondary: convertOklchColor(light.secondary),\n secondaryForeground: convertOklchColor(light['secondary-foreground']),\n muted: convertOklchColor(light.muted),\n mutedForeground: convertOklchColor(light['muted-foreground']),\n accent: convertOklchColor(light.accent),\n accentForeground: convertOklchColor(light['accent-foreground']),\n destructive: convertOklchColor(light.destructive),\n destructiveForeground: convertOklchColor(light['destructive-foreground']),\n border: convertOklchColor(light.border),\n input: convertOklchColor(light.input),\n ring: convertOklchColor(light.ring),\n }\n\n // Convert dark mode colors\n const darkMode: Record<string, string> = {\n background: convertOklchColor(dark.background),\n foreground: convertOklchColor(dark.foreground),\n card: convertOklchColor(dark.card),\n cardForeground: convertOklchColor(dark['card-foreground']),\n popover: convertOklchColor(dark.popover),\n popoverForeground: convertOklchColor(dark['popover-foreground']),\n primary: convertOklchColor(dark.primary),\n primaryForeground: convertOklchColor(dark['primary-foreground']),\n secondary: convertOklchColor(dark.secondary),\n secondaryForeground: convertOklchColor(dark['secondary-foreground']),\n muted: convertOklchColor(dark.muted),\n mutedForeground: convertOklchColor(dark['muted-foreground']),\n accent: convertOklchColor(dark.accent),\n accentForeground: convertOklchColor(dark['accent-foreground']),\n destructive: convertOklchColor(dark.destructive),\n destructiveForeground: convertOklchColor(dark['destructive-foreground']),\n border: convertOklchColor(dark.border),\n input: convertOklchColor(dark.input),\n ring: convertOklchColor(dark.ring),\n }\n\n // Generate preview colors\n const preview = {\n colors: {\n primary: oklchToPreviewColor(light.primary),\n background: oklchToPreviewColor(light.background),\n accent: oklchToPreviewColor(light.accent),\n },\n }\n\n // Typography configuration\n const typography = light['font-sans']\n ? {\n fontFamily: light['font-sans'],\n headingFamily: light['font-sans'],\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 normal: '0',\n wide: '0.025em',\n },\n }\n : undefined\n\n return {\n name: `tweakcn-${value}`,\n label: `${label} (TweakCN)`,\n borderRadius,\n preview,\n lightMode,\n darkMode,\n typography,\n }\n}\n\n/**\n * Converts all TweakCN presets to ThemePreset format\n */\nexport function getAllTweakCNPresets(): ThemePreset[] {\n return Object.values(tweakcnThemePresets).map(convertTweakCNPreset)\n}\n"],"names":["tweakcnThemePresets","oklchToPreviewColor","color","startsWith","hexFallback","colorVarFallbacks","r","parseInt","slice","g","b","max","Math","min","l","h","s","d","round","match","c","lightness","parseFloat","chroma","hue","saturation","convertOklchColor","fallback","console","warn","hueRad","PI","a","cos","sin","l_","m_","s_","l3","m3","s3","bl","toSRGB","pow","toHex","hex","toString","length","convertTweakCNPreset","extended","label","value","styles","light","dark","radiusValue","radius","borderRadius","lightMode","background","foreground","card","cardForeground","popover","popoverForeground","primary","primaryForeground","secondary","secondaryForeground","muted","mutedForeground","accent","accentForeground","destructive","destructiveForeground","border","input","ring","darkMode","preview","colors","typography","fontFamily","headingFamily","baseFontSize","lineHeight","fontWeights","normal","medium","semibold","bold","letterSpacing","wide","undefined","name","getAllTweakCNPresets","Object","values","map"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kilivi/payloadcms-theme-management",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Theme configuration plugin for Payload CMS v3 with 60+ professional themes and standalone collection support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -23,6 +23,10 @@
23
23
  "import": "./dist/fields/*.js",
24
24
  "types": "./dist/fields/*.d.ts"
25
25
  },
26
+ "./hooks/*": {
27
+ "import": "./dist/hooks/*.js",
28
+ "types": "./dist/hooks/*.d.ts"
29
+ },
26
30
  "./views/*": {
27
31
  "import": "./dist/views/*.js",
28
32
  "types": "./dist/views/*.d.ts"
@@ -54,20 +58,21 @@
54
58
  "license": "MIT",
55
59
  "repository": {
56
60
  "type": "git",
57
- "url": "https://github.com/your-org/payload-plugins.git",
61
+ "url": "git+https://github.com/vitakili/payload-plugins.git",
58
62
  "directory": "packages/theme-management"
59
63
  },
60
64
  "bugs": {
61
- "url": "https://github.com/your-org/payload-plugins/issues"
65
+ "url": "https://github.com/vitakili/payload-plugins/issues"
62
66
  },
63
- "homepage": "https://github.com/your-org/payload-plugins/packages/theme-management#readme",
67
+ "homepage": "https://github.com/vitakili/payload-plugins/tree/main/packages/theme-management#readme",
64
68
  "engines": {
65
69
  "node": ">=18.20.0"
66
70
  },
67
71
  "peerDependencies": {
68
72
  "payload": "^3.0.0",
69
73
  "@payloadcms/ui": "^3.0.0",
70
- "next": "^14.0.0 || ^15.0.0",
74
+ "lucide-react": ">=0.400.0",
75
+ "next": "^14.0.0 || ^15.0.0 || ^16.0.0",
71
76
  "react": "^18.3.0 || ^19.0.0-rc",
72
77
  "react-dom": "^18.3.0 || ^19.0.0-rc"
73
78
  },
@@ -88,6 +93,7 @@
88
93
  "copyfiles": "^2.4.1",
89
94
  "jest": "^30.2.0",
90
95
  "jest-environment-jsdom": "^30.2.0",
96
+ "lucide-react": "^0.477.0",
91
97
  "mongodb-memory-server": "^10.2.3",
92
98
  "next": "^15.0.0",
93
99
  "payload": "^3.58.0",
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- export default function ThemePreview(): React.JSX.Element;
3
- //# sourceMappingURL=ThemePreview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ThemePreview.d.ts","sourceRoot":"","sources":["../../src/components/ThemePreview.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAuBtC,MAAM,CAAC,OAAO,UAAU,YAAY,sBA6PnC"}