@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
|
@@ -10,49 +10,55 @@ import { useTouchFriendlyInput } from '../../hooks/use-touch-friendly-input'
|
|
|
10
10
|
import { useInputPerformance } from '../../hooks/use-input-performance'
|
|
11
11
|
import { useInputAccessibility } from '../../hooks/use-input-accessibility'
|
|
12
12
|
|
|
13
|
-
export const SemanticInputSystemDemo= () => {
|
|
13
|
+
export const SemanticInputSystemDemo: React.FC = () => {
|
|
14
14
|
const [activeDemo, setActiveDemo] = useState<'semantic' | 'mobile' | 'touch' | 'performance' | 'accessibility'>('semantic')
|
|
15
15
|
const [formData, setFormData] = useState({
|
|
16
|
-
name,
|
|
17
|
-
email,
|
|
18
|
-
phone,
|
|
19
|
-
creditCard,
|
|
20
|
-
amount,
|
|
21
|
-
search
|
|
16
|
+
name: '',
|
|
17
|
+
email: '',
|
|
18
|
+
phone: '',
|
|
19
|
+
creditCard: '',
|
|
20
|
+
amount: '',
|
|
21
|
+
search: ''
|
|
22
|
+
})
|
|
22
23
|
|
|
23
24
|
// Initialize hooks with proper interfaces
|
|
24
25
|
const { semanticState, detectInputType, optimizeKeyboard } = useSemanticInput(
|
|
25
|
-
{ type, autocomplete, inputMode, keyboardType},
|
|
26
|
+
{ type: 'text', autocomplete: 'on', inputMode: 'text', keyboardType: 'default' },
|
|
26
27
|
{},
|
|
27
28
|
{
|
|
28
|
-
enableAutoDetection,
|
|
29
|
-
enableKeyboardOptimization,
|
|
30
|
-
enableAutocomplete
|
|
29
|
+
enableAutoDetection: true,
|
|
30
|
+
enableKeyboardOptimization: true,
|
|
31
|
+
enableAutocomplete: true
|
|
32
|
+
}
|
|
31
33
|
)
|
|
32
34
|
|
|
33
35
|
const { keyboardState, optimizations, autoOptimizeForInputType } = useMobileKeyboardOptimization({
|
|
34
|
-
enableKeyboardDetection,
|
|
35
|
-
enablePerformanceMonitoring,
|
|
36
|
-
enableBatteryOptimization
|
|
36
|
+
enableKeyboardDetection: true,
|
|
37
|
+
enablePerformanceMonitoring: true,
|
|
38
|
+
enableBatteryOptimization: true
|
|
39
|
+
})
|
|
37
40
|
|
|
38
41
|
const { touchState, touchOptimizations, autoOptimizeTouch } = useTouchFriendlyInput({
|
|
39
|
-
enableTouchOptimization,
|
|
40
|
-
enablePerformanceMonitoring,
|
|
41
|
-
enableAccessibilitySupport
|
|
42
|
+
enableTouchOptimization: true,
|
|
43
|
+
enablePerformanceMonitoring: true,
|
|
44
|
+
enableAccessibilitySupport: true
|
|
45
|
+
})
|
|
42
46
|
|
|
43
47
|
const { performanceMetrics, autoOptimize } = useInputPerformance({
|
|
44
|
-
enablePerformanceMonitoring,
|
|
45
|
-
enableMemoryManagement,
|
|
46
|
-
enableBatteryOptimization
|
|
48
|
+
enablePerformanceMonitoring: true,
|
|
49
|
+
enableMemoryManagement: true,
|
|
50
|
+
enableBatteryOptimization: true
|
|
51
|
+
})
|
|
47
52
|
|
|
48
53
|
const { accessibilityFeatures, enableARIASupport } = useInputAccessibility({
|
|
49
|
-
enableARIA,
|
|
50
|
-
enableKeyboardNavigation,
|
|
51
|
-
enableScreenReader,
|
|
52
|
-
enableFocusManagement
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
enableARIA: true,
|
|
55
|
+
enableKeyboardNavigation: true,
|
|
56
|
+
enableScreenReader: true,
|
|
57
|
+
enableFocusManagement: true
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
const handleInputChange = (field: string, value: string) => {
|
|
61
|
+
setFormData(prev => ({ ...prev, [field]: value }))
|
|
56
62
|
|
|
57
63
|
// Detect semantic type and optimize
|
|
58
64
|
const detectedType = detectInputType(value, field)
|
|
@@ -62,16 +68,25 @@ export const SemanticInputSystemDemo= () => {
|
|
|
62
68
|
}
|
|
63
69
|
}
|
|
64
70
|
|
|
65
|
-
const handleDemoChange = (demo) => {
|
|
71
|
+
const handleDemoChange = (demo: typeof activeDemo) => {
|
|
66
72
|
setActiveDemo(demo)
|
|
67
73
|
|
|
68
74
|
// Start relevant monitoring for the selected demo
|
|
69
75
|
switch (demo) {
|
|
70
|
-
case 'semantic'
|
|
76
|
+
case 'semantic':
|
|
77
|
+
break
|
|
78
|
+
case 'mobile':
|
|
79
|
+
// Mobile keyboard detection is already running
|
|
71
80
|
break
|
|
72
|
-
case '
|
|
81
|
+
case 'touch':
|
|
82
|
+
autoOptimizeTouch()
|
|
73
83
|
break
|
|
74
|
-
case '
|
|
84
|
+
case 'performance':
|
|
85
|
+
autoOptimize()
|
|
86
|
+
break
|
|
87
|
+
case 'accessibility':
|
|
88
|
+
// Call functions safely - simplified to avoid type issues
|
|
89
|
+
if (typeof enableARIASupport === 'function') {
|
|
75
90
|
enableARIASupport()
|
|
76
91
|
}
|
|
77
92
|
break
|
|
@@ -80,7 +95,8 @@ export const SemanticInputSystemDemo= () => {
|
|
|
80
95
|
|
|
81
96
|
const renderSemanticDemo = () => (
|
|
82
97
|
<div className="space-y-6">
|
|
83
|
-
<div className="grid grid-cols-1 md
|
|
98
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
99
|
+
<div className="space-y-2">
|
|
84
100
|
<Label htmlFor="name">Full Name</Label>
|
|
85
101
|
<Input
|
|
86
102
|
id="name"
|
|
@@ -90,7 +106,7 @@ export const SemanticInputSystemDemo= () => {
|
|
|
90
106
|
className="semantic-input"
|
|
91
107
|
/>
|
|
92
108
|
<div className="text-sm text-gray-600">
|
|
93
|
-
Detected Type="secondary">{semanticState.detectedType?.type || 'text'}</Badge>
|
|
109
|
+
Detected Type: <Badge variant="secondary">{semanticState.detectedType?.type || 'text'}</Badge>
|
|
94
110
|
</div>
|
|
95
111
|
</div>
|
|
96
112
|
|
|
@@ -105,7 +121,7 @@ export const SemanticInputSystemDemo= () => {
|
|
|
105
121
|
className="semantic-input"
|
|
106
122
|
/>
|
|
107
123
|
<div className="text-sm text-gray-600">
|
|
108
|
-
Keyboard="secondary">{semanticState.keyboardOptimized ? 'Optimized' }</Badge>
|
|
124
|
+
Keyboard: <Badge variant="secondary">{semanticState.keyboardOptimized ? 'Optimized' : 'Default'}</Badge>
|
|
109
125
|
</div>
|
|
110
126
|
</div>
|
|
111
127
|
|
|
@@ -119,7 +135,7 @@ export const SemanticInputSystemDemo= () => {
|
|
|
119
135
|
className="semantic-input"
|
|
120
136
|
/>
|
|
121
137
|
<div className="text-sm text-gray-600">
|
|
122
|
-
Autocomplete="secondary">{semanticState.autocompleteEnhanced ? 'Enhanced' }</Badge>
|
|
138
|
+
Autocomplete: <Badge variant="secondary">{semanticState.autocompleteEnhanced ? 'Enhanced' : 'Default'}</Badge>
|
|
123
139
|
</div>
|
|
124
140
|
</div>
|
|
125
141
|
|
|
@@ -133,7 +149,7 @@ export const SemanticInputSystemDemo= () => {
|
|
|
133
149
|
className="semantic-input"
|
|
134
150
|
/>
|
|
135
151
|
<div className="text-sm text-gray-600">
|
|
136
|
-
Touch="secondary">{semanticState.touchOptimized ? 'Optimized' }</Badge>
|
|
152
|
+
Touch: <Badge variant="secondary">{semanticState.touchOptimized ? 'Optimized' : 'Default'}</Badge>
|
|
137
153
|
</div>
|
|
138
154
|
</div>
|
|
139
155
|
|
|
@@ -147,7 +163,7 @@ export const SemanticInputSystemDemo= () => {
|
|
|
147
163
|
className="semantic-input"
|
|
148
164
|
/>
|
|
149
165
|
<div className="text-sm text-gray-600">
|
|
150
|
-
Performance="secondary">{semanticState.isOptimized ? 'Optimized' }</Badge>
|
|
166
|
+
Performance: <Badge variant="secondary">{semanticState.isOptimized ? 'Optimized' : 'Default'}</Badge>
|
|
151
167
|
</div>
|
|
152
168
|
</div>
|
|
153
169
|
|
|
@@ -161,7 +177,7 @@ export const SemanticInputSystemDemo= () => {
|
|
|
161
177
|
className="semantic-input"
|
|
162
178
|
/>
|
|
163
179
|
<div className="text-sm text-gray-600">
|
|
164
|
-
Type="secondary">{semanticState.detectedType?.type || 'text'}</Badge>
|
|
180
|
+
Type: <Badge variant="secondary">{semanticState.detectedType?.type || 'text'}</Badge>
|
|
165
181
|
</div>
|
|
166
182
|
</div>
|
|
167
183
|
</div>
|
|
@@ -177,14 +193,15 @@ export const SemanticInputSystemDemo= () => {
|
|
|
177
193
|
|
|
178
194
|
const renderMobileDemo = () => (
|
|
179
195
|
<div className="space-y-6">
|
|
180
|
-
<div className="grid grid-cols-1 md
|
|
196
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
197
|
+
<div className="space-y-2">
|
|
181
198
|
<Label>Keyboard State</Label>
|
|
182
199
|
<div className="space-y-2 text-sm">
|
|
183
|
-
<div>Visible={keyboardState.isVisible ? 'default' }>{keyboardState.isVisible ? 'Yes' }</Badge></div>
|
|
184
|
-
<div>Height}px</div>
|
|
185
|
-
<div>Type="outline">{keyboardState.type}</Badge></div>
|
|
186
|
-
<div>Platform="outline">{keyboardState.platform}</Badge></div>
|
|
187
|
-
<div>Orientation="outline">{keyboardState.orientation}</Badge></div>
|
|
200
|
+
<div>Visible: <Badge variant={keyboardState.isVisible ? 'default' : 'secondary'}>{keyboardState.isVisible ? 'Yes' : 'No'}</Badge></div>
|
|
201
|
+
<div>Height: {keyboardState.height}px</div>
|
|
202
|
+
<div>Type: <Badge variant="outline">{keyboardState.type}</Badge></div>
|
|
203
|
+
<div>Platform: <Badge variant="outline">{keyboardState.platform}</Badge></div>
|
|
204
|
+
<div>Orientation: <Badge variant="outline">{keyboardState.orientation}</Badge></div>
|
|
188
205
|
</div>
|
|
189
206
|
</div>
|
|
190
207
|
|
|
@@ -194,8 +211,8 @@ export const SemanticInputSystemDemo= () => {
|
|
|
194
211
|
{optimizations.map((opt, index) => (
|
|
195
212
|
<div key={index} className="flex items-center justify-between p-2 bg-gray-50 rounded">
|
|
196
213
|
<span className="text-sm">{opt.name}</span>
|
|
197
|
-
<Badge variant={opt.applied ? 'default' }>
|
|
198
|
-
{opt.applied ? 'Applied' }
|
|
214
|
+
<Badge variant={opt.applied ? 'default' : 'secondary'}>
|
|
215
|
+
{opt.applied ? 'Applied' : 'Pending'}
|
|
199
216
|
</Badge>
|
|
200
217
|
</div>
|
|
201
218
|
))}
|
|
@@ -218,14 +235,15 @@ export const SemanticInputSystemDemo= () => {
|
|
|
218
235
|
|
|
219
236
|
const renderTouchDemo = () => (
|
|
220
237
|
<div className="space-y-6">
|
|
221
|
-
<div className="grid grid-cols-1 md
|
|
238
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
239
|
+
<div className="space-y-2">
|
|
222
240
|
<Label>Touch State</Label>
|
|
223
241
|
<div className="space-y-2 text-sm">
|
|
224
|
-
<div>Touching={touchState.isTouching ? 'default' }>{touchState.isTouching ? 'Yes' }</Badge></div>
|
|
225
|
-
<div>Touch Count}</div>
|
|
226
|
-
<div>Duration}ms</div>
|
|
227
|
-
<div>Velocity)}px/ms</div>
|
|
228
|
-
<div>Gesture="outline">{touchState.gestureType}</Badge></div>
|
|
242
|
+
<div>Touching: <Badge variant={touchState.isTouching ? 'default' : 'secondary'}>{touchState.isTouching ? 'Yes' : 'No'}</Badge></div>
|
|
243
|
+
<div>Touch Count: {touchState.touchCount}</div>
|
|
244
|
+
<div>Duration: {touchState.touchDuration}ms</div>
|
|
245
|
+
<div>Velocity: {touchState.touchVelocity.toFixed(2)}px/ms</div>
|
|
246
|
+
<div>Gesture: <Badge variant="outline">{touchState.gestureType}</Badge></div>
|
|
229
247
|
</div>
|
|
230
248
|
</div>
|
|
231
249
|
|
|
@@ -235,8 +253,8 @@ export const SemanticInputSystemDemo= () => {
|
|
|
235
253
|
{touchOptimizations.map((opt, index) => (
|
|
236
254
|
<div key={index} className="flex items-center justify-between p-2 bg-gray-50 rounded">
|
|
237
255
|
<span className="text-sm">{opt.name}</span>
|
|
238
|
-
<Badge variant={opt.applied ? 'default' }>
|
|
239
|
-
{opt.applied ? 'Applied' }
|
|
256
|
+
<Badge variant={opt.applied ? 'default' : 'secondary'}>
|
|
257
|
+
{opt.applied ? 'Applied' : 'Pending'}
|
|
240
258
|
</Badge>
|
|
241
259
|
</div>
|
|
242
260
|
))}
|
|
@@ -259,13 +277,14 @@ export const SemanticInputSystemDemo= () => {
|
|
|
259
277
|
|
|
260
278
|
const renderPerformanceDemo = () => (
|
|
261
279
|
<div className="space-y-6">
|
|
262
|
-
<div className="grid grid-cols-1 md
|
|
280
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
281
|
+
<div className="space-y-2">
|
|
263
282
|
<Label>Performance Metrics</Label>
|
|
264
283
|
<div className="space-y-2 text-sm">
|
|
265
|
-
<div>Frame Rate} FPS</div>
|
|
266
|
-
<div>Input Latency)}ms</div>
|
|
267
|
-
<div>Memory Usage}MB</div>
|
|
268
|
-
<div>Battery Level).toFixed(1)}%</div>
|
|
284
|
+
<div>Frame Rate: {performanceMetrics.frameRate} FPS</div>
|
|
285
|
+
<div>Input Latency: {performanceMetrics.inputLatency.toFixed(2)}ms</div>
|
|
286
|
+
<div>Memory Usage: {performanceMetrics.memoryUsage}MB</div>
|
|
287
|
+
<div>Battery Level: {(performanceMetrics.batteryLevel * 100).toFixed(1)}%</div>
|
|
269
288
|
</div>
|
|
270
289
|
</div>
|
|
271
290
|
|
|
@@ -274,20 +293,20 @@ export const SemanticInputSystemDemo= () => {
|
|
|
274
293
|
<div className="space-y-2">
|
|
275
294
|
<div className="flex items-center justify-between">
|
|
276
295
|
<span className="text-sm">Frame Rate</span>
|
|
277
|
-
<Badge variant={performanceMetrics.frameRate >= 60 ? 'default' }>
|
|
278
|
-
{performanceMetrics.frameRate >= 60 ? 'Optimal' }
|
|
296
|
+
<Badge variant={performanceMetrics.frameRate >= 60 ? 'default' : 'destructive'}>
|
|
297
|
+
{performanceMetrics.frameRate >= 60 ? 'Optimal' : 'Low'}
|
|
279
298
|
</Badge>
|
|
280
299
|
</div>
|
|
281
300
|
<div className="flex items-center justify-between">
|
|
282
301
|
<span className="text-sm">Input Latency</span>
|
|
283
|
-
<Badge variant={performanceMetrics.inputLatency < 16 ? 'default' }>
|
|
284
|
-
{performanceMetrics.inputLatency < 16 ? 'Optimal' }
|
|
302
|
+
<Badge variant={performanceMetrics.inputLatency < 16 ? 'default' : 'destructive'}>
|
|
303
|
+
{performanceMetrics.inputLatency < 16 ? 'Optimal' : 'High'}
|
|
285
304
|
</Badge>
|
|
286
305
|
</div>
|
|
287
306
|
<div className="flex items-center justify-between">
|
|
288
307
|
<span className="text-sm">Memory</span>
|
|
289
|
-
<Badge variant={performanceMetrics.memoryUsage < 100 ? 'default' }>
|
|
290
|
-
{performanceMetrics.memoryUsage < 100 ? 'Optimal' }
|
|
308
|
+
<Badge variant={performanceMetrics.memoryUsage < 100 ? 'default' : 'destructive'}>
|
|
309
|
+
{performanceMetrics.memoryUsage < 100 ? 'Optimal' : 'High'}
|
|
291
310
|
</Badge>
|
|
292
311
|
</div>
|
|
293
312
|
</div>
|
|
@@ -309,14 +328,15 @@ export const SemanticInputSystemDemo= () => {
|
|
|
309
328
|
|
|
310
329
|
const renderAccessibilityDemo = () => (
|
|
311
330
|
<div className="space-y-6">
|
|
312
|
-
<div className="grid grid-cols-1 md
|
|
331
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
332
|
+
<div className="space-y-2">
|
|
313
333
|
<Label>Accessibility Features</Label>
|
|
314
334
|
<div className="space-y-2">
|
|
315
335
|
{accessibilityFeatures.map((feature, index) => (
|
|
316
336
|
<div key={index} className="flex items-center justify-between p-2 bg-gray-50 rounded">
|
|
317
337
|
<span className="text-sm">{feature.name}</span>
|
|
318
|
-
<Badge variant={feature.enabled ? 'default' }>
|
|
319
|
-
{feature.enabled ? 'Enabled' }
|
|
338
|
+
<Badge variant={feature.enabled ? 'default' : 'secondary'}>
|
|
339
|
+
{feature.enabled ? 'Enabled' : 'Disabled'}
|
|
320
340
|
</Badge>
|
|
321
341
|
</div>
|
|
322
342
|
))}
|
|
@@ -351,7 +371,9 @@ export const SemanticInputSystemDemo= () => {
|
|
|
351
371
|
<div className="max-w-6xl mx-auto p-6 space-y-6">
|
|
352
372
|
<div className="text-center space-y-4">
|
|
353
373
|
<h1 className="text-4xl font-bold text-gray-900">
|
|
354
|
-
🎯 Story 12
|
|
374
|
+
🎯 Story 12: Semantic Input System & Mobile Keyboard Optimization
|
|
375
|
+
</h1>
|
|
376
|
+
<p className="text-xl text-gray-600 max-w-3xl mx-auto">
|
|
355
377
|
Advanced input system with semantic type detection, mobile keyboard optimization,
|
|
356
378
|
touch-friendly behavior, performance monitoring, and accessibility support.
|
|
357
379
|
</p>
|
|
@@ -366,31 +388,31 @@ export const SemanticInputSystemDemo= () => {
|
|
|
366
388
|
|
|
367
389
|
<div className="flex flex-wrap gap-2 justify-center">
|
|
368
390
|
<Button
|
|
369
|
-
variant={activeDemo === 'semantic' ? 'default' }
|
|
391
|
+
variant={activeDemo === 'semantic' ? 'default' : 'outline'}
|
|
370
392
|
onClick={() => handleDemoChange('semantic')}
|
|
371
393
|
>
|
|
372
394
|
🧠 Semantic Input
|
|
373
395
|
</Button>
|
|
374
396
|
<Button
|
|
375
|
-
variant={activeDemo === 'mobile' ? 'default' }
|
|
397
|
+
variant={activeDemo === 'mobile' ? 'default' : 'outline'}
|
|
376
398
|
onClick={() => handleDemoChange('mobile')}
|
|
377
399
|
>
|
|
378
400
|
📱 Mobile Keyboard
|
|
379
401
|
</Button>
|
|
380
402
|
<Button
|
|
381
|
-
variant={activeDemo === 'touch' ? 'default' }
|
|
403
|
+
variant={activeDemo === 'touch' ? 'default' : 'outline'}
|
|
382
404
|
onClick={() => handleDemoChange('touch')}
|
|
383
405
|
>
|
|
384
406
|
👆 Touch Friendly
|
|
385
407
|
</Button>
|
|
386
408
|
<Button
|
|
387
|
-
variant={activeDemo === 'performance' ? 'default' }
|
|
409
|
+
variant={activeDemo === 'performance' ? 'default' : 'outline'}
|
|
388
410
|
onClick={() => handleDemoChange('performance')}
|
|
389
411
|
>
|
|
390
412
|
⚡ Performance
|
|
391
413
|
</Button>
|
|
392
414
|
<Button
|
|
393
|
-
variant={activeDemo === 'accessibility' ? 'default' }
|
|
415
|
+
variant={activeDemo === 'accessibility' ? 'default' : 'outline'}
|
|
394
416
|
onClick={() => handleDemoChange('accessibility')}
|
|
395
417
|
>
|
|
396
418
|
♿ Accessibility
|
|
@@ -423,12 +445,24 @@ export const SemanticInputSystemDemo= () => {
|
|
|
423
445
|
</CardContent>
|
|
424
446
|
</Card>
|
|
425
447
|
|
|
426
|
-
<div className="grid grid-cols-1 md
|
|
448
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
449
|
+
<Card>
|
|
450
|
+
<CardHeader>
|
|
451
|
+
<CardTitle className="text-lg">🎯 Next Steps</CardTitle>
|
|
427
452
|
</CardHeader>
|
|
428
453
|
<CardContent>
|
|
429
454
|
<ul className="text-sm space-y-2">
|
|
430
|
-
<li>✅ Story 12]</li>
|
|
431
|
-
<li>🔧 Story 13
|
|
455
|
+
<li>✅ Story 12: Semantic Input System [COMPLETE]</li>
|
|
456
|
+
<li>🔧 Story 13: Touch-Friendly Interface</li>
|
|
457
|
+
<li>🎨 Story 14: Advanced Transitions</li>
|
|
458
|
+
<li>📱 Story 15: Mobile Experience Polish</li>
|
|
459
|
+
</ul>
|
|
460
|
+
</CardContent>
|
|
461
|
+
</Card>
|
|
462
|
+
|
|
463
|
+
<Card>
|
|
464
|
+
<CardHeader>
|
|
465
|
+
<CardTitle className="text-lg">🚀 Features</CardTitle>
|
|
432
466
|
</CardHeader>
|
|
433
467
|
<CardContent>
|
|
434
468
|
<ul className="text-sm space-y-2">
|
|
@@ -448,13 +482,16 @@ export const SemanticInputSystemDemo= () => {
|
|
|
448
482
|
<CardContent>
|
|
449
483
|
<div className="space-y-2">
|
|
450
484
|
<div className="flex justify-between">
|
|
451
|
-
<span className="text-sm">Components
|
|
485
|
+
<span className="text-sm">Components:</span>
|
|
486
|
+
<Badge variant="default">6/6</Badge>
|
|
452
487
|
</div>
|
|
453
488
|
<div className="flex justify-between">
|
|
454
|
-
<span className="text-sm">Hooks
|
|
489
|
+
<span className="text-sm">Hooks:</span>
|
|
490
|
+
<Badge variant="default">6/6</Badge>
|
|
455
491
|
</div>
|
|
456
492
|
<div className="flex justify-between">
|
|
457
|
-
<span className="text-sm">Tests
|
|
493
|
+
<span className="text-sm">Tests:</span>
|
|
494
|
+
<Badge variant="default">Passing</Badge>
|
|
458
495
|
</div>
|
|
459
496
|
</div>
|
|
460
497
|
</CardContent>
|
|
@@ -4,30 +4,34 @@ import { Card, CardContent, CardHeader, CardTitle } from './card';
|
|
|
4
4
|
import { Button } from './button';
|
|
5
5
|
import { Input } from './input';
|
|
6
6
|
import { ThemePreview } from './theme-preview';
|
|
7
|
-
|
|
7
|
+
import type { CompleteThemeConfig } from '../../themes/types';
|
|
8
8
|
|
|
9
9
|
export interface ThemeCustomizerProps {
|
|
10
|
-
initialTheme
|
|
11
|
-
onThemeChange
|
|
12
|
-
showPreview
|
|
13
|
-
allowCustomization
|
|
14
|
-
className
|
|
10
|
+
initialTheme?: string;
|
|
11
|
+
onThemeChange?: (theme: CompleteThemeConfig) => void;
|
|
12
|
+
showPreview?: boolean;
|
|
13
|
+
allowCustomization?: boolean;
|
|
14
|
+
className?: string;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export interface CustomizationState {
|
|
18
|
-
colors
|
|
19
|
-
|
|
18
|
+
colors: {
|
|
19
|
+
primary: string;
|
|
20
|
+
secondary: string;
|
|
20
21
|
};
|
|
21
|
-
fonts
|
|
22
|
-
|
|
22
|
+
fonts: {
|
|
23
|
+
primary: string;
|
|
24
|
+
secondary: string;
|
|
23
25
|
};
|
|
24
|
-
spacing
|
|
26
|
+
spacing: {
|
|
27
|
+
scale: number;
|
|
25
28
|
};
|
|
26
|
-
shadows
|
|
29
|
+
shadows: {
|
|
30
|
+
intensity: number;
|
|
27
31
|
};
|
|
28
32
|
}
|
|
29
33
|
|
|
30
|
-
export const ThemeCustomizer= ({
|
|
34
|
+
export const ThemeCustomizer: React.FC<ThemeCustomizerProps> = ({
|
|
31
35
|
initialTheme = 'stan-design',
|
|
32
36
|
onThemeChange,
|
|
33
37
|
showPreview = true,
|
|
@@ -36,12 +40,20 @@ export const ThemeCustomizer= ({
|
|
|
36
40
|
}) => {
|
|
37
41
|
const { getTheme } = useTheme();
|
|
38
42
|
const [customizationState, setCustomizationState] = useState<CustomizationState>({
|
|
39
|
-
colors
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
colors: {
|
|
44
|
+
primary: '#3b82f6',
|
|
45
|
+
secondary: '#10b981'
|
|
46
|
+
},
|
|
47
|
+
fonts: {
|
|
48
|
+
primary: 'Inter',
|
|
49
|
+
secondary: 'Roboto'
|
|
50
|
+
},
|
|
51
|
+
spacing: {
|
|
52
|
+
scale: 1.25
|
|
53
|
+
},
|
|
54
|
+
shadows: {
|
|
55
|
+
intensity: 0.1
|
|
56
|
+
}
|
|
45
57
|
});
|
|
46
58
|
|
|
47
59
|
const [activeTab, setActiveTab] = useState<'colors' | 'fonts' | 'spacing' | 'shadows' | 'preview'>('colors');
|
|
@@ -55,11 +67,13 @@ export const ThemeCustomizer= ({
|
|
|
55
67
|
}
|
|
56
68
|
}, [initialTheme]); // Removed getTheme from dependencies as it's stable
|
|
57
69
|
|
|
58
|
-
const handleCustomizationChange = useCallback((key, subKey, value) => {
|
|
70
|
+
const handleCustomizationChange = useCallback((key: keyof CustomizationState, subKey: string, value: any) => {
|
|
59
71
|
setCustomizationState(prev => ({
|
|
60
72
|
...prev,
|
|
61
|
-
[key]
|
|
62
|
-
[
|
|
73
|
+
[key]: {
|
|
74
|
+
...prev[key],
|
|
75
|
+
[subKey]: value
|
|
76
|
+
}
|
|
63
77
|
}));
|
|
64
78
|
}, []);
|
|
65
79
|
|
|
@@ -67,7 +81,7 @@ export const ThemeCustomizer= ({
|
|
|
67
81
|
if (!customTheme) return;
|
|
68
82
|
|
|
69
83
|
// Create a deep copy of the current theme
|
|
70
|
-
const newTheme= JSON.parse(JSON.stringify(customTheme));
|
|
84
|
+
const newTheme: CompleteThemeConfig = JSON.parse(JSON.stringify(customTheme));
|
|
71
85
|
|
|
72
86
|
// Apply customizations
|
|
73
87
|
// Generate color scales based on the selected primary color
|
|
@@ -75,18 +89,18 @@ export const ThemeCustomizer= ({
|
|
|
75
89
|
const secondaryColor = customizationState.colors.secondary;
|
|
76
90
|
|
|
77
91
|
// Simple color scale generation (in a real app, you'd use a color library)
|
|
78
|
-
const generateColorScale = (baseColor) => {
|
|
92
|
+
const generateColorScale = (baseColor: string) => {
|
|
79
93
|
return {
|
|
80
|
-
50}0a`,
|
|
81
|
-
100}1a`,
|
|
82
|
-
200}33`,
|
|
83
|
-
300}4d`,
|
|
84
|
-
400}66`,
|
|
85
|
-
500,
|
|
86
|
-
600}99`,
|
|
87
|
-
700}b3`,
|
|
88
|
-
800}cc`,
|
|
89
|
-
900}e6`
|
|
94
|
+
50: `${baseColor}0a`,
|
|
95
|
+
100: `${baseColor}1a`,
|
|
96
|
+
200: `${baseColor}33`,
|
|
97
|
+
300: `${baseColor}4d`,
|
|
98
|
+
400: `${baseColor}66`,
|
|
99
|
+
500: baseColor,
|
|
100
|
+
600: `${baseColor}99`,
|
|
101
|
+
700: `${baseColor}b3`,
|
|
102
|
+
800: `${baseColor}cc`,
|
|
103
|
+
900: `${baseColor}e6`
|
|
90
104
|
};
|
|
91
105
|
};
|
|
92
106
|
|
|
@@ -110,14 +124,14 @@ export const ThemeCustomizer= ({
|
|
|
110
124
|
if (newTheme.spacing && newTheme.spacing.scale) {
|
|
111
125
|
// This is a simplified approach - in reality you'd want to recalculate all spacing values
|
|
112
126
|
// For now, we'll just note that the scale factor has changed
|
|
113
|
-
console.log('Spacing scale factor updated to, customizationState.spacing.scale);
|
|
127
|
+
console.log('Spacing scale factor updated to:', customizationState.spacing.scale);
|
|
114
128
|
}
|
|
115
129
|
|
|
116
130
|
// Update shadow intensity (we'll adjust the existing shadows)
|
|
117
131
|
if (newTheme.shadows) {
|
|
118
132
|
// This is a simplified approach - in reality you'd want to recalculate all shadow values
|
|
119
133
|
// For now, we'll just note that the intensity has changed
|
|
120
|
-
console.log('Shadow intensity updated to, customizationState.shadows.intensity);
|
|
134
|
+
console.log('Shadow intensity updated to:', customizationState.shadows.intensity);
|
|
121
135
|
}
|
|
122
136
|
|
|
123
137
|
setCustomTheme(newTheme);
|
|
@@ -131,7 +145,7 @@ export const ThemeCustomizer= ({
|
|
|
131
145
|
if (!customTheme) return;
|
|
132
146
|
|
|
133
147
|
const themeData = JSON.stringify(customTheme, null, 2);
|
|
134
|
-
const blob = new Blob([themeData], { type});
|
|
148
|
+
const blob = new Blob([themeData], { type: 'application/json' });
|
|
135
149
|
const url = URL.createObjectURL(blob);
|
|
136
150
|
const a = document.createElement('a');
|
|
137
151
|
a.href = url;
|
|
@@ -147,12 +161,20 @@ export const ThemeCustomizer= ({
|
|
|
147
161
|
if (originalTheme) {
|
|
148
162
|
setCustomTheme(originalTheme);
|
|
149
163
|
setCustomizationState({
|
|
150
|
-
colors
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
164
|
+
colors: {
|
|
165
|
+
primary: '#3b82f6',
|
|
166
|
+
secondary: '#10b981'
|
|
167
|
+
},
|
|
168
|
+
fonts: {
|
|
169
|
+
primary: 'Inter',
|
|
170
|
+
secondary: 'Roboto'
|
|
171
|
+
},
|
|
172
|
+
spacing: {
|
|
173
|
+
scale: 1.25
|
|
174
|
+
},
|
|
175
|
+
shadows: {
|
|
176
|
+
intensity: 0.1
|
|
177
|
+
}
|
|
156
178
|
});
|
|
157
179
|
}
|
|
158
180
|
}, [initialTheme, getTheme]);
|
|
@@ -172,33 +194,38 @@ export const ThemeCustomizer= ({
|
|
|
172
194
|
<CardTitle className="flex items-center gap-2">
|
|
173
195
|
🎨 Theme Customizer
|
|
174
196
|
</CardTitle>
|
|
175
|
-
<p className="text-sm text-gray-600 dark
|
|
197
|
+
<p className="text-sm text-gray-600 dark:text-gray-400">
|
|
198
|
+
Customize and preview themes in real-time
|
|
199
|
+
</p>
|
|
200
|
+
</CardHeader>
|
|
201
|
+
<CardContent>
|
|
202
|
+
{/* Tab Navigation */}
|
|
176
203
|
<div className="flex space-x-1 mb-6 border-b">
|
|
177
204
|
{allowCustomization && (
|
|
178
205
|
<>
|
|
179
206
|
<Button
|
|
180
|
-
variant={activeTab === 'colors' ? 'default' }
|
|
207
|
+
variant={activeTab === 'colors' ? 'default' : 'ghost'}
|
|
181
208
|
size="sm"
|
|
182
209
|
onClick={() => setActiveTab('colors')}
|
|
183
210
|
>
|
|
184
211
|
Colors
|
|
185
212
|
</Button>
|
|
186
213
|
<Button
|
|
187
|
-
variant={activeTab === 'fonts' ? 'default' }
|
|
214
|
+
variant={activeTab === 'fonts' ? 'default' : 'ghost'}
|
|
188
215
|
size="sm"
|
|
189
216
|
onClick={() => setActiveTab('fonts')}
|
|
190
217
|
>
|
|
191
218
|
Fonts
|
|
192
219
|
</Button>
|
|
193
220
|
<Button
|
|
194
|
-
variant={activeTab === 'spacing' ? 'default' }
|
|
221
|
+
variant={activeTab === 'spacing' ? 'default' : 'ghost'}
|
|
195
222
|
size="sm"
|
|
196
223
|
onClick={() => setActiveTab('spacing')}
|
|
197
224
|
>
|
|
198
225
|
Spacing
|
|
199
226
|
</Button>
|
|
200
227
|
<Button
|
|
201
|
-
variant={activeTab === 'shadows' ? 'default' }
|
|
228
|
+
variant={activeTab === 'shadows' ? 'default' : 'ghost'}
|
|
202
229
|
size="sm"
|
|
203
230
|
onClick={() => setActiveTab('shadows')}
|
|
204
231
|
>
|
|
@@ -208,7 +235,7 @@ export const ThemeCustomizer= ({
|
|
|
208
235
|
)}
|
|
209
236
|
{showPreview && (
|
|
210
237
|
<Button
|
|
211
|
-
variant={activeTab === 'preview' ? 'default' }
|
|
238
|
+
variant={activeTab === 'preview' ? 'default' : 'ghost'}
|
|
212
239
|
size="sm"
|
|
213
240
|
onClick={() => setActiveTab('preview')}
|
|
214
241
|
>
|
|
@@ -222,7 +249,9 @@ export const ThemeCustomizer= ({
|
|
|
222
249
|
{activeTab === 'colors' && allowCustomization && (
|
|
223
250
|
<div className="space-y-4">
|
|
224
251
|
<h3 className="text-lg font-semibold">Color Customization</h3>
|
|
225
|
-
<div className="grid grid-cols-1 md
|
|
252
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
253
|
+
<div>
|
|
254
|
+
<label className="block text-sm font-medium mb-2">Primary Color</label>
|
|
226
255
|
<Input
|
|
227
256
|
type="color"
|
|
228
257
|
value={customizationState.colors.primary}
|
|
@@ -261,7 +290,9 @@ export const ThemeCustomizer= ({
|
|
|
261
290
|
{activeTab === 'fonts' && allowCustomization && (
|
|
262
291
|
<div className="space-y-4">
|
|
263
292
|
<h3 className="text-lg font-semibold">Font Customization</h3>
|
|
264
|
-
<div className="grid grid-cols-1 md
|
|
293
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
294
|
+
<div>
|
|
295
|
+
<label className="block text-sm font-medium mb-2">Primary Font</label>
|
|
265
296
|
<Input
|
|
266
297
|
value={customizationState.fonts.primary}
|
|
267
298
|
onChange={(e) => handleCustomizationChange('fonts', 'primary', e.target.value)}
|
|
@@ -314,7 +345,8 @@ export const ThemeCustomizer= ({
|
|
|
314
345
|
onChange={(e) => handleCustomizationChange('shadows', 'intensity', Number(e.target.value))}
|
|
315
346
|
className="w-full"
|
|
316
347
|
/>
|
|
317
|
-
<span className="text-sm text-gray-600 dark
|
|
348
|
+
<span className="text-sm text-gray-600 dark:text-gray-400">
|
|
349
|
+
{customizationState.shadows.intensity}
|
|
318
350
|
</span>
|
|
319
351
|
</div>
|
|
320
352
|
</div>
|