@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.
Files changed (306) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/components/ui/accessibility-demo.esm.js +30 -24
  3. package/dist/components/ui/accessibility-demo.js +30 -24
  4. package/dist/components/ui/advanced-component-architecture-demo.esm.js +235 -179
  5. package/dist/components/ui/advanced-component-architecture-demo.js +235 -179
  6. package/dist/components/ui/advanced-transition-system-demo.esm.js +110 -64
  7. package/dist/components/ui/advanced-transition-system-demo.js +110 -64
  8. package/dist/components/ui/advanced-transition-system.esm.js +166 -122
  9. package/dist/components/ui/advanced-transition-system.js +166 -122
  10. package/dist/components/ui/animation/animated-container.esm.js +52 -29
  11. package/dist/components/ui/animation/animated-container.js +52 -29
  12. package/dist/components/ui/animation/staggered-container.esm.js +18 -9
  13. package/dist/components/ui/animation/staggered-container.js +18 -9
  14. package/dist/components/ui/animation-demo.esm.js +67 -35
  15. package/dist/components/ui/animation-demo.js +67 -35
  16. package/dist/components/ui/badge.esm.js +9 -6
  17. package/dist/components/ui/badge.js +9 -6
  18. package/dist/components/ui/battery-conscious-animation-demo.esm.js +122 -87
  19. package/dist/components/ui/battery-conscious-animation-demo.js +122 -87
  20. package/dist/components/ui/border-radius-shadow-demo.esm.js +23 -12
  21. package/dist/components/ui/border-radius-shadow-demo.js +23 -12
  22. package/dist/components/ui/button.esm.js +8 -2
  23. package/dist/components/ui/button.js +8 -2
  24. package/dist/components/ui/card.esm.js +33 -8
  25. package/dist/components/ui/card.js +33 -8
  26. package/dist/components/ui/checkbox.esm.js +3 -3
  27. package/dist/components/ui/checkbox.js +3 -3
  28. package/dist/components/ui/color-preview.esm.js +68 -45
  29. package/dist/components/ui/color-preview.js +68 -45
  30. package/dist/components/ui/data-display/chart.esm.js +112 -84
  31. package/dist/components/ui/data-display/chart.js +112 -84
  32. package/dist/components/ui/data-display/data-grid-simple.esm.js +1 -1
  33. package/dist/components/ui/data-display/data-grid-simple.js +1 -1
  34. package/dist/components/ui/data-display/data-grid.esm.js +80 -67
  35. package/dist/components/ui/data-display/data-grid.js +80 -67
  36. package/dist/components/ui/data-display/list.esm.js +53 -45
  37. package/dist/components/ui/data-display/list.js +53 -45
  38. package/dist/components/ui/data-display/table.esm.js +62 -54
  39. package/dist/components/ui/data-display/table.js +62 -54
  40. package/dist/components/ui/data-display/timeline.esm.js +39 -34
  41. package/dist/components/ui/data-display/timeline.js +39 -34
  42. package/dist/components/ui/data-display/tree.esm.js +116 -84
  43. package/dist/components/ui/data-display/tree.js +116 -84
  44. package/dist/components/ui/data-display/types.esm.js +389 -364
  45. package/dist/components/ui/data-display/types.js +389 -364
  46. package/dist/components/ui/enterprise-mobile-experience-demo.esm.js +120 -70
  47. package/dist/components/ui/enterprise-mobile-experience-demo.js +120 -70
  48. package/dist/components/ui/enterprise-mobile-experience.esm.js +124 -73
  49. package/dist/components/ui/enterprise-mobile-experience.js +124 -73
  50. package/dist/components/ui/feedback/alert.esm.js +22 -15
  51. package/dist/components/ui/feedback/alert.js +22 -15
  52. package/dist/components/ui/feedback/progress.esm.js +47 -24
  53. package/dist/components/ui/feedback/progress.js +47 -24
  54. package/dist/components/ui/feedback/skeleton.esm.js +39 -29
  55. package/dist/components/ui/feedback/skeleton.js +39 -29
  56. package/dist/components/ui/feedback/toast.esm.js +62 -38
  57. package/dist/components/ui/feedback/toast.js +62 -38
  58. package/dist/components/ui/feedback/types.esm.js +83 -83
  59. package/dist/components/ui/feedback/types.js +83 -83
  60. package/dist/components/ui/font-preview.esm.js +41 -39
  61. package/dist/components/ui/font-preview.js +41 -39
  62. package/dist/components/ui/form-demo.esm.js +150 -113
  63. package/dist/components/ui/form-demo.js +150 -113
  64. package/dist/components/ui/hardware-acceleration-demo.esm.js +137 -87
  65. package/dist/components/ui/hardware-acceleration-demo.js +137 -87
  66. package/dist/components/ui/input.esm.js +4 -1
  67. package/dist/components/ui/input.js +4 -1
  68. package/dist/components/ui/layout-demo.esm.js +81 -56
  69. package/dist/components/ui/layout-demo.js +81 -56
  70. package/dist/components/ui/layouts/adaptive-layout.esm.js +27 -8
  71. package/dist/components/ui/layouts/adaptive-layout.js +27 -8
  72. package/dist/components/ui/layouts/desktop-layout.esm.js +39 -19
  73. package/dist/components/ui/layouts/desktop-layout.js +39 -19
  74. package/dist/components/ui/layouts/mobile-layout.esm.js +19 -9
  75. package/dist/components/ui/layouts/mobile-layout.js +19 -9
  76. package/dist/components/ui/layouts/tablet-layout.esm.js +28 -14
  77. package/dist/components/ui/layouts/tablet-layout.js +28 -14
  78. package/dist/components/ui/mobile-form-validation.esm.js +120 -87
  79. package/dist/components/ui/mobile-form-validation.js +120 -87
  80. package/dist/components/ui/mobile-input-demo.esm.js +19 -13
  81. package/dist/components/ui/mobile-input-demo.js +19 -13
  82. package/dist/components/ui/mobile-input.esm.js +185 -120
  83. package/dist/components/ui/mobile-input.js +185 -120
  84. package/dist/components/ui/mobile-skeleton-loading-demo.esm.js +128 -111
  85. package/dist/components/ui/mobile-skeleton-loading-demo.js +128 -111
  86. package/dist/components/ui/navigation/breadcrumb.esm.js +17 -14
  87. package/dist/components/ui/navigation/breadcrumb.js +17 -14
  88. package/dist/components/ui/navigation/index.esm.js +0 -1
  89. package/dist/components/ui/navigation/index.js +0 -1
  90. package/dist/components/ui/navigation/menu.esm.js +49 -35
  91. package/dist/components/ui/navigation/menu.js +49 -35
  92. package/dist/components/ui/navigation/navigation-demo.esm.js +81 -74
  93. package/dist/components/ui/navigation/navigation-demo.js +81 -74
  94. package/dist/components/ui/navigation/pagination.esm.js +62 -50
  95. package/dist/components/ui/navigation/pagination.js +62 -50
  96. package/dist/components/ui/navigation/sidebar.esm.js +56 -42
  97. package/dist/components/ui/navigation/sidebar.js +56 -42
  98. package/dist/components/ui/navigation/stepper.esm.js +34 -23
  99. package/dist/components/ui/navigation/stepper.js +34 -23
  100. package/dist/components/ui/navigation/tabs.esm.js +32 -21
  101. package/dist/components/ui/navigation/tabs.js +32 -21
  102. package/dist/components/ui/navigation/types.esm.js +196 -195
  103. package/dist/components/ui/navigation/types.js +196 -195
  104. package/dist/components/ui/overlay/backdrop.esm.js +17 -16
  105. package/dist/components/ui/overlay/backdrop.js +17 -16
  106. package/dist/components/ui/overlay/focus-manager.esm.js +21 -19
  107. package/dist/components/ui/overlay/focus-manager.js +21 -19
  108. package/dist/components/ui/overlay/index.esm.js +0 -2
  109. package/dist/components/ui/overlay/index.js +0 -2
  110. package/dist/components/ui/overlay/modal.esm.js +38 -34
  111. package/dist/components/ui/overlay/modal.js +38 -34
  112. package/dist/components/ui/overlay/overlay-manager.esm.js +25 -20
  113. package/dist/components/ui/overlay/overlay-manager.js +25 -20
  114. package/dist/components/ui/overlay/popover.esm.js +74 -58
  115. package/dist/components/ui/overlay/popover.js +74 -58
  116. package/dist/components/ui/overlay/portal.esm.js +7 -7
  117. package/dist/components/ui/overlay/portal.js +7 -7
  118. package/dist/components/ui/overlay/tooltip.esm.js +54 -39
  119. package/dist/components/ui/overlay/tooltip.js +54 -39
  120. package/dist/components/ui/overlay/types.esm.js +132 -131
  121. package/dist/components/ui/overlay/types.js +132 -131
  122. package/dist/components/ui/performance-demo.esm.js +135 -88
  123. package/dist/components/ui/performance-demo.js +135 -88
  124. package/dist/components/ui/semantic-input-system-demo.esm.js +117 -80
  125. package/dist/components/ui/semantic-input-system-demo.js +117 -80
  126. package/dist/components/ui/theme-customizer.esm.js +84 -52
  127. package/dist/components/ui/theme-customizer.js +84 -52
  128. package/dist/components/ui/theme-preview.esm.js +95 -43
  129. package/dist/components/ui/theme-preview.js +95 -43
  130. package/dist/components/ui/theme-switcher.esm.js +70 -44
  131. package/dist/components/ui/theme-switcher.js +70 -44
  132. package/dist/components/ui/theme-toggle.esm.js +3 -3
  133. package/dist/components/ui/theme-toggle.js +3 -3
  134. package/dist/components/ui/token-demo.esm.js +33 -21
  135. package/dist/components/ui/token-demo.js +33 -21
  136. package/dist/components/ui/touch-demo.esm.js +102 -73
  137. package/dist/components/ui/touch-demo.js +102 -73
  138. package/dist/components/ui/touch-friendly-interface-demo.esm.js +102 -64
  139. package/dist/components/ui/touch-friendly-interface-demo.js +102 -64
  140. package/dist/components/ui/touch-friendly-interface.esm.js +85 -61
  141. package/dist/components/ui/touch-friendly-interface.js +85 -61
  142. package/dist/hooks/use-accessibility-support.esm.js +115 -85
  143. package/dist/hooks/use-accessibility-support.js +115 -85
  144. package/dist/hooks/use-adaptive-layout.esm.js +56 -33
  145. package/dist/hooks/use-adaptive-layout.js +56 -33
  146. package/dist/hooks/use-advanced-patterns.esm.js +57 -42
  147. package/dist/hooks/use-advanced-patterns.js +57 -42
  148. package/dist/hooks/use-advanced-transition-system.esm.js +112 -71
  149. package/dist/hooks/use-advanced-transition-system.js +112 -71
  150. package/dist/hooks/use-animation-profile.esm.js +63 -34
  151. package/dist/hooks/use-animation-profile.js +63 -34
  152. package/dist/hooks/use-battery-animations.esm.js +80 -55
  153. package/dist/hooks/use-battery-animations.js +80 -55
  154. package/dist/hooks/use-battery-conscious-loading.esm.js +166 -123
  155. package/dist/hooks/use-battery-conscious-loading.js +166 -123
  156. package/dist/hooks/use-battery-optimization.esm.js +78 -55
  157. package/dist/hooks/use-battery-optimization.js +78 -55
  158. package/dist/hooks/use-battery-status.esm.js +73 -51
  159. package/dist/hooks/use-battery-status.js +73 -51
  160. package/dist/hooks/use-component-performance.esm.js +62 -47
  161. package/dist/hooks/use-component-performance.js +62 -47
  162. package/dist/hooks/use-device-loading-states.esm.js +152 -109
  163. package/dist/hooks/use-device-loading-states.js +152 -109
  164. package/dist/hooks/use-device.esm.js +25 -14
  165. package/dist/hooks/use-device.js +25 -14
  166. package/dist/hooks/use-enterprise-mobile-experience.esm.js +137 -88
  167. package/dist/hooks/use-enterprise-mobile-experience.js +137 -88
  168. package/dist/hooks/use-form-feedback.esm.js +124 -81
  169. package/dist/hooks/use-form-feedback.js +124 -81
  170. package/dist/hooks/use-form-performance.esm.js +127 -92
  171. package/dist/hooks/use-form-performance.js +127 -92
  172. package/dist/hooks/use-frame-rate.esm.js +56 -37
  173. package/dist/hooks/use-frame-rate.js +56 -37
  174. package/dist/hooks/use-gestures.esm.js +96 -72
  175. package/dist/hooks/use-gestures.js +96 -72
  176. package/dist/hooks/use-hardware-acceleration.esm.js +65 -37
  177. package/dist/hooks/use-hardware-acceleration.js +65 -37
  178. package/dist/hooks/use-input-accessibility.esm.js +157 -119
  179. package/dist/hooks/use-input-accessibility.js +157 -119
  180. package/dist/hooks/use-input-performance.esm.js +139 -104
  181. package/dist/hooks/use-input-performance.js +139 -104
  182. package/dist/hooks/use-layout-performance.esm.js +50 -29
  183. package/dist/hooks/use-layout-performance.js +50 -29
  184. package/dist/hooks/use-loading-accessibility.esm.js +209 -169
  185. package/dist/hooks/use-loading-accessibility.js +209 -169
  186. package/dist/hooks/use-loading-performance.esm.js +117 -93
  187. package/dist/hooks/use-loading-performance.js +117 -93
  188. package/dist/hooks/use-memory-usage.esm.js +57 -38
  189. package/dist/hooks/use-memory-usage.js +57 -38
  190. package/dist/hooks/use-mobile-form-layout.esm.js +111 -74
  191. package/dist/hooks/use-mobile-form-layout.js +111 -74
  192. package/dist/hooks/use-mobile-form-validation.esm.js +211 -144
  193. package/dist/hooks/use-mobile-form-validation.js +211 -144
  194. package/dist/hooks/use-mobile-keyboard-optimization.esm.js +154 -113
  195. package/dist/hooks/use-mobile-keyboard-optimization.js +154 -113
  196. package/dist/hooks/use-mobile-layout.esm.js +73 -51
  197. package/dist/hooks/use-mobile-layout.js +73 -51
  198. package/dist/hooks/use-mobile-optimization.esm.js +72 -44
  199. package/dist/hooks/use-mobile-optimization.js +72 -44
  200. package/dist/hooks/use-mobile-skeleton.esm.js +97 -64
  201. package/dist/hooks/use-mobile-skeleton.js +97 -64
  202. package/dist/hooks/use-mobile-touch.esm.js +128 -93
  203. package/dist/hooks/use-mobile-touch.js +128 -93
  204. package/dist/hooks/use-performance-throttling.esm.js +72 -48
  205. package/dist/hooks/use-performance-throttling.js +72 -48
  206. package/dist/hooks/use-performance.esm.js +90 -52
  207. package/dist/hooks/use-performance.js +90 -52
  208. package/dist/hooks/use-reusable-architecture.esm.js +94 -65
  209. package/dist/hooks/use-reusable-architecture.js +94 -65
  210. package/dist/hooks/use-semantic-input-types.esm.js +166 -124
  211. package/dist/hooks/use-semantic-input-types.js +166 -124
  212. package/dist/hooks/use-semantic-input.esm.js +178 -126
  213. package/dist/hooks/use-semantic-input.js +178 -126
  214. package/dist/hooks/use-tablet-layout.esm.js +67 -38
  215. package/dist/hooks/use-tablet-layout.js +67 -38
  216. package/dist/hooks/use-touch-friendly-input.esm.js +193 -149
  217. package/dist/hooks/use-touch-friendly-input.js +193 -149
  218. package/dist/hooks/use-touch-friendly-interface.esm.js +99 -67
  219. package/dist/hooks/use-touch-friendly-interface.js +99 -67
  220. package/dist/hooks/use-touch-optimization.esm.js +99 -72
  221. package/dist/hooks/use-touch-optimization.js +99 -72
  222. package/dist/index.esm.js +157 -281
  223. package/dist/index.js +157 -281
  224. package/dist/lib/utils.esm.js +1 -1
  225. package/dist/lib/utils.js +1 -1
  226. package/dist/plugins/theme-css-generator.esm.js +104 -55
  227. package/dist/plugins/theme-css-generator.js +104 -55
  228. package/dist/provider.esm.js +4 -4
  229. package/dist/provider.js +4 -4
  230. package/dist/styles.css +1 -1
  231. package/dist/theme.esm.js +633 -468
  232. package/dist/theme.js +633 -468
  233. package/dist/themes/ThemeContext.esm.js +15 -15
  234. package/dist/themes/ThemeContext.js +15 -15
  235. package/dist/themes/ThemeProvider.esm.js +25 -22
  236. package/dist/themes/ThemeProvider.js +25 -22
  237. package/dist/themes/accessibility.esm.js +147 -108
  238. package/dist/themes/accessibility.js +147 -108
  239. package/dist/themes/aria-patterns.esm.js +198 -162
  240. package/dist/themes/aria-patterns.js +198 -162
  241. package/dist/themes/base-themes.esm.js +14 -11
  242. package/dist/themes/base-themes.js +14 -11
  243. package/dist/themes/colorManager.esm.js +101 -83
  244. package/dist/themes/colorManager.js +101 -83
  245. package/dist/themes/examples/dark-theme.esm.js +133 -103
  246. package/dist/themes/examples/dark-theme.js +133 -103
  247. package/dist/themes/examples/minimal-theme.esm.js +83 -61
  248. package/dist/themes/examples/minimal-theme.js +83 -61
  249. package/dist/themes/focus-management.esm.js +202 -143
  250. package/dist/themes/focus-management.js +202 -143
  251. package/dist/themes/fontLoader.esm.js +28 -19
  252. package/dist/themes/fontLoader.js +28 -19
  253. package/dist/themes/high-contrast.esm.js +152 -104
  254. package/dist/themes/high-contrast.js +152 -104
  255. package/dist/themes/index.esm.js +1 -1
  256. package/dist/themes/index.js +1 -1
  257. package/dist/themes/inheritance.esm.js +35 -27
  258. package/dist/themes/inheritance.js +35 -27
  259. package/dist/themes/keyboard-navigation.esm.js +152 -123
  260. package/dist/themes/keyboard-navigation.js +152 -123
  261. package/dist/themes/motion-reduction.esm.js +193 -133
  262. package/dist/themes/motion-reduction.js +193 -133
  263. package/dist/themes/navigation.esm.js +146 -146
  264. package/dist/themes/navigation.js +146 -146
  265. package/dist/themes/screen-reader.esm.js +159 -94
  266. package/dist/themes/screen-reader.js +159 -94
  267. package/dist/themes/systemThemeDetector.esm.js +42 -34
  268. package/dist/themes/systemThemeDetector.js +42 -34
  269. package/dist/themes/themeCSSUpdater.esm.js +21 -9
  270. package/dist/themes/themeCSSUpdater.js +21 -9
  271. package/dist/themes/themePersistence.esm.js +68 -47
  272. package/dist/themes/themePersistence.js +68 -47
  273. package/dist/themes/themes/stan-design.esm.js +633 -468
  274. package/dist/themes/themes/stan-design.js +633 -468
  275. package/dist/themes/types.esm.js +301 -287
  276. package/dist/themes/types.js +301 -287
  277. package/dist/themes/useSystemTheme.esm.js +4 -4
  278. package/dist/themes/useSystemTheme.js +4 -4
  279. package/dist/themes/useTheme.esm.js +4 -4
  280. package/dist/themes/useTheme.js +4 -4
  281. package/dist/themes/validation.esm.js +128 -77
  282. package/dist/themes/validation.js +128 -77
  283. package/dist/tokens/index.esm.js +1 -2
  284. package/dist/tokens/index.js +1 -2
  285. package/dist/tokens/tokenExporter.esm.js +87 -61
  286. package/dist/tokens/tokenExporter.js +87 -61
  287. package/dist/tokens/tokenGenerator.esm.js +86 -77
  288. package/dist/tokens/tokenGenerator.js +86 -77
  289. package/dist/tokens/tokenManager.esm.js +64 -51
  290. package/dist/tokens/tokenManager.js +64 -51
  291. package/dist/tokens/tokenValidator.esm.js +193 -147
  292. package/dist/tokens/tokenValidator.js +193 -147
  293. package/dist/tokens/types.esm.js +49 -35
  294. package/dist/tokens/types.js +49 -35
  295. package/dist/utils/bundle-analyzer.esm.js +83 -65
  296. package/dist/utils/bundle-analyzer.js +83 -65
  297. package/dist/utils/bundle-splitting.esm.js +142 -117
  298. package/dist/utils/bundle-splitting.js +142 -117
  299. package/dist/utils/lazy-loading.esm.js +132 -106
  300. package/dist/utils/lazy-loading.js +132 -106
  301. package/dist/utils/performance-monitor.esm.js +170 -129
  302. package/dist/utils/performance-monitor.js +170 -129
  303. package/dist/utils/tree-shaking.esm.js +69 -61
  304. package/dist/utils/tree-shaking.js +69 -61
  305. package/package.json +1 -1
  306. package/src/index.ts +146 -146
