@shohojdhara/atomix 0.3.14 → 0.4.0

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 (343) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build-tools/EXAMPLES.md +372 -0
  3. package/build-tools/README.md +242 -0
  4. package/build-tools/__tests__/error-handler.test.js +230 -0
  5. package/build-tools/__tests__/index.test.js +141 -0
  6. package/build-tools/__tests__/rollup-plugin.test.js +194 -0
  7. package/build-tools/__tests__/utils.test.js +161 -0
  8. package/build-tools/__tests__/vite-plugin.test.js +129 -0
  9. package/build-tools/__tests__/webpack-loader.test.js +190 -0
  10. package/build-tools/error-handler.js +308 -0
  11. package/build-tools/index.d.ts +44 -0
  12. package/build-tools/index.js +88 -0
  13. package/build-tools/package.json +50 -0
  14. package/build-tools/rollup-plugin.js +236 -0
  15. package/build-tools/types.d.ts +163 -0
  16. package/build-tools/utils.js +203 -0
  17. package/build-tools/vite-plugin.js +161 -0
  18. package/build-tools/webpack-loader.js +123 -0
  19. package/dist/atomix.css +21044 -2618
  20. package/dist/atomix.css.map +1 -1
  21. package/dist/atomix.min.css +77 -3
  22. package/dist/atomix.min.css.map +1 -1
  23. package/dist/build-tools/EXAMPLES.md +372 -0
  24. package/dist/build-tools/README.md +242 -0
  25. package/dist/build-tools/__tests__/error-handler.test.js +230 -0
  26. package/dist/build-tools/__tests__/index.test.js +141 -0
  27. package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
  28. package/dist/build-tools/__tests__/utils.test.js +161 -0
  29. package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
  30. package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
  31. package/dist/build-tools/error-handler.js +308 -0
  32. package/dist/build-tools/index.d.ts +44 -0
  33. package/dist/build-tools/index.js +88 -0
  34. package/dist/build-tools/package.json +50 -0
  35. package/dist/build-tools/rollup-plugin.js +236 -0
  36. package/dist/build-tools/types.d.ts +163 -0
  37. package/dist/build-tools/utils.js +203 -0
  38. package/dist/build-tools/vite-plugin.js +161 -0
  39. package/dist/build-tools/webpack-loader.js +123 -0
  40. package/dist/charts.d.ts +1 -1
  41. package/dist/charts.js +86 -57
  42. package/dist/charts.js.map +1 -1
  43. package/dist/core.d.ts +1 -1
  44. package/dist/core.js +136 -112
  45. package/dist/core.js.map +1 -1
  46. package/dist/forms.d.ts +2 -5
  47. package/dist/forms.js +140 -128
  48. package/dist/forms.js.map +1 -1
  49. package/dist/heavy.d.ts +1 -1
  50. package/dist/heavy.js +136 -112
  51. package/dist/heavy.js.map +1 -1
  52. package/dist/index.d.ts +152 -78
  53. package/dist/index.esm.js +346 -340
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/index.js +359 -353
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.min.js +1 -1
  58. package/dist/index.min.js.map +1 -1
  59. package/dist/layout.js.map +1 -1
  60. package/dist/theme.d.ts +9 -9
  61. package/dist/theme.js.map +1 -1
  62. package/package.json +23 -8
  63. package/scripts/atomix-cli.js +170 -73
  64. package/scripts/cli/__tests__/README.md +81 -0
  65. package/scripts/cli/__tests__/basic.test.js +115 -0
  66. package/scripts/cli/__tests__/component-generator.test.js +332 -0
  67. package/scripts/cli/__tests__/integration.test.js +327 -0
  68. package/scripts/cli/__tests__/test-setup.js +133 -0
  69. package/scripts/cli/__tests__/token-manager.test.js +251 -0
  70. package/scripts/cli/__tests__/utils.test.js +161 -0
  71. package/scripts/cli/component-generator.js +253 -299
  72. package/scripts/cli/dependency-checker.js +355 -0
  73. package/scripts/cli/interactive-init.js +46 -5
  74. package/scripts/cli/template-manager.js +0 -2
  75. package/scripts/cli/templates/common-templates.js +636 -0
  76. package/scripts/cli/templates/composable-templates.js +148 -126
  77. package/scripts/cli/templates/index.js +23 -16
  78. package/scripts/cli/templates/project-templates.js +151 -23
  79. package/scripts/cli/templates/react-templates.js +280 -210
  80. package/scripts/cli/templates/scss-templates.js +90 -91
  81. package/scripts/cli/templates/testing-templates.js +206 -27
  82. package/scripts/cli/templates/testing-utils.js +278 -0
  83. package/scripts/cli/templates/types-templates.js +70 -56
  84. package/scripts/cli/theme-bridge.js +8 -2
  85. package/scripts/cli/token-manager.js +318 -206
  86. package/scripts/cli/utils.js +0 -1
  87. package/src/components/Accordion/Accordion.stories.tsx +358 -850
  88. package/src/components/Accordion/Accordion.test.tsx +70 -50
  89. package/src/components/Accordion/Accordion.tsx +99 -94
  90. package/src/components/AtomixGlass/AtomixGlass.test.tsx +1 -1
  91. package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
  92. package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
  93. package/src/components/AtomixGlass/GlassFilter.tsx +9 -16
  94. package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
  95. package/src/components/AtomixGlass/glass-utils.ts +6 -5
  96. package/src/components/AtomixGlass/shader-utils.ts +133 -52
  97. package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
  98. package/src/components/AtomixGlass/stories/Examples.stories.tsx +2957 -2853
  99. package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
  100. package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
  101. package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
  102. package/src/components/AtomixGlass/stories/Playground.stories.tsx +51 -36
  103. package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +2 -2
  104. package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
  105. package/src/components/Avatar/Avatar.stories.tsx +195 -0
  106. package/src/components/Avatar/Avatar.tsx +58 -56
  107. package/src/components/Badge/Badge.stories.tsx +122 -352
  108. package/src/components/Badge/Badge.test.tsx +41 -41
  109. package/src/components/Badge/Badge.tsx +64 -62
  110. package/src/components/Block/Block.stories.tsx +30 -11
  111. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +142 -23
  112. package/src/components/Breadcrumb/Breadcrumb.tsx +62 -60
  113. package/src/components/Button/Button.stories.tsx +454 -1126
  114. package/src/components/Button/Button.test.tsx +123 -0
  115. package/src/components/Button/Button.tsx +88 -60
  116. package/src/components/Button/ButtonGroup.stories.tsx +376 -215
  117. package/src/components/Button/ButtonGroup.tsx +4 -15
  118. package/src/components/Callout/Callout.stories.tsx +316 -568
  119. package/src/components/Card/Card.stories.tsx +292 -81
  120. package/src/components/Card/Card.tsx +30 -14
  121. package/src/components/Chart/AreaChart.tsx +1 -1
  122. package/src/components/Chart/CandlestickChart.tsx +23 -16
  123. package/src/components/Chart/Chart.stories.tsx +153 -16
  124. package/src/components/Chart/Chart.tsx +40 -44
  125. package/src/components/Chart/ChartRenderer.tsx +39 -12
  126. package/src/components/Chart/ChartToolbar.tsx +21 -5
  127. package/src/components/Chart/DonutChart.tsx +1 -1
  128. package/src/components/Chart/FunnelChart.tsx +4 -1
  129. package/src/components/Chart/GaugeChart.tsx +3 -1
  130. package/src/components/Chart/HeatmapChart.tsx +50 -37
  131. package/src/components/Chart/LineChart.tsx +3 -2
  132. package/src/components/Chart/MultiAxisChart.tsx +24 -16
  133. package/src/components/Chart/RadarChart.tsx +19 -17
  134. package/src/components/Chart/ScatterChart.tsx +29 -21
  135. package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +152 -66
  136. package/src/components/ColorModeToggle/ColorModeToggle.tsx +15 -3
  137. package/src/components/Countdown/Countdown.stories.tsx +114 -7
  138. package/src/components/DataTable/DataTable.stories.tsx +349 -144
  139. package/src/components/DataTable/DataTable.test.tsx +26 -148
  140. package/src/components/DataTable/DataTable.tsx +485 -456
  141. package/src/components/DatePicker/DatePicker.stories.tsx +310 -1066
  142. package/src/components/DatePicker/DatePicker.tsx +31 -26
  143. package/src/components/Dropdown/Dropdown.stories.tsx +153 -36
  144. package/src/components/Dropdown/Dropdown.tsx +313 -299
  145. package/src/components/EdgePanel/EdgePanel.stories.tsx +221 -25
  146. package/src/components/EdgePanel/EdgePanel.tsx +1 -3
  147. package/src/components/Footer/Footer.stories.tsx +396 -327
  148. package/src/components/Footer/Footer.tsx +130 -128
  149. package/src/components/Footer/FooterLink.tsx +2 -2
  150. package/src/components/Form/Checkbox.stories.tsx +140 -6
  151. package/src/components/Form/Checkbox.test.tsx +63 -0
  152. package/src/components/Form/Checkbox.tsx +122 -78
  153. package/src/components/Form/Form.stories.tsx +110 -19
  154. package/src/components/Form/FormGroup.stories.tsx +127 -4
  155. package/src/components/Form/Input.stories.tsx +22 -39
  156. package/src/components/Form/Input.test.tsx +38 -44
  157. package/src/components/Form/Radio.stories.tsx +146 -17
  158. package/src/components/Form/Radio.tsx +68 -66
  159. package/src/components/Form/Select.stories.tsx +140 -8
  160. package/src/components/Form/Select.tsx +184 -182
  161. package/src/components/Form/Textarea.stories.tsx +149 -6
  162. package/src/components/Form/Textarea.test.tsx +27 -32
  163. package/src/components/Hero/Hero.stories.tsx +372 -38
  164. package/src/components/Hero/Hero.tsx +201 -55
  165. package/src/components/Icon/index.ts +7 -1
  166. package/src/components/List/List.stories.tsx +141 -3
  167. package/src/components/List/List.tsx +19 -23
  168. package/src/components/Modal/Modal.stories.tsx +183 -43
  169. package/src/components/Modal/Modal.tsx +130 -127
  170. package/src/components/Navigation/Menu/MegaMenu.tsx +70 -70
  171. package/src/components/Navigation/Nav/NavDropdown.tsx +1 -5
  172. package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +128 -28
  173. package/src/components/Navigation/SideMenu/SideMenu.tsx +5 -7
  174. package/src/components/Navigation/SideMenu/SideMenuItem.tsx +4 -5
  175. package/src/components/Pagination/Pagination.stories.tsx +7 -4
  176. package/src/components/Pagination/Pagination.tsx +199 -202
  177. package/src/components/PhotoViewer/PhotoViewer.tsx +4 -1
  178. package/src/components/Popover/Popover.stories.tsx +354 -97
  179. package/src/components/Popover/Popover.tsx +41 -37
  180. package/src/components/Progress/Progress.stories.tsx +160 -7
  181. package/src/components/River/River.stories.tsx +3 -2
  182. package/src/components/SectionIntro/SectionIntro.stories.tsx +239 -47
  183. package/src/components/Slider/Slider.stories.tsx +12 -4
  184. package/src/components/Spinner/Spinner.stories.tsx +104 -8
  185. package/src/components/Spinner/Spinner.test.tsx +23 -23
  186. package/src/components/Spinner/Spinner.tsx +43 -46
  187. package/src/components/Steps/Steps.stories.tsx +173 -42
  188. package/src/components/Tabs/Tabs.stories.tsx +141 -12
  189. package/src/components/Tabs/Tabs.tsx +74 -72
  190. package/src/components/Testimonial/Testimonial.stories.tsx +120 -3
  191. package/src/components/Todo/Todo.stories.tsx +198 -9
  192. package/src/components/Toggle/Toggle.stories.tsx +137 -36
  193. package/src/components/Toggle/Toggle.test.tsx +65 -70
  194. package/src/components/Toggle/Toggle.tsx +4 -1
  195. package/src/components/Tooltip/Tooltip.stories.tsx +194 -100
  196. package/src/components/Tooltip/Tooltip.tsx +104 -106
  197. package/src/components/Upload/Upload.stories.tsx +241 -150
  198. package/src/components/Upload/Upload.tsx +287 -283
  199. package/src/components/VideoPlayer/VideoPlayer.tsx +6 -1
  200. package/src/components/index.ts +13 -2
  201. package/src/layouts/Grid/Grid.stories.tsx +9 -3
  202. package/src/layouts/MasonryGrid/MasonryGrid.tsx +5 -1
  203. package/src/lib/README.md +2 -2
  204. package/src/lib/__tests__/theme-tools.test.ts +219 -0
  205. package/src/lib/composables/index.ts +2 -2
  206. package/src/lib/composables/shared-mouse-tracker.ts +13 -14
  207. package/src/lib/composables/useAtomixGlass.ts +126 -97
  208. package/src/lib/composables/useChartExport.ts +3 -8
  209. package/src/lib/composables/useDataTable.ts +72 -43
  210. package/src/lib/composables/useHero.ts +58 -14
  211. package/src/lib/composables/useHeroBackgroundSlider.ts +2 -9
  212. package/src/lib/composables/useInput.ts +10 -8
  213. package/src/lib/composables/useSideMenu.ts +6 -5
  214. package/src/lib/composables/useTooltip.ts +1 -2
  215. package/src/lib/composables/useVideoPlayer.ts +44 -35
  216. package/src/lib/config/index.ts +154 -154
  217. package/src/lib/constants/components.ts +9 -32
  218. package/src/lib/constants/cssVariables.ts +29 -29
  219. package/src/lib/hooks/__tests__/useComponentCustomization.test.ts +2 -6
  220. package/src/lib/hooks/index.ts +1 -1
  221. package/src/lib/hooks/useComponentCustomization.ts +11 -17
  222. package/src/lib/hooks/usePerformanceMonitor.ts +6 -7
  223. package/src/lib/patterns/__tests__/slots.test.ts +1 -1
  224. package/src/lib/patterns/index.ts +1 -1
  225. package/src/lib/patterns/slots.tsx +8 -13
  226. package/src/lib/storybook/InteractiveDemo.tsx +13 -18
  227. package/src/lib/storybook/PreviewContainer.tsx +1 -1
  228. package/src/lib/storybook/VariantsGrid.tsx +3 -7
  229. package/src/lib/storybook/index.ts +1 -1
  230. package/src/lib/theme/adapters/cssVariableMapper.ts +47 -74
  231. package/src/lib/theme/adapters/index.ts +3 -9
  232. package/src/lib/theme/adapters/themeAdapter.ts +41 -26
  233. package/src/lib/theme/config/index.ts +1 -1
  234. package/src/lib/theme/config/types.ts +2 -2
  235. package/src/lib/theme/config/validator.ts +10 -5
  236. package/src/lib/theme/constants/constants.ts +2 -2
  237. package/src/lib/theme/constants/index.ts +1 -2
  238. package/src/lib/theme/core/__tests__/createTheme.test.ts +20 -22
  239. package/src/lib/theme/core/composeTheme.ts +32 -26
  240. package/src/lib/theme/core/createTheme.ts +1 -1
  241. package/src/lib/theme/core/createThemeObject.ts +308 -301
  242. package/src/lib/theme/core/index.ts +3 -3
  243. package/src/lib/theme/devtools/CLI.ts +107 -105
  244. package/src/lib/theme/devtools/Comparator.tsx +50 -32
  245. package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +50 -48
  246. package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +257 -63
  247. package/src/lib/theme/devtools/Inspector.tsx +75 -60
  248. package/src/lib/theme/devtools/LiveEditor.tsx +97 -76
  249. package/src/lib/theme/devtools/Preview.tsx +150 -106
  250. package/src/lib/theme/devtools/ThemeValidator.ts +29 -21
  251. package/src/lib/theme/devtools/index.ts +3 -9
  252. package/src/lib/theme/devtools/useHistory.ts +23 -21
  253. package/src/lib/theme/errors/errors.ts +12 -11
  254. package/src/lib/theme/errors/index.ts +2 -7
  255. package/src/lib/theme/generators/generateCSS.ts +9 -13
  256. package/src/lib/theme/generators/generateCSSNested.ts +1 -6
  257. package/src/lib/theme/generators/generateCSSVariables.ts +673 -630
  258. package/src/lib/theme/generators/index.ts +1 -4
  259. package/src/lib/theme/i18n/index.ts +1 -1
  260. package/src/lib/theme/i18n/rtl.ts +13 -13
  261. package/src/lib/theme/index.ts +7 -16
  262. package/src/lib/theme/runtime/ThemeApplicator.ts +4 -4
  263. package/src/lib/theme/runtime/ThemeContext.tsx +1 -1
  264. package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +19 -23
  265. package/src/lib/theme/runtime/ThemeProvider.tsx +230 -239
  266. package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +1 -1
  267. package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +24 -29
  268. package/src/lib/theme/runtime/index.ts +2 -5
  269. package/src/lib/theme/runtime/useTheme.ts +18 -18
  270. package/src/lib/theme/runtime/useThemeTokens.ts +22 -22
  271. package/src/lib/theme/test/testTheme.ts +15 -16
  272. package/src/lib/theme/tokens/index.ts +2 -7
  273. package/src/lib/theme/tokens/tokens.ts +25 -24
  274. package/src/lib/theme/types.ts +428 -411
  275. package/src/lib/theme/utils/__tests__/themeValidation.test.ts +3 -3
  276. package/src/lib/theme/utils/componentTheming.ts +18 -18
  277. package/src/lib/theme/utils/domUtils.ts +277 -289
  278. package/src/lib/theme/utils/index.ts +1 -2
  279. package/src/lib/theme/utils/injectCSS.ts +10 -14
  280. package/src/lib/theme/utils/naming.ts +20 -16
  281. package/src/lib/theme/utils/themeHelpers.ts +10 -12
  282. package/src/lib/theme/utils/themeUtils.ts +85 -86
  283. package/src/lib/theme/utils/themeValidation.ts +82 -33
  284. package/src/lib/theme-tools.ts +8 -6
  285. package/src/lib/types/components.ts +172 -71
  286. package/src/lib/types/partProps.ts +1 -1
  287. package/src/lib/utils/__tests__/csv.test.ts +45 -0
  288. package/src/lib/utils/componentUtils.ts +8 -12
  289. package/src/lib/utils/csv.ts +19 -0
  290. package/src/lib/utils/dataTableExport.ts +2 -15
  291. package/src/lib/utils/fontPreloader.ts +10 -19
  292. package/src/lib/utils/icons.ts +4 -1
  293. package/src/lib/utils/index.ts +2 -6
  294. package/src/lib/utils/memoryMonitor.ts +10 -8
  295. package/src/lib/utils/themeNaming.ts +2 -2
  296. package/src/styles/01-settings/_index.scss +1 -1
  297. package/src/styles/01-settings/_settings.accordion.scss +28 -7
  298. package/src/styles/01-settings/_settings.colors.scss +11 -11
  299. package/src/styles/01-settings/_settings.design-tokens.scss +61 -50
  300. package/src/styles/01-settings/_settings.navbar.scss +1 -1
  301. package/src/styles/01-settings/_settings.spacing.scss +3 -4
  302. package/src/styles/01-settings/_settings.tooltip.scss +1 -1
  303. package/src/styles/01-settings/_settings.typography.scss +4 -4
  304. package/src/styles/02-tools/_tools.button.scss +51 -21
  305. package/src/styles/02-tools/_tools.utility-api.scss +38 -12
  306. package/src/styles/03-generic/_generic.root.scss +4 -3
  307. package/src/styles/06-components/_components.accordion.scss +56 -14
  308. package/src/styles/06-components/_components.atomix-glass.scss +13 -9
  309. package/src/styles/06-components/_components.button.scss +16 -4
  310. package/src/styles/06-components/_components.callout.scss +27 -21
  311. package/src/styles/06-components/_components.card.scss +5 -14
  312. package/src/styles/06-components/_components.chart.scss +22 -19
  313. package/src/styles/06-components/_components.checkbox.scss +25 -17
  314. package/src/styles/06-components/_components.color-mode-toggle.scss +3 -1
  315. package/src/styles/06-components/_components.edge-panel.scss +9 -2
  316. package/src/styles/06-components/_components.footer.scss +1 -1
  317. package/src/styles/06-components/_components.side-menu.scss +5 -5
  318. package/src/styles/06-components/_components.toggle.scss +18 -0
  319. package/src/styles/06-components/_index.scss +1 -1
  320. package/src/styles/06-components/old.chart.styles.scss +0 -2
  321. package/src/styles/99-utilities/_index.scss +2 -0
  322. package/src/styles/99-utilities/_utilities.border.scss +69 -27
  323. package/src/styles/99-utilities/_utilities.display.scss +1 -1
  324. package/src/styles/99-utilities/_utilities.opacity.scss +10 -0
  325. package/src/styles/99-utilities/_utilities.position.scss +16 -9
  326. package/src/styles/99-utilities/_utilities.scss +2 -0
  327. package/src/styles/99-utilities/_utilities.sizes.scss +47 -18
  328. package/src/styles/99-utilities/_utilities.spacing.scss +118 -66
  329. package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
  330. package/src/styles/99-utilities/_utilities.text.scss +67 -46
  331. package/themes/dark-complementary/README.md +98 -0
  332. package/themes/dark-complementary/index.scss +158 -0
  333. package/themes/default-light/README.md +81 -0
  334. package/themes/default-light/index.scss +154 -0
  335. package/themes/high-contrast/README.md +105 -0
  336. package/themes/high-contrast/index.scss +172 -0
  337. package/themes/test-theme/README.md +38 -0
  338. package/themes/test-theme/index.scss +47 -0
  339. package/scripts/cli/templates-original-backup.js +0 -1655
  340. package/scripts/cli/templates_backup.js +0 -684
  341. package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
  342. package/src/lib/composables/useButton.ts +0 -93
  343. package/src/lib/composables/useCheckbox.ts +0 -70
