@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.9 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/dist/components/ui/accessibility-demo.esm.js +30 -24
- package/dist/components/ui/accessibility-demo.js +30 -24
- package/dist/components/ui/advanced-component-architecture-demo.esm.js +235 -179
- package/dist/components/ui/advanced-component-architecture-demo.js +235 -179
- package/dist/components/ui/advanced-transition-system-demo.esm.js +110 -64
- package/dist/components/ui/advanced-transition-system-demo.js +110 -64
- package/dist/components/ui/advanced-transition-system.esm.js +166 -122
- package/dist/components/ui/advanced-transition-system.js +166 -122
- package/dist/components/ui/animation/animated-container.esm.js +52 -29
- package/dist/components/ui/animation/animated-container.js +52 -29
- package/dist/components/ui/animation/staggered-container.esm.js +18 -9
- package/dist/components/ui/animation/staggered-container.js +18 -9
- package/dist/components/ui/animation-demo.esm.js +67 -35
- package/dist/components/ui/animation-demo.js +67 -35
- package/dist/components/ui/badge.esm.js +9 -6
- package/dist/components/ui/badge.js +9 -6
- package/dist/components/ui/battery-conscious-animation-demo.esm.js +122 -87
- package/dist/components/ui/battery-conscious-animation-demo.js +122 -87
- package/dist/components/ui/border-radius-shadow-demo.esm.js +23 -12
- package/dist/components/ui/border-radius-shadow-demo.js +23 -12
- package/dist/components/ui/button.esm.js +8 -2
- package/dist/components/ui/button.js +8 -2
- package/dist/components/ui/card.esm.js +33 -8
- package/dist/components/ui/card.js +33 -8
- package/dist/components/ui/checkbox.esm.js +3 -3
- package/dist/components/ui/checkbox.js +3 -3
- package/dist/components/ui/color-preview.esm.js +68 -45
- package/dist/components/ui/color-preview.js +68 -45
- package/dist/components/ui/data-display/chart.esm.js +112 -84
- package/dist/components/ui/data-display/chart.js +112 -84
- package/dist/components/ui/data-display/data-grid-simple.esm.js +1 -1
- package/dist/components/ui/data-display/data-grid-simple.js +1 -1
- package/dist/components/ui/data-display/data-grid.esm.js +80 -67
- package/dist/components/ui/data-display/data-grid.js +80 -67
- package/dist/components/ui/data-display/list.esm.js +53 -45
- package/dist/components/ui/data-display/list.js +53 -45
- package/dist/components/ui/data-display/table.esm.js +62 -54
- package/dist/components/ui/data-display/table.js +62 -54
- package/dist/components/ui/data-display/timeline.esm.js +39 -34
- package/dist/components/ui/data-display/timeline.js +39 -34
- package/dist/components/ui/data-display/tree.esm.js +116 -84
- package/dist/components/ui/data-display/tree.js +116 -84
- package/dist/components/ui/data-display/types.esm.js +389 -364
- package/dist/components/ui/data-display/types.js +389 -364
- package/dist/components/ui/enterprise-mobile-experience-demo.esm.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience-demo.js +120 -70
- package/dist/components/ui/enterprise-mobile-experience.esm.js +124 -73
- package/dist/components/ui/enterprise-mobile-experience.js +124 -73
- package/dist/components/ui/feedback/alert.esm.js +22 -15
- package/dist/components/ui/feedback/alert.js +22 -15
- package/dist/components/ui/feedback/progress.esm.js +47 -24
- package/dist/components/ui/feedback/progress.js +47 -24
- package/dist/components/ui/feedback/skeleton.esm.js +39 -29
- package/dist/components/ui/feedback/skeleton.js +39 -29
- package/dist/components/ui/feedback/toast.esm.js +62 -38
- package/dist/components/ui/feedback/toast.js +62 -38
- package/dist/components/ui/feedback/types.esm.js +83 -83
- package/dist/components/ui/feedback/types.js +83 -83
- package/dist/components/ui/font-preview.esm.js +41 -39
- package/dist/components/ui/font-preview.js +41 -39
- package/dist/components/ui/form-demo.esm.js +150 -113
- package/dist/components/ui/form-demo.js +150 -113
- package/dist/components/ui/hardware-acceleration-demo.esm.js +137 -87
- package/dist/components/ui/hardware-acceleration-demo.js +137 -87
- package/dist/components/ui/input.esm.js +4 -1
- package/dist/components/ui/input.js +4 -1
- package/dist/components/ui/layout-demo.esm.js +81 -56
- package/dist/components/ui/layout-demo.js +81 -56
- package/dist/components/ui/layouts/adaptive-layout.esm.js +27 -8
- package/dist/components/ui/layouts/adaptive-layout.js +27 -8
- package/dist/components/ui/layouts/desktop-layout.esm.js +39 -19
- package/dist/components/ui/layouts/desktop-layout.js +39 -19
- package/dist/components/ui/layouts/mobile-layout.esm.js +19 -9
- package/dist/components/ui/layouts/mobile-layout.js +19 -9
- package/dist/components/ui/layouts/tablet-layout.esm.js +28 -14
- package/dist/components/ui/layouts/tablet-layout.js +28 -14
- package/dist/components/ui/mobile-form-validation.esm.js +120 -87
- package/dist/components/ui/mobile-form-validation.js +120 -87
- package/dist/components/ui/mobile-input-demo.esm.js +19 -13
- package/dist/components/ui/mobile-input-demo.js +19 -13
- package/dist/components/ui/mobile-input.esm.js +185 -120
- package/dist/components/ui/mobile-input.js +185 -120
- package/dist/components/ui/mobile-skeleton-loading-demo.esm.js +128 -111
- package/dist/components/ui/mobile-skeleton-loading-demo.js +128 -111
- package/dist/components/ui/navigation/breadcrumb.esm.js +17 -14
- package/dist/components/ui/navigation/breadcrumb.js +17 -14
- package/dist/components/ui/navigation/index.esm.js +23 -1
- package/dist/components/ui/navigation/index.js +23 -1
- package/dist/components/ui/navigation/menu.esm.js +49 -35
- package/dist/components/ui/navigation/menu.js +49 -35
- package/dist/components/ui/navigation/navigation-demo.esm.js +81 -74
- package/dist/components/ui/navigation/navigation-demo.js +81 -74
- package/dist/components/ui/navigation/pagination.esm.js +62 -50
- package/dist/components/ui/navigation/pagination.js +62 -50
- package/dist/components/ui/navigation/sidebar.esm.js +56 -42
- package/dist/components/ui/navigation/sidebar.js +56 -42
- package/dist/components/ui/navigation/stepper.esm.js +34 -23
- package/dist/components/ui/navigation/stepper.js +34 -23
- package/dist/components/ui/navigation/tabs.esm.js +32 -21
- package/dist/components/ui/navigation/tabs.js +32 -21
- package/dist/components/ui/navigation/types.esm.js +196 -195
- package/dist/components/ui/navigation/types.js +196 -195
- package/dist/components/ui/overlay/backdrop.esm.js +17 -16
- package/dist/components/ui/overlay/backdrop.js +17 -16
- package/dist/components/ui/overlay/focus-manager.esm.js +21 -19
- package/dist/components/ui/overlay/focus-manager.js +21 -19
- package/dist/components/ui/overlay/index.esm.js +22 -2
- package/dist/components/ui/overlay/index.js +22 -2
- package/dist/components/ui/overlay/modal.esm.js +38 -34
- package/dist/components/ui/overlay/modal.js +38 -34
- package/dist/components/ui/overlay/overlay-manager.esm.js +25 -20
- package/dist/components/ui/overlay/overlay-manager.js +25 -20
- package/dist/components/ui/overlay/popover.esm.js +74 -58
- package/dist/components/ui/overlay/popover.js +74 -58
- package/dist/components/ui/overlay/portal.esm.js +7 -7
- package/dist/components/ui/overlay/portal.js +7 -7
- package/dist/components/ui/overlay/tooltip.esm.js +54 -39
- package/dist/components/ui/overlay/tooltip.js +54 -39
- package/dist/components/ui/overlay/types.esm.js +132 -131
- package/dist/components/ui/overlay/types.js +132 -131
- package/dist/components/ui/performance-demo.esm.js +135 -88
- package/dist/components/ui/performance-demo.js +135 -88
- package/dist/components/ui/semantic-input-system-demo.esm.js +117 -80
- package/dist/components/ui/semantic-input-system-demo.js +117 -80
- package/dist/components/ui/theme-customizer.esm.js +84 -52
- package/dist/components/ui/theme-customizer.js +84 -52
- package/dist/components/ui/theme-preview.esm.js +95 -43
- package/dist/components/ui/theme-preview.js +95 -43
- package/dist/components/ui/theme-switcher.esm.js +70 -44
- package/dist/components/ui/theme-switcher.js +70 -44
- package/dist/components/ui/theme-toggle.esm.js +3 -3
- package/dist/components/ui/theme-toggle.js +3 -3
- package/dist/components/ui/token-demo.esm.js +33 -21
- package/dist/components/ui/token-demo.js +33 -21
- package/dist/components/ui/touch-demo.esm.js +102 -73
- package/dist/components/ui/touch-demo.js +102 -73
- package/dist/components/ui/touch-friendly-interface-demo.esm.js +102 -64
- package/dist/components/ui/touch-friendly-interface-demo.js +102 -64
- package/dist/components/ui/touch-friendly-interface.esm.js +85 -61
- package/dist/components/ui/touch-friendly-interface.js +85 -61
- package/dist/hooks/use-accessibility-support.esm.js +115 -85
- package/dist/hooks/use-accessibility-support.js +115 -85
- package/dist/hooks/use-adaptive-layout.esm.js +56 -33
- package/dist/hooks/use-adaptive-layout.js +56 -33
- package/dist/hooks/use-advanced-patterns.esm.js +57 -42
- package/dist/hooks/use-advanced-patterns.js +57 -42
- package/dist/hooks/use-advanced-transition-system.esm.js +112 -71
- package/dist/hooks/use-advanced-transition-system.js +112 -71
- package/dist/hooks/use-animation-profile.esm.js +63 -34
- package/dist/hooks/use-animation-profile.js +63 -34
- package/dist/hooks/use-battery-animations.esm.js +80 -55
- package/dist/hooks/use-battery-animations.js +80 -55
- package/dist/hooks/use-battery-conscious-loading.esm.js +166 -123
- package/dist/hooks/use-battery-conscious-loading.js +166 -123
- package/dist/hooks/use-battery-optimization.esm.js +78 -55
- package/dist/hooks/use-battery-optimization.js +78 -55
- package/dist/hooks/use-battery-status.esm.js +73 -51
- package/dist/hooks/use-battery-status.js +73 -51
- package/dist/hooks/use-component-performance.esm.js +62 -47
- package/dist/hooks/use-component-performance.js +62 -47
- package/dist/hooks/use-device-loading-states.esm.js +152 -109
- package/dist/hooks/use-device-loading-states.js +152 -109
- package/dist/hooks/use-device.esm.js +25 -14
- package/dist/hooks/use-device.js +25 -14
- package/dist/hooks/use-enterprise-mobile-experience.esm.js +137 -88
- package/dist/hooks/use-enterprise-mobile-experience.js +137 -88
- package/dist/hooks/use-form-feedback.esm.js +124 -81
- package/dist/hooks/use-form-feedback.js +124 -81
- package/dist/hooks/use-form-performance.esm.js +127 -92
- package/dist/hooks/use-form-performance.js +127 -92
- package/dist/hooks/use-frame-rate.esm.js +56 -37
- package/dist/hooks/use-frame-rate.js +56 -37
- package/dist/hooks/use-gestures.esm.js +96 -72
- package/dist/hooks/use-gestures.js +96 -72
- package/dist/hooks/use-hardware-acceleration.esm.js +65 -37
- package/dist/hooks/use-hardware-acceleration.js +65 -37
- package/dist/hooks/use-input-accessibility.esm.js +157 -119
- package/dist/hooks/use-input-accessibility.js +157 -119
- package/dist/hooks/use-input-performance.esm.js +139 -104
- package/dist/hooks/use-input-performance.js +139 -104
- package/dist/hooks/use-layout-performance.esm.js +50 -29
- package/dist/hooks/use-layout-performance.js +50 -29
- package/dist/hooks/use-loading-accessibility.esm.js +209 -169
- package/dist/hooks/use-loading-accessibility.js +209 -169
- package/dist/hooks/use-loading-performance.esm.js +117 -93
- package/dist/hooks/use-loading-performance.js +117 -93
- package/dist/hooks/use-memory-usage.esm.js +57 -38
- package/dist/hooks/use-memory-usage.js +57 -38
- package/dist/hooks/use-mobile-form-layout.esm.js +111 -74
- package/dist/hooks/use-mobile-form-layout.js +111 -74
- package/dist/hooks/use-mobile-form-validation.esm.js +211 -144
- package/dist/hooks/use-mobile-form-validation.js +211 -144
- package/dist/hooks/use-mobile-keyboard-optimization.esm.js +154 -113
- package/dist/hooks/use-mobile-keyboard-optimization.js +154 -113
- package/dist/hooks/use-mobile-layout.esm.js +73 -51
- package/dist/hooks/use-mobile-layout.js +73 -51
- package/dist/hooks/use-mobile-optimization.esm.js +72 -44
- package/dist/hooks/use-mobile-optimization.js +72 -44
- package/dist/hooks/use-mobile-skeleton.esm.js +97 -64
- package/dist/hooks/use-mobile-skeleton.js +97 -64
- package/dist/hooks/use-mobile-touch.esm.js +128 -93
- package/dist/hooks/use-mobile-touch.js +128 -93
- package/dist/hooks/use-performance-throttling.esm.js +72 -48
- package/dist/hooks/use-performance-throttling.js +72 -48
- package/dist/hooks/use-performance.esm.js +90 -52
- package/dist/hooks/use-performance.js +90 -52
- package/dist/hooks/use-reusable-architecture.esm.js +94 -65
- package/dist/hooks/use-reusable-architecture.js +94 -65
- package/dist/hooks/use-semantic-input-types.esm.js +166 -124
- package/dist/hooks/use-semantic-input-types.js +166 -124
- package/dist/hooks/use-semantic-input.esm.js +178 -126
- package/dist/hooks/use-semantic-input.js +178 -126
- package/dist/hooks/use-tablet-layout.esm.js +67 -38
- package/dist/hooks/use-tablet-layout.js +67 -38
- package/dist/hooks/use-touch-friendly-input.esm.js +193 -149
- package/dist/hooks/use-touch-friendly-input.js +193 -149
- package/dist/hooks/use-touch-friendly-interface.esm.js +99 -67
- package/dist/hooks/use-touch-friendly-interface.js +99 -67
- package/dist/hooks/use-touch-optimization.esm.js +99 -72
- package/dist/hooks/use-touch-optimization.js +99 -72
- package/dist/index.esm.js +289 -280
- package/dist/index.js +289 -280
- package/dist/lib/utils.esm.js +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/plugins/theme-css-generator.esm.js +104 -55
- package/dist/plugins/theme-css-generator.js +104 -55
- package/dist/provider.esm.js +4 -4
- package/dist/provider.js +4 -4
- package/dist/styles.css +1 -1
- package/dist/theme.esm.js +633 -468
- package/dist/theme.js +633 -468
- package/dist/themes/ThemeContext.esm.js +15 -15
- package/dist/themes/ThemeContext.js +15 -15
- package/dist/themes/ThemeProvider.esm.js +25 -22
- package/dist/themes/ThemeProvider.js +25 -22
- package/dist/themes/accessibility.esm.js +147 -108
- package/dist/themes/accessibility.js +147 -108
- package/dist/themes/aria-patterns.esm.js +198 -162
- package/dist/themes/aria-patterns.js +198 -162
- package/dist/themes/base-themes.esm.js +14 -11
- package/dist/themes/base-themes.js +14 -11
- package/dist/themes/colorManager.esm.js +101 -83
- package/dist/themes/colorManager.js +101 -83
- package/dist/themes/examples/dark-theme.esm.js +133 -103
- package/dist/themes/examples/dark-theme.js +133 -103
- package/dist/themes/examples/minimal-theme.esm.js +83 -61
- package/dist/themes/examples/minimal-theme.js +83 -61
- package/dist/themes/focus-management.esm.js +202 -143
- package/dist/themes/focus-management.js +202 -143
- package/dist/themes/fontLoader.esm.js +28 -19
- package/dist/themes/fontLoader.js +28 -19
- package/dist/themes/high-contrast.esm.js +152 -104
- package/dist/themes/high-contrast.js +152 -104
- package/dist/themes/inheritance.esm.js +35 -27
- package/dist/themes/inheritance.js +35 -27
- package/dist/themes/keyboard-navigation.esm.js +152 -123
- package/dist/themes/keyboard-navigation.js +152 -123
- package/dist/themes/motion-reduction.esm.js +193 -133
- package/dist/themes/motion-reduction.js +193 -133
- package/dist/themes/navigation.esm.js +146 -146
- package/dist/themes/navigation.js +146 -146
- package/dist/themes/screen-reader.esm.js +159 -94
- package/dist/themes/screen-reader.js +159 -94
- package/dist/themes/systemThemeDetector.esm.js +42 -34
- package/dist/themes/systemThemeDetector.js +42 -34
- package/dist/themes/themeCSSUpdater.esm.js +21 -9
- package/dist/themes/themeCSSUpdater.js +21 -9
- package/dist/themes/themePersistence.esm.js +68 -47
- package/dist/themes/themePersistence.js +68 -47
- package/dist/themes/themes/stan-design.esm.js +633 -468
- package/dist/themes/themes/stan-design.js +633 -468
- package/dist/themes/types.esm.js +301 -287
- package/dist/themes/types.js +301 -287
- package/dist/themes/useSystemTheme.esm.js +4 -4
- package/dist/themes/useSystemTheme.js +4 -4
- package/dist/themes/useTheme.esm.js +4 -4
- package/dist/themes/useTheme.js +4 -4
- package/dist/themes/validation.esm.js +128 -77
- package/dist/themes/validation.js +128 -77
- package/dist/tokens/index.esm.js +15 -4
- package/dist/tokens/index.js +15 -4
- package/dist/tokens/tokenExporter.esm.js +87 -61
- package/dist/tokens/tokenExporter.js +87 -61
- package/dist/tokens/tokenGenerator.esm.js +86 -77
- package/dist/tokens/tokenGenerator.js +86 -77
- package/dist/tokens/tokenManager.esm.js +64 -51
- package/dist/tokens/tokenManager.js +64 -51
- package/dist/tokens/tokenValidator.esm.js +193 -147
- package/dist/tokens/tokenValidator.js +193 -147
- package/dist/tokens/types.esm.js +49 -35
- package/dist/tokens/types.js +49 -35
- package/dist/utils/bundle-analyzer.esm.js +83 -65
- package/dist/utils/bundle-analyzer.js +83 -65
- package/dist/utils/bundle-splitting.esm.js +142 -117
- package/dist/utils/bundle-splitting.js +142 -117
- package/dist/utils/lazy-loading.esm.js +132 -106
- package/dist/utils/lazy-loading.js +132 -106
- package/dist/utils/performance-monitor.esm.js +170 -129
- package/dist/utils/performance-monitor.js +170 -129
- package/dist/utils/tree-shaking.esm.js +69 -61
- package/dist/utils/tree-shaking.js +69 -61
- package/package.json +1 -1
- package/src/index.ts +146 -146
|
@@ -1,25 +1,45 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface TouchTarget {
|
|
4
|
-
id
|
|
4
|
+
id: string
|
|
5
|
+
x: number
|
|
6
|
+
y: number
|
|
7
|
+
width: number
|
|
8
|
+
height: number
|
|
9
|
+
minSize: number
|
|
10
|
+
isOptimized: boolean
|
|
11
|
+
}
|
|
5
12
|
|
|
6
13
|
export interface TouchEvent {
|
|
7
|
-
type
|
|
8
|
-
|
|
14
|
+
type: 'tap' | 'double-tap' | 'long-press' | 'swipe' | 'pinch'
|
|
15
|
+
target: TouchTarget
|
|
16
|
+
coordinates: { x: number; y: number }
|
|
17
|
+
timestamp: number
|
|
18
|
+
duration?: number
|
|
19
|
+
distance?: number
|
|
20
|
+
}
|
|
9
21
|
|
|
10
22
|
export interface MobileLayoutConfig {
|
|
11
|
-
enableTouchTargetOptimization
|
|
23
|
+
enableTouchTargetOptimization?: boolean
|
|
24
|
+
enableGestureSupport?: boolean
|
|
25
|
+
enableTouchFeedback?: boolean
|
|
26
|
+
enablePerformanceOptimization?: boolean
|
|
27
|
+
minTouchTargetSize?: number
|
|
28
|
+
touchFeedbackDuration?: number
|
|
29
|
+
gestureThreshold?: number
|
|
30
|
+
longPressDelay?: number
|
|
31
|
+
}
|
|
12
32
|
|
|
13
33
|
export interface MobileLayoutCallbacks {
|
|
14
|
-
onTouchTargetOptimized
|
|
15
|
-
onGestureDetected
|
|
16
|
-
onTouchFeedback
|
|
17
|
-
onPerformanceOptimization
|
|
34
|
+
onTouchTargetOptimized?: (target: TouchTarget) => void
|
|
35
|
+
onGestureDetected?: (event: TouchEvent) => void
|
|
36
|
+
onTouchFeedback?: (type: string, target: TouchTarget) => void
|
|
37
|
+
onPerformanceOptimization?: (optimization: string) => void
|
|
18
38
|
}
|
|
19
39
|
|
|
20
40
|
export const useMobileLayout = (
|
|
21
|
-
config= {},
|
|
22
|
-
callbacks= {}
|
|
41
|
+
config: MobileLayoutConfig = {},
|
|
42
|
+
callbacks: MobileLayoutCallbacks = {}
|
|
23
43
|
) => {
|
|
24
44
|
const {
|
|
25
45
|
enableTouchTargetOptimization = true,
|
|
@@ -37,7 +57,7 @@ export const useMobileLayout = (
|
|
|
37
57
|
const [isOptimizing, setIsOptimizing] = useState(false)
|
|
38
58
|
const [optimizations, setOptimizations] = useState<string[]>([])
|
|
39
59
|
|
|
40
|
-
const touchStartRef = useRef<{ x; y; timestamp} | null>(null)
|
|
60
|
+
const touchStartRef = useRef<{ x: number; y: number; timestamp: number } | null>(null)
|
|
41
61
|
const longPressTimerRef = useRef<number | null>(null)
|
|
42
62
|
const touchFeedbackRef = useRef<HTMLDivElement | null>(null)
|
|
43
63
|
|
|
@@ -51,7 +71,7 @@ export const useMobileLayout = (
|
|
|
51
71
|
setTimeout(() => {
|
|
52
72
|
const optimizedTargets = touchTargets.map(target => ({
|
|
53
73
|
...target,
|
|
54
|
-
isOptimized
|
|
74
|
+
isOptimized: target.width >= minTouchTargetSize && target.height >= minTouchTargetSize
|
|
55
75
|
}))
|
|
56
76
|
|
|
57
77
|
setTouchTargets(optimizedTargets)
|
|
@@ -69,10 +89,10 @@ export const useMobileLayout = (
|
|
|
69
89
|
}, [enableTouchTargetOptimization, touchTargets, minTouchTargetSize, callbacks])
|
|
70
90
|
|
|
71
91
|
// Add touch target
|
|
72
|
-
const addTouchTarget = useCallback((target, 'isOptimized'>) => {
|
|
73
|
-
const newTarget= {
|
|
92
|
+
const addTouchTarget = useCallback((target: Omit<TouchTarget, 'isOptimized'>) => {
|
|
93
|
+
const newTarget: TouchTarget = {
|
|
74
94
|
...target,
|
|
75
|
-
isOptimized
|
|
95
|
+
isOptimized: target.width >= minTouchTargetSize && target.height >= minTouchTargetSize
|
|
76
96
|
}
|
|
77
97
|
|
|
78
98
|
setTouchTargets(prev => [...prev, newTarget])
|
|
@@ -83,12 +103,12 @@ export const useMobileLayout = (
|
|
|
83
103
|
}, [minTouchTargetSize, callbacks])
|
|
84
104
|
|
|
85
105
|
// Remove touch target
|
|
86
|
-
const removeTouchTarget = useCallback((id) => {
|
|
106
|
+
const removeTouchTarget = useCallback((id: string) => {
|
|
87
107
|
setTouchTargets(prev => prev.filter(target => target.id !== id))
|
|
88
108
|
}, [])
|
|
89
109
|
|
|
90
110
|
// Touch feedback
|
|
91
|
-
const showTouchFeedback = useCallback((type, target) => {
|
|
111
|
+
const showTouchFeedback = useCallback((type: string, target: TouchTarget) => {
|
|
92
112
|
if (!enableTouchFeedback) return
|
|
93
113
|
|
|
94
114
|
callbacks.onTouchFeedback?.(type, target)
|
|
@@ -98,12 +118,12 @@ export const useMobileLayout = (
|
|
|
98
118
|
const feedback = document.createElement('div')
|
|
99
119
|
feedback.className = `absolute rounded-full bg-cs-primary/20 pointer-events-none transition-all duration-${touchFeedbackDuration}ms`
|
|
100
120
|
feedback.style.cssText = `
|
|
101
|
-
left}px;
|
|
102
|
-
top}px;
|
|
103
|
-
width}px;
|
|
104
|
-
height}px;
|
|
105
|
-
transform);
|
|
106
|
-
opacity;
|
|
121
|
+
left: ${target.x}px;
|
|
122
|
+
top: ${target.y}px;
|
|
123
|
+
width: ${target.width}px;
|
|
124
|
+
height: ${target.height}px;
|
|
125
|
+
transform: scale(1.2);
|
|
126
|
+
opacity: 0.8;
|
|
107
127
|
`
|
|
108
128
|
|
|
109
129
|
touchFeedbackRef.current.appendChild(feedback)
|
|
@@ -124,7 +144,7 @@ export const useMobileLayout = (
|
|
|
124
144
|
}, [enableTouchFeedback, touchFeedbackDuration, callbacks])
|
|
125
145
|
|
|
126
146
|
// Gesture detection
|
|
127
|
-
const detectGesture = useCallback((startEvent, endEvent)=> {
|
|
147
|
+
const detectGesture = useCallback((startEvent: TouchEvent, endEvent: TouchEvent): TouchEvent | null => {
|
|
128
148
|
if (!enableGestureSupport) return null
|
|
129
149
|
|
|
130
150
|
const start = touchStartRef.current
|
|
@@ -135,21 +155,23 @@ export const useMobileLayout = (
|
|
|
135
155
|
const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY)
|
|
136
156
|
const duration = endEvent.timestamp - start.timestamp
|
|
137
157
|
|
|
138
|
-
let gestureType] = 'tap'
|
|
158
|
+
let gestureType: TouchEvent['type'] = 'tap'
|
|
139
159
|
|
|
140
160
|
if (distance > gestureThreshold) {
|
|
141
161
|
if (Math.abs(deltaX) > Math.abs(deltaY)) {
|
|
142
|
-
gestureType = deltaX > 0 ? 'swipe'
|
|
143
|
-
|
|
162
|
+
gestureType = deltaX > 0 ? 'swipe' : 'swipe'
|
|
163
|
+
} else {
|
|
164
|
+
gestureType = deltaY > 0 ? 'swipe' : 'swipe'
|
|
165
|
+
}
|
|
144
166
|
} else if (duration > longPressDelay) {
|
|
145
167
|
gestureType = 'long-press'
|
|
146
168
|
}
|
|
147
169
|
|
|
148
|
-
const gesture= {
|
|
149
|
-
type,
|
|
150
|
-
target,
|
|
151
|
-
coordinates,
|
|
152
|
-
timestamp,
|
|
170
|
+
const gesture: TouchEvent = {
|
|
171
|
+
type: gestureType,
|
|
172
|
+
target: startEvent.target,
|
|
173
|
+
coordinates: endEvent.coordinates,
|
|
174
|
+
timestamp: endEvent.timestamp,
|
|
153
175
|
duration,
|
|
154
176
|
distance
|
|
155
177
|
}
|
|
@@ -161,22 +183,22 @@ export const useMobileLayout = (
|
|
|
161
183
|
}, [enableGestureSupport, gestureThreshold, longPressDelay, callbacks])
|
|
162
184
|
|
|
163
185
|
// Touch event handlers
|
|
164
|
-
const handleTouchStart = useCallback((event, target) => {
|
|
186
|
+
const handleTouchStart = useCallback((event: React.TouchEvent, target: TouchTarget) => {
|
|
165
187
|
const touch = event.touches[0]
|
|
166
188
|
|
|
167
189
|
touchStartRef.current = {
|
|
168
|
-
x,
|
|
169
|
-
y,
|
|
170
|
-
timestamp)
|
|
190
|
+
x: touch.clientX,
|
|
191
|
+
y: touch.clientY,
|
|
192
|
+
timestamp: Date.now()
|
|
171
193
|
}
|
|
172
194
|
|
|
173
195
|
// Start long press timer
|
|
174
196
|
longPressTimerRef.current = window.setTimeout(() => {
|
|
175
|
-
const longPressEvent= {
|
|
176
|
-
type,
|
|
197
|
+
const longPressEvent: TouchEvent = {
|
|
198
|
+
type: 'long-press',
|
|
177
199
|
target,
|
|
178
|
-
coordinates, y},
|
|
179
|
-
timestamp)
|
|
200
|
+
coordinates: { x: touch.clientX, y: touch.clientY },
|
|
201
|
+
timestamp: Date.now()
|
|
180
202
|
}
|
|
181
203
|
|
|
182
204
|
setActiveGestures(prev => [...prev, longPressEvent])
|
|
@@ -187,7 +209,7 @@ export const useMobileLayout = (
|
|
|
187
209
|
showTouchFeedback('touch-start', target)
|
|
188
210
|
}, [longPressDelay, callbacks, showTouchFeedback])
|
|
189
211
|
|
|
190
|
-
const handleTouchEnd = useCallback((event, target) => {
|
|
212
|
+
const handleTouchEnd = useCallback((event: React.TouchEvent, target: TouchTarget) => {
|
|
191
213
|
if (longPressTimerRef.current) {
|
|
192
214
|
clearTimeout(longPressTimerRef.current)
|
|
193
215
|
longPressTimerRef.current = null
|
|
@@ -195,15 +217,15 @@ export const useMobileLayout = (
|
|
|
195
217
|
|
|
196
218
|
const touch = event.changedTouches[0]
|
|
197
219
|
const gesture = detectGesture({
|
|
198
|
-
type,
|
|
220
|
+
type: 'tap',
|
|
199
221
|
target,
|
|
200
|
-
coordinates, y},
|
|
201
|
-
timestamp)
|
|
222
|
+
coordinates: { x: touch.clientX, y: touch.clientY },
|
|
223
|
+
timestamp: Date.now()
|
|
202
224
|
}, {
|
|
203
|
-
type,
|
|
225
|
+
type: 'tap',
|
|
204
226
|
target,
|
|
205
|
-
coordinates, y},
|
|
206
|
-
timestamp)
|
|
227
|
+
coordinates: { x: touch.clientX, y: touch.clientY },
|
|
228
|
+
timestamp: Date.now()
|
|
207
229
|
})
|
|
208
230
|
if (gesture) {
|
|
209
231
|
showTouchFeedback(gesture.type, target)
|
|
@@ -270,10 +292,10 @@ export const useMobileLayout = (
|
|
|
270
292
|
optimizePerformance,
|
|
271
293
|
|
|
272
294
|
// Computed values
|
|
273
|
-
touchTargetCount,
|
|
274
|
-
optimizedTargetCount=> t.isOptimized).length,
|
|
275
|
-
gestureCount,
|
|
276
|
-
isTouchOptimized=> t.isOptimized)
|
|
295
|
+
touchTargetCount: touchTargets.length,
|
|
296
|
+
optimizedTargetCount: touchTargets.filter(t => t.isOptimized).length,
|
|
297
|
+
gestureCount: activeGestures.length,
|
|
298
|
+
isTouchOptimized: touchTargets.every(t => t.isOptimized)
|
|
277
299
|
}
|
|
278
300
|
}
|
|
279
301
|
|
|
@@ -1,22 +1,37 @@
|
|
|
1
1
|
import { useState, useCallback, useRef, useEffect } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface MobileOptimizationConfig {
|
|
4
|
-
enableTouchOptimization
|
|
4
|
+
enableTouchOptimization?: boolean
|
|
5
|
+
enablePerformanceOptimization?: boolean
|
|
6
|
+
enableBatteryOptimization?: boolean
|
|
7
|
+
enableAccessibilityOptimization?: boolean
|
|
8
|
+
enableResponsiveOptimization?: boolean
|
|
9
|
+
touchTargetSize?: number
|
|
10
|
+
performanceThreshold?: number
|
|
11
|
+
batteryThreshold?: number
|
|
12
|
+
}
|
|
5
13
|
|
|
6
14
|
export interface MobileOptimizationState {
|
|
7
|
-
isMobile
|
|
15
|
+
isMobile: boolean
|
|
16
|
+
isTouchDevice: boolean
|
|
17
|
+
screenSize: 'small' | 'medium' | 'large'
|
|
18
|
+
orientation: 'portrait' | 'landscape'
|
|
19
|
+
batteryLevel: number
|
|
20
|
+
performanceScore: number
|
|
21
|
+
accessibilityLevel: 'basic' | 'enhanced' | 'advanced'
|
|
22
|
+
}
|
|
8
23
|
|
|
9
24
|
export interface MobileOptimizationCallbacks {
|
|
10
|
-
onMobileOptimized
|
|
11
|
-
onTouchOptimized
|
|
12
|
-
onPerformanceOptimized
|
|
13
|
-
onBatteryOptimized
|
|
14
|
-
onAccessibilityEnhanced
|
|
25
|
+
onMobileOptimized?: (optimization: string) => void
|
|
26
|
+
onTouchOptimized?: (feature: string) => void
|
|
27
|
+
onPerformanceOptimized?: (improvement: string) => void
|
|
28
|
+
onBatteryOptimized?: (strategy: string) => void
|
|
29
|
+
onAccessibilityEnhanced?: (feature: string) => void
|
|
15
30
|
}
|
|
16
31
|
|
|
17
32
|
export const useMobileOptimization = (
|
|
18
|
-
config= {},
|
|
19
|
-
callbacks= {}
|
|
33
|
+
config: MobileOptimizationConfig = {},
|
|
34
|
+
callbacks: MobileOptimizationCallbacks = {}
|
|
20
35
|
) => {
|
|
21
36
|
const {
|
|
22
37
|
enableTouchOptimization = true,
|
|
@@ -29,13 +44,14 @@ export const useMobileOptimization = (
|
|
|
29
44
|
} = config
|
|
30
45
|
|
|
31
46
|
const [state, setState] = useState<MobileOptimizationState>({
|
|
32
|
-
isMobile,
|
|
33
|
-
isTouchDevice,
|
|
34
|
-
screenSize,
|
|
35
|
-
orientation,
|
|
36
|
-
batteryLevel,
|
|
37
|
-
performanceScore,
|
|
38
|
-
accessibilityLevel
|
|
47
|
+
isMobile: false,
|
|
48
|
+
isTouchDevice: false,
|
|
49
|
+
screenSize: 'medium',
|
|
50
|
+
orientation: 'portrait',
|
|
51
|
+
batteryLevel: 1,
|
|
52
|
+
performanceScore: 100,
|
|
53
|
+
accessibilityLevel: 'basic'
|
|
54
|
+
})
|
|
39
55
|
|
|
40
56
|
const [isOptimizing, setIsOptimizing] = useState(false)
|
|
41
57
|
const [optimizations, setOptimizations] = useState<string[]>([])
|
|
@@ -53,14 +69,17 @@ export const useMobileOptimization = (
|
|
|
53
69
|
|
|
54
70
|
setState(prev => ({
|
|
55
71
|
...prev,
|
|
56
|
-
isMobile,
|
|
57
|
-
isTouchDevice
|
|
72
|
+
isMobile: isMobileDevice,
|
|
73
|
+
isTouchDevice: isTouchDevice
|
|
74
|
+
}))
|
|
58
75
|
}, [])
|
|
59
76
|
|
|
60
77
|
// Screen size detection
|
|
61
78
|
const detectScreenSize = useCallback(() => {
|
|
62
79
|
const width = window.innerWidth
|
|
63
|
-
let screenSize
|
|
80
|
+
let screenSize: 'small' | 'medium' | 'large'
|
|
81
|
+
|
|
82
|
+
if (width < 768) {
|
|
64
83
|
screenSize = 'small'
|
|
65
84
|
} else if (width < 1024) {
|
|
66
85
|
screenSize = 'medium'
|
|
@@ -76,7 +95,9 @@ export const useMobileOptimization = (
|
|
|
76
95
|
|
|
77
96
|
// Orientation detection
|
|
78
97
|
const detectOrientation = useCallback(() => {
|
|
79
|
-
const orientation = window.innerWidth > window.innerHeight ? 'landscape'
|
|
98
|
+
const orientation = window.innerWidth > window.innerHeight ? 'landscape' : 'portrait'
|
|
99
|
+
|
|
100
|
+
setState(prev => ({
|
|
80
101
|
...prev,
|
|
81
102
|
orientation
|
|
82
103
|
}))
|
|
@@ -199,9 +220,9 @@ export const useMobileOptimization = (
|
|
|
199
220
|
|
|
200
221
|
// Touch target validation
|
|
201
222
|
const validateTouchTargets = useCallback(() => {
|
|
202
|
-
if (!enableTouchOptimization) return { isValid, issues] }
|
|
223
|
+
if (!enableTouchOptimization) return { isValid: true, issues: [] }
|
|
203
224
|
|
|
204
|
-
const issues] = []
|
|
225
|
+
const issues: string[] = []
|
|
205
226
|
const targets = Array.from(touchTargets.values())
|
|
206
227
|
|
|
207
228
|
targets.forEach((target, index) => {
|
|
@@ -209,35 +230,41 @@ export const useMobileOptimization = (
|
|
|
209
230
|
const minSize = Math.min(rect.width, rect.height)
|
|
210
231
|
|
|
211
232
|
if (minSize < touchTargetSize) {
|
|
212
|
-
issues.push(`Touch target ${index} is too small}px < ${touchTargetSize}px`)
|
|
233
|
+
issues.push(`Touch target ${index} is too small: ${minSize}px < ${touchTargetSize}px`)
|
|
213
234
|
}
|
|
214
235
|
})
|
|
215
236
|
|
|
216
237
|
return {
|
|
217
|
-
isValid=== 0,
|
|
238
|
+
isValid: issues.length === 0,
|
|
218
239
|
issues
|
|
219
240
|
}
|
|
220
241
|
}, [enableTouchOptimization, touchTargets, touchTargetSize])
|
|
221
242
|
|
|
222
243
|
// Mobile-specific component optimization
|
|
223
244
|
const optimizeComponentForMobile = useCallback((
|
|
224
|
-
componentId,
|
|
225
|
-
optimizationType
|
|
245
|
+
componentId: string,
|
|
246
|
+
optimizationType: 'touch' | 'performance' | 'battery' | 'accessibility' | 'responsive'
|
|
247
|
+
) => {
|
|
226
248
|
setIsOptimizing(true)
|
|
227
249
|
|
|
228
250
|
setTimeout(() => {
|
|
229
|
-
let optimizations] = []
|
|
251
|
+
let optimizations: string[] = []
|
|
230
252
|
|
|
231
253
|
switch (optimizationType) {
|
|
232
|
-
case 'touch'
|
|
254
|
+
case 'touch':
|
|
255
|
+
optimizations = [`Touch optimization applied to ${componentId}`]
|
|
233
256
|
break
|
|
234
|
-
case 'performance'
|
|
257
|
+
case 'performance':
|
|
258
|
+
optimizations = [`Performance optimization applied to ${componentId}`]
|
|
235
259
|
break
|
|
236
|
-
case 'battery'
|
|
260
|
+
case 'battery':
|
|
261
|
+
optimizations = [`Battery optimization applied to ${componentId}`]
|
|
237
262
|
break
|
|
238
|
-
case 'accessibility'
|
|
263
|
+
case 'accessibility':
|
|
264
|
+
optimizations = [`Accessibility optimization applied to ${componentId}`]
|
|
239
265
|
break
|
|
240
|
-
case 'responsive'
|
|
266
|
+
case 'responsive':
|
|
267
|
+
optimizations = [`Responsive optimization applied to ${componentId}`]
|
|
241
268
|
break
|
|
242
269
|
}
|
|
243
270
|
|
|
@@ -253,13 +280,13 @@ export const useMobileOptimization = (
|
|
|
253
280
|
// Mobile optimization analysis
|
|
254
281
|
const analyzeMobileOptimization = useCallback(() => {
|
|
255
282
|
const analysis = {
|
|
256
|
-
isMobileOptimized,
|
|
257
|
-
touchOptimized=> opt.includes('Touch')),
|
|
258
|
-
performanceOptimized=> opt.includes('Performance')),
|
|
259
|
-
batteryOptimized=> opt.includes('Battery')),
|
|
260
|
-
accessibilityOptimized=> opt.includes('Accessibility')),
|
|
261
|
-
responsiveOptimized=> opt.includes('Responsive')),
|
|
262
|
-
recommendations] as string[]
|
|
283
|
+
isMobileOptimized: state.isMobile && optimizations.length > 0,
|
|
284
|
+
touchOptimized: optimizations.some(opt => opt.includes('Touch')),
|
|
285
|
+
performanceOptimized: optimizations.some(opt => opt.includes('Performance')),
|
|
286
|
+
batteryOptimized: optimizations.some(opt => opt.includes('Battery')),
|
|
287
|
+
accessibilityOptimized: optimizations.some(opt => opt.includes('Accessibility')),
|
|
288
|
+
responsiveOptimized: optimizations.some(opt => opt.includes('Responsive')),
|
|
289
|
+
recommendations: [] as string[]
|
|
263
290
|
}
|
|
264
291
|
|
|
265
292
|
if (!analysis.touchOptimized && state.isTouchDevice) {
|
|
@@ -313,9 +340,10 @@ export const useMobileOptimization = (
|
|
|
313
340
|
const battery = await (navigator as any).getBattery()
|
|
314
341
|
setState(prev => ({
|
|
315
342
|
...prev,
|
|
316
|
-
batteryLevel
|
|
343
|
+
batteryLevel: battery.level
|
|
344
|
+
}))
|
|
317
345
|
} catch (error) {
|
|
318
|
-
console.warn('Battery monitoring failed, error)
|
|
346
|
+
console.warn('Battery monitoring failed:', error)
|
|
319
347
|
}
|
|
320
348
|
}, 10000)
|
|
321
349
|
}
|
|
@@ -363,15 +391,15 @@ export const useMobileOptimization = (
|
|
|
363
391
|
analyzeMobileOptimization,
|
|
364
392
|
|
|
365
393
|
// Utility functions
|
|
366
|
-
isMobileOptimized) => state.isMobile && optimizations.length > 0,
|
|
367
|
-
getOptimizationLevel) => {
|
|
394
|
+
isMobileOptimized: () => state.isMobile && optimizations.length > 0,
|
|
395
|
+
getOptimizationLevel: () => {
|
|
368
396
|
const count = optimizations.length
|
|
369
397
|
if (count === 0) return 'none'
|
|
370
398
|
if (count < 3) return 'basic'
|
|
371
399
|
if (count < 6) return 'intermediate'
|
|
372
400
|
return 'advanced'
|
|
373
401
|
},
|
|
374
|
-
clearOptimizations) => setOptimizations([])
|
|
402
|
+
clearOptimizations: () => setOptimizations([])
|
|
375
403
|
}
|
|
376
404
|
}
|
|
377
405
|
|
|
@@ -1,22 +1,37 @@
|
|
|
1
1
|
import { useState, useCallback, useRef, useEffect } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface MobileOptimizationConfig {
|
|
4
|
-
enableTouchOptimization
|
|
4
|
+
enableTouchOptimization?: boolean
|
|
5
|
+
enablePerformanceOptimization?: boolean
|
|
6
|
+
enableBatteryOptimization?: boolean
|
|
7
|
+
enableAccessibilityOptimization?: boolean
|
|
8
|
+
enableResponsiveOptimization?: boolean
|
|
9
|
+
touchTargetSize?: number
|
|
10
|
+
performanceThreshold?: number
|
|
11
|
+
batteryThreshold?: number
|
|
12
|
+
}
|
|
5
13
|
|
|
6
14
|
export interface MobileOptimizationState {
|
|
7
|
-
isMobile
|
|
15
|
+
isMobile: boolean
|
|
16
|
+
isTouchDevice: boolean
|
|
17
|
+
screenSize: 'small' | 'medium' | 'large'
|
|
18
|
+
orientation: 'portrait' | 'landscape'
|
|
19
|
+
batteryLevel: number
|
|
20
|
+
performanceScore: number
|
|
21
|
+
accessibilityLevel: 'basic' | 'enhanced' | 'advanced'
|
|
22
|
+
}
|
|
8
23
|
|
|
9
24
|
export interface MobileOptimizationCallbacks {
|
|
10
|
-
onMobileOptimized
|
|
11
|
-
onTouchOptimized
|
|
12
|
-
onPerformanceOptimized
|
|
13
|
-
onBatteryOptimized
|
|
14
|
-
onAccessibilityEnhanced
|
|
25
|
+
onMobileOptimized?: (optimization: string) => void
|
|
26
|
+
onTouchOptimized?: (feature: string) => void
|
|
27
|
+
onPerformanceOptimized?: (improvement: string) => void
|
|
28
|
+
onBatteryOptimized?: (strategy: string) => void
|
|
29
|
+
onAccessibilityEnhanced?: (feature: string) => void
|
|
15
30
|
}
|
|
16
31
|
|
|
17
32
|
export const useMobileOptimization = (
|
|
18
|
-
config= {},
|
|
19
|
-
callbacks= {}
|
|
33
|
+
config: MobileOptimizationConfig = {},
|
|
34
|
+
callbacks: MobileOptimizationCallbacks = {}
|
|
20
35
|
) => {
|
|
21
36
|
const {
|
|
22
37
|
enableTouchOptimization = true,
|
|
@@ -29,13 +44,14 @@ export const useMobileOptimization = (
|
|
|
29
44
|
} = config
|
|
30
45
|
|
|
31
46
|
const [state, setState] = useState<MobileOptimizationState>({
|
|
32
|
-
isMobile,
|
|
33
|
-
isTouchDevice,
|
|
34
|
-
screenSize,
|
|
35
|
-
orientation,
|
|
36
|
-
batteryLevel,
|
|
37
|
-
performanceScore,
|
|
38
|
-
accessibilityLevel
|
|
47
|
+
isMobile: false,
|
|
48
|
+
isTouchDevice: false,
|
|
49
|
+
screenSize: 'medium',
|
|
50
|
+
orientation: 'portrait',
|
|
51
|
+
batteryLevel: 1,
|
|
52
|
+
performanceScore: 100,
|
|
53
|
+
accessibilityLevel: 'basic'
|
|
54
|
+
})
|
|
39
55
|
|
|
40
56
|
const [isOptimizing, setIsOptimizing] = useState(false)
|
|
41
57
|
const [optimizations, setOptimizations] = useState<string[]>([])
|
|
@@ -53,14 +69,17 @@ export const useMobileOptimization = (
|
|
|
53
69
|
|
|
54
70
|
setState(prev => ({
|
|
55
71
|
...prev,
|
|
56
|
-
isMobile,
|
|
57
|
-
isTouchDevice
|
|
72
|
+
isMobile: isMobileDevice,
|
|
73
|
+
isTouchDevice: isTouchDevice
|
|
74
|
+
}))
|
|
58
75
|
}, [])
|
|
59
76
|
|
|
60
77
|
// Screen size detection
|
|
61
78
|
const detectScreenSize = useCallback(() => {
|
|
62
79
|
const width = window.innerWidth
|
|
63
|
-
let screenSize
|
|
80
|
+
let screenSize: 'small' | 'medium' | 'large'
|
|
81
|
+
|
|
82
|
+
if (width < 768) {
|
|
64
83
|
screenSize = 'small'
|
|
65
84
|
} else if (width < 1024) {
|
|
66
85
|
screenSize = 'medium'
|
|
@@ -76,7 +95,9 @@ export const useMobileOptimization = (
|
|
|
76
95
|
|
|
77
96
|
// Orientation detection
|
|
78
97
|
const detectOrientation = useCallback(() => {
|
|
79
|
-
const orientation = window.innerWidth > window.innerHeight ? 'landscape'
|
|
98
|
+
const orientation = window.innerWidth > window.innerHeight ? 'landscape' : 'portrait'
|
|
99
|
+
|
|
100
|
+
setState(prev => ({
|
|
80
101
|
...prev,
|
|
81
102
|
orientation
|
|
82
103
|
}))
|
|
@@ -199,9 +220,9 @@ export const useMobileOptimization = (
|
|
|
199
220
|
|
|
200
221
|
// Touch target validation
|
|
201
222
|
const validateTouchTargets = useCallback(() => {
|
|
202
|
-
if (!enableTouchOptimization) return { isValid, issues] }
|
|
223
|
+
if (!enableTouchOptimization) return { isValid: true, issues: [] }
|
|
203
224
|
|
|
204
|
-
const issues] = []
|
|
225
|
+
const issues: string[] = []
|
|
205
226
|
const targets = Array.from(touchTargets.values())
|
|
206
227
|
|
|
207
228
|
targets.forEach((target, index) => {
|
|
@@ -209,35 +230,41 @@ export const useMobileOptimization = (
|
|
|
209
230
|
const minSize = Math.min(rect.width, rect.height)
|
|
210
231
|
|
|
211
232
|
if (minSize < touchTargetSize) {
|
|
212
|
-
issues.push(`Touch target ${index} is too small}px < ${touchTargetSize}px`)
|
|
233
|
+
issues.push(`Touch target ${index} is too small: ${minSize}px < ${touchTargetSize}px`)
|
|
213
234
|
}
|
|
214
235
|
})
|
|
215
236
|
|
|
216
237
|
return {
|
|
217
|
-
isValid=== 0,
|
|
238
|
+
isValid: issues.length === 0,
|
|
218
239
|
issues
|
|
219
240
|
}
|
|
220
241
|
}, [enableTouchOptimization, touchTargets, touchTargetSize])
|
|
221
242
|
|
|
222
243
|
// Mobile-specific component optimization
|
|
223
244
|
const optimizeComponentForMobile = useCallback((
|
|
224
|
-
componentId,
|
|
225
|
-
optimizationType
|
|
245
|
+
componentId: string,
|
|
246
|
+
optimizationType: 'touch' | 'performance' | 'battery' | 'accessibility' | 'responsive'
|
|
247
|
+
) => {
|
|
226
248
|
setIsOptimizing(true)
|
|
227
249
|
|
|
228
250
|
setTimeout(() => {
|
|
229
|
-
let optimizations] = []
|
|
251
|
+
let optimizations: string[] = []
|
|
230
252
|
|
|
231
253
|
switch (optimizationType) {
|
|
232
|
-
case 'touch'
|
|
254
|
+
case 'touch':
|
|
255
|
+
optimizations = [`Touch optimization applied to ${componentId}`]
|
|
233
256
|
break
|
|
234
|
-
case 'performance'
|
|
257
|
+
case 'performance':
|
|
258
|
+
optimizations = [`Performance optimization applied to ${componentId}`]
|
|
235
259
|
break
|
|
236
|
-
case 'battery'
|
|
260
|
+
case 'battery':
|
|
261
|
+
optimizations = [`Battery optimization applied to ${componentId}`]
|
|
237
262
|
break
|
|
238
|
-
case 'accessibility'
|
|
263
|
+
case 'accessibility':
|
|
264
|
+
optimizations = [`Accessibility optimization applied to ${componentId}`]
|
|
239
265
|
break
|
|
240
|
-
case 'responsive'
|
|
266
|
+
case 'responsive':
|
|
267
|
+
optimizations = [`Responsive optimization applied to ${componentId}`]
|
|
241
268
|
break
|
|
242
269
|
}
|
|
243
270
|
|
|
@@ -253,13 +280,13 @@ export const useMobileOptimization = (
|
|
|
253
280
|
// Mobile optimization analysis
|
|
254
281
|
const analyzeMobileOptimization = useCallback(() => {
|
|
255
282
|
const analysis = {
|
|
256
|
-
isMobileOptimized,
|
|
257
|
-
touchOptimized=> opt.includes('Touch')),
|
|
258
|
-
performanceOptimized=> opt.includes('Performance')),
|
|
259
|
-
batteryOptimized=> opt.includes('Battery')),
|
|
260
|
-
accessibilityOptimized=> opt.includes('Accessibility')),
|
|
261
|
-
responsiveOptimized=> opt.includes('Responsive')),
|
|
262
|
-
recommendations] as string[]
|
|
283
|
+
isMobileOptimized: state.isMobile && optimizations.length > 0,
|
|
284
|
+
touchOptimized: optimizations.some(opt => opt.includes('Touch')),
|
|
285
|
+
performanceOptimized: optimizations.some(opt => opt.includes('Performance')),
|
|
286
|
+
batteryOptimized: optimizations.some(opt => opt.includes('Battery')),
|
|
287
|
+
accessibilityOptimized: optimizations.some(opt => opt.includes('Accessibility')),
|
|
288
|
+
responsiveOptimized: optimizations.some(opt => opt.includes('Responsive')),
|
|
289
|
+
recommendations: [] as string[]
|
|
263
290
|
}
|
|
264
291
|
|
|
265
292
|
if (!analysis.touchOptimized && state.isTouchDevice) {
|
|
@@ -313,9 +340,10 @@ export const useMobileOptimization = (
|
|
|
313
340
|
const battery = await (navigator as any).getBattery()
|
|
314
341
|
setState(prev => ({
|
|
315
342
|
...prev,
|
|
316
|
-
batteryLevel
|
|
343
|
+
batteryLevel: battery.level
|
|
344
|
+
}))
|
|
317
345
|
} catch (error) {
|
|
318
|
-
console.warn('Battery monitoring failed, error)
|
|
346
|
+
console.warn('Battery monitoring failed:', error)
|
|
319
347
|
}
|
|
320
348
|
}, 10000)
|
|
321
349
|
}
|
|
@@ -363,15 +391,15 @@ export const useMobileOptimization = (
|
|
|
363
391
|
analyzeMobileOptimization,
|
|
364
392
|
|
|
365
393
|
// Utility functions
|
|
366
|
-
isMobileOptimized) => state.isMobile && optimizations.length > 0,
|
|
367
|
-
getOptimizationLevel) => {
|
|
394
|
+
isMobileOptimized: () => state.isMobile && optimizations.length > 0,
|
|
395
|
+
getOptimizationLevel: () => {
|
|
368
396
|
const count = optimizations.length
|
|
369
397
|
if (count === 0) return 'none'
|
|
370
398
|
if (count < 3) return 'basic'
|
|
371
399
|
if (count < 6) return 'intermediate'
|
|
372
400
|
return 'advanced'
|
|
373
401
|
},
|
|
374
|
-
clearOptimizations) => setOptimizations([])
|
|
402
|
+
clearOptimizations: () => setOptimizations([])
|
|
375
403
|
}
|
|
376
404
|
}
|
|
377
405
|
|