@@ -1,28 +1,44 @@
1
1
  import { useState, useEffect, useCallback, useRef, useMemo } from 'react'
2
2
 
3
3
  export interface FrameRateMetrics {
4
- fps}
4
+ fps: number
5
+ frameTime: number
6
+ frameCount: number
7
+ averageFPS: number
8
+ minFPS: number
9
+ maxFPS: number
10
+ droppedFrames: number
11
+ performanceScore: 'excellent' | 'good' | 'fair' | 'poor'
12
+ }
5
13
 
6
14
  export interface FrameRateThresholds {
7
- warning}
15
+ warning: number
16
+ critical: number
17
+ excellent: number
18
+ }
8
19
 
9
20
  export interface FrameRateCallbacks {
10
- onFPSWarning?) => void
11
- onFPSDrop?, previousFPS) => void
12
- onPerformanceScoreChange?]) => void
21
+ onFPSWarning?: (fps: number) => void
22
+ onFPSDrop?: (fps: number, previousFPS: number) => void
23
+ onPerformanceScoreChange?: (score: FrameRateMetrics['performanceScore']) => void
13
24
  }
14
25
 
15
26
  export interface FrameRateOptions {
16
- updateInterval?}
27
+ updateInterval?: number
28
+ sampleSize?: number
29
+ thresholds?: Partial<FrameRateThresholds>
30
+ callbacks?: FrameRateCallbacks
31
+ }
17
32
 
