@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.
- package/CHANGELOG.md +1 -1
- package/dist/components/ui/accessibility-demo.esm.js +30 -24
- package/dist/components/ui/accessibility-demo.js +30 -24
- package/dist/components/ui/advanced-component-architecture-demo.esm.js +235 -179
- package/dist/components/ui/advanced-component-architecture-demo.js +235 -179
- package/dist/components/ui/advanced-transition-system-demo.esm.js +110 -64
- package/dist/components/ui/advanced-transition-system-demo.js +110 -64
- package/dist/components/ui/advanced-transition-system.esm.js +166 -122
- package/dist/components/ui/advanced-transition-system.js +166 -122
- package/dist/components/ui/animation/animated-container.esm.js +52 -29
- package/dist/components/ui/animation/animated-container.js +52 -29
- package/dist/components/ui/animation/staggered-container.esm.js +18 -9
- package/dist/components/ui/animation/staggered-container.js +18 -9
- package/dist/components/ui/animation-demo.esm.js +67 -35
- package/dist/components/ui/animation-demo.js +67 -35
- package/dist/components/ui/badge.esm.js +9 -6
- package/dist/components/ui/badge.js +9 -6
- package/dist/components/ui/battery-conscious-animation-demo.esm.js +122 -87
- package/dist/components/ui/battery-conscious-animation-demo.js +122 -87
- package/dist/components/ui/border-radius-shadow-demo.esm.js +23 -12
- package/dist/components/ui/border-radius-shadow-demo.js +23 -12
- package/dist/components/ui/button.esm.js +8 -2
- package/dist/components/ui/button.js +8 -2
- package/dist/components/ui/card.esm.js +33 -8
- package/dist/components/ui/card.js +33 -8
- package/dist/components/ui/checkbox.esm.js +3 -3
- package/dist/components/ui/checkbox.js +3 -3
- package/dist/components/ui/color-preview.esm.js +68 -45
- package/dist/components/ui/color-preview.js +68 -45
- package/dist/components/ui/data-display/chart.esm.js +112 -84
- package/dist/components/ui/data-display/chart.js +112 -84
- package/dist/components/ui/data-display/data-grid-simple.esm.js +1 -1
- package/dist/components/ui/data-display/data-grid-simple.js +1 -1
- package/dist/components/ui/data-display/data-grid.esm.js +80 -67
- package/dist/components/ui/data-display/data-grid.js +80 -67
- package/dist/components/ui/data-display/list.esm.js +53 -45
- package/dist/components/ui/data-display/list.js +53 -45
- package/dist/components/ui/data-display/table.esm.js +62 -54
- package/dist/components/ui/data-display/table.js +62 -54
- package/dist/components/ui/data-display/timeline.esm.js +39 -34
- package/dist/components/ui/data-display/timeline.js +39 -34
- package/dist/components/ui/data-display/tree.esm.js +116 -84
- package/dist/components/ui/data-display/tree.js +116 -84
- package/dist/components/ui/data-display/types.esm.js +389 -364
- package/dist/components/ui/data-display/types.js +389 -364
- package/dist/components/ui/enterprise-mobile-experience-demo.esm.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience-demo.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience.esm.js +124 -73
- package/dist/components/ui/enterprise-mobile-experience.js +124 -73
- package/dist/components/ui/feedback/alert.esm.js +22 -15
- package/dist/components/ui/feedback/alert.js +22 -15
- package/dist/components/ui/feedback/progress.esm.js +47 -24
- package/dist/components/ui/feedback/progress.js +47 -24
- package/dist/components/ui/feedback/skeleton.esm.js +39 -29
- package/dist/components/ui/feedback/skeleton.js +39 -29
- package/dist/components/ui/feedback/toast.esm.js +62 -38
- package/dist/components/ui/feedback/toast.js +62 -38
- package/dist/components/ui/feedback/types.esm.js +83 -83
- package/dist/components/ui/feedback/types.js +83 -83
- package/dist/components/ui/font-preview.esm.js +41 -39
- package/dist/components/ui/font-preview.js +41 -39
- package/dist/components/ui/form-demo.esm.js +150 -113
- package/dist/components/ui/form-demo.js +150 -113
- package/dist/components/ui/hardware-acceleration-demo.esm.js +137 -87
- package/dist/components/ui/hardware-acceleration-demo.js +137 -87
- package/dist/components/ui/input.esm.js +4 -1
- package/dist/components/ui/input.js +4 -1
- package/dist/components/ui/layout-demo.esm.js +81 -56
- package/dist/components/ui/layout-demo.js +81 -56
- package/dist/components/ui/layouts/adaptive-layout.esm.js +27 -8
- package/dist/components/ui/layouts/adaptive-layout.js +27 -8
- package/dist/components/ui/layouts/desktop-layout.esm.js +39 -19
- package/dist/components/ui/layouts/desktop-layout.js +39 -19
- package/dist/components/ui/layouts/mobile-layout.esm.js +19 -9
- package/dist/components/ui/layouts/mobile-layout.js +19 -9
- package/dist/components/ui/layouts/tablet-layout.esm.js +28 -14
- package/dist/components/ui/layouts/tablet-layout.js +28 -14
- package/dist/components/ui/mobile-form-validation.esm.js +120 -87
- package/dist/components/ui/mobile-form-validation.js +120 -87
- package/dist/components/ui/mobile-input-demo.esm.js +19 -13
- package/dist/components/ui/mobile-input-demo.js +19 -13
- package/dist/components/ui/mobile-input.esm.js +185 -120
- package/dist/components/ui/mobile-input.js +185 -120
- package/dist/components/ui/mobile-skeleton-loading-demo.esm.js +128 -111
- package/dist/components/ui/mobile-skeleton-loading-demo.js +128 -111
- package/dist/components/ui/navigation/breadcrumb.esm.js +17 -14
- package/dist/components/ui/navigation/breadcrumb.js +17 -14
- package/dist/components/ui/navigation/index.esm.js +0 -1
- package/dist/components/ui/navigation/index.js +0 -1
- package/dist/components/ui/navigation/menu.esm.js +49 -35
- package/dist/components/ui/navigation/menu.js +49 -35
- package/dist/components/ui/navigation/navigation-demo.esm.js +81 -74
- package/dist/components/ui/navigation/navigation-demo.js +81 -74
- package/dist/components/ui/navigation/pagination.esm.js +62 -50
- package/dist/components/ui/navigation/pagination.js +62 -50
- package/dist/components/ui/navigation/sidebar.esm.js +56 -42
- package/dist/components/ui/navigation/sidebar.js +56 -42
- package/dist/components/ui/navigation/stepper.esm.js +34 -23
- package/dist/components/ui/navigation/stepper.js +34 -23
- package/dist/components/ui/navigation/tabs.esm.js +32 -21
- package/dist/components/ui/navigation/tabs.js +32 -21
- package/dist/components/ui/navigation/types.esm.js +196 -195
- package/dist/components/ui/navigation/types.js +196 -195
- package/dist/components/ui/overlay/backdrop.esm.js +17 -16
- package/dist/components/ui/overlay/backdrop.js +17 -16
- package/dist/components/ui/overlay/focus-manager.esm.js +21 -19
- package/dist/components/ui/overlay/focus-manager.js +21 -19
- package/dist/components/ui/overlay/index.esm.js +0 -2
- package/dist/components/ui/overlay/index.js +0 -2
- package/dist/components/ui/overlay/modal.esm.js +38 -34
- package/dist/components/ui/overlay/modal.js +38 -34
- package/dist/components/ui/overlay/overlay-manager.esm.js +25 -20
- package/dist/components/ui/overlay/overlay-manager.js +25 -20
- package/dist/components/ui/overlay/popover.esm.js +74 -58
- package/dist/components/ui/overlay/popover.js +74 -58
- package/dist/components/ui/overlay/portal.esm.js +7 -7
- package/dist/components/ui/overlay/portal.js +7 -7
- package/dist/components/ui/overlay/tooltip.esm.js +54 -39
- package/dist/components/ui/overlay/tooltip.js +54 -39
- package/dist/components/ui/overlay/types.esm.js +132 -131
- package/dist/components/ui/overlay/types.js +132 -131
- package/dist/components/ui/performance-demo.esm.js +135 -88
- package/dist/components/ui/performance-demo.js +135 -88
- package/dist/components/ui/semantic-input-system-demo.esm.js +117 -80
- package/dist/components/ui/semantic-input-system-demo.js +117 -80
- package/dist/components/ui/theme-customizer.esm.js +84 -52
- package/dist/components/ui/theme-customizer.js +84 -52
- package/dist/components/ui/theme-preview.esm.js +95 -43
- package/dist/components/ui/theme-preview.js +95 -43
- package/dist/components/ui/theme-switcher.esm.js +70 -44
- package/dist/components/ui/theme-switcher.js +70 -44
- package/dist/components/ui/theme-toggle.esm.js +3 -3
- package/dist/components/ui/theme-toggle.js +3 -3
- package/dist/components/ui/token-demo.esm.js +33 -21
- package/dist/components/ui/token-demo.js +33 -21
- package/dist/components/ui/touch-demo.esm.js +102 -73
- package/dist/components/ui/touch-demo.js +102 -73
- package/dist/components/ui/touch-friendly-interface-demo.esm.js +102 -64
- package/dist/components/ui/touch-friendly-interface-demo.js +102 -64
- package/dist/components/ui/touch-friendly-interface.esm.js +85 -61
- package/dist/components/ui/touch-friendly-interface.js +85 -61
- package/dist/hooks/use-accessibility-support.esm.js +115 -85
- package/dist/hooks/use-accessibility-support.js +115 -85
- package/dist/hooks/use-adaptive-layout.esm.js +56 -33
- package/dist/hooks/use-adaptive-layout.js +56 -33
- package/dist/hooks/use-advanced-patterns.esm.js +57 -42
- package/dist/hooks/use-advanced-patterns.js +57 -42
- package/dist/hooks/use-advanced-transition-system.esm.js +112 -71
- package/dist/hooks/use-advanced-transition-system.js +112 -71
- package/dist/hooks/use-animation-profile.esm.js +63 -34
- package/dist/hooks/use-animation-profile.js +63 -34
- package/dist/hooks/use-battery-animations.esm.js +80 -55
- package/dist/hooks/use-battery-animations.js +80 -55
- package/dist/hooks/use-battery-conscious-loading.esm.js +166 -123
- package/dist/hooks/use-battery-conscious-loading.js +166 -123
- package/dist/hooks/use-battery-optimization.esm.js +78 -55
- package/dist/hooks/use-battery-optimization.js +78 -55
- package/dist/hooks/use-battery-status.esm.js +73 -51
- package/dist/hooks/use-battery-status.js +73 -51
- package/dist/hooks/use-component-performance.esm.js +62 -47
- package/dist/hooks/use-component-performance.js +62 -47
- package/dist/hooks/use-device-loading-states.esm.js +152 -109
- package/dist/hooks/use-device-loading-states.js +152 -109
- package/dist/hooks/use-device.esm.js +25 -14
- package/dist/hooks/use-device.js +25 -14
- package/dist/hooks/use-enterprise-mobile-experience.esm.js +137 -88
- package/dist/hooks/use-enterprise-mobile-experience.js +137 -88
- package/dist/hooks/use-form-feedback.esm.js +124 -81
- package/dist/hooks/use-form-feedback.js +124 -81
- package/dist/hooks/use-form-performance.esm.js +127 -92
- package/dist/hooks/use-form-performance.js +127 -92
- package/dist/hooks/use-frame-rate.esm.js +56 -37
- package/dist/hooks/use-frame-rate.js +56 -37
- package/dist/hooks/use-gestures.esm.js +96 -72
- package/dist/hooks/use-gestures.js +96 -72
- package/dist/hooks/use-hardware-acceleration.esm.js +65 -37
- package/dist/hooks/use-hardware-acceleration.js +65 -37
- package/dist/hooks/use-input-accessibility.esm.js +157 -119
- package/dist/hooks/use-input-accessibility.js +157 -119
- package/dist/hooks/use-input-performance.esm.js +139 -104
- package/dist/hooks/use-input-performance.js +139 -104
- package/dist/hooks/use-layout-performance.esm.js +50 -29
- package/dist/hooks/use-layout-performance.js +50 -29
- package/dist/hooks/use-loading-accessibility.esm.js +209 -169
- package/dist/hooks/use-loading-accessibility.js +209 -169
- package/dist/hooks/use-loading-performance.esm.js +117 -93
- package/dist/hooks/use-loading-performance.js +117 -93
- package/dist/hooks/use-memory-usage.esm.js +57 -38
- package/dist/hooks/use-memory-usage.js +57 -38
- package/dist/hooks/use-mobile-form-layout.esm.js +111 -74
- package/dist/hooks/use-mobile-form-layout.js +111 -74
- package/dist/hooks/use-mobile-form-validation.esm.js +211 -144
- package/dist/hooks/use-mobile-form-validation.js +211 -144
- package/dist/hooks/use-mobile-keyboard-optimization.esm.js +154 -113
- package/dist/hooks/use-mobile-keyboard-optimization.js +154 -113
- package/dist/hooks/use-mobile-layout.esm.js +73 -51
- package/dist/hooks/use-mobile-layout.js +73 -51
- package/dist/hooks/use-mobile-optimization.esm.js +72 -44
- package/dist/hooks/use-mobile-optimization.js +72 -44
- package/dist/hooks/use-mobile-skeleton.esm.js +97 -64
- package/dist/hooks/use-mobile-skeleton.js +97 -64
- package/dist/hooks/use-mobile-touch.esm.js +128 -93
- package/dist/hooks/use-mobile-touch.js +128 -93
- package/dist/hooks/use-performance-throttling.esm.js +72 -48
- package/dist/hooks/use-performance-throttling.js +72 -48
- package/dist/hooks/use-performance.esm.js +90 -52
- package/dist/hooks/use-performance.js +90 -52
- package/dist/hooks/use-reusable-architecture.esm.js +94 -65
- package/dist/hooks/use-reusable-architecture.js +94 -65
- package/dist/hooks/use-semantic-input-types.esm.js +166 -124
- package/dist/hooks/use-semantic-input-types.js +166 -124
- package/dist/hooks/use-semantic-input.esm.js +178 -126
- package/dist/hooks/use-semantic-input.js +178 -126
- package/dist/hooks/use-tablet-layout.esm.js +67 -38
- package/dist/hooks/use-tablet-layout.js +67 -38
- package/dist/hooks/use-touch-friendly-input.esm.js +193 -149
- package/dist/hooks/use-touch-friendly-input.js +193 -149
- package/dist/hooks/use-touch-friendly-interface.esm.js +99 -67
- package/dist/hooks/use-touch-friendly-interface.js +99 -67
- package/dist/hooks/use-touch-optimization.esm.js +99 -72
- package/dist/hooks/use-touch-optimization.js +99 -72
- package/dist/index.esm.js +157 -281
- package/dist/index.js +157 -281
- package/dist/lib/utils.esm.js +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/plugins/theme-css-generator.esm.js +104 -55
- package/dist/plugins/theme-css-generator.js +104 -55
- package/dist/provider.esm.js +4 -4
- package/dist/provider.js +4 -4
- package/dist/styles.css +1 -1
- package/dist/theme.esm.js +633 -468
- package/dist/theme.js +633 -468
- package/dist/themes/ThemeContext.esm.js +15 -15
- package/dist/themes/ThemeContext.js +15 -15
- package/dist/themes/ThemeProvider.esm.js +25 -22
- package/dist/themes/ThemeProvider.js +25 -22
- package/dist/themes/accessibility.esm.js +147 -108
- package/dist/themes/accessibility.js +147 -108
- package/dist/themes/aria-patterns.esm.js +198 -162
- package/dist/themes/aria-patterns.js +198 -162
- package/dist/themes/base-themes.esm.js +14 -11
- package/dist/themes/base-themes.js +14 -11
- package/dist/themes/colorManager.esm.js +101 -83
- package/dist/themes/colorManager.js +101 -83
- package/dist/themes/examples/dark-theme.esm.js +133 -103
- package/dist/themes/examples/dark-theme.js +133 -103
- package/dist/themes/examples/minimal-theme.esm.js +83 -61
- package/dist/themes/examples/minimal-theme.js +83 -61
- package/dist/themes/focus-management.esm.js +202 -143
- package/dist/themes/focus-management.js +202 -143
- package/dist/themes/fontLoader.esm.js +28 -19
- package/dist/themes/fontLoader.js +28 -19
- package/dist/themes/high-contrast.esm.js +152 -104
- package/dist/themes/high-contrast.js +152 -104
- package/dist/themes/index.esm.js +1 -1
- package/dist/themes/index.js +1 -1
- package/dist/themes/inheritance.esm.js +35 -27
- package/dist/themes/inheritance.js +35 -27
- package/dist/themes/keyboard-navigation.esm.js +152 -123
- package/dist/themes/keyboard-navigation.js +152 -123
- package/dist/themes/motion-reduction.esm.js +193 -133
- package/dist/themes/motion-reduction.js +193 -133
- package/dist/themes/navigation.esm.js +146 -146
- package/dist/themes/navigation.js +146 -146
- package/dist/themes/screen-reader.esm.js +159 -94
- package/dist/themes/screen-reader.js +159 -94
- package/dist/themes/systemThemeDetector.esm.js +42 -34
- package/dist/themes/systemThemeDetector.js +42 -34
- package/dist/themes/themeCSSUpdater.esm.js +21 -9
- package/dist/themes/themeCSSUpdater.js +21 -9
- package/dist/themes/themePersistence.esm.js +68 -47
- package/dist/themes/themePersistence.js +68 -47
- package/dist/themes/themes/stan-design.esm.js +633 -468
- package/dist/themes/themes/stan-design.js +633 -468
- package/dist/themes/types.esm.js +301 -287
- package/dist/themes/types.js +301 -287
- package/dist/themes/useSystemTheme.esm.js +4 -4
- package/dist/themes/useSystemTheme.js +4 -4
- package/dist/themes/useTheme.esm.js +4 -4
- package/dist/themes/useTheme.js +4 -4
- package/dist/themes/validation.esm.js +128 -77
- package/dist/themes/validation.js +128 -77
- package/dist/tokens/index.esm.js +1 -2
- package/dist/tokens/index.js +1 -2
- package/dist/tokens/tokenExporter.esm.js +87 -61
- package/dist/tokens/tokenExporter.js +87 -61
- package/dist/tokens/tokenGenerator.esm.js +86 -77
- package/dist/tokens/tokenGenerator.js +86 -77
- package/dist/tokens/tokenManager.esm.js +64 -51
- package/dist/tokens/tokenManager.js +64 -51
- package/dist/tokens/tokenValidator.esm.js +193 -147
- package/dist/tokens/tokenValidator.js +193 -147
- package/dist/tokens/types.esm.js +49 -35
- package/dist/tokens/types.js +49 -35
- package/dist/utils/bundle-analyzer.esm.js +83 -65
- package/dist/utils/bundle-analyzer.js +83 -65
- package/dist/utils/bundle-splitting.esm.js +142 -117
- package/dist/utils/bundle-splitting.js +142 -117
- package/dist/utils/lazy-loading.esm.js +132 -106
- package/dist/utils/lazy-loading.js +132 -106
- package/dist/utils/performance-monitor.esm.js +170 -129
- package/dist/utils/performance-monitor.js +170 -129
- package/dist/utils/tree-shaking.esm.js +69 -61
- package/dist/utils/tree-shaking.js +69 -61
- package/package.json +1 -1
- 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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
16
|
-
|
|
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
|
|
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
|
|
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
|
|
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 +=
|
|
147
|
+
css += `:root {\n`
|
|
148
|
+
css += ` /* Light Mode Variables */\n`
|
|
106
149
|
|
|
107
|
-
// NEW
|
|
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
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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}
|
|
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}.
|
|
296
|
-
file.includes('inheritance.
|
|
297
|
-
file.includes('types.
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
16
|
-
|
|
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
|
|
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
|
|
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
|
|
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 +=
|
|
147
|
+
css += `:root {\n`
|
|
148
|
+
css += ` /* Light Mode Variables */\n`
|
|
106
149
|
|
|
107
|
-
// NEW
|
|
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
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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}
|
|
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}.
|
|
296
|
-
file.includes('inheritance.
|
|
297
|
-
file.includes('types.
|
|
344
|
+
file.includes(`themes/${themeKey}.ts`) ||
|
|
345
|
+
file.includes('inheritance.ts') ||
|
|
346
|
+
file.includes('types.ts')
|
|
298
347
|
)
|
|
299
348
|
|
|
300
349
|
if (shouldRegenerate) {
|
package/dist/provider.esm.js
CHANGED
|
@@ -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
|
);
|