@@ -267,32 +267,37 @@ export const DatePicker = forwardRef<DatePickerRef, DatePickerProps>(
267
267
  </>
268
268
  )}
269
269
 
270
- {viewMode === 'years' && (() => {
271
- const years = generateYears();
272
- return (
273
- <>
274
- <button
275
- type="button"
276
- className="c-datepicker__nav-button c-datepicker__nav-button--prev-decade"
277
- onClick={handlePrevDecade}
278
- aria-label="Previous decade"
279
- >
280
- <Icon name="CaretDoubleLeft" size="sm" />
281
- </button>
282
- <button type="button" className="c-datepicker__view-switch" onClick={switchToDayView}>
283
- {years[0]} - {years[years.length - 1]}
284
- </button>
285
- <button
286
- type="button"
287
- className="c-datepicker__nav-button c-datepicker__nav-button--next-decade"
288
- onClick={handleNextDecade}
289
- aria-label="Next decade"
290
- >
291
- <Icon name="CaretDoubleRight" size="sm" />
292
- </button>
293
- </>
294
- );
295
- })()}
270
+ {viewMode === 'years' &&
271
+ (() => {
272
+ const years = generateYears();
273
+ return (
274
+ <>
275
+ <button
276
+ type="button"
277
+ className="c-datepicker__nav-button c-datepicker__nav-button--prev-decade"
278
+ onClick={handlePrevDecade}
279
+ aria-label="Previous decade"
280
+ >
281
+ <Icon name="CaretDoubleLeft" size="sm" />
282
+ </button>
283
+ <button
284
+ type="button"
285
+ className="c-datepicker__view-switch"
286
+ onClick={switchToDayView}
287
+ >
288
+ {years[0]} - {years[years.length - 1]}
289
+ </button>
290
+ <button
291
+ type="button"
292
+ className="c-datepicker__nav-button c-datepicker__nav-button--next-decade"
293
+ onClick={handleNextDecade}
294
+ aria-label="Next decade"
295
+ >
296
+ <Icon name="CaretDoubleRight" size="sm" />
297
+ </button>
298
+ </>
299
+ );
300
+ })()}
296
301
  </div>