18
- const DEFAULT_THRESHOLDS= {
19
- warning,
20
- critical,
21
- excellent}
33
+ const DEFAULT_THRESHOLDS: FrameRateThresholds = {
34
+ warning: 45,
35
+ critical: 30,
36
+ excellent: 55
37
+ }
22
38
 
23
39
  const DEFAULT_SAMPLE_SIZE = 60 // 1 second at 60fps
24
40
 
25
- export const useFrameRate = (options= {}) => {
41
+ export const useFrameRate = (options: FrameRateOptions = {}) => {
26
42
  const {
27
43
  updateInterval = 1000,
28
44
  sampleSize = DEFAULT_SAMPLE_SIZE,
@@ -31,14 +47,15 @@ export const useFrameRate = (options= {}) => {
31
47
  } = options
32
48
 
33
49
  const [metrics, setMetrics] = useState<FrameRateMetrics>({
34
- fps,
35
- frameTime,
36
- frameCount,
37
- averageFPS,
38
- minFPS,
39
- maxFPS,
40
- droppedFrames,
41
- performanceScore})
50
+ fps: 60,
51
+ frameTime: 16.67,
52
+ frameCount: 0,
53
+ averageFPS: 60,
54
+ minFPS: 60,
55
+ maxFPS: 60,
56
+ droppedFrames: 0,
57
+ performanceScore: 'excellent'
58
+ })
42
59
 
43
60
  const [isMonitoring, setIsMonitoring] = useState(false)
44
61
  const frameCountRef = useRef(0)
@@ -55,7 +72,7 @@ export const useFrameRate = (options= {}) => {
55
72
  }), [thresholds])
