@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.9 → 0.2.10
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 +23 -1
- package/dist/components/ui/navigation/index.js +23 -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 +22 -2
- package/dist/components/ui/overlay/index.js +22 -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 +289 -280
- package/dist/index.js +289 -280
- 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/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 +15 -4
- package/dist/tokens/index.js +15 -4
- 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
|
@@ -3,21 +3,21 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
export interface ThemePersistenceOptions {
|
|
6
|
-
storageKey
|
|
7
|
-
defaultTheme
|
|
8
|
-
enableSystemPreference
|
|
9
|
-
enableSystemThemeDetection
|
|
10
|
-
systemThemeStorageKey
|
|
6
|
+
storageKey?: string;
|
|
7
|
+
defaultTheme?: string;
|
|
8
|
+
enableSystemPreference?: boolean;
|
|
9
|
+
enableSystemThemeDetection?: boolean;
|
|
10
|
+
systemThemeStorageKey?: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export class ThemePersistence {
|
|
14
|
-
private storageKey;
|
|
15
|
-
private defaultTheme;
|
|
16
|
-
private enableSystemPreference;
|
|
17
|
-
private enableSystemThemeDetection;
|
|
18
|
-
private systemThemeStorageKey;
|
|
14
|
+
private storageKey: string;
|
|
15
|
+
private defaultTheme: string;
|
|
16
|
+
private enableSystemPreference: boolean;
|
|
17
|
+
private enableSystemThemeDetection: boolean;
|
|
18
|
+
private systemThemeStorageKey: string;
|
|
19
19
|
|
|
20
|
-
constructor(options= {}) {
|
|
20
|
+
constructor(options: ThemePersistenceOptions = {}) {
|
|
21
21
|
this.storageKey = options.storageKey || 'stan-design-theme';
|
|
22
22
|
this.defaultTheme = options.defaultTheme || 'stan-design';
|
|
23
23
|
this.enableSystemPreference = options.enableSystemPreference ?? true;
|
|
@@ -29,7 +29,10 @@ export class ThemePersistence {
|
|
|
29
29
|
* Get the stored theme preference
|
|
30
30
|
* Falls back to system preference if enabled, then default theme
|
|
31
31
|
*/
|
|
32
|
-
getStoredTheme()
|
|
32
|
+
getStoredTheme(): string {
|
|
33
|
+
try {
|
|
34
|
+
// Check localStorage first
|
|
35
|
+
const stored = localStorage.getItem(this.storageKey);
|
|
33
36
|
if (stored) {
|
|
34
37
|
return stored;
|
|
35
38
|
}
|
|
@@ -45,7 +48,7 @@ export class ThemePersistence {
|
|
|
45
48
|
// Finally fall back to default
|
|
46
49
|
return this.defaultTheme;
|
|
47
50
|
} catch (error) {
|
|
48
|
-
console.warn('Failed to read theme from storage, error);
|
|
51
|
+
console.warn('Failed to read theme from storage:', error);
|
|
49
52
|
return this.defaultTheme;
|
|
50
53
|
}
|
|
51
54
|
}
|
|
@@ -53,30 +56,36 @@ export class ThemePersistence {
|
|
|
53
56
|
/**
|
|
54
57
|
* Store the theme preference
|
|
55
58
|
*/
|
|
56
|
-
setStoredTheme(themeName)
|
|
59
|
+
setStoredTheme(themeName: string): void {
|
|
60
|
+
try {
|
|
61
|
+
localStorage.setItem(this.storageKey, themeName);
|
|
57
62
|
} catch (error) {
|
|
58
|
-
console.warn('Failed to store theme preference, error);
|
|
63
|
+
console.warn('Failed to store theme preference:', error);
|
|
59
64
|
}
|
|
60
65
|
}
|
|
61
66
|
|
|
62
67
|
/**
|
|
63
68
|
* Clear the stored theme preference
|
|
64
69
|
*/
|
|
65
|
-
clearStoredTheme()
|
|
70
|
+
clearStoredTheme(): void {
|
|
71
|
+
try {
|
|
72
|
+
localStorage.removeItem(this.storageKey);
|
|
66
73
|
} catch (error) {
|
|
67
|
-
console.warn('Failed to clear theme preference, error);
|
|
74
|
+
console.warn('Failed to clear theme preference:', error);
|
|
68
75
|
}
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
/**
|
|
72
79
|
* Get system color scheme preference
|
|
73
80
|
*/
|
|
74
|
-
private getSystemPreference()
|
|
75
|
-
|
|
76
|
-
|
|
81
|
+
private getSystemPreference(): string | null {
|
|
82
|
+
try {
|
|
83
|
+
if (typeof window !== 'undefined' && window.matchMedia) {
|
|
84
|
+
const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
85
|
+
return darkModeQuery.matches ? 'dark' : 'light';
|
|
77
86
|
}
|
|
78
87
|
} catch (error) {
|
|
79
|
-
console.warn('Failed to detect system preference, error);
|
|
88
|
+
console.warn('Failed to detect system preference:', error);
|
|
80
89
|
}
|
|
81
90
|
return null;
|
|
82
91
|
}
|
|
@@ -84,13 +93,13 @@ export class ThemePersistence {
|
|
|
84
93
|
/**
|
|
85
94
|
* Listen for system preference changes
|
|
86
95
|
*/
|
|
87
|
-
onSystemPreferenceChange(callback) => void)) => void) | null {
|
|
96
|
+
onSystemPreferenceChange(callback: (preference: string) => void): (() => void) | null {
|
|
88
97
|
try {
|
|
89
98
|
if (typeof window !== 'undefined' && window.matchMedia) {
|
|
90
|
-
const mediaQuery = window.matchMedia('(prefers-color-scheme)');
|
|
99
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
91
100
|
|
|
92
|
-
const handleChange = (event) => {
|
|
93
|
-
const preference = event.matches ? 'dark' ;
|
|
101
|
+
const handleChange = (event: MediaQueryListEvent) => {
|
|
102
|
+
const preference = event.matches ? 'dark' : 'light';
|
|
94
103
|
callback(preference);
|
|
95
104
|
};
|
|
96
105
|
|
|
@@ -106,7 +115,7 @@ export class ThemePersistence {
|
|
|
106
115
|
}
|
|
107
116
|
}
|
|
108
117
|
} catch (error) {
|
|
109
|
-
console.warn('Failed to set up system preference listener, error);
|
|
118
|
+
console.warn('Failed to set up system preference listener:', error);
|
|
110
119
|
}
|
|
111
120
|
return null;
|
|
112
121
|
}
|
|
@@ -114,7 +123,9 @@ export class ThemePersistence {
|
|
|
114
123
|
/**
|
|
115
124
|
* Check if localStorage is available
|
|
116
125
|
*/
|
|
117
|
-
isStorageAvailable()
|
|
126
|
+
isStorageAvailable(): boolean {
|
|
127
|
+
try {
|
|
128
|
+
const test = '__test__';
|
|
118
129
|
localStorage.setItem(test, test);
|
|
119
130
|
localStorage.removeItem(test);
|
|
120
131
|
return true;
|
|
@@ -126,9 +137,9 @@ export class ThemePersistence {
|
|
|
126
137
|
/**
|
|
127
138
|
* Get all available storage keys related to themes
|
|
128
139
|
*/
|
|
129
|
-
getThemeKeys()] {
|
|
140
|
+
getThemeKeys(): string[] {
|
|
130
141
|
try {
|
|
131
|
-
const keys] = [];
|
|
142
|
+
const keys: string[] = [];
|
|
132
143
|
for (let i = 0; i < localStorage.length; i++) {
|
|
133
144
|
const key = localStorage.key(i);
|
|
134
145
|
if (key && key.includes('theme')) {
|
|
@@ -137,7 +148,7 @@ export class ThemePersistence {
|
|
|
137
148
|
}
|
|
138
149
|
return keys;
|
|
139
150
|
} catch (error) {
|
|
140
|
-
console.warn('Failed to get theme keys, error);
|
|
151
|
+
console.warn('Failed to get theme keys:', error);
|
|
141
152
|
return [];
|
|
142
153
|
}
|
|
143
154
|
}
|
|
@@ -145,12 +156,14 @@ export class ThemePersistence {
|
|
|
145
156
|
/**
|
|
146
157
|
* Get stored system theme preference
|
|
147
158
|
*/
|
|
148
|
-
getStoredSystemTheme()
|
|
159
|
+
getStoredSystemTheme(): 'light' | 'dark' | null {
|
|
160
|
+
try {
|
|
161
|
+
const stored = localStorage.getItem(this.systemThemeStorageKey);
|
|
149
162
|
if (stored === 'light' || stored === 'dark') {
|
|
150
163
|
return stored;
|
|
151
164
|
}
|
|
152
165
|
} catch (error) {
|
|
153
|
-
console.warn('Failed to read system theme from storage, error);
|
|
166
|
+
console.warn('Failed to read system theme from storage:', error);
|
|
154
167
|
}
|
|
155
168
|
return null;
|
|
156
169
|
}
|
|
@@ -158,41 +171,49 @@ export class ThemePersistence {
|
|
|
158
171
|
/**
|
|
159
172
|
* Store system theme preference
|
|
160
173
|
*/
|
|
161
|
-
setStoredSystemTheme(theme)
|
|
174
|
+
setStoredSystemTheme(theme: 'light' | 'dark'): void {
|
|
175
|
+
try {
|
|
176
|
+
localStorage.setItem(this.systemThemeStorageKey, theme);
|
|
162
177
|
} catch (error) {
|
|
163
|
-
console.warn('Failed to store system theme preference, error);
|
|
178
|
+
console.warn('Failed to store system theme preference:', error);
|
|
164
179
|
}
|
|
165
180
|
}
|
|
166
181
|
|
|
167
182
|
/**
|
|
168
183
|
* Clear stored system theme preference
|
|
169
184
|
*/
|
|
170
|
-
clearStoredSystemTheme()
|
|
185
|
+
clearStoredSystemTheme(): void {
|
|
186
|
+
try {
|
|
187
|
+
localStorage.removeItem(this.systemThemeStorageKey);
|
|
171
188
|
} catch (error) {
|
|
172
|
-
console.warn('Failed to clear system theme preference, error);
|
|
189
|
+
console.warn('Failed to clear system theme preference:', error);
|
|
173
190
|
}
|
|
174
191
|
}
|
|
175
192
|
|
|
176
193
|
/**
|
|
177
194
|
* Get comprehensive theme state including system theme
|
|
178
195
|
*/
|
|
179
|
-
getThemeState()
|
|
180
|
-
|
|
181
|
-
|
|
196
|
+
getThemeState(): {
|
|
197
|
+
theme: string;
|
|
198
|
+
systemTheme: 'light' | 'dark' | null;
|
|
199
|
+
isSystemThemeEnabled: boolean;
|
|
182
200
|
} {
|
|
183
201
|
return {
|
|
184
|
-
theme),
|
|
185
|
-
systemTheme),
|
|
186
|
-
isSystemThemeEnabled
|
|
202
|
+
theme: this.getStoredTheme(),
|
|
203
|
+
systemTheme: this.getStoredSystemTheme(),
|
|
204
|
+
isSystemThemeEnabled: this.enableSystemThemeDetection
|
|
205
|
+
};
|
|
187
206
|
}
|
|
188
207
|
|
|
189
208
|
/**
|
|
190
209
|
* Set comprehensive theme state
|
|
191
210
|
*/
|
|
192
|
-
setThemeState(state
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
211
|
+
setThemeState(state: {
|
|
212
|
+
theme?: string;
|
|
213
|
+
systemTheme?: 'light' | 'dark';
|
|
214
|
+
enableSystemTheme?: boolean;
|
|
215
|
+
}): void {
|
|
216
|
+
if (state.theme !== undefined) {
|
|
196
217
|
this.setStoredTheme(state.theme);
|
|
197
218
|
}
|
|
198
219
|
if (state.systemTheme !== undefined) {
|
|
@@ -212,6 +233,6 @@ export const defaultThemePersistence = new ThemePersistence();
|
|
|
212
233
|
/**
|
|
213
234
|
* Create a custom theme persistence instance
|
|
214
235
|
*/
|
|
215
|
-
export const createThemePersistence = (options) => {
|
|
236
|
+
export const createThemePersistence = (options: ThemePersistenceOptions) => {
|
|
216
237
|
return new ThemePersistence(options);
|
|
217
238
|
};
|
|
@@ -3,21 +3,21 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
export interface ThemePersistenceOptions {
|
|
6
|
-
storageKey
|
|
7
|
-
defaultTheme
|
|
8
|
-
enableSystemPreference
|
|
9
|
-
enableSystemThemeDetection
|
|
10
|
-
systemThemeStorageKey
|
|
6
|
+
storageKey?: string;
|
|
7
|
+
defaultTheme?: string;
|
|
8
|
+
enableSystemPreference?: boolean;
|
|
9
|
+
enableSystemThemeDetection?: boolean;
|
|
10
|
+
systemThemeStorageKey?: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export class ThemePersistence {
|
|
14
|
-
private storageKey;
|
|
15
|
-
private defaultTheme;
|
|
16
|
-
private enableSystemPreference;
|
|
17
|
-
private enableSystemThemeDetection;
|
|
18
|
-
private systemThemeStorageKey;
|
|
14
|
+
private storageKey: string;
|
|
15
|
+
private defaultTheme: string;
|
|
16
|
+
private enableSystemPreference: boolean;
|
|
17
|
+
private enableSystemThemeDetection: boolean;
|
|
18
|
+
private systemThemeStorageKey: string;
|
|
19
19
|
|
|
20
|
-
constructor(options= {}) {
|
|
20
|
+
constructor(options: ThemePersistenceOptions = {}) {
|
|
21
21
|
this.storageKey = options.storageKey || 'stan-design-theme';
|
|
22
22
|
this.defaultTheme = options.defaultTheme || 'stan-design';
|
|
23
23
|
this.enableSystemPreference = options.enableSystemPreference ?? true;
|
|
@@ -29,7 +29,10 @@ export class ThemePersistence {
|
|
|
29
29
|
* Get the stored theme preference
|
|
30
30
|
* Falls back to system preference if enabled, then default theme
|
|
31
31
|
*/
|
|
32
|
-
getStoredTheme()
|
|
32
|
+
getStoredTheme(): string {
|
|
33
|
+
try {
|
|
34
|
+
// Check localStorage first
|
|
35
|
+
const stored = localStorage.getItem(this.storageKey);
|
|
33
36
|
if (stored) {
|
|
34
37
|
return stored;
|
|
35
38
|
}
|
|
@@ -45,7 +48,7 @@ export class ThemePersistence {
|
|
|
45
48
|
// Finally fall back to default
|
|
46
49
|
return this.defaultTheme;
|
|
47
50
|
} catch (error) {
|
|
48
|
-
console.warn('Failed to read theme from storage, error);
|
|
51
|
+
console.warn('Failed to read theme from storage:', error);
|
|
49
52
|
return this.defaultTheme;
|
|
50
53
|
}
|
|
51
54
|
}
|
|
@@ -53,30 +56,36 @@ export class ThemePersistence {
|
|
|
53
56
|
/**
|
|
54
57
|
* Store the theme preference
|
|
55
58
|
*/
|
|
56
|
-
setStoredTheme(themeName)
|
|
59
|
+
setStoredTheme(themeName: string): void {
|
|
60
|
+
try {
|
|
61
|
+
localStorage.setItem(this.storageKey, themeName);
|
|
57
62
|
} catch (error) {
|
|
58
|
-
console.warn('Failed to store theme preference, error);
|
|
63
|
+
console.warn('Failed to store theme preference:', error);
|
|
59
64
|
}
|
|
60
65
|
}
|
|
61
66
|
|
|
62
67
|
/**
|
|
63
68
|
* Clear the stored theme preference
|
|
64
69
|
*/
|
|
65
|
-
clearStoredTheme()
|
|
70
|
+
clearStoredTheme(): void {
|
|
71
|
+
try {
|
|
72
|
+
localStorage.removeItem(this.storageKey);
|
|
66
73
|
} catch (error) {
|
|
67
|
-
console.warn('Failed to clear theme preference, error);
|
|
74
|
+
console.warn('Failed to clear theme preference:', error);
|
|
68
75
|
}
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
/**
|
|
72
79
|
* Get system color scheme preference
|
|
73
80
|
*/
|
|
74
|
-
private getSystemPreference()
|
|
75
|
-
|
|
76
|
-
|
|
81
|
+
private getSystemPreference(): string | null {
|
|
82
|
+
try {
|
|
83
|
+
if (typeof window !== 'undefined' && window.matchMedia) {
|
|
84
|
+
const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
85
|
+
return darkModeQuery.matches ? 'dark' : 'light';
|
|
77
86
|
}
|
|
78
87
|
} catch (error) {
|
|
79
|
-
console.warn('Failed to detect system preference, error);
|
|
88
|
+
console.warn('Failed to detect system preference:', error);
|
|
80
89
|
}
|
|
81
90
|
return null;
|
|
82
91
|
}
|
|
@@ -84,13 +93,13 @@ export class ThemePersistence {
|
|
|
84
93
|
/**
|
|
85
94
|
* Listen for system preference changes
|
|
86
95
|
*/
|
|
87
|
-
onSystemPreferenceChange(callback) => void)) => void) | null {
|
|
96
|
+
onSystemPreferenceChange(callback: (preference: string) => void): (() => void) | null {
|
|
88
97
|
try {
|
|
89
98
|
if (typeof window !== 'undefined' && window.matchMedia) {
|
|
90
|
-
const mediaQuery = window.matchMedia('(prefers-color-scheme)');
|
|
99
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
91
100
|
|
|
92
|
-
const handleChange = (event) => {
|
|
93
|
-
const preference = event.matches ? 'dark' ;
|
|
101
|
+
const handleChange = (event: MediaQueryListEvent) => {
|
|
102
|
+
const preference = event.matches ? 'dark' : 'light';
|
|
94
103
|
callback(preference);
|
|
95
104
|
};
|
|
96
105
|
|
|
@@ -106,7 +115,7 @@ export class ThemePersistence {
|
|
|
106
115
|
}
|
|
107
116
|
}
|
|
108
117
|
} catch (error) {
|
|
109
|
-
console.warn('Failed to set up system preference listener, error);
|
|
118
|
+
console.warn('Failed to set up system preference listener:', error);
|
|
110
119
|
}
|
|
111
120
|
return null;
|
|
112
121
|
}
|
|
@@ -114,7 +123,9 @@ export class ThemePersistence {
|
|
|
114
123
|
/**
|
|
115
124
|
* Check if localStorage is available
|
|
116
125
|
*/
|
|
117
|
-
isStorageAvailable()
|
|
126
|
+
isStorageAvailable(): boolean {
|
|
127
|
+
try {
|
|
128
|
+
const test = '__test__';
|
|
118
129
|
localStorage.setItem(test, test);
|
|
119
130
|
localStorage.removeItem(test);
|
|
120
131
|
return true;
|
|
@@ -126,9 +137,9 @@ export class ThemePersistence {
|
|
|
126
137
|
/**
|
|
127
138
|
* Get all available storage keys related to themes
|
|
128
139
|
*/
|
|
129
|
-
getThemeKeys()] {
|
|
140
|
+
getThemeKeys(): string[] {
|
|
130
141
|
try {
|
|
131
|
-
const keys] = [];
|
|
142
|
+
const keys: string[] = [];
|
|
132
143
|
for (let i = 0; i < localStorage.length; i++) {
|
|
133
144
|
const key = localStorage.key(i);
|
|
134
145
|
if (key && key.includes('theme')) {
|
|
@@ -137,7 +148,7 @@ export class ThemePersistence {
|
|
|
137
148
|
}
|
|
138
149
|
return keys;
|
|
139
150
|
} catch (error) {
|
|
140
|
-
console.warn('Failed to get theme keys, error);
|
|
151
|
+
console.warn('Failed to get theme keys:', error);
|
|
141
152
|
return [];
|
|
142
153
|
}
|
|
143
154
|
}
|
|
@@ -145,12 +156,14 @@ export class ThemePersistence {
|
|
|
145
156
|
/**
|
|
146
157
|
* Get stored system theme preference
|
|
147
158
|
*/
|
|
148
|
-
getStoredSystemTheme()
|
|
159
|
+
getStoredSystemTheme(): 'light' | 'dark' | null {
|
|
160
|
+
try {
|
|
161
|
+
const stored = localStorage.getItem(this.systemThemeStorageKey);
|
|
149
162
|
if (stored === 'light' || stored === 'dark') {
|
|
150
163
|
return stored;
|
|
151
164
|
}
|
|
152
165
|
} catch (error) {
|
|
153
|
-
console.warn('Failed to read system theme from storage, error);
|
|
166
|
+
console.warn('Failed to read system theme from storage:', error);
|
|
154
167
|
}
|
|
155
168
|
return null;
|
|
156
169
|
}
|
|
@@ -158,41 +171,49 @@ export class ThemePersistence {
|
|
|
158
171
|
/**
|
|
159
172
|
* Store system theme preference
|
|
160
173
|
*/
|
|
161
|
-
setStoredSystemTheme(theme)
|
|
174
|
+
setStoredSystemTheme(theme: 'light' | 'dark'): void {
|
|
175
|
+
try {
|
|
176
|
+
localStorage.setItem(this.systemThemeStorageKey, theme);
|
|
162
177
|
} catch (error) {
|
|
163
|
-
console.warn('Failed to store system theme preference, error);
|
|
178
|
+
console.warn('Failed to store system theme preference:', error);
|
|
164
179
|
}
|
|
165
180
|
}
|
|
166
181
|
|
|
167
182
|
/**
|
|
168
183
|
* Clear stored system theme preference
|
|
169
184
|
*/
|
|
170
|
-
clearStoredSystemTheme()
|
|
185
|
+
clearStoredSystemTheme(): void {
|
|
186
|
+
try {
|
|
187
|
+
localStorage.removeItem(this.systemThemeStorageKey);
|
|
171
188
|
} catch (error) {
|
|
172
|
-
console.warn('Failed to clear system theme preference, error);
|
|
189
|
+
console.warn('Failed to clear system theme preference:', error);
|
|
173
190
|
}
|
|
174
191
|
}
|
|
175
192
|
|
|
176
193
|
/**
|
|
177
194
|
* Get comprehensive theme state including system theme
|
|
178
195
|
*/
|
|
179
|
-
getThemeState()
|
|
180
|
-
|
|
181
|
-
|
|
196
|
+
getThemeState(): {
|
|
197
|
+
theme: string;
|
|
198
|
+
systemTheme: 'light' | 'dark' | null;
|
|
199
|
+
isSystemThemeEnabled: boolean;
|
|
182
200
|
} {
|
|
183
201
|
return {
|
|
184
|
-
theme),
|
|
185
|
-
systemTheme),
|
|
186
|
-
isSystemThemeEnabled
|
|
202
|
+
theme: this.getStoredTheme(),
|
|
203
|
+
systemTheme: this.getStoredSystemTheme(),
|
|
204
|
+
isSystemThemeEnabled: this.enableSystemThemeDetection
|
|
205
|
+
};
|
|
187
206
|
}
|
|
188
207
|
|
|
189
208
|
/**
|
|
190
209
|
* Set comprehensive theme state
|
|
191
210
|
*/
|
|
192
|
-
setThemeState(state
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
211
|
+
setThemeState(state: {
|
|
212
|
+
theme?: string;
|
|
213
|
+
systemTheme?: 'light' | 'dark';
|
|
214
|
+
enableSystemTheme?: boolean;
|
|
215
|
+
}): void {
|
|
216
|
+
if (state.theme !== undefined) {
|
|
196
217
|
this.setStoredTheme(state.theme);
|
|
197
218
|
}
|
|
198
219
|
if (state.systemTheme !== undefined) {
|
|
@@ -212,6 +233,6 @@ export const defaultThemePersistence = new ThemePersistence();
|
|
|
212
233
|
/**
|
|
213
234
|
* Create a custom theme persistence instance
|
|
214
235
|
*/
|
|
215
|
-
export const createThemePersistence = (options) => {
|
|
236
|
+
export const createThemePersistence = (options: ThemePersistenceOptions) => {
|
|
216
237
|
return new ThemePersistence(options);
|
|
217
238
|
};
|