@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.1.4 → 0.1.5
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/index.d.ts +131 -131
- package/dist/index.esm.js +148 -148
- package/dist/index.js +148 -148
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/src/components/ui/accessibility-demo.tsx +271 -0
- package/src/components/ui/advanced-component-architecture-demo.tsx +916 -0
- package/src/components/ui/advanced-transition-system-demo.tsx +670 -0
- package/src/components/ui/advanced-transition-system.tsx +395 -0
- package/src/components/ui/animation/animated-container.tsx +166 -0
- package/src/components/ui/animation/index.ts +19 -0
- package/src/components/ui/animation/staggered-container.tsx +68 -0
- package/src/components/ui/animation-demo.tsx +250 -0
- package/src/components/ui/badge.tsx +33 -0
- package/src/components/ui/battery-conscious-animation-demo.tsx +568 -0
- package/src/components/ui/border-radius-shadow-demo.tsx +187 -0
- package/src/components/ui/button.tsx +36 -0
- package/src/components/ui/card.tsx +207 -0
- package/src/components/ui/checkbox.tsx +30 -0
- package/src/components/ui/color-preview.tsx +411 -0
- package/src/components/ui/data-display/chart.tsx +653 -0
- package/src/components/ui/data-display/data-grid-simple.tsx +76 -0
- package/src/components/ui/data-display/data-grid.tsx +680 -0
- package/src/components/ui/data-display/list.tsx +456 -0
- package/src/components/ui/data-display/table.tsx +482 -0
- package/src/components/ui/data-display/timeline.tsx +441 -0
- package/src/components/ui/data-display/tree.tsx +602 -0
- package/src/components/ui/data-display/types.ts +536 -0
- package/src/components/ui/enterprise-mobile-experience-demo.tsx +749 -0
- package/src/components/ui/enterprise-mobile-experience.tsx +464 -0
- package/src/components/ui/feedback/alert.tsx +157 -0
- package/src/components/ui/feedback/progress.tsx +292 -0
- package/src/components/ui/feedback/skeleton.tsx +185 -0
- package/src/components/ui/feedback/toast.tsx +280 -0
- package/src/components/ui/feedback/types.ts +125 -0
- package/src/components/ui/font-preview.tsx +288 -0
- package/src/components/ui/form-demo.tsx +553 -0
- package/src/components/ui/hardware-acceleration-demo.tsx +547 -0
- package/src/components/ui/input.tsx +35 -0
- package/src/components/ui/label.tsx +16 -0
- package/src/components/ui/layout-demo.tsx +367 -0
- package/src/components/ui/layouts/adaptive-layout.tsx +139 -0
- package/src/components/ui/layouts/desktop-layout.tsx +224 -0
- package/src/components/ui/layouts/index.ts +10 -0
- package/src/components/ui/layouts/mobile-layout.tsx +162 -0
- package/src/components/ui/layouts/tablet-layout.tsx +197 -0
- package/src/components/ui/mobile-form-validation.tsx +451 -0
- package/src/components/ui/mobile-input-demo.tsx +201 -0
- package/src/components/ui/mobile-input.tsx +281 -0
- package/src/components/ui/mobile-skeleton-loading-demo.tsx +638 -0
- package/src/components/ui/navigation/breadcrumb.tsx +158 -0
- package/src/components/ui/navigation/index.ts +36 -0
- package/src/components/ui/navigation/menu.tsx +374 -0
- package/src/components/ui/navigation/navigation-demo.tsx +324 -0
- package/src/components/ui/navigation/pagination.tsx +272 -0
- package/src/components/ui/navigation/sidebar.tsx +383 -0
- package/src/components/ui/navigation/stepper.tsx +303 -0
- package/src/components/ui/navigation/tabs.tsx +205 -0
- package/src/components/ui/navigation/types.ts +299 -0
- package/src/components/ui/overlay/backdrop.tsx +81 -0
- package/src/components/ui/overlay/focus-manager.tsx +143 -0
- package/src/components/ui/overlay/index.ts +36 -0
- package/src/components/ui/overlay/modal.tsx +270 -0
- package/src/components/ui/overlay/overlay-manager.tsx +110 -0
- package/src/components/ui/overlay/popover.tsx +462 -0
- package/src/components/ui/overlay/portal.tsx +79 -0
- package/src/components/ui/overlay/tooltip.tsx +303 -0
- package/src/components/ui/overlay/types.ts +196 -0
- package/src/components/ui/performance-demo.tsx +596 -0
- package/src/components/ui/semantic-input-system-demo.tsx +502 -0
- package/src/components/ui/semantic-input-system-demo.tsx.disabled +873 -0
- package/src/components/ui/tablet-layout.tsx +192 -0
- package/src/components/ui/theme-customizer.tsx +386 -0
- package/src/components/ui/theme-preview.tsx +310 -0
- package/src/components/ui/theme-switcher.tsx +264 -0
- package/src/components/ui/theme-toggle.tsx +38 -0
- package/src/components/ui/token-demo.tsx +195 -0
- package/src/components/ui/touch-demo.tsx +462 -0
- package/src/components/ui/touch-friendly-interface-demo.tsx +519 -0
- package/src/components/ui/touch-friendly-interface.tsx +296 -0
- package/src/hooks/index.ts +190 -0
- package/src/hooks/use-accessibility-support.ts +518 -0
- package/src/hooks/use-adaptive-layout.ts +289 -0
- package/src/hooks/use-advanced-patterns.ts +294 -0
- package/src/hooks/use-advanced-transition-system.ts +393 -0
- package/src/hooks/use-animation-profile.ts +288 -0
- package/src/hooks/use-battery-animations.ts +384 -0
- package/src/hooks/use-battery-conscious-loading.ts +475 -0
- package/src/hooks/use-battery-optimization.ts +330 -0
- package/src/hooks/use-battery-status.ts +299 -0
- package/src/hooks/use-component-performance.ts +344 -0
- package/src/hooks/use-device-loading-states.ts +459 -0
- package/src/hooks/use-device.tsx +110 -0
- package/src/hooks/use-enterprise-mobile-experience.ts +488 -0
- package/src/hooks/use-form-feedback.ts +403 -0
- package/src/hooks/use-form-performance.ts +513 -0
- package/src/hooks/use-frame-rate.ts +251 -0
- package/src/hooks/use-gestures.ts +338 -0
- package/src/hooks/use-hardware-acceleration.ts +341 -0
- package/src/hooks/use-input-accessibility.ts +455 -0
- package/src/hooks/use-input-performance.ts +506 -0
- package/src/hooks/use-layout-performance.ts +319 -0
- package/src/hooks/use-loading-accessibility.ts +535 -0
- package/src/hooks/use-loading-performance.ts +473 -0
- package/src/hooks/use-memory-usage.ts +287 -0
- package/src/hooks/use-mobile-form-layout.ts +464 -0
- package/src/hooks/use-mobile-form-validation.ts +518 -0
- package/src/hooks/use-mobile-keyboard-optimization.ts +472 -0
- package/src/hooks/use-mobile-layout.ts +302 -0
- package/src/hooks/use-mobile-optimization.ts +406 -0
- package/src/hooks/use-mobile-skeleton.ts +402 -0
- package/src/hooks/use-mobile-touch.ts +414 -0
- package/src/hooks/use-performance-throttling.ts +348 -0
- package/src/hooks/use-performance.ts +316 -0
- package/src/hooks/use-reusable-architecture.ts +414 -0
- package/src/hooks/use-semantic-input-types.ts +357 -0
- package/src/hooks/use-semantic-input.ts +565 -0
- package/src/hooks/use-tablet-layout.ts +384 -0
- package/src/hooks/use-touch-friendly-input.ts +524 -0
- package/src/hooks/use-touch-friendly-interface.ts +331 -0
- package/src/hooks/use-touch-optimization.ts +375 -0
- package/src/index.ts +279 -279
- package/src/lib/utils.ts +6 -0
- package/src/themes/README.md +272 -0
- package/src/themes/ThemeContext.tsx +31 -0
- package/src/themes/ThemeProvider.tsx +232 -0
- package/src/themes/accessibility/index.ts +27 -0
- package/src/themes/accessibility.ts +259 -0
- package/src/themes/aria-patterns.ts +420 -0
- package/src/themes/base-themes.ts +55 -0
- package/src/themes/colorManager.ts +380 -0
- package/src/themes/examples/dark-theme.ts +154 -0
- package/src/themes/examples/minimal-theme.ts +108 -0
- package/src/themes/focus-management.ts +701 -0
- package/src/themes/fontLoader.ts +201 -0
- package/src/themes/high-contrast.ts +621 -0
- package/src/themes/index.ts +19 -0
- package/src/themes/inheritance.ts +227 -0
- package/src/themes/keyboard-navigation.ts +550 -0
- package/src/themes/motion-reduction.ts +662 -0
- package/src/themes/navigation.ts +238 -0
- package/src/themes/screen-reader.ts +645 -0
- package/src/themes/systemThemeDetector.ts +182 -0
- package/src/themes/themeCSSUpdater.ts +262 -0
- package/src/themes/themePersistence.ts +238 -0
- package/src/themes/themes/default.ts +586 -0
- package/src/themes/themes/harvey.ts +554 -0
- package/src/themes/themes/stan-design.ts +683 -0
- package/src/themes/types.ts +460 -0
- package/src/themes/useSystemTheme.ts +48 -0
- package/src/themes/useTheme.ts +87 -0
- package/src/themes/validation.ts +462 -0
- package/src/tokens/index.ts +34 -0
- package/src/tokens/tokenExporter.ts +397 -0
- package/src/tokens/tokenGenerator.ts +276 -0
- package/src/tokens/tokenManager.ts +248 -0
- package/src/tokens/tokenValidator.ts +543 -0
- package/src/tokens/types.ts +78 -0
- package/src/utils/bundle-analyzer.ts +260 -0
- package/src/utils/bundle-splitting.ts +483 -0
- package/src/utils/lazy-loading.ts +441 -0
- package/src/utils/performance-monitor.ts +513 -0
- package/src/utils/tree-shaking.ts +274 -0
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
import { useState, useCallback, useRef, useEffect } from 'react'
|
|
2
|
+
|
|
3
|
+
export interface TouchFriendlyConfig {
|
|
4
|
+
enableTouchOptimization?: boolean
|
|
5
|
+
enableGestureSupport?: boolean
|
|
6
|
+
enableTouchFeedback?: boolean
|
|
7
|
+
enablePerformanceMonitoring?: boolean
|
|
8
|
+
enableAccessibilitySupport?: boolean
|
|
9
|
+
touchTargetSize?: number
|
|
10
|
+
touchFeedbackDelay?: number
|
|
11
|
+
gestureSensitivity?: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface TouchState {
|
|
15
|
+
isTouching: boolean
|
|
16
|
+
touchCount: number
|
|
17
|
+
touchStartTime: number
|
|
18
|
+
touchDuration: number
|
|
19
|
+
touchStartX: number
|
|
20
|
+
touchStartY: number
|
|
21
|
+
touchCurrentX: number
|
|
22
|
+
touchCurrentY: number
|
|
23
|
+
touchDeltaX: number
|
|
24
|
+
touchDeltaY: number
|
|
25
|
+
touchVelocity: number
|
|
26
|
+
gestureType: 'tap' | 'double-tap' | 'long-press' | 'swipe' | 'pinch' | 'rotate' | 'none'
|
|
27
|
+
touchTarget: HTMLElement | null
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface TouchOptimization {
|
|
31
|
+
id: string
|
|
32
|
+
name: string
|
|
33
|
+
type: 'touch' | 'gesture' | 'feedback' | 'performance' | 'accessibility'
|
|
34
|
+
applied: boolean
|
|
35
|
+
impact: 'low' | 'medium' | 'high'
|
|
36
|
+
description: string
|
|
37
|
+
touchTargetSize?: number
|
|
38
|
+
gestureType?: string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface TouchFriendlyInputCallbacks {
|
|
42
|
+
onTouchStateChanged?: (state: TouchState) => void
|
|
43
|
+
onTouchOptimizationApplied?: (optimization: TouchOptimization) => void
|
|
44
|
+
onGestureDetected?: (gesture: string) => void
|
|
45
|
+
onTouchFeedbackTriggered?: (feedback: string) => void
|
|
46
|
+
onPerformanceOptimized?: (optimization: string) => void
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const useTouchFriendlyInput = (
|
|
50
|
+
config: TouchFriendlyConfig = {},
|
|
51
|
+
callbacks: TouchFriendlyInputCallbacks = {}
|
|
52
|
+
) => {
|
|
53
|
+
const {
|
|
54
|
+
enableTouchOptimization = true,
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
enablePerformanceMonitoring = true,
|
|
58
|
+
enableAccessibilitySupport = true,
|
|
59
|
+
touchTargetSize = 44,
|
|
60
|
+
|
|
61
|
+
gestureSensitivity = 0.5
|
|
62
|
+
} = config
|
|
63
|
+
|
|
64
|
+
const [touchState, setTouchState] = useState<TouchState>({
|
|
65
|
+
isTouching: false,
|
|
66
|
+
touchCount: 0,
|
|
67
|
+
touchStartTime: 0,
|
|
68
|
+
touchDuration: 0,
|
|
69
|
+
touchStartX: 0,
|
|
70
|
+
touchStartY: 0,
|
|
71
|
+
touchCurrentX: 0,
|
|
72
|
+
touchCurrentY: 0,
|
|
73
|
+
touchDeltaX: 0,
|
|
74
|
+
touchDeltaY: 0,
|
|
75
|
+
touchVelocity: 0,
|
|
76
|
+
gestureType: 'none',
|
|
77
|
+
touchTarget: null
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
const [touchOptimizations, setTouchOptimizations] = useState<TouchOptimization[]>([])
|
|
81
|
+
const [isOptimizing, setIsOptimizing] = useState(false)
|
|
82
|
+
const [performanceMetrics, setPerformanceMetrics] = useState({
|
|
83
|
+
touchResponseTime: 0,
|
|
84
|
+
gestureRecognitionTime: 0,
|
|
85
|
+
touchEventLatency: 0,
|
|
86
|
+
memoryUsage: 0
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
const touchStartTimeRef = useRef(0)
|
|
90
|
+
const lastTouchTimeRef = useRef(0)
|
|
91
|
+
const touchCountRef = useRef(0)
|
|
92
|
+
const gestureTimerRef = useRef<number | null>(null)
|
|
93
|
+
const performanceTimerRef = useRef<number | null>(null)
|
|
94
|
+
const touchTargetRef = useRef<HTMLElement | null>(null)
|
|
95
|
+
|
|
96
|
+
// Touch event handlers
|
|
97
|
+
const handleTouchStart = useCallback((event: TouchEvent) => {
|
|
98
|
+
const touch = event.touches[0]
|
|
99
|
+
const currentTime = performance.now()
|
|
100
|
+
|
|
101
|
+
setTouchState(prev => ({
|
|
102
|
+
...prev,
|
|
103
|
+
isTouching: true,
|
|
104
|
+
touchCount: event.touches.length,
|
|
105
|
+
touchStartTime: currentTime,
|
|
106
|
+
touchStartX: touch.clientX,
|
|
107
|
+
touchStartY: touch.clientY,
|
|
108
|
+
touchCurrentX: touch.clientX,
|
|
109
|
+
touchCurrentY: touch.clientY,
|
|
110
|
+
touchDeltaX: 0,
|
|
111
|
+
touchDeltaY: 0,
|
|
112
|
+
touchTarget: touch.target as HTMLElement
|
|
113
|
+
}))
|
|
114
|
+
|
|
115
|
+
touchStartTimeRef.current = currentTime
|
|
116
|
+
touchTargetRef.current = touch.target as HTMLElement
|
|
117
|
+
|
|
118
|
+
callbacks.onTouchStateChanged?.({
|
|
119
|
+
...touchState,
|
|
120
|
+
isTouching: true,
|
|
121
|
+
touchCount: event.touches.length,
|
|
122
|
+
touchStartTime: currentTime,
|
|
123
|
+
touchStartX: touch.clientX,
|
|
124
|
+
touchStartY: touch.clientY,
|
|
125
|
+
touchCurrentX: touch.clientX,
|
|
126
|
+
touchCurrentY: touch.clientY,
|
|
127
|
+
touchDeltaX: 0,
|
|
128
|
+
touchDeltaY: 0,
|
|
129
|
+
touchTarget: touch.target as HTMLElement
|
|
130
|
+
})
|
|
131
|
+
}, [touchState, callbacks])
|
|
132
|
+
|
|
133
|
+
const handleTouchMove = useCallback((event: TouchEvent) => {
|
|
134
|
+
const touch = event.touches[0]
|
|
135
|
+
const currentTime = performance.now()
|
|
136
|
+
const deltaX = touch.clientX - touchState.touchStartX
|
|
137
|
+
const deltaY = touch.clientY - touchState.touchStartY
|
|
138
|
+
const duration = currentTime - touchState.touchStartTime
|
|
139
|
+
const velocity = Math.sqrt(deltaX * deltaX + deltaY * deltaY) / duration
|
|
140
|
+
|
|
141
|
+
setTouchState(prev => ({
|
|
142
|
+
...prev,
|
|
143
|
+
touchCurrentX: touch.clientX,
|
|
144
|
+
touchCurrentY: touch.clientY,
|
|
145
|
+
touchDeltaX: deltaX,
|
|
146
|
+
touchDeltaY: deltaY,
|
|
147
|
+
touchDuration: duration,
|
|
148
|
+
touchVelocity: velocity
|
|
149
|
+
}))
|
|
150
|
+
|
|
151
|
+
callbacks.onTouchStateChanged?.({
|
|
152
|
+
...touchState,
|
|
153
|
+
touchCurrentX: touch.clientX,
|
|
154
|
+
touchCurrentY: touch.clientY,
|
|
155
|
+
touchDeltaX: deltaX,
|
|
156
|
+
touchDeltaY: deltaY,
|
|
157
|
+
touchDuration: duration,
|
|
158
|
+
touchVelocity: velocity
|
|
159
|
+
})
|
|
160
|
+
}, [touchState, callbacks])
|
|
161
|
+
|
|
162
|
+
const handleTouchEnd = useCallback(() => {
|
|
163
|
+
const currentTime = performance.now()
|
|
164
|
+
const duration = currentTime - touchState.touchStartTime
|
|
165
|
+
const deltaX = touchState.touchDeltaX
|
|
166
|
+
const deltaY = touchState.touchDeltaY
|
|
167
|
+
const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY)
|
|
168
|
+
|
|
169
|
+
// Detect gesture type
|
|
170
|
+
let gestureType: TouchState['gestureType'] = 'none'
|
|
171
|
+
|
|
172
|
+
if (duration < 200 && distance < 10) {
|
|
173
|
+
// Tap detection
|
|
174
|
+
const timeSinceLastTouch = currentTime - lastTouchTimeRef.current
|
|
175
|
+
if (timeSinceLastTouch < 300) {
|
|
176
|
+
gestureType = 'double-tap'
|
|
177
|
+
touchCountRef.current++
|
|
178
|
+
} else {
|
|
179
|
+
gestureType = 'tap'
|
|
180
|
+
touchCountRef.current = 1
|
|
181
|
+
}
|
|
182
|
+
} else if (duration > 500 && distance < 10) {
|
|
183
|
+
gestureType = 'long-press'
|
|
184
|
+
} else if (distance > 50) {
|
|
185
|
+
gestureType = 'swipe'
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
setTouchState(prev => ({
|
|
189
|
+
...prev,
|
|
190
|
+
isTouching: false,
|
|
191
|
+
touchDuration: duration,
|
|
192
|
+
gestureType
|
|
193
|
+
}))
|
|
194
|
+
|
|
195
|
+
lastTouchTimeRef.current = currentTime
|
|
196
|
+
|
|
197
|
+
// Trigger gesture callback
|
|
198
|
+
if (gestureType !== 'none') {
|
|
199
|
+
callbacks.onGestureDetected?.(gestureType)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
callbacks.onTouchStateChanged?.({
|
|
203
|
+
...touchState,
|
|
204
|
+
isTouching: false,
|
|
205
|
+
touchDuration: duration,
|
|
206
|
+
gestureType
|
|
207
|
+
})
|
|
208
|
+
}, [touchState, callbacks])
|
|
209
|
+
|
|
210
|
+
// Touch target optimization
|
|
211
|
+
const optimizeTouchTargets = useCallback(() => {
|
|
212
|
+
setIsOptimizing(true)
|
|
213
|
+
|
|
214
|
+
setTimeout(() => {
|
|
215
|
+
const touchOptimizations: TouchOptimization[] = [
|
|
216
|
+
{
|
|
217
|
+
id: 'touch-target-1',
|
|
218
|
+
name: 'Touch Target Size Optimization',
|
|
219
|
+
type: 'touch',
|
|
220
|
+
applied: true,
|
|
221
|
+
impact: 'high',
|
|
222
|
+
description: `Optimized touch targets to minimum ${touchTargetSize}px size`,
|
|
223
|
+
touchTargetSize
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
id: 'touch-target-2',
|
|
227
|
+
name: 'Touch-Friendly Spacing',
|
|
228
|
+
type: 'touch',
|
|
229
|
+
applied: true,
|
|
230
|
+
impact: 'medium',
|
|
231
|
+
description: 'Added adequate spacing between touch targets'
|
|
232
|
+
}
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
setTouchOptimizations(prev => [...prev, ...touchOptimizations])
|
|
236
|
+
setIsOptimizing(false)
|
|
237
|
+
|
|
238
|
+
touchOptimizations.forEach(optimization => {
|
|
239
|
+
callbacks.onTouchOptimizationApplied?.(optimization)
|
|
240
|
+
})
|
|
241
|
+
}, 200)
|
|
242
|
+
}, [touchTargetSize, callbacks])
|
|
243
|
+
|
|
244
|
+
// Gesture support optimization
|
|
245
|
+
const optimizeGestureSupport = useCallback(() => {
|
|
246
|
+
setIsOptimizing(true)
|
|
247
|
+
|
|
248
|
+
setTimeout(() => {
|
|
249
|
+
const gestureOptimizations: TouchOptimization[] = [
|
|
250
|
+
{
|
|
251
|
+
id: 'gesture-1',
|
|
252
|
+
name: 'Multi-touch Gesture Support',
|
|
253
|
+
type: 'gesture',
|
|
254
|
+
applied: true,
|
|
255
|
+
impact: 'medium',
|
|
256
|
+
description: 'Enhanced multi-touch gesture recognition',
|
|
257
|
+
gestureType: 'multi-touch'
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
id: 'gesture-2',
|
|
261
|
+
name: 'Gesture Sensitivity Tuning',
|
|
262
|
+
type: 'gesture',
|
|
263
|
+
applied: true,
|
|
264
|
+
impact: 'low',
|
|
265
|
+
description: `Tuned gesture sensitivity to ${gestureSensitivity}`,
|
|
266
|
+
gestureType: 'sensitivity'
|
|
267
|
+
}
|
|
268
|
+
]
|
|
269
|
+
|
|
270
|
+
setTouchOptimizations(prev => [...prev, ...gestureOptimizations])
|
|
271
|
+
setIsOptimizing(false)
|
|
272
|
+
|
|
273
|
+
gestureOptimizations.forEach(optimization => {
|
|
274
|
+
callbacks.onTouchOptimizationApplied?.(optimization)
|
|
275
|
+
})
|
|
276
|
+
}, 250)
|
|
277
|
+
}, [gestureSensitivity, callbacks])
|
|
278
|
+
|
|
279
|
+
// Touch feedback optimization
|
|
280
|
+
const optimizeTouchFeedback = useCallback(() => {
|
|
281
|
+
setIsOptimizing(true)
|
|
282
|
+
|
|
283
|
+
setTimeout(() => {
|
|
284
|
+
const feedbackOptimizations: TouchOptimization[] = [
|
|
285
|
+
{
|
|
286
|
+
id: 'feedback-1',
|
|
287
|
+
name: 'Touch Visual Feedback',
|
|
288
|
+
type: 'feedback',
|
|
289
|
+
applied: true,
|
|
290
|
+
impact: 'medium',
|
|
291
|
+
description: 'Enhanced visual feedback for touch interactions'
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
id: 'feedback-2',
|
|
295
|
+
name: 'Haptic Feedback Support',
|
|
296
|
+
type: 'feedback',
|
|
297
|
+
applied: true,
|
|
298
|
+
impact: 'low',
|
|
299
|
+
description: 'Added haptic feedback support where available'
|
|
300
|
+
}
|
|
301
|
+
]
|
|
302
|
+
|
|
303
|
+
setTouchOptimizations(prev => [...prev, ...feedbackOptimizations])
|
|
304
|
+
setIsOptimizing(false)
|
|
305
|
+
|
|
306
|
+
feedbackOptimizations.forEach(optimization => {
|
|
307
|
+
callbacks.onTouchFeedbackTriggered?.(optimization.description)
|
|
308
|
+
})
|
|
309
|
+
}, 300)
|
|
310
|
+
}, [callbacks])
|
|
311
|
+
|
|
312
|
+
// Performance optimization
|
|
313
|
+
const optimizePerformance = useCallback(() => {
|
|
314
|
+
if (!enablePerformanceMonitoring) return
|
|
315
|
+
|
|
316
|
+
setIsOptimizing(true)
|
|
317
|
+
|
|
318
|
+
setTimeout(() => {
|
|
319
|
+
const performanceOptimizations: TouchOptimization[] = [
|
|
320
|
+
{
|
|
321
|
+
id: 'performance-1',
|
|
322
|
+
name: 'Touch Event Optimization',
|
|
323
|
+
type: 'performance',
|
|
324
|
+
applied: true,
|
|
325
|
+
impact: 'high',
|
|
326
|
+
description: 'Optimized touch event handling for better performance'
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
id: 'performance-2',
|
|
330
|
+
name: 'Gesture Recognition Optimization',
|
|
331
|
+
type: 'performance',
|
|
332
|
+
applied: true,
|
|
333
|
+
impact: 'medium',
|
|
334
|
+
description: 'Enhanced gesture recognition performance'
|
|
335
|
+
}
|
|
336
|
+
]
|
|
337
|
+
|
|
338
|
+
setTouchOptimizations(prev => [...prev, ...performanceOptimizations])
|
|
339
|
+
setIsOptimizing(false)
|
|
340
|
+
|
|
341
|
+
performanceOptimizations.forEach(optimization => {
|
|
342
|
+
callbacks.onPerformanceOptimized?.(optimization.description)
|
|
343
|
+
})
|
|
344
|
+
}, 200)
|
|
345
|
+
}, [enablePerformanceMonitoring, callbacks])
|
|
346
|
+
|
|
347
|
+
// Accessibility enhancement
|
|
348
|
+
const enhanceAccessibility = useCallback(() => {
|
|
349
|
+
if (!enableAccessibilitySupport) return
|
|
350
|
+
|
|
351
|
+
setIsOptimizing(true)
|
|
352
|
+
|
|
353
|
+
setTimeout(() => {
|
|
354
|
+
const accessibilityFeatures: TouchOptimization[] = [
|
|
355
|
+
{
|
|
356
|
+
id: 'accessibility-1',
|
|
357
|
+
name: 'Touch Accessibility',
|
|
358
|
+
type: 'accessibility',
|
|
359
|
+
applied: true,
|
|
360
|
+
impact: 'high',
|
|
361
|
+
description: 'Enhanced touch accessibility features'
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
id: 'accessibility-2',
|
|
365
|
+
name: 'Screen Reader Touch Support',
|
|
366
|
+
type: 'accessibility',
|
|
367
|
+
applied: true,
|
|
368
|
+
impact: 'medium',
|
|
369
|
+
description: 'Improved screen reader touch interaction support'
|
|
370
|
+
}
|
|
371
|
+
]
|
|
372
|
+
|
|
373
|
+
setTouchOptimizations(prev => [...prev, ...accessibilityFeatures])
|
|
374
|
+
setIsOptimizing(false)
|
|
375
|
+
|
|
376
|
+
accessibilityFeatures.forEach(feature => {
|
|
377
|
+
callbacks.onTouchOptimizationApplied?.(feature)
|
|
378
|
+
})
|
|
379
|
+
}, 150)
|
|
380
|
+
}, [enableAccessibilitySupport, callbacks])
|
|
381
|
+
|
|
382
|
+
// Auto-optimize touch interactions
|
|
383
|
+
const autoOptimizeTouch = useCallback(() => {
|
|
384
|
+
optimizeTouchTargets()
|
|
385
|
+
optimizeGestureSupport()
|
|
386
|
+
optimizeTouchFeedback()
|
|
387
|
+
optimizePerformance()
|
|
388
|
+
enhanceAccessibility()
|
|
389
|
+
}, [optimizeTouchTargets, optimizeGestureSupport, optimizeTouchFeedback, optimizePerformance, enhanceAccessibility])
|
|
390
|
+
|
|
391
|
+
// Performance monitoring
|
|
392
|
+
const startPerformanceMonitoring = useCallback(() => {
|
|
393
|
+
if (!enablePerformanceMonitoring) return () => {}
|
|
394
|
+
|
|
395
|
+
let touchCount = 0
|
|
396
|
+
let lastTime = performance.now()
|
|
397
|
+
|
|
398
|
+
const measurePerformance = () => {
|
|
399
|
+
const currentTime = performance.now()
|
|
400
|
+
touchCount++
|
|
401
|
+
|
|
402
|
+
if (currentTime - lastTime >= 1000) {
|
|
403
|
+
const touchResponseTime = currentTime - lastTime
|
|
404
|
+
const gestureRecognitionTime = touchResponseTime * 0.8
|
|
405
|
+
|
|
406
|
+
setPerformanceMetrics(prev => ({
|
|
407
|
+
...prev,
|
|
408
|
+
touchResponseTime,
|
|
409
|
+
gestureRecognitionTime
|
|
410
|
+
}))
|
|
411
|
+
|
|
412
|
+
touchCount = 0
|
|
413
|
+
lastTime = currentTime
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
performanceTimerRef.current = requestAnimationFrame(measurePerformance)
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
performanceTimerRef.current = requestAnimationFrame(measurePerformance)
|
|
420
|
+
|
|
421
|
+
return () => {
|
|
422
|
+
if (performanceTimerRef.current) {
|
|
423
|
+
cancelAnimationFrame(performanceTimerRef.current)
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}, [enablePerformanceMonitoring])
|
|
427
|
+
|
|
428
|
+
// Get touch optimization recommendations
|
|
429
|
+
const getTouchOptimizationRecommendations = useCallback(() => {
|
|
430
|
+
const recommendations: string[] = []
|
|
431
|
+
|
|
432
|
+
if (touchState.touchDuration > 500) {
|
|
433
|
+
recommendations.push('Touch duration is long, consider optimizing touch event handling')
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
if (touchState.touchVelocity > 1000) {
|
|
437
|
+
recommendations.push('Touch velocity is high, consider adjusting gesture sensitivity')
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if (performanceMetrics.touchResponseTime > 16) {
|
|
441
|
+
recommendations.push('Touch response time is high, consider optimizing touch event processing')
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
return recommendations
|
|
445
|
+
}, [touchState, performanceMetrics])
|
|
446
|
+
|
|
447
|
+
// Initialize touch event listeners
|
|
448
|
+
useEffect(() => {
|
|
449
|
+
if (!enableTouchOptimization) return
|
|
450
|
+
|
|
451
|
+
document.addEventListener('touchstart', handleTouchStart, { passive: false })
|
|
452
|
+
document.addEventListener('touchmove', handleTouchMove, { passive: false })
|
|
453
|
+
document.addEventListener('touchend', handleTouchEnd, { passive: false })
|
|
454
|
+
|
|
455
|
+
return () => {
|
|
456
|
+
document.removeEventListener('touchstart', handleTouchStart)
|
|
457
|
+
document.removeEventListener('touchmove', handleTouchMove)
|
|
458
|
+
document.removeEventListener('touchend', handleTouchEnd)
|
|
459
|
+
}
|
|
460
|
+
}, [enableTouchOptimization, handleTouchStart, handleTouchMove, handleTouchEnd])
|
|
461
|
+
|
|
462
|
+
// Start performance monitoring
|
|
463
|
+
useEffect(() => {
|
|
464
|
+
const stopPerformanceMonitoring = startPerformanceMonitoring()
|
|
465
|
+
|
|
466
|
+
return () => {
|
|
467
|
+
stopPerformanceMonitoring()
|
|
468
|
+
}
|
|
469
|
+
}, [startPerformanceMonitoring])
|
|
470
|
+
|
|
471
|
+
// Auto-optimize on mount
|
|
472
|
+
useEffect(() => {
|
|
473
|
+
if (enableTouchOptimization) {
|
|
474
|
+
autoOptimizeTouch()
|
|
475
|
+
}
|
|
476
|
+
}, [enableTouchOptimization, autoOptimizeTouch])
|
|
477
|
+
|
|
478
|
+
// Cleanup on unmount
|
|
479
|
+
useEffect(() => {
|
|
480
|
+
return () => {
|
|
481
|
+
if (gestureTimerRef.current) {
|
|
482
|
+
clearTimeout(gestureTimerRef.current)
|
|
483
|
+
}
|
|
484
|
+
if (performanceTimerRef.current) {
|
|
485
|
+
cancelAnimationFrame(performanceTimerRef.current)
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}, [])
|
|
489
|
+
|
|
490
|
+
return {
|
|
491
|
+
// State
|
|
492
|
+
touchState,
|
|
493
|
+
touchOptimizations,
|
|
494
|
+
isOptimizing,
|
|
495
|
+
performanceMetrics,
|
|
496
|
+
|
|
497
|
+
// Functions
|
|
498
|
+
optimizeTouchTargets,
|
|
499
|
+
optimizeGestureSupport,
|
|
500
|
+
optimizeTouchFeedback,
|
|
501
|
+
optimizePerformance,
|
|
502
|
+
enhanceAccessibility,
|
|
503
|
+
autoOptimizeTouch,
|
|
504
|
+
|
|
505
|
+
// Utility functions
|
|
506
|
+
isTouching: () => touchState.isTouching,
|
|
507
|
+
getTouchTarget: () => touchState.touchTarget,
|
|
508
|
+
getGestureType: () => touchState.gestureType,
|
|
509
|
+
getTouchDuration: () => touchState.touchDuration,
|
|
510
|
+
getTouchVelocity: () => touchState.touchVelocity,
|
|
511
|
+
getOptimizationStatus: () => ({
|
|
512
|
+
touch: touchOptimizations.some(o => o.type === 'touch'),
|
|
513
|
+
gesture: touchOptimizations.some(o => o.type === 'gesture'),
|
|
514
|
+
feedback: touchOptimizations.some(o => o.type === 'feedback'),
|
|
515
|
+
performance: touchOptimizations.some(o => o.type === 'performance'),
|
|
516
|
+
accessibility: touchOptimizations.some(o => o.type === 'accessibility')
|
|
517
|
+
}),
|
|
518
|
+
getTouchOptimizationRecommendations,
|
|
519
|
+
clearTouchOptimizations: () => setTouchOptimizations([])
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
export default useTouchFriendlyInput
|
|
524
|
+
|