56
73
 
57
74
  // Calculate performance score based on FPS
58
- const calculatePerformanceScore = useCallback((fps)] => {
75
+ const calculatePerformanceScore = useCallback((fps: number): FrameRateMetrics['performanceScore'] => {
59
76
  if (fps >= finalThresholds.excellent) return 'excellent'
60
77
  if (fps >= finalThresholds.warning) return 'good'
61
78
  if (fps >= finalThresholds.critical) return 'fair'
@@ -63,7 +80,7 @@ export const useFrameRate = (options= {}) => {
63
80
  }, [finalThresholds])
64
81
 
65
82
  // Update FPS history and calculate statistics
66
- const updateFPSHistory = useCallback((fps) => {
83
+ const updateFPSHistory = useCallback((fps: number) => {
67
84
  fpsHistoryRef.current.push(fps)
68
85
 
69
86
  // Keep only the last sampleSize frames
@@ -82,7 +99,7 @@ export const useFrameRate = (options= {}) => {
82
99
  }, [sampleSize])
83
100
 
84
101
  // Detect dropped frames
85
- const detectDroppedFrames = useCallback((fps, previousFPS) => {
102
+ const detectDroppedFrames = useCallback((fps: number, previousFPS: number) => {
86
103
  if (fps < previousFPS && previousFPS >= finalThresholds.warning) {
87
104
  const drop = previousFPS - fps
88
105
  if (drop > 10) { // Significant drop
@@ -110,10 +127,10 @@ export const useFrameRate = (options= {}) => {
110
127
  // Calculate performance score
111
128
  const performanceScore = calculatePerformanceScore(fps)
112
129
 
113
- const newMetrics= {
130
+ const newMetrics: FrameRateMetrics = {
114
131
  fps,
115
132
  frameTime,
116
- frameCount,
133
+ frameCount: frameCountRef.current,
117
134
  averageFPS,
118
135
  minFPS,
119
136
  maxFPS,
@@ -172,10 +189,11 @@ export const useFrameRate = (options= {}) => {
172
189
  fpsHistoryRef.current = []
173
190
  setMetrics(prev => ({
174
191
  ...prev,
175
- averageFPS,
176
- minFPS,
177
- maxFPS,
178
- droppedFrames}))
192
+ averageFPS: 60,
193
+ minFPS: 60,
194
+ maxFPS: 60,
195
+ droppedFrames: 0
196
+ }))
179
197
  }, [])
180
198
 
181
199
  // Auto-start monitoring on mount
@@ -186,7 +204,7 @@ export const useFrameRate = (options= {}) => {
186
204
 
187
205
  // Performance insights
188
206
  const getPerformanceInsights = useCallback(() => {
189
- const insights] = []
207
+ const insights: string[] = []
190
208
 
191
209
  if (metrics.fps < finalThresholds.critical) {
192
210
  insights.push('Critical FPS drop detected - consider reducing animation complexity')
@@ -216,17 +234,18 @@ export const useFrameRate = (options= {}) => {
216
234
  resetStats,
217
235
 
218
236
  // Performance analysis
219
- performanceScore,
237
+ performanceScore: metrics.performanceScore,
220
238
  getPerformanceInsights,
221
239
 
222
240
  // Raw values
223
- fps,
224
- frameTime,
225
- averageFPS,
226
- minFPS,
227
- maxFPS,
228
- droppedFrames,
241
+ fps: metrics.fps,
242
+ frameTime: metrics.frameTime,
243
+ averageFPS: metrics.averageFPS,
244
+ minFPS: metrics.minFPS,
245
+ maxFPS: metrics.maxFPS,
246
+ droppedFrames: metrics.droppedFrames,
229
247
 
230
248
  // Thresholds
231
- thresholds}
249
+ thresholds: finalThresholds
250
+ }
232
251
  }
@@ -1,50 +1,66 @@
1
1
  import { useState, useEffect, useCallback, useRef, useMemo } from 'react'
2
2
 
3
3
  export interface GestureConfig {
4
- minSwipeDistance}
4
+ minSwipeDistance: number
5
+ maxSwipeTime: number
6
+ minPinchDistance: number
7
+ enableHapticFeedback: boolean
8
+ enableSoundFeedback: boolean
9
+ }
5
10
 
6
11
  export interface SwipeGesture {
7
- direction}
12
+ direction: 'up' | 'down' | 'left' | 'right'
13
+ distance: number
14
+ velocity: number
15
+ duration: number
16
+ }
8
17
 
9
18
  export interface PinchGesture {
10
- scale; y}
11
- distance}
19
+ scale: number
20
+ center: { x: number; y: number }
21
+ distance: number
22
+ }
12
23
 
13
24
  export interface GestureCallbacks {
14
- onSwipe?) => void
15
- onPinch?) => void
16
- onTap?; y}) => void
17
- onLongPress?; y}) => void
18
- onTouchStart?; y}) => void
19
- onTouchEnd?; y}) => void
25
+ onSwipe?: (gesture: SwipeGesture) => void
26
+ onPinch?: (gesture: PinchGesture) => void
27
+ onTap?: (position: { x: number; y: number }) => void
28
+ onLongPress?: (position: { x: number; y: number }) => void
29
+ onTouchStart?: (position: { x: number; y: number }) => void
30
+ onTouchEnd?: (position: { x: number; y: number }) => void
20
31
  }
