@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
@@ -8,7 +8,7 @@ import { useState, useMemo } from 'react';
8
8
  import { ChevronRightIcon, HomeIcon } from '@heroicons/react/24/outline';
9
9
  import { BreadcrumbProps, BreadcrumbItem } from './types';
10
10
 
11
- export const Breadcrumb= ({
11
+ export const Breadcrumb: React.FC<BreadcrumbProps> = ({
12
12
  items,
13
13
  separator = <ChevronRightIcon className="w-4 h-4" />,
14
14
  maxItems = 5,
@@ -18,7 +18,7 @@ export const Breadcrumb= ({
18
18
  truncate = true,
19
19
  responsive = true,
20
20
  className = '',
21
- 'data-testid'= 'breadcrumb',
21
+ 'data-testid': testId = 'breadcrumb',
22
22
  }) => {
23
23
  const [isExpanded, setIsExpanded] = useState(false);
24
24
 
@@ -38,12 +38,12 @@ export const Breadcrumb= ({
38
38
 
39
39
  return [
40
40
  ...firstItems,
41
- { id, label, disabled},
41
+ { id: 'ellipsis', label: '...', disabled: true },
42
42
  ...lastItems,
43
43
  ];
44
44
  }, [items, maxItems, truncate, isExpanded]);
45
45
 
46
- const handleItemClick = (item) => {
46
+ const handleItemClick = (item: BreadcrumbItem) => {
47
47
  if (item.disabled || item.id === 'ellipsis') return;
48
48
 
49
49
  if (onItemClick) {
@@ -59,7 +59,7 @@ export const Breadcrumb= ({
59
59
  return 'breadcrumb breadcrumb--stan-design';
60
60
  };
61
61
 
62
- const getItemClasses = (item, isLast) => {
62
+ const getItemClasses = (item: BreadcrumbItem, isLast: boolean) => {
63
63
  const baseClasses = 'breadcrumb__item-button';
64
64
 
65
65
  if (item.disabled) {
@@ -86,8 +86,8 @@ export const Breadcrumb= ({
86
86
  {showHome && (
87
87
  <>
88
88
  <button
89
- onClick={() => handleItemClick({ id, label, href})}
90
- className={`breadcrumb__home-button ${getItemClasses({ id, label} as BreadcrumbItem, false)}`}
89
+ onClick={() => handleItemClick({ id: 'home', label: 'Home', href: '/' })}
90
+ className={`breadcrumb__home-button ${getItemClasses({ id: 'home', label: 'Home' } as BreadcrumbItem, false)}`}
91
91
  aria-label="Go to home page"
92
92
  >
93
93
  <span className="breadcrumb__icon">{homeIcon}</span>
@@ -117,20 +117,23 @@ export const Breadcrumb= ({
117
117
  <button
118
118
  onClick={handleExpandToggle}
119
119
  className="breadcrumb__ellipsis"
120
- aria-label={isExpanded ? 'Collapse breadcrumbs' }
120
+ aria-label={isExpanded ? 'Collapse breadcrumbs' : 'Expand breadcrumbs'}
121
121
  >
122
122
  {item.label}
123
123
  </button>
124
- ) ={() => handleItemClick(item)}
124
+ ) : (
125
+ <button
126
+ onClick={() => handleItemClick(item)}
125
127
  className={getItemClasses(item, isLast)}
126
128
  disabled={item.disabled}
127
- aria-current={isLast ? 'page' }
128
- aria-label={item.href ? `Navigate to ${item.label}` }
129
+ aria-current={isLast ? 'page' : undefined}
130
+ aria-label={item.href ? `Navigate to ${item.label}` : item.label}
129
131
  >
130
132
  {item.icon && <span className="breadcrumb__icon">{item.icon}</span>}
131
133
  {responsive && window.innerWidth < 640 ? (
132
134
  <span className="breadcrumb__item-label">{item.label}</span>
133
- ) ="breadcrumb__item-label">{item.label}</span>
135
+ ) : (
136
+ <span className="breadcrumb__item-label">{item.label}</span>
134
137
  )}
135
138
  </button>
136
139
  )}
@@ -143,9 +146,9 @@ export const Breadcrumb= ({
143
146
  <button
144
147
  onClick={handleExpandToggle}
145
148
  className={`breadcrumb__expand-toggle breadcrumb__expand-toggle--semantic`}
146
- aria-label={isExpanded ? 'Show fewer breadcrumbs' }
149
+ aria-label={isExpanded ? 'Show fewer breadcrumbs' : 'Show all breadcrumbs'}
147
150
  >
148
- {isExpanded ? 'Show Less' }
151
+ {isExpanded ? 'Show Less' : 'Show All'}
149
152
  </button>
150
153
  )}
151
154
  </nav>
@@ -11,4 +11,3 @@ export { Menu } from './menu';
11
11
  export { Sidebar } from './sidebar';
12
12
 
13
13
  // Export types
14
-
@@ -11,4 +11,3 @@ export { Menu } from './menu';
11
11
  export { Sidebar } from './sidebar';
12
12
 
13
13
  // Export types
14
-
@@ -8,36 +8,36 @@ import { useState, useCallback, useMemo, useRef, useEffect } from 'react';
8
8
  import { MenuProps, NavigationItem, NavigationGroup } from './types';
9
9
 
10
10
  // Simple icon components
11
- const ChevronDownIcon}> = ({ className = '' }) => (
11
+ const ChevronDownIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
12
12
  <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
13
13
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
14
14
  </svg>
15
15
  );
16
16
 
17
- const ChevronRightIcon}> = ({ className = '' }) => (
17
+ const ChevronRightIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
18
18
  <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
19
19
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
20
20
  </svg>
21
21
  );
22
22
 
23
- const MagnifyingGlassIcon}> = ({ className = '' }) => (
23
+ const MagnifyingGlassIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
24
24
  <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
25
25
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
26
26
  </svg>
27
27
  );
28
28
 
29
- const FunnelIcon}> = ({ className = '' }) => (
29
+ const FunnelIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
30
30
  <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
31
31
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z" />
32
32
  </svg>
33
33
  );
34
34
 
35
- export const Menu= ({
35
+ export const Menu: React.FC<MenuProps> = ({
36
36
  items = [],
37
37
  groups,
38
38
  variant = 'dropdown',
39
39
  size = 'md',
40
- // TODO, trigger, showArrow, and fullWidth in future version
40
+ // TODO: Implement orientation, trigger, showArrow, and fullWidth in future version
41
41
  // orientation = 'horizontal',
42
42
  // trigger = 'click',
43
43
  placement = 'bottom',
@@ -55,23 +55,24 @@ export const Menu= ({
55
55
  selectedItems = [],
56
56
  onSelectionChange,
57
57
  className = '',
58
- 'data-testid'= 'menu',
58
+ 'data-testid': testId = 'menu',
59
59
  }) => {
60
60
  const [isOpen, setIsOpen] = useState(false);
61
61
  const [searchQuery, setSearchQuery] = useState('');
62
62
  const [filterValue, setFilterValue] = useState('');
63
63
  const [internalSelectedItems, setInternalSelectedItems] = useState<string[]>(selectedItems || []);
64
- // TODO, setExpandedGroups] = useState<string[]>([]);
64
+ // TODO: Implement group expansion functionality in future version
65
+ // const [expandedGroups, setExpandedGroups] = useState<string[]>([]);
65
66
 
66
67
  const menuRef = useRef<HTMLDivElement>(null);
67
68
  const triggerRef = useRef<HTMLButtonElement>(null);
68
69
 
69
70
  // Use controlled or uncontrolled selected items
70
- const currentSelectedItems = selectedItems !== undefined ? selectedItems ;
71
+ const currentSelectedItems = selectedItems !== undefined ? selectedItems : internalSelectedItems;
71
72
 
72
73
  // Handle click outside to close menu
73
74
  useEffect(() => {
74
- const handleClickOutside = (event) => {
75
+ const handleClickOutside = (event: MouseEvent) => {
75
76
  if (menuRef.current && !menuRef.current.contains(event.target as Node) &&
76
77
  triggerRef.current && !triggerRef.current.contains(event.target as Node)) {
77
78
  setIsOpen(false);
@@ -89,7 +90,7 @@ export const Menu= ({
89
90
 
90
91
  // Handle escape key to close menu
91
92
  useEffect(() => {
92
- const handleEscape = (event) => {
93
+ const handleEscape = (event: KeyboardEvent) => {
93
94
  if (event.key === 'Escape') {
94
95
  setIsOpen(false);
95
96
  }
@@ -109,11 +110,11 @@ export const Menu= ({
109
110
  setIsOpen(!isOpen);
110
111
  }, [disabled, loading, isOpen]);
111
112
 
112
- const handleItemClick = useCallback((item) => {
113
+ const handleItemClick = useCallback((item: NavigationItem) => {
113
114
  if (item.disabled) return;
114
115
 
115
116
  if (selectable) {
116
- let newSelectedItems];
117
+ let newSelectedItems: string[];
117
118
 
118
119
  if (multiSelect) {
119
120
  if (currentSelectedItems.includes(item.id)) {
@@ -144,22 +145,23 @@ export const Menu= ({
144
145
  }
145
146
  }, [selectable, multiSelect, currentSelectedItems, selectedItems, onSelectionChange]);
146
147
 
147
- // TODO= useCallback((groupId) => {
148
+ // TODO: Implement group toggle functionality in future version
149
+ // const handleGroupToggle = useCallback((groupId: string) => {
148
150
  // setExpandedGroups(prev =>
149
151
  // prev.includes(groupId)
150
152
  // ? prev.filter(id => id !== groupId)
151
- // , groupId]
153
+ // : [...prev, groupId]
152
154
  // );
153
155
  // }, []);
154
156
 
155
- const handleSearch = useCallback((query) => {
157
+ const handleSearch = useCallback((query: string) => {
156
158
  setSearchQuery(query);
157
159
  if (onSearch) {
158
160
  onSearch(query);
159
161
  }
160
162
  }, [onSearch]);
161
163
 
162
- const handleFilter = useCallback((filter) => {
164
+ const handleFilter = useCallback((filter: string) => {
163
165
  setFilterValue(filter);
164
166
  if (onFilter) {
165
167
  onFilter(filter);
@@ -188,18 +190,25 @@ export const Menu= ({
188
190
 
189
191
  const getSizeClasses = () => {
190
192
  switch (size) {
191
- case 'sm';
192
- case 'lg';
193
- default;
193
+ case 'sm':
194
+ return 'menu__trigger--sm';
195
+ case 'lg':
196
+ return 'menu__trigger--lg';
197
+ default: // md
198
+ return 'menu__trigger--md';
194
199
  }
195
200
  };
196
201
 
197
202
  const getVariantClasses = () => {
198
203
  switch (variant) {
199
- case 'dropdown';
200
- case 'context';
201
- case 'command';
202
- default;
204
+ case 'dropdown':
205
+ return 'menu__content--dropdown';
206
+ case 'context':
207
+ return 'menu__content--context';
208
+ case 'command':
209
+ return 'menu__content--command';
210
+ default: // default
211
+ return 'menu__content--default';
203
212
  }
204
213
  };
205
214
 
@@ -207,7 +216,7 @@ export const Menu= ({
207
216
  return 'menu menu--stan-design';
208
217
  };
209
218
 
210
- const getItemClasses = (item) => {
219
+ const getItemClasses = (item: NavigationItem) => {
211
220
  let classes = `menu__item ${getSizeClasses()}`;
212
221
 
213
222
  if (item.disabled) {
@@ -223,15 +232,20 @@ export const Menu= ({
223
232
 
224
233
  const getPlacementClasses = () => {
225
234
  switch (placement) {
226
- case 'top';
227
- case 'bottom';
228
- case 'left';
229
- case 'right';
230
- default;
235
+ case 'top':
236
+ return 'menu__content--placement-top';
237
+ case 'bottom':
238
+ return 'menu__content--placement-bottom';
239
+ case 'left':
240
+ return 'menu__content--placement-left';
241
+ case 'right':
242
+ return 'menu__content--placement-right';
243
+ default:
244
+ return 'menu__content--placement-bottom';
231
245
  }
232
246
  };
233
247
 
234
- const renderMenuItem = (item) => (
248
+ const renderMenuItem = (item: NavigationItem) => (
235
249
  <button
236
250
  key={item.id}
237
251
  onClick={() => handleItemClick(item)}
@@ -254,7 +268,7 @@ export const Menu= ({
254
268
  </button>
255
269
  );
256
270
 
257
- const renderMenuGroup = (group) => (
271
+ const renderMenuGroup = (group: NavigationGroup) => (
258
272
  <div key={group.id} className="menu__group">
259
273
  {group.title && (
260
274
  <div className="menu__group-title">
@@ -286,7 +300,7 @@ export const Menu= ({
286
300
  ref={menuRef}
287
301
  role="menu"
288
302
  className={`menu__content ${getVariantClasses()} ${getPlacementClasses()}`}
289
- style={{ marginTop=== 'bottom' ? offset }}
303
+ style={{ marginTop: placement === 'bottom' ? offset : undefined }}
290
304
  >
291
305
  {/* Search Bar */}
292
306
  {searchable && (
@@ -324,7 +338,7 @@ export const Menu= ({
324
338
 
325
339
  {/* Menu Items */}
326
340
  <div className="menu__items">
327
- {groups ? groups.map(renderMenuGroup) )}
341
+ {groups ? groups.map(renderMenuGroup) : filteredItems.map(renderMenuItem)}
328
342
  </div>
329
343
 
330
344
  {/* Selection Actions */}
@@ -336,7 +350,7 @@ export const Menu= ({
336
350
  </span>
337
351
  <button
338
352
  onClick={() => {
339
- const newSelectedItems] = [];
353
+ const newSelectedItems: string[] = [];
340
354
  if (selectedItems === undefined) {
341
355
  setInternalSelectedItems(newSelectedItems);
342
356
  }
@@ -8,36 +8,36 @@ import { useState, useCallback, useMemo, useRef, useEffect } from 'react';
8
8
  import { MenuProps, NavigationItem, NavigationGroup } from './types';
9
9
 
10
10
  // Simple icon components
11
- const ChevronDownIcon}> = ({ className = '' }) => (
11
+ const ChevronDownIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
12
12
  <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
13
13
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
14
14
  </svg>
15
15
  );
16
16
 
17
- const ChevronRightIcon}> = ({ className = '' }) => (
17
+ const ChevronRightIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
18
18
  <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
19
19
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
20
20
  </svg>
21
21
  );
22
22
 
23
- const MagnifyingGlassIcon}> = ({ className = '' }) => (
23
+ const MagnifyingGlassIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
24
24
  <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
25
25
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
26
26
  </svg>
27
27
  );
28
28
 
29
- const FunnelIcon}> = ({ className = '' }) => (
29
+ const FunnelIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
30
30
  <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
31
31
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z" />
32
32
  </svg>
33
33
  );
34
34
 
35
- export const Menu= ({
35
+ export const Menu: React.FC<MenuProps> = ({
36
36
  items = [],
37
37
  groups,
38
38
  variant = 'dropdown',
39
39
  size = 'md',
40
- // TODO, trigger, showArrow, and fullWidth in future version
40
+ // TODO: Implement orientation, trigger, showArrow, and fullWidth in future version
41
41
  // orientation = 'horizontal',
42
42
  // trigger = 'click',
43
43
  placement = 'bottom',
@@ -55,23 +55,24 @@ export const Menu= ({
55
55
  selectedItems = [],
56
56
  onSelectionChange,
57
57
  className = '',
58
- 'data-testid'= 'menu',
58
+ 'data-testid': testId = 'menu',
59
59
  }) => {
60
60
  const [isOpen, setIsOpen] = useState(false);
61
61
  const [searchQuery, setSearchQuery] = useState('');
62
62
  const [filterValue, setFilterValue] = useState('');
63
63
  const [internalSelectedItems, setInternalSelectedItems] = useState<string[]>(selectedItems || []);
64
- // TODO, setExpandedGroups] = useState<string[]>([]);
64
+ // TODO: Implement group expansion functionality in future version
65
+ // const [expandedGroups, setExpandedGroups] = useState<string[]>([]);
65
66
 
66
67
  const menuRef = useRef<HTMLDivElement>(null);
67
68
  const triggerRef = useRef<HTMLButtonElement>(null);
68
69
 
69
70
  // Use controlled or uncontrolled selected items
70
- const currentSelectedItems = selectedItems !== undefined ? selectedItems ;
71
+ const currentSelectedItems = selectedItems !== undefined ? selectedItems : internalSelectedItems;
71
72
 
72
73
  // Handle click outside to close menu
73
74
  useEffect(() => {
74
- const handleClickOutside = (event) => {
75
+ const handleClickOutside = (event: MouseEvent) => {
75
76
  if (menuRef.current && !menuRef.current.contains(event.target as Node) &&
76
77
  triggerRef.current && !triggerRef.current.contains(event.target as Node)) {
77
78
  setIsOpen(false);
@@ -89,7 +90,7 @@ export const Menu= ({
89
90
 
90
91
  // Handle escape key to close menu
91
92
  useEffect(() => {
92
- const handleEscape = (event) => {
93
+ const handleEscape = (event: KeyboardEvent) => {
93
94
  if (event.key === 'Escape') {
94
95
  setIsOpen(false);
95
96
  }
@@ -109,11 +110,11 @@ export const Menu= ({
109
110
  setIsOpen(!isOpen);
110
111
  }, [disabled, loading, isOpen]);
111
112
 
112
- const handleItemClick = useCallback((item) => {
113
+ const handleItemClick = useCallback((item: NavigationItem) => {
113
114
  if (item.disabled) return;
114
115
 
115
116
  if (selectable) {
116
- let newSelectedItems];
117
+ let newSelectedItems: string[];
117
118
 
118
119
  if (multiSelect) {
119
120
  if (currentSelectedItems.includes(item.id)) {
@@ -144,22 +145,23 @@ export const Menu= ({
144
145
  }
145
146
  }, [selectable, multiSelect, currentSelectedItems, selectedItems, onSelectionChange]);
146
147
 
147
- // TODO= useCallback((groupId) => {
148
+ // TODO: Implement group toggle functionality in future version
149
+ // const handleGroupToggle = useCallback((groupId: string) => {
148
150
  // setExpandedGroups(prev =>
149
151
  // prev.includes(groupId)
150
152
  // ? prev.filter(id => id !== groupId)
151
- // , groupId]
153
+ // : [...prev, groupId]
152
154
  // );
153
155
  // }, []);
154
156
 
155
- const handleSearch = useCallback((query) => {
157
+ const handleSearch = useCallback((query: string) => {
156
158
  setSearchQuery(query);
157
159
  if (onSearch) {
158
160
  onSearch(query);
159
161
  }
160
162
  }, [onSearch]);
161
163
 
162
- const handleFilter = useCallback((filter) => {
164
+ const handleFilter = useCallback((filter: string) => {
163
165
  setFilterValue(filter);
164
166
  if (onFilter) {
165
167
  onFilter(filter);
@@ -188,18 +190,25 @@ export const Menu= ({
188
190
 
189
191
  const getSizeClasses = () => {
190
192
  switch (size) {
191
- case 'sm';
192
- case 'lg';
193
- default;
193
+ case 'sm':
194
+ return 'menu__trigger--sm';
195
+ case 'lg':
196
+ return 'menu__trigger--lg';
197
+ default: // md
198
+ return 'menu__trigger--md';
194
199
  }
195
200
  };
196
201
 
197
202
  const getVariantClasses = () => {
198
203
  switch (variant) {
199
- case 'dropdown';
200
- case 'context';
201
- case 'command';
202
- default;
204
+ case 'dropdown':
205
+ return 'menu__content--dropdown';
206
+ case 'context':
207
+ return 'menu__content--context';
208
+ case 'command':
209
+ return 'menu__content--command';
210
+ default: // default
211
+ return 'menu__content--default';
203
212
  }
204
213
  };
205
214
 
@@ -207,7 +216,7 @@ export const Menu= ({
207
216
  return 'menu menu--stan-design';
208
217
  };
209
218
 
210
- const getItemClasses = (item) => {
219
+ const getItemClasses = (item: NavigationItem) => {
211
220
  let classes = `menu__item ${getSizeClasses()}`;
212
221
 
213
222
  if (item.disabled) {
@@ -223,15 +232,20 @@ export const Menu= ({
223
232
 
224
233
  const getPlacementClasses = () => {
225
234
  switch (placement) {
226
- case 'top';
227
- case 'bottom';
228
- case 'left';
229
- case 'right';
230
- default;
235
+ case 'top':
236
+ return 'menu__content--placement-top';
237
+ case 'bottom':
238
+ return 'menu__content--placement-bottom';
239
+ case 'left':
240
+ return 'menu__content--placement-left';
241
+ case 'right':
242
+ return 'menu__content--placement-right';
243
+ default:
244
+ return 'menu__content--placement-bottom';
231
245
  }
232
246
  };
233
247
 
234
- const renderMenuItem = (item) => (
248
+ const renderMenuItem = (item: NavigationItem) => (
235
249
  <button
236
250
  key={item.id}
237
251
  onClick={() => handleItemClick(item)}
@@ -254,7 +268,7 @@ export const Menu= ({
254
268
  </button>
255
269
  );
256
270
 
257
- const renderMenuGroup = (group) => (
271
+ const renderMenuGroup = (group: NavigationGroup) => (
258
272
  <div key={group.id} className="menu__group">
259
273
  {group.title && (
260
274
  <div className="menu__group-title">
@@ -286,7 +300,7 @@ export const Menu= ({
286
300
  ref={menuRef}
287
301
  role="menu"
288
302
  className={`menu__content ${getVariantClasses()} ${getPlacementClasses()}`}
289
- style={{ marginTop=== 'bottom' ? offset }}
303
+ style={{ marginTop: placement === 'bottom' ? offset : undefined }}
290
304
  >
291
305
  {/* Search Bar */}
292
306
  {searchable && (
@@ -324,7 +338,7 @@ export const Menu= ({
324
338
 
325
339
  {/* Menu Items */}
326
340
  <div className="menu__items">
327
- {groups ? groups.map(renderMenuGroup) )}
341
+ {groups ? groups.map(renderMenuGroup) : filteredItems.map(renderMenuItem)}
328
342
  </div>
329
343
 
330
344
  {/* Selection Actions */}
@@ -336,7 +350,7 @@ export const Menu= ({
336
350
  </span>
337
351
  <button
338
352
  onClick={() => {
339
- const newSelectedItems] = [];
353
+ const newSelectedItems: string[] = [];
340
354
  if (selectedItems === undefined) {
341
355
  setInternalSelectedItems(newSelectedItems);
342
356
  }