@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
|
@@ -1,59 +1,84 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface MobileTouchConfig {
|
|
4
|
-
enableTouchFeedback
|
|
4
|
+
enableTouchFeedback: boolean
|
|
5
|
+
enableGestureHints: boolean
|
|
6
|
+
enableTouchSounds: boolean
|
|
7
|
+
enableHapticFeedback: boolean
|
|
8
|
+
touchFeedbackDelay: number
|
|
9
|
+
gestureHintTimeout: number
|
|
10
|
+
maxTouchPoints: number
|
|
11
|
+
}
|
|
5
12
|
|
|
6
13
|
export interface TouchFeedbackState {
|
|
7
|
-
isPressed
|
|
14
|
+
isPressed: boolean
|
|
15
|
+
feedbackType: 'none' | 'scale' | 'ripple' | 'glow'
|
|
16
|
+
feedbackIntensity: 'light' | 'medium' | 'strong'
|
|
17
|
+
lastTouchPosition: { x: number; y: number } | null
|
|
8
18
|
}
|
|
9
19
|
|
|
10
20
|
export interface GestureHint {
|
|
11
|
-
type
|
|
12
|
-
|
|
21
|
+
type: 'swipe' | 'pinch' | 'longPress' | 'doubleTap' | 'tap'
|
|
22
|
+
message: string
|
|
23
|
+
position: { x: number; y: number }
|
|
24
|
+
timeout: number
|
|
25
|
+
}
|
|
13
26
|
|
|
14
27
|
export interface MobileTouchCallbacks {
|
|
15
|
-
onTouchFeedback
|
|
16
|
-
onGestureHint
|
|
17
|
-
onTouchStart
|
|
18
|
-
onTouchEnd
|
|
19
|
-
onTouchMove
|
|
28
|
+
onTouchFeedback?: (state: TouchFeedbackState) => void
|
|
29
|
+
onGestureHint?: (hint: GestureHint) => void
|
|
30
|
+
onTouchStart?: (position: { x: number; y: number }) => void
|
|
31
|
+
onTouchEnd?: (position: { x: number; y: number }) => void
|
|
32
|
+
onTouchMove?: (position: { x: number; y: number }) => void
|
|
20
33
|
}
|
|
21
34
|
|
|
22
35
|
export interface MobileTouchState {
|
|
23
|
-
isActive
|
|
24
|
-
|
|
36
|
+
isActive: boolean
|
|
37
|
+
touchCount: number
|
|
38
|
+
currentFeedback: TouchFeedbackState
|
|
39
|
+
activeGestureHints: GestureHint[]
|
|
40
|
+
deviceCapabilities: {
|
|
41
|
+
supportsTouch: boolean
|
|
42
|
+
supportsHaptics: boolean
|
|
43
|
+
supportsAudio: boolean
|
|
44
|
+
maxTouchPoints: number
|
|
45
|
+
}
|
|
25
46
|
}
|
|
26
47
|
|
|
27
48
|
export const useMobileTouch = (
|
|
28
|
-
elementRef
|
|
29
|
-
callbacks= {},
|
|
30
|
-
config= {}
|
|
49
|
+
elementRef: React.RefObject<HTMLElement>,
|
|
50
|
+
callbacks: MobileTouchCallbacks = {},
|
|
51
|
+
config: Partial<MobileTouchConfig> = {}
|
|
31
52
|
) => {
|
|
32
|
-
const defaultConfig= {
|
|
33
|
-
enableTouchFeedback,
|
|
34
|
-
enableGestureHints,
|
|
35
|
-
enableTouchSounds,
|
|
36
|
-
enableHapticFeedback,
|
|
37
|
-
touchFeedbackDelay,
|
|
38
|
-
gestureHintTimeout,
|
|
39
|
-
maxTouchPoints,
|
|
53
|
+
const defaultConfig: MobileTouchConfig = {
|
|
54
|
+
enableTouchFeedback: true,
|
|
55
|
+
enableGestureHints: true,
|
|
56
|
+
enableTouchSounds: false,
|
|
57
|
+
enableHapticFeedback: true,
|
|
58
|
+
touchFeedbackDelay: 100,
|
|
59
|
+
gestureHintTimeout: 3000,
|
|
60
|
+
maxTouchPoints: 5,
|
|
40
61
|
...config
|
|
41
62
|
}
|
|
42
63
|
|
|
43
64
|
// Device info available if needed for future enhancements
|
|
44
65
|
// const device = useDevice()
|
|
45
66
|
const [mobileTouchState, setMobileTouchState] = useState<MobileTouchState>({
|
|
46
|
-
isActive,
|
|
47
|
-
touchCount,
|
|
48
|
-
currentFeedback
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
67
|
+
isActive: false,
|
|
68
|
+
touchCount: 0,
|
|
69
|
+
currentFeedback: {
|
|
70
|
+
isPressed: false,
|
|
71
|
+
feedbackType: 'none',
|
|
72
|
+
feedbackIntensity: 'medium',
|
|
73
|
+
lastTouchPosition: null
|
|
74
|
+
},
|
|
75
|
+
activeGestureHints: [],
|
|
76
|
+
deviceCapabilities: {
|
|
77
|
+
supportsTouch: false,
|
|
78
|
+
supportsHaptics: false,
|
|
79
|
+
supportsAudio: false,
|
|
80
|
+
maxTouchPoints: 0
|
|
81
|
+
}
|
|
57
82
|
})
|
|
58
83
|
|
|
59
84
|
const touchStartTimeRef = useRef<number>(0)
|
|
@@ -64,14 +89,16 @@ export const useMobileTouch = (
|
|
|
64
89
|
// Initialize device capabilities
|
|
65
90
|
useEffect(() => {
|
|
66
91
|
const capabilities = {
|
|
67
|
-
supportsTouch,
|
|
68
|
-
supportsHaptics,
|
|
69
|
-
supportsAudio,
|
|
70
|
-
maxTouchPoints
|
|
92
|
+
supportsTouch: 'ontouchstart' in window,
|
|
93
|
+
supportsHaptics: 'vibrate' in navigator,
|
|
94
|
+
supportsAudio: 'AudioContext' in window || 'webkitAudioContext' in window,
|
|
95
|
+
maxTouchPoints: navigator.maxTouchPoints || 0
|
|
96
|
+
}
|
|
71
97
|
|
|
72
98
|
setMobileTouchState(prev => ({
|
|
73
99
|
...prev,
|
|
74
|
-
deviceCapabilities
|
|
100
|
+
deviceCapabilities: capabilities
|
|
101
|
+
}))
|
|
75
102
|
|
|
76
103
|
// Initialize audio context if supported
|
|
77
104
|
if (capabilities.supportsAudio) {
|
|
@@ -80,23 +107,24 @@ export const useMobileTouch = (
|
|
|
80
107
|
}, [])
|
|
81
108
|
|
|
82
109
|
// Trigger haptic feedback
|
|
83
|
-
const triggerHapticFeedback = useCallback((intensity= 'medium') => {
|
|
110
|
+
const triggerHapticFeedback = useCallback((intensity: 'light' | 'medium' | 'strong' = 'medium') => {
|
|
84
111
|
if (!defaultConfig.enableHapticFeedback || !mobileTouchState.deviceCapabilities.supportsHaptics) return
|
|
85
112
|
|
|
86
113
|
const vibrationPattern = {
|
|
87
|
-
light,
|
|
88
|
-
medium,
|
|
89
|
-
strong
|
|
114
|
+
light: 20,
|
|
115
|
+
medium: 50,
|
|
116
|
+
strong: 100
|
|
117
|
+
}
|
|
90
118
|
|
|
91
119
|
try {
|
|
92
120
|
navigator.vibrate(vibrationPattern[intensity])
|
|
93
121
|
} catch (error) {
|
|
94
|
-
console.warn('Haptic feedback not supported, error)
|
|
122
|
+
console.warn('Haptic feedback not supported:', error)
|
|
95
123
|
}
|
|
96
124
|
}, [defaultConfig.enableHapticFeedback, mobileTouchState.deviceCapabilities.supportsHaptics])
|
|
97
125
|
|
|
98
126
|
// Trigger touch sound
|
|
99
|
-
const triggerTouchSound = useCallback((type= 'tap') => {
|
|
127
|
+
const triggerTouchSound = useCallback((type: 'tap' | 'press' | 'release' = 'tap') => {
|
|
100
128
|
if (!defaultConfig.enableTouchSounds || !audioContextRef.current) return
|
|
101
129
|
|
|
102
130
|
try {
|
|
@@ -109,9 +137,9 @@ export const useMobileTouch = (
|
|
|
109
137
|
|
|
110
138
|
// Different sounds for different touch types
|
|
111
139
|
const soundConfig = {
|
|
112
|
-
tap, duration, volume},
|
|
113
|
-
press, duration, volume},
|
|
114
|
-
release, duration, volume}
|
|
140
|
+
tap: { frequency: 800, duration: 0.1, volume: 0.1 },
|
|
141
|
+
press: { frequency: 600, duration: 0.2, volume: 0.15 },
|
|
142
|
+
release: { frequency: 1000, duration: 0.08, volume: 0.08 }
|
|
115
143
|
}
|
|
116
144
|
|
|
117
145
|
const config = soundConfig[type]
|
|
@@ -121,32 +149,32 @@ export const useMobileTouch = (
|
|
|
121
149
|
oscillator.start(audioContext.currentTime)
|
|
122
150
|
oscillator.stop(audioContext.currentTime + config.duration)
|
|
123
151
|
} catch (error) {
|
|
124
|
-
console.warn('Touch sound not supported, error)
|
|
152
|
+
console.warn('Touch sound not supported:', error)
|
|
125
153
|
}
|
|
126
154
|
}, [defaultConfig.enableTouchSounds])
|
|
127
155
|
|
|
128
156
|
// Update touch feedback state
|
|
129
|
-
const updateTouchFeedback = useCallback((feedback) => {
|
|
157
|
+
const updateTouchFeedback = useCallback((feedback: Partial<TouchFeedbackState>) => {
|
|
130
158
|
setMobileTouchState(prev => ({
|
|
131
159
|
...prev,
|
|
132
|
-
currentFeedback, ...feedback }
|
|
160
|
+
currentFeedback: { ...prev.currentFeedback, ...feedback }
|
|
133
161
|
}))
|
|
134
162
|
|
|
135
163
|
callbacks.onTouchFeedback?.(mobileTouchState.currentFeedback)
|
|
136
164
|
}, [callbacks, mobileTouchState.currentFeedback])
|
|
137
165
|
|
|
138
166
|
// Add gesture hint
|
|
139
|
-
const addGestureHint = useCallback((hint, 'timeout'>) => {
|
|
167
|
+
const addGestureHint = useCallback((hint: Omit<GestureHint, 'timeout'>) => {
|
|
140
168
|
if (!defaultConfig.enableGestureHints) return
|
|
141
169
|
|
|
142
170
|
const hintWithTimeout = {
|
|
143
171
|
...hint,
|
|
144
|
-
timeout) + defaultConfig.gestureHintTimeout
|
|
172
|
+
timeout: Date.now() + defaultConfig.gestureHintTimeout
|
|
145
173
|
}
|
|
146
174
|
|
|
147
175
|
setMobileTouchState(prev => ({
|
|
148
176
|
...prev,
|
|
149
|
-
activeGestureHints, hintWithTimeout]
|
|
177
|
+
activeGestureHints: [...prev.activeGestureHints, hintWithTimeout]
|
|
150
178
|
}))
|
|
151
179
|
|
|
152
180
|
// Set timer to remove hint
|
|
@@ -159,10 +187,10 @@ export const useMobileTouch = (
|
|
|
159
187
|
}, [defaultConfig.enableGestureHints, defaultConfig.gestureHintTimeout, callbacks])
|
|
160
188
|
|
|
161
189
|
// Remove gesture hint
|
|
162
|
-
const removeGestureHint = useCallback((type) => {
|
|
190
|
+
const removeGestureHint = useCallback((type: string) => {
|
|
163
191
|
setMobileTouchState(prev => ({
|
|
164
192
|
...prev,
|
|
165
|
-
activeGestureHints=> hint.type !== type)
|
|
193
|
+
activeGestureHints: prev.activeGestureHints.filter(hint => hint.type !== type)
|
|
166
194
|
}))
|
|
167
195
|
|
|
168
196
|
const timer = gestureHintTimersRef.current.get(type)
|
|
@@ -173,30 +201,33 @@ export const useMobileTouch = (
|
|
|
173
201
|
}, [])
|
|
174
202
|
|
|
175
203
|
// Handle touch start
|
|
176
|
-
const handleTouchStart = useCallback((event) => {
|
|
204
|
+
const handleTouchStart = useCallback((event: TouchEvent) => {
|
|
177
205
|
const touch = event.touches[0]
|
|
178
|
-
const position = { x, y}
|
|
206
|
+
const position = { x: touch.clientX, y: touch.clientY }
|
|
179
207
|
|
|
180
208
|
touchStartTimeRef.current = Date.now()
|
|
181
209
|
|
|
182
210
|
setMobileTouchState(prev => ({
|
|
183
211
|
...prev,
|
|
184
|
-
isActive,
|
|
185
|
-
touchCount
|
|
212
|
+
isActive: true,
|
|
213
|
+
touchCount: event.touches.length
|
|
214
|
+
}))
|
|
186
215
|
|
|
187
216
|
// Update feedback state
|
|
188
217
|
if (defaultConfig.enableTouchFeedback) {
|
|
189
218
|
updateTouchFeedback({
|
|
190
|
-
isPressed,
|
|
191
|
-
feedbackType,
|
|
192
|
-
feedbackIntensity,
|
|
193
|
-
lastTouchPosition
|
|
219
|
+
isPressed: true,
|
|
220
|
+
feedbackType: 'scale',
|
|
221
|
+
feedbackIntensity: 'medium',
|
|
222
|
+
lastTouchPosition: position
|
|
223
|
+
})
|
|
194
224
|
|
|
195
225
|
// Set feedback timer
|
|
196
226
|
touchFeedbackTimerRef.current = setTimeout(() => {
|
|
197
227
|
updateTouchFeedback({
|
|
198
|
-
feedbackType,
|
|
199
|
-
feedbackIntensity
|
|
228
|
+
feedbackType: 'ripple',
|
|
229
|
+
feedbackIntensity: 'strong'
|
|
230
|
+
})
|
|
200
231
|
}, defaultConfig.touchFeedbackDelay)
|
|
201
232
|
}
|
|
202
233
|
|
|
@@ -208,23 +239,24 @@ export const useMobileTouch = (
|
|
|
208
239
|
}, [defaultConfig.enableTouchFeedback, defaultConfig.touchFeedbackDelay, updateTouchFeedback, triggerHapticFeedback, triggerTouchSound, callbacks])
|
|
209
240
|
|
|
210
241
|
// Handle touch move
|
|
211
|
-
const handleTouchMove = useCallback((event) => {
|
|
242
|
+
const handleTouchMove = useCallback((event: TouchEvent) => {
|
|
212
243
|
const touch = event.touches[0]
|
|
213
|
-
const position = { x, y}
|
|
244
|
+
const position = { x: touch.clientX, y: touch.clientY }
|
|
214
245
|
|
|
215
246
|
// Update feedback state
|
|
216
247
|
if (defaultConfig.enableTouchFeedback) {
|
|
217
248
|
updateTouchFeedback({
|
|
218
|
-
lastTouchPosition
|
|
249
|
+
lastTouchPosition: position
|
|
250
|
+
})
|
|
219
251
|
}
|
|
220
252
|
|
|
221
253
|
callbacks.onTouchMove?.(position)
|
|
222
254
|
}, [defaultConfig.enableTouchFeedback, updateTouchFeedback, callbacks])
|
|
223
255
|
|
|
224
256
|
// Handle touch end
|
|
225
|
-
const handleTouchEnd = useCallback((event) => {
|
|
257
|
+
const handleTouchEnd = useCallback((event: TouchEvent) => {
|
|
226
258
|
const touch = event.changedTouches[0]
|
|
227
|
-
const position = { x, y}
|
|
259
|
+
const position = { x: touch.clientX, y: touch.clientY }
|
|
228
260
|
const touchDuration = Date.now() - touchStartTimeRef.current
|
|
229
261
|
|
|
230
262
|
// Clear feedback timer
|
|
@@ -236,9 +268,10 @@ export const useMobileTouch = (
|
|
|
236
268
|
// Update feedback state
|
|
237
269
|
if (defaultConfig.enableTouchFeedback) {
|
|
238
270
|
updateTouchFeedback({
|
|
239
|
-
isPressed,
|
|
240
|
-
feedbackType,
|
|
241
|
-
feedbackIntensity
|
|
271
|
+
isPressed: false,
|
|
272
|
+
feedbackType: 'none',
|
|
273
|
+
feedbackIntensity: 'medium'
|
|
274
|
+
})
|
|
242
275
|
}
|
|
243
276
|
|
|
244
277
|
// Determine touch type and provide appropriate feedback
|
|
@@ -249,8 +282,8 @@ export const useMobileTouch = (
|
|
|
249
282
|
|
|
250
283
|
// Show tap hint
|
|
251
284
|
addGestureHint({
|
|
252
|
-
type,
|
|
253
|
-
message,
|
|
285
|
+
type: 'tap',
|
|
286
|
+
message: 'Quick tap detected',
|
|
254
287
|
position
|
|
255
288
|
})
|
|
256
289
|
} else if (touchDuration > 500) {
|
|
@@ -260,8 +293,8 @@ export const useMobileTouch = (
|
|
|
260
293
|
|
|
261
294
|
// Show long press hint
|
|
262
295
|
addGestureHint({
|
|
263
|
-
type,
|
|
264
|
-
message,
|
|
296
|
+
type: 'longPress',
|
|
297
|
+
message: 'Long press detected',
|
|
265
298
|
position
|
|
266
299
|
})
|
|
267
300
|
} else {
|
|
@@ -272,8 +305,8 @@ export const useMobileTouch = (
|
|
|
272
305
|
|
|
273
306
|
setMobileTouchState(prev => ({
|
|
274
307
|
...prev,
|
|
275
|
-
isActive,
|
|
276
|
-
touchCount, prev.touchCount - 1)
|
|
308
|
+
isActive: false,
|
|
309
|
+
touchCount: Math.max(0, prev.touchCount - 1)
|
|
277
310
|
}))
|
|
278
311
|
|
|
279
312
|
callbacks.onTouchEnd?.(position)
|
|
@@ -284,9 +317,9 @@ export const useMobileTouch = (
|
|
|
284
317
|
const element = elementRef.current
|
|
285
318
|
if (!element || !mobileTouchState.deviceCapabilities.supportsTouch) return
|
|
286
319
|
|
|
287
|
-
element.addEventListener('touchstart', handleTouchStart, { passive})
|
|
288
|
-
element.addEventListener('touchmove', handleTouchMove, { passive})
|
|
289
|
-
element.addEventListener('touchend', handleTouchEnd, { passive})
|
|
320
|
+
element.addEventListener('touchstart', handleTouchStart, { passive: false })
|
|
321
|
+
element.addEventListener('touchmove', handleTouchMove, { passive: false })
|
|
322
|
+
element.addEventListener('touchend', handleTouchEnd, { passive: false })
|
|
290
323
|
|
|
291
324
|
return () => {
|
|
292
325
|
element.removeEventListener('touchstart', handleTouchStart)
|
|
@@ -328,7 +361,7 @@ export const useMobileTouch = (
|
|
|
328
361
|
|
|
329
362
|
setMobileTouchState(prev => ({
|
|
330
363
|
...prev,
|
|
331
|
-
activeGestureHints]
|
|
364
|
+
activeGestureHints: []
|
|
332
365
|
}))
|
|
333
366
|
}, [])
|
|
334
367
|
|
|
@@ -361,19 +394,21 @@ export const useMobileTouch = (
|
|
|
361
394
|
}
|
|
362
395
|
|
|
363
396
|
// Convenience hook for basic mobile touch
|
|
364
|
-
export const useBasicMobileTouch = (elementRef) => {
|
|
397
|
+
export const useBasicMobileTouch = (elementRef: React.RefObject<HTMLElement>) => {
|
|
365
398
|
return useMobileTouch(elementRef, {}, {
|
|
366
|
-
enableTouchFeedback,
|
|
367
|
-
enableGestureHints,
|
|
368
|
-
enableTouchSounds,
|
|
369
|
-
enableHapticFeedback
|
|
399
|
+
enableTouchFeedback: true,
|
|
400
|
+
enableGestureHints: false,
|
|
401
|
+
enableTouchSounds: false,
|
|
402
|
+
enableHapticFeedback: true
|
|
403
|
+
})
|
|
370
404
|
}
|
|
371
405
|
|
|
372
406
|
// Convenience hook for enhanced mobile touch
|
|
373
|
-
export const useEnhancedMobileTouch = (elementRef) => {
|
|
407
|
+
export const useEnhancedMobileTouch = (elementRef: React.RefObject<HTMLElement>) => {
|
|
374
408
|
return useMobileTouch(elementRef, {}, {
|
|
375
|
-
enableTouchFeedback,
|
|
376
|
-
enableGestureHints,
|
|
377
|
-
enableTouchSounds,
|
|
378
|
-
enableHapticFeedback
|
|
409
|
+
enableTouchFeedback: true,
|
|
410
|
+
enableGestureHints: true,
|
|
411
|
+
enableTouchSounds: true,
|
|
412
|
+
enableHapticFeedback: true
|
|
413
|
+
})
|
|
379
414
|
}
|
|
@@ -1,21 +1,36 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface PerformanceThrottlingConfig {
|
|
4
|
-
enablePerformanceMonitoring
|
|
4
|
+
enablePerformanceMonitoring?: boolean
|
|
5
|
+
enableAutomaticThrottling?: boolean
|
|
6
|
+
enableUserExperienceOptimization?: boolean
|
|
7
|
+
enableBatteryPreservation?: boolean
|
|
8
|
+
performanceThreshold?: number
|
|
9
|
+
frameRateTarget?: number
|
|
10
|
+
memoryThreshold?: number
|
|
11
|
+
cpuThreshold?: number
|
|
12
|
+
}
|
|
5
13
|
|
|
6
14
|
export interface PerformanceMetrics {
|
|
7
|
-
fps
|
|
15
|
+
fps: number
|
|
16
|
+
frameTime: number
|
|
17
|
+
memoryUsage: number
|
|
18
|
+
cpuUsage: number
|
|
19
|
+
performanceScore: number
|
|
20
|
+
isThrottling: boolean
|
|
21
|
+
throttleReason: string
|
|
22
|
+
}
|
|
8
23
|
|
|
9
24
|
export interface PerformanceThrottlingCallbacks {
|
|
10
|
-
onPerformanceWarning
|
|
11
|
-
onThrottlingApplied
|
|
12
|
-
onPerformanceRecovery
|
|
13
|
-
onUserExperienceOptimized
|
|
25
|
+
onPerformanceWarning?: (metrics: PerformanceMetrics) => void
|
|
26
|
+
onThrottlingApplied?: (level: string, reason: string) => void
|
|
27
|
+
onPerformanceRecovery?: (metrics: PerformanceMetrics) => void
|
|
28
|
+
onUserExperienceOptimized?: (optimization: string) => void
|
|
14
29
|
}
|
|
15
30
|
|
|
16
31
|
export const usePerformanceThrottling = (
|
|
17
|
-
config= {},
|
|
18
|
-
callbacks= {}
|
|
32
|
+
config: PerformanceThrottlingConfig = {},
|
|
33
|
+
callbacks: PerformanceThrottlingCallbacks = {}
|
|
19
34
|
) => {
|
|
20
35
|
const {
|
|
21
36
|
enablePerformanceMonitoring = true,
|
|
@@ -29,13 +44,14 @@ export const usePerformanceThrottling = (
|
|
|
29
44
|
} = config
|
|
30
45
|
|
|
31
46
|
const [metrics, setMetrics] = useState<PerformanceMetrics>({
|
|
32
|
-
fps,
|
|
33
|
-
frameTime,
|
|
34
|
-
memoryUsage,
|
|
35
|
-
cpuUsage,
|
|
36
|
-
performanceScore,
|
|
37
|
-
isThrottling,
|
|
38
|
-
throttleReason
|
|
47
|
+
fps: 60,
|
|
48
|
+
frameTime: 16.67,
|
|
49
|
+
memoryUsage: 0,
|
|
50
|
+
cpuUsage: 0,
|
|
51
|
+
performanceScore: 100,
|
|
52
|
+
isThrottling: false,
|
|
53
|
+
throttleReason: 'none'
|
|
54
|
+
})
|
|
39
55
|
|
|
40
56
|
const [isOptimizing, setIsOptimizing] = useState(false)
|
|
41
57
|
const [optimizations, setOptimizations] = useState<string[]>([])
|
|
@@ -82,7 +98,7 @@ export const usePerformanceThrottling = (
|
|
|
82
98
|
else if (memoryUsage > memoryThreshold) throttleReason = 'high_memory'
|
|
83
99
|
else if (cpuUsage > cpuThreshold) throttleReason = 'high_cpu'
|
|
84
100
|
|
|
85
|
-
const newMetrics= {
|
|
101
|
+
const newMetrics: PerformanceMetrics = {
|
|
86
102
|
fps,
|
|
87
103
|
frameTime,
|
|
88
104
|
memoryUsage,
|
|
@@ -105,7 +121,7 @@ export const usePerformanceThrottling = (
|
|
|
105
121
|
lastFrameTimeRef.current = now
|
|
106
122
|
}
|
|
107
123
|
} catch (error) {
|
|
108
|
-
console.warn('Performance measurement failed, error)
|
|
124
|
+
console.warn('Performance measurement failed:', error)
|
|
109
125
|
}
|
|
110
126
|
}, [enablePerformanceMonitoring, performanceThreshold, frameRateTarget, memoryThreshold, cpuThreshold, callbacks, metrics.isThrottling])
|
|
111
127
|
|
|
@@ -116,25 +132,25 @@ export const usePerformanceThrottling = (
|
|
|
116
132
|
setIsOptimizing(true)
|
|
117
133
|
|
|
118
134
|
setTimeout(() => {
|
|
119
|
-
let newThrottleLevel= 'none'
|
|
120
|
-
let optimizations] = []
|
|
135
|
+
let newThrottleLevel: 'none' | 'light' | 'moderate' | 'aggressive' = 'none'
|
|
136
|
+
let optimizations: string[] = []
|
|
121
137
|
|
|
122
138
|
// Determine throttle level based on performance metrics
|
|
123
139
|
if (metrics.performanceScore < 50 || metrics.fps < 30) {
|
|
124
140
|
newThrottleLevel = 'aggressive'
|
|
125
|
-
optimizations.push('Critical performance)
|
|
141
|
+
optimizations.push('Critical performance: Maximum throttling applied')
|
|
126
142
|
optimizations.push('All non-essential animations disabled')
|
|
127
143
|
optimizations.push('Frame rate limited to 30fps')
|
|
128
144
|
optimizations.push('Memory usage optimized')
|
|
129
145
|
} else if (metrics.performanceScore < 70 || metrics.fps < 45) {
|
|
130
146
|
newThrottleLevel = 'moderate'
|
|
131
|
-
optimizations.push('Performance issue)
|
|
147
|
+
optimizations.push('Performance issue: Moderate throttling applied')
|
|
132
148
|
optimizations.push('Animation complexity reduced by 50%')
|
|
133
149
|
optimizations.push('Frame rate limited to 45fps')
|
|
134
150
|
optimizations.push('Memory optimization enabled')
|
|
135
151
|
} else if (metrics.performanceScore < 85 || metrics.fps < 55) {
|
|
136
152
|
newThrottleLevel = 'light'
|
|
137
|
-
optimizations.push('Performance warning)
|
|
153
|
+
optimizations.push('Performance warning: Light throttling applied')
|
|
138
154
|
optimizations.push('Animation complexity reduced by 25%')
|
|
139
155
|
optimizations.push('Frame rate limited to 55fps')
|
|
140
156
|
optimizations.push('Performance monitoring enhanced')
|
|
@@ -142,13 +158,13 @@ export const usePerformanceThrottling = (
|
|
|
142
158
|
|
|
143
159
|
// Battery preservation considerations
|
|
144
160
|
if (enableBatteryPreservation && newThrottleLevel !== 'none') {
|
|
145
|
-
optimizations.push('Battery preservation)
|
|
161
|
+
optimizations.push('Battery preservation: Animation efficiency optimized')
|
|
146
162
|
optimizations.push('GPU usage minimized for power efficiency')
|
|
147
163
|
}
|
|
148
164
|
|
|
149
165
|
// User experience optimization
|
|
150
166
|
if (enableUserExperienceOptimization && newThrottleLevel !== 'none') {
|
|
151
|
-
optimizations.push('User experience)
|
|
167
|
+
optimizations.push('User experience: Smooth performance prioritized')
|
|
152
168
|
optimizations.push('Animation quality balanced with performance')
|
|
153
169
|
optimizations.push('Responsive interactions maintained')
|
|
154
170
|
}
|
|
@@ -170,33 +186,33 @@ export const usePerformanceThrottling = (
|
|
|
170
186
|
const recommendations = []
|
|
171
187
|
|
|
172
188
|
if (metrics.performanceScore < 50) {
|
|
173
|
-
recommendations.push('Critical)
|
|
189
|
+
recommendations.push('Critical: Disable all animations and complex UI operations')
|
|
174
190
|
recommendations.push('Use static UI elements and minimal interactions')
|
|
175
191
|
recommendations.push('Implement aggressive memory cleanup')
|
|
176
192
|
} else if (metrics.performanceScore < 70) {
|
|
177
|
-
recommendations.push('High)
|
|
193
|
+
recommendations.push('High: Significantly reduce animation complexity')
|
|
178
194
|
recommendations.push('Limit concurrent animations to 2-3 maximum')
|
|
179
195
|
recommendations.push('Use CSS transforms instead of JavaScript animations')
|
|
180
196
|
} else if (metrics.performanceScore < 85) {
|
|
181
|
-
recommendations.push('Medium)
|
|
197
|
+
recommendations.push('Medium: Consider light performance optimization')
|
|
182
198
|
recommendations.push('Monitor animation frame rates closely')
|
|
183
199
|
recommendations.push('Implement animation debouncing')
|
|
184
200
|
}
|
|
185
201
|
|
|
186
202
|
if (metrics.fps < frameRateTarget * 0.8) {
|
|
187
|
-
recommendations.push('Low FPS)
|
|
203
|
+
recommendations.push('Low FPS: Reduce animation frame rate')
|
|
188
204
|
recommendations.push('Use requestAnimationFrame for smooth animations')
|
|
189
205
|
recommendations.push('Implement frame skipping for complex animations')
|
|
190
206
|
}
|
|
191
207
|
|
|
192
208
|
if (metrics.memoryUsage > memoryThreshold) {
|
|
193
|
-
recommendations.push('High Memory)
|
|
209
|
+
recommendations.push('High Memory: Optimize memory usage')
|
|
194
210
|
recommendations.push('Clean up animation references')
|
|
195
211
|
recommendations.push('Use object pooling for repeated animations')
|
|
196
212
|
}
|
|
197
213
|
|
|
198
214
|
if (metrics.cpuUsage > cpuThreshold) {
|
|
199
|
-
recommendations.push('High CPU)
|
|
215
|
+
recommendations.push('High CPU: Reduce computational complexity')
|
|
200
216
|
recommendations.push('Use CSS animations instead of JavaScript')
|
|
201
217
|
recommendations.push('Implement animation pausing when not visible')
|
|
202
218
|
}
|
|
@@ -207,32 +223,37 @@ export const usePerformanceThrottling = (
|
|
|
207
223
|
// Get optimal performance settings
|
|
208
224
|
const getOptimalPerformanceSettings = useCallback(() => {
|
|
209
225
|
const settings = {
|
|
210
|
-
maxConcurrentAnimations,
|
|
211
|
-
frameRateLimit,
|
|
212
|
-
animationQuality,
|
|
213
|
-
memoryOptimization,
|
|
214
|
-
cpuOptimization
|
|
226
|
+
maxConcurrentAnimations: 5,
|
|
227
|
+
frameRateLimit: 60,
|
|
228
|
+
animationQuality: 'high',
|
|
229
|
+
memoryOptimization: false,
|
|
230
|
+
cpuOptimization: false
|
|
231
|
+
}
|
|
215
232
|
|
|
216
233
|
switch (throttleLevel) {
|
|
217
|
-
case 'aggressive'
|
|
234
|
+
case 'aggressive':
|
|
235
|
+
settings.maxConcurrentAnimations = 1
|
|
218
236
|
settings.frameRateLimit = 30
|
|
219
237
|
settings.animationQuality = 'minimal'
|
|
220
238
|
settings.memoryOptimization = true
|
|
221
239
|
settings.cpuOptimization = true
|
|
222
240
|
break
|
|
223
|
-
case 'moderate'
|
|
241
|
+
case 'moderate':
|
|
242
|
+
settings.maxConcurrentAnimations = 2
|
|
224
243
|
settings.frameRateLimit = 45
|
|
225
244
|
settings.animationQuality = 'medium'
|
|
226
245
|
settings.memoryOptimization = true
|
|
227
246
|
settings.cpuOptimization = true
|
|
228
247
|
break
|
|
229
|
-
case 'light'
|
|
248
|
+
case 'light':
|
|
249
|
+
settings.maxConcurrentAnimations = 3
|
|
230
250
|
settings.frameRateLimit = 55
|
|
231
251
|
settings.animationQuality = 'high'
|
|
232
252
|
settings.memoryOptimization = true
|
|
233
253
|
settings.cpuOptimization = false
|
|
234
254
|
break
|
|
235
|
-
default
|
|
255
|
+
default:
|
|
256
|
+
settings.maxConcurrentAnimations = 5
|
|
236
257
|
settings.frameRateLimit = 60
|
|
237
258
|
settings.animationQuality = 'high'
|
|
238
259
|
settings.memoryOptimization = false
|
|
@@ -248,8 +269,9 @@ export const usePerformanceThrottling = (
|
|
|
248
269
|
setOptimizations([])
|
|
249
270
|
setMetrics(prev => ({
|
|
250
271
|
...prev,
|
|
251
|
-
isThrottling,
|
|
252
|
-
throttleReason
|
|
272
|
+
isThrottling: false,
|
|
273
|
+
throttleReason: 'none'
|
|
274
|
+
}))
|
|
253
275
|
}, [])
|
|
254
276
|
|
|
255
277
|
// Initialize performance monitoring
|
|
@@ -265,7 +287,7 @@ export const usePerformanceThrottling = (
|
|
|
265
287
|
}
|
|
266
288
|
}
|
|
267
289
|
} catch (error) {
|
|
268
|
-
console.warn('Performance monitoring initialization failed, error)
|
|
290
|
+
console.warn('Performance monitoring initialization failed:', error)
|
|
269
291
|
}
|
|
270
292
|
}, [enablePerformanceMonitoring, measurePerformance])
|
|
271
293
|
|
|
@@ -304,14 +326,16 @@ export const usePerformanceThrottling = (
|
|
|
304
326
|
resetThrottling,
|
|
305
327
|
|
|
306
328
|
// Computed values
|
|
307
|
-
isThrottling
|
|
308
|
-
performanceLevel
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
329
|
+
isThrottling: throttleLevel !== 'none',
|
|
330
|
+
performanceLevel: metrics.performanceScore >= 90 ? 'excellent' :
|
|
331
|
+
metrics.performanceScore >= 80 ? 'good' :
|
|
332
|
+
metrics.performanceScore >= 70 ? 'fair' : 'poor',
|
|
333
|
+
needsOptimization: metrics.performanceScore < 70,
|
|
334
|
+
recommendations: getThrottlingRecommendations(),
|
|
335
|
+
performanceSettings: getOptimalPerformanceSettings(),
|
|
312
336
|
|
|
313
337
|
// Utility functions
|
|
314
|
-
getPerformanceHealth) => {
|
|
338
|
+
getPerformanceHealth: () => {
|
|
315
339
|
if (metrics.performanceScore >= 90) return 'excellent'
|
|
316
340
|
if (metrics.performanceScore >= 80) return 'good'
|
|
317
341
|
if (metrics.performanceScore >= 70) return 'fair'
|