@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
@@ -4,48 +4,48 @@ import { Badge } from './Badge';
4
4
 
5
5
  // Mock AtomixGlass component
6
6
  vi.mock('../AtomixGlass/AtomixGlass', () => ({
7
- AtomixGlass: ({ children, ...props }: any) => (
8
- <div data-testid="atomix-glass" data-glass-props={JSON.stringify(props)}>
9
- {children}
10
- </div>
11
- ),
7
+ AtomixGlass: ({ children, ...props }: any) => (
8
+ <div data-testid="atomix-glass" data-glass-props={JSON.stringify(props)}>
9
+ {children}
10
+ </div>
11
+ ),
12
12
  }));
13
13
 
14
14
  describe('Badge Component', () => {
15
- it('renders correctly', () => {
16
- render(<Badge label="Test Badge" />);
17
- expect(screen.getByText('Test Badge')).toBeInTheDocument();
18
- });
19
-
20
- it('renders with aria-label', () => {
21
- render(<Badge label="Badge" aria-label="Accessible Badge" />);
22
- expect(screen.getByLabelText('Accessible Badge')).toBeInTheDocument();
23
- });
24
-
25
- it('renders close button when onRemove is provided', () => {
26
- const handleRemove = vi.fn();
27
- render(<Badge label="Removable" onRemove={handleRemove} />);
28
-
29
- const closeButton = screen.getByRole('button', { name: 'Remove badge' });
30
- expect(closeButton).toBeInTheDocument();
31
-
32
- fireEvent.click(closeButton);
33
- expect(handleRemove).toHaveBeenCalledTimes(1);
34
- });
35
-
36
- it('does not render close button when onRemove is not provided', () => {
37
- render(<Badge label="Static" />);
38
- expect(screen.queryByRole('button')).not.toBeInTheDocument();
39
- });
40
-
41
- it('disables close button when badge is disabled', () => {
42
- const handleRemove = vi.fn();
43
- render(<Badge label="Disabled" onRemove={handleRemove} disabled />);
44
-
45
- const closeButton = screen.getByRole('button', { name: 'Remove badge' });
46
- expect(closeButton).toBeDisabled();
47
-
48
- fireEvent.click(closeButton);
49
- expect(handleRemove).not.toHaveBeenCalled();
50
- });
15
+ it('renders correctly', () => {
16
+ render(<Badge label="Test Badge" />);
17
+ expect(screen.getByText('Test Badge')).toBeInTheDocument();
18
+ });
19
+
20
+ it('renders with aria-label', () => {
21
+ render(<Badge label="Badge" aria-label="Accessible Badge" />);
22
+ expect(screen.getByLabelText('Accessible Badge')).toBeInTheDocument();
23
+ });
24
+
25
+ it('renders close button when onRemove is provided', () => {
26
+ const handleRemove = vi.fn();
27
+ render(<Badge label="Removable" onRemove={handleRemove} />);
28
+
29
+ const closeButton = screen.getByRole('button', { name: 'Remove badge' });
30
+ expect(closeButton).toBeInTheDocument();
31
+
32
+ fireEvent.click(closeButton);
33
+ expect(handleRemove).toHaveBeenCalledTimes(1);
34
+ });
35
+
36
+ it('does not render close button when onRemove is not provided', () => {
37
+ render(<Badge label="Static" />);
38
+ expect(screen.queryByRole('button')).not.toBeInTheDocument();
39
+ });
40
+
41
+ it('disables close button when badge is disabled', () => {
42
+ const handleRemove = vi.fn();
43
+ render(<Badge label="Disabled" onRemove={handleRemove} disabled />);
44
+
45
+ const closeButton = screen.getByRole('button', { name: 'Remove badge' });
46
+ expect(closeButton).toBeDisabled();
47
+
48
+ fireEvent.click(closeButton);
49
+ expect(handleRemove).not.toHaveBeenCalled();
50
+ });
51
51
  });
@@ -4,75 +4,77 @@ import { BADGE } from '../../lib/constants/components';
4
4
  import { BadgeProps } from '../../lib/types/components';
5
5
  import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
6
6
 