297
302
 
298
303
  <div className="c-datepicker__body">
@@ -1,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
2
3
  import React, { useState } from 'react';
3
4
  import { ThemeColor } from '../../lib/types/components';
4
5
  import { Icon } from '../Icon';
@@ -12,8 +13,72 @@ const meta = {
12
13
  layout: 'centered',
13
14
  docs: {
14
15
  description: {
15
- component:
16
- 'The Dropdown component provides a toggleable menu that appears relative to a trigger element. It supports multiple placement options, click or hover triggers, and can include dividers, headers, and icons. Dropdowns are ideal for navigation menus, action menus, or any context where options need to be revealed on demand.',
16
+ component: `
17
+ # Dropdown
18
+
19
+ ## Overview
20
+
21
+ Dropdown provides a toggleable menu that appears relative to a trigger element. It supports multiple placement options, click or hover triggers, and can include dividers, headers, and icons. Dropdowns are ideal for navigation menus, action menus, or any context where options need to be revealed on demand.
22
+
23
+ ## Features
24
+
25
+ - Multiple placement options (top, bottom, left, right with start/end variations)
26
+ - Click or hover trigger modes
27
+ - Color variants
28
+ - Glass morphism effect
29
+ - Customizable dimensions
30
+ - Auto-close behaviors
31
+ - Rich content support (headers, dividers, icons)
32
+
33
+ ## Accessibility
34
+
35
+ - Keyboard support: Navigate with arrow keys, activate with Enter/Space
36
+ - Screen reader: Menu items and structure announced properly
37
+ - ARIA support: Proper roles and properties for dropdown components
38
+ - Focus management: Maintains focus within the dropdown menu
39
+
40
+ ## Usage Examples
41
+
42
+ ### Basic Usage
43
+
44
+ \`\`\`tsx
45
+ <Dropdown
46
+ trigger="click"
47
+ placement="bottom-start"
48
+ children={<button>Dropdown</button>}
49
+ menu={<div>Menu content</div>}
50
+ />
51
+ \`\`\`
52
+
53
+ ### With Glass Effect
54
+
55
+ \`\`\`tsx
56
+ <Dropdown
57
+ trigger="click"
58
+ placement="bottom-start"
59
+ glass={true}
60
+ children={<button>Dropdown</button>}
61
+ menu={<div>Menu content</div>}
62
+ />
63
+ \`\`\`
64
+
65
+ ## API Reference
66
+
67
+ ### Props
68
+
69
+ | Prop | Type | Default | Description |
70
+ | ---- | ---- | ------- | ----------- |
71
+ | placement | Placement | 'bottom-start' | The placement of the dropdown menu relative to the trigger element |
72
+ | trigger | 'click' \\| 'hover' | 'click' | How the dropdown is triggered - by click or hover |
73
+ | variant | ThemeColor | 'secondary' | The color variant of the dropdown |
74
+ | minWidth | string | - | Minimum width of the dropdown menu |
75
+ | maxHeight | string | - | Maximum height of the dropdown menu |
76
+ | closeOnClickOutside | boolean | true | Whether to close the dropdown when clicking outside |
77
+ | closeOnEscape | boolean | true | Whether to close the dropdown when pressing the Escape key |
78
+ | glass | boolean | false | Enable glass morphism effect |
79
+ | isOpen | boolean | - | Controlled open state of the dropdown |
80
+ | onOpenChange | (open: boolean) => void | - | Callback when open state changes |
81
+ `,
17
82
  },
18
83
  },
19
84
  },
