@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,25 +8,26 @@ import { useState, useCallback, useRef, useEffect } from 'react';
8
8
  import { SidebarProps, NavigationItem, NavigationGroup } from './types';
9
9
 
10
10
  // Simple icon components
11
- const ChevronLeftIcon}> = ({ className = '' }) => (
11
+ const ChevronLeftIcon: 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="M15 19l-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
- // TODO}> = ({ className = '' }) => (
23
+ // TODO: Implement close icon functionality in future version
24
+ // const XMarkIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
24
25
  // <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
25
26
  // <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
26
27
  // </svg>
27
28
  // );
28
29
 
29
- export const Sidebar= ({
30
+ export const Sidebar: React.FC<SidebarProps> = ({
30
31
  items = [],
31
32
  groups = [],
32
33
  variant = 'default',
@@ -50,32 +51,35 @@ export const Sidebar= ({
50
51
  onGroupToggle,
51
52
  expandedGroups = [],
52
53
  defaultExpandedGroups = [],
53
- // TODO= true,
54
+ // TODO: Implement group icons in future version
55
+ // showGroupIcons = true,
54
56
  showItemIcons = true,
55
57
  showItemBadges = true,
56
58
  showItemDescriptions = true,
57
59
  sticky = false,
58
60
  zIndex = 1000,
59
61
  className = '',
60
- 'data-testid'= 'sidebar',
62
+ 'data-testid': testId = 'sidebar',
61
63
  }) => {
62
64
  const [internalCollapsed, setInternalCollapsed] = useState<boolean>(
63
- collapsed !== undefined ? collapsed );
65
+ collapsed !== undefined ? collapsed : defaultCollapsed
66
+ );
64
67
  const [internalExpandedGroups, setInternalExpandedGroups] = useState<string[]>(
65
- expandedGroups !== undefined ? expandedGroups );
68
+ expandedGroups !== undefined ? expandedGroups : defaultExpandedGroups
69
+ );
66
70
  const [isOverlayOpen, setIsOverlayOpen] = useState(false);
67
71
  const [isMobile, setIsMobile] = useState(false);
68
72
 
69
73
  const sidebarRef = useRef<HTMLDivElement>(null);
70
74
 
71
75
  // Use controlled or uncontrolled collapsed state
72
- const currentCollapsed = collapsed !== undefined ? collapsed ;
73
- const currentExpandedGroups = expandedGroups !== undefined ? expandedGroups ;
76
+ const currentCollapsed = collapsed !== undefined ? collapsed : internalCollapsed;
77
+ const currentExpandedGroups = expandedGroups !== undefined ? expandedGroups : internalExpandedGroups;
74
78
 
75
79
  // Handle responsive behavior
76
80
  useEffect(() => {
77
81
  const handleResize = () => {
78
- const breakpointWidth = breakpoint === 'sm' ? 640 === 'md' ? 768 === 'lg' ? 1024 ;
82
+ const breakpointWidth = breakpoint === 'sm' ? 640 : breakpoint === 'md' ? 768 : breakpoint === 'lg' ? 1024 : 1280;
79
83
  setIsMobile(window.innerWidth < breakpointWidth);
80
84
  };
81
85
 
@@ -93,7 +97,7 @@ export const Sidebar= ({
93
97
 
94
98
  // Handle escape key for overlay
95
99
  useEffect(() => {
96
- const handleEscape = (event) => {
100
+ const handleEscape = (event: KeyboardEvent) => {
97
101
  if (event.key === 'Escape' && isOverlayOpen && overlayCloseOnEscape) {
98
102
  setIsOverlayOpen(false);
99
103
  }
@@ -122,10 +126,10 @@ export const Sidebar= ({
122
126
  }
123
127
  }, [collapsed, currentCollapsed, collapsible, onCollapseChange]);
124
128
 
125
- const handleGroupToggle = useCallback((groupId) => {
129
+ const handleGroupToggle = useCallback((groupId: string) => {
126
130
  const newExpandedGroups = currentExpandedGroups.includes(groupId)
127
131
  ? currentExpandedGroups.filter(id => id !== groupId)
128
- , groupId];
132
+ : [...currentExpandedGroups, groupId];
129
133
 
130
134
  if (expandedGroups === undefined) {
131
135
  setInternalExpandedGroups(newExpandedGroups);
@@ -136,7 +140,7 @@ export const Sidebar= ({
136
140
  }
137
141
  }, [currentExpandedGroups, expandedGroups, onGroupToggle]);
138
142
 
139
- const handleItemClick = useCallback((item) => {
143
+ const handleItemClick = useCallback((item: NavigationItem) => {
140
144
  if (item.disabled) return;
141
145
 
142
146
  if (onItemClick) {
@@ -161,19 +165,27 @@ export const Sidebar= ({
161
165
  if (currentCollapsed) return 'sidebar--collapsed';
162
166
 
163
167
  switch (size) {
164
- case 'sm';
165
- case 'lg';
166
- case 'xl';
167
- default;
168
+ case 'sm':
169
+ return 'sidebar--size-sm';
170
+ case 'lg':
171
+ return 'sidebar--size-lg';
172
+ case 'xl':
173
+ return 'sidebar--size-xl';
174
+ default: // md
175
+ return 'sidebar--size-md';
168
176
  }
169
177
  };
170
178
 
171
179
  const getVariantClasses = () => {
172
180
  switch (variant) {
173
- case 'collapsible';
174
- case 'overlay';
175
- case 'drawer';
176
- default;
181
+ case 'collapsible':
182
+ return 'sidebar--collapsible';
183
+ case 'overlay':
184
+ return 'sidebar--overlay';
185
+ case 'drawer':
186
+ return 'sidebar--drawer';
187
+ default: // default
188
+ return 'sidebar--default';
177
189
  }
178
190
  };
179
191
 
@@ -183,7 +195,7 @@ export const Sidebar= ({
183
195
 
184
196
  const getPositionClasses = () => {
185
197
  if (variant === 'overlay' || variant === 'drawer') {
186
- return position === 'right' ? 'sidebar--position-right' ;
198
+ return position === 'right' ? 'sidebar--position-right' : 'sidebar--position-left';
187
199
  }
188
200
  return '';
189
201
  };
@@ -191,16 +203,17 @@ export const Sidebar= ({
191
203
  const getTransformClasses = () => {
192
204
  if (variant === 'overlay' || variant === 'drawer' || (isMobile && overlay)) {
193
205
  if (position === 'right') {
194
- return isOverlayOpen ? 'sidebar--open' ;
206
+ return isOverlayOpen ? 'sidebar--open' : 'sidebar--closed-right';
195
207
  }
196
- return isOverlayOpen ? 'sidebar--open' ;
208
+ return isOverlayOpen ? 'sidebar--open' : 'sidebar--closed-left';
197
209
  }
198
210
  return '';
199
211
  };
200
212
 
201
- const getItemClasses = (item) => {
213
+ const getItemClasses = (item: NavigationItem) => {
202
214
  let classes = `sidebar__item ${
203
- currentCollapsed ? 'sidebar__item--collapsed' }`;
215
+ currentCollapsed ? 'sidebar__item--collapsed' : 'sidebar__item--expanded'
216
+ }`;
204
217
 
205
218
  if (item.disabled) {
206
219
  classes += ' sidebar__item--disabled';
@@ -213,7 +226,7 @@ export const Sidebar= ({
213
226
  return classes;
214
227
  };
215
228
 
216
- const getGroupClasses = (groupId) => {
229
+ const getGroupClasses = (groupId: string) => {
217
230
  const isExpanded = currentExpandedGroups.includes(groupId);
218
231
  let classes = 'sidebar__group';
219
232
 
@@ -226,16 +239,16 @@ export const Sidebar= ({
226
239
  return classes;
227
240
  };
228
241
 
229
- const renderMenuItem = (item) => (
242
+ const renderMenuItem = (item: NavigationItem) => (
230
243
  <button
231
244
  key={item.id}
232
245
  onClick={() => handleItemClick(item)}
233
246
  disabled={item.disabled}
234
247
  className={getItemClasses(item)}
235
- title={currentCollapsed ? item.label }
248
+ title={currentCollapsed ? item.label : undefined}
236
249
  >
237
250
  {showItemIcons && item.icon && (
238
- <span className={`sidebar__item-icon ${currentCollapsed ? 'sidebar__item-icon--collapsed' }`}>
251
+ <span className={`sidebar__item-icon ${currentCollapsed ? 'sidebar__item-icon--collapsed' : 'sidebar__item-icon--expanded'}`}>
239
252
  {item.icon}
240
253
  </span>
241
254
  )}
@@ -255,16 +268,16 @@ export const Sidebar= ({
255
268
  </button>
256
269
  );
257
270
 
258
- const renderMenuGroup = (group) => (
271
+ const renderMenuGroup = (group: NavigationGroup) => (
259
272
  <div key={group.id}>
260
273
  <button
261
274
  onClick={() => handleGroupToggle(group.id)}
262
275
  className={getGroupClasses(group.id)}
263
- title={currentCollapsed ? group.title }
276
+ title={currentCollapsed ? group.title : undefined}
264
277
  >
265
- {/* TODO}
278
+ {/* TODO: Add icon support to NavigationGroup in future version */}
266
279
  {/* {showGroupIcons && group.icon && (
267
- <span className={currentCollapsed ? '' }>
280
+ <span className={currentCollapsed ? '' : 'mr-3'}>
268
281
  {group.icon}
269
282
  </span>
270
283
  )} */}
@@ -274,7 +287,8 @@ export const Sidebar= ({
274
287
  <div className="sidebar__group-title">{group.title}</div>
275
288
  <ChevronRightIcon
276
289
  className={`sidebar__group-arrow ${
277
- currentExpandedGroups.includes(group.id) ? 'sidebar__group-arrow--expanded' }`}
290
+ currentExpandedGroups.includes(group.id) ? 'sidebar__group-arrow--expanded' : ''
291
+ }`}
278
292
  />
279
293
  </>
280
294
  )}
@@ -308,16 +322,16 @@ export const Sidebar= ({
308
322
  <button
309
323
  onClick={handleCollapseToggle}
310
324
  className="sidebar__toggle-button"
311
- aria-label={currentCollapsed ? 'Expand sidebar' }
325
+ aria-label={currentCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}
312
326
  >
313
- {toggleIcon || (currentCollapsed ? <ChevronRightIcon className="sidebar__toggle-icon" /> ="sidebar__toggle-icon" />)}
327
+ {toggleIcon || (currentCollapsed ? <ChevronRightIcon className="sidebar__toggle-icon" /> : <ChevronLeftIcon className="sidebar__toggle-icon" />)}
314
328
  </button>
315
329
  </div>
316
330
  )}
317
331
 
318
332
  {/* Navigation Items */}
319
333
  <nav className="sidebar__navigation">
320
- {groups && groups.length > 0 ? groups.map(renderMenuGroup) )}
334
+ {groups && groups.length > 0 ? groups.map(renderMenuGroup) : items.map(renderMenuItem)}
321
335
  </nav>
322
336
 
323
337
  {/* Footer */}
@@ -337,7 +351,7 @@ export const Sidebar= ({
337
351
  {isOverlayOpen && (
338
352
  <div
339
353
  className="sidebar__overlay-backdrop"
340
- onClick={overlayCloseOnOutsideClick ? handleOverlayClose }
354
+ onClick={overlayCloseOnOutsideClick ? handleOverlayClose : undefined}
341
355
  />
342
356
  )}
343
357
 
@@ -360,7 +374,7 @@ export const Sidebar= ({
360
374
 
361
375
  // Desktop sidebar
362
376
  return (
363
- <div className={`sidebar__wrapper ${sticky ? 'sidebar__wrapper--sticky' }`}>
377
+ <div className={`sidebar__wrapper ${sticky ? 'sidebar__wrapper--sticky' : ''}`}>
364
378
  {sidebarContent}
365
379
  </div>
366
380
  );
@@ -8,25 +8,26 @@ import { useState, useCallback, useRef, useEffect } from 'react';
8
8
  import { SidebarProps, NavigationItem, NavigationGroup } from './types';
9
9
 
10
10
  // Simple icon components
11
- const ChevronLeftIcon}> = ({ className = '' }) => (
11
+ const ChevronLeftIcon: 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="M15 19l-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
- // TODO}> = ({ className = '' }) => (
23
+ // TODO: Implement close icon functionality in future version
24
+ // const XMarkIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
24
25
  // <svg className={className} fill="none" viewBox="0 0 24 24" stroke="currentColor">
25
26
  // <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
26
27
  // </svg>
27
28
  // );
28
29
 
29
- export const Sidebar= ({
30
+ export const Sidebar: React.FC<SidebarProps> = ({
30
31
  items = [],
31
32
  groups = [],
32
33
  variant = 'default',
@@ -50,32 +51,35 @@ export const Sidebar= ({
50
51
  onGroupToggle,
51
52
  expandedGroups = [],
52
53
  defaultExpandedGroups = [],
53
- // TODO= true,
54
+ // TODO: Implement group icons in future version
55
+ // showGroupIcons = true,
54
56
  showItemIcons = true,
55
57
  showItemBadges = true,
56
58
  showItemDescriptions = true,
57
59
  sticky = false,
58
60
  zIndex = 1000,
59
61
  className = '',
60
- 'data-testid'= 'sidebar',
62
+ 'data-testid': testId = 'sidebar',
61
63
  }) => {
62
64
  const [internalCollapsed, setInternalCollapsed] = useState<boolean>(
63
- collapsed !== undefined ? collapsed );
65
+ collapsed !== undefined ? collapsed : defaultCollapsed
66
+ );
64
67
  const [internalExpandedGroups, setInternalExpandedGroups] = useState<string[]>(
65
- expandedGroups !== undefined ? expandedGroups );
68
+ expandedGroups !== undefined ? expandedGroups : defaultExpandedGroups
69
+ );
66
70
  const [isOverlayOpen, setIsOverlayOpen] = useState(false);
67
71
  const [isMobile, setIsMobile] = useState(false);
68
72
 
69
73
  const sidebarRef = useRef<HTMLDivElement>(null);
70
74
 
71
75
  // Use controlled or uncontrolled collapsed state
72
- const currentCollapsed = collapsed !== undefined ? collapsed ;
73
- const currentExpandedGroups = expandedGroups !== undefined ? expandedGroups ;
76
+ const currentCollapsed = collapsed !== undefined ? collapsed : internalCollapsed;
77
+ const currentExpandedGroups = expandedGroups !== undefined ? expandedGroups : internalExpandedGroups;
74
78
 
75
79
  // Handle responsive behavior
76
80
  useEffect(() => {
77
81
  const handleResize = () => {
78
- const breakpointWidth = breakpoint === 'sm' ? 640 === 'md' ? 768 === 'lg' ? 1024 ;
82
+ const breakpointWidth = breakpoint === 'sm' ? 640 : breakpoint === 'md' ? 768 : breakpoint === 'lg' ? 1024 : 1280;
79
83
  setIsMobile(window.innerWidth < breakpointWidth);
80
84
  };
81
85
 
@@ -93,7 +97,7 @@ export const Sidebar= ({
93
97
 
94
98
  // Handle escape key for overlay
95
99
  useEffect(() => {
96
- const handleEscape = (event) => {
100
+ const handleEscape = (event: KeyboardEvent) => {
97
101
  if (event.key === 'Escape' && isOverlayOpen && overlayCloseOnEscape) {
98
102
  setIsOverlayOpen(false);
99
103
  }
@@ -122,10 +126,10 @@ export const Sidebar= ({
122
126
  }
123
127
  }, [collapsed, currentCollapsed, collapsible, onCollapseChange]);
124
128
 
125
- const handleGroupToggle = useCallback((groupId) => {
129
+ const handleGroupToggle = useCallback((groupId: string) => {
126
130
  const newExpandedGroups = currentExpandedGroups.includes(groupId)
127
131
  ? currentExpandedGroups.filter(id => id !== groupId)
128
- , groupId];
132
+ : [...currentExpandedGroups, groupId];
129
133
 
130
134
  if (expandedGroups === undefined) {
131
135
  setInternalExpandedGroups(newExpandedGroups);
@@ -136,7 +140,7 @@ export const Sidebar= ({
136
140
  }
137
141
  }, [currentExpandedGroups, expandedGroups, onGroupToggle]);
138
142
 
139
- const handleItemClick = useCallback((item) => {
143
+ const handleItemClick = useCallback((item: NavigationItem) => {
140
144
  if (item.disabled) return;
141
145
 
142
146
  if (onItemClick) {
@@ -161,19 +165,27 @@ export const Sidebar= ({
161
165
  if (currentCollapsed) return 'sidebar--collapsed';
162
166
 
163
167
  switch (size) {
164
- case 'sm';
165
- case 'lg';
166
- case 'xl';
167
- default;
168
+ case 'sm':
169
+ return 'sidebar--size-sm';
170
+ case 'lg':
171
+ return 'sidebar--size-lg';
172
+ case 'xl':
173
+ return 'sidebar--size-xl';
174
+ default: // md
175
+ return 'sidebar--size-md';
168
176
  }
169
177
  };
170
178
 
171
179
  const getVariantClasses = () => {
172
180
  switch (variant) {
173
- case 'collapsible';
174
- case 'overlay';
175
- case 'drawer';
176
- default;
181
+ case 'collapsible':
182
+ return 'sidebar--collapsible';
183
+ case 'overlay':
184
+ return 'sidebar--overlay';
185
+ case 'drawer':
186
+ return 'sidebar--drawer';
187
+ default: // default
188
+ return 'sidebar--default';
177
189
  }
178
190
  };
179
191
 
@@ -183,7 +195,7 @@ export const Sidebar= ({
183
195
 
184
196
  const getPositionClasses = () => {
185
197
  if (variant === 'overlay' || variant === 'drawer') {
186
- return position === 'right' ? 'sidebar--position-right' ;
198
+ return position === 'right' ? 'sidebar--position-right' : 'sidebar--position-left';
187
199
  }
188
200
  return '';
189
201
  };
@@ -191,16 +203,17 @@ export const Sidebar= ({
191
203
  const getTransformClasses = () => {
192
204
  if (variant === 'overlay' || variant === 'drawer' || (isMobile && overlay)) {
193
205
  if (position === 'right') {
194
- return isOverlayOpen ? 'sidebar--open' ;
206
+ return isOverlayOpen ? 'sidebar--open' : 'sidebar--closed-right';
195
207
  }
196
- return isOverlayOpen ? 'sidebar--open' ;
208
+ return isOverlayOpen ? 'sidebar--open' : 'sidebar--closed-left';
197
209
  }
198
210
  return '';
199
211
  };
200
212
 
201
- const getItemClasses = (item) => {
213
+ const getItemClasses = (item: NavigationItem) => {
202
214
  let classes = `sidebar__item ${
203
- currentCollapsed ? 'sidebar__item--collapsed' }`;
215
+ currentCollapsed ? 'sidebar__item--collapsed' : 'sidebar__item--expanded'
216
+ }`;
204
217
 
205
218
  if (item.disabled) {
206
219
  classes += ' sidebar__item--disabled';
@@ -213,7 +226,7 @@ export const Sidebar= ({
213
226
  return classes;
214
227
  };
215
228
 
216
- const getGroupClasses = (groupId) => {
229
+ const getGroupClasses = (groupId: string) => {
217
230
  const isExpanded = currentExpandedGroups.includes(groupId);
218
231
  let classes = 'sidebar__group';
219
232
 
@@ -226,16 +239,16 @@ export const Sidebar= ({
226
239
  return classes;
227
240
  };
228
241
 
229
- const renderMenuItem = (item) => (
242
+ const renderMenuItem = (item: NavigationItem) => (
230
243
  <button
231
244
  key={item.id}
232
245
  onClick={() => handleItemClick(item)}
233
246
  disabled={item.disabled}
234
247
  className={getItemClasses(item)}
235
- title={currentCollapsed ? item.label }
248
+ title={currentCollapsed ? item.label : undefined}
236
249
  >
237
250
  {showItemIcons && item.icon && (
238
- <span className={`sidebar__item-icon ${currentCollapsed ? 'sidebar__item-icon--collapsed' }`}>
251
+ <span className={`sidebar__item-icon ${currentCollapsed ? 'sidebar__item-icon--collapsed' : 'sidebar__item-icon--expanded'}`}>
239
252
  {item.icon}
240
253
  </span>
241
254
  )}
@@ -255,16 +268,16 @@ export const Sidebar= ({
255
268
  </button>
256
269
  );
257
270
 
258
- const renderMenuGroup = (group) => (
271
+ const renderMenuGroup = (group: NavigationGroup) => (
259
272
  <div key={group.id}>
260
273
  <button
261
274
  onClick={() => handleGroupToggle(group.id)}
262
275
  className={getGroupClasses(group.id)}
263
- title={currentCollapsed ? group.title }
276
+ title={currentCollapsed ? group.title : undefined}
264
277
  >
265
- {/* TODO}
278
+ {/* TODO: Add icon support to NavigationGroup in future version */}
266
279
  {/* {showGroupIcons && group.icon && (
267
- <span className={currentCollapsed ? '' }>
280
+ <span className={currentCollapsed ? '' : 'mr-3'}>
268
281
  {group.icon}
269
282
  </span>
270
283
  )} */}
@@ -274,7 +287,8 @@ export const Sidebar= ({
274
287
  <div className="sidebar__group-title">{group.title}</div>
275
288
  <ChevronRightIcon
276
289
  className={`sidebar__group-arrow ${
277
- currentExpandedGroups.includes(group.id) ? 'sidebar__group-arrow--expanded' }`}
290
+ currentExpandedGroups.includes(group.id) ? 'sidebar__group-arrow--expanded' : ''
291
+ }`}
278
292
  />
279
293
  </>
280
294
  )}
@@ -308,16 +322,16 @@ export const Sidebar= ({
308
322
  <button
309
323
  onClick={handleCollapseToggle}
310
324
  className="sidebar__toggle-button"
311
- aria-label={currentCollapsed ? 'Expand sidebar' }
325
+ aria-label={currentCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}
312
326
  >
313
- {toggleIcon || (currentCollapsed ? <ChevronRightIcon className="sidebar__toggle-icon" /> ="sidebar__toggle-icon" />)}
327
+ {toggleIcon || (currentCollapsed ? <ChevronRightIcon className="sidebar__toggle-icon" /> : <ChevronLeftIcon className="sidebar__toggle-icon" />)}
314
328
  </button>
315
329
  </div>
316
330
  )}
317
331
 
318
332
  {/* Navigation Items */}
319
333
  <nav className="sidebar__navigation">
320
- {groups && groups.length > 0 ? groups.map(renderMenuGroup) )}
334
+ {groups && groups.length > 0 ? groups.map(renderMenuGroup) : items.map(renderMenuItem)}
321
335
  </nav>
322
336
 
323
337
  {/* Footer */}
@@ -337,7 +351,7 @@ export const Sidebar= ({
337
351
  {isOverlayOpen && (
338
352
  <div
339
353
  className="sidebar__overlay-backdrop"
340
- onClick={overlayCloseOnOutsideClick ? handleOverlayClose }
354
+ onClick={overlayCloseOnOutsideClick ? handleOverlayClose : undefined}
341
355
  />
342
356
  )}
343
357
 
@@ -360,7 +374,7 @@ export const Sidebar= ({
360
374
 
361
375
  // Desktop sidebar
362
376
  return (
363
- <div className={`sidebar__wrapper ${sticky ? 'sidebar__wrapper--sticky' }`}>
377
+ <div className={`sidebar__wrapper ${sticky ? 'sidebar__wrapper--sticky' : ''}`}>
364
378
  {sidebarContent}
365
379
  </div>
366
380
  );