@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/dist/components/ui/accessibility-demo.esm.js +30 -24
- package/dist/components/ui/accessibility-demo.js +30 -24
- package/dist/components/ui/advanced-component-architecture-demo.esm.js +235 -179
- package/dist/components/ui/advanced-component-architecture-demo.js +235 -179
- package/dist/components/ui/advanced-transition-system-demo.esm.js +110 -64
- package/dist/components/ui/advanced-transition-system-demo.js +110 -64
- package/dist/components/ui/advanced-transition-system.esm.js +166 -122
- package/dist/components/ui/advanced-transition-system.js +166 -122
- package/dist/components/ui/animation/animated-container.esm.js +52 -29
- package/dist/components/ui/animation/animated-container.js +52 -29
- package/dist/components/ui/animation/staggered-container.esm.js +18 -9
- package/dist/components/ui/animation/staggered-container.js +18 -9
- package/dist/components/ui/animation-demo.esm.js +67 -35
- package/dist/components/ui/animation-demo.js +67 -35
- package/dist/components/ui/badge.esm.js +9 -6
- package/dist/components/ui/badge.js +9 -6
- package/dist/components/ui/battery-conscious-animation-demo.esm.js +122 -87
- package/dist/components/ui/battery-conscious-animation-demo.js +122 -87
- package/dist/components/ui/border-radius-shadow-demo.esm.js +23 -12
- package/dist/components/ui/border-radius-shadow-demo.js +23 -12
- package/dist/components/ui/button.esm.js +8 -2
- package/dist/components/ui/button.js +8 -2
- package/dist/components/ui/card.esm.js +33 -8
- package/dist/components/ui/card.js +33 -8
- package/dist/components/ui/checkbox.esm.js +3 -3
- package/dist/components/ui/checkbox.js +3 -3
- package/dist/components/ui/color-preview.esm.js +68 -45
- package/dist/components/ui/color-preview.js +68 -45
- package/dist/components/ui/data-display/chart.esm.js +112 -84
- package/dist/components/ui/data-display/chart.js +112 -84
- package/dist/components/ui/data-display/data-grid-simple.esm.js +1 -1
- package/dist/components/ui/data-display/data-grid-simple.js +1 -1
- package/dist/components/ui/data-display/data-grid.esm.js +80 -67
- package/dist/components/ui/data-display/data-grid.js +80 -67
- package/dist/components/ui/data-display/list.esm.js +53 -45
- package/dist/components/ui/data-display/list.js +53 -45
- package/dist/components/ui/data-display/table.esm.js +62 -54
- package/dist/components/ui/data-display/table.js +62 -54
- package/dist/components/ui/data-display/timeline.esm.js +39 -34
- package/dist/components/ui/data-display/timeline.js +39 -34
- package/dist/components/ui/data-display/tree.esm.js +116 -84
- package/dist/components/ui/data-display/tree.js +116 -84
- package/dist/components/ui/data-display/types.esm.js +389 -364
- package/dist/components/ui/data-display/types.js +389 -364
- package/dist/components/ui/enterprise-mobile-experience-demo.esm.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience-demo.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience.esm.js +124 -73
- package/dist/components/ui/enterprise-mobile-experience.js +124 -73
- package/dist/components/ui/feedback/alert.esm.js +22 -15
- package/dist/components/ui/feedback/alert.js +22 -15
- package/dist/components/ui/feedback/progress.esm.js +47 -24
- package/dist/components/ui/feedback/progress.js +47 -24
- package/dist/components/ui/feedback/skeleton.esm.js +39 -29
- package/dist/components/ui/feedback/skeleton.js +39 -29
- package/dist/components/ui/feedback/toast.esm.js +62 -38
- package/dist/components/ui/feedback/toast.js +62 -38
- package/dist/components/ui/feedback/types.esm.js +83 -83
- package/dist/components/ui/feedback/types.js +83 -83
- package/dist/components/ui/font-preview.esm.js +41 -39
- package/dist/components/ui/font-preview.js +41 -39
- package/dist/components/ui/form-demo.esm.js +150 -113
- package/dist/components/ui/form-demo.js +150 -113
- package/dist/components/ui/hardware-acceleration-demo.esm.js +137 -87
- package/dist/components/ui/hardware-acceleration-demo.js +137 -87
- package/dist/components/ui/input.esm.js +4 -1
- package/dist/components/ui/input.js +4 -1
- package/dist/components/ui/layout-demo.esm.js +81 -56
- package/dist/components/ui/layout-demo.js +81 -56
- package/dist/components/ui/layouts/adaptive-layout.esm.js +27 -8
- package/dist/components/ui/layouts/adaptive-layout.js +27 -8
- package/dist/components/ui/layouts/desktop-layout.esm.js +39 -19
- package/dist/components/ui/layouts/desktop-layout.js +39 -19
- package/dist/components/ui/layouts/mobile-layout.esm.js +19 -9
- package/dist/components/ui/layouts/mobile-layout.js +19 -9
- package/dist/components/ui/layouts/tablet-layout.esm.js +28 -14
- package/dist/components/ui/layouts/tablet-layout.js +28 -14
- package/dist/components/ui/mobile-form-validation.esm.js +120 -87
- package/dist/components/ui/mobile-form-validation.js +120 -87
- package/dist/components/ui/mobile-input-demo.esm.js +19 -13
- package/dist/components/ui/mobile-input-demo.js +19 -13
- package/dist/components/ui/mobile-input.esm.js +185 -120
- package/dist/components/ui/mobile-input.js +185 -120
- package/dist/components/ui/mobile-skeleton-loading-demo.esm.js +128 -111
- package/dist/components/ui/mobile-skeleton-loading-demo.js +128 -111
- package/dist/components/ui/navigation/breadcrumb.esm.js +17 -14
- package/dist/components/ui/navigation/breadcrumb.js +17 -14
- package/dist/components/ui/navigation/index.esm.js +0 -1
- package/dist/components/ui/navigation/index.js +0 -1
- package/dist/components/ui/navigation/menu.esm.js +49 -35
- package/dist/components/ui/navigation/menu.js +49 -35
- package/dist/components/ui/navigation/navigation-demo.esm.js +81 -74
- package/dist/components/ui/navigation/navigation-demo.js +81 -74
- package/dist/components/ui/navigation/pagination.esm.js +62 -50
- package/dist/components/ui/navigation/pagination.js +62 -50
- package/dist/components/ui/navigation/sidebar.esm.js +56 -42
- package/dist/components/ui/navigation/sidebar.js +56 -42
- package/dist/components/ui/navigation/stepper.esm.js +34 -23
- package/dist/components/ui/navigation/stepper.js +34 -23
- package/dist/components/ui/navigation/tabs.esm.js +32 -21
- package/dist/components/ui/navigation/tabs.js +32 -21
- package/dist/components/ui/navigation/types.esm.js +196 -195
- package/dist/components/ui/navigation/types.js +196 -195
- package/dist/components/ui/overlay/backdrop.esm.js +17 -16
- package/dist/components/ui/overlay/backdrop.js +17 -16
- package/dist/components/ui/overlay/focus-manager.esm.js +21 -19
- package/dist/components/ui/overlay/focus-manager.js +21 -19
- package/dist/components/ui/overlay/index.esm.js +0 -2
- package/dist/components/ui/overlay/index.js +0 -2
- package/dist/components/ui/overlay/modal.esm.js +38 -34
- package/dist/components/ui/overlay/modal.js +38 -34
- package/dist/components/ui/overlay/overlay-manager.esm.js +25 -20
- package/dist/components/ui/overlay/overlay-manager.js +25 -20
- package/dist/components/ui/overlay/popover.esm.js +74 -58
- package/dist/components/ui/overlay/popover.js +74 -58
- package/dist/components/ui/overlay/portal.esm.js +7 -7
- package/dist/components/ui/overlay/portal.js +7 -7
- package/dist/components/ui/overlay/tooltip.esm.js +54 -39
- package/dist/components/ui/overlay/tooltip.js +54 -39
- package/dist/components/ui/overlay/types.esm.js +132 -131
- package/dist/components/ui/overlay/types.js +132 -131
- package/dist/components/ui/performance-demo.esm.js +135 -88
- package/dist/components/ui/performance-demo.js +135 -88
- package/dist/components/ui/semantic-input-system-demo.esm.js +117 -80
- package/dist/components/ui/semantic-input-system-demo.js +117 -80
- package/dist/components/ui/theme-customizer.esm.js +84 -52
- package/dist/components/ui/theme-customizer.js +84 -52
- package/dist/components/ui/theme-preview.esm.js +95 -43
- package/dist/components/ui/theme-preview.js +95 -43
- package/dist/components/ui/theme-switcher.esm.js +70 -44
- package/dist/components/ui/theme-switcher.js +70 -44
- package/dist/components/ui/theme-toggle.esm.js +3 -3
- package/dist/components/ui/theme-toggle.js +3 -3
- package/dist/components/ui/token-demo.esm.js +33 -21
- package/dist/components/ui/token-demo.js +33 -21
- package/dist/components/ui/touch-demo.esm.js +102 -73
- package/dist/components/ui/touch-demo.js +102 -73
- package/dist/components/ui/touch-friendly-interface-demo.esm.js +102 -64
- package/dist/components/ui/touch-friendly-interface-demo.js +102 -64
- package/dist/components/ui/touch-friendly-interface.esm.js +85 -61
- package/dist/components/ui/touch-friendly-interface.js +85 -61
- package/dist/hooks/use-accessibility-support.esm.js +115 -85
- package/dist/hooks/use-accessibility-support.js +115 -85
- package/dist/hooks/use-adaptive-layout.esm.js +56 -33
- package/dist/hooks/use-adaptive-layout.js +56 -33
- package/dist/hooks/use-advanced-patterns.esm.js +57 -42
- package/dist/hooks/use-advanced-patterns.js +57 -42
- package/dist/hooks/use-advanced-transition-system.esm.js +112 -71
- package/dist/hooks/use-advanced-transition-system.js +112 -71
- package/dist/hooks/use-animation-profile.esm.js +63 -34
- package/dist/hooks/use-animation-profile.js +63 -34
- package/dist/hooks/use-battery-animations.esm.js +80 -55
- package/dist/hooks/use-battery-animations.js +80 -55
- package/dist/hooks/use-battery-conscious-loading.esm.js +166 -123
- package/dist/hooks/use-battery-conscious-loading.js +166 -123
- package/dist/hooks/use-battery-optimization.esm.js +78 -55
- package/dist/hooks/use-battery-optimization.js +78 -55
- package/dist/hooks/use-battery-status.esm.js +73 -51
- package/dist/hooks/use-battery-status.js +73 -51
- package/dist/hooks/use-component-performance.esm.js +62 -47
- package/dist/hooks/use-component-performance.js +62 -47
- package/dist/hooks/use-device-loading-states.esm.js +152 -109
- package/dist/hooks/use-device-loading-states.js +152 -109
- package/dist/hooks/use-device.esm.js +25 -14
- package/dist/hooks/use-device.js +25 -14
- package/dist/hooks/use-enterprise-mobile-experience.esm.js +137 -88
- package/dist/hooks/use-enterprise-mobile-experience.js +137 -88
- package/dist/hooks/use-form-feedback.esm.js +124 -81
- package/dist/hooks/use-form-feedback.js +124 -81
- package/dist/hooks/use-form-performance.esm.js +127 -92
- package/dist/hooks/use-form-performance.js +127 -92
- package/dist/hooks/use-frame-rate.esm.js +56 -37
- package/dist/hooks/use-frame-rate.js +56 -37
- package/dist/hooks/use-gestures.esm.js +96 -72
- package/dist/hooks/use-gestures.js +96 -72
- package/dist/hooks/use-hardware-acceleration.esm.js +65 -37
- package/dist/hooks/use-hardware-acceleration.js +65 -37
- package/dist/hooks/use-input-accessibility.esm.js +157 -119
- package/dist/hooks/use-input-accessibility.js +157 -119
- package/dist/hooks/use-input-performance.esm.js +139 -104
- package/dist/hooks/use-input-performance.js +139 -104
- package/dist/hooks/use-layout-performance.esm.js +50 -29
- package/dist/hooks/use-layout-performance.js +50 -29
- package/dist/hooks/use-loading-accessibility.esm.js +209 -169
- package/dist/hooks/use-loading-accessibility.js +209 -169
- package/dist/hooks/use-loading-performance.esm.js +117 -93
- package/dist/hooks/use-loading-performance.js +117 -93
- package/dist/hooks/use-memory-usage.esm.js +57 -38
- package/dist/hooks/use-memory-usage.js +57 -38
- package/dist/hooks/use-mobile-form-layout.esm.js +111 -74
- package/dist/hooks/use-mobile-form-layout.js +111 -74
- package/dist/hooks/use-mobile-form-validation.esm.js +211 -144
- package/dist/hooks/use-mobile-form-validation.js +211 -144
- package/dist/hooks/use-mobile-keyboard-optimization.esm.js +154 -113
- package/dist/hooks/use-mobile-keyboard-optimization.js +154 -113
- package/dist/hooks/use-mobile-layout.esm.js +73 -51
- package/dist/hooks/use-mobile-layout.js +73 -51
- package/dist/hooks/use-mobile-optimization.esm.js +72 -44
- package/dist/hooks/use-mobile-optimization.js +72 -44
- package/dist/hooks/use-mobile-skeleton.esm.js +97 -64
- package/dist/hooks/use-mobile-skeleton.js +97 -64
- package/dist/hooks/use-mobile-touch.esm.js +128 -93
- package/dist/hooks/use-mobile-touch.js +128 -93
- package/dist/hooks/use-performance-throttling.esm.js +72 -48
- package/dist/hooks/use-performance-throttling.js +72 -48
- package/dist/hooks/use-performance.esm.js +90 -52
- package/dist/hooks/use-performance.js +90 -52
- package/dist/hooks/use-reusable-architecture.esm.js +94 -65
- package/dist/hooks/use-reusable-architecture.js +94 -65
- package/dist/hooks/use-semantic-input-types.esm.js +166 -124
- package/dist/hooks/use-semantic-input-types.js +166 -124
- package/dist/hooks/use-semantic-input.esm.js +178 -126
- package/dist/hooks/use-semantic-input.js +178 -126
- package/dist/hooks/use-tablet-layout.esm.js +67 -38
- package/dist/hooks/use-tablet-layout.js +67 -38
- package/dist/hooks/use-touch-friendly-input.esm.js +193 -149
- package/dist/hooks/use-touch-friendly-input.js +193 -149
- package/dist/hooks/use-touch-friendly-interface.esm.js +99 -67
- package/dist/hooks/use-touch-friendly-interface.js +99 -67
- package/dist/hooks/use-touch-optimization.esm.js +99 -72
- package/dist/hooks/use-touch-optimization.js +99 -72
- package/dist/index.esm.js +157 -281
- package/dist/index.js +157 -281
- package/dist/lib/utils.esm.js +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/plugins/theme-css-generator.esm.js +104 -55
- package/dist/plugins/theme-css-generator.js +104 -55
- package/dist/provider.esm.js +4 -4
- package/dist/provider.js +4 -4
- package/dist/styles.css +1 -1
- package/dist/theme.esm.js +633 -468
- package/dist/theme.js +633 -468
- package/dist/themes/ThemeContext.esm.js +15 -15
- package/dist/themes/ThemeContext.js +15 -15
- package/dist/themes/ThemeProvider.esm.js +25 -22
- package/dist/themes/ThemeProvider.js +25 -22
- package/dist/themes/accessibility.esm.js +147 -108
- package/dist/themes/accessibility.js +147 -108
- package/dist/themes/aria-patterns.esm.js +198 -162
- package/dist/themes/aria-patterns.js +198 -162
- package/dist/themes/base-themes.esm.js +14 -11
- package/dist/themes/base-themes.js +14 -11
- package/dist/themes/colorManager.esm.js +101 -83
- package/dist/themes/colorManager.js +101 -83
- package/dist/themes/examples/dark-theme.esm.js +133 -103
- package/dist/themes/examples/dark-theme.js +133 -103
- package/dist/themes/examples/minimal-theme.esm.js +83 -61
- package/dist/themes/examples/minimal-theme.js +83 -61
- package/dist/themes/focus-management.esm.js +202 -143
- package/dist/themes/focus-management.js +202 -143
- package/dist/themes/fontLoader.esm.js +28 -19
- package/dist/themes/fontLoader.js +28 -19
- package/dist/themes/high-contrast.esm.js +152 -104
- package/dist/themes/high-contrast.js +152 -104
- package/dist/themes/index.esm.js +1 -1
- package/dist/themes/index.js +1 -1
- package/dist/themes/inheritance.esm.js +35 -27
- package/dist/themes/inheritance.js +35 -27
- package/dist/themes/keyboard-navigation.esm.js +152 -123
- package/dist/themes/keyboard-navigation.js +152 -123
- package/dist/themes/motion-reduction.esm.js +193 -133
- package/dist/themes/motion-reduction.js +193 -133
- package/dist/themes/navigation.esm.js +146 -146
- package/dist/themes/navigation.js +146 -146
- package/dist/themes/screen-reader.esm.js +159 -94
- package/dist/themes/screen-reader.js +159 -94
- package/dist/themes/systemThemeDetector.esm.js +42 -34
- package/dist/themes/systemThemeDetector.js +42 -34
- package/dist/themes/themeCSSUpdater.esm.js +21 -9
- package/dist/themes/themeCSSUpdater.js +21 -9
- package/dist/themes/themePersistence.esm.js +68 -47
- package/dist/themes/themePersistence.js +68 -47
- package/dist/themes/themes/stan-design.esm.js +633 -468
- package/dist/themes/themes/stan-design.js +633 -468
- package/dist/themes/types.esm.js +301 -287
- package/dist/themes/types.js +301 -287
- package/dist/themes/useSystemTheme.esm.js +4 -4
- package/dist/themes/useSystemTheme.js +4 -4
- package/dist/themes/useTheme.esm.js +4 -4
- package/dist/themes/useTheme.js +4 -4
- package/dist/themes/validation.esm.js +128 -77
- package/dist/themes/validation.js +128 -77
- package/dist/tokens/index.esm.js +1 -2
- package/dist/tokens/index.js +1 -2
- package/dist/tokens/tokenExporter.esm.js +87 -61
- package/dist/tokens/tokenExporter.js +87 -61
- package/dist/tokens/tokenGenerator.esm.js +86 -77
- package/dist/tokens/tokenGenerator.js +86 -77
- package/dist/tokens/tokenManager.esm.js +64 -51
- package/dist/tokens/tokenManager.js +64 -51
- package/dist/tokens/tokenValidator.esm.js +193 -147
- package/dist/tokens/tokenValidator.js +193 -147
- package/dist/tokens/types.esm.js +49 -35
- package/dist/tokens/types.js +49 -35
- package/dist/utils/bundle-analyzer.esm.js +83 -65
- package/dist/utils/bundle-analyzer.js +83 -65
- package/dist/utils/bundle-splitting.esm.js +142 -117
- package/dist/utils/bundle-splitting.js +142 -117
- package/dist/utils/lazy-loading.esm.js +132 -106
- package/dist/utils/lazy-loading.js +132 -106
- package/dist/utils/performance-monitor.esm.js +170 -129
- package/dist/utils/performance-monitor.js +170 -129
- package/dist/utils/tree-shaking.esm.js +69 -61
- package/dist/utils/tree-shaking.js +69 -61
- package/package.json +1 -1
- package/src/index.ts +146 -146
|
@@ -1,24 +1,45 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface GPUInfo {
|
|
4
|
-
vendor
|
|
4
|
+
vendor: string
|
|
5
|
+
renderer: string
|
|
6
|
+
version: string
|
|
7
|
+
isWebGLSupported: boolean
|
|
8
|
+
isWebGL2Supported: boolean
|
|
9
|
+
maxTextureSize: number
|
|
10
|
+
maxAnisotropy: number
|
|
11
|
+
maxPrecision: string
|
|
12
|
+
}
|
|
5
13
|
|
|
6
14
|
export interface HardwareAccelerationMetrics {
|
|
7
|
-
fps
|
|
15
|
+
fps: number
|
|
16
|
+
frameTime: number
|
|
17
|
+
memoryUsage: number
|
|
18
|
+
gpuUtilization: number
|
|
19
|
+
batteryImpact: number
|
|
20
|
+
performanceScore: number
|
|
21
|
+
}
|
|
8
22
|
|
|
9
23
|
export interface HardwareAccelerationConfig {
|
|
10
|
-
enableGPUMonitoring
|
|
24
|
+
enableGPUMonitoring?: boolean
|
|
25
|
+
enablePerformanceTracking?: boolean
|
|
26
|
+
enableBatteryOptimization?: boolean
|
|
27
|
+
enableAutomaticOptimization?: boolean
|
|
28
|
+
fpsTarget?: number
|
|
29
|
+
memoryThreshold?: number
|
|
30
|
+
batteryLowThreshold?: number
|
|
31
|
+
}
|
|
11
32
|
|
|
12
33
|
export interface HardwareAccelerationCallbacks {
|
|
13
|
-
onGPUDetected
|
|
14
|
-
onPerformanceWarning
|
|
15
|
-
onBatteryWarning
|
|
16
|
-
onOptimizationApplied
|
|
34
|
+
onGPUDetected?: (gpuInfo: GPUInfo) => void
|
|
35
|
+
onPerformanceWarning?: (warning: string, metrics: HardwareAccelerationMetrics) => void
|
|
36
|
+
onBatteryWarning?: (level: number, isLow: boolean) => void
|
|
37
|
+
onOptimizationApplied?: (optimization: string) => void
|
|
17
38
|
}
|
|
18
39
|
|
|
19
40
|
export const useHardwareAcceleration = (
|
|
20
|
-
config= {},
|
|
21
|
-
callbacks= {}
|
|
41
|
+
config: HardwareAccelerationConfig = {},
|
|
42
|
+
callbacks: HardwareAccelerationCallbacks = {}
|
|
22
43
|
) => {
|
|
23
44
|
const {
|
|
24
45
|
enableGPUMonitoring = true,
|
|
@@ -32,12 +53,13 @@ export const useHardwareAcceleration = (
|
|
|
32
53
|
|
|
33
54
|
const [gpuInfo, setGpuInfo] = useState<GPUInfo | null>(null)
|
|
34
55
|
const [metrics, setMetrics] = useState<HardwareAccelerationMetrics>({
|
|
35
|
-
fps,
|
|
36
|
-
frameTime,
|
|
37
|
-
memoryUsage,
|
|
38
|
-
gpuUtilization,
|
|
39
|
-
batteryImpact,
|
|
40
|
-
performanceScore
|
|
56
|
+
fps: 60,
|
|
57
|
+
frameTime: 16.67,
|
|
58
|
+
memoryUsage: 0,
|
|
59
|
+
gpuUtilization: 0,
|
|
60
|
+
batteryImpact: 0,
|
|
61
|
+
performanceScore: 100
|
|
62
|
+
})
|
|
41
63
|
const [isOptimizing, setIsOptimizing] = useState(false)
|
|
42
64
|
const [optimizations, setOptimizations] = useState<string[]>([])
|
|
43
65
|
const [isHardwareAccelerated, setIsHardwareAccelerated] = useState(false)
|
|
@@ -49,7 +71,7 @@ export const useHardwareAcceleration = (
|
|
|
49
71
|
const performanceTimerRef = useRef<number | null>(null)
|
|
50
72
|
|
|
51
73
|
// GPU capability detection
|
|
52
|
-
const detectGPU = useCallback(()=> {
|
|
74
|
+
const detectGPU = useCallback((): GPUInfo | null => {
|
|
53
75
|
if (!enableGPUMonitoring) return null
|
|
54
76
|
|
|
55
77
|
try {
|
|
@@ -58,18 +80,21 @@ export const useHardwareAcceleration = (
|
|
|
58
80
|
|
|
59
81
|
if (!gl) {
|
|
60
82
|
return {
|
|
61
|
-
vendor,
|
|
62
|
-
renderer,
|
|
63
|
-
version,
|
|
64
|
-
isWebGLSupported,
|
|
65
|
-
isWebGL2Supported,
|
|
66
|
-
maxTextureSize,
|
|
67
|
-
maxAnisotropy,
|
|
68
|
-
maxPrecision
|
|
83
|
+
vendor: 'Unknown',
|
|
84
|
+
renderer: 'WebGL not supported',
|
|
85
|
+
version: 'Unknown',
|
|
86
|
+
isWebGLSupported: false,
|
|
87
|
+
isWebGL2Supported: false,
|
|
88
|
+
maxTextureSize: 0,
|
|
89
|
+
maxAnisotropy: 0,
|
|
90
|
+
maxPrecision: 'Unknown'
|
|
91
|
+
}
|
|
69
92
|
}
|
|
70
93
|
|
|
71
94
|
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info')
|
|
72
|
-
const vendor = debugInfo ? gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)
|
|
95
|
+
const vendor = debugInfo ? gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) : 'Unknown'
|
|
96
|
+
const renderer = debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : 'Unknown'
|
|
97
|
+
const version = gl.getParameter(gl.VERSION) || 'Unknown'
|
|
73
98
|
|
|
74
99
|
// Check WebGL2 support
|
|
75
100
|
const canvas2 = document.createElement('canvas')
|
|
@@ -81,11 +106,11 @@ export const useHardwareAcceleration = (
|
|
|
81
106
|
const maxAnisotropy = gl.getParameter((gl as any).MAX_TEXTURE_MAX_ANISOTROPY_EXT) || 0
|
|
82
107
|
const maxPrecision = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT)?.precision?.toString() || 'Unknown'
|
|
83
108
|
|
|
84
|
-
const gpuInfo= {
|
|
109
|
+
const gpuInfo: GPUInfo = {
|
|
85
110
|
vendor,
|
|
86
111
|
renderer,
|
|
87
112
|
version,
|
|
88
|
-
isWebGLSupported,
|
|
113
|
+
isWebGLSupported: true,
|
|
89
114
|
isWebGL2Supported,
|
|
90
115
|
maxTextureSize,
|
|
91
116
|
maxAnisotropy,
|
|
@@ -97,7 +122,7 @@ export const useHardwareAcceleration = (
|
|
|
97
122
|
|
|
98
123
|
return gpuInfo
|
|
99
124
|
} catch (error) {
|
|
100
|
-
console.warn('GPU detection failed, error)
|
|
125
|
+
console.warn('GPU detection failed:', error)
|
|
101
126
|
return null
|
|
102
127
|
}
|
|
103
128
|
}, [enableGPUMonitoring, callbacks])
|
|
@@ -128,7 +153,7 @@ export const useHardwareAcceleration = (
|
|
|
128
153
|
|
|
129
154
|
const performanceScore = Math.round((fpsScore + timeScore + memoryScore + gpuScore) / 4)
|
|
130
155
|
|
|
131
|
-
const newMetrics= {
|
|
156
|
+
const newMetrics: HardwareAccelerationMetrics = {
|
|
132
157
|
fps,
|
|
133
158
|
frameTime,
|
|
134
159
|
memoryUsage,
|
|
@@ -166,7 +191,7 @@ export const useHardwareAcceleration = (
|
|
|
166
191
|
applyBatteryOptimizations()
|
|
167
192
|
}
|
|
168
193
|
} catch (error) {
|
|
169
|
-
console.warn('Battery API not available, error)
|
|
194
|
+
console.warn('Battery API not available:', error)
|
|
170
195
|
}
|
|
171
196
|
}, [enableBatteryOptimization, batteryLowThreshold, callbacks])
|
|
172
197
|
|
|
@@ -199,7 +224,7 @@ export const useHardwareAcceleration = (
|
|
|
199
224
|
setIsOptimizing(true)
|
|
200
225
|
|
|
201
226
|
setTimeout(() => {
|
|
202
|
-
const optimizations] = []
|
|
227
|
+
const optimizations: string[] = []
|
|
203
228
|
|
|
204
229
|
if (metrics.fps < fpsTarget * 0.8) {
|
|
205
230
|
optimizations.push('Hardware acceleration optimized for better FPS')
|
|
@@ -261,7 +286,7 @@ export const useHardwareAcceleration = (
|
|
|
261
286
|
}
|
|
262
287
|
}
|
|
263
288
|
} catch (error) {
|
|
264
|
-
console.warn('Hardware acceleration initialization failed, error)
|
|
289
|
+
console.warn('Hardware acceleration initialization failed:', error)
|
|
265
290
|
}
|
|
266
291
|
}, [detectGPU, enablePerformanceTracking, enableBatteryOptimization, checkBatteryStatus, measurePerformance])
|
|
267
292
|
|
|
@@ -303,11 +328,14 @@ export const useHardwareAcceleration = (
|
|
|
303
328
|
checkHardwareAcceleration,
|
|
304
329
|
|
|
305
330
|
// Computed values
|
|
306
|
-
isGPUSupported,
|
|
307
|
-
isWebGL2Supported,
|
|
308
|
-
performanceLevel
|
|
309
|
-
|
|
310
|
-
|
|
331
|
+
isGPUSupported: !!gpuInfo?.isWebGLSupported,
|
|
332
|
+
isWebGL2Supported: !!gpuInfo?.isWebGL2Supported,
|
|
333
|
+
performanceLevel: metrics.performanceScore >= 90 ? 'excellent' :
|
|
334
|
+
metrics.performanceScore >= 80 ? 'good' :
|
|
335
|
+
metrics.performanceScore >= 70 ? 'fair' : 'poor',
|
|
336
|
+
needsOptimization: metrics.performanceScore < 70,
|
|
337
|
+
batteryOptimized: metrics.batteryImpact < 50
|
|
338
|
+
}
|
|
311
339
|
}
|
|
312
340
|
|
|
313
341
|
export default useHardwareAcceleration
|
|
@@ -1,27 +1,51 @@
|
|
|
1
1
|
import { useState, useCallback, useRef, useEffect } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface InputAccessibilityConfig {
|
|
4
|
-
enableARIA
|
|
5
|
-
|
|
4
|
+
enableARIA?: boolean
|
|
5
|
+
enableKeyboardNavigation?: boolean
|
|
6
|
+
enableScreenReader?: boolean
|
|
7
|
+
enableFocusManagement?: boolean
|
|
8
|
+
enableHighContrast?: boolean
|
|
9
|
+
enableReducedMotion?: boolean
|
|
10
|
+
enableVoiceControl?: boolean
|
|
11
|
+
ariaLabels?: Record<string, string>
|
|
12
|
+
focusTrap?: boolean
|
|
13
|
+
skipLinks?: boolean
|
|
14
|
+
}
|
|
6
15
|
|
|
7
16
|
export interface AccessibilityFeature {
|
|
8
|
-
id
|
|
17
|
+
id: string
|
|
18
|
+
name: string
|
|
19
|
+
type: 'aria' | 'keyboard' | 'screen-reader' | 'focus' | 'contrast' | 'motion' | 'voice'
|
|
20
|
+
enabled: boolean
|
|
21
|
+
impact: 'low' | 'medium' | 'high'
|
|
22
|
+
description: string
|
|
23
|
+
ariaLabel?: string
|
|
24
|
+
keyboardShortcut?: string
|
|
25
|
+
}
|
|
9
26
|
|
|
10
27
|
export interface AccessibilityState {
|
|
11
|
-
isHighContrast
|
|
28
|
+
isHighContrast: boolean
|
|
29
|
+
isReducedMotion: boolean
|
|
30
|
+
isVoiceControl: boolean
|
|
31
|
+
isKeyboardNavigating: boolean
|
|
32
|
+
isScreenReaderActive: boolean
|
|
33
|
+
focusIndex: number
|
|
34
|
+
accessibilityScore: number
|
|
35
|
+
activeFeatures: string[]
|
|
12
36
|
}
|
|
13
37
|
|
|
14
38
|
export interface InputAccessibilityCallbacks {
|
|
15
|
-
onAccessibilityFeatureEnabled
|
|
16
|
-
onKeyboardNavigationEnabled
|
|
17
|
-
onScreenReaderOptimized
|
|
18
|
-
onFocusManagementEnhanced
|
|
19
|
-
onAccessibilityScoreChanged
|
|
39
|
+
onAccessibilityFeatureEnabled?: (feature: AccessibilityFeature) => void
|
|
40
|
+
onKeyboardNavigationEnabled?: (feature: string) => void
|
|
41
|
+
onScreenReaderOptimized?: (optimization: string) => void
|
|
42
|
+
onFocusManagementEnhanced?: (feature: string) => void
|
|
43
|
+
onAccessibilityScoreChanged?: (score: number) => void
|
|
20
44
|
}
|
|
21
45
|
|
|
22
46
|
export const useInputAccessibility = (
|
|
23
|
-
config= {},
|
|
24
|
-
callbacks= {}
|
|
47
|
+
config: InputAccessibilityConfig = {},
|
|
48
|
+
callbacks: InputAccessibilityCallbacks = {}
|
|
25
49
|
) => {
|
|
26
50
|
const {
|
|
27
51
|
enableARIA = true,
|
|
@@ -36,14 +60,14 @@ export const useInputAccessibility = (
|
|
|
36
60
|
|
|
37
61
|
const [accessibilityFeatures, setAccessibilityFeatures] = useState<AccessibilityFeature[]>([])
|
|
38
62
|
const [accessibilityState, setAccessibilityState] = useState<AccessibilityState>({
|
|
39
|
-
isHighContrast,
|
|
40
|
-
isReducedMotion,
|
|
41
|
-
isVoiceControl,
|
|
42
|
-
isKeyboardNavigating,
|
|
43
|
-
isScreenReaderActive,
|
|
44
|
-
focusIndex,
|
|
45
|
-
accessibilityScore,
|
|
46
|
-
activeFeatures]
|
|
63
|
+
isHighContrast: false,
|
|
64
|
+
isReducedMotion: false,
|
|
65
|
+
isVoiceControl: false,
|
|
66
|
+
isKeyboardNavigating: false,
|
|
67
|
+
isScreenReaderActive: false,
|
|
68
|
+
focusIndex: 0,
|
|
69
|
+
accessibilityScore: 0,
|
|
70
|
+
activeFeatures: []
|
|
47
71
|
})
|
|
48
72
|
|
|
49
73
|
const [isEnhancing, setIsEnhancing] = useState(false)
|
|
@@ -56,97 +80,106 @@ export const useInputAccessibility = (
|
|
|
56
80
|
|
|
57
81
|
// Initialize accessibility features
|
|
58
82
|
const initializeAccessibilityFeatures = useCallback(() => {
|
|
59
|
-
const features] = [
|
|
83
|
+
const features: AccessibilityFeature[] = [
|
|
60
84
|
{
|
|
61
|
-
id,
|
|
62
|
-
name,
|
|
63
|
-
type,
|
|
64
|
-
enabled,
|
|
65
|
-
impact,
|
|
66
|
-
description,
|
|
67
|
-
ariaLabel
|
|
85
|
+
id: 'aria-1',
|
|
86
|
+
name: 'ARIA Labels',
|
|
87
|
+
type: 'aria',
|
|
88
|
+
enabled: enableARIA,
|
|
89
|
+
impact: 'high',
|
|
90
|
+
description: 'Enhanced ARIA labels for screen readers',
|
|
91
|
+
ariaLabel: 'Enhanced accessibility labels'
|
|
92
|
+
},
|
|
68
93
|
{
|
|
69
|
-
id,
|
|
70
|
-
name,
|
|
71
|
-
type,
|
|
72
|
-
enabled,
|
|
73
|
-
impact,
|
|
74
|
-
description,
|
|
75
|
-
ariaLabel
|
|
94
|
+
id: 'aria-2',
|
|
95
|
+
name: 'ARIA Descriptions',
|
|
96
|
+
type: 'aria',
|
|
97
|
+
enabled: enableARIA,
|
|
98
|
+
impact: 'medium',
|
|
99
|
+
description: 'Detailed ARIA descriptions for complex inputs',
|
|
100
|
+
ariaLabel: 'Detailed input descriptions'
|
|
101
|
+
},
|
|
76
102
|
{
|
|
77
|
-
id,
|
|
78
|
-
name,
|
|
79
|
-
type,
|
|
80
|
-
enabled,
|
|
81
|
-
impact,
|
|
82
|
-
description,
|
|
83
|
-
keyboardShortcut, Shift+Tab, Arrow keys'
|
|
103
|
+
id: 'keyboard-1',
|
|
104
|
+
name: 'Keyboard Navigation',
|
|
105
|
+
type: 'keyboard',
|
|
106
|
+
enabled: enableKeyboardNavigation,
|
|
107
|
+
impact: 'high',
|
|
108
|
+
description: 'Full keyboard navigation support',
|
|
109
|
+
keyboardShortcut: 'Tab, Shift+Tab, Arrow keys'
|
|
84
110
|
},
|
|
85
111
|
{
|
|
86
|
-
id,
|
|
87
|
-
name,
|
|
88
|
-
type,
|
|
89
|
-
enabled,
|
|
90
|
-
impact,
|
|
91
|
-
description,
|
|
92
|
-
keyboardShortcut, Ctrl+Z, etc.'
|
|
112
|
+
id: 'keyboard-2',
|
|
113
|
+
name: 'Keyboard Shortcuts',
|
|
114
|
+
type: 'keyboard',
|
|
115
|
+
enabled: enableKeyboardNavigation,
|
|
116
|
+
impact: 'medium',
|
|
117
|
+
description: 'Custom keyboard shortcuts for common actions',
|
|
118
|
+
keyboardShortcut: 'Ctrl+S, Ctrl+Z, etc.'
|
|
93
119
|
},
|
|
94
120
|
{
|
|
95
|
-
id,
|
|
96
|
-
name,
|
|
97
|
-
type,
|
|
98
|
-
enabled,
|
|
99
|
-
impact,
|
|
100
|
-
description,
|
|
101
|
-
ariaLabel
|
|
121
|
+
id: 'screen-reader-1',
|
|
122
|
+
name: 'Screen Reader Support',
|
|
123
|
+
type: 'screen-reader',
|
|
124
|
+
enabled: enableScreenReader,
|
|
125
|
+
impact: 'high',
|
|
126
|
+
description: 'Optimized screen reader compatibility',
|
|
127
|
+
ariaLabel: 'Screen reader optimized'
|
|
128
|
+
},
|
|
102
129
|
{
|
|
103
|
-
id,
|
|
104
|
-
name,
|
|
105
|
-
type,
|
|
106
|
-
enabled,
|
|
107
|
-
impact,
|
|
108
|
-
description,
|
|
109
|
-
ariaLabel
|
|
130
|
+
id: 'screen-reader-2',
|
|
131
|
+
name: 'Live Regions',
|
|
132
|
+
type: 'screen-reader',
|
|
133
|
+
enabled: enableScreenReader,
|
|
134
|
+
impact: 'medium',
|
|
135
|
+
description: 'Live regions for dynamic content updates',
|
|
136
|
+
ariaLabel: 'Live content updates'
|
|
137
|
+
},
|
|
110
138
|
{
|
|
111
|
-
id,
|
|
112
|
-
name,
|
|
113
|
-
type,
|
|
114
|
-
enabled,
|
|
115
|
-
impact,
|
|
116
|
-
description,
|
|
117
|
-
ariaLabel
|
|
139
|
+
id: 'focus-1',
|
|
140
|
+
name: 'Focus Management',
|
|
141
|
+
type: 'focus',
|
|
142
|
+
enabled: enableFocusManagement,
|
|
143
|
+
impact: 'high',
|
|
144
|
+
description: 'Enhanced focus management and visible focus indicators',
|
|
145
|
+
ariaLabel: 'Focus management'
|
|
146
|
+
},
|
|
118
147
|
{
|
|
119
|
-
id,
|
|
120
|
-
name,
|
|
121
|
-
type,
|
|
122
|
-
enabled,
|
|
123
|
-
impact,
|
|
124
|
-
description,
|
|
125
|
-
ariaLabel
|
|
148
|
+
id: 'focus-2',
|
|
149
|
+
name: 'Focus Trap',
|
|
150
|
+
type: 'focus',
|
|
151
|
+
enabled: enableFocusManagement && focusTrap,
|
|
152
|
+
impact: 'medium',
|
|
153
|
+
description: 'Focus trap for modal dialogs and overlays',
|
|
154
|
+
ariaLabel: 'Focus containment'
|
|
155
|
+
},
|
|
126
156
|
{
|
|
127
|
-
id,
|
|
128
|
-
name,
|
|
129
|
-
type,
|
|
130
|
-
enabled,
|
|
131
|
-
impact,
|
|
132
|
-
description,
|
|
133
|
-
ariaLabel
|
|
157
|
+
id: 'contrast-1',
|
|
158
|
+
name: 'High Contrast',
|
|
159
|
+
type: 'contrast',
|
|
160
|
+
enabled: enableHighContrast,
|
|
161
|
+
impact: 'medium',
|
|
162
|
+
description: 'High contrast mode support',
|
|
163
|
+
ariaLabel: 'High contrast support'
|
|
164
|
+
},
|
|
134
165
|
{
|
|
135
|
-
id,
|
|
136
|
-
name,
|
|
137
|
-
type,
|
|
138
|
-
enabled,
|
|
139
|
-
impact,
|
|
140
|
-
description,
|
|
141
|
-
ariaLabel
|
|
166
|
+
id: 'motion-1',
|
|
167
|
+
name: 'Reduced Motion',
|
|
168
|
+
type: 'motion',
|
|
169
|
+
enabled: enableReducedMotion,
|
|
170
|
+
impact: 'medium',
|
|
171
|
+
description: 'Reduced motion preference support',
|
|
172
|
+
ariaLabel: 'Reduced motion support'
|
|
173
|
+
},
|
|
142
174
|
{
|
|
143
|
-
id,
|
|
144
|
-
name,
|
|
145
|
-
type,
|
|
146
|
-
enabled,
|
|
147
|
-
impact,
|
|
148
|
-
description,
|
|
149
|
-
ariaLabel
|
|
175
|
+
id: 'voice-1',
|
|
176
|
+
name: 'Voice Control',
|
|
177
|
+
type: 'voice',
|
|
178
|
+
enabled: enableVoiceControl,
|
|
179
|
+
impact: 'low',
|
|
180
|
+
description: 'Voice control and speech recognition support',
|
|
181
|
+
ariaLabel: 'Voice control support'
|
|
182
|
+
}
|
|
150
183
|
]
|
|
151
184
|
|
|
152
185
|
setAccessibilityFeatures(features)
|
|
@@ -157,34 +190,38 @@ export const useInputAccessibility = (
|
|
|
157
190
|
const monitorSystemPreferences = useCallback(() => {
|
|
158
191
|
// Monitor reduced motion preference
|
|
159
192
|
if (enableReducedMotion) {
|
|
160
|
-
motionQueryRef.current = window.matchMedia('(prefers-reduced-motion)')
|
|
161
|
-
const handleMotionChange = (e) => {
|
|
193
|
+
motionQueryRef.current = window.matchMedia('(prefers-reduced-motion: reduce)')
|
|
194
|
+
const handleMotionChange = (e: MediaQueryListEvent) => {
|
|
162
195
|
setAccessibilityState(prev => ({
|
|
163
196
|
...prev,
|
|
164
|
-
isReducedMotion
|
|
197
|
+
isReducedMotion: e.matches
|
|
198
|
+
}))
|
|
165
199
|
}
|
|
166
200
|
motionQueryRef.current.addEventListener('change', handleMotionChange)
|
|
167
201
|
|
|
168
202
|
// Set initial state
|
|
169
203
|
setAccessibilityState(prev => ({
|
|
170
204
|
...prev,
|
|
171
|
-
isReducedMotion
|
|
205
|
+
isReducedMotion: motionQueryRef.current?.matches || false
|
|
206
|
+
}))
|
|
172
207
|
}
|
|
173
208
|
|
|
174
209
|
// Monitor high contrast preference
|
|
175
210
|
if (enableHighContrast) {
|
|
176
|
-
contrastQueryRef.current = window.matchMedia('(prefers-contrast)')
|
|
177
|
-
const handleContrastChange = (e) => {
|
|
211
|
+
contrastQueryRef.current = window.matchMedia('(prefers-contrast: high)')
|
|
212
|
+
const handleContrastChange = (e: MediaQueryListEvent) => {
|
|
178
213
|
setAccessibilityState(prev => ({
|
|
179
214
|
...prev,
|
|
180
|
-
isHighContrast
|
|
215
|
+
isHighContrast: e.matches
|
|
216
|
+
}))
|
|
181
217
|
}
|
|
182
218
|
contrastQueryRef.current.addEventListener('change', handleContrastChange)
|
|
183
219
|
|
|
184
220
|
// Set initial state
|
|
185
221
|
setAccessibilityState(prev => ({
|
|
186
222
|
...prev,
|
|
187
|
-
isHighContrast
|
|
223
|
+
isHighContrast: contrastQueryRef.current?.matches || false
|
|
224
|
+
}))
|
|
188
225
|
}
|
|
189
226
|
|
|
190
227
|
// Monitor voice control preference (simulated)
|
|
@@ -193,7 +230,7 @@ export const useInputAccessibility = (
|
|
|
193
230
|
setTimeout(() => {
|
|
194
231
|
setAccessibilityState(prev => ({
|
|
195
232
|
...prev,
|
|
196
|
-
isVoiceControl) > 0.7 // 30% chance of voice control being active
|
|
233
|
+
isVoiceControl: Math.random() > 0.7 // 30% chance of voice control being active
|
|
197
234
|
}))
|
|
198
235
|
}, 1000)
|
|
199
236
|
}
|
|
@@ -218,12 +255,13 @@ export const useInputAccessibility = (
|
|
|
218
255
|
|
|
219
256
|
ariaEnhancements.forEach(enhancement => {
|
|
220
257
|
callbacks.onAccessibilityFeatureEnabled?.({
|
|
221
|
-
id,
|
|
222
|
-
name,
|
|
223
|
-
type,
|
|
224
|
-
enabled,
|
|
225
|
-
impact,
|
|
226
|
-
description
|
|
258
|
+
id: 'aria-enhancement',
|
|
259
|
+
name: 'ARIA Enhancement',
|
|
260
|
+
type: 'aria',
|
|
261
|
+
enabled: true,
|
|
262
|
+
impact: 'high',
|
|
263
|
+
description: enhancement
|
|
264
|
+
})
|
|
227
265
|
})
|
|
228
266
|
}, 200)
|
|
229
267
|
}, [enableARIA, callbacks])
|
|
@@ -320,7 +358,7 @@ export const useInputAccessibility = (
|
|
|
320
358
|
|
|
321
359
|
setAccessibilityState(prev => ({
|
|
322
360
|
...prev,
|
|
323
|
-
accessibilityScore)
|
|
361
|
+
accessibilityScore: Math.round(score)
|
|
324
362
|
}))
|
|
325
363
|
|
|
326
364
|
callbacks.onAccessibilityScoreChanged?.(score)
|
|
@@ -337,7 +375,7 @@ export const useInputAccessibility = (
|
|
|
337
375
|
|
|
338
376
|
// Get accessibility recommendations
|
|
339
377
|
const getAccessibilityRecommendations = useCallback(() => {
|
|
340
|
-
const recommendations] = []
|
|
378
|
+
const recommendations: string[] = []
|
|
341
379
|
|
|
342
380
|
if (accessibilityState.accessibilityScore < 70) {
|
|
343
381
|
recommendations.push('Accessibility score is low, consider enabling more features')
|
|
@@ -404,12 +442,12 @@ export const useInputAccessibility = (
|
|
|
404
442
|
autoEnhanceAccessibility,
|
|
405
443
|
|
|
406
444
|
// Utility functions
|
|
407
|
-
isFeatureEnabled) => accessibilityFeatures.find(f => f.id === featureId)?.enabled || false,
|
|
408
|
-
getFeatureByName) => accessibilityFeatures.find(f => f.name.toLowerCase().includes(name.toLowerCase())),
|
|
409
|
-
getAccessibilityScore) => accessibilityState.accessibilityScore,
|
|
410
|
-
isAccessibilityOptimal) => accessibilityState.accessibilityScore >= 80,
|
|
445
|
+
isFeatureEnabled: (featureId: string) => accessibilityFeatures.find(f => f.id === featureId)?.enabled || false,
|
|
446
|
+
getFeatureByName: (name: string) => accessibilityFeatures.find(f => f.name.toLowerCase().includes(name.toLowerCase())),
|
|
447
|
+
getAccessibilityScore: () => accessibilityState.accessibilityScore,
|
|
448
|
+
isAccessibilityOptimal: () => accessibilityState.accessibilityScore >= 80,
|
|
411
449
|
getAccessibilityRecommendations,
|
|
412
|
-
clearEnhancements) => setEnhancements([])
|
|
450
|
+
clearEnhancements: () => setEnhancements([])
|
|
413
451
|
}
|
|
414
452
|
}
|
|
415
453
|
|