@@ -32,36 +97,80 @@ const meta = {
32
97
  'right-end',
33
98
  ],
34
99
  description: 'The placement of the dropdown menu relative to the trigger element',
100
+ table: {
101
+ type: { summary: 'Placement' },
102
+ defaultValue: { summary: 'bottom-start' },
103
+ },
35
104
  },
36
105
  trigger: {
37
106
  control: { type: 'radio' },
38
107
  options: ['click', 'hover'],
39
108
  description: 'How the dropdown is triggered - by click or hover',
109
+ table: {
110
+ type: { summary: '"click" | "hover"' },
111
+ defaultValue: { summary: 'click' },
112
+ },
40
113
  },
41
114
  variant: {
42
115
  control: { type: 'select' },
43
116
  options: THEME_COLORS,
44
117
  description: 'The color variant of the dropdown',
118
+ table: {
119
+ type: { summary: 'ThemeColor' },
120
+ defaultValue: { summary: 'secondary' },
121
+ },
45
122
  },
46
123
  minWidth: {
47
124
  control: 'text',
48
125
  description: 'Minimum width of the dropdown menu',
126
+ table: {
127
+ type: { summary: 'string' },
128
+ defaultValue: { summary: '-' },
129
+ },
49
130
  },
50
131
  maxHeight: {
51
132
  control: 'text',
52
133
  description: 'Maximum height of the dropdown menu',
134
+ table: {
135
+ type: { summary: 'string' },
136
+ defaultValue: { summary: '-' },
137
+ },
53
138
  },