21
32
 
22
33
  export interface GestureState {
23
- isTracking}
34
+ isTracking: boolean
35
+ currentGesture: 'none' | 'swipe' | 'pinch' | 'tap' | 'longPress'
36
+ lastGesture: SwipeGesture | PinchGesture | null
37
+ touchCount: number
38
+ }
24
39
 
25
40
  export const useGestures = (
26
- elementRef,
27
- callbacks= {},
28
- config= {}
41
+ elementRef: React.RefObject<HTMLElement>,
42
+ callbacks: GestureCallbacks = {},
43
+ config: Partial<GestureConfig> = {}
29
44
  ) => {
30
- const defaultConfig= {
31
- minSwipeDistance,
32
- maxSwipeTime,
33
- minPinchDistance,
34
- enableHapticFeedback,
35
- enableSoundFeedback,
45
+ const defaultConfig: GestureConfig = {
46
+ minSwipeDistance: 50,
47
+ maxSwipeTime: 300,
48
+ minPinchDistance: 20,
49
+ enableHapticFeedback: true,
50
+ enableSoundFeedback: false,
36
51
  ...config
37
52
  }
38
53
 
39
54
  const [gestureState, setGestureState] = useState<GestureState>({
40
- isTracking,
41
- currentGesture,
42
- lastGesture,
43
- touchCount})
55
+ isTracking: false,
56
+ currentGesture: 'none',
57
+ lastGesture: null,
58
+ touchCount: 0
59
+ })
44
60
 
