@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.1.4 → 0.1.6
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,472 @@
|
|
|
1
|
+
import { useState, useCallback, useRef, useEffect } from 'react'
|
|
2
|
+
|
|
3
|
+
export interface KeyboardOptimizationConfig {
|
|
4
|
+
enableKeyboardDetection?: boolean
|
|
5
|
+
enableAutoOptimization?: boolean
|
|
6
|
+
enablePerformanceMonitoring?: boolean
|
|
7
|
+
enableBatteryOptimization?: boolean
|
|
8
|
+
enableAccessibilitySupport?: boolean
|
|
9
|
+
keyboardDetectionInterval?: number
|
|
10
|
+
performanceThreshold?: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface KeyboardState {
|
|
14
|
+
isVisible: boolean
|
|
15
|
+
height: number
|
|
16
|
+
type: 'default' | 'numeric' | 'email' | 'tel' | 'url' | 'search' | 'decimal'
|
|
17
|
+
orientation: 'portrait' | 'landscape'
|
|
18
|
+
platform: 'ios' | 'android' | 'unknown'
|
|
19
|
+
language: string
|
|
20
|
+
inputMode: string
|
|
21
|
+
autoCapitalize: string
|
|
22
|
+
autoComplete: string
|
|
23
|
+
autoCorrect: string
|
|
24
|
+
spellCheck: boolean
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface KeyboardOptimization {
|
|
28
|
+
id: string
|
|
29
|
+
name: string
|
|
30
|
+
type: 'keyboard' | 'input' | 'performance' | 'accessibility'
|
|
31
|
+
applied: boolean
|
|
32
|
+
impact: 'low' | 'medium' | 'high'
|
|
33
|
+
description: string
|
|
34
|
+
keyboardType?: string
|
|
35
|
+
inputMode?: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface MobileKeyboardOptimizationCallbacks {
|
|
39
|
+
onKeyboardStateChanged?: (state: KeyboardState) => void
|
|
40
|
+
onOptimizationApplied?: (optimization: KeyboardOptimization) => void
|
|
41
|
+
onPerformanceOptimized?: (optimization: string) => void
|
|
42
|
+
onBatteryOptimized?: (strategy: string) => void
|
|
43
|
+
onAccessibilityEnhanced?: (feature: string) => void
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const useMobileKeyboardOptimization = (
|
|
47
|
+
config: KeyboardOptimizationConfig = {},
|
|
48
|
+
callbacks: MobileKeyboardOptimizationCallbacks = {}
|
|
49
|
+
) => {
|
|
50
|
+
const {
|
|
51
|
+
enableKeyboardDetection = true,
|
|
52
|
+
|
|
53
|
+
enablePerformanceMonitoring = true,
|
|
54
|
+
enableBatteryOptimization = true,
|
|
55
|
+
enableAccessibilitySupport = true,
|
|
56
|
+
keyboardDetectionInterval = 100,
|
|
57
|
+
performanceThreshold = 60
|
|
58
|
+
} = config
|
|
59
|
+
|
|
60
|
+
const [keyboardState, setKeyboardState] = useState<KeyboardState>({
|
|
61
|
+
isVisible: false,
|
|
62
|
+
height: 0,
|
|
63
|
+
type: 'default',
|
|
64
|
+
orientation: 'portrait',
|
|
65
|
+
platform: 'unknown',
|
|
66
|
+
language: 'en-US',
|
|
67
|
+
inputMode: 'text',
|
|
68
|
+
autoCapitalize: 'sentences',
|
|
69
|
+
autoComplete: 'on',
|
|
70
|
+
autoCorrect: 'on',
|
|
71
|
+
spellCheck: true
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
const [optimizations, setOptimizations] = useState<KeyboardOptimization[]>([])
|
|
75
|
+
const [isOptimizing, setIsOptimizing] = useState(false)
|
|
76
|
+
const [performanceMetrics, setPerformanceMetrics] = useState({
|
|
77
|
+
frameRate: 60,
|
|
78
|
+
inputLatency: 0,
|
|
79
|
+
keyboardResponseTime: 0,
|
|
80
|
+
memoryUsage: 0
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
const keyboardDetectionRef = useRef<number | null>(null)
|
|
84
|
+
const performanceTimerRef = useRef<number | null>(null)
|
|
85
|
+
|
|
86
|
+
const lastKeyboardHeightRef = useRef(0)
|
|
87
|
+
const keyboardVisibilityTimerRef = useRef<number | null>(null)
|
|
88
|
+
|
|
89
|
+
// Detect mobile platform
|
|
90
|
+
const detectPlatform = useCallback(() => {
|
|
91
|
+
const userAgent = navigator.userAgent.toLowerCase()
|
|
92
|
+
if (/iphone|ipad|ipod/.test(userAgent)) return 'ios'
|
|
93
|
+
if (/android/.test(userAgent)) return 'android'
|
|
94
|
+
return 'unknown'
|
|
95
|
+
}, [])
|
|
96
|
+
|
|
97
|
+
// Detect device orientation
|
|
98
|
+
const detectOrientation = useCallback(() => {
|
|
99
|
+
return window.innerHeight > window.innerWidth ? 'portrait' : 'landscape'
|
|
100
|
+
}, [])
|
|
101
|
+
|
|
102
|
+
// Detect keyboard visibility
|
|
103
|
+
const detectKeyboardVisibility = useCallback(() => {
|
|
104
|
+
const currentHeight = window.innerHeight
|
|
105
|
+
const heightDifference = lastKeyboardHeightRef.current - currentHeight
|
|
106
|
+
|
|
107
|
+
// Keyboard is considered visible if height decreased significantly
|
|
108
|
+
const isVisible = heightDifference > 150
|
|
109
|
+
|
|
110
|
+
if (isVisible !== keyboardState.isVisible) {
|
|
111
|
+
setKeyboardState(prev => ({
|
|
112
|
+
...prev,
|
|
113
|
+
isVisible,
|
|
114
|
+
height: isVisible ? heightDifference : 0
|
|
115
|
+
}))
|
|
116
|
+
|
|
117
|
+
callbacks.onKeyboardStateChanged?.({
|
|
118
|
+
...keyboardState,
|
|
119
|
+
isVisible,
|
|
120
|
+
height: isVisible ? heightDifference : 0
|
|
121
|
+
})
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
lastKeyboardHeightRef.current = currentHeight
|
|
125
|
+
}, [keyboardState, callbacks])
|
|
126
|
+
|
|
127
|
+
// Start keyboard detection
|
|
128
|
+
const startKeyboardDetection = useCallback(() => {
|
|
129
|
+
if (!enableKeyboardDetection) return () => {}
|
|
130
|
+
|
|
131
|
+
const detect = () => {
|
|
132
|
+
detectKeyboardVisibility()
|
|
133
|
+
keyboardDetectionRef.current = window.setTimeout(detect, keyboardDetectionInterval)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
keyboardDetectionRef.current = window.setTimeout(detect, keyboardDetectionInterval)
|
|
137
|
+
|
|
138
|
+
return () => {
|
|
139
|
+
if (keyboardDetectionRef.current) {
|
|
140
|
+
clearTimeout(keyboardDetectionRef.current)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}, [enableKeyboardDetection, keyboardDetectionInterval, detectKeyboardVisibility])
|
|
144
|
+
|
|
145
|
+
// Performance monitoring
|
|
146
|
+
const startPerformanceMonitoring = useCallback(() => {
|
|
147
|
+
if (!enablePerformanceMonitoring) return () => {}
|
|
148
|
+
|
|
149
|
+
let frameCount = 0
|
|
150
|
+
let lastTime = performance.now()
|
|
151
|
+
|
|
152
|
+
const measurePerformance = () => {
|
|
153
|
+
const currentTime = performance.now()
|
|
154
|
+
frameCount++
|
|
155
|
+
|
|
156
|
+
if (currentTime - lastTime >= 1000) {
|
|
157
|
+
const fps = Math.round((frameCount * 1000) / (currentTime - lastTime))
|
|
158
|
+
const inputLatency = currentTime - lastTime
|
|
159
|
+
|
|
160
|
+
setPerformanceMetrics(prev => ({
|
|
161
|
+
...prev,
|
|
162
|
+
frameRate: fps,
|
|
163
|
+
inputLatency
|
|
164
|
+
}))
|
|
165
|
+
|
|
166
|
+
frameCount = 0
|
|
167
|
+
lastTime = currentTime
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
performanceTimerRef.current = requestAnimationFrame(measurePerformance)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
performanceTimerRef.current = requestAnimationFrame(measurePerformance)
|
|
174
|
+
|
|
175
|
+
return () => {
|
|
176
|
+
if (performanceTimerRef.current) {
|
|
177
|
+
cancelAnimationFrame(performanceTimerRef.current)
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}, [enablePerformanceMonitoring])
|
|
181
|
+
|
|
182
|
+
// Keyboard type optimization
|
|
183
|
+
const optimizeKeyboardType = useCallback((inputType: string) => {
|
|
184
|
+
setIsOptimizing(true)
|
|
185
|
+
|
|
186
|
+
setTimeout(() => {
|
|
187
|
+
const keyboardOptimizations: KeyboardOptimization[] = [
|
|
188
|
+
{
|
|
189
|
+
id: 'keyboard-type-1',
|
|
190
|
+
name: 'Keyboard Type Optimization',
|
|
191
|
+
type: 'keyboard',
|
|
192
|
+
applied: true,
|
|
193
|
+
impact: 'high',
|
|
194
|
+
description: `Optimized keyboard type for ${inputType} input`,
|
|
195
|
+
keyboardType: inputType,
|
|
196
|
+
inputMode: inputType
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: 'keyboard-type-2',
|
|
200
|
+
name: 'Input Mode Enhancement',
|
|
201
|
+
type: 'input',
|
|
202
|
+
applied: true,
|
|
203
|
+
impact: 'medium',
|
|
204
|
+
description: 'Enhanced input mode for better mobile experience',
|
|
205
|
+
inputMode: inputType
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
|
|
209
|
+
setOptimizations(prev => [...prev, ...keyboardOptimizations])
|
|
210
|
+
setIsOptimizing(false)
|
|
211
|
+
|
|
212
|
+
keyboardOptimizations.forEach(optimization => {
|
|
213
|
+
callbacks.onOptimizationApplied?.(optimization)
|
|
214
|
+
})
|
|
215
|
+
}, 200)
|
|
216
|
+
}, [callbacks])
|
|
217
|
+
|
|
218
|
+
// Input behavior optimization
|
|
219
|
+
const optimizeInputBehavior = useCallback((inputType: string) => {
|
|
220
|
+
setIsOptimizing(true)
|
|
221
|
+
|
|
222
|
+
setTimeout(() => {
|
|
223
|
+
const inputOptimizations: KeyboardOptimization[] = [
|
|
224
|
+
{
|
|
225
|
+
id: 'input-behavior-1',
|
|
226
|
+
name: 'Auto-capitalization Optimization',
|
|
227
|
+
type: 'input',
|
|
228
|
+
applied: true,
|
|
229
|
+
impact: 'medium',
|
|
230
|
+
description: 'Optimized auto-capitalization for mobile input',
|
|
231
|
+
inputMode: inputType
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
id: 'input-behavior-2',
|
|
235
|
+
name: 'Autocomplete Enhancement',
|
|
236
|
+
type: 'input',
|
|
237
|
+
applied: true,
|
|
238
|
+
impact: 'medium',
|
|
239
|
+
description: 'Enhanced autocomplete for better user experience',
|
|
240
|
+
inputMode: inputType
|
|
241
|
+
}
|
|
242
|
+
]
|
|
243
|
+
|
|
244
|
+
setOptimizations(prev => [...prev, ...inputOptimizations])
|
|
245
|
+
setIsOptimizing(false)
|
|
246
|
+
|
|
247
|
+
inputOptimizations.forEach(optimization => {
|
|
248
|
+
callbacks.onOptimizationApplied?.(optimization)
|
|
249
|
+
})
|
|
250
|
+
}, 250)
|
|
251
|
+
}, [callbacks])
|
|
252
|
+
|
|
253
|
+
// Performance optimization
|
|
254
|
+
const optimizePerformance = useCallback(() => {
|
|
255
|
+
if (!enablePerformanceMonitoring) return
|
|
256
|
+
|
|
257
|
+
setIsOptimizing(true)
|
|
258
|
+
|
|
259
|
+
setTimeout(() => {
|
|
260
|
+
const performanceOptimizations: KeyboardOptimization[] = [
|
|
261
|
+
{
|
|
262
|
+
id: 'performance-1',
|
|
263
|
+
name: 'Input Latency Optimization',
|
|
264
|
+
type: 'performance',
|
|
265
|
+
applied: true,
|
|
266
|
+
impact: 'high',
|
|
267
|
+
description: 'Reduced input latency for smoother typing experience'
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
id: 'performance-2',
|
|
271
|
+
name: 'Frame Rate Optimization',
|
|
272
|
+
type: 'performance',
|
|
273
|
+
applied: true,
|
|
274
|
+
impact: 'medium',
|
|
275
|
+
description: 'Optimized frame rate for keyboard interactions'
|
|
276
|
+
}
|
|
277
|
+
]
|
|
278
|
+
|
|
279
|
+
setOptimizations(prev => [...prev, ...performanceOptimizations])
|
|
280
|
+
setIsOptimizing(false)
|
|
281
|
+
|
|
282
|
+
performanceOptimizations.forEach(optimization => {
|
|
283
|
+
callbacks.onPerformanceOptimized?.(optimization.description)
|
|
284
|
+
})
|
|
285
|
+
}, 300)
|
|
286
|
+
}, [enablePerformanceMonitoring, callbacks])
|
|
287
|
+
|
|
288
|
+
// Battery optimization
|
|
289
|
+
const optimizeBattery = useCallback(() => {
|
|
290
|
+
if (!enableBatteryOptimization) return
|
|
291
|
+
|
|
292
|
+
setIsOptimizing(true)
|
|
293
|
+
|
|
294
|
+
setTimeout(() => {
|
|
295
|
+
const batteryOptimizations: KeyboardOptimization[] = [
|
|
296
|
+
{
|
|
297
|
+
id: 'battery-1',
|
|
298
|
+
name: 'Battery-Conscious Keyboard',
|
|
299
|
+
type: 'performance',
|
|
300
|
+
applied: true,
|
|
301
|
+
impact: 'medium',
|
|
302
|
+
description: 'Battery-optimized keyboard behavior'
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
id: 'battery-2',
|
|
306
|
+
name: 'Efficient Input Processing',
|
|
307
|
+
type: 'performance',
|
|
308
|
+
applied: true,
|
|
309
|
+
impact: 'low',
|
|
310
|
+
description: 'Efficient input processing for battery optimization'
|
|
311
|
+
}
|
|
312
|
+
]
|
|
313
|
+
|
|
314
|
+
setOptimizations(prev => [...prev, ...batteryOptimizations])
|
|
315
|
+
setIsOptimizing(false)
|
|
316
|
+
|
|
317
|
+
batteryOptimizations.forEach(optimization => {
|
|
318
|
+
callbacks.onBatteryOptimized?.(optimization.description)
|
|
319
|
+
})
|
|
320
|
+
}, 200)
|
|
321
|
+
}, [enableBatteryOptimization, callbacks])
|
|
322
|
+
|
|
323
|
+
// Accessibility enhancement
|
|
324
|
+
const enhanceAccessibility = useCallback(() => {
|
|
325
|
+
if (!enableAccessibilitySupport) return
|
|
326
|
+
|
|
327
|
+
setIsOptimizing(true)
|
|
328
|
+
|
|
329
|
+
setTimeout(() => {
|
|
330
|
+
const accessibilityFeatures: KeyboardOptimization[] = [
|
|
331
|
+
{
|
|
332
|
+
id: 'accessibility-1',
|
|
333
|
+
name: 'Keyboard Navigation',
|
|
334
|
+
type: 'accessibility',
|
|
335
|
+
applied: true,
|
|
336
|
+
impact: 'high',
|
|
337
|
+
description: 'Enhanced keyboard navigation support'
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
id: 'accessibility-2',
|
|
341
|
+
name: 'Screen Reader Support',
|
|
342
|
+
type: 'accessibility',
|
|
343
|
+
applied: true,
|
|
344
|
+
impact: 'medium',
|
|
345
|
+
description: 'Improved screen reader compatibility'
|
|
346
|
+
}
|
|
347
|
+
]
|
|
348
|
+
|
|
349
|
+
setOptimizations(prev => [...prev, ...accessibilityFeatures])
|
|
350
|
+
setIsOptimizing(false)
|
|
351
|
+
|
|
352
|
+
accessibilityFeatures.forEach(feature => {
|
|
353
|
+
callbacks.onAccessibilityEnhanced?.(feature.description)
|
|
354
|
+
})
|
|
355
|
+
}, 150)
|
|
356
|
+
}, [enableAccessibilitySupport, callbacks])
|
|
357
|
+
|
|
358
|
+
// Auto-optimize based on input type
|
|
359
|
+
const autoOptimizeForInputType = useCallback((inputType: string) => {
|
|
360
|
+
optimizeKeyboardType(inputType)
|
|
361
|
+
optimizeInputBehavior(inputType)
|
|
362
|
+
optimizePerformance()
|
|
363
|
+
optimizeBattery()
|
|
364
|
+
enhanceAccessibility()
|
|
365
|
+
}, [optimizeKeyboardType, optimizeInputBehavior, optimizePerformance, optimizeBattery, enhanceAccessibility])
|
|
366
|
+
|
|
367
|
+
// Get keyboard optimization recommendations
|
|
368
|
+
const getOptimizationRecommendations = useCallback(() => {
|
|
369
|
+
const recommendations: string[] = []
|
|
370
|
+
|
|
371
|
+
if (performanceMetrics.frameRate < performanceThreshold) {
|
|
372
|
+
recommendations.push('Consider reducing keyboard animation complexity to improve frame rate')
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (performanceMetrics.inputLatency > 16) {
|
|
376
|
+
recommendations.push('Input latency is high, consider optimizing keyboard event handling')
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (!keyboardState.isVisible && keyboardState.height > 0) {
|
|
380
|
+
recommendations.push('Keyboard detection may need adjustment for better accuracy')
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return recommendations
|
|
384
|
+
}, [performanceMetrics, performanceThreshold, keyboardState])
|
|
385
|
+
|
|
386
|
+
// Initialize on mount
|
|
387
|
+
useEffect(() => {
|
|
388
|
+
const platform = detectPlatform()
|
|
389
|
+
const orientation = detectOrientation()
|
|
390
|
+
|
|
391
|
+
setKeyboardState(prev => ({
|
|
392
|
+
...prev,
|
|
393
|
+
platform,
|
|
394
|
+
orientation
|
|
395
|
+
}))
|
|
396
|
+
|
|
397
|
+
const stopKeyboardDetection = startKeyboardDetection()
|
|
398
|
+
const stopPerformanceMonitoring = startPerformanceMonitoring()
|
|
399
|
+
|
|
400
|
+
return () => {
|
|
401
|
+
stopKeyboardDetection()
|
|
402
|
+
stopPerformanceMonitoring()
|
|
403
|
+
}
|
|
404
|
+
}, [detectPlatform, detectOrientation, startKeyboardDetection, startPerformanceMonitoring])
|
|
405
|
+
|
|
406
|
+
// Handle orientation change
|
|
407
|
+
useEffect(() => {
|
|
408
|
+
const handleOrientationChange = () => {
|
|
409
|
+
const orientation = detectOrientation()
|
|
410
|
+
setKeyboardState(prev => ({
|
|
411
|
+
...prev,
|
|
412
|
+
orientation
|
|
413
|
+
}))
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
window.addEventListener('orientationchange', handleOrientationChange)
|
|
417
|
+
window.addEventListener('resize', handleOrientationChange)
|
|
418
|
+
|
|
419
|
+
return () => {
|
|
420
|
+
window.removeEventListener('orientationchange', handleOrientationChange)
|
|
421
|
+
window.removeEventListener('resize', handleOrientationChange)
|
|
422
|
+
}
|
|
423
|
+
}, [detectOrientation])
|
|
424
|
+
|
|
425
|
+
// Cleanup on unmount
|
|
426
|
+
useEffect(() => {
|
|
427
|
+
return () => {
|
|
428
|
+
if (keyboardDetectionRef.current) {
|
|
429
|
+
clearTimeout(keyboardDetectionRef.current)
|
|
430
|
+
}
|
|
431
|
+
if (performanceTimerRef.current) {
|
|
432
|
+
cancelAnimationFrame(performanceTimerRef.current)
|
|
433
|
+
}
|
|
434
|
+
if (keyboardVisibilityTimerRef.current) {
|
|
435
|
+
clearTimeout(keyboardVisibilityTimerRef.current)
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}, [])
|
|
439
|
+
|
|
440
|
+
return {
|
|
441
|
+
// State
|
|
442
|
+
keyboardState,
|
|
443
|
+
optimizations,
|
|
444
|
+
isOptimizing,
|
|
445
|
+
performanceMetrics,
|
|
446
|
+
|
|
447
|
+
// Functions
|
|
448
|
+
optimizeKeyboardType,
|
|
449
|
+
optimizeInputBehavior,
|
|
450
|
+
optimizePerformance,
|
|
451
|
+
optimizeBattery,
|
|
452
|
+
enhanceAccessibility,
|
|
453
|
+
autoOptimizeForInputType,
|
|
454
|
+
|
|
455
|
+
// Utility functions
|
|
456
|
+
isKeyboardVisible: () => keyboardState.isVisible,
|
|
457
|
+
getKeyboardHeight: () => keyboardState.height,
|
|
458
|
+
getPlatform: () => keyboardState.platform,
|
|
459
|
+
getOrientation: () => keyboardState.orientation,
|
|
460
|
+
getOptimizationStatus: () => ({
|
|
461
|
+
keyboard: optimizations.some(o => o.type === 'keyboard'),
|
|
462
|
+
input: optimizations.some(o => o.type === 'input'),
|
|
463
|
+
performance: optimizations.some(o => o.type === 'performance'),
|
|
464
|
+
accessibility: optimizations.some(o => o.type === 'accessibility')
|
|
465
|
+
}),
|
|
466
|
+
getOptimizationRecommendations,
|
|
467
|
+
clearOptimizations: () => setOptimizations([])
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
export default useMobileKeyboardOptimization
|
|
472
|
+
|