@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,56 +1,78 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface InputType {
|
|
4
|
-
type
|
|
4
|
+
type: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' | 'date' | 'time' | 'datetime-local' | 'month' | 'week'
|
|
5
|
+
pattern?: RegExp
|
|
6
|
+
autocomplete?: string
|
|
7
|
+
inputMode?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'
|
|
8
|
+
keyboardType?: 'default' | 'email' | 'numeric' | 'phone' | 'url'
|
|
9
|
+
}
|
|
5
10
|
|
|
6
11
|
export interface SemanticConfig {
|
|
7
|
-
enableAutoDetection
|
|
12
|
+
enableAutoDetection: boolean
|
|
13
|
+
enableKeyboardOptimization: boolean
|
|
14
|
+
enableAutocomplete: boolean
|
|
15
|
+
enableTouchOptimization: boolean
|
|
16
|
+
enableAccessibility: boolean
|
|
17
|
+
enablePerformanceMonitoring: boolean
|
|
18
|
+
}
|
|
8
19
|
|
|
9
20
|
export interface SemanticCallbacks {
|
|
10
|
-
onInputTypeDetected
|
|
11
|
-
onKeyboardOptimization
|
|
12
|
-
onAutocompleteEnhanced
|
|
13
|
-
onTouchOptimized
|
|
21
|
+
onInputTypeDetected?: (inputType: InputType) => void
|
|
22
|
+
onKeyboardOptimization?: (optimized: boolean) => void
|
|
23
|
+
onAutocompleteEnhanced?: (enhanced: boolean) => void
|
|
24
|
+
onTouchOptimized?: (optimized: boolean) => void
|
|
14
25
|
}
|
|
15
26
|
|
|
16
27
|
export interface SemanticInputState {
|
|
17
|
-
detectedType
|
|
28
|
+
detectedType: InputType | null
|
|
29
|
+
isOptimized: boolean
|
|
30
|
+
keyboardOptimized: boolean
|
|
31
|
+
autocompleteEnhanced: boolean
|
|
32
|
+
touchOptimized: boolean
|
|
33
|
+
performanceMetrics: {
|
|
34
|
+
detectionTime: number
|
|
35
|
+
optimizationTime: number
|
|
36
|
+
lastOptimization: number
|
|
37
|
+
}
|
|
18
38
|
}
|
|
19
39
|
|
|
20
40
|
export const useSemanticInput = (
|
|
21
|
-
initialType,
|
|
22
|
-
callbacks= {},
|
|
23
|
-
config= {}
|
|
41
|
+
initialType: InputType,
|
|
42
|
+
callbacks: SemanticCallbacks = {},
|
|
43
|
+
config: Partial<SemanticConfig> = {}
|
|
24
44
|
) => {
|
|
25
|
-
const defaultConfig= {
|
|
26
|
-
enableAutoDetection,
|
|
27
|
-
enableKeyboardOptimization,
|
|
28
|
-
enableAutocomplete,
|
|
29
|
-
enableTouchOptimization,
|
|
30
|
-
enableAccessibility,
|
|
31
|
-
enablePerformanceMonitoring,
|
|
45
|
+
const defaultConfig: SemanticConfig = {
|
|
46
|
+
enableAutoDetection: true,
|
|
47
|
+
enableKeyboardOptimization: true,
|
|
48
|
+
enableAutocomplete: true,
|
|
49
|
+
enableTouchOptimization: true,
|
|
50
|
+
enableAccessibility: true,
|
|
51
|
+
enablePerformanceMonitoring: true,
|
|
32
52
|
...config
|
|
33
53
|
}
|
|
34
54
|
|
|
35
55
|
const [semanticState, setSemanticState] = useState<SemanticInputState>({
|
|
36
|
-
detectedType,
|
|
37
|
-
isOptimized,
|
|
38
|
-
keyboardOptimized,
|
|
39
|
-
autocompleteEnhanced,
|
|
40
|
-
touchOptimized,
|
|
41
|
-
performanceMetrics
|
|
42
|
-
|
|
43
|
-
|
|
56
|
+
detectedType: null,
|
|
57
|
+
isOptimized: false,
|
|
58
|
+
keyboardOptimized: false,
|
|
59
|
+
autocompleteEnhanced: false,
|
|
60
|
+
touchOptimized: false,
|
|
61
|
+
performanceMetrics: {
|
|
62
|
+
detectionTime: 0,
|
|
63
|
+
optimizationTime: 0,
|
|
64
|
+
lastOptimization: 0
|
|
65
|
+
}
|
|
44
66
|
})
|
|
45
67
|
|
|
46
68
|
const inputRef = useRef<HTMLInputElement | null>(null)
|
|
47
69
|
const optimizationTimerRef = useRef<NodeJS.Timeout | null>(null)
|
|
48
70
|
|
|
49
71
|
// Detect input type based on content and context
|
|
50
|
-
const detectInputType = useCallback((value, name, placeholder
|
|
72
|
+
const detectInputType = useCallback((value: string, name: string, placeholder?: string): InputType => {
|
|
51
73
|
const startTime = performance.now()
|
|
52
74
|
|
|
53
|
-
let detectedType= { ...initialType }
|
|
75
|
+
let detectedType: InputType = { ...initialType }
|
|
54
76
|
|
|
55
77
|
// Auto-detect based on field name
|
|
56
78
|
if (defaultConfig.enableAutoDetection) {
|
|
@@ -60,58 +82,65 @@ export const useSemanticInput = (
|
|
|
60
82
|
// Email detection
|
|
61
83
|
if (fieldName.includes('email') || fieldName.includes('mail') || fieldValue.includes('@')) {
|
|
62
84
|
detectedType = {
|
|
63
|
-
type,
|
|
64
|
-
autocomplete,
|
|
65
|
-
inputMode,
|
|
66
|
-
keyboardType
|
|
85
|
+
type: 'email',
|
|
86
|
+
autocomplete: 'email',
|
|
87
|
+
inputMode: 'email',
|
|
88
|
+
keyboardType: 'email'
|
|
89
|
+
}
|
|
67
90
|
}
|
|
68
91
|
// Phone detection
|
|
69
92
|
else if (fieldName.includes('phone') || fieldName.includes('tel') || fieldName.includes('mobile')) {
|
|
70
93
|
detectedType = {
|
|
71
|
-
type,
|
|
72
|
-
autocomplete,
|
|
73
|
-
inputMode,
|
|
74
|
-
keyboardType
|
|
94
|
+
type: 'tel',
|
|
95
|
+
autocomplete: 'tel',
|
|
96
|
+
inputMode: 'tel',
|
|
97
|
+
keyboardType: 'phone'
|
|
98
|
+
}
|
|
75
99
|
}
|
|
76
100
|
// URL detection
|
|
77
101
|
else if (fieldName.includes('url') || fieldName.includes('website') || fieldName.includes('link')) {
|
|
78
102
|
detectedType = {
|
|
79
|
-
type,
|
|
80
|
-
autocomplete,
|
|
81
|
-
inputMode,
|
|
82
|
-
keyboardType
|
|
103
|
+
type: 'url',
|
|
104
|
+
autocomplete: 'url',
|
|
105
|
+
inputMode: 'url',
|
|
106
|
+
keyboardType: 'url'
|
|
107
|
+
}
|
|
83
108
|
}
|
|
84
109
|
// Search detection
|
|
85
110
|
else if (fieldName.includes('search') || fieldName.includes('query')) {
|
|
86
111
|
detectedType = {
|
|
87
|
-
type,
|
|
88
|
-
autocomplete,
|
|
89
|
-
inputMode,
|
|
90
|
-
keyboardType
|
|
112
|
+
type: 'search',
|
|
113
|
+
autocomplete: 'off',
|
|
114
|
+
inputMode: 'search',
|
|
115
|
+
keyboardType: 'default'
|
|
116
|
+
}
|
|
91
117
|
}
|
|
92
118
|
// Number detection
|
|
93
119
|
else if (fieldName.includes('number') || fieldName.includes('amount') || fieldName.includes('price') || fieldName.includes('quantity')) {
|
|
94
120
|
detectedType = {
|
|
95
|
-
type,
|
|
96
|
-
autocomplete,
|
|
97
|
-
inputMode,
|
|
98
|
-
keyboardType
|
|
121
|
+
type: 'number',
|
|
122
|
+
autocomplete: 'off',
|
|
123
|
+
inputMode: 'numeric',
|
|
124
|
+
keyboardType: 'numeric'
|
|
125
|
+
}
|
|
99
126
|
}
|
|
100
127
|
// Date detection
|
|
101
128
|
else if (fieldName.includes('date') || fieldName.includes('birth') || fieldName.includes('anniversary')) {
|
|
102
129
|
detectedType = {
|
|
103
|
-
type,
|
|
104
|
-
autocomplete,
|
|
105
|
-
inputMode,
|
|
106
|
-
keyboardType
|
|
130
|
+
type: 'date',
|
|
131
|
+
autocomplete: 'bday',
|
|
132
|
+
inputMode: 'none',
|
|
133
|
+
keyboardType: 'default'
|
|
134
|
+
}
|
|
107
135
|
}
|
|
108
136
|
// Password detection
|
|
109
137
|
else if (fieldName.includes('password') || fieldName.includes('pass') || fieldName.includes('secret')) {
|
|
110
138
|
detectedType = {
|
|
111
|
-
type,
|
|
112
|
-
autocomplete,
|
|
113
|
-
inputMode,
|
|
114
|
-
keyboardType
|
|
139
|
+
type: 'password',
|
|
140
|
+
autocomplete: 'current-password',
|
|
141
|
+
inputMode: 'text',
|
|
142
|
+
keyboardType: 'default'
|
|
143
|
+
}
|
|
115
144
|
}
|
|
116
145
|
}
|
|
117
146
|
|
|
@@ -121,22 +150,25 @@ export const useSemanticInput = (
|
|
|
121
150
|
|
|
122
151
|
if (placeholderLower.includes('@') || placeholderLower.includes('email')) {
|
|
123
152
|
detectedType = {
|
|
124
|
-
type,
|
|
125
|
-
autocomplete,
|
|
126
|
-
inputMode,
|
|
127
|
-
keyboardType
|
|
153
|
+
type: 'email',
|
|
154
|
+
autocomplete: 'email',
|
|
155
|
+
inputMode: 'email',
|
|
156
|
+
keyboardType: 'email'
|
|
157
|
+
}
|
|
128
158
|
} else if (placeholderLower.includes('http') || placeholderLower.includes('www')) {
|
|
129
159
|
detectedType = {
|
|
130
|
-
type,
|
|
131
|
-
autocomplete,
|
|
132
|
-
inputMode,
|
|
133
|
-
keyboardType
|
|
160
|
+
type: 'url',
|
|
161
|
+
autocomplete: 'url',
|
|
162
|
+
inputMode: 'url',
|
|
163
|
+
keyboardType: 'url'
|
|
164
|
+
}
|
|
134
165
|
} else if (placeholderLower.includes('search') || placeholderLower.includes('find')) {
|
|
135
166
|
detectedType = {
|
|
136
|
-
type,
|
|
137
|
-
autocomplete,
|
|
138
|
-
inputMode,
|
|
139
|
-
keyboardType
|
|
167
|
+
type: 'search',
|
|
168
|
+
autocomplete: 'off',
|
|
169
|
+
inputMode: 'search',
|
|
170
|
+
keyboardType: 'default'
|
|
171
|
+
}
|
|
140
172
|
}
|
|
141
173
|
}
|
|
142
174
|
|
|
@@ -145,34 +177,38 @@ export const useSemanticInput = (
|
|
|
145
177
|
// Email pattern
|
|
146
178
|
if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
|
|
147
179
|
detectedType = {
|
|
148
|
-
type,
|
|
149
|
-
autocomplete,
|
|
150
|
-
inputMode,
|
|
151
|
-
keyboardType
|
|
180
|
+
type: 'email',
|
|
181
|
+
autocomplete: 'email',
|
|
182
|
+
inputMode: 'email',
|
|
183
|
+
keyboardType: 'email'
|
|
184
|
+
}
|
|
152
185
|
}
|
|
153
186
|
// Phone pattern
|
|
154
187
|
else if (/^[\+]?[0-9\s\-\(\)]{7,}$/.test(value)) {
|
|
155
188
|
detectedType = {
|
|
156
|
-
type,
|
|
157
|
-
autocomplete,
|
|
158
|
-
inputMode,
|
|
159
|
-
keyboardType
|
|
189
|
+
type: 'tel',
|
|
190
|
+
autocomplete: 'tel',
|
|
191
|
+
inputMode: 'tel',
|
|
192
|
+
keyboardType: 'phone'
|
|
193
|
+
}
|
|
160
194
|
}
|
|
161
195
|
// URL pattern
|
|
162
|
-
else if (/^https
|
|
196
|
+
else if (/^https?:\/\/.+/.test(value)) {
|
|
163
197
|
detectedType = {
|
|
164
|
-
type,
|
|
165
|
-
autocomplete,
|
|
166
|
-
inputMode,
|
|
167
|
-
keyboardType
|
|
198
|
+
type: 'url',
|
|
199
|
+
autocomplete: 'url',
|
|
200
|
+
inputMode: 'url',
|
|
201
|
+
keyboardType: 'url'
|
|
202
|
+
}
|
|
168
203
|
}
|
|
169
204
|
// Number pattern
|
|
170
205
|
else if (/^[0-9]+(\.[0-9]+)?$/.test(value)) {
|
|
171
206
|
detectedType = {
|
|
172
|
-
type,
|
|
173
|
-
autocomplete,
|
|
174
|
-
inputMode,
|
|
175
|
-
keyboardType
|
|
207
|
+
type: 'number',
|
|
208
|
+
autocomplete: 'off',
|
|
209
|
+
inputMode: 'numeric',
|
|
210
|
+
keyboardType: 'numeric'
|
|
211
|
+
}
|
|
176
212
|
}
|
|
177
213
|
}
|
|
178
214
|
|
|
@@ -182,7 +218,8 @@ export const useSemanticInput = (
|
|
|
182
218
|
setSemanticState(prev => ({
|
|
183
219
|
...prev,
|
|
184
220
|
detectedType,
|
|
185
|
-
performanceMetrics
|
|
221
|
+
performanceMetrics: {
|
|
222
|
+
...prev.performanceMetrics,
|
|
186
223
|
detectionTime
|
|
187
224
|
}
|
|
188
225
|
}))
|
|
@@ -192,7 +229,7 @@ export const useSemanticInput = (
|
|
|
192
229
|
}, [initialType, defaultConfig.enableAutoDetection, callbacks])
|
|
193
230
|
|
|
194
231
|
// Optimize keyboard for mobile devices
|
|
195
|
-
const optimizeKeyboard = useCallback((inputType) => {
|
|
232
|
+
const optimizeKeyboard = useCallback((inputType: InputType) => {
|
|
196
233
|
if (!defaultConfig.enableKeyboardOptimization) return false
|
|
197
234
|
|
|
198
235
|
const startTime = performance.now()
|
|
@@ -240,10 +277,11 @@ export const useSemanticInput = (
|
|
|
240
277
|
|
|
241
278
|
setSemanticState(prev => ({
|
|
242
279
|
...prev,
|
|
243
|
-
keyboardOptimized,
|
|
244
|
-
performanceMetrics
|
|
280
|
+
keyboardOptimized: optimized,
|
|
281
|
+
performanceMetrics: {
|
|
282
|
+
...prev.performanceMetrics,
|
|
245
283
|
optimizationTime,
|
|
246
|
-
lastOptimization)
|
|
284
|
+
lastOptimization: Date.now()
|
|
247
285
|
}
|
|
248
286
|
}))
|
|
249
287
|
|
|
@@ -252,7 +290,7 @@ export const useSemanticInput = (
|
|
|
252
290
|
}, [defaultConfig.enableKeyboardOptimization, defaultConfig.enableAutocomplete, callbacks])
|
|
253
291
|
|
|
254
292
|
// Enhance autocomplete functionality
|
|
255
|
-
const enhanceAutocomplete = useCallback((inputType) => {
|
|
293
|
+
const enhanceAutocomplete = useCallback((inputType: InputType) => {
|
|
256
294
|
if (!defaultConfig.enableAutocomplete) return false
|
|
257
295
|
|
|
258
296
|
let enhanced = false
|
|
@@ -262,25 +300,32 @@ export const useSemanticInput = (
|
|
|
262
300
|
|
|
263
301
|
// Set appropriate autocomplete values
|
|
264
302
|
switch (inputType.type) {
|
|
265
|
-
case 'email'
|
|
303
|
+
case 'email':
|
|
304
|
+
input.setAttribute('autocomplete', 'email')
|
|
266
305
|
enhanced = true
|
|
267
306
|
break
|
|
268
|
-
case 'tel'
|
|
307
|
+
case 'tel':
|
|
308
|
+
input.setAttribute('autocomplete', 'tel')
|
|
269
309
|
enhanced = true
|
|
270
310
|
break
|
|
271
|
-
case 'url'
|
|
311
|
+
case 'url':
|
|
312
|
+
input.setAttribute('autocomplete', 'url')
|
|
272
313
|
enhanced = true
|
|
273
314
|
break
|
|
274
|
-
case 'password'
|
|
315
|
+
case 'password':
|
|
316
|
+
input.setAttribute('autocomplete', 'current-password')
|
|
275
317
|
enhanced = true
|
|
276
318
|
break
|
|
277
|
-
case 'date'
|
|
319
|
+
case 'date':
|
|
320
|
+
input.setAttribute('autocomplete', 'bday')
|
|
278
321
|
enhanced = true
|
|
279
322
|
break
|
|
280
|
-
case 'search'
|
|
323
|
+
case 'search':
|
|
324
|
+
input.setAttribute('autocomplete', 'off')
|
|
281
325
|
enhanced = true
|
|
282
326
|
break
|
|
283
|
-
case 'number'
|
|
327
|
+
case 'number':
|
|
328
|
+
input.setAttribute('autocomplete', 'off')
|
|
284
329
|
enhanced = true
|
|
285
330
|
break
|
|
286
331
|
}
|
|
@@ -300,14 +345,15 @@ export const useSemanticInput = (
|
|
|
300
345
|
|
|
301
346
|
setSemanticState(prev => ({
|
|
302
347
|
...prev,
|
|
303
|
-
autocompleteEnhanced
|
|
348
|
+
autocompleteEnhanced: enhanced
|
|
349
|
+
}))
|
|
304
350
|
|
|
305
351
|
callbacks.onAutocompleteEnhanced?.(enhanced)
|
|
306
352
|
return enhanced
|
|
307
353
|
}, [defaultConfig.enableAutocomplete, callbacks])
|
|
308
354
|
|
|
309
355
|
// Optimize touch interactions
|
|
310
|
-
const optimizeTouch = useCallback((inputType) => {
|
|
356
|
+
const optimizeTouch = useCallback((inputType: InputType) => {
|
|
311
357
|
if (!defaultConfig.enableTouchOptimization) return false
|
|
312
358
|
|
|
313
359
|
let optimized = false
|
|
@@ -343,14 +389,15 @@ export const useSemanticInput = (
|
|
|
343
389
|
|
|
344
390
|
setSemanticState(prev => ({
|
|
345
391
|
...prev,
|
|
346
|
-
touchOptimized
|
|
392
|
+
touchOptimized: optimized
|
|
393
|
+
}))
|
|
347
394
|
|
|
348
395
|
callbacks.onTouchOptimized?.(optimized)
|
|
349
396
|
return optimized
|
|
350
397
|
}, [defaultConfig.enableTouchOptimization, callbacks])
|
|
351
398
|
|
|
352
399
|
// Apply all optimizations
|
|
353
|
-
const applyOptimizations = useCallback((inputType) => {
|
|
400
|
+
const applyOptimizations = useCallback((inputType: InputType) => {
|
|
354
401
|
const keyboardOptimized = optimizeKeyboard(inputType)
|
|
355
402
|
const autocompleteEnhanced = enhanceAutocomplete(inputType)
|
|
356
403
|
const touchOptimized = optimizeTouch(inputType)
|
|
@@ -367,9 +414,10 @@ export const useSemanticInput = (
|
|
|
367
414
|
|
|
368
415
|
// Handle input changes with optimization
|
|
369
416
|
const handleInputChange = useCallback((
|
|
370
|
-
value,
|
|
371
|
-
name,
|
|
372
|
-
placeholder
|
|
417
|
+
value: string,
|
|
418
|
+
name: string,
|
|
419
|
+
placeholder?: string
|
|
420
|
+
) => {
|
|
373
421
|
const detectedType = detectInputType(value, name, placeholder)
|
|
374
422
|
|
|
375
423
|
// Apply optimizations with debouncing
|
|
@@ -383,10 +431,11 @@ export const useSemanticInput = (
|
|
|
383
431
|
}, [detectInputType, applyOptimizations])
|
|
384
432
|
|
|
385
433
|
// Get optimized input attributes
|
|
386
|
-
const getOptimizedAttributes = useCallback((inputType) => {
|
|
387
|
-
const attributes, string> = {
|
|
388
|
-
type,
|
|
389
|
-
'data-semantic-optimized'
|
|
434
|
+
const getOptimizedAttributes = useCallback((inputType: InputType) => {
|
|
435
|
+
const attributes: Record<string, string> = {
|
|
436
|
+
type: inputType.type,
|
|
437
|
+
'data-semantic-optimized': 'true'
|
|
438
|
+
}
|
|
390
439
|
|
|
391
440
|
if (inputType.inputMode) {
|
|
392
441
|
attributes.inputmode = inputType.inputMode
|
|
@@ -460,10 +509,11 @@ export const useSemanticInput = (
|
|
|
460
509
|
|
|
461
510
|
setSemanticState(prev => ({
|
|
462
511
|
...prev,
|
|
463
|
-
isOptimized,
|
|
464
|
-
keyboardOptimized,
|
|
465
|
-
autocompleteEnhanced,
|
|
466
|
-
touchOptimized
|
|
512
|
+
isOptimized: false,
|
|
513
|
+
keyboardOptimized: false,
|
|
514
|
+
autocompleteEnhanced: false,
|
|
515
|
+
touchOptimized: false
|
|
516
|
+
}))
|
|
467
517
|
}, [])
|
|
468
518
|
|
|
469
519
|
// Clean up timer on unmount
|
|
@@ -491,23 +541,25 @@ export const useSemanticInput = (
|
|
|
491
541
|
}
|
|
492
542
|
|
|
493
543
|
// Convenience hook for basic semantic input
|
|
494
|
-
export const useBasicSemanticInput = (initialType) => {
|
|
544
|
+
export const useBasicSemanticInput = (initialType: InputType) => {
|
|
495
545
|
return useSemanticInput(initialType, {}, {
|
|
496
|
-
enableAutoDetection,
|
|
497
|
-
enableKeyboardOptimization,
|
|
498
|
-
enableAutocomplete,
|
|
499
|
-
enableTouchOptimization,
|
|
500
|
-
enableAccessibility,
|
|
501
|
-
enablePerformanceMonitoring
|
|
546
|
+
enableAutoDetection: true,
|
|
547
|
+
enableKeyboardOptimization: false,
|
|
548
|
+
enableAutocomplete: false,
|
|
549
|
+
enableTouchOptimization: false,
|
|
550
|
+
enableAccessibility: true,
|
|
551
|
+
enablePerformanceMonitoring: false
|
|
552
|
+
})
|
|
502
553
|
}
|
|
503
554
|
|
|
504
555
|
// Convenience hook for enhanced semantic input
|
|
505
|
-
export const useEnhancedSemanticInput = (initialType) => {
|
|
556
|
+
export const useEnhancedSemanticInput = (initialType: InputType) => {
|
|
506
557
|
return useSemanticInput(initialType, {}, {
|
|
507
|
-
enableAutoDetection,
|
|
508
|
-
enableKeyboardOptimization,
|
|
509
|
-
enableAutocomplete,
|
|
510
|
-
enableTouchOptimization,
|
|
511
|
-
enableAccessibility,
|
|
512
|
-
enablePerformanceMonitoring
|
|
558
|
+
enableAutoDetection: true,
|
|
559
|
+
enableKeyboardOptimization: true,
|
|
560
|
+
enableAutocomplete: true,
|
|
561
|
+
enableTouchOptimization: true,
|
|
562
|
+
enableAccessibility: true,
|
|
563
|
+
enablePerformanceMonitoring: true
|
|
564
|
+
})
|
|
513
565
|
}
|
|
@@ -1,25 +1,47 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface TabletLayoutState {
|
|
4
|
-
orientation
|
|
5
|
-
|
|
4
|
+
orientation: 'portrait' | 'landscape'
|
|
5
|
+
screenSize: 'small' | 'medium' | 'large'
|
|
6
|
+
isSplitView: boolean
|
|
7
|
+
isKeyboardVisible: boolean
|
|
8
|
+
safeAreaInsets: {
|
|
9
|
+
top: number
|
|
10
|
+
bottom: number
|
|
11
|
+
left: number
|
|
12
|
+
right: number
|
|
13
|
+
}
|
|
14
|
+
performanceMetrics: {
|
|
15
|
+
renderTime: number
|
|
16
|
+
memoryUsage: number
|
|
17
|
+
touchResponsiveness: number
|
|
18
|
+
orientationScore: number
|
|
19
|
+
}
|
|
6
20
|
}
|
|
7
21
|
|
|
8
22
|
export interface TabletLayoutConfig {
|
|
9
|
-
enableOrientationOptimization
|
|
23
|
+
enableOrientationOptimization?: boolean
|
|
24
|
+
enableSplitViewSupport?: boolean
|
|
25
|
+
enableKeyboardOptimization?: boolean
|
|
26
|
+
enableSafeAreaOptimization?: boolean
|
|
27
|
+
enablePerformanceOptimization?: boolean
|
|
28
|
+
enableTouchOptimization?: boolean
|
|
29
|
+
orientationChangeThreshold?: number
|
|
30
|
+
splitViewBreakpoint?: number
|
|
31
|
+
}
|
|
10
32
|
|
|
11
33
|
export interface TabletLayoutCallbacks {
|
|
12
|
-
onOrientationChange
|
|
13
|
-
onSplitViewChange
|
|
14
|
-
onKeyboardChange
|
|
15
|
-
onSafeAreaChange
|
|
16
|
-
onPerformanceChange
|
|
17
|
-
onTouchOptimization
|
|
34
|
+
onOrientationChange?: (orientation: 'portrait' | 'landscape') => void
|
|
35
|
+
onSplitViewChange?: (isSplitView: boolean) => void
|
|
36
|
+
onKeyboardChange?: (isVisible: boolean) => void
|
|
37
|
+
onSafeAreaChange?: (insets: any) => void
|
|
38
|
+
onPerformanceChange?: (metrics: any) => void
|
|
39
|
+
onTouchOptimization?: (optimization: string) => void
|
|
18
40
|
}
|
|
19
41
|
|
|
20
42
|
export const useTabletLayout = (
|
|
21
|
-
config= {},
|
|
22
|
-
callbacks= {}
|
|
43
|
+
config: TabletLayoutConfig = {},
|
|
44
|
+
callbacks: TabletLayoutCallbacks = {}
|
|
23
45
|
) => {
|
|
24
46
|
const {
|
|
25
47
|
enableOrientationOptimization = true,
|
|
@@ -33,15 +55,17 @@ export const useTabletLayout = (
|
|
|
33
55
|
} = config
|
|
34
56
|
|
|
35
57
|
const [state, setState] = useState<TabletLayoutState>({
|
|
36
|
-
orientation,
|
|
37
|
-
screenSize,
|
|
38
|
-
isSplitView,
|
|
39
|
-
isKeyboardVisible,
|
|
40
|
-
safeAreaInsets, bottom, left, right},
|
|
41
|
-
performanceMetrics
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
58
|
+
orientation: 'landscape',
|
|
59
|
+
screenSize: 'medium',
|
|
60
|
+
isSplitView: false,
|
|
61
|
+
isKeyboardVisible: false,
|
|
62
|
+
safeAreaInsets: { top: 0, bottom: 0, left: 0, right: 0 },
|
|
63
|
+
performanceMetrics: {
|
|
64
|
+
renderTime: 0,
|
|
65
|
+
memoryUsage: 0,
|
|
66
|
+
touchResponsiveness: 0,
|
|
67
|
+
orientationScore: 100
|
|
68
|
+
}
|
|
45
69
|
})
|
|
46
70
|
|
|
47
71
|
const [optimizations, setOptimizations] = useState<string[]>([])
|
|
@@ -57,8 +81,10 @@ export const useTabletLayout = (
|
|
|
57
81
|
|
|
58
82
|
const width = window.innerWidth
|
|
59
83
|
const height = window.innerHeight
|
|
60
|
-
const newOrientation = width > height ? 'landscape'
|
|
61
|
-
|
|
84
|
+
const newOrientation = width > height ? 'landscape' : 'portrait'
|
|
85
|
+
|
|
86
|
+
if (newOrientation !== state.orientation) {
|
|
87
|
+
setState(prev => ({ ...prev, orientation: newOrientation }))
|
|
62
88
|
callbacks.onOrientationChange?.(newOrientation)
|
|
63
89
|
|
|
64
90
|
// Optimize for new orientation
|
|
@@ -66,11 +92,11 @@ export const useTabletLayout = (
|
|
|
66
92
|
}
|
|
67
93
|
}, [enableOrientationOptimization, state.orientation, callbacks])
|
|
68
94
|
|
|
69
|
-
const optimizeForOrientation = useCallback((orientation) => {
|
|
95
|
+
const optimizeForOrientation = useCallback((orientation: 'portrait' | 'landscape') => {
|
|
70
96
|
setIsOptimizing(true)
|
|
71
97
|
|
|
72
98
|
setTimeout(() => {
|
|
73
|
-
const newOptimizations] = []
|
|
99
|
+
const newOptimizations: string[] = []
|
|
74
100
|
|
|
75
101
|
if (orientation === 'portrait') {
|
|
76
102
|
newOptimizations.push('Portrait layout optimized - vertical navigation enabled')
|
|
@@ -156,10 +182,10 @@ export const useTabletLayout = (
|
|
|
156
182
|
if (!enableSafeAreaOptimization) return
|
|
157
183
|
|
|
158
184
|
const safeAreaInsets = {
|
|
159
|
-
top).getPropertyValue('--sat') || '0'),
|
|
160
|
-
bottom).getPropertyValue('--sab') || '0'),
|
|
161
|
-
left).getPropertyValue('--sal') || '0'),
|
|
162
|
-
right).getPropertyValue('--sar') || '0')
|
|
185
|
+
top: parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sat') || '0'),
|
|
186
|
+
bottom: parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sab') || '0'),
|
|
187
|
+
left: parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sal') || '0'),
|
|
188
|
+
right: parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sar') || '0')
|
|
163
189
|
}
|
|
164
190
|
|
|
165
191
|
setState(prev => ({ ...prev, safeAreaInsets }))
|
|
@@ -169,12 +195,12 @@ export const useTabletLayout = (
|
|
|
169
195
|
optimizeForSafeArea(safeAreaInsets)
|
|
170
196
|
}, [enableSafeAreaOptimization, callbacks])
|
|
171
197
|
|
|
172
|
-
const optimizeForSafeArea = useCallback((insets) => {
|
|
198
|
+
const optimizeForSafeArea = useCallback((insets: any) => {
|
|
173
199
|
setIsOptimizing(true)
|
|
174
200
|
|
|
175
201
|
setTimeout(() => {
|
|
176
202
|
const optimizations = [
|
|
177
|
-
`Safe area insets applied}px top, ${insets.bottom}px bottom`,
|
|
203
|
+
`Safe area insets applied: ${insets.top}px top, ${insets.bottom}px bottom`,
|
|
178
204
|
'Layout adjusted for device-specific safe areas',
|
|
179
205
|
'Touch targets positioned within safe areas'
|
|
180
206
|
]
|
|
@@ -195,10 +221,12 @@ export const useTabletLayout = (
|
|
|
195
221
|
const renderTime = endTime - startTime
|
|
196
222
|
|
|
197
223
|
// Calculate orientation-specific performance score
|
|
198
|
-
const orientationScore = state.orientation === 'landscape' ? 95
|
|
224
|
+
const orientationScore = state.orientation === 'landscape' ? 95 : 90
|
|
225
|
+
|
|
226
|
+
const performanceMetrics = {
|
|
199
227
|
renderTime,
|
|
200
|
-
memoryUsage) * 100,
|
|
201
|
-
touchResponsiveness) * 15,
|
|
228
|
+
memoryUsage: Math.random() * 100,
|
|
229
|
+
touchResponsiveness: 85 + Math.random() * 15,
|
|
202
230
|
orientationScore
|
|
203
231
|
}
|
|
204
232
|
|
|
@@ -345,11 +373,12 @@ export const useTabletLayout = (
|
|
|
345
373
|
optimizeTouchInteractions,
|
|
346
374
|
|
|
347
375
|
// Computed values
|
|
348
|
-
isPortrait=== 'portrait',
|
|
349
|
-
isLandscape=== 'landscape',
|
|
350
|
-
hasSafeArea).some(value => value > 0),
|
|
351
|
-
performanceScore,
|
|
352
|
-
optimizationCount
|
|
376
|
+
isPortrait: state.orientation === 'portrait',
|
|
377
|
+
isLandscape: state.orientation === 'landscape',
|
|
378
|
+
hasSafeArea: Object.values(state.safeAreaInsets).some(value => value > 0),
|
|
379
|
+
performanceScore: state.performanceMetrics.orientationScore,
|
|
380
|
+
optimizationCount: optimizations.length
|
|
381
|
+
}
|
|
353
382
|
}
|
|
354
383
|
|
|
355
384
|
export default useTabletLayout
|