7
- export const Badge: React.FC<BadgeProps> = memo(({
8
- label,
9
- variant = 'primary',
10
- size = 'md',
11
- disabled = false,
12
- icon,
13
- onRemove,
14
- 'aria-label': ariaLabel,
15
- className = '',
16
- glass,
17
- style,
18
- }) => {
19
- const { generateBadgeClass } = useBadge({
20
- variant,
21
- size,
22
- disabled,
23
- });
7
+ export const Badge: React.FC<BadgeProps> = memo(
8
+ ({
9
+ label,
10
+ variant = 'primary',
11
+ size = 'md',
12
+ disabled = false,
13
+ icon,
14
+ onRemove,
15
+ 'aria-label': ariaLabel,
16
+ className = '',
17
+ glass,
18
+ style,
19
+ }) => {
20
+ const { generateBadgeClass } = useBadge({
21
+ variant,
22
+ size,
23
+ disabled,
24
+ });
24
25
 
25
- const ref = useRef<HTMLSpanElement>(null);
26
+ const ref = useRef<HTMLSpanElement>(null);
26
27
 
27
- const badgeClass = generateBadgeClass({
28
- variant,
29
- size,
30
- disabled,
31
- className: `${className} ${glass ? 'c-badge--glass' : ''}`.trim(),
32
- });
28
+ const badgeClass = generateBadgeClass({
29
+ variant,
30
+ size,
31
+ disabled,
32
+ className: `${className} ${glass ? 'c-badge--glass' : ''}`.trim(),
33
+ });
33
34
 
34
- const badgeElement = (
35
- <span
36
- className={badgeClass}
37
- aria-disabled={disabled}
38
- aria-label={ariaLabel}
39
- ref={ref}
40
- style={style}
41
- >
42
- {icon && <span className={BADGE.ICON_CLASS}>{icon}</span>}
43
- <span>{label}</span>
44
- {onRemove && (
45
- <button
46
- type="button"
47
- className="c-badge__close"
48
- onClick={onRemove}
49
- aria-label="Remove badge"
50
- disabled={disabled}
51
- >
52
- ×
53
- </button>
54
- )}
55
- </span>
56
- );
35
+ const badgeElement = (
36
+ <span
37
+ className={badgeClass}
38
+ aria-disabled={disabled}
39
+ aria-label={ariaLabel}
40
+ ref={ref}
41
+ style={style}
42
+ >
43
+ {icon && <span className={BADGE.ICON_CLASS}>{icon}</span>}
44
+ <span>{label}</span>
45
+ {onRemove && (
46
+ <button
47
+ type="button"
48
+ className="c-badge__close"
49
+ onClick={onRemove}
50
+ aria-label="Remove badge"
51
+ disabled={disabled}
52
+ >
53
+ ×
54
+ </button>
55
+ )}
56
+ </span>
57
+ );
57
58
 
58
- if (glass) {
59
- // Default glass settings for badges
60
- const defaultGlassProps = {
61
- displacementScale: 20,
62
- cornerRadius: ref.current?.getBoundingClientRect().width
63
- ? ref.current?.getBoundingClientRect().width / 2
64
- : 16,
65
- className: 'c-badge--glass',
66
- elasticity: 0,
67
- };
59
+ if (glass) {
60
+ // Default glass settings for badges
61
+ const defaultGlassProps = {
62
+ displacementScale: 20,
63
+ cornerRadius: ref.current?.getBoundingClientRect().width
64
+ ? ref.current?.getBoundingClientRect().width / 2
65
+ : 16,
66
+ className: 'c-badge--glass',
67
+ elasticity: 0,
68
+ };
68
69
 
69
- const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
70
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
70
71
 
71
- return <AtomixGlass {...glassProps}>{badgeElement}</AtomixGlass>;
72
- }
72
+ return <AtomixGlass {...glassProps}>{badgeElement}</AtomixGlass>;
73
+ }
73
74
 
74
- return badgeElement;
75
- });
75
+ return badgeElement;
76
+ }
77
+ );
76
78
 
77
79
  Badge.displayName = 'Badge';
78
80
 
