@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
@@ -1,17 +1,116 @@
1
+ /**
2
+ * ButtonGroup.stories.tsx
3
+ *
4
+ * Comprehensive Storybook stories for ButtonGroup
5
+ *
6
+ * @package Atomix
7
+ * @component ButtonGroup
8
+ */
9
+
1
10
  import type { Meta, StoryObj } from '@storybook/react';
11
+ import { useState } from 'react';
2
12
  import { ButtonGroup } from './ButtonGroup';
3
13
  import { Button } from './Button';
4
14
  import { SIZES } from '../../lib/constants/components';
5
15
 
6
- const meta = {
16
+ // ============================================================================
17
+ // TYPE DEFINITIONS
18
+ // ============================================================================
19
+
20
+ /**
21
+ * Type helper for story props without children requirement
22
+ */
23
+ type ButtonGroupStoryProps = Omit<React.ComponentProps<typeof ButtonGroup>, 'children'> & {
24
+ children?: React.ReactNode;
25
+ };
26
+
27
+ // ============================================================================
28
+ // SHARED UTILITIES & CONSTANTS
29
+ // ============================================================================
30
+
31
+ /**
32
+ * Sample data for stories
33
+ */
34
+ const sampleButtonTitles = {
35
+ basic: ['Left', 'Middle', 'Right'],
36
+ actions: ['Cancel', 'Save Draft', 'Publish'],
37
+ navigation: ['First', 'Previous', 'Next', 'Last'],
38
+ filters: ['All', 'Active', 'Completed'],
39
+ };
40
+
41
+ // ============================================================================
42
+ // META CONFIGURATION
43
+ // ============================================================================
44
+
45
+ const meta: Meta<typeof ButtonGroup> = {
7
46
  title: 'Components/ButtonGroup',
8
47
  component: ButtonGroup,
9
48
  parameters: {
10
49
  layout: 'centered',
11
50
  docs: {
12
51
  description: {
13
- component:
14
- 'The ButtonGroup component groups multiple buttons together, creating a visually connected set of buttons with proper border radius handling. Buttons in a group share borders and have rounded corners only on the outer edges.',
52
+ component: `
53
+ # ButtonGroup
54
+
55
+ The ButtonGroup component groups multiple buttons together, creating a visually connected set of buttons with proper border radius handling. Buttons in a group share borders and have rounded corners only on the outer edges.
56
+
57
+ ## Features
58
+
59
+ - Connects multiple buttons with shared borders
60
+ - Proper border-radius handling for first and last buttons
61
+ - Supports all Button component variants and sizes
62
+ - Maintains accessibility features
63
+ - Responsive design
64
+
65
+ ## Accessibility
66
+
67
+ - Keyboard support: Tab to focus, Enter/Space to activate buttons
68
+ - Screen reader: Announces button labels and group context
69
+ - ARIA support: Role and labeling options
70
+ - Focus management: Visual focus indicators
71
+
72
+ ## Usage Examples
73
+
74
+ ### Basic Usage
75
+
76
+ \`\`\`tsx
77
+ <ButtonGroup>
78
+ <Button label="Left" />
79
+ <Button label="Middle" />
80
+ <Button label="Right" />
81
+ </ButtonGroup>
82
+ \`\`\`
83
+
84
+ ### With Variants
85
+
86
+ \`\`\`tsx
87
+ <ButtonGroup>
88
+ <Button label="Cancel" variant="secondary" />
89
+ <Button label="Save" variant="primary" />
90
+ </ButtonGroup>
91
+ \`\`\`
92
+
93
+ ## API Reference
94
+
95
+ ### Props
96
+
97
+ | Prop | Type | Default | Description |
98
+ | ---- | ---- | ------- | ----------- |
99
+ | vertical | boolean | false | Whether to stack buttons vertically |
100
+ | className | string | - | Additional CSS classes |
101
+ | children | ReactNode | - | Button elements to group |
102
+
103
+ ## Design Tokens
104
+
105
+ Used design tokens:
106
+
107
+ - \`--atomix-btn-group-gap\`: Gap between buttons in group
108
+ - \`--atomix-btn-group-border-radius\`: Border radius for button groups
109
+
110
+ ## Notes
111
+
112
+ When using ButtonGroup, ensure that all child buttons are of the same size for consistent appearance.
113
+ `,
15
114
  },
16
115
  },
17
116
  },
@@ -19,15 +118,10 @@ const meta = {
19
118
  argTypes: {
20
119
  className: {
21
120
  control: 'text',
22
- description: 'Additional CSS class names',
23
- },
24
- 'aria-label': {
25
- control: 'text',
26
- description: 'ARIA label for accessibility',
27
- },
28
- role: {
29
- control: 'text',
30
- description: 'ARIA role for the button group',
121
+ description: 'Additional CSS classes for the button group',
122
+ table: {
123
+ type: { summary: 'string' },
124
+ },
31
125
  },
32
126
  },
33
127
  } satisfies Meta<typeof ButtonGroup>;
@@ -35,281 +129,348 @@ const meta = {
35
129
  export default meta;
36
130
  type Story = StoryObj<typeof meta>;
37
131
 
38
- // Basic Button Groups
39
- export const Basic: Story = {
40
- render: () => (
41
- <ButtonGroup>
42
- <Button label="Left" />
43
- <Button label="Middle" />
44
- <Button label="Right" />
45
- </ButtonGroup>
46
- ),
47
- };
48
-
49
- export const TwoButtons: Story = {
50
- render: () => (
51
- <ButtonGroup>
52
- <Button label="Cancel" variant="secondary" />
53
- <Button label="Save" variant="primary" />
54
- </ButtonGroup>
55
- ),
56
- };
57
-
58
- export const ThreeButtons: Story = {
59
- render: () => (
60
- <ButtonGroup>
61
- <Button label="Previous" variant="secondary" />
62
- <Button label="Next" variant="primary" />
63
- <Button label="Finish" variant="success" />
64
- </ButtonGroup>
65
- ),
66
- };
132
+ // ============================================================================
133
+ // BASIC USAGE STORIES
134
+ // ============================================================================
67
135
 
68
- // Variant Combinations
69
- export const PrimaryGroup: Story = {
70
- render: () => (
71
- <ButtonGroup>
72
- <Button label="One" variant="primary" />
73
- <Button label="Two" variant="primary" />
74
- <Button label="Three" variant="primary" />
75
- </ButtonGroup>
76
- ),
136
+ export const BasicUsage: Story = {
137
+ args: {
138
+ children: (
139
+ <>
140
+ <Button label="Left" variant="primary" />
141
+ <Button label="Middle" variant="primary" />
142
+ <Button label="Right" variant="primary" />
143
+ </>
144
+ ),
145
+ },
77
146
  };
78
147
 
79
- export const SecondaryGroup: Story = {
80
- render: () => (
81
- <ButtonGroup>
82
- <Button label="One" variant="secondary" />
83
- <Button label="Two" variant="secondary" />
84
- <Button label="Three" variant="secondary" />
85
- </ButtonGroup>
86
- ),
87
- };
148
+ // ============================================================================
149
+ // VARIANTS & STATES STORIES
150
+ // ============================================================================
88
151
 
89
- export const OutlineGroup: Story = {
152
+ export const HorizontalGroup: Story = {
90
153
  render: () => (
91
154
  <ButtonGroup>
92
- <Button label="One" variant="outline-primary" />
93
- <Button label="Two" variant="outline-primary" />
94
- <Button label="Three" variant="outline-primary" />
155
+ <Button label="Left" variant="primary" />
156
+ <Button label="Middle" variant="secondary" />
157
+ <Button label="Right" variant="success" />
95
158
  </ButtonGroup>
96
159
  ),
97
160
  };
98
161
 
99
- export const MixedVariants: Story = {
162
+ export const VerticalGroup: Story = {
100
163
  render: () => (
101
- <ButtonGroup>
102
- <Button label="Cancel" variant="secondary" />
103
- <Button label="Save Draft" variant="outline-primary" />
104
- <Button label="Publish" variant="primary" />
164
+ <ButtonGroup vertical={true}>
165
+ <Button label="Top" variant="primary" />
166
+ <Button label="Middle" variant="secondary" />
167
+ <Button label="Bottom" variant="success" />
105
168
  </ButtonGroup>
106
169
  ),
107
170
  };
108
171
 
109
- // Size Variants
110
- export const SmallSize: Story = {
172
+ export const GroupWithSizes: Story = {
111
173
  render: () => (
112
174
  <ButtonGroup>
113
- <Button label="Small" size="sm" />
114
- <Button label="Buttons" size="sm" />
115
- <Button label="Group" size="sm" />
175
+ <Button label="Small" variant="primary" size="sm" />
176
+ <Button label="Medium" variant="primary" size="md" />
177
+ <Button label="Large" variant="primary" size="lg" />
116
178
  </ButtonGroup>
117
179
  ),
118
180
  };
119
181
 
120
- export const MediumSize: Story = {
121
- render: () => (
122
- <ButtonGroup>
123
- <Button label="Medium" size="md" />
124
- <Button label="Buttons" size="md" />
125
- <Button label="Group" size="md" />
126
- </ButtonGroup>
127
- ),
128
- };
182
+ export const GroupWithIcons: Story = {
183
+ render: () => {
184
+ const Icon = () => (
185
+ <svg
186
+ xmlns="http://www.w3.org/2000/svg"
187
+ width="16"
188
+ height="16"
189
+ viewBox="0 0 24 24"
190
+ fill="none"
191
+ stroke="currentColor"
192
+ strokeWidth="2"
193
+ strokeLinecap="round"
194
+ strokeLinejoin="round"
195
+ >
196
+ <circle cx="12" cy="12" r="10" />
197
+ <path d="M12 8v4M12 16h.01" />
198
+ </svg>
199
+ );
129
200
 
130
- export const LargeSize: Story = {
131
- render: () => (
132
- <ButtonGroup>
133
- <Button label="Large" size="lg" />
134
- <Button label="Buttons" size="lg" />
135
- <Button label="Group" size="lg" />
136
- </ButtonGroup>
137
- ),
138
- };
139
-
140
- // With Icons
141
- export const WithIcons: Story = {
142
- render: () => (
143
- <ButtonGroup>
144
- <Button label="Previous" iconName="ArrowLeft" iconPosition="start" />
145
- <Button label="Next" iconName="ArrowRight" iconPosition="end" />
146
- </ButtonGroup>
147
- ),
201
+ return (
202
+ <ButtonGroup>
203
+ <Button label="First" icon={<Icon />} variant="primary" />
204
+ <Button label="Second" icon={<Icon />} variant="secondary" />
205
+ <Button label="Third" icon={<Icon />} variant="success" />
206
+ </ButtonGroup>
207
+ );
208
+ },
148
209
  };
149
210
 
150
- export const IconOnly: Story = {
151
- render: () => (
152
- <ButtonGroup>
153
- <Button iconName="CaretLeft" iconOnly aria-label="Previous" />
154
- <Button iconName="CaretRight" iconOnly aria-label="Next" />
155
- </ButtonGroup>
156
- ),
157
- };
211
+ // ============================================================================
212
+ // INTEGRATION EXAMPLES
213
+ // ============================================================================
158
214
 
159
- // States
160
- export const WithDisabled: Story = {
215
+ export const InFormIntegration: Story = {
161
216
  render: () => (
162
- <ButtonGroup>
163
- <Button label="Enabled" />
164
- <Button label="Disabled" disabled />
165
- <Button label="Enabled" />
166
- </ButtonGroup>
217
+ <form className="u-flex u-flex-col u-gap-4">
218
+ <input
219
+ type="text"
220
+ placeholder="Username"
221
+ className="u-p-2 u-mb-2 u-border u-border-gray-300 u-rounded u-w-full"
222
+ />
223
+ <input
224
+ type="password"
225
+ placeholder="Password"
226
+ className="u-p-2 u-mb-2 u-border u-border-gray-300 u-rounded u-w-full"
227
+ />
228
+ <ButtonGroup className="u-justify-end">
229
+ <Button label="Cancel" variant="secondary" />
230
+ <Button label="Submit" variant="primary" />
231
+ </ButtonGroup>
232
+ </form>
167
233
  ),
168
234
  };
169
235
 
170
- export const WithLoading: Story = {
236
+ export const InCardIntegration: Story = {
171
237
  render: () => (
172
- <ButtonGroup>
173
- <Button label="Normal" />
174
- <Button label="Loading" loading />
175
- <Button label="Normal" />
176
- </ButtonGroup>
238
+ <div className="u-p-6 u-bg-white u-rounded-lg u-shadow-lg u-w-80">
239
+ <h3 className="u-mt-0 u-mb-3">Confirm Action</h3>
240
+ <p className="u-mb-4">Are you sure you want to perform this action?</p>
241
+ <ButtonGroup>
242
+ <Button label="No" variant="secondary" size="sm" />
243
+ <Button label="Yes" variant="danger" size="sm" />
244
+ </ButtonGroup>
245
+ </div>
177
246
  ),
178
247
  };
179
248
 
180
- export const WithActive: Story = {
249
+ export const WithOtherComponents: Story = {
181
250
  render: () => (
182
- <ButtonGroup>
183
- <Button label="Inactive" />
184
- <Button label="Active" active />
185
- <Button label="Inactive" />
186
- </ButtonGroup>
187
- ),
188
- };
251
+ <div className="u-flex u-flex-col u-gap-4 u-w-full">
252
+ <div className="u-flex u-items-center u-gap-2 u-mb-4">
253
+ <h4 className="u-m-0">Filters:</h4>
254
+ <ButtonGroup>
255
+ <Button label="All" variant="outline-primary" />
256
+ <Button label="Active" variant="outline-primary" />
257
+ <Button label="Inactive" variant="outline-primary" />
258
+ </ButtonGroup>
259
+ </div>
189
260
 
190
- export const WithSelected: Story = {
191
- render: () => (
192
- <ButtonGroup>
193
- <Button label="Option 1" selected />
194
- <Button label="Option 2" />
195
- <Button label="Option 3" />
196
- </ButtonGroup>
261
+ <div className="u-flex u-justify-between u-items-center">
262
+ <div className="u-text-sm u-text-gray-600">Showing 1-10 of 42 results</div>
263
+ <ButtonGroup>
264
+ <Button label="Prev" variant="outline-secondary" />
265
+ <Button label="Next" variant="outline-secondary" />
266
+ </ButtonGroup>
267
+ </div>
268
+ </div>
197
269
  ),
198
270
  };
199
271
 
200
- // Action Examples
201
- export const ActionButtons: Story = {
202
- render: () => (
203
- <ButtonGroup>
204
- <Button label="Delete" variant="danger" />
205
- <Button label="Edit" variant="warning" />
206
- <Button label="View" variant="info" />
207
- </ButtonGroup>
208
- ),
209
- };
272
+ // ============================================================================
273
+ // RESPONSIVE EXAMPLES
274
+ // ============================================================================
210
275
 
211
- export const NavigationButtons: Story = {
276
+ export const ResponsiveButtonGroup: Story = {
212
277
  render: () => (
213
- <ButtonGroup>
214
- <Button label="First" variant="outline-secondary" />
215
- <Button label="Previous" variant="outline-secondary" />
216
- <Button label="Next" variant="outline-secondary" />
217
- <Button label="Last" variant="outline-secondary" />
218
- </ButtonGroup>
278
+ <div className="u-w-full">
279
+ <ButtonGroup className="u-flex-col md:u-flex-row u-gap-0">
280
+ <Button
281
+ label="Home"
282
+ variant="outline-primary"
283
+ className="u-w-full md:u-w-auto u-rounded-none md:u-rounded-l md:u-rounded-r-none"
284
+ />
285
+ <Button
286
+ label="About"
287
+ variant="outline-primary"
288
+ className="u-w-full md:u-w-auto u-rounded-none"
289
+ />
290
+ <Button
291
+ label="Services"
292
+ variant="outline-primary"
293
+ className="u-w-full md:u-w-auto u-rounded-none"
294
+ />
295
+ <Button
296
+ label="Contact"
297
+ variant="outline-primary"
298
+ className="u-w-full md:u-w-auto u-rounded-none md:u-rounded-r md:u-rounded-l-none"
299
+ />
300
+ </ButtonGroup>
301
+ </div>
219
302
  ),
220
303
  };
221
304
 
222
- export const FilterButtons: Story = {
223
- render: () => (
224
- <ButtonGroup>
225
- <Button label="All" selected />
226
- <Button label="Active" />
227
- <Button label="Completed" />
228
- </ButtonGroup>
229
- ),
230
- };
305
+ // ============================================================================
306
+ // EDGE CASES
307
+ // ============================================================================
231
308
 
232
- // Multiple Groups
233
- export const MultipleGroups: Story = {
309
+ export const LongText: Story = {
234
310
  render: () => (
235
- <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
236
- <ButtonGroup>
237
- <Button label="Group 1 - Button 1" />
238
- <Button label="Group 1 - Button 2" />
239
- <Button label="Group 1 - Button 3" />
240
- </ButtonGroup>
311
+ <div style={{ maxWidth: '400px' }}>
241
312
  <ButtonGroup>
242
- <Button label="Group 2 - Button 1" variant="secondary" />
243
- <Button label="Group 2 - Button 2" variant="secondary" />
313
+ <Button label="Very Long Text Button" />
314
+ <Button label="Another Long Button Label" />
315
+ <Button label="Third Extra Long Label" />
244
316
  </ButtonGroup>
245
317
  </div>
246
318
  ),
319
+ parameters: {
320
+ docs: {
321
+ description: {
322
+ story: 'ButtonGroup with long text buttons.',
323
+ },
324
+ },
325
+ },
247
326
  };
248
327
 
249
- // Accessibility
250
- export const WithAriaLabel: Story = {
251
- render: () => (
252
- <ButtonGroup aria-label="Navigation controls">
253
- <Button label="Previous" />
254
- <Button label="Next" />
255
- </ButtonGroup>
256
- ),
257
- };
258
-
259
- // Custom Styling
260
- export const CustomClassName: Story = {
261
- render: () => (
262
- <ButtonGroup className="custom-button-group">
263
- <Button label="Custom" />
264
- <Button label="Styled" />
265
- <Button label="Group" />
266
- </ButtonGroup>
267
- ),
268
- };
269
-
270
- // Edge Cases
271
328
  export const SingleButton: Story = {
272
329
  render: () => (
273
330
  <ButtonGroup>
274
331
  <Button label="Single Button" />
275
332
  </ButtonGroup>
276
333
  ),
334
+ parameters: {
335
+ docs: {
336
+ description: {
337
+ story: 'ButtonGroup with a single button.',
338
+ },
339
+ },
340
+ },
277
341
  };
278
342
 
279
- export const ManyButtons: Story = {
343
+ export const WithManyButtons: Story = {
280
344
  render: () => (
281
345
  <ButtonGroup>
282
- <Button label="1" />
283
- <Button label="2" />
284
- <Button label="3" />
285
- <Button label="4" />
286
- <Button label="5" />
287
- <Button label="6" />
346
+ <Button label="1" size="sm" />
347
+ <Button label="2" size="sm" />
348
+ <Button label="3" size="sm" />
349
+ <Button label="4" size="sm" />
350
+ <Button label="5" size="sm" />
351
+ <Button label="6" size="sm" />
352
+ <Button label="7" size="sm" />
353
+ <Button label="8" size="sm" />
354
+ <Button label="9" size="sm" />
355
+ <Button label="10" size="sm" />
288
356
  </ButtonGroup>
289
357
  ),
358
+ parameters: {
359
+ docs: {
360
+ description: {
361
+ story: 'ButtonGroup with many buttons (using smaller size).',
362
+ },
363
+ },
364
+ },
290
365
  };
291
366
 
292
- // Rounded Buttons
293
- export const RoundedButtons: Story = {
367
+ // ============================================================================
368
+ // ACCESSIBILITY
369
+ // ============================================================================
370
+
371
+ export const WithAriaLabels: Story = {
294
372
  render: () => (
295
- <ButtonGroup>
296
- <Button label="Rounded" rounded />
297
- <Button label="Buttons" rounded />
298
- <Button label="Group" rounded />
373
+ <ButtonGroup aria-label="Pagination controls">
374
+ <Button label="Previous" aria-label="Go to previous page" />
375
+ <Button label="1" aria-label="Go to page 1" />
376
+ <Button label="2" aria-label="Go to page 2" />
377
+ <Button label="3" aria-label="Go to page 3" />
378
+ <Button label="Next" aria-label="Go to next page" />
299
379
  </ButtonGroup>
300
380
  ),
381
+ parameters: {
382
+ docs: {
383
+ description: {
384
+ story: 'ButtonGroup with proper ARIA labels for accessibility.',
385
+ },
386
+ },
387
+ },
301
388
  };
302
389
 
303
- // Full Width
304
- export const FullWidth: Story = {
390
+ export const VerticalLayout: Story = {
305
391
  render: () => (
306
- <div style={{ width: '100%', maxWidth: '600px' }}>
307
- <ButtonGroup>
308
- <Button label="Full" fullWidth />
309
- <Button label="Width" fullWidth />
310
- <Button label="Group" fullWidth />
311
- </ButtonGroup>
392
+ <div className="u-flex u-flex-col u-gap-3">
393
+ <div className="u-flex u-flex-col u-gap-0 u-items-start">
394
+ <Button label="Button 1" variant="primary" className="u-w-full u-rounded-b-none" />
395
+ <Button label="Button 2" variant="secondary" className="u-w-full u-rounded-none" />
396
+ <Button label="Button 3" variant="outline-primary" className="u-w-full u-rounded-t-none" />
397
+ </div>
312
398
  </div>
313
399
  ),
400
+ parameters: {
401
+ docs: {
402
+ description: {
403
+ story: 'Vertical layout using flex-direction column.',
404
+ },
405
+ },
406
+ },
314
407
  };
315
408
 
409
+ export const WithKeyboardNavigation: Story = {
410
+ render: () => {
411
+ const [activeIndex, setActiveIndex] = useState(0);
412
+
413
+ const buttons = [
414
+ { label: 'Button 1', variant: 'primary' },
415
+ { label: 'Button 2', variant: 'secondary' },
416
+ { label: 'Button 3', variant: 'outline-primary' },
417
+ { label: 'Button 4', variant: 'success' },
418
+ ];
419
+
420
+ const handleKeyDown = (index: number, e: React.KeyboardEvent) => {
421
+ let newIndex = index;
422
+
423
+ switch (e.key) {
424
+ case 'ArrowRight':
425
+ case 'ArrowDown':
426
+ newIndex = (index + 1) % buttons.length;
427
+ break;
428
+ case 'ArrowLeft':
429
+ case 'ArrowUp':
430
+ newIndex = (index - 1 + buttons.length) % buttons.length;
431
+ break;
432
+ case 'Home':
433
+ newIndex = 0;
434
+ break;
435
+ case 'End':
436
+ newIndex = buttons.length - 1;
437
+ break;
438
+ default:
439
+ return;
440
+ }
441
+
442
+ e.preventDefault();
443
+ setActiveIndex(newIndex);
444
+ };
445
+
446
+ return (
447
+ <div className="u-flex u-flex-col u-gap-3">
448
+ <div className="u-flex u-gap-0">
449
+ {buttons.map((btn, idx) => (
450
+ <Button
451
+ key={idx}
452
+ label={btn.label}
453
+ variant={btn.variant}
454
+ active={activeIndex === idx}
455
+ onKeyDown={(e: React.KeyboardEvent) => handleKeyDown(idx, e)}
456
+ className={
457
+ idx === 0
458
+ ? 'u-rounded-r-none'
459
+ : idx === buttons.length - 1
460
+ ? 'u-rounded-l-none'
461
+ : 'u-rounded-none'
462
+ }
463
+ />
464
+ ))}
465
+ </div>
466
+ </div>
467
+ );
468
+ },
469
+ parameters: {
470
+ docs: {
471
+ description: {
472
+ story: 'Button group with keyboard navigation support using arrow keys.',
473
+ },
474
+ },
475
+ },
476
+ };