54
139
  closeOnClickOutside: {
55
140
  control: 'boolean',
56
141
  description: 'Whether to close the dropdown when clicking outside',
142
+ table: {
143
+ type: { summary: 'boolean' },
144
+ defaultValue: { summary: true },
145
+ },
57
146
  },
58
147
  closeOnEscape: {
59
148
  control: 'boolean',
60
149
  description: 'Whether to close the dropdown when pressing the Escape key',
150
+ table: {
151
+ type: { summary: 'boolean' },
152
+ defaultValue: { summary: true },
153
+ },
61
154
  },
62
155
  glass: {
63
156
  control: 'boolean',
64
157
  description: 'Enable glass morphism effect',
158
+ table: {
159
+ type: { summary: 'boolean' },
160
+ defaultValue: { summary: false },
161
+ },
162
+ },
163
+ isOpen: {
164
+ control: 'boolean',
165
+ description: 'Controlled open state of the dropdown',
166
+ table: {
167
+ type: { summary: 'boolean' },
168
+ defaultValue: { summary: '-' },
169
+ },
170
+ },
171
+ onOpenChange: {
172
+ action: 'open state changed',
173
+ description: 'Callback when open state changes',
65
174
  },
66
175
  },
67
176
  } satisfies Meta<typeof Dropdown>;