45
- const touchStartRef = useRef<{ x; y; time} | null>(null)
61
+ const touchStartRef = useRef<{ x: number; y: number; time: number } | null>(null)
46
62
  const touchStartDistanceRef = useRef<number>(0)
47
- const touchStartCenterRef = useRef<{ x; y} | null>(null)
63
+ const touchStartCenterRef = useRef<{ x: number; y: number } | null>(null)
48
64
  const longPressTimerRef = useRef<NodeJS.Timeout | null>(null)
49
65
  const lastTapTimeRef = useRef<number>(0)
50
66
 
@@ -80,25 +96,25 @@ export const useGestures = (
80
96
  }, [defaultConfig.enableSoundFeedback])
81
97
 
82
98
  // Calculate distance between two points
83
- const calculateDistance = useCallback((p1; y}, p2; y}) => {
99
+ const calculateDistance = useCallback((p1: { x: number; y: number }, p2: { x: number; y: number }) => {
84
100
  const dx = p2.x - p1.x
85
101
  const dy = p2.y - p1.y
86
102
  return Math.sqrt(dx * dx + dy * dy)
87
103
  }, [])
88
104
 
89
105
  // Calculate center point between two touches
90
- const calculateCenter = useCallback((touches) => {
106
+ const calculateCenter = useCallback((touches: TouchList) => {
91
107
  let x = 0
92
108
  let y = 0
93
109
  for (let i = 0; i < touches.length; i++) {
94
110
  x += touches[i].clientX
95
111
  y += touches[i].clientY
96
112
  }
97
- return { x, y}
113
+ return { x: x / touches.length, y: y / touches.length }
98
114
  }, [])
99
115
 
100
116
  // Handle touch start
101
- const handleTouchStart = useCallback((event) => {
117
+ const handleTouchStart = useCallback((event: TouchEvent) => {
102
118
  event.preventDefault()
103
119
 
104
120
  const touches = event.touches
@@ -107,39 +123,39 @@ export const useGestures = (
107
123
  if (touchCount === 1) {
108
124
  const touch = touches[0]
109
125
  touchStartRef.current = {
110
- x,
111
- y,
112
- time)
126
+ x: touch.clientX,
127
+ y: touch.clientY,
128
+ time: Date.now()
113
129
  }
114
130
 
115
131
  // Start long press timer
116
132
  longPressTimerRef.current = setTimeout(() => {
117
133
  if (touchStartRef.current) {
118
- const position = { x, y}
119
- setGestureState(prev => ({ ...prev, currentGesture}))
134
+ const position = { x: touch.clientX, y: touch.clientY }
135
+ setGestureState(prev => ({ ...prev, currentGesture: 'longPress' }))
120
136
  callbacks.onLongPress?.(position)
121
137
  triggerHapticFeedback()
122
138
  }
123
139
  }, 500)
124
140
 
125
- callbacks.onTouchStart?.({ x, y})
141
+ callbacks.onTouchStart?.({ x: touch.clientX, y: touch.clientY })
126
142
  } else if (touchCount === 2) {
127
143
  // Pinch gesture start
128
144
  const center = calculateCenter(touches)
129
145
  const distance = calculateDistance(
130
- { x].clientX, y].clientY },
131
- { x].clientX, y].clientY }
146
+ { x: touches[0].clientX, y: touches[0].clientY },
147
+ { x: touches[1].clientX, y: touches[1].clientY }
132
148
  )
133
149
 
134
150
  touchStartCenterRef.current = center
135
151
  touchStartDistanceRef.current = distance
136
152
  }
137
153
 
138
- setGestureState(prev => ({ ...prev, isTracking, touchCount }))
154
+ setGestureState(prev => ({ ...prev, isTracking: true, touchCount }))
139
155
  }, [callbacks, calculateCenter, calculateDistance, triggerHapticFeedback])
140
156
 
141
157
  // Handle touch move
142
- const handleTouchMove = useCallback((event) => {
158
+ const handleTouchMove = useCallback((event: TouchEvent) => {
143
159
  event.preventDefault()
144
160
 
145
161
  const touches = event.touches
@@ -155,27 +171,27 @@ export const useGestures = (
155
171
  // Handle pinch gesture
156
172
  const center = calculateCenter(touches)
157
173
  const distance = calculateDistance(
158
- { x].clientX, y].clientY },
159
- { x].clientX, y].clientY }
174
+ { x: touches[0].clientX, y: touches[0].clientY },
175
+ { x: touches[1].clientX, y: touches[1].clientY }
160
176
  )
161
177
 
162
178
  const scale = distance / touchStartDistanceRef.current
163
179
 
164
180
  if (Math.abs(scale - 1) * 100 > defaultConfig.minPinchDistance) {
165
- const pinchGesture= {
181
+ const pinchGesture: PinchGesture = {
166
182
  scale,
167
183
  center,
168
184
  distance
169
185
  }
170
186
 
171
- setGestureState(prev => ({ ...prev, currentGesture, lastGesture}))
187
+ setGestureState(prev => ({ ...prev, currentGesture: 'pinch', lastGesture: pinchGesture }))
172
188
  callbacks.onPinch?.(pinchGesture)
173
189
  }
174
190
  }
175
191
  }, [callbacks, calculateCenter, calculateDistance, defaultConfig.minPinchDistance])
