@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.9 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/components/ui/accessibility-demo.esm.js +30 -24
  3. package/dist/components/ui/accessibility-demo.js +30 -24
  4. package/dist/components/ui/advanced-component-architecture-demo.esm.js +235 -179
  5. package/dist/components/ui/advanced-component-architecture-demo.js +235 -179
  6. package/dist/components/ui/advanced-transition-system-demo.esm.js +110 -64
  7. package/dist/components/ui/advanced-transition-system-demo.js +110 -64
  8. package/dist/components/ui/advanced-transition-system.esm.js +166 -122
  9. package/dist/components/ui/advanced-transition-system.js +166 -122
  10. package/dist/components/ui/animation/animated-container.esm.js +52 -29
  11. package/dist/components/ui/animation/animated-container.js +52 -29
  12. package/dist/components/ui/animation/staggered-container.esm.js +18 -9
  13. package/dist/components/ui/animation/staggered-container.js +18 -9
  14. package/dist/components/ui/animation-demo.esm.js +67 -35
  15. package/dist/components/ui/animation-demo.js +67 -35
  16. package/dist/components/ui/badge.esm.js +9 -6
  17. package/dist/components/ui/badge.js +9 -6
  18. package/dist/components/ui/battery-conscious-animation-demo.esm.js +122 -87
  19. package/dist/components/ui/battery-conscious-animation-demo.js +122 -87
  20. package/dist/components/ui/border-radius-shadow-demo.esm.js +23 -12
  21. package/dist/components/ui/border-radius-shadow-demo.js +23 -12
  22. package/dist/components/ui/button.esm.js +8 -2
  23. package/dist/components/ui/button.js +8 -2
  24. package/dist/components/ui/card.esm.js +33 -8
  25. package/dist/components/ui/card.js +33 -8
  26. package/dist/components/ui/checkbox.esm.js +3 -3
  27. package/dist/components/ui/checkbox.js +3 -3
  28. package/dist/components/ui/color-preview.esm.js +68 -45
  29. package/dist/components/ui/color-preview.js +68 -45
  30. package/dist/components/ui/data-display/chart.esm.js +112 -84
  31. package/dist/components/ui/data-display/chart.js +112 -84
  32. package/dist/components/ui/data-display/data-grid-simple.esm.js +1 -1
  33. package/dist/components/ui/data-display/data-grid-simple.js +1 -1
  34. package/dist/components/ui/data-display/data-grid.esm.js +80 -67
  35. package/dist/components/ui/data-display/data-grid.js +80 -67
  36. package/dist/components/ui/data-display/list.esm.js +53 -45
  37. package/dist/components/ui/data-display/list.js +53 -45
  38. package/dist/components/ui/data-display/table.esm.js +62 -54
  39. package/dist/components/ui/data-display/table.js +62 -54
  40. package/dist/components/ui/data-display/timeline.esm.js +39 -34
  41. package/dist/components/ui/data-display/timeline.js +39 -34
  42. package/dist/components/ui/data-display/tree.esm.js +116 -84
  43. package/dist/components/ui/data-display/tree.js +116 -84
  44. package/dist/components/ui/data-display/types.esm.js +389 -364
  45. package/dist/components/ui/data-display/types.js +389 -364
  46. package/dist/components/ui/enterprise-mobile-experience-demo.esm.js +120 -70
  47. package/dist/components/ui/enterprise-mobile-experience-demo.js +120 -70
  48. package/dist/components/ui/enterprise-mobile-experience.esm.js +124 -73
  49. package/dist/components/ui/enterprise-mobile-experience.js +124 -73
  50. package/dist/components/ui/feedback/alert.esm.js +22 -15
  51. package/dist/components/ui/feedback/alert.js +22 -15
  52. package/dist/components/ui/feedback/progress.esm.js +47 -24
  53. package/dist/components/ui/feedback/progress.js +47 -24
  54. package/dist/components/ui/feedback/skeleton.esm.js +39 -29
  55. package/dist/components/ui/feedback/skeleton.js +39 -29
  56. package/dist/components/ui/feedback/toast.esm.js +62 -38
  57. package/dist/components/ui/feedback/toast.js +62 -38
  58. package/dist/components/ui/feedback/types.esm.js +83 -83
  59. package/dist/components/ui/feedback/types.js +83 -83
  60. package/dist/components/ui/font-preview.esm.js +41 -39
  61. package/dist/components/ui/font-preview.js +41 -39
  62. package/dist/components/ui/form-demo.esm.js +150 -113
  63. package/dist/components/ui/form-demo.js +150 -113
  64. package/dist/components/ui/hardware-acceleration-demo.esm.js +137 -87
  65. package/dist/components/ui/hardware-acceleration-demo.js +137 -87
  66. package/dist/components/ui/input.esm.js +4 -1
  67. package/dist/components/ui/input.js +4 -1
  68. package/dist/components/ui/layout-demo.esm.js +81 -56
  69. package/dist/components/ui/layout-demo.js +81 -56
  70. package/dist/components/ui/layouts/adaptive-layout.esm.js +27 -8
  71. package/dist/components/ui/layouts/adaptive-layout.js +27 -8
  72. package/dist/components/ui/layouts/desktop-layout.esm.js +39 -19
  73. package/dist/components/ui/layouts/desktop-layout.js +39 -19
  74. package/dist/components/ui/layouts/mobile-layout.esm.js +19 -9
  75. package/dist/components/ui/layouts/mobile-layout.js +19 -9
  76. package/dist/components/ui/layouts/tablet-layout.esm.js +28 -14
  77. package/dist/components/ui/layouts/tablet-layout.js +28 -14
  78. package/dist/components/ui/mobile-form-validation.esm.js +120 -87
  79. package/dist/components/ui/mobile-form-validation.js +120 -87
  80. package/dist/components/ui/mobile-input-demo.esm.js +19 -13
  81. package/dist/components/ui/mobile-input-demo.js +19 -13
  82. package/dist/components/ui/mobile-input.esm.js +185 -120
  83. package/dist/components/ui/mobile-input.js +185 -120
  84. package/dist/components/ui/mobile-skeleton-loading-demo.esm.js +128 -111
  85. package/dist/components/ui/mobile-skeleton-loading-demo.js +128 -111
  86. package/dist/components/ui/navigation/breadcrumb.esm.js +17 -14
  87. package/dist/components/ui/navigation/breadcrumb.js +17 -14
  88. package/dist/components/ui/navigation/index.esm.js +0 -1
  89. package/dist/components/ui/navigation/index.js +0 -1
  90. package/dist/components/ui/navigation/menu.esm.js +49 -35
  91. package/dist/components/ui/navigation/menu.js +49 -35
  92. package/dist/components/ui/navigation/navigation-demo.esm.js +81 -74
  93. package/dist/components/ui/navigation/navigation-demo.js +81 -74
  94. package/dist/components/ui/navigation/pagination.esm.js +62 -50
  95. package/dist/components/ui/navigation/pagination.js +62 -50
  96. package/dist/components/ui/navigation/sidebar.esm.js +56 -42
  97. package/dist/components/ui/navigation/sidebar.js +56 -42
  98. package/dist/components/ui/navigation/stepper.esm.js +34 -23
  99. package/dist/components/ui/navigation/stepper.js +34 -23
  100. package/dist/components/ui/navigation/tabs.esm.js +32 -21
  101. package/dist/components/ui/navigation/tabs.js +32 -21
  102. package/dist/components/ui/navigation/types.esm.js +196 -195
  103. package/dist/components/ui/navigation/types.js +196 -195
  104. package/dist/components/ui/overlay/backdrop.esm.js +17 -16
  105. package/dist/components/ui/overlay/backdrop.js +17 -16
  106. package/dist/components/ui/overlay/focus-manager.esm.js +21 -19
  107. package/dist/components/ui/overlay/focus-manager.js +21 -19
  108. package/dist/components/ui/overlay/index.esm.js +0 -2
  109. package/dist/components/ui/overlay/index.js +0 -2
  110. package/dist/components/ui/overlay/modal.esm.js +38 -34
  111. package/dist/components/ui/overlay/modal.js +38 -34
  112. package/dist/components/ui/overlay/overlay-manager.esm.js +25 -20
  113. package/dist/components/ui/overlay/overlay-manager.js +25 -20
  114. package/dist/components/ui/overlay/popover.esm.js +74 -58
  115. package/dist/components/ui/overlay/popover.js +74 -58
  116. package/dist/components/ui/overlay/portal.esm.js +7 -7
  117. package/dist/components/ui/overlay/portal.js +7 -7
  118. package/dist/components/ui/overlay/tooltip.esm.js +54 -39
  119. package/dist/components/ui/overlay/tooltip.js +54 -39
  120. package/dist/components/ui/overlay/types.esm.js +132 -131
  121. package/dist/components/ui/overlay/types.js +132 -131
  122. package/dist/components/ui/performance-demo.esm.js +135 -88
  123. package/dist/components/ui/performance-demo.js +135 -88
  124. package/dist/components/ui/semantic-input-system-demo.esm.js +117 -80
  125. package/dist/components/ui/semantic-input-system-demo.js +117 -80
  126. package/dist/components/ui/theme-customizer.esm.js +84 -52
  127. package/dist/components/ui/theme-customizer.js +84 -52
  128. package/dist/components/ui/theme-preview.esm.js +95 -43
  129. package/dist/components/ui/theme-preview.js +95 -43
  130. package/dist/components/ui/theme-switcher.esm.js +70 -44
  131. package/dist/components/ui/theme-switcher.js +70 -44
  132. package/dist/components/ui/theme-toggle.esm.js +3 -3
  133. package/dist/components/ui/theme-toggle.js +3 -3
  134. package/dist/components/ui/token-demo.esm.js +33 -21
  135. package/dist/components/ui/token-demo.js +33 -21
  136. package/dist/components/ui/touch-demo.esm.js +102 -73
  137. package/dist/components/ui/touch-demo.js +102 -73
  138. package/dist/components/ui/touch-friendly-interface-demo.esm.js +102 -64
  139. package/dist/components/ui/touch-friendly-interface-demo.js +102 -64
  140. package/dist/components/ui/touch-friendly-interface.esm.js +85 -61
  141. package/dist/components/ui/touch-friendly-interface.js +85 -61
  142. package/dist/hooks/use-accessibility-support.esm.js +115 -85
  143. package/dist/hooks/use-accessibility-support.js +115 -85
  144. package/dist/hooks/use-adaptive-layout.esm.js +56 -33
  145. package/dist/hooks/use-adaptive-layout.js +56 -33
  146. package/dist/hooks/use-advanced-patterns.esm.js +57 -42
  147. package/dist/hooks/use-advanced-patterns.js +57 -42
  148. package/dist/hooks/use-advanced-transition-system.esm.js +112 -71
  149. package/dist/hooks/use-advanced-transition-system.js +112 -71
  150. package/dist/hooks/use-animation-profile.esm.js +63 -34
  151. package/dist/hooks/use-animation-profile.js +63 -34
  152. package/dist/hooks/use-battery-animations.esm.js +80 -55
  153. package/dist/hooks/use-battery-animations.js +80 -55
  154. package/dist/hooks/use-battery-conscious-loading.esm.js +166 -123
  155. package/dist/hooks/use-battery-conscious-loading.js +166 -123
  156. package/dist/hooks/use-battery-optimization.esm.js +78 -55
  157. package/dist/hooks/use-battery-optimization.js +78 -55
  158. package/dist/hooks/use-battery-status.esm.js +73 -51
  159. package/dist/hooks/use-battery-status.js +73 -51
  160. package/dist/hooks/use-component-performance.esm.js +62 -47
  161. package/dist/hooks/use-component-performance.js +62 -47
  162. package/dist/hooks/use-device-loading-states.esm.js +152 -109
  163. package/dist/hooks/use-device-loading-states.js +152 -109
  164. package/dist/hooks/use-device.esm.js +25 -14
  165. package/dist/hooks/use-device.js +25 -14
  166. package/dist/hooks/use-enterprise-mobile-experience.esm.js +137 -88
  167. package/dist/hooks/use-enterprise-mobile-experience.js +137 -88
  168. package/dist/hooks/use-form-feedback.esm.js +124 -81
  169. package/dist/hooks/use-form-feedback.js +124 -81
  170. package/dist/hooks/use-form-performance.esm.js +127 -92
  171. package/dist/hooks/use-form-performance.js +127 -92
  172. package/dist/hooks/use-frame-rate.esm.js +56 -37
  173. package/dist/hooks/use-frame-rate.js +56 -37
  174. package/dist/hooks/use-gestures.esm.js +96 -72
  175. package/dist/hooks/use-gestures.js +96 -72
  176. package/dist/hooks/use-hardware-acceleration.esm.js +65 -37
  177. package/dist/hooks/use-hardware-acceleration.js +65 -37
  178. package/dist/hooks/use-input-accessibility.esm.js +157 -119
  179. package/dist/hooks/use-input-accessibility.js +157 -119
  180. package/dist/hooks/use-input-performance.esm.js +139 -104
  181. package/dist/hooks/use-input-performance.js +139 -104
  182. package/dist/hooks/use-layout-performance.esm.js +50 -29
  183. package/dist/hooks/use-layout-performance.js +50 -29
  184. package/dist/hooks/use-loading-accessibility.esm.js +209 -169
  185. package/dist/hooks/use-loading-accessibility.js +209 -169
  186. package/dist/hooks/use-loading-performance.esm.js +117 -93
  187. package/dist/hooks/use-loading-performance.js +117 -93
  188. package/dist/hooks/use-memory-usage.esm.js +57 -38
  189. package/dist/hooks/use-memory-usage.js +57 -38
  190. package/dist/hooks/use-mobile-form-layout.esm.js +111 -74
  191. package/dist/hooks/use-mobile-form-layout.js +111 -74
  192. package/dist/hooks/use-mobile-form-validation.esm.js +211 -144
  193. package/dist/hooks/use-mobile-form-validation.js +211 -144
  194. package/dist/hooks/use-mobile-keyboard-optimization.esm.js +154 -113
  195. package/dist/hooks/use-mobile-keyboard-optimization.js +154 -113
  196. package/dist/hooks/use-mobile-layout.esm.js +73 -51
  197. package/dist/hooks/use-mobile-layout.js +73 -51
  198. package/dist/hooks/use-mobile-optimization.esm.js +72 -44
  199. package/dist/hooks/use-mobile-optimization.js +72 -44
  200. package/dist/hooks/use-mobile-skeleton.esm.js +97 -64
  201. package/dist/hooks/use-mobile-skeleton.js +97 -64
  202. package/dist/hooks/use-mobile-touch.esm.js +128 -93
  203. package/dist/hooks/use-mobile-touch.js +128 -93
  204. package/dist/hooks/use-performance-throttling.esm.js +72 -48
  205. package/dist/hooks/use-performance-throttling.js +72 -48
  206. package/dist/hooks/use-performance.esm.js +90 -52
  207. package/dist/hooks/use-performance.js +90 -52
  208. package/dist/hooks/use-reusable-architecture.esm.js +94 -65
  209. package/dist/hooks/use-reusable-architecture.js +94 -65
  210. package/dist/hooks/use-semantic-input-types.esm.js +166 -124
  211. package/dist/hooks/use-semantic-input-types.js +166 -124
  212. package/dist/hooks/use-semantic-input.esm.js +178 -126
  213. package/dist/hooks/use-semantic-input.js +178 -126
  214. package/dist/hooks/use-tablet-layout.esm.js +67 -38
  215. package/dist/hooks/use-tablet-layout.js +67 -38
  216. package/dist/hooks/use-touch-friendly-input.esm.js +193 -149
  217. package/dist/hooks/use-touch-friendly-input.js +193 -149
  218. package/dist/hooks/use-touch-friendly-interface.esm.js +99 -67
  219. package/dist/hooks/use-touch-friendly-interface.js +99 -67
  220. package/dist/hooks/use-touch-optimization.esm.js +99 -72
  221. package/dist/hooks/use-touch-optimization.js +99 -72
  222. package/dist/index.esm.js +157 -281
  223. package/dist/index.js +157 -281
  224. package/dist/lib/utils.esm.js +1 -1
  225. package/dist/lib/utils.js +1 -1
  226. package/dist/plugins/theme-css-generator.esm.js +104 -55
  227. package/dist/plugins/theme-css-generator.js +104 -55
  228. package/dist/provider.esm.js +4 -4
  229. package/dist/provider.js +4 -4
  230. package/dist/styles.css +1 -1
  231. package/dist/theme.esm.js +633 -468
  232. package/dist/theme.js +633 -468
  233. package/dist/themes/ThemeContext.esm.js +15 -15
  234. package/dist/themes/ThemeContext.js +15 -15
  235. package/dist/themes/ThemeProvider.esm.js +25 -22
  236. package/dist/themes/ThemeProvider.js +25 -22
  237. package/dist/themes/accessibility.esm.js +147 -108
  238. package/dist/themes/accessibility.js +147 -108
  239. package/dist/themes/aria-patterns.esm.js +198 -162
  240. package/dist/themes/aria-patterns.js +198 -162
  241. package/dist/themes/base-themes.esm.js +14 -11
  242. package/dist/themes/base-themes.js +14 -11
  243. package/dist/themes/colorManager.esm.js +101 -83
  244. package/dist/themes/colorManager.js +101 -83
  245. package/dist/themes/examples/dark-theme.esm.js +133 -103
  246. package/dist/themes/examples/dark-theme.js +133 -103
  247. package/dist/themes/examples/minimal-theme.esm.js +83 -61
  248. package/dist/themes/examples/minimal-theme.js +83 -61
  249. package/dist/themes/focus-management.esm.js +202 -143
  250. package/dist/themes/focus-management.js +202 -143
  251. package/dist/themes/fontLoader.esm.js +28 -19
  252. package/dist/themes/fontLoader.js +28 -19
  253. package/dist/themes/high-contrast.esm.js +152 -104
  254. package/dist/themes/high-contrast.js +152 -104
  255. package/dist/themes/index.esm.js +1 -1
  256. package/dist/themes/index.js +1 -1
  257. package/dist/themes/inheritance.esm.js +35 -27
  258. package/dist/themes/inheritance.js +35 -27
  259. package/dist/themes/keyboard-navigation.esm.js +152 -123
  260. package/dist/themes/keyboard-navigation.js +152 -123
  261. package/dist/themes/motion-reduction.esm.js +193 -133
  262. package/dist/themes/motion-reduction.js +193 -133
  263. package/dist/themes/navigation.esm.js +146 -146
  264. package/dist/themes/navigation.js +146 -146
  265. package/dist/themes/screen-reader.esm.js +159 -94
  266. package/dist/themes/screen-reader.js +159 -94
  267. package/dist/themes/systemThemeDetector.esm.js +42 -34
  268. package/dist/themes/systemThemeDetector.js +42 -34
  269. package/dist/themes/themeCSSUpdater.esm.js +21 -9
  270. package/dist/themes/themeCSSUpdater.js +21 -9
  271. package/dist/themes/themePersistence.esm.js +68 -47
  272. package/dist/themes/themePersistence.js +68 -47
  273. package/dist/themes/themes/stan-design.esm.js +633 -468
  274. package/dist/themes/themes/stan-design.js +633 -468
  275. package/dist/themes/types.esm.js +301 -287
  276. package/dist/themes/types.js +301 -287
  277. package/dist/themes/useSystemTheme.esm.js +4 -4
  278. package/dist/themes/useSystemTheme.js +4 -4
  279. package/dist/themes/useTheme.esm.js +4 -4
  280. package/dist/themes/useTheme.js +4 -4
  281. package/dist/themes/validation.esm.js +128 -77
  282. package/dist/themes/validation.js +128 -77
  283. package/dist/tokens/index.esm.js +1 -2
  284. package/dist/tokens/index.js +1 -2
  285. package/dist/tokens/tokenExporter.esm.js +87 -61
  286. package/dist/tokens/tokenExporter.js +87 -61
  287. package/dist/tokens/tokenGenerator.esm.js +86 -77
  288. package/dist/tokens/tokenGenerator.js +86 -77
  289. package/dist/tokens/tokenManager.esm.js +64 -51
  290. package/dist/tokens/tokenManager.js +64 -51
  291. package/dist/tokens/tokenValidator.esm.js +193 -147
  292. package/dist/tokens/tokenValidator.js +193 -147
  293. package/dist/tokens/types.esm.js +49 -35
  294. package/dist/tokens/types.js +49 -35
  295. package/dist/utils/bundle-analyzer.esm.js +83 -65
  296. package/dist/utils/bundle-analyzer.js +83 -65
  297. package/dist/utils/bundle-splitting.esm.js +142 -117
  298. package/dist/utils/bundle-splitting.js +142 -117
  299. package/dist/utils/lazy-loading.esm.js +132 -106
  300. package/dist/utils/lazy-loading.js +132 -106
  301. package/dist/utils/performance-monitor.esm.js +170 -129
  302. package/dist/utils/performance-monitor.js +170 -129
  303. package/dist/utils/tree-shaking.esm.js +69 -61
  304. package/dist/utils/tree-shaking.js +69 -61
  305. package/package.json +1 -1
  306. package/src/index.ts +146 -146
@@ -1,9 +1,47 @@
1
1
  import { resolve } from 'path'
2
2
  import { existsSync, mkdirSync, writeFileSync } from 'fs'
3
- \n`
4
- css += ` src}') format('woff2-variations');\n`
5
- css += ` font-weight} ${maxWeight};\n`
6
- css += ` font-display};\n`
3
+ import type { Plugin } from 'vite'
4
+ import type { MultiThemeConfig } from '../themes/types'
5
+ import { defaultThemes } from '../themes/base-themes'
6
+
7
+ export default function themeCSSGenerator(): Plugin {
8
+ let config: any
9
+
10
+ // Helper function to safely convert values to strings
11
+ const valueToString = (value: any): string => {
12
+ if (Array.isArray(value)) {
13
+ return value.join(', ')
14
+ }
15
+ if (typeof value === 'object' && value !== null) {
16
+ return JSON.stringify(value)
17
+ }
18
+ return String(value)
19
+ }
20
+
21
+ // Helper function to create CSS variable name
22
+ const createCSSVarName = (path: string[]): string => {
23
+ return `--cs-${path.join('-').replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)}`
24
+ }
25
+
26
+ // Generate @font-face declarations from font configuration
27
+ const generateFontFaces = (themeObj: MultiThemeConfig): string => {
28
+ let css = ''
29
+
30
+ if (!themeObj.fonts) return css
31
+
32
+ Object.entries(themeObj.fonts).forEach(([, fontConfig]) => {
33
+ if (fontConfig.source?.type === 'custom' && fontConfig.source.files?.woff2) {
34
+ const { family, source, weights, display } = fontConfig
35
+
36
+ if (weights && Array.isArray(weights) && weights.length > 0) {
37
+ const minWeight = Math.min(...weights)
38
+ const maxWeight = Math.max(...weights)
39
+
40
+ css += `\n@font-face {\n`
41
+ css += ` font-family: '${family}';\n`
42
+ css += ` src: url('${source.files.woff2}') format('woff2-variations');\n`
43
+ css += ` font-weight: ${minWeight} ${maxWeight};\n`
44
+ css += ` font-display: ${display || 'swap'};\n`
7
45
  css += `}\n`
8
46
  }
9
47
  }
@@ -12,10 +50,11 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
12
50
  return css
13
51
  }
14
52
 
15
- // NEW= (obj)=> {
16
- let breakpoints= {}
53
+ // NEW: Extract breakpoints from anywhere in the theme object
54
+ const extractBreakpoints = (obj: any): any => {
55
+ let breakpoints: any = {}
17
56
 
18
- const searchForBreakpoints = (currentObj, currentPath] = []) => {
57
+ const searchForBreakpoints = (currentObj: any, currentPath: string[] = []) => {
19
58
  if (typeof currentObj !== 'object' || currentObj === null) {
20
59
  return
21
60
  }
@@ -39,19 +78,21 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
39
78
  return breakpoints
40
79
  }
41
80
 
42
- // NEW= (breakpoints)=> {
81
+ // NEW: Generate breakpoint CSS variables and @custom-media queries
82
+ const generateBreakpointVariables = (breakpoints: any): string => {
43
83
  let css = ''
44
84
  if (Object.keys(breakpoints).length === 0) { return css }
45
85
 
46
86
  css += ` /* Breakpoint Variables */\n`
47
87
  Object.entries(breakpoints).forEach(([key, value]) => {
48
- css += ` --cs-breakpoints-${key}};\n`
88
+ css += ` --cs-breakpoints-${key}: ${value};\n`
49
89
  })
50
90
  css += '\n'
51
91
 
52
- // NEW= ` /* Custom Media Queries for Breakpoints */\n`
92
+ // NEW: Generate @custom-media queries for use in media queries
93
+ css += ` /* Custom Media Queries for Breakpoints */\n`
53
94
  Object.entries(breakpoints).forEach(([key, value]) => {
54
- css += ` @custom-media --bp-${key} (min-width});\n`
95
+ css += ` @custom-media --bp-${key} (min-width: ${value});\n`
55
96
  })
56
97
  css += '\n'
57
98
 
@@ -59,7 +100,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
59
100
  }
60
101
 
61
102
  // Recursively generate CSS variables from theme object
62
- const generateCSSVariables = (obj, path] = [])=> {
103
+ const generateCSSVariables = (obj: any, path: string[] = []): string => {
63
104
  let css = ''
64
105
 
65
106
  if (typeof obj !== 'object' || obj === null) {
@@ -72,11 +113,11 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
72
113
  if (typeof value === 'string' || typeof value === 'number') {
73
114
  // Generate CSS variable for primitive values
74
115
  const cssVarName = createCSSVarName(currentPath)
75
- css += ` ${cssVarName}};\n`
116
+ css += ` ${cssVarName}: ${value};\n`
76
117
  } else if (Array.isArray(value)) {
77
118
  // Handle arrays (like font weights, tags)
78
119
  const cssVarName = createCSSVarName(currentPath)
79
- css += ` ${cssVarName})};\n`
120
+ css += ` ${cssVarName}: ${valueToString(value)};\n`
80
121
  } else if (typeof value === 'object' && value !== null) {
81
122
  // Recursively process nested objects
82
123
  css += generateCSSVariables(value, currentPath)
@@ -87,24 +128,27 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
87
128
  }
88
129
 
89
130
  // Generate CSS from theme object using structured traversal
90
- const generateSingleThemeCSS = (themeName, themeObj)=> {
131
+ const generateSingleThemeCSS = (themeName: string, themeObj: MultiThemeConfig): string => {
91
132
  // Always generate light + dark mode CSS
92
133
  return generateLightDarkCSS(themeName, themeObj)
93
134
  }
94
135
 
95
136
  // Generate light and dark mode CSS
96
- const generateLightDarkCSS = (themeName, themeObj)=> {
137
+ const generateLightDarkCSS = (themeName: string, themeObj: MultiThemeConfig): string => {
97
138
  let css = `/* ${themeName} Theme - Light & Dark Modes */\n`
98
139
 
99
140
  // Generate @font-face declarations
100
141
  css += generateFontFaces(themeObj)
101
142
 
102
- // NEW= extractBreakpoints(themeObj)
143
+ // NEW: Extract breakpoints from anywhere in the theme
144
+ const breakpoints = extractBreakpoints(themeObj)
103
145
 
104
146
  // Generate light mode variables (default)
105
- css += `= ` /* Light Mode Variables */\n`
147
+ css += `:root {\n`
148
+ css += ` /* Light Mode Variables */\n`
106
149
 
107
- // NEW= generateBreakpointVariables(breakpoints)
150
+ // NEW: Generate breakpoint variables first
151
+ css += generateBreakpointVariables(breakpoints)
108
152
 
109
153
  // Generate all other CSS variables
110
154
  css += generateCSSVariables(themeObj)
@@ -127,7 +171,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
127
171
  }
128
172
 
129
173
  // Generate dark mode colors from explicit color definitions
130
- const generateDarkModeColors = (darkColors)=> {
174
+ const generateDarkModeColors = (darkColors: any): string => {
131
175
  let css = ''
132
176
 
133
177
  Object.entries(darkColors).forEach(([colorKey, colorValue]) => {
@@ -135,12 +179,12 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
135
179
  // Handle nested color objects (like surface, text, etc.)
136
180
  Object.entries(colorValue).forEach(([subKey, subValue]) => {
137
181
  if (typeof subValue === 'string' || typeof subValue === 'number') {
138
- css += ` --cs-colors-${colorKey}-${subKey}};\n`
182
+ css += ` --cs-colors-${colorKey}-${subKey}: ${subValue};\n`
139
183
  }
140
184
  })
141
185
  } else if (typeof colorValue === 'string' || typeof colorValue === 'number') {
142
186
  // Handle direct color values
143
- css += ` --cs-colors-${colorKey}};\n`
187
+ css += ` --cs-colors-${colorKey}: ${colorValue};\n`
144
188
  }
145
189
  })
146
190
 
@@ -148,7 +192,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
148
192
  }
149
193
 
150
194
  // Generate dark mode variables by adapting light mode colors
151
- const generateDarkModeVariables = (themeObj)=> {
195
+ const generateDarkModeVariables = (themeObj: MultiThemeConfig): string => {
152
196
  // Create a dark variant of the theme by adapting colors
153
197
  const darkTheme = adaptThemeForDarkMode(themeObj)
154
198
 
@@ -162,44 +206,49 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
162
206
  // Handle nested color objects (like surface, text, etc.)
163
207
  Object.entries(colorValue).forEach(([subKey, subValue]) => {
164
208
  if (typeof subValue === 'string' || typeof subValue === 'number') {
165
- css += ` --cs-colors-${colorKey}-${subKey}};\n`
209
+ css += ` --cs-colors-${colorKey}-${subKey}: ${subValue};\n`
166
210
  }
167
211
  })
168
212
  } else if (typeof colorValue === 'string' || typeof colorValue === 'number') {
169
213
  // Handle direct color values
170
- css += ` --cs-colors-${colorKey}};\n`
214
+ css += ` --cs-colors-${colorKey}: ${colorValue};\n`
171
215
  }
172
216
  })
173
217
  }
174
218
 
175
219
  // Add some basic dark mode variables for testing
176
- css += ` --cs-colors-surface-background;\n`
177
- css += ` --cs-colors-surface-surface;\n`
178
- css += ` --cs-colors-surface-border;\n`
179
- css += ` --cs-colors-surface-divider;\n`
180
- css += ` --cs-colors-text-primary;\n`
181
- css += ` --cs-colors-text-secondary;\n`
182
- css += ` --cs-colors-text-muted;\n`
220
+ css += ` --cs-colors-surface-background: #0f172a;\n`
221
+ css += ` --cs-colors-surface-surface: #1e293b;\n`
222
+ css += ` --cs-colors-surface-border: #334155;\n`
223
+ css += ` --cs-colors-surface-divider: #475569;\n`
224
+ css += ` --cs-colors-text-primary: #f8fafc;\n`
225
+ css += ` --cs-colors-text-secondary: #cbd5e1;\n`
226
+ css += ` --cs-colors-text-muted: #94a3b8;\n`
183
227
 
184
228
  return css
185
229
  }
186
230
 
187
231
  // Adapt theme for dark mode
188
- const adaptThemeForDarkMode = (_themeObj)=> {
232
+ const adaptThemeForDarkMode = (_themeObj: MultiThemeConfig): Partial<MultiThemeConfig> => {
189
233
  // This would implement your dark mode color adaptation logic
190
234
  // You can use the existing ColorManager or implement custom logic
191
235
  return {
192
- colors, // Dark background
193
- surface, // Dark surface
194
- border, // Dark border
195
- divider},
196
- text, // Light text
197
- secondary, // Muted text
198
- muted, // Muted text
199
- inverse, // Dark text for light backgrounds
200
- onPrimary, // Text on primary color
201
- onSecondary, // Text on secondary color
202
- onSurface}
236
+ colors: {
237
+ surface: {
238
+ background: '#0f172a', // Dark background
239
+ surface: '#1e293b', // Dark surface
240
+ border: '#334155', // Dark border
241
+ divider: '#475569' // Dark divider
242
+ },
243
+ text: {
244
+ primary: '#f8fafc', // Light text
245
+ secondary: '#cbd5e1', // Muted text
246
+ muted: '#94a3b8', // Muted text
247
+ inverse: '#0f172a', // Dark text for light backgrounds
248
+ onPrimary: '#0f172a', // Text on primary color
249
+ onSecondary: '#0f172a', // Text on secondary color
250
+ onSurface: '#f8fafc' // Text on surface
251
+ }
203
252
  // ... other color adaptations
204
253
  } as any // Type assertion to bypass strict typing for now
205
254
  }
@@ -211,7 +260,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
211
260
  // Create themes directory if it doesn't exist
212
261
  const themesDir = resolve(config.root, 'src/styles/themes')
213
262
  if (!existsSync(themesDir)) {
214
- mkdirSync(themesDir, { recursive})
263
+ mkdirSync(themesDir, { recursive: true })
215
264
  }
216
265
 
217
266
  let indexCSS = '/* Theme Index - Import all themes */\n'
@@ -228,7 +277,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
228
277
  const themeOutputPath = resolve(themesDir, themeFileName)
229
278
  writeFileSync(themeOutputPath, themeCSS, 'utf-8')
230
279
 
231
- console.log(`✅ Generated dual-mode CSS for theme} -> ${themeFileName}`)
280
+ console.log(`✅ Generated dual-mode CSS for theme: ${themeObj.meta.name} -> ${themeFileName}`)
232
281
 
233
282
  // Add import to index file
234
283
  indexCSS += `@import './${themeFileName}';\n`
@@ -239,7 +288,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
239
288
  }
240
289
 
241
290
  } catch (error) {
242
- console.error(`❌ Error processing ${themeKey}, error)
291
+ console.error(`❌ Error processing ${themeKey}:`, error)
243
292
  }
244
293
  }
245
294
 
@@ -251,10 +300,10 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
251
300
  const defaultPath = resolve(config.root, 'src/styles/generated-theme-variables.css')
252
301
  writeFileSync(defaultPath, defaultThemeCSS, 'utf-8')
253
302
 
254
- console.log('✅ Theme CSS Generator)
303
+ console.log('✅ Theme CSS Generator: Generated all dual-mode theme files successfully')
255
304
 
256
305
  } catch (error) {
257
- console.error('❌ Theme CSS Generator Error, error)
306
+ console.error('❌ Theme CSS Generator Error:', error)
258
307
  }
259
308
  }
260
309
 
@@ -265,7 +314,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
265
314
  const themesSourceDir = resolve(config.root, 'src/themes/themes')
266
315
 
267
316
  if (!existsSync(themesSourceDir)) {
268
- console.warn('⚠️ Theme CSS Generator)
317
+ console.warn('⚠️ Theme CSS Generator: themes/themes/ directory not found')
269
318
  return
270
319
  }
271
320
 
@@ -273,12 +322,12 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
273
322
  generateAllThemesCSS()
274
323
 
275
324
  } catch (error) {
276
- console.error('❌ Theme CSS Generator Error, error)
325
+ console.error('❌ Theme CSS Generator Error:', error)
277
326
  }
278
327
  }
279
328
 
280
329
  return {
281
- name,
330
+ name: 'theme-css-generator',
282
331
 
283
332
  configResolved(resolvedConfig) {
284
333
  config = resolvedConfig
@@ -292,9 +341,9 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
292
341
  // Use defaultThemes keys instead of hardcoded file paths
293
342
  const themeKeys = Object.keys(defaultThemes)
294
343
  const shouldRegenerate = themeKeys.some(themeKey =>
295
- file.includes(`themes/${themeKey}.js`) ||
296
- file.includes('inheritance.js') ||
297
- file.includes('types.js')
344
+ file.includes(`themes/${themeKey}.ts`) ||
345
+ file.includes('inheritance.ts') ||
346
+ file.includes('types.ts')
298
347
  )
299
348
 
300
349
  if (shouldRegenerate) {
@@ -1,9 +1,47 @@
1
1
  import { resolve } from 'path'
2
2
  import { existsSync, mkdirSync, writeFileSync } from 'fs'
3
- \n`
4
- css += ` src}') format('woff2-variations');\n`
5
- css += ` font-weight} ${maxWeight};\n`
6
- css += ` font-display};\n`
3
+ import type { Plugin } from 'vite'
4
+ import type { MultiThemeConfig } from '../themes/types'
5
+ import { defaultThemes } from '../themes/base-themes'
6
+
7
+ export default function themeCSSGenerator(): Plugin {
8
+ let config: any
9
+
10
+ // Helper function to safely convert values to strings
11
+ const valueToString = (value: any): string => {
12
+ if (Array.isArray(value)) {
13
+ return value.join(', ')
14
+ }
15
+ if (typeof value === 'object' && value !== null) {
16
+ return JSON.stringify(value)
17
+ }
18
+ return String(value)
19
+ }
20
+
21
+ // Helper function to create CSS variable name
22
+ const createCSSVarName = (path: string[]): string => {
23
+ return `--cs-${path.join('-').replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)}`
24
+ }
25
+
26
+ // Generate @font-face declarations from font configuration
27
+ const generateFontFaces = (themeObj: MultiThemeConfig): string => {
28
+ let css = ''
29
+
30
+ if (!themeObj.fonts) return css
31
+
32
+ Object.entries(themeObj.fonts).forEach(([, fontConfig]) => {
33
+ if (fontConfig.source?.type === 'custom' && fontConfig.source.files?.woff2) {
34
+ const { family, source, weights, display } = fontConfig
35
+
36
+ if (weights && Array.isArray(weights) && weights.length > 0) {
37
+ const minWeight = Math.min(...weights)
38
+ const maxWeight = Math.max(...weights)
39
+
40
+ css += `\n@font-face {\n`
41
+ css += ` font-family: '${family}';\n`
42
+ css += ` src: url('${source.files.woff2}') format('woff2-variations');\n`
43
+ css += ` font-weight: ${minWeight} ${maxWeight};\n`
44
+ css += ` font-display: ${display || 'swap'};\n`
7
45
  css += `}\n`
8
46
  }
9
47
  }
@@ -12,10 +50,11 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
12
50
  return css
13
51
  }
14
52
 
15
- // NEW= (obj)=> {
16
- let breakpoints= {}
53
+ // NEW: Extract breakpoints from anywhere in the theme object
54
+ const extractBreakpoints = (obj: any): any => {
55
+ let breakpoints: any = {}
17
56
 
18
- const searchForBreakpoints = (currentObj, currentPath] = []) => {
57
+ const searchForBreakpoints = (currentObj: any, currentPath: string[] = []) => {
19
58
  if (typeof currentObj !== 'object' || currentObj === null) {
20
59
  return
21
60
  }
@@ -39,19 +78,21 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
39
78
  return breakpoints
40
79
  }
41
80
 
42
- // NEW= (breakpoints)=> {
81
+ // NEW: Generate breakpoint CSS variables and @custom-media queries
82
+ const generateBreakpointVariables = (breakpoints: any): string => {
43
83
  let css = ''
44
84
  if (Object.keys(breakpoints).length === 0) { return css }
45
85
 
46
86
  css += ` /* Breakpoint Variables */\n`
47
87
  Object.entries(breakpoints).forEach(([key, value]) => {
48
- css += ` --cs-breakpoints-${key}};\n`
88
+ css += ` --cs-breakpoints-${key}: ${value};\n`
49
89
  })
50
90
  css += '\n'
51
91
 
52
- // NEW= ` /* Custom Media Queries for Breakpoints */\n`
92
+ // NEW: Generate @custom-media queries for use in media queries
93
+ css += ` /* Custom Media Queries for Breakpoints */\n`
53
94
  Object.entries(breakpoints).forEach(([key, value]) => {
54
- css += ` @custom-media --bp-${key} (min-width});\n`
95
+ css += ` @custom-media --bp-${key} (min-width: ${value});\n`
55
96
  })
56
97
  css += '\n'
57
98
 
@@ -59,7 +100,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
59
100
  }
60
101
 
61
102
  // Recursively generate CSS variables from theme object
62
- const generateCSSVariables = (obj, path] = [])=> {
103
+ const generateCSSVariables = (obj: any, path: string[] = []): string => {
63
104
  let css = ''
64
105
 
65
106
  if (typeof obj !== 'object' || obj === null) {
@@ -72,11 +113,11 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
72
113
  if (typeof value === 'string' || typeof value === 'number') {
73
114
  // Generate CSS variable for primitive values
74
115
  const cssVarName = createCSSVarName(currentPath)
75
- css += ` ${cssVarName}};\n`
116
+ css += ` ${cssVarName}: ${value};\n`
76
117
  } else if (Array.isArray(value)) {
77
118
  // Handle arrays (like font weights, tags)
78
119
  const cssVarName = createCSSVarName(currentPath)
79
- css += ` ${cssVarName})};\n`
120
+ css += ` ${cssVarName}: ${valueToString(value)};\n`
80
121
  } else if (typeof value === 'object' && value !== null) {
81
122
  // Recursively process nested objects
82
123
  css += generateCSSVariables(value, currentPath)
@@ -87,24 +128,27 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
87
128
  }
88
129
 
89
130
  // Generate CSS from theme object using structured traversal
90
- const generateSingleThemeCSS = (themeName, themeObj)=> {
131
+ const generateSingleThemeCSS = (themeName: string, themeObj: MultiThemeConfig): string => {
91
132
  // Always generate light + dark mode CSS
92
133
  return generateLightDarkCSS(themeName, themeObj)
93
134
  }
94
135
 
95
136
  // Generate light and dark mode CSS
96
- const generateLightDarkCSS = (themeName, themeObj)=> {
137
+ const generateLightDarkCSS = (themeName: string, themeObj: MultiThemeConfig): string => {
97
138
  let css = `/* ${themeName} Theme - Light & Dark Modes */\n`
98
139
 
99
140
  // Generate @font-face declarations
100
141
  css += generateFontFaces(themeObj)
101
142
 
102
- // NEW= extractBreakpoints(themeObj)
143
+ // NEW: Extract breakpoints from anywhere in the theme
144
+ const breakpoints = extractBreakpoints(themeObj)
103
145
 
104
146
  // Generate light mode variables (default)
105
- css += `= ` /* Light Mode Variables */\n`
147
+ css += `:root {\n`
148
+ css += ` /* Light Mode Variables */\n`
106
149
 
107
- // NEW= generateBreakpointVariables(breakpoints)
150
+ // NEW: Generate breakpoint variables first
151
+ css += generateBreakpointVariables(breakpoints)
108
152
 
109
153
  // Generate all other CSS variables
110
154
  css += generateCSSVariables(themeObj)
@@ -127,7 +171,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
127
171
  }
128
172
 
129
173
  // Generate dark mode colors from explicit color definitions
130
- const generateDarkModeColors = (darkColors)=> {
174
+ const generateDarkModeColors = (darkColors: any): string => {
131
175
  let css = ''
132
176
 
133
177
  Object.entries(darkColors).forEach(([colorKey, colorValue]) => {
@@ -135,12 +179,12 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
135
179
  // Handle nested color objects (like surface, text, etc.)
136
180
  Object.entries(colorValue).forEach(([subKey, subValue]) => {
137
181
  if (typeof subValue === 'string' || typeof subValue === 'number') {
138
- css += ` --cs-colors-${colorKey}-${subKey}};\n`
182
+ css += ` --cs-colors-${colorKey}-${subKey}: ${subValue};\n`
139
183
  }
140
184
  })
141
185
  } else if (typeof colorValue === 'string' || typeof colorValue === 'number') {
142
186
  // Handle direct color values
143
- css += ` --cs-colors-${colorKey}};\n`
187
+ css += ` --cs-colors-${colorKey}: ${colorValue};\n`
144
188
  }
145
189
  })
146
190
 
@@ -148,7 +192,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
148
192
  }
149
193
 
150
194
  // Generate dark mode variables by adapting light mode colors
151
- const generateDarkModeVariables = (themeObj)=> {
195
+ const generateDarkModeVariables = (themeObj: MultiThemeConfig): string => {
152
196
  // Create a dark variant of the theme by adapting colors
153
197
  const darkTheme = adaptThemeForDarkMode(themeObj)
154
198
 
@@ -162,44 +206,49 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
162
206
  // Handle nested color objects (like surface, text, etc.)
163
207
  Object.entries(colorValue).forEach(([subKey, subValue]) => {
164
208
  if (typeof subValue === 'string' || typeof subValue === 'number') {
165
- css += ` --cs-colors-${colorKey}-${subKey}};\n`
209
+ css += ` --cs-colors-${colorKey}-${subKey}: ${subValue};\n`
166
210
  }
167
211
  })
168
212
  } else if (typeof colorValue === 'string' || typeof colorValue === 'number') {
169
213
  // Handle direct color values
170
- css += ` --cs-colors-${colorKey}};\n`
214
+ css += ` --cs-colors-${colorKey}: ${colorValue};\n`
171
215
  }
172
216
  })
173
217
  }
174
218
 
175
219
  // Add some basic dark mode variables for testing
176
- css += ` --cs-colors-surface-background;\n`
177
- css += ` --cs-colors-surface-surface;\n`
178
- css += ` --cs-colors-surface-border;\n`
179
- css += ` --cs-colors-surface-divider;\n`
180
- css += ` --cs-colors-text-primary;\n`
181
- css += ` --cs-colors-text-secondary;\n`
182
- css += ` --cs-colors-text-muted;\n`
220
+ css += ` --cs-colors-surface-background: #0f172a;\n`
221
+ css += ` --cs-colors-surface-surface: #1e293b;\n`
222
+ css += ` --cs-colors-surface-border: #334155;\n`
223
+ css += ` --cs-colors-surface-divider: #475569;\n`
224
+ css += ` --cs-colors-text-primary: #f8fafc;\n`
225
+ css += ` --cs-colors-text-secondary: #cbd5e1;\n`
226
+ css += ` --cs-colors-text-muted: #94a3b8;\n`
183
227
 
184
228
  return css
185
229
  }
186
230
 
187
231
  // Adapt theme for dark mode
188
- const adaptThemeForDarkMode = (_themeObj)=> {
232
+ const adaptThemeForDarkMode = (_themeObj: MultiThemeConfig): Partial<MultiThemeConfig> => {
189
233
  // This would implement your dark mode color adaptation logic
190
234
  // You can use the existing ColorManager or implement custom logic
191
235
  return {
192
- colors, // Dark background
193
- surface, // Dark surface
194
- border, // Dark border
195
- divider},
196
- text, // Light text
197
- secondary, // Muted text
198
- muted, // Muted text
199
- inverse, // Dark text for light backgrounds
200
- onPrimary, // Text on primary color
201
- onSecondary, // Text on secondary color
202
- onSurface}
236
+ colors: {
237
+ surface: {
238
+ background: '#0f172a', // Dark background
239
+ surface: '#1e293b', // Dark surface
240
+ border: '#334155', // Dark border
241
+ divider: '#475569' // Dark divider
242
+ },
243
+ text: {
244
+ primary: '#f8fafc', // Light text
245
+ secondary: '#cbd5e1', // Muted text
246
+ muted: '#94a3b8', // Muted text
247
+ inverse: '#0f172a', // Dark text for light backgrounds
248
+ onPrimary: '#0f172a', // Text on primary color
249
+ onSecondary: '#0f172a', // Text on secondary color
250
+ onSurface: '#f8fafc' // Text on surface
251
+ }
203
252
  // ... other color adaptations
204
253
  } as any // Type assertion to bypass strict typing for now
205
254
  }
@@ -211,7 +260,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
211
260
  // Create themes directory if it doesn't exist
212
261
  const themesDir = resolve(config.root, 'src/styles/themes')
213
262
  if (!existsSync(themesDir)) {
214
- mkdirSync(themesDir, { recursive})
263
+ mkdirSync(themesDir, { recursive: true })
215
264
  }
216
265
 
217
266
  let indexCSS = '/* Theme Index - Import all themes */\n'
@@ -228,7 +277,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
228
277
  const themeOutputPath = resolve(themesDir, themeFileName)
229
278
  writeFileSync(themeOutputPath, themeCSS, 'utf-8')
230
279
 
231
- console.log(`✅ Generated dual-mode CSS for theme} -> ${themeFileName}`)
280
+ console.log(`✅ Generated dual-mode CSS for theme: ${themeObj.meta.name} -> ${themeFileName}`)
232
281
 
233
282
  // Add import to index file
234
283
  indexCSS += `@import './${themeFileName}';\n`
@@ -239,7 +288,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
239
288
  }
240
289
 
241
290
  } catch (error) {
242
- console.error(`❌ Error processing ${themeKey}, error)
291
+ console.error(`❌ Error processing ${themeKey}:`, error)
243
292
  }
244
293
  }
245
294
 
@@ -251,10 +300,10 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
251
300
  const defaultPath = resolve(config.root, 'src/styles/generated-theme-variables.css')
252
301
  writeFileSync(defaultPath, defaultThemeCSS, 'utf-8')
253
302
 
254
- console.log('✅ Theme CSS Generator)
303
+ console.log('✅ Theme CSS Generator: Generated all dual-mode theme files successfully')
255
304
 
256
305
  } catch (error) {
257
- console.error('❌ Theme CSS Generator Error, error)
306
+ console.error('❌ Theme CSS Generator Error:', error)
258
307
  }
259
308
  }
260
309
 
@@ -265,7 +314,7 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
265
314
  const themesSourceDir = resolve(config.root, 'src/themes/themes')
266
315
 
267
316
  if (!existsSync(themesSourceDir)) {
268
- console.warn('⚠️ Theme CSS Generator)
317
+ console.warn('⚠️ Theme CSS Generator: themes/themes/ directory not found')
269
318
  return
270
319
  }
271
320
 
@@ -273,12 +322,12 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
273
322
  generateAllThemesCSS()
274
323
 
275
324
  } catch (error) {
276
- console.error('❌ Theme CSS Generator Error, error)
325
+ console.error('❌ Theme CSS Generator Error:', error)
277
326
  }
278
327
  }
279
328
 
280
329
  return {
281
- name,
330
+ name: 'theme-css-generator',
282
331
 
283
332
  configResolved(resolvedConfig) {
284
333
  config = resolvedConfig
@@ -292,9 +341,9 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'
292
341
  // Use defaultThemes keys instead of hardcoded file paths
293
342
  const themeKeys = Object.keys(defaultThemes)
294
343
  const shouldRegenerate = themeKeys.some(themeKey =>
295
- file.includes(`themes/${themeKey}.js`) ||
296
- file.includes('inheritance.js') ||
297
- file.includes('types.js')
344
+ file.includes(`themes/${themeKey}.ts`) ||
345
+ file.includes('inheritance.ts') ||
346
+ file.includes('types.ts')
298
347
  )
299
348
 
300
349
  if (shouldRegenerate) {
@@ -3,16 +3,16 @@ import { StanDesignTheme } from './theme';
3
3
 
4
4
  // Simple theme provider - in real implementation would integrate with core provider
5
5
  export interface StanDesignProviderProps {
6
- children;
7
- theme?;
6
+ children: React.ReactNode;
7
+ theme?: typeof StanDesignTheme;
8
8
  }
9
9
 
10
- export const StanDesignProvider= ({
10
+ export const StanDesignProvider: React.FC<StanDesignProviderProps> = ({
11
11
  children,
12
12
  theme = StanDesignTheme,
13
13
  ...props
14
14
  }) => (
15
- <div data-theme="stan-design" style={{ '--theme-name'} as React.CSSProperties}>
15
+ <div data-theme="stan-design" style={{ '--theme-name': 'stan-design' } as React.CSSProperties}>
16
16
  {children}
17
17
  </div>
18
18
  );