@@ -85,10 +194,7 @@ const InteractiveDropdown = (args: React.ComponentProps<typeof Dropdown>) => {
85
194
  );
86
195
  };
87
196
 
88
- /**
89
- * Basic dropdown example with default settings
90
- */
91
- export const Default: Story = {
197
+ export const BasicUsage: Story = {
92
198
  args: {
93
199
  trigger: 'click',
94
200
  placement: 'bottom-start',
@@ -99,35 +205,49 @@ export const Default: Story = {
99
205
  ),
100
206
  menu: (
101
207
  <>
102
- <DropdownItem>Menu item 1</DropdownItem>
103
- <DropdownItem>Menu item 2</DropdownItem>
104
- <DropdownItem>Menu item 3</DropdownItem>
208
+ <DropdownHeader>Dropdown Header</DropdownHeader>
209
+ <DropdownDivider />
210
+ <DropdownItem>Option 1</DropdownItem>
211
+ <DropdownItem>Option 2</DropdownItem>
212
+ <DropdownItem>Option 3</DropdownItem>
213
+ <DropdownDivider />
214
+ <DropdownItem disabled>Disabled Option</DropdownItem>
105
215
  </>
106
216
  ),
107
217
  },
108
- render: args => <InteractiveDropdown {...args} />,
109
- };
110
-
111
- /**
112
- * Dropdown that opens on click
113
- */
114
- export const ClickTrigger: Story = {
115
- args: {
116
- ...Default.args,
117
- trigger: 'click',
218
+ parameters: {
219
+ docs: {
220
+ description: {
221
+ story: 'Basic dropdown with default settings and menu items.',
222
+ },
223
+ },
118
224
  },
119
- render: args => <InteractiveDropdown {...args} />,
120
225
  };
121
226
 
122
- /**
123
- * Dropdown that opens on hover
124
- */
125
227
  export const HoverTrigger: Story = {
126
228
  args: {
127
- ...Default.args,
128
229
  trigger: 'hover',
230
+ placement: 'bottom-start',
231
+ children: (
232
+ <button className="c-btn c-btn--secondary">
233
+ Hover Dropdown <Icon name="CaretDown" className="c-dropdown__toggle-icon" size="sm" />
234
+ </button>
235
+ ),
236
+ menu: (
237
+ <>
238
+ <DropdownItem>Hover Option 1</DropdownItem>
239
+ <DropdownItem>Hover Option 2</DropdownItem>
240
+ <DropdownItem>Hover Option 3</DropdownItem>
241
+ </>
242
+ ),
243
+ },
244
+ parameters: {
245
+ docs: {
246
+ description: {
247
+ story: 'Dropdown that opens on hover instead of click.',
248
+ },
249
+ },
129
250
  },
130
- render: args => <InteractiveDropdown {...args} />,
131
251
  };
132
252
 
133
253
  /**
@@ -135,7 +255,7 @@ export const HoverTrigger: Story = {
135
255
  */
136
256
  export const WithIcons: Story = {
137
257
  args: {
138
- ...Default.args,
258
+ ...BasicUsage.args,
139
259
  menu: (
140
260
  <>
141
261
  <DropdownItem icon={<Icon name="House" size="sm" />}>Home</DropdownItem>
@@ -153,7 +273,7 @@ export const WithIcons: Story = {
153
273
  */
154
274
  export const WithLinks: Story = {
155
275
  args: {
156
- ...Default.args,
276
+ ...BasicUsage.args,
157
277
  menu: (
158
278
  <>
159
279
  <DropdownItem href="#home">Home</DropdownItem>
@@ -171,7 +291,7 @@ export const WithLinks: Story = {
171
291
  */
172
292
  export const WithHeader: Story = {
173
293
  args: {
174
- ...Default.args,
294
+ ...BasicUsage.args,
175
295
  menu: (
176
296
  <>
177
297
  <DropdownHeader>Account Options</DropdownHeader>
@@ -192,7 +312,7 @@ export const WithHeader: Story = {
192
312
  */
193
313
  export const ActiveItem: Story = {
194
314
  args: {
195
- ...Default.args,
315
+ ...BasicUsage.args,
196
316
  menu: (
197
317
  <>
198
318
  <DropdownItem active>Active Item</DropdownItem>
@@ -209,7 +329,7 @@ export const ActiveItem: Story = {
209
329
  */
210
330
  export const DisabledItem: Story = {
211
331
  args: {
212
- ...Default.args,
332
+ ...BasicUsage.args,
213
333
  menu: (
214
334
  <>
215
335
  <DropdownItem>Regular Item</DropdownItem>
@@ -259,10 +379,7 @@ export const AllPlacements: Story = {
259
379
  }}
260
380
  >
261
381
  {placements.map(placement => (
262
- <div
263
- key={placement.value}
264
- className="u-flex u-items-center u-justify-center"
265
- >
382
+ <div key={placement.value} className="u-flex u-items-center u-justify-center">
266
383
  <Dropdown
267
384
  trigger="click"
268
385
  placement={placement.value as any}
@@ -358,7 +475,7 @@ export const AllVariants: Story = {
358
475
  */
359
476
  export const GlassDropdown: Story = {
360
477
  args: {
361
- ...Default.args,
478
+ ...BasicUsage.args,
362
479
  glass: true,
363
480
  },
364
481
  render: args => <InteractiveDropdown {...args} />,
@@ -382,7 +499,7 @@ export const GlassDropdown: Story = {
382
499
  */
383
500
  export const GlassDropdownCustom: Story = {
384
501
  args: {
385
- ...Default.args,
502
+ ...BasicUsage.args,
386
503
  glass: {
387
504
  displacementScale: 80,
388
505
  blurAmount: 2,