176
192
 
177
193
  // Handle touch end
178
- const handleTouchEnd = useCallback((event) => {
194
+ const handleTouchEnd = useCallback((event: TouchEvent) => {
179
195
  event.preventDefault()
180
196
 
181
197
  const touches = event.changedTouches
@@ -193,19 +209,22 @@ export const useGestures = (
193
209
 
194
210
  if (distance >= defaultConfig.minSwipeDistance && duration <= defaultConfig.maxSwipeTime) {
195
211
  // Determine swipe direction
196
- let direction) > Math.abs(dy)) {
197
- direction = dx > 0 ? 'right' } else {
198
- direction = dy > 0 ? 'down' }
212
+ let direction: 'up' | 'down' | 'left' | 'right'
213
+ if (Math.abs(dx) > Math.abs(dy)) {
214
+ direction = dx > 0 ? 'right' : 'left'
215
+ } else {
216
+ direction = dy > 0 ? 'down' : 'up'
217
+ }
199
218
 
200
219
  const velocity = distance / duration
201
- const swipeGesture= {
220
+ const swipeGesture: SwipeGesture = {
202
221
  direction,
203
222
  distance,
204
223
  velocity,
205
224
  duration
206
225
  }
207
226
 
208
- setGestureState(prev => ({ ...prev, currentGesture, lastGesture}))
227
+ setGestureState(prev => ({ ...prev, currentGesture: 'swipe', lastGesture: swipeGesture }))
209
228
  callbacks.onSwipe?.(swipeGesture)
210
229
  triggerHapticFeedback()
211
230
  triggerSoundFeedback()
@@ -216,7 +235,7 @@ export const useGestures = (
216
235
 
217
236
  if (timeSinceLastTap < 300) {
218
237
  // Double tap detected
219
- const position = { x, y}
238
+ const position = { x: touch.clientX, y: touch.clientY }
220
239
  callbacks.onTap?.(position)
221
240
  triggerHapticFeedback()
222
241
  }
@@ -231,14 +250,14 @@ export const useGestures = (
231
250
  }
232
251
 
233
252
  touchStartRef.current = null
234
- callbacks.onTouchEnd?.({ x, y})
253
+ callbacks.onTouchEnd?.({ x: touch.clientX, y: touch.clientY })
235
254
  } else if (touchCount === 0) {
236
255
  // All touches ended
237
256
  touchStartCenterRef.current = null
238
257
  touchStartDistanceRef.current = 0
239
258
  }
240
259
 
241
- setGestureState(prev => ({ ...prev, isTracking, currentGesture}))
260
+ setGestureState(prev => ({ ...prev, isTracking: false, currentGesture: 'none' }))
242
261
  }, [callbacks, defaultConfig.minSwipeDistance, defaultConfig.maxSwipeTime, triggerHapticFeedback, triggerSoundFeedback])
243
262
 
244
263
  // Set up event listeners
@@ -246,9 +265,9 @@ export const useGestures = (
246
265
  const element = elementRef.current
247
266
  if (!element) return
248
267
 
249
- element.addEventListener('touchstart', handleTouchStart, { passive})
250
- element.addEventListener('touchmove', handleTouchMove, { passive})
251
- element.addEventListener('touchend', handleTouchEnd, { passive})
268
+ element.addEventListener('touchstart', handleTouchStart, { passive: false })
269
+ element.addEventListener('touchmove', handleTouchMove, { passive: false })
270
+ element.addEventListener('touchend', handleTouchEnd, { passive: false })
252
271
 
253
272
  return () => {
254
273
  element.removeEventListener('touchstart', handleTouchStart)
@@ -265,10 +284,11 @@ export const useGestures = (
265
284
  // Utility functions
266
285
  const resetGestureState = useCallback(() => {
267
286
  setGestureState({
268
- isTracking,
269
- currentGesture,
270
- lastGesture,
271
- touchCount})
287
+ isTracking: false,
288
+ currentGesture: 'none',
289
+ lastGesture: null,
290
+ touchCount: 0
291
+ })
272
292
  }, [])
273
293
 
274
294
  const isGestureActive = useMemo(() => gestureState.isTracking, [gestureState.isTracking])
@@ -286,29 +306,33 @@ export const useGestures = (
286
306
 
287
307
  // Convenience hooks for specific gestures
288
308
  export const useSwipeGesture = (
289
- elementRef,
290
- onSwipe) => void,
291
- config?) => {
309
+ elementRef: React.RefObject<HTMLElement>,
310
+ onSwipe: (gesture: SwipeGesture) => void,
311
+ config?: Partial<GestureConfig>
312
+ ) => {
292
313
  return useGestures(elementRef, { onSwipe }, config)
293
314
  }
294
315
 
295
316
  export const usePinchGesture = (
296
- elementRef,
297
- onPinch) => void,
298
- config?) => {
317
+ elementRef: React.RefObject<HTMLElement>,
318
+ onPinch: (gesture: PinchGesture) => void,
319
+ config?: Partial<GestureConfig>
320
+ ) => {
299
321
  return useGestures(elementRef, { onPinch }, config)
300
322
  }
301
323
 
302
324
  export const useTapGesture = (
303
- elementRef,
304
- onTap; y}) => void,
305
- config?) => {
325
+ elementRef: React.RefObject<HTMLElement>,
326
+ onTap: (position: { x: number; y: number }) => void,
327
+ config?: Partial<GestureConfig>
328
+ ) => {
306
329
  return useGestures(elementRef, { onTap }, config)
307
330
  }
308
331
 
309
332
  export const useLongPressGesture = (
310
- elementRef,
311
- onLongPress; y}) => void,
312
- config?) => {
333
+ elementRef: React.RefObject<HTMLElement>,
334
+ onLongPress: (position: { x: number; y: number }) => void,
335
+ config?: Partial<GestureConfig>
336
+ ) => {
313
337
  return useGestures(elementRef, { onLongPress }, config)
314
338
  }