@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.8 → 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
|
@@ -2,28 +2,47 @@ import { useState, useEffect, useCallback, useMemo } from 'react'
|
|
|
2
2
|
import { useDevice } from './use-device'
|
|
3
3
|
|
|
4
4
|
export interface AnimationProfile {
|
|
5
|
-
duration
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
duration: {
|
|
6
|
+
fast: string
|
|
7
|
+
normal: string
|
|
8
|
+
slow: string
|
|
9
|
+
}
|
|
10
|
+
easing: {
|
|
11
|
+
ease: string
|
|
12
|
+
easeIn: string
|
|
13
|
+
easeOut: string
|
|
14
|
+
easeInOut: string
|
|
15
|
+
bounce: string
|
|
16
|
+
}
|
|
17
|
+
performance: {
|
|
18
|
+
mode: 'high' | 'medium' | 'low'
|
|
19
|
+
batteryOptimized: boolean
|
|
20
|
+
reducedMotion: boolean
|
|
21
|
+
}
|
|
8
22
|
}
|
|
9
23
|
|
|
10
24
|
export interface PerformanceMetrics {
|
|
11
|
-
fps
|
|
25
|
+
fps: number
|
|
26
|
+
memoryUsage?: number
|
|
27
|
+
batteryLevel?: number
|
|
28
|
+
isLowPowerMode?: boolean
|
|
29
|
+
}
|
|
12
30
|
|
|
13
31
|
export const useAnimationProfile = () => {
|
|
14
32
|
const deviceInfo = useDevice()
|
|
15
33
|
const [performanceMetrics, setPerformanceMetrics] = useState<PerformanceMetrics>({
|
|
16
|
-
fps,
|
|
17
|
-
memoryUsage,
|
|
18
|
-
batteryLevel,
|
|
19
|
-
isLowPowerMode
|
|
34
|
+
fps: 60,
|
|
35
|
+
memoryUsage: undefined,
|
|
36
|
+
batteryLevel: undefined,
|
|
37
|
+
isLowPowerMode: false
|
|
38
|
+
})
|
|
20
39
|
const [isReducedMotion, setIsReducedMotion] = useState(false)
|
|
21
40
|
|
|
22
41
|
// Check for reduced motion preference
|
|
23
42
|
useEffect(() => {
|
|
24
43
|
const checkReducedMotion = () => {
|
|
25
44
|
if (typeof window !== 'undefined' && window.matchMedia) {
|
|
26
|
-
const reducedMotionQuery = window.matchMedia('(prefers-reduced-motion)')
|
|
45
|
+
const reducedMotionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')
|
|
27
46
|
setIsReducedMotion(reducedMotionQuery.matches)
|
|
28
47
|
|
|
29
48
|
reducedMotionQuery.addEventListener('change', (e) => {
|
|
@@ -39,7 +58,9 @@ export const useAnimationProfile = () => {
|
|
|
39
58
|
useEffect(() => {
|
|
40
59
|
let frameCount = 0
|
|
41
60
|
let lastTime = performance.now()
|
|
42
|
-
let animationId
|
|
61
|
+
let animationId: number
|
|
62
|
+
|
|
63
|
+
const measureFPS = () => {
|
|
43
64
|
frameCount++
|
|
44
65
|
const currentTime = performance.now()
|
|
45
66
|
|
|
@@ -69,7 +90,8 @@ export const useAnimationProfile = () => {
|
|
|
69
90
|
const memory = (performance as any).memory
|
|
70
91
|
setPerformanceMetrics(prev => ({
|
|
71
92
|
...prev,
|
|
72
|
-
memoryUsage
|
|
93
|
+
memoryUsage: memory.usedJSHeapSize / memory.jsHeapSizeLimit
|
|
94
|
+
}))
|
|
73
95
|
}
|
|
74
96
|
}
|
|
75
97
|
|
|
@@ -87,17 +109,19 @@ export const useAnimationProfile = () => {
|
|
|
87
109
|
const battery = await (navigator as any).getBattery()
|
|
88
110
|
setPerformanceMetrics(prev => ({
|
|
89
111
|
...prev,
|
|
90
|
-
batteryLevel,
|
|
91
|
-
isLowPowerMode
|
|
112
|
+
batteryLevel: battery.level,
|
|
113
|
+
isLowPowerMode: battery.level < 0.2
|
|
114
|
+
}))
|
|
92
115
|
|
|
93
116
|
battery.addEventListener('levelchange', () => {
|
|
94
117
|
setPerformanceMetrics(prev => ({
|
|
95
118
|
...prev,
|
|
96
|
-
batteryLevel,
|
|
97
|
-
isLowPowerMode
|
|
119
|
+
batteryLevel: battery.level,
|
|
120
|
+
isLowPowerMode: battery.level < 0.2
|
|
121
|
+
}))
|
|
98
122
|
})
|
|
99
123
|
} catch (error) {
|
|
100
|
-
console.warn('Battery API not available, error)
|
|
124
|
+
console.warn('Battery API not available:', error)
|
|
101
125
|
}
|
|
102
126
|
}
|
|
103
127
|
}
|
|
@@ -122,20 +146,25 @@ export const useAnimationProfile = () => {
|
|
|
122
146
|
}, [performanceMetrics.isLowPowerMode, performanceMetrics.batteryLevel, performanceMode])
|
|
123
147
|
|
|
124
148
|
// Get device-specific animation profile
|
|
125
|
-
const getAnimationProfile = useCallback(()=> {
|
|
126
|
-
const baseProfile= {
|
|
127
|
-
duration
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
149
|
+
const getAnimationProfile = useCallback((): AnimationProfile => {
|
|
150
|
+
const baseProfile: AnimationProfile = {
|
|
151
|
+
duration: {
|
|
152
|
+
fast: '0.15s',
|
|
153
|
+
normal: '0.3s',
|
|
154
|
+
slow: '0.5s'
|
|
155
|
+
},
|
|
156
|
+
easing: {
|
|
157
|
+
ease: 'ease',
|
|
158
|
+
easeIn: 'ease-in',
|
|
159
|
+
easeOut: 'ease-out',
|
|
160
|
+
easeInOut: 'ease-in-out',
|
|
161
|
+
bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'
|
|
135
162
|
},
|
|
136
|
-
performance
|
|
137
|
-
|
|
138
|
-
|
|
163
|
+
performance: {
|
|
164
|
+
mode: performanceMode,
|
|
165
|
+
batteryOptimized: shouldOptimizeForBattery,
|
|
166
|
+
reducedMotion: isReducedMotion
|
|
167
|
+
}
|
|
139
168
|
}
|
|
140
169
|
|
|
141
170
|
// Apply device-specific optimizations
|
|
@@ -203,13 +232,13 @@ export const useAnimationProfile = () => {
|
|
|
203
232
|
}, [deviceInfo.isMobile, deviceInfo.isTablet, getAnimationProfile])
|
|
204
233
|
|
|
205
234
|
// Get optimized duration for specific use case
|
|
206
|
-
const getOptimizedDuration = useCallback((type= 'normal') => {
|
|
235
|
+
const getOptimizedDuration = useCallback((type: 'fast' | 'normal' | 'slow' = 'normal') => {
|
|
207
236
|
const profile = getAnimationProfile()
|
|
208
237
|
return profile.duration[type]
|
|
209
238
|
}, [getAnimationProfile])
|
|
210
239
|
|
|
211
240
|
// Get optimized easing for specific use case
|
|
212
|
-
const getOptimizedEasing = useCallback((type] = 'ease') => {
|
|
241
|
+
const getOptimizedEasing = useCallback((type: keyof AnimationProfile['easing'] = 'ease') => {
|
|
213
242
|
const profile = getAnimationProfile()
|
|
214
243
|
return profile.easing[type]
|
|
215
244
|
}, [getAnimationProfile])
|
|
@@ -224,7 +253,7 @@ export const useAnimationProfile = () => {
|
|
|
224
253
|
}, [isReducedMotion, performanceMode, shouldOptimizeForBattery])
|
|
225
254
|
|
|
226
255
|
return {
|
|
227
|
-
profile),
|
|
256
|
+
profile: getAnimationProfile(),
|
|
228
257
|
performanceMetrics,
|
|
229
258
|
deviceInfo,
|
|
230
259
|
getAnimationClasses,
|
|
@@ -238,12 +267,12 @@ export const useAnimationProfile = () => {
|
|
|
238
267
|
}
|
|
239
268
|
|
|
240
269
|
// Convenience hooks for specific use cases
|
|
241
|
-
export const useAnimationDuration = (type= 'normal') => {
|
|
270
|
+
export const useAnimationDuration = (type: 'fast' | 'normal' | 'slow' = 'normal') => {
|
|
242
271
|
const { getOptimizedDuration } = useAnimationProfile()
|
|
243
272
|
return getOptimizedDuration(type)
|
|
244
273
|
}
|
|
245
274
|
|
|
246
|
-
export const useAnimationEasing = (type] = 'ease') => {
|
|
275
|
+
export const useAnimationEasing = (type: keyof AnimationProfile['easing'] = 'ease') => {
|
|
247
276
|
const { getOptimizedEasing } = useAnimationProfile()
|
|
248
277
|
return getOptimizedEasing(type)
|
|
249
278
|
}
|
|
@@ -2,28 +2,47 @@ import { useState, useEffect, useCallback, useMemo } from 'react'
|
|
|
2
2
|
import { useDevice } from './use-device'
|
|
3
3
|
|
|
4
4
|
export interface AnimationProfile {
|
|
5
|
-
duration
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
duration: {
|
|
6
|
+
fast: string
|
|
7
|
+
normal: string
|
|
8
|
+
slow: string
|
|
9
|
+
}
|
|
10
|
+
easing: {
|
|
11
|
+
ease: string
|
|
12
|
+
easeIn: string
|
|
13
|
+
easeOut: string
|
|
14
|
+
easeInOut: string
|
|
15
|
+
bounce: string
|
|
16
|
+
}
|
|
17
|
+
performance: {
|
|
18
|
+
mode: 'high' | 'medium' | 'low'
|
|
19
|
+
batteryOptimized: boolean
|
|
20
|
+
reducedMotion: boolean
|
|
21
|
+
}
|
|
8
22
|
}
|
|
9
23
|
|
|
10
24
|
export interface PerformanceMetrics {
|
|
11
|
-
fps
|
|
25
|
+
fps: number
|
|
26
|
+
memoryUsage?: number
|
|
27
|
+
batteryLevel?: number
|
|
28
|
+
isLowPowerMode?: boolean
|
|
29
|
+
}
|
|
12
30
|
|
|
13
31
|
export const useAnimationProfile = () => {
|
|
14
32
|
const deviceInfo = useDevice()
|
|
15
33
|
const [performanceMetrics, setPerformanceMetrics] = useState<PerformanceMetrics>({
|
|
16
|
-
fps,
|
|
17
|
-
memoryUsage,
|
|
18
|
-
batteryLevel,
|
|
19
|
-
isLowPowerMode
|
|
34
|
+
fps: 60,
|
|
35
|
+
memoryUsage: undefined,
|
|
36
|
+
batteryLevel: undefined,
|
|
37
|
+
isLowPowerMode: false
|
|
38
|
+
})
|
|
20
39
|
const [isReducedMotion, setIsReducedMotion] = useState(false)
|
|
21
40
|
|
|
22
41
|
// Check for reduced motion preference
|
|
23
42
|
useEffect(() => {
|
|
24
43
|
const checkReducedMotion = () => {
|
|
25
44
|
if (typeof window !== 'undefined' && window.matchMedia) {
|
|
26
|
-
const reducedMotionQuery = window.matchMedia('(prefers-reduced-motion)')
|
|
45
|
+
const reducedMotionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')
|
|
27
46
|
setIsReducedMotion(reducedMotionQuery.matches)
|
|
28
47
|
|
|
29
48
|
reducedMotionQuery.addEventListener('change', (e) => {
|
|
@@ -39,7 +58,9 @@ export const useAnimationProfile = () => {
|
|
|
39
58
|
useEffect(() => {
|
|
40
59
|
let frameCount = 0
|
|
41
60
|
let lastTime = performance.now()
|
|
42
|
-
let animationId
|
|
61
|
+
let animationId: number
|
|
62
|
+
|
|
63
|
+
const measureFPS = () => {
|
|
43
64
|
frameCount++
|
|
44
65
|
const currentTime = performance.now()
|
|
45
66
|
|
|
@@ -69,7 +90,8 @@ export const useAnimationProfile = () => {
|
|
|
69
90
|
const memory = (performance as any).memory
|
|
70
91
|
setPerformanceMetrics(prev => ({
|
|
71
92
|
...prev,
|
|
72
|
-
memoryUsage
|
|
93
|
+
memoryUsage: memory.usedJSHeapSize / memory.jsHeapSizeLimit
|
|
94
|
+
}))
|
|
73
95
|
}
|
|
74
96
|
}
|
|
75
97
|
|
|
@@ -87,17 +109,19 @@ export const useAnimationProfile = () => {
|
|
|
87
109
|
const battery = await (navigator as any).getBattery()
|
|
88
110
|
setPerformanceMetrics(prev => ({
|
|
89
111
|
...prev,
|
|
90
|
-
batteryLevel,
|
|
91
|
-
isLowPowerMode
|
|
112
|
+
batteryLevel: battery.level,
|
|
113
|
+
isLowPowerMode: battery.level < 0.2
|
|
114
|
+
}))
|
|
92
115
|
|
|
93
116
|
battery.addEventListener('levelchange', () => {
|
|
94
117
|
setPerformanceMetrics(prev => ({
|
|
95
118
|
...prev,
|
|
96
|
-
batteryLevel,
|
|
97
|
-
isLowPowerMode
|
|
119
|
+
batteryLevel: battery.level,
|
|
120
|
+
isLowPowerMode: battery.level < 0.2
|
|
121
|
+
}))
|
|
98
122
|
})
|
|
99
123
|
} catch (error) {
|
|
100
|
-
console.warn('Battery API not available, error)
|
|
124
|
+
console.warn('Battery API not available:', error)
|
|
101
125
|
}
|
|
102
126
|
}
|
|
103
127
|
}
|
|
@@ -122,20 +146,25 @@ export const useAnimationProfile = () => {
|
|
|
122
146
|
}, [performanceMetrics.isLowPowerMode, performanceMetrics.batteryLevel, performanceMode])
|
|
123
147
|
|
|
124
148
|
// Get device-specific animation profile
|
|
125
|
-
const getAnimationProfile = useCallback(()=> {
|
|
126
|
-
const baseProfile= {
|
|
127
|
-
duration
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
149
|
+
const getAnimationProfile = useCallback((): AnimationProfile => {
|
|
150
|
+
const baseProfile: AnimationProfile = {
|
|
151
|
+
duration: {
|
|
152
|
+
fast: '0.15s',
|
|
153
|
+
normal: '0.3s',
|
|
154
|
+
slow: '0.5s'
|
|
155
|
+
},
|
|
156
|
+
easing: {
|
|
157
|
+
ease: 'ease',
|
|
158
|
+
easeIn: 'ease-in',
|
|
159
|
+
easeOut: 'ease-out',
|
|
160
|
+
easeInOut: 'ease-in-out',
|
|
161
|
+
bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'
|
|
135
162
|
},
|
|
136
|
-
performance
|
|
137
|
-
|
|
138
|
-
|
|
163
|
+
performance: {
|
|
164
|
+
mode: performanceMode,
|
|
165
|
+
batteryOptimized: shouldOptimizeForBattery,
|
|
166
|
+
reducedMotion: isReducedMotion
|
|
167
|
+
}
|
|
139
168
|
}
|
|
140
169
|
|
|
141
170
|
// Apply device-specific optimizations
|
|
@@ -203,13 +232,13 @@ export const useAnimationProfile = () => {
|
|
|
203
232
|
}, [deviceInfo.isMobile, deviceInfo.isTablet, getAnimationProfile])
|
|
204
233
|
|
|
205
234
|
// Get optimized duration for specific use case
|
|
206
|
-
const getOptimizedDuration = useCallback((type= 'normal') => {
|
|
235
|
+
const getOptimizedDuration = useCallback((type: 'fast' | 'normal' | 'slow' = 'normal') => {
|
|
207
236
|
const profile = getAnimationProfile()
|
|
208
237
|
return profile.duration[type]
|
|
209
238
|
}, [getAnimationProfile])
|
|
210
239
|
|
|
211
240
|
// Get optimized easing for specific use case
|
|
212
|
-
const getOptimizedEasing = useCallback((type] = 'ease') => {
|
|
241
|
+
const getOptimizedEasing = useCallback((type: keyof AnimationProfile['easing'] = 'ease') => {
|
|
213
242
|
const profile = getAnimationProfile()
|
|
214
243
|
return profile.easing[type]
|
|
215
244
|
}, [getAnimationProfile])
|
|
@@ -224,7 +253,7 @@ export const useAnimationProfile = () => {
|
|
|
224
253
|
}, [isReducedMotion, performanceMode, shouldOptimizeForBattery])
|
|
225
254
|
|
|
226
255
|
return {
|
|
227
|
-
profile),
|
|
256
|
+
profile: getAnimationProfile(),
|
|
228
257
|
performanceMetrics,
|
|
229
258
|
deviceInfo,
|
|
230
259
|
getAnimationClasses,
|
|
@@ -238,12 +267,12 @@ export const useAnimationProfile = () => {
|
|
|
238
267
|
}
|
|
239
268
|
|
|
240
269
|
// Convenience hooks for specific use cases
|
|
241
|
-
export const useAnimationDuration = (type= 'normal') => {
|
|
270
|
+
export const useAnimationDuration = (type: 'fast' | 'normal' | 'slow' = 'normal') => {
|
|
242
271
|
const { getOptimizedDuration } = useAnimationProfile()
|
|
243
272
|
return getOptimizedDuration(type)
|
|
244
273
|
}
|
|
245
274
|
|
|
246
|
-
export const useAnimationEasing = (type] = 'ease') => {
|
|
275
|
+
export const useAnimationEasing = (type: keyof AnimationProfile['easing'] = 'ease') => {
|
|
247
276
|
const { getOptimizedEasing } = useAnimationProfile()
|
|
248
277
|
return getOptimizedEasing(type)
|
|
249
278
|
}
|
|
@@ -1,22 +1,40 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface BatteryAnimationConfig {
|
|
4
|
-
enableBatteryMonitoring
|
|
4
|
+
enableBatteryMonitoring?: boolean
|
|
5
|
+
enablePerformanceThrottling?: boolean
|
|
6
|
+
enableReducedMotion?: boolean
|
|
7
|
+
enableUserPreferences?: boolean
|
|
8
|
+
enableAutomaticOptimization?: boolean
|
|
9
|
+
lowBatteryThreshold?: number
|
|
10
|
+
criticalBatteryThreshold?: number
|
|
11
|
+
performanceThrottleThreshold?: number
|
|
12
|
+
animationComplexityLevels?: 'low' | 'medium' | 'high'
|
|
13
|
+
}
|
|
5
14
|
|
|
6
15
|
export interface BatteryAnimationState {
|
|
7
|
-
batteryLevel
|
|
16
|
+
batteryLevel: number
|
|
17
|
+
isLowBattery: boolean
|
|
18
|
+
isCriticalBattery: boolean
|
|
19
|
+
isCharging: boolean
|
|
20
|
+
performanceScore: number
|
|
21
|
+
shouldThrottle: boolean
|
|
22
|
+
throttleLevel: 'none' | 'light' | 'moderate' | 'aggressive'
|
|
23
|
+
reducedMotion: boolean
|
|
24
|
+
userPreference: 'performance' | 'balanced' | 'battery' | 'accessibility'
|
|
25
|
+
}
|
|
8
26
|
|
|
9
27
|
export interface BatteryAnimationCallbacks {
|
|
10
|
-
onBatteryLevelChange
|
|
11
|
-
onPerformanceWarning
|
|
12
|
-
onAnimationThrottled
|
|
13
|
-
onUserPreferenceChange
|
|
14
|
-
onReducedMotionChange
|
|
28
|
+
onBatteryLevelChange?: (level: number, isLow: boolean) => void
|
|
29
|
+
onPerformanceWarning?: (score: number, shouldThrottle: boolean) => void
|
|
30
|
+
onAnimationThrottled?: (level: string, reason: string) => void
|
|
31
|
+
onUserPreferenceChange?: (preference: string) => void
|
|
32
|
+
onReducedMotionChange?: (enabled: boolean) => void
|
|
15
33
|
}
|
|
16
34
|
|
|
17
35
|
export const useBatteryAnimations = (
|
|
18
|
-
config= {},
|
|
19
|
-
callbacks= {}
|
|
36
|
+
config: BatteryAnimationConfig = {},
|
|
37
|
+
callbacks: BatteryAnimationCallbacks = {}
|
|
20
38
|
) => {
|
|
21
39
|
const {
|
|
22
40
|
enableBatteryMonitoring = true,
|
|
@@ -30,15 +48,16 @@ export const useBatteryAnimations = (
|
|
|
30
48
|
} = config
|
|
31
49
|
|
|
32
50
|
const [state, setState] = useState<BatteryAnimationState>({
|
|
33
|
-
batteryLevel,
|
|
34
|
-
isLowBattery,
|
|
35
|
-
isCriticalBattery,
|
|
36
|
-
isCharging,
|
|
37
|
-
performanceScore,
|
|
38
|
-
shouldThrottle,
|
|
39
|
-
throttleLevel,
|
|
40
|
-
reducedMotion,
|
|
41
|
-
userPreference
|
|
51
|
+
batteryLevel: 1,
|
|
52
|
+
isLowBattery: false,
|
|
53
|
+
isCriticalBattery: false,
|
|
54
|
+
isCharging: false,
|
|
55
|
+
performanceScore: 100,
|
|
56
|
+
shouldThrottle: false,
|
|
57
|
+
throttleLevel: 'none',
|
|
58
|
+
reducedMotion: false,
|
|
59
|
+
userPreference: 'balanced'
|
|
60
|
+
})
|
|
42
61
|
|
|
43
62
|
const [isOptimizing, setIsOptimizing] = useState(false)
|
|
44
63
|
const [optimizations, setOptimizations] = useState<string[]>([])
|
|
@@ -47,7 +66,7 @@ export const useBatteryAnimations = (
|
|
|
47
66
|
const batteryCheckIntervalRef = useRef<number | null>(null)
|
|
48
67
|
|
|
49
68
|
// Battery level detection
|
|
50
|
-
const getBatteryStatus = useCallback(async ()=> {
|
|
69
|
+
const getBatteryStatus = useCallback(async (): Promise<void> => {
|
|
51
70
|
if (!enableBatteryMonitoring || !('getBattery' in navigator)) return
|
|
52
71
|
|
|
53
72
|
try {
|
|
@@ -69,7 +88,7 @@ export const useBatteryAnimations = (
|
|
|
69
88
|
|
|
70
89
|
callbacks.onBatteryLevelChange?.(batteryLevel, isLowBattery)
|
|
71
90
|
} catch (error) {
|
|
72
|
-
console.warn('Battery API not available, error)
|
|
91
|
+
console.warn('Battery API not available:', error)
|
|
73
92
|
}
|
|
74
93
|
}, [enableBatteryMonitoring, lowBatteryThreshold, criticalBatteryThreshold, callbacks])
|
|
75
94
|
|
|
@@ -92,7 +111,7 @@ export const useBatteryAnimations = (
|
|
|
92
111
|
callbacks.onPerformanceWarning?.(performanceScore, shouldThrottle)
|
|
93
112
|
}
|
|
94
113
|
} catch (error) {
|
|
95
|
-
console.warn('Performance measurement failed, error)
|
|
114
|
+
console.warn('Performance measurement failed:', error)
|
|
96
115
|
}
|
|
97
116
|
}, [enablePerformanceThrottling, performanceThrottleThreshold, callbacks])
|
|
98
117
|
|
|
@@ -101,7 +120,7 @@ export const useBatteryAnimations = (
|
|
|
101
120
|
if (!enableReducedMotion) return
|
|
102
121
|
|
|
103
122
|
try {
|
|
104
|
-
const reducedMotion = window.matchMedia('(prefers-reduced-motion)').matches
|
|
123
|
+
const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches
|
|
105
124
|
|
|
106
125
|
setState(prev => ({
|
|
107
126
|
...prev,
|
|
@@ -110,7 +129,7 @@ export const useBatteryAnimations = (
|
|
|
110
129
|
|
|
111
130
|
callbacks.onReducedMotionChange?.(reducedMotion)
|
|
112
131
|
} catch (error) {
|
|
113
|
-
console.warn('Reduced motion detection failed, error)
|
|
132
|
+
console.warn('Reduced motion detection failed:', error)
|
|
114
133
|
}
|
|
115
134
|
}, [enableReducedMotion, callbacks])
|
|
116
135
|
|
|
@@ -121,23 +140,23 @@ export const useBatteryAnimations = (
|
|
|
121
140
|
setIsOptimizing(true)
|
|
122
141
|
|
|
123
142
|
setTimeout(() => {
|
|
124
|
-
let throttleLevel= 'none'
|
|
125
|
-
let optimizations] = []
|
|
143
|
+
let throttleLevel: 'none' | 'light' | 'moderate' | 'aggressive' = 'none'
|
|
144
|
+
let optimizations: string[] = []
|
|
126
145
|
|
|
127
146
|
// Battery-based throttling
|
|
128
147
|
if (state.isCriticalBattery) {
|
|
129
148
|
throttleLevel = 'aggressive'
|
|
130
|
-
optimizations.push('Critical battery)
|
|
149
|
+
optimizations.push('Critical battery: Maximum animation throttling applied')
|
|
131
150
|
optimizations.push('All non-essential animations disabled')
|
|
132
151
|
optimizations.push('Only essential UI transitions enabled')
|
|
133
152
|
} else if (state.isLowBattery) {
|
|
134
153
|
throttleLevel = 'moderate'
|
|
135
|
-
optimizations.push('Low battery)
|
|
154
|
+
optimizations.push('Low battery: Enhanced animation throttling applied')
|
|
136
155
|
optimizations.push('Animation complexity reduced by 60%')
|
|
137
156
|
optimizations.push('Performance optimizations enabled')
|
|
138
157
|
} else if (state.batteryLevel < 0.5) {
|
|
139
158
|
throttleLevel = 'light'
|
|
140
|
-
optimizations.push('Medium battery)
|
|
159
|
+
optimizations.push('Medium battery: Light animation throttling applied')
|
|
141
160
|
optimizations.push('Animation complexity reduced by 30%')
|
|
142
161
|
optimizations.push('Battery optimization enabled')
|
|
143
162
|
}
|
|
@@ -159,10 +178,10 @@ export const useBatteryAnimations = (
|
|
|
159
178
|
// User preference consideration
|
|
160
179
|
if (state.userPreference === 'battery') {
|
|
161
180
|
if (throttleLevel === 'none') throttleLevel = 'light'
|
|
162
|
-
optimizations.push('User preference)
|
|
181
|
+
optimizations.push('User preference: Battery optimization enabled')
|
|
163
182
|
} else if (state.userPreference === 'accessibility') {
|
|
164
183
|
if (throttleLevel === 'none') throttleLevel = 'light'
|
|
165
|
-
optimizations.push('User preference)
|
|
184
|
+
optimizations.push('User preference: Accessibility optimization enabled')
|
|
166
185
|
}
|
|
167
186
|
|
|
168
187
|
setState(prev => ({
|
|
@@ -176,7 +195,7 @@ export const useBatteryAnimations = (
|
|
|
176
195
|
callbacks.onAnimationThrottled?.(throttleLevel, 'Battery and performance optimization')
|
|
177
196
|
|
|
178
197
|
optimizations.forEach(optimization => {
|
|
179
|
-
console.log('Animation optimization, optimization)
|
|
198
|
+
console.log('Animation optimization:', optimization)
|
|
180
199
|
})
|
|
181
200
|
}, 300)
|
|
182
201
|
}, [enablePerformanceThrottling, state, callbacks])
|
|
@@ -186,27 +205,27 @@ export const useBatteryAnimations = (
|
|
|
186
205
|
const recommendations = []
|
|
187
206
|
|
|
188
207
|
if (state.isCriticalBattery) {
|
|
189
|
-
recommendations.push('Critical battery)
|
|
208
|
+
recommendations.push('Critical battery: Disable all animations except essential transitions')
|
|
190
209
|
recommendations.push('Use static UI elements instead of animated ones')
|
|
191
210
|
recommendations.push('Minimize DOM updates and reflows')
|
|
192
211
|
} else if (state.isLowBattery) {
|
|
193
|
-
recommendations.push('Low battery)
|
|
212
|
+
recommendations.push('Low battery: Reduce animation complexity significantly')
|
|
194
213
|
recommendations.push('Use simple transforms instead of complex animations')
|
|
195
214
|
recommendations.push('Limit animation duration to under 300ms')
|
|
196
215
|
} else if (state.batteryLevel < 0.5) {
|
|
197
|
-
recommendations.push('Medium battery)
|
|
216
|
+
recommendations.push('Medium battery: Consider light animation optimization')
|
|
198
217
|
recommendations.push('Use CSS transforms instead of JavaScript animations')
|
|
199
218
|
recommendations.push('Implement animation pausing when not in viewport')
|
|
200
219
|
}
|
|
201
220
|
|
|
202
221
|
if (state.shouldThrottle) {
|
|
203
|
-
recommendations.push('Performance issue)
|
|
222
|
+
recommendations.push('Performance issue: Reduce animation frame rate')
|
|
204
223
|
recommendations.push('Use requestAnimationFrame for smooth animations')
|
|
205
224
|
recommendations.push('Implement animation debouncing')
|
|
206
225
|
}
|
|
207
226
|
|
|
208
227
|
if (state.reducedMotion) {
|
|
209
|
-
recommendations.push('Accessibility)
|
|
228
|
+
recommendations.push('Accessibility: Respect reduced motion preference')
|
|
210
229
|
recommendations.push('Provide alternative non-animated experiences')
|
|
211
230
|
recommendations.push('Use subtle transitions instead of animations')
|
|
212
231
|
}
|
|
@@ -217,32 +236,37 @@ export const useBatteryAnimations = (
|
|
|
217
236
|
// Get optimal animation settings
|
|
218
237
|
const getOptimalAnimationSettings = useCallback(() => {
|
|
219
238
|
const settings = {
|
|
220
|
-
duration,
|
|
221
|
-
easing,
|
|
222
|
-
shouldAnimate,
|
|
223
|
-
complexity,
|
|
224
|
-
frameRate
|
|
239
|
+
duration: 300,
|
|
240
|
+
easing: 'ease-out',
|
|
241
|
+
shouldAnimate: true,
|
|
242
|
+
complexity: 'medium',
|
|
243
|
+
frameRate: 60
|
|
244
|
+
}
|
|
225
245
|
|
|
226
246
|
switch (state.throttleLevel) {
|
|
227
|
-
case 'aggressive'
|
|
247
|
+
case 'aggressive':
|
|
248
|
+
settings.duration = 150
|
|
228
249
|
settings.easing = 'linear'
|
|
229
250
|
settings.shouldAnimate = false
|
|
230
251
|
settings.complexity = 'minimal'
|
|
231
252
|
settings.frameRate = 30
|
|
232
253
|
break
|
|
233
|
-
case 'moderate'
|
|
254
|
+
case 'moderate':
|
|
255
|
+
settings.duration = 200
|
|
234
256
|
settings.easing = 'ease-out'
|
|
235
257
|
settings.shouldAnimate = true
|
|
236
258
|
settings.complexity = 'low'
|
|
237
259
|
settings.frameRate = 45
|
|
238
260
|
break
|
|
239
|
-
case 'light'
|
|
261
|
+
case 'light':
|
|
262
|
+
settings.duration = 250
|
|
240
263
|
settings.easing = 'ease-out'
|
|
241
264
|
settings.shouldAnimate = true
|
|
242
265
|
settings.complexity = 'medium'
|
|
243
266
|
settings.frameRate = 50
|
|
244
267
|
break
|
|
245
|
-
default
|
|
268
|
+
default:
|
|
269
|
+
settings.duration = 300
|
|
246
270
|
settings.easing = 'ease-out'
|
|
247
271
|
settings.shouldAnimate = true
|
|
248
272
|
settings.complexity = 'high'
|
|
@@ -261,12 +285,13 @@ export const useBatteryAnimations = (
|
|
|
261
285
|
}, [state.throttleLevel, state.reducedMotion])
|
|
262
286
|
|
|
263
287
|
// Update user preferences
|
|
264
|
-
const updateUserPreference = useCallback((preference) => {
|
|
288
|
+
const updateUserPreference = useCallback((preference: string) => {
|
|
265
289
|
if (!enableUserPreferences) return
|
|
266
290
|
|
|
267
291
|
setState(prev => ({
|
|
268
292
|
...prev,
|
|
269
|
-
userPreference
|
|
293
|
+
userPreference: preference as any
|
|
294
|
+
}))
|
|
270
295
|
|
|
271
296
|
callbacks.onUserPreferenceChange?.(preference)
|
|
272
297
|
|
|
@@ -295,14 +320,14 @@ export const useBatteryAnimations = (
|
|
|
295
320
|
checkReducedMotion()
|
|
296
321
|
|
|
297
322
|
// Listen for preference changes
|
|
298
|
-
const mediaQuery = window.matchMedia('(prefers-reduced-motion)')
|
|
323
|
+
const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)')
|
|
299
324
|
const handleChange = () => checkReducedMotion()
|
|
300
325
|
mediaQuery.addEventListener('change', handleChange)
|
|
301
326
|
|
|
302
327
|
return () => mediaQuery.removeEventListener('change', handleChange)
|
|
303
328
|
}
|
|
304
329
|
} catch (error) {
|
|
305
|
-
console.warn('Battery animation initialization failed, error)
|
|
330
|
+
console.warn('Battery animation initialization failed:', error)
|
|
306
331
|
}
|
|
307
332
|
}, [enableBatteryMonitoring, enablePerformanceThrottling, enableReducedMotion, getBatteryStatus, measurePerformance, checkReducedMotion])
|
|
308
333
|
|
|
@@ -339,14 +364,14 @@ export const useBatteryAnimations = (
|
|
|
339
364
|
updateUserPreference,
|
|
340
365
|
|
|
341
366
|
// Computed values
|
|
342
|
-
batteryPercentage),
|
|
343
|
-
shouldDisableAnimations=== 'aggressive' || state.reducedMotion,
|
|
344
|
-
animationSettings),
|
|
345
|
-
recommendations),
|
|
367
|
+
batteryPercentage: Math.round(state.batteryLevel * 100),
|
|
368
|
+
shouldDisableAnimations: state.throttleLevel === 'aggressive' || state.reducedMotion,
|
|
369
|
+
animationSettings: getOptimalAnimationSettings(),
|
|
370
|
+
recommendations: getAnimationRecommendations(),
|
|
346
371
|
|
|
347
372
|
// Utility functions
|
|
348
|
-
isAnimationOptimized) => state.throttleLevel !== 'none',
|
|
349
|
-
getBatteryHealth) => {
|
|
373
|
+
isAnimationOptimized: () => state.throttleLevel !== 'none',
|
|
374
|
+
getBatteryHealth: () => {
|
|
350
375
|
if (state.batteryLevel >= 0.8) return 'excellent'
|
|
351
376
|
if (state.batteryLevel >= 0.6) return 'good'
|
|
352
377
|
if (state.batteryLevel >= 0.4) return 'fair'
|