@@ -1,10 +1,15 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
2
3
  import { Grid } from '../../layouts/Grid/Grid';
3
4
  import GridCol from '../../layouts/Grid/GridCol';
4
5
  import { Button } from '../Button/Button';
5
6
  import { Card } from '../Card/Card';
6
7
  import { Block } from './Block';
7
8
 
9
+ // ============================================================================
10
+ // META CONFIGURATION
11
+ // ============================================================================
12
+
8
13
  const meta = {
9
14
  title: 'Components/Block',
10
15
  component: Block,
@@ -43,8 +48,12 @@ const meta = {
43
48
  export default meta;
44
49
  type Story = StoryObj<typeof meta>;
45
50
 
51
+ // ============================================================================
52
+ // STORY IMPLEMENTATIONS
53
+ // ============================================================================
54
+
46
55
  // Basic usage
47
- export const Default: Story = {
56
+ export const BasicUsage: Story = {
48
57
  args: {
49
58
  children: (
50
59
  <div>
@@ -100,7 +109,7 @@ export const HeroSection: Story = {
100
109
  <div className="u-text-center">
101
110
  <h1>Welcome to Our Platform</h1>
102
111
  <p>Experience the power of modern web development with our comprehensive design system.</p>
103
- <Button size="lg" variant="secondary">
112
+ <Button size="lg" variant="secondary" onClick={fn()}>
104
113
  Get Started
105
114
  </Button>
106
115
  </div>
@@ -169,7 +178,9 @@ export const ArticleLayout: Story = {
169
178
  <Block spacing="md" container={{ type: 'sm' }} background="secondary">
170
179
  <h3>Ready to get started?</h3>
171
180
  <p>Join thousands of developers building with our design system.</p>
172
- <Button variant="primary">Start Building</Button>
181
+ <Button variant="primary" onClick={fn()}>
182
+ Start Building
183
+ </Button>
173
184
  </Block>
174
185
  </div>
175
186
  ),
@@ -292,10 +303,10 @@ export const ContentPreview: Story = {
292
303
  A comprehensive design system with reusable components and consistent design patterns
293
304
  </p>
294
305
  <div className="u-mb-4">
295
- <Button size="lg" variant="secondary" className="u-me-2">
306
+ <Button size="lg" variant="secondary" className="u-me-2" onClick={fn()}>
296
307
  Get Started
297
308
  </Button>
298
- <Button size="lg" variant="invert" className="u-ms-2">
309
+ <Button size="lg" variant="invert" className="u-ms-2" onClick={fn()}>
299
310
  Learn More
300
311
  </Button>
301
312
  </div>
@@ -311,10 +322,10 @@ export const ContentPreview: Story = {
311
322
  text="Multiple variants and sizes for all use cases"
312
323
  actions={
313
324
  <div>
314
- <Button variant="primary" size="sm" className="u-me-1">
325
+ <Button variant="primary" size="sm" className="u-me-1" onClick={fn()}>
315
326
  Primary
316
327
  </Button>
317
- <Button variant="secondary" size="sm">
328
+ <Button variant="secondary" size="sm" onClick={fn()}>
318
329
  Secondary
319
330
  </Button>
320
331
  </div>
@@ -325,14 +336,22 @@ export const ContentPreview: Story = {
325
336
  <Card
326
337
  title="Cards"
327
338
  text="Flexible content containers with multiple options"
328
- actions={<Button variant="primary">View Details</Button>}
339
+ actions={
340
+ <Button variant="primary" onClick={fn()}>
341
+ View Details
342
+ </Button>
343
+ }
329
344
  />
330
345
  </GridCol>
331
346
  <GridCol xs={12} md={6} lg={4}>
332
347
  <Card
333
348
  title="Blocks"
334
349
  text="Layout containers with consistent spacing and backgrounds"
335
- actions={<Button variant="primary">Learn More</Button>}
350
+ actions={
351
+ <Button variant="primary" onClick={fn()}>
352
+ Learn More
353
+ </Button>
354
+ }
336
355
  />
337
356
  </GridCol>
338
357
  </Grid>
@@ -378,10 +397,10 @@ export const ContentPreview: Story = {
378
397
  Join thousands of developers and designers building with Atomix Design System
379
398
  </p>
380
399
  <div>
381
- <Button size="lg" variant="primary" className="u-me-2">
400
+ <Button size="lg" variant="primary" className="u-me-2" onClick={fn()}>
382
401
  Documentation
383
402
  </Button>
384
- <Button size="lg" variant="secondary" className="u-ms-2">
403
+ <Button size="lg" variant="secondary" className="u-ms-2" onClick={fn()}>
385
404
  Examples
386
405
  </Button>
387
406
  </div>
@@ -1,33 +1,78 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
2
3
  import { Icon } from '../Icon';
3
4
  import { Breadcrumb } from './Breadcrumb';
4
5
 
5
- const meta = {
6
+ const meta: Meta<typeof Breadcrumb> = {
6
7
  title: 'Components/Breadcrumb',
7
8
  component: Breadcrumb,
8
9
  parameters: {
9
- layout: 'centered',
10
+ layout: 'padded',
10
11
  docs: {
11
12
  description: {
12
- component:
13
- 'The Breadcrumb component provides navigation context by showing the current page location within a site hierarchy. It helps users understand where they are and provides quick navigation to parent pages. Breadcrumbs support custom dividers, icons, and are fully accessible.',
13
+ component: `
14
+ # Breadcrumb Component
15
+
16
+ The Breadcrumb component provides navigation context by showing the current page location within a site hierarchy. It helps users understand where they are and provides quick navigation to parent pages. Breadcrumbs support custom dividers, icons, and are fully accessible.
17
+
18
+ ## Features
19
+ - Clear hierarchical navigation
20
+ - Support for custom dividers
21
+ - Icon integration
22
+ - Keyboard navigation support
23
+ - Full accessibility compliance
24
+ - Responsive design
25
+
26
+ ## Accessibility
27
+ - Semantic navigation landmark with aria-label
28
+ - Proper heading order
29
+ - Keyboard navigation support (Tab, Enter, Space)
30
+ - Screen reader friendly markup
31
+ `,
14
32
  },
15
33
  },
16
34
  },
17
35
  tags: ['autodocs'],
18
36
  argTypes: {
19
- items: { control: 'object' },
20
- divider: { control: 'text' },
21
- className: { control: 'text' },
22
- 'aria-label': { control: 'text' },
37
+ items: {
38
+ control: 'object',
39
+ description: 'Array of breadcrumb items with label, href, and optional properties',
40
+ table: {
41
+ type: { summary: 'BreadcrumbItem[]' },
42
+ defaultValue: { summary: '[]' },
43
+ },
44
+ },
45
+ divider: {
46
+ control: 'text',
47
+ description: 'Custom divider character or component between breadcrumb items',
48
+ table: {
49
+ type: { summary: 'string | ReactNode' },
50
+ defaultValue: { summary: '>' },
51
+ },
52
+ },
53
+ className: {
54
+ control: 'text',
55
+ description: 'Additional CSS classes',
56
+ table: {
57
+ type: { summary: 'string' },
58
+ },
59
+ },
60
+ 'aria-label': {
61
+ control: 'text',
62
+ description: 'Label for the navigation landmark',
63
+ table: {
64
+ type: { summary: 'string' },
65
+ defaultValue: { summary: 'Breadcrumb' },
66
+ },
67
+ },
23
68
  },
24
69
  } satisfies Meta<typeof Breadcrumb>;
25
70
 
26
71
  export default meta;
27
72
  type Story = StoryObj<typeof meta>;
28
73
 
29
- // Default Breadcrumb
30
- export const Default: Story = {
74
+ // Basic Breadcrumb
75
+ export const BasicUsage: Story = {
31
76
  args: {
32
77
  items: [
33
78
  { label: 'Home', href: '/' },
@@ -36,6 +81,13 @@ export const Default: Story = {
36
81
  { label: 'Product Name', active: true },
37
82
  ],
38
83
  },
84
+ parameters: {
85
+ docs: {
86
+ description: {
87
+ story: 'Simple breadcrumb with basic text links showing site hierarchy.',
88
+ },
89
+ },
90
+ },
39
91
  };
40
92
 
41
93
  // Breadcrumb with Icons
@@ -64,10 +116,17 @@ export const WithIcons: Story = {
64
116
  },
65
117
  ],
66
118
  },
119
+ parameters: {
120
+ docs: {
121
+ description: {
122
+ story: 'Breadcrumb with icons for each item to enhance visual recognition.',
123
+ },
124
+ },
125
+ },
67
126
  };
68
127
 
69
128
  // Breadcrumb with Custom Divider
70
- export const CustomDivider: Story = {
129
+ export const WithCustomDivider: Story = {
71
130
  args: {
72
131
  items: [
73
132
  { label: 'Home', href: '/' },
@@ -77,6 +136,13 @@ export const CustomDivider: Story = {
77
136
  ],
78
137
  divider: '/',
79
138
  },
139
+ parameters: {
140
+ docs: {
141
+ description: {
142
+ story: 'Breadcrumb with custom divider character instead of the default arrow.',
143
+ },
144
+ },
145
+ },
80
146
  };
81
147
 
82
148
  // Breadcrumb with Click Handlers
@@ -86,28 +152,81 @@ export const WithClickHandlers: Story = {
86
152
  {
87
153
  label: 'Home',
88
154
  href: '/',
89
- onClick: e => {
90
- e.preventDefault();
91
- alert('Home clicked');
92
- },
155
+ onClick: fn(),
93
156
  },
94
157
  {
95
158
  label: 'Products',
96
159
  href: '/products',
97
- onClick: e => {
98
- e.preventDefault();
99
- alert('Products clicked');
100
- },
160
+ onClick: fn(),
101
161
  },
102
162
  {
103
163
  label: 'Category',
104
164
  href: '/products/category',
105
- onClick: e => {
106
- e.preventDefault();
107
- alert('Category clicked');
108
- },
165
+ onClick: fn(),
109
166
  },
110
167
  { label: 'Product Name', active: true },
111
168
  ],
112
169
  },
170
+ parameters: {
171
+ docs: {
172
+ description: {
173
+ story: 'Breadcrumb with click handlers to demonstrate client-side navigation.',
174
+ },
175
+ },
176
+ },
177
+ };
178
+
179
+ // Breadcrumb with Mixed Interactions
180
+ export const WithMixedInteractions: Story = {
181
+ args: {
182
+ items: [
183
+ { label: 'Home', href: '/' },
184
+ {
185
+ label: 'Products',
186
+ onClick: fn(),
187
+ // Simulating client-side navigation
188
+ },
189
+ {
190
+ label: 'Category',
191
+ href: '/products/category',
192
+ icon: <Icon name="Folder" size="sm" />,
193
+ },
194
+ {
195
+ label: 'Product Name',
196
+ active: true,
197
+ icon: <Icon name="Tag" size="sm" />,
198
+ },
199
+ ],
200
+ divider: '|',
201
+ },
202
+ parameters: {
203
+ docs: {
204
+ description: {
205
+ story:
206
+ 'Breadcrumb combining both traditional link navigation and client-side interactions.',
207
+ },
208
+ },
209
+ },
210
+ };
211
+
212
+ // Long Breadcrumb Path
213
+ export const LongBreadcrumbPath: Story = {
214
+ args: {
215
+ items: [
216
+ { label: 'Home', href: '/' },
217
+ { label: 'Products', href: '/products' },
218
+ { label: 'Electronics', href: '/products/electronics' },
219
+ { label: 'Computers', href: '/products/electronics/computers' },
220
+ { label: 'Laptops', href: '/products/electronics/computers/laptops' },
221
+ { label: 'Gaming Laptops', href: '/products/electronics/computers/laptops/gaming' },
222
+ { label: 'Current Product', active: true },
223
+ ],
224
+ },
225
+ parameters: {
226
+ docs: {
227
+ description: {
228
+ story: 'Long breadcrumb path demonstrating responsive behavior with many levels.',
229
+ },
230
+ },
231
+ },
113
232
  };