@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
|
@@ -5,7 +5,8 @@ import { defaultTheme } from './themes/default';
|
|
|
5
5
|
* Deep merge utility for theme inheritance
|
|
6
6
|
* Recursively merges theme configuration with default values
|
|
7
7
|
*/
|
|
8
|
-
function deepMerge<T extends Record<string, any>>(target, source)
|
|
8
|
+
function deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {
|
|
9
|
+
const result = { ...target };
|
|
9
10
|
|
|
10
11
|
for (const key in source) {
|
|
11
12
|
if (source[key] !== undefined) {
|
|
@@ -33,26 +34,28 @@ function deepMerge<T extends Record<string, any>>(target, source)= { ...target }
|
|
|
33
34
|
* Apply theme inheritance by merging with default theme
|
|
34
35
|
* Any undefined values in the theme will be filled with defaults
|
|
35
36
|
*/
|
|
36
|
-
export function applyThemeInheritance(theme)
|
|
37
|
+
export function applyThemeInheritance(theme: Partial<MultiThemeConfig>): MultiThemeConfig {
|
|
38
|
+
return deepMerge(defaultTheme, theme);
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
/**
|
|
40
42
|
* Create a theme with inheritance support
|
|
41
43
|
* This is the recommended way to define new themes
|
|
42
44
|
*/
|
|
43
|
-
export function createTheme(themeConfig)
|
|
45
|
+
export function createTheme(themeConfig: Partial<MultiThemeConfig>): MultiThemeConfig {
|
|
46
|
+
return applyThemeInheritance(themeConfig);
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
/**
|
|
47
50
|
* Validate that a theme has all required properties
|
|
48
51
|
* Returns an array of missing property paths
|
|
49
52
|
*/
|
|
50
|
-
export function validateThemeCompleteness(theme)] {
|
|
51
|
-
const missingPaths] = [];
|
|
53
|
+
export function validateThemeCompleteness(theme: MultiThemeConfig): string[] {
|
|
54
|
+
const missingPaths: string[] = [];
|
|
52
55
|
|
|
53
|
-
function checkObject(obj, defaultObj, path= '') {
|
|
56
|
+
function checkObject(obj: any, defaultObj: any, path: string = '') {
|
|
54
57
|
for (const key in defaultObj) {
|
|
55
|
-
const currentPath = path ? `${path}.${key}` ;
|
|
58
|
+
const currentPath = path ? `${path}.${key}` : key;
|
|
56
59
|
|
|
57
60
|
if (obj[key] === undefined) {
|
|
58
61
|
missingPaths.push(currentPath);
|
|
@@ -76,12 +79,12 @@ export function validateThemeCompleteness(theme)] {
|
|
|
76
79
|
*/
|
|
77
80
|
export const themeInheritanceManager = {
|
|
78
81
|
// Internal theme registry
|
|
79
|
-
_themes, MultiThemeConfig>(),
|
|
82
|
+
_themes: new Map<string, MultiThemeConfig>(),
|
|
80
83
|
|
|
81
84
|
/**
|
|
82
85
|
* Apply inheritance to a theme
|
|
83
86
|
*/
|
|
84
|
-
applyInheritance,
|
|
87
|
+
applyInheritance: applyThemeInheritance,
|
|
85
88
|
|
|
86
89
|
/**
|
|
87
90
|
* Create a new theme with inheritance
|
|
@@ -91,17 +94,17 @@ export const themeInheritanceManager = {
|
|
|
91
94
|
/**
|
|
92
95
|
* Get the default theme
|
|
93
96
|
*/
|
|
94
|
-
getDefaultTheme) => defaultTheme,
|
|
97
|
+
getDefaultTheme: () => defaultTheme,
|
|
95
98
|
|
|
96
99
|
/**
|
|
97
100
|
* Validate theme completeness
|
|
98
101
|
*/
|
|
99
|
-
validateCompleteness,
|
|
102
|
+
validateCompleteness: validateThemeCompleteness,
|
|
100
103
|
|
|
101
104
|
/**
|
|
102
105
|
* Check if a theme has inheritance applied
|
|
103
106
|
*/
|
|
104
|
-
hasInheritance)=> {
|
|
107
|
+
hasInheritance: (theme: MultiThemeConfig): boolean => {
|
|
105
108
|
const missing = validateThemeCompleteness(theme);
|
|
106
109
|
return missing.length === 0;
|
|
107
110
|
},
|
|
@@ -109,9 +112,9 @@ export const themeInheritanceManager = {
|
|
|
109
112
|
/**
|
|
110
113
|
* Get theme property with fallback to default
|
|
111
114
|
*/
|
|
112
|
-
getProperty, path, fallback
|
|
115
|
+
getProperty: <T>(theme: MultiThemeConfig, path: string, fallback?: T): T => {
|
|
113
116
|
const keys = path.split('.');
|
|
114
|
-
let current= theme;
|
|
117
|
+
let current: any = theme;
|
|
115
118
|
|
|
116
119
|
for (const key of keys) {
|
|
117
120
|
if (current && typeof current === 'object' && key in current) {
|
|
@@ -136,7 +139,7 @@ export const themeInheritanceManager = {
|
|
|
136
139
|
/**
|
|
137
140
|
* Register a theme with inheritance applied
|
|
138
141
|
*/
|
|
139
|
-
registerTheme, theme)=> {
|
|
142
|
+
registerTheme: (name: string, theme: Partial<MultiThemeConfig>): MultiThemeConfig => {
|
|
140
143
|
const themeWithInheritance = applyThemeInheritance(theme);
|
|
141
144
|
themeInheritanceManager._themes.set(name, themeWithInheritance);
|
|
142
145
|
return themeWithInheritance;
|
|
@@ -145,7 +148,7 @@ export const themeInheritanceManager = {
|
|
|
145
148
|
/**
|
|
146
149
|
* Get complete theme with inheritance applied
|
|
147
150
|
*/
|
|
148
|
-
getCompleteTheme)=> {
|
|
151
|
+
getCompleteTheme: (name: string): CompleteThemeConfig | null => {
|
|
149
152
|
// First try to get the registered theme
|
|
150
153
|
const registeredTheme = themeInheritanceManager._themes.get(name);
|
|
151
154
|
if (registeredTheme) {
|
|
@@ -168,14 +171,14 @@ export const themeInheritanceManager = {
|
|
|
168
171
|
/**
|
|
169
172
|
* Get all registered theme names
|
|
170
173
|
*/
|
|
171
|
-
getRegisteredThemeNames)] => {
|
|
174
|
+
getRegisteredThemeNames: (): string[] => {
|
|
172
175
|
return Array.from(themeInheritanceManager._themes.keys());
|
|
173
176
|
},
|
|
174
177
|
|
|
175
178
|
/**
|
|
176
179
|
* Check if a theme is registered
|
|
177
180
|
*/
|
|
178
|
-
isThemeRegistered)=> {
|
|
181
|
+
isThemeRegistered: (name: string): boolean => {
|
|
179
182
|
return themeInheritanceManager._themes.has(name);
|
|
180
183
|
}
|
|
181
184
|
};
|
|
@@ -184,8 +187,8 @@ export const themeInheritanceManager = {
|
|
|
184
187
|
* Theme inheritance decorator
|
|
185
188
|
* Use this to automatically apply inheritance when defining themes
|
|
186
189
|
*/
|
|
187
|
-
export function withInheritance(themeConfig) {
|
|
188
|
-
return function <T extends { new (...args])}>(constructor) {
|
|
190
|
+
export function withInheritance(themeConfig: Partial<MultiThemeConfig>) {
|
|
191
|
+
return function <T extends { new (...args: any[]): any }>(constructor: T) {
|
|
189
192
|
return class extends constructor {
|
|
190
193
|
static theme = applyThemeInheritance(themeConfig);
|
|
191
194
|
};
|
|
@@ -196,24 +199,29 @@ export function withInheritance(themeConfig) {
|
|
|
196
199
|
* Partial theme type for theme definitions
|
|
197
200
|
* Use this when you only want to define specific parts of a theme
|
|
198
201
|
*/
|
|
199
|
-
|
|
202
|
+
export type PartialThemeConfig = Partial<MultiThemeConfig>;
|
|
200
203
|
|
|
201
204
|
/**
|
|
202
205
|
* Theme override utility
|
|
203
206
|
* Allows you to override specific parts of an existing theme
|
|
204
207
|
*/
|
|
205
208
|
export function overrideTheme(
|
|
206
|
-
baseTheme,
|
|
207
|
-
overrides
|
|
209
|
+
baseTheme: MultiThemeConfig,
|
|
210
|
+
overrides: Partial<MultiThemeConfig>
|
|
211
|
+
): MultiThemeConfig {
|
|
212
|
+
return deepMerge(baseTheme, overrides);
|
|
208
213
|
}
|
|
209
214
|
|
|
210
215
|
/**
|
|
211
216
|
* Convert MultiThemeConfig to CompleteThemeConfig
|
|
212
217
|
*/
|
|
213
|
-
export function toCompleteThemeConfig(theme)
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
218
|
+
export function toCompleteThemeConfig(theme: MultiThemeConfig): CompleteThemeConfig {
|
|
219
|
+
return {
|
|
220
|
+
...theme,
|
|
221
|
+
validation: {
|
|
222
|
+
isValid: true,
|
|
223
|
+
errors: [],
|
|
224
|
+
warnings: []
|
|
217
225
|
}
|
|
218
226
|
};
|
|
219
227
|
}
|
|
@@ -5,7 +5,8 @@ import { defaultTheme } from './themes/default';
|
|
|
5
5
|
* Deep merge utility for theme inheritance
|
|
6
6
|
* Recursively merges theme configuration with default values
|
|
7
7
|
*/
|
|
8
|
-
function deepMerge<T extends Record<string, any>>(target, source)
|
|
8
|
+
function deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {
|
|
9
|
+
const result = { ...target };
|
|
9
10
|
|
|
10
11
|
for (const key in source) {
|
|
11
12
|
if (source[key] !== undefined) {
|
|
@@ -33,26 +34,28 @@ function deepMerge<T extends Record<string, any>>(target, source)= { ...target }
|
|
|
33
34
|
* Apply theme inheritance by merging with default theme
|
|
34
35
|
* Any undefined values in the theme will be filled with defaults
|
|
35
36
|
*/
|
|
36
|
-
export function applyThemeInheritance(theme)
|
|
37
|
+
export function applyThemeInheritance(theme: Partial<MultiThemeConfig>): MultiThemeConfig {
|
|
38
|
+
return deepMerge(defaultTheme, theme);
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
/**
|
|
40
42
|
* Create a theme with inheritance support
|
|
41
43
|
* This is the recommended way to define new themes
|
|
42
44
|
*/
|
|
43
|
-
export function createTheme(themeConfig)
|
|
45
|
+
export function createTheme(themeConfig: Partial<MultiThemeConfig>): MultiThemeConfig {
|
|
46
|
+
return applyThemeInheritance(themeConfig);
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
/**
|
|
47
50
|
* Validate that a theme has all required properties
|
|
48
51
|
* Returns an array of missing property paths
|
|
49
52
|
*/
|
|
50
|
-
export function validateThemeCompleteness(theme)] {
|
|
51
|
-
const missingPaths] = [];
|
|
53
|
+
export function validateThemeCompleteness(theme: MultiThemeConfig): string[] {
|
|
54
|
+
const missingPaths: string[] = [];
|
|
52
55
|
|
|
53
|
-
function checkObject(obj, defaultObj, path= '') {
|
|
56
|
+
function checkObject(obj: any, defaultObj: any, path: string = '') {
|
|
54
57
|
for (const key in defaultObj) {
|
|
55
|
-
const currentPath = path ? `${path}.${key}` ;
|
|
58
|
+
const currentPath = path ? `${path}.${key}` : key;
|
|
56
59
|
|
|
57
60
|
if (obj[key] === undefined) {
|
|
58
61
|
missingPaths.push(currentPath);
|
|
@@ -76,12 +79,12 @@ export function validateThemeCompleteness(theme)] {
|
|
|
76
79
|
*/
|
|
77
80
|
export const themeInheritanceManager = {
|
|
78
81
|
// Internal theme registry
|
|
79
|
-
_themes, MultiThemeConfig>(),
|
|
82
|
+
_themes: new Map<string, MultiThemeConfig>(),
|
|
80
83
|
|
|
81
84
|
/**
|
|
82
85
|
* Apply inheritance to a theme
|
|
83
86
|
*/
|
|
84
|
-
applyInheritance,
|
|
87
|
+
applyInheritance: applyThemeInheritance,
|
|
85
88
|
|
|
86
89
|
/**
|
|
87
90
|
* Create a new theme with inheritance
|
|
@@ -91,17 +94,17 @@ export const themeInheritanceManager = {
|
|
|
91
94
|
/**
|
|
92
95
|
* Get the default theme
|
|
93
96
|
*/
|
|
94
|
-
getDefaultTheme) => defaultTheme,
|
|
97
|
+
getDefaultTheme: () => defaultTheme,
|
|
95
98
|
|
|
96
99
|
/**
|
|
97
100
|
* Validate theme completeness
|
|
98
101
|
*/
|
|
99
|
-
validateCompleteness,
|
|
102
|
+
validateCompleteness: validateThemeCompleteness,
|
|
100
103
|
|
|
101
104
|
/**
|
|
102
105
|
* Check if a theme has inheritance applied
|
|
103
106
|
*/
|
|
104
|
-
hasInheritance)=> {
|
|
107
|
+
hasInheritance: (theme: MultiThemeConfig): boolean => {
|
|
105
108
|
const missing = validateThemeCompleteness(theme);
|
|
106
109
|
return missing.length === 0;
|
|
107
110
|
},
|
|
@@ -109,9 +112,9 @@ export const themeInheritanceManager = {
|
|
|
109
112
|
/**
|
|
110
113
|
* Get theme property with fallback to default
|
|
111
114
|
*/
|
|
112
|
-
getProperty, path, fallback
|
|
115
|
+
getProperty: <T>(theme: MultiThemeConfig, path: string, fallback?: T): T => {
|
|
113
116
|
const keys = path.split('.');
|
|
114
|
-
let current= theme;
|
|
117
|
+
let current: any = theme;
|
|
115
118
|
|
|
116
119
|
for (const key of keys) {
|
|
117
120
|
if (current && typeof current === 'object' && key in current) {
|
|
@@ -136,7 +139,7 @@ export const themeInheritanceManager = {
|
|
|
136
139
|
/**
|
|
137
140
|
* Register a theme with inheritance applied
|
|
138
141
|
*/
|
|
139
|
-
registerTheme, theme)=> {
|
|
142
|
+
registerTheme: (name: string, theme: Partial<MultiThemeConfig>): MultiThemeConfig => {
|
|
140
143
|
const themeWithInheritance = applyThemeInheritance(theme);
|
|
141
144
|
themeInheritanceManager._themes.set(name, themeWithInheritance);
|
|
142
145
|
return themeWithInheritance;
|
|
@@ -145,7 +148,7 @@ export const themeInheritanceManager = {
|
|
|
145
148
|
/**
|
|
146
149
|
* Get complete theme with inheritance applied
|
|
147
150
|
*/
|
|
148
|
-
getCompleteTheme)=> {
|
|
151
|
+
getCompleteTheme: (name: string): CompleteThemeConfig | null => {
|
|
149
152
|
// First try to get the registered theme
|
|
150
153
|
const registeredTheme = themeInheritanceManager._themes.get(name);
|
|
151
154
|
if (registeredTheme) {
|
|
@@ -168,14 +171,14 @@ export const themeInheritanceManager = {
|
|
|
168
171
|
/**
|
|
169
172
|
* Get all registered theme names
|
|
170
173
|
*/
|
|
171
|
-
getRegisteredThemeNames)] => {
|
|
174
|
+
getRegisteredThemeNames: (): string[] => {
|
|
172
175
|
return Array.from(themeInheritanceManager._themes.keys());
|
|
173
176
|
},
|
|
174
177
|
|
|
175
178
|
/**
|
|
176
179
|
* Check if a theme is registered
|
|
177
180
|
*/
|
|
178
|
-
isThemeRegistered)=> {
|
|
181
|
+
isThemeRegistered: (name: string): boolean => {
|
|
179
182
|
return themeInheritanceManager._themes.has(name);
|
|
180
183
|
}
|
|
181
184
|
};
|
|
@@ -184,8 +187,8 @@ export const themeInheritanceManager = {
|
|
|
184
187
|
* Theme inheritance decorator
|
|
185
188
|
* Use this to automatically apply inheritance when defining themes
|
|
186
189
|
*/
|
|
187
|
-
export function withInheritance(themeConfig) {
|
|
188
|
-
return function <T extends { new (...args])}>(constructor) {
|
|
190
|
+
export function withInheritance(themeConfig: Partial<MultiThemeConfig>) {
|
|
191
|
+
return function <T extends { new (...args: any[]): any }>(constructor: T) {
|
|
189
192
|
return class extends constructor {
|
|
190
193
|
static theme = applyThemeInheritance(themeConfig);
|
|
191
194
|
};
|
|
@@ -196,24 +199,29 @@ export function withInheritance(themeConfig) {
|
|
|
196
199
|
* Partial theme type for theme definitions
|
|
197
200
|
* Use this when you only want to define specific parts of a theme
|
|
198
201
|
*/
|
|
199
|
-
|
|
202
|
+
export type PartialThemeConfig = Partial<MultiThemeConfig>;
|
|
200
203
|
|
|
201
204
|
/**
|
|
202
205
|
* Theme override utility
|
|
203
206
|
* Allows you to override specific parts of an existing theme
|
|
204
207
|
*/
|
|
205
208
|
export function overrideTheme(
|
|
206
|
-
baseTheme,
|
|
207
|
-
overrides
|
|
209
|
+
baseTheme: MultiThemeConfig,
|
|
210
|
+
overrides: Partial<MultiThemeConfig>
|
|
211
|
+
): MultiThemeConfig {
|
|
212
|
+
return deepMerge(baseTheme, overrides);
|
|
208
213
|
}
|
|
209
214
|
|
|
210
215
|
/**
|
|
211
216
|
* Convert MultiThemeConfig to CompleteThemeConfig
|
|
212
217
|
*/
|
|
213
|
-
export function toCompleteThemeConfig(theme)
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
218
|
+
export function toCompleteThemeConfig(theme: MultiThemeConfig): CompleteThemeConfig {
|
|
219
|
+
return {
|
|
220
|
+
...theme,
|
|
221
|
+
validation: {
|
|
222
|
+
isValid: true,
|
|
223
|
+
errors: [],
|
|
224
|
+
warnings: []
|
|
217
225
|
}
|
|
218
226
|
};
|
|
219
227
|
}
|