@rakeyshgidwani/roger-ui-bank-theme-stan-design 0.2.9 → 0.2.11
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 +0 -1
- package/dist/components/ui/navigation/index.js +0 -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 +0 -2
- package/dist/components/ui/overlay/index.js +0 -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 +157 -281
- package/dist/index.js +157 -281
- 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/index.esm.js +1 -1
- package/dist/themes/index.js +1 -1
- 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 +1 -2
- package/dist/tokens/index.js +1 -2
- package/dist/tokens/tokenExporter.esm.js +87 -61
- package/dist/tokens/tokenExporter.js +87 -61
- package/dist/tokens/tokenGenerator.esm.js +86 -77
- package/dist/tokens/tokenGenerator.js +86 -77
- package/dist/tokens/tokenManager.esm.js +64 -51
- package/dist/tokens/tokenManager.js +64 -51
- package/dist/tokens/tokenValidator.esm.js +193 -147
- package/dist/tokens/tokenValidator.js +193 -147
- package/dist/tokens/types.esm.js +49 -35
- package/dist/tokens/types.js +49 -35
- package/dist/utils/bundle-analyzer.esm.js +83 -65
- package/dist/utils/bundle-analyzer.js +83 -65
- package/dist/utils/bundle-splitting.esm.js +142 -117
- package/dist/utils/bundle-splitting.js +142 -117
- package/dist/utils/lazy-loading.esm.js +132 -106
- package/dist/utils/lazy-loading.js +132 -106
- package/dist/utils/performance-monitor.esm.js +170 -129
- package/dist/utils/performance-monitor.js +170 -129
- package/dist/utils/tree-shaking.esm.js +69 -61
- package/dist/utils/tree-shaking.js +69 -61
- package/package.json +1 -1
- package/src/index.ts +146 -146
|
@@ -1,59 +1,84 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback, useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
export interface MobileTouchConfig {
|
|
4
|
-
enableTouchFeedback
|
|
4
|
+
enableTouchFeedback: boolean
|
|
5
|
+
enableGestureHints: boolean
|
|
6
|
+
enableTouchSounds: boolean
|
|
7
|
+
enableHapticFeedback: boolean
|
|
8
|
+
touchFeedbackDelay: number
|
|
9
|
+
gestureHintTimeout: number
|
|
10
|
+
maxTouchPoints: number
|
|
11
|
+
}
|
|
5
12
|
|
|
6
13
|
export interface TouchFeedbackState {
|
|
7
|
-
isPressed
|
|
14
|
+
isPressed: boolean
|
|
15
|
+
feedbackType: 'none' | 'scale' | 'ripple' | 'glow'
|
|
16
|
+
feedbackIntensity: 'light' | 'medium' | 'strong'
|
|
17
|
+
lastTouchPosition: { x: number; y: number } | null
|
|
8
18
|
}
|
|
9
19
|
|
|
10
20
|
export interface GestureHint {
|
|
11
|
-
type
|
|
12
|
-
|
|
21
|
+
type: 'swipe' | 'pinch' | 'longPress' | 'doubleTap' | 'tap'
|
|
22
|
+
message: string
|
|
23
|
+
position: { x: number; y: number }
|
|
24
|
+
timeout: number
|
|
25
|
+
}
|
|
13
26
|
|
|
14
27
|
export interface MobileTouchCallbacks {
|
|
15
|
-
onTouchFeedback
|
|
16
|
-
onGestureHint
|
|
17
|
-
onTouchStart
|
|
18
|
-
onTouchEnd
|
|
19
|
-
onTouchMove
|
|
28
|
+
onTouchFeedback?: (state: TouchFeedbackState) => void
|
|
29
|
+
onGestureHint?: (hint: GestureHint) => void
|
|
30
|
+
onTouchStart?: (position: { x: number; y: number }) => void
|
|
31
|
+
onTouchEnd?: (position: { x: number; y: number }) => void
|
|
32
|
+
onTouchMove?: (position: { x: number; y: number }) => void
|
|
20
33
|
}
|
|
21
34
|
|
|
22
35
|
export interface MobileTouchState {
|
|
23
|
-
isActive
|
|
24
|
-
|
|
36
|
+
isActive: boolean
|
|
37
|
+
touchCount: number
|
|
38
|
+
currentFeedback: TouchFeedbackState
|
|
39
|
+
activeGestureHints: GestureHint[]
|
|
40
|
+
deviceCapabilities: {
|
|
41
|
+
supportsTouch: boolean
|
|
42
|
+
supportsHaptics: boolean
|
|
43
|
+
supportsAudio: boolean
|
|
44
|
+
maxTouchPoints: number
|
|
45
|
+
}
|
|
25
46
|
}
|
|
26
47
|
|
|
27
48
|
export const useMobileTouch = (
|
|
28
|
-
elementRef
|
|
29
|
-
callbacks= {},
|
|
30
|
-
config= {}
|
|
49
|
+
elementRef: React.RefObject<HTMLElement>,
|
|
50
|
+
callbacks: MobileTouchCallbacks = {},
|
|
51
|
+
config: Partial<MobileTouchConfig> = {}
|
|
31
52
|
) => {
|
|
32
|
-
const defaultConfig= {
|
|
33
|
-
enableTouchFeedback,
|
|
34
|
-
enableGestureHints,
|
|
35
|
-
enableTouchSounds,
|
|
36
|
-
enableHapticFeedback,
|
|
37
|
-
touchFeedbackDelay,
|
|
38
|
-
gestureHintTimeout,
|
|
39
|
-
maxTouchPoints,
|
|
53
|
+
const defaultConfig: MobileTouchConfig = {
|
|
54
|
+
enableTouchFeedback: true,
|
|
55
|
+
enableGestureHints: true,
|
|
56
|
+
enableTouchSounds: false,
|
|
57
|
+
enableHapticFeedback: true,
|
|
58
|
+
touchFeedbackDelay: 100,
|
|
59
|
+
gestureHintTimeout: 3000,
|
|
60
|
+
maxTouchPoints: 5,
|
|
40
61
|
...config
|
|
41
62
|
}
|
|
42
63
|
|
|
43
64
|
// Device info available if needed for future enhancements
|
|
44
65
|
// const device = useDevice()
|
|
45
66
|
const [mobileTouchState, setMobileTouchState] = useState<MobileTouchState>({
|
|
46
|
-
isActive,
|
|
47
|
-
touchCount,
|
|
48
|
-
currentFeedback
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
67
|
+
isActive: false,
|
|
68
|
+
touchCount: 0,
|
|
69
|
+
currentFeedback: {
|
|
70
|
+
isPressed: false,
|
|
71
|
+
feedbackType: 'none',
|
|
72
|
+
feedbackIntensity: 'medium',
|
|
73
|
+
lastTouchPosition: null
|
|
74
|
+
},
|
|
75
|
+
activeGestureHints: [],
|
|
76
|
+
deviceCapabilities: {
|
|
77
|
+
supportsTouch: false,
|
|
78
|
+
supportsHaptics: false,
|
|
79
|
+
supportsAudio: false,
|
|
80
|
+
maxTouchPoints: 0
|
|
81
|
+
}
|
|
57
82
|
})
|
|
58
83
|
|
|
59
84
|
const touchStartTimeRef = useRef<number>(0)
|
|
@@ -64,14 +89,16 @@ export const useMobileTouch = (
|
|
|
64
89
|
// Initialize device capabilities
|
|
65
90
|
useEffect(() => {
|
|
66
91
|
const capabilities = {
|
|
67
|
-
supportsTouch,
|
|
68
|
-
supportsHaptics,
|
|
69
|
-
supportsAudio,
|
|
70
|
-
maxTouchPoints
|
|
92
|
+
supportsTouch: 'ontouchstart' in window,
|
|
93
|
+
supportsHaptics: 'vibrate' in navigator,
|
|
94
|
+
supportsAudio: 'AudioContext' in window || 'webkitAudioContext' in window,
|
|
95
|
+
maxTouchPoints: navigator.maxTouchPoints || 0
|
|
96
|
+
}
|
|
71
97
|
|
|
72
98
|
setMobileTouchState(prev => ({
|
|
73
99
|
...prev,
|
|
74
|
-
deviceCapabilities
|
|
100
|
+
deviceCapabilities: capabilities
|
|
101
|
+
}))
|
|
75
102
|
|
|
76
103
|
// Initialize audio context if supported
|
|
77
104
|
if (capabilities.supportsAudio) {
|
|
@@ -80,23 +107,24 @@ export const useMobileTouch = (
|
|
|
80
107
|
}, [])
|
|
81
108
|
|
|
82
109
|
// Trigger haptic feedback
|
|
83
|
-
const triggerHapticFeedback = useCallback((intensity= 'medium') => {
|
|
110
|
+
const triggerHapticFeedback = useCallback((intensity: 'light' | 'medium' | 'strong' = 'medium') => {
|
|
84
111
|
if (!defaultConfig.enableHapticFeedback || !mobileTouchState.deviceCapabilities.supportsHaptics) return
|
|
85
112
|
|
|
86
113
|
const vibrationPattern = {
|
|
87
|
-
light,
|
|
88
|
-
medium,
|
|
89
|
-
strong
|
|
114
|
+
light: 20,
|
|
115
|
+
medium: 50,
|
|
116
|
+
strong: 100
|
|
117
|
+
}
|
|
90
118
|
|
|
91
119
|
try {
|
|
92
120
|
navigator.vibrate(vibrationPattern[intensity])
|
|
93
121
|
} catch (error) {
|
|
94
|
-
console.warn('Haptic feedback not supported, error)
|
|
122
|
+
console.warn('Haptic feedback not supported:', error)
|
|
95
123
|
}
|
|
96
124
|
}, [defaultConfig.enableHapticFeedback, mobileTouchState.deviceCapabilities.supportsHaptics])
|
|
97
125
|
|
|
98
126
|
// Trigger touch sound
|
|
99
|
-
const triggerTouchSound = useCallback((type= 'tap') => {
|
|
127
|
+
const triggerTouchSound = useCallback((type: 'tap' | 'press' | 'release' = 'tap') => {
|
|
100
128
|
if (!defaultConfig.enableTouchSounds || !audioContextRef.current) return
|
|
101
129
|
|
|
102
130
|
try {
|
|
@@ -109,9 +137,9 @@ export const useMobileTouch = (
|
|
|
109
137
|
|
|
110
138
|
// Different sounds for different touch types
|
|
111
139
|
const soundConfig = {
|
|
112
|
-
tap, duration, volume},
|
|
113
|
-
press, duration, volume},
|
|
114
|
-
release, duration, volume}
|
|
140
|
+
tap: { frequency: 800, duration: 0.1, volume: 0.1 },
|
|
141
|
+
press: { frequency: 600, duration: 0.2, volume: 0.15 },
|
|
142
|
+
release: { frequency: 1000, duration: 0.08, volume: 0.08 }
|
|
115
143
|
}
|
|
116
144
|
|
|
117
145
|
const config = soundConfig[type]
|
|
@@ -121,32 +149,32 @@ export const useMobileTouch = (
|
|
|
121
149
|
oscillator.start(audioContext.currentTime)
|
|
122
150
|
oscillator.stop(audioContext.currentTime + config.duration)
|
|
123
151
|
} catch (error) {
|
|
124
|
-
console.warn('Touch sound not supported, error)
|
|
152
|
+
console.warn('Touch sound not supported:', error)
|
|
125
153
|
}
|
|
126
154
|
}, [defaultConfig.enableTouchSounds])
|
|
127
155
|
|
|
128
156
|
// Update touch feedback state
|
|
129
|
-
const updateTouchFeedback = useCallback((feedback) => {
|
|
157
|
+
const updateTouchFeedback = useCallback((feedback: Partial<TouchFeedbackState>) => {
|
|
130
158
|
setMobileTouchState(prev => ({
|
|
131
159
|
...prev,
|
|
132
|
-
currentFeedback, ...feedback }
|
|
160
|
+
currentFeedback: { ...prev.currentFeedback, ...feedback }
|
|
133
161
|
}))
|
|
134
162
|
|
|
135
163
|
callbacks.onTouchFeedback?.(mobileTouchState.currentFeedback)
|
|
136
164
|
}, [callbacks, mobileTouchState.currentFeedback])
|
|
137
165
|
|
|
138
166
|
// Add gesture hint
|
|
139
|
-
const addGestureHint = useCallback((hint, 'timeout'>) => {
|
|
167
|
+
const addGestureHint = useCallback((hint: Omit<GestureHint, 'timeout'>) => {
|
|
140
168
|
if (!defaultConfig.enableGestureHints) return
|
|
141
169
|
|
|
142
170
|
const hintWithTimeout = {
|
|
143
171
|
...hint,
|
|
144
|
-
timeout) + defaultConfig.gestureHintTimeout
|
|
172
|
+
timeout: Date.now() + defaultConfig.gestureHintTimeout
|
|
145
173
|
}
|
|
146
174
|
|
|
147
175
|
setMobileTouchState(prev => ({
|
|
148
176
|
...prev,
|
|
149
|
-
activeGestureHints, hintWithTimeout]
|
|
177
|
+
activeGestureHints: [...prev.activeGestureHints, hintWithTimeout]
|
|
150
178
|
}))
|
|
151
179
|
|
|
152
180
|
// Set timer to remove hint
|
|
@@ -159,10 +187,10 @@ export const useMobileTouch = (
|
|
|
159
187
|
}, [defaultConfig.enableGestureHints, defaultConfig.gestureHintTimeout, callbacks])
|
|
160
188
|
|
|
161
189
|
// Remove gesture hint
|
|
162
|
-
const removeGestureHint = useCallback((type) => {
|
|
190
|
+
const removeGestureHint = useCallback((type: string) => {
|
|
163
191
|
setMobileTouchState(prev => ({
|
|
164
192
|
...prev,
|
|
165
|
-
activeGestureHints=> hint.type !== type)
|
|
193
|
+
activeGestureHints: prev.activeGestureHints.filter(hint => hint.type !== type)
|
|
166
194
|
}))
|
|
167
195
|
|
|
168
196
|
const timer = gestureHintTimersRef.current.get(type)
|
|
@@ -173,30 +201,33 @@ export const useMobileTouch = (
|
|
|
173
201
|
}, [])
|
|
174
202
|
|
|
175
203
|
// Handle touch start
|
|
176
|
-
const handleTouchStart = useCallback((event) => {
|
|
204
|
+
const handleTouchStart = useCallback((event: TouchEvent) => {
|
|
177
205
|
const touch = event.touches[0]
|
|
178
|
-
const position = { x, y}
|
|
206
|
+
const position = { x: touch.clientX, y: touch.clientY }
|
|
179
207
|
|
|
180
208
|
touchStartTimeRef.current = Date.now()
|
|
181
209
|
|
|
182
210
|
setMobileTouchState(prev => ({
|
|
183
211
|
...prev,
|
|
184
|
-
isActive,
|
|
185
|
-
touchCount
|
|
212
|
+
isActive: true,
|
|
213
|
+
touchCount: event.touches.length
|
|
214
|
+
}))
|
|
186
215
|
|
|
187
216
|
// Update feedback state
|
|
188
217
|
if (defaultConfig.enableTouchFeedback) {
|
|
189
218
|
updateTouchFeedback({
|
|
190
|
-
isPressed,
|
|
191
|
-
feedbackType,
|
|
192
|
-
feedbackIntensity,
|
|
193
|
-
lastTouchPosition
|
|
219
|
+
isPressed: true,
|
|
220
|
+
feedbackType: 'scale',
|
|
221
|
+
feedbackIntensity: 'medium',
|
|
222
|
+
lastTouchPosition: position
|
|
223
|
+
})
|
|
194
224
|
|
|
195
225
|
// Set feedback timer
|
|
196
226
|
touchFeedbackTimerRef.current = setTimeout(() => {
|
|
197
227
|
updateTouchFeedback({
|
|
198
|
-
feedbackType,
|
|
199
|
-
feedbackIntensity
|
|
228
|
+
feedbackType: 'ripple',
|
|
229
|
+
feedbackIntensity: 'strong'
|
|
230
|
+
})
|
|
200
231
|
}, defaultConfig.touchFeedbackDelay)
|
|
201
232
|
}
|
|
202
233
|
|
|
@@ -208,23 +239,24 @@ export const useMobileTouch = (
|
|
|
208
239
|
}, [defaultConfig.enableTouchFeedback, defaultConfig.touchFeedbackDelay, updateTouchFeedback, triggerHapticFeedback, triggerTouchSound, callbacks])
|
|
209
240
|
|
|
210
241
|
// Handle touch move
|
|
211
|
-
const handleTouchMove = useCallback((event) => {
|
|
242
|
+
const handleTouchMove = useCallback((event: TouchEvent) => {
|
|
212
243
|
const touch = event.touches[0]
|
|
213
|
-
const position = { x, y}
|
|
244
|
+
const position = { x: touch.clientX, y: touch.clientY }
|
|
214
245
|
|
|
215
246
|
// Update feedback state
|
|
216
247
|
if (defaultConfig.enableTouchFeedback) {
|
|
217
248
|
updateTouchFeedback({
|
|
218
|
-
lastTouchPosition
|
|
249
|
+
lastTouchPosition: position
|
|
250
|
+
})
|
|
219
251
|
}
|
|
220
252
|
|
|
221
253
|
callbacks.onTouchMove?.(position)
|
|
222
254
|
}, [defaultConfig.enableTouchFeedback, updateTouchFeedback, callbacks])
|
|
223
255
|
|
|
224
256
|
// Handle touch end
|
|
225
|
-
const handleTouchEnd = useCallback((event) => {
|
|
257
|
+
const handleTouchEnd = useCallback((event: TouchEvent) => {
|
|
226
258
|
const touch = event.changedTouches[0]
|
|
227
|
-
const position = { x, y}
|
|
259
|
+
const position = { x: touch.clientX, y: touch.clientY }
|
|
228
260
|
const touchDuration = Date.now() - touchStartTimeRef.current
|
|
229
261
|
|
|
230
262
|
// Clear feedback timer
|
|
@@ -236,9 +268,10 @@ export const useMobileTouch = (
|
|
|
236
268
|
// Update feedback state
|
|
237
269
|
if (defaultConfig.enableTouchFeedback) {
|
|
238
270
|
updateTouchFeedback({
|
|
239
|
-
isPressed,
|
|
240
|
-
feedbackType,
|
|
241
|
-
feedbackIntensity
|
|
271
|
+
isPressed: false,
|
|
272
|
+
feedbackType: 'none',
|
|
273
|
+
feedbackIntensity: 'medium'
|
|
274
|
+
})
|
|
242
275
|
}
|
|
243
276
|
|
|
244
277
|
// Determine touch type and provide appropriate feedback
|
|
@@ -249,8 +282,8 @@ export const useMobileTouch = (
|
|
|
249
282
|
|
|
250
283
|
// Show tap hint
|
|
251
284
|
addGestureHint({
|
|
252
|
-
type,
|
|
253
|
-
message,
|
|
285
|
+
type: 'tap',
|
|
286
|
+
message: 'Quick tap detected',
|
|
254
287
|
position
|
|
255
288
|
})
|
|
256
289
|
} else if (touchDuration > 500) {
|
|
@@ -260,8 +293,8 @@ export const useMobileTouch = (
|
|
|
260
293
|
|
|
261
294
|
// Show long press hint
|
|
262
295
|
addGestureHint({
|
|
263
|
-
type,
|
|
264
|
-
message,
|
|
296
|
+
type: 'longPress',
|
|
297
|
+
message: 'Long press detected',
|
|
265
298
|
position
|
|
266
299
|
})
|
|
267
300
|
} else {
|
|
@@ -272,8 +305,8 @@ export const useMobileTouch = (
|
|
|
272
305
|
|
|
273
306
|
setMobileTouchState(prev => ({
|
|
274
307
|
...prev,
|
|
275
|
-
isActive,
|
|
276
|
-
touchCount, prev.touchCount - 1)
|
|
308
|
+
isActive: false,
|
|
309
|
+
touchCount: Math.max(0, prev.touchCount - 1)
|
|
277
310
|
}))
|
|
278
311
|
|
|
279
312
|
callbacks.onTouchEnd?.(position)
|
|
@@ -284,9 +317,9 @@ export const useMobileTouch = (
|
|
|
284
317
|
const element = elementRef.current
|
|
285
318
|
if (!element || !mobileTouchState.deviceCapabilities.supportsTouch) return
|
|
286
319
|
|
|
287
|
-
element.addEventListener('touchstart', handleTouchStart, { passive})
|
|
288
|
-
element.addEventListener('touchmove', handleTouchMove, { passive})
|
|
289
|
-
element.addEventListener('touchend', handleTouchEnd, { passive})
|
|
320
|
+
element.addEventListener('touchstart', handleTouchStart, { passive: false })
|
|
321
|
+
element.addEventListener('touchmove', handleTouchMove, { passive: false })
|
|
322
|
+
element.addEventListener('touchend', handleTouchEnd, { passive: false })
|
|
290
323
|
|
|
291
324
|
return () => {
|
|
292
325
|
element.removeEventListener('touchstart', handleTouchStart)
|
|
@@ -328,7 +361,7 @@ export const useMobileTouch = (
|
|
|
328
361
|
|
|
329
362
|
setMobileTouchState(prev => ({
|
|
330
363
|
...prev,
|
|
331
|
-
activeGestureHints]
|
|
364
|
+
activeGestureHints: []
|
|
332
365
|
}))
|
|
333
366
|
}, [])
|
|
334
367
|
|
|
@@ -361,19 +394,21 @@ export const useMobileTouch = (
|
|
|
361
394
|
}
|
|
362
395
|
|
|
363
396
|
// Convenience hook for basic mobile touch
|
|
364
|
-
export const useBasicMobileTouch = (elementRef) => {
|
|
397
|
+
export const useBasicMobileTouch = (elementRef: React.RefObject<HTMLElement>) => {
|
|
365
398
|
return useMobileTouch(elementRef, {}, {
|
|
366
|
-
enableTouchFeedback,
|
|
367
|
-
enableGestureHints,
|
|
368
|
-
enableTouchSounds,
|
|
369
|
-
enableHapticFeedback
|
|
399
|
+
enableTouchFeedback: true,
|
|
400
|
+
enableGestureHints: false,
|
|
401
|
+
enableTouchSounds: false,
|
|
402
|
+
enableHapticFeedback: true
|
|
403
|
+
})
|
|
370
404
|
}
|
|
371
405
|
|
|
372
406
|
// Convenience hook for enhanced mobile touch
|
|
373
|
-
export const useEnhancedMobileTouch = (elementRef) => {
|
|
407
|
+
export const useEnhancedMobileTouch = (elementRef: React.RefObject<HTMLElement>) => {
|
|
374
408
|
return useMobileTouch(elementRef, {}, {
|
|
375
|
-
enableTouchFeedback,
|
|
376
|
-
enableGestureHints,
|
|
377
|
-
enableTouchSounds,
|
|
378
|
-
enableHapticFeedback
|
|
409
|
+
enableTouchFeedback: true,
|
|
410
|
+
enableGestureHints: true,
|
|
411
|
+
enableTouchSounds: true,
|
|
412
|
+
enableHapticFeedback: true
|
|
413
|
+
})
|
|
379
414
|
}
|