@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
@@ -167,25 +167,14 @@ export const States: Story = {
167
167
  export const WithIcons: Story = {
168
168
  render: () => (
169
169
  <div className="u-flex u-flex-column u-gap-3" style={{ width: '300px' }}>
170
- <Input
171
- placeholder="Search..."
172
- prefixIcon={<MagnifyingGlass size={18} />}
173
- />
174
- <Input
175
- placeholder="Email address"
176
- type="email"
177
- prefixIcon={<Envelope size={18} />}
178
- />
170
+ <Input placeholder="Search..." prefixIcon={<MagnifyingGlass size={18} />} />
171
+ <Input placeholder="Email address" type="email" prefixIcon={<Envelope size={18} />} />
179
172
  <Input
180
173
  placeholder="Username"
181
174
  prefixIcon={<User size={18} />}
182
175
  suffixIcon={<span style={{ color: 'green' }}>✓</span>}
183
176
  />
184
- <Input
185
- placeholder="Phone number"
186
- type="tel"
187
- prefixIcon={<Phone size={18} />}
188
- />
177
+ <Input placeholder="Phone number" type="tel" prefixIcon={<Phone size={18} />} />
189
178
  </div>
190
179
  ),
191
180
  };
@@ -201,14 +190,14 @@ export const Clearable: Story = {
201
190
  <Input
202
191
  placeholder="Type to see clear button"
203
192
  value={value}
204
- onChange={(e) => setValue(e.target.value)}
193
+ onChange={e => setValue(e.target.value)}
205
194
  clearable
206
195
  />
207
196
  <Input
208
197
  placeholder="With prefix icon"
209
198
  prefixIcon={<MagnifyingGlass size={18} />}
210
199
  value={value}
211
- onChange={(e) => setValue(e.target.value)}
200
+ onChange={e => setValue(e.target.value)}
212
201
  clearable
213
202
  />
214
203
  </div>
@@ -227,14 +216,14 @@ export const WithCounter: Story = {
227
216
  <Input
228
217
  placeholder="Type here (max 50 characters)"
229
218
  value={value}
230
- onChange={(e) => setValue(e.target.value)}
219
+ onChange={e => setValue(e.target.value)}
231
220
  maxLength={50}
232
221
  showCounter
233
222
  />
234
223
  <Input
235
224
  placeholder="With custom max count"
236
225
  value={value}
237
- onChange={(e) => setValue(e.target.value)}
226
+ onChange={e => setValue(e.target.value)}
238
227
  maxCount={100}
239
228
  showCounter
240
229
  />
@@ -255,7 +244,7 @@ export const PasswordToggle: Story = {
255
244
  type="password"
256
245
  placeholder="Enter password"
257
246
  value={password}
258
- onChange={(e) => setPassword(e.target.value)}
247
+ onChange={e => setPassword(e.target.value)}
259
248
  showPasswordToggle
260
249
  />
261
250
  <Input
@@ -263,7 +252,7 @@ export const PasswordToggle: Story = {
263
252
  placeholder="Password with prefix icon"
264
253
  prefixIcon={<Lock size={18} />}
265
254
  value={password}
266
- onChange={(e) => setPassword(e.target.value)}
255
+ onChange={e => setPassword(e.target.value)}
267
256
  showPasswordToggle
268
257
  />
269
258
  </div>
@@ -287,22 +276,18 @@ export const WithMessages: Story = {
287
276
  type="email"
288
277
  placeholder="Email address"
289
278
  value={email}
290
- onChange={(e) => setEmail(e.target.value)}
279
+ onChange={e => setEmail(e.target.value)}
291
280
  invalid={isInvalidEmail}
292
281
  errorMessage={isInvalidEmail ? 'Please enter a valid email address' : undefined}
293
- helperText={!isInvalidEmail ? 'We\'ll never share your email' : undefined}
282
+ helperText={!isInvalidEmail ? "We'll never share your email" : undefined}
294
283
  />
295
284
  <Input
296
285
  placeholder="Username"
297
286
  value={username}
298
- onChange={(e) => setUsername(e.target.value)}
287
+ onChange={e => setUsername(e.target.value)}
299
288
  helperText="Choose a unique username"
300
289
  />
301
- <Input
302
- placeholder="Required field"
303
- required
304
- helperText="This field is required"
305
- />
290
+ <Input placeholder="Required field" required helperText="This field is required" />
306
291
  </div>
307
292
  );
308
293
  },
@@ -331,7 +316,8 @@ export const Comprehensive: Story = {
331
316
  parameters: {
332
317
  docs: {
333
318
  description: {
334
- story: 'A comprehensive example demonstrating multiple input features including icons, clearable functionality, password toggle, character counter, and helper text in a form-like layout.',
319
+ story:
320
+ 'A comprehensive example demonstrating multiple input features including icons, clearable functionality, password toggle, character counter, and helper text in a form-like layout.',
335
321
  },
336
322
  },
337
323
  },
@@ -343,13 +329,11 @@ export const Comprehensive: Story = {
343
329
  return (
344
330
  <div className="u-flex u-flex-column u-gap-4" style={{ width: '400px' }}>
345
331
  <div>
346
- <label style={{ display: 'block', marginBottom: '0.5rem', color: 'white' }}>
347
- Search
348
- </label>
332
+ <label style={{ display: 'block', marginBottom: '0.5rem', color: 'white' }}>Search</label>
349
333
  <Input
350
334
  placeholder="Search products..."
351
335
  value={search}
352
- onChange={(e) => setSearch(e.target.value)}
336
+ onChange={e => setSearch(e.target.value)}
353
337
  prefixIcon={<MagnifyingGlass size={18} />}
354
338
  clearable
355
339
  fullWidth
@@ -364,7 +348,7 @@ export const Comprehensive: Story = {
364
348
  type="password"
365
349
  placeholder="Enter your password"
366
350
  value={password}
367
- onChange={(e) => setPassword(e.target.value)}
351
+ onChange={e => setPassword(e.target.value)}
368
352
  prefixIcon={<Lock size={18} />}
369
353
  showPasswordToggle
370
354
  fullWidth
@@ -373,13 +357,11 @@ export const Comprehensive: Story = {
373
357
  </div>
374
358
 
375
359
  <div>
376
- <label style={{ display: 'block', marginBottom: '0.5rem', color: 'white' }}>
377
- Bio
378
- </label>
360
+ <label style={{ display: 'block', marginBottom: '0.5rem', color: 'white' }}>Bio</label>
379
361
  <Input
380
362
  placeholder="Tell us about yourself"
381
363
  value={bio}
382
- onChange={(e) => setBio(e.target.value)}
364
+ onChange={e => setBio(e.target.value)}
383
365
  maxLength={200}
384
366
  showCounter
385
367
  fullWidth
@@ -465,7 +447,8 @@ export const GlassShowcase: Story = {
465
447
  parameters: {
466
448
  docs: {
467
449
  description: {
468
- story: 'Demonstrates glass morphism effects on inputs with different modes and configurations, showing how inputs look over colorful backgrounds.',
450
+ story:
451
+ 'Demonstrates glass morphism effects on inputs with different modes and configurations, showing how inputs look over colorful backgrounds.',
469
452
  },
470
453
  },
471
454
  },
@@ -4,56 +4,50 @@ import { Input } from './Input';
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('Input Component', () => {
15
- it('renders correctly', () => {
16
- render(<Input placeholder="Test Input" />);
17
- expect(screen.getByPlaceholderText('Test Input')).toBeInTheDocument();
18
- });
15
+ it('renders correctly', () => {
16
+ render(<Input placeholder="Test Input" />);
17
+ expect(screen.getByPlaceholderText('Test Input')).toBeInTheDocument();
18
+ });
19
19
 
20
- it('handles controlled value', () => {
21
- render(<Input value="Controlled Value" onChange={() => { }} />);
22
- const input = screen.getByDisplayValue('Controlled Value');
23
- expect(input).toBeInTheDocument();
24
- expect(input).toHaveValue('Controlled Value');
25
- });
20
+ it('handles controlled value', () => {
21
+ render(<Input value="Controlled Value" onChange={() => {}} />);
22
+ const input = screen.getByDisplayValue('Controlled Value');
23
+ expect(input).toBeInTheDocument();
24
+ expect(input).toHaveValue('Controlled Value');
25
+ });
26
26
 
27
- it('handles uncontrolled defaultValue', () => {
28
- render(<Input defaultValue="Default Value" />);
29
- const input = screen.getByDisplayValue('Default Value');
30
- expect(input).toBeInTheDocument();
31
- expect(input).toHaveValue('Default Value');
32
- });
27
+ it('handles uncontrolled defaultValue', () => {
28
+ render(<Input defaultValue="Default Value" />);
29
+ const input = screen.getByDisplayValue('Default Value');
30
+ expect(input).toBeInTheDocument();
31
+ expect(input).toHaveValue('Default Value');
32
+ });
33
33
 
34
- it('calls onChange when typing', () => {
35
- const handleChange = vi.fn();
36
- render(<Input onChange={handleChange} />);
37
- const input = screen.getByRole('textbox');
38
- fireEvent.change(input, { target: { value: 'New Value' } });
39
- expect(handleChange).toHaveBeenCalledTimes(1);
40
- });
34
+ it('calls onChange when typing', () => {
35
+ const handleChange = vi.fn();
36
+ render(<Input onChange={handleChange} />);
37
+ const input = screen.getByRole('textbox');
38
+ fireEvent.change(input, { target: { value: 'New Value' } });
39
+ expect(handleChange).toHaveBeenCalledTimes(1);
40
+ });
41
41
 
42
- it('applies accessibility attributes', () => {
43
- render(
44
- <Input
45
- aria-label="Accessible Label"
46
- aria-describedby="description-id"
47
- invalid
48
- />
49
- );
50
- const input = screen.getByLabelText('Accessible Label');
51
- expect(input).toHaveAttribute('aria-describedby', 'description-id');
52
- expect(input).toHaveAttribute('aria-invalid', 'true');
53
- });
42
+ it('applies accessibility attributes', () => {
43
+ render(<Input aria-label="Accessible Label" aria-describedby="description-id" invalid />);
44
+ const input = screen.getByLabelText('Accessible Label');
45
+ expect(input).toHaveAttribute('aria-describedby', 'description-id');
46
+ expect(input).toHaveAttribute('aria-invalid', 'true');
47
+ });
54
48
 
55
- it('renders as glass when enabled', () => {
56
- render(<Input glass placeholder="Glass Input" />);
57
- expect(screen.getByTestId('atomix-glass')).toBeInTheDocument();
58
- });
49
+ it('renders as glass when enabled', () => {
50
+ render(<Input glass placeholder="Glass Input" />);
51
+ expect(screen.getByTestId('atomix-glass')).toBeInTheDocument();
52
+ });
59
53
  });
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { Meta, StoryObj } from '@storybook/react';
3
+ import { fn } from '@storybook/test';
3
4
  import { Radio } from './Radio';
4
5
 
5
6
  const meta = {
@@ -9,8 +10,79 @@ const meta = {
9
10
  layout: 'centered',
10
11
  docs: {
11
12
  description: {
12
- component:
13
- 'The Radio component allows users to select a single option from a group of mutually exclusive options. Radio buttons are typically used in groups where only one selection is allowed. They provide clear visual feedback and support keyboard navigation.',
13
+ component: `
14
+ # Radio
15
+
16
+ ## Overview
17
+
18
+ Radio component allows users to select a single option from a group of mutually exclusive options. Radio buttons are typically used in groups where only one selection is allowed. They provide clear visual feedback and support keyboard navigation.
19
+
20
+ ## Features
21
+
22
+ - Single selection from mutually exclusive options
23
+ - Label support
24
+ - Disabled state
25
+ - Validation states (valid/invalid)
26
+ - Glass morphism effect
27
+ - Accessible design
28
+ - Responsive behavior
29
+
30
+ ## Accessibility
31
+
32
+ - Keyboard support: Navigate and toggle with keyboard
33
+ - Screen reader: State and label announced properly
34
+ - ARIA support: Proper roles and properties for radio components
35
+ - Focus management: Visible focus indicators maintained
36
+
37
+ ## Usage Examples
38
+
39
+ ### Basic Usage
40
+
41
+ \`\`\`tsx
42
+ <Radio
43
+ label="Option label"
44
+ name="groupName"
45
+ value="optionValue"
46
+ checked={isSelected}
47
+ onChange={setSelected}
48
+ />
49
+ \`\`\`
50
+
51
+ ### Radio Group
52
+
53
+ \`\`\`tsx
54
+ <Radio
55
+ label="Option 1"
56
+ name="group"
57
+ value="opt1"
58
+ checked={selected === 'opt1'}
59
+ onChange={() => setSelected('opt1')}
60
+ />
61
+ <Radio
62
+ label="Option 2"
63
+ name="group"
64
+ value="opt2"
65
+ checked={selected === 'opt2'}
66
+ onChange={() => setSelected('opt2')}
67
+ />
68
+ \`\`\`
69
+
70
+ ## API Reference
71
+
72
+ ### Props
73
+
74
+ | Prop | Type | Default | Description |
75
+ | ---- | ---- | ------- | ----------- |
76
+ | label | string | - | Radio button label text |
77
+ | checked | boolean | false | Whether the radio button is checked |
78
+ | disabled | boolean | false | Whether the radio button is disabled |
79
+ | invalid | boolean | false | Whether the radio button is invalid |
80
+ | valid | boolean | false | Whether the radio button is valid |
81
+ | glass | boolean | false | Enable glass morphism effect |
82
+ | name | string | - | Name of the radio button group |
83
+ | value | string | - | Value of the radio button |
84
+ | onChange | (value: string) => void | - | Callback when radio button state changes |
85
+ `,
14
86
  },
15
87
  },
16
88
  },
@@ -19,26 +91,70 @@ const meta = {
19
91
  label: {
20
92
  control: 'text',
21
93
  description: 'Radio button label text',
94
+ table: {
95
+ type: { summary: 'string' },
96
+ defaultValue: { summary: '-' },
97
+ },
22
98
  },
23
99
  checked: {
24
100
  control: 'boolean',
25
101
  description: 'Whether the radio button is checked',
102
+ table: {
103
+ type: { summary: 'boolean' },
104
+ defaultValue: { summary: false },
105
+ },
26
106
  },
27
107
  disabled: {
28
108
  control: 'boolean',
29
109
  description: 'Whether the radio button is disabled',
110
+ table: {
111
+ type: { summary: 'boolean' },
112
+ defaultValue: { summary: false },
113
+ },
30
114
  },
31
115
  invalid: {
32
116
  control: 'boolean',
33
117
  description: 'Whether the radio button is invalid',
118
+ table: {
119
+ type: { summary: 'boolean' },
120
+ defaultValue: { summary: false },
121
+ },
34
122
  },
35
123
  valid: {
36
124
  control: 'boolean',
37
125
  description: 'Whether the radio button is valid',
126
+ table: {
127
+ type: { summary: 'boolean' },
128
+ defaultValue: { summary: false },
129
+ },
38
130
  },
39
131
  glass: {
40
132
  control: 'boolean',
41
133
  description: 'Enable glass morphism effect',
134
+ table: {
135
+ type: { summary: 'boolean' },
136
+ defaultValue: { summary: false },
137
+ },
138
+ },
139
+ name: {
140
+ control: 'text',
141
+ description: 'Name of the radio button group',
142
+ table: {
143
+ type: { summary: 'string' },
144
+ defaultValue: { summary: '-' },
145
+ },
146
+ },
147
+ value: {
148
+ control: 'text',
149
+ description: 'Value of the radio button',
150
+ table: {
151
+ type: { summary: 'string' },
152
+ defaultValue: { summary: '-' },
153
+ },
154
+ },
155
+ onChange: {
156
+ action: 'changed',
157
+ description: 'Callback when radio button state changes',
42
158
  },
43
159
  },
44
160
  } satisfies Meta<typeof Radio>;
@@ -47,12 +163,18 @@ export default meta;
47
163
  type Story = StoryObj<typeof meta>;
48
164
 
49
165
  // Basic radio button
50
- export const Basic: Story = {
166
+ export const BasicUsage: Story = {
51
167
  args: {
52
168
  label: 'Option 1',
53
169
  name: 'option',
54
170
  value: 'option1',
55
- onChange: () => { },
171
+ },
172
+ parameters: {
173
+ docs: {
174
+ description: {
175
+ story: 'Basic radio button with label.',
176
+ },
177
+ },
56
178
  },
57
179
  };
58
180
 
@@ -63,7 +185,13 @@ export const Checked: Story = {
63
185
  name: 'option',
64
186
  value: 'option1',
65
187
  checked: true,
66
- onChange: () => { },
188
+ },
189
+ parameters: {
190
+ docs: {
191
+ description: {
192
+ story: 'Checked radio button state.',
193
+ },
194
+ },
67
195
  },
68
196
  };
69
197
 
@@ -98,6 +226,13 @@ export const RadioGroup: Story = {
98
226
  </div>
99
227
  );
100
228
  },
229
+ parameters: {
230
+ docs: {
231
+ description: {
232
+ story: 'Group of radio buttons demonstrating mutual exclusivity.',
233
+ },
234
+ },
235
+ },
101
236
  };
102
237
 
103
238
  // Radio button states
@@ -121,20 +256,14 @@ export const States: Story = {
121
256
  checked={selectedValue === 'checked'}
122
257
  onChange={() => setSelectedValue('checked')}
123
258
  />
124
- <Radio
125
- label="Disabled radio"
126
- name="states"
127
- value="disabled"
128
- disabled
129
- onChange={() => { }}
130
- />
259
+ <Radio label="Disabled radio" name="states" value="disabled" disabled onChange={() => {}} />
131
260
  <Radio
132
261
  label="Disabled and checked radio"
133
262
  name="states"
134
263
  value="disabledChecked"
135
264
  disabled
136
265
  checked
137
- onChange={() => { }}
266
+ onChange={() => {}}
138
267
  />
139
268
  <Radio
140
269
  label="Valid radio"
@@ -163,7 +292,7 @@ export const WithoutLabel: Story = {
163
292
  name: 'noLabel',
164
293
  value: 'noLabel',
165
294
  'aria-label': 'Radio button without visible label',
166
- onChange: () => { },
295
+ onChange: () => {},
167
296
  },
168
297
  };
169
298
 
@@ -174,7 +303,7 @@ export const Glass: Story = {
174
303
  name: 'glass',
175
304
  value: 'glass',
176
305
  glass: true,
177
- onChange: () => { },
306
+ onChange: () => {},
178
307
  },
179
308
  render: (args: any) => (
180
309
  <div
@@ -206,7 +335,7 @@ export const GlassCustom: Story = {
206
335
  aberrationIntensity: 0.8,
207
336
  cornerRadius: 12,
208
337
  } as any,
209
- onChange: () => { },
338
+ onChange: () => {},
210
339
  },
211
340
  render: (args: any) => (
212
341
  <div
@@ -385,4 +514,4 @@ export const GlassStates: Story = {
385
514
  </div>
386
515
  );
387
516
  },
388
- };
517
+ };
@@ -6,78 +6,80 @@ import { AtomixGlass } from '../AtomixGlass/AtomixGlass';
6
6
  /**
7
7
  * Radio - A component for radio button inputs
8
8
  */
9
- export const Radio: React.FC<RadioProps> = memo(({
10
- label,
11
- checked = false,
12
- onChange,
13
- className = '',
14
- style,
15
- disabled = false,
16
- required = false,
17
- id,
18
- name,
19
- value,
20
- invalid = false,
21
- valid = false,
22
- 'aria-label': ariaLabel,
23
- 'aria-describedby': ariaDescribedBy,
24
- glass,
25
- }) => {
26
- const { generateRadioClass } = useRadio({
27
- disabled,
28
- invalid,
29
- valid,
30
- });
9
+ export const Radio: React.FC<RadioProps> = memo(
10
+ ({
11
+ label,
12
+ checked = false,
13
+ onChange,
14
+ className = '',
15
+ style,
16
+ disabled = false,
17
+ required = false,
18
+ id,
19
+ name,
20
+ value,
21
+ invalid = false,
22
+ valid = false,
23
+ 'aria-label': ariaLabel,
24
+ 'aria-describedby': ariaDescribedBy,
25
+ glass,
26
+ }) => {
27
+ const { generateRadioClass } = useRadio({
28
+ disabled,
29
+ invalid,
30
+ valid,
31
+ });
31
32
 
32
- const radioClass = generateRadioClass({
33
- className: `${className} ${glass ? 'c-radio--glass' : ''}`.trim(),
34
- disabled,
35
- invalid,
36
- valid,
37
- });
33
+ const radioClass = generateRadioClass({
34
+ className: `${className} ${glass ? 'c-radio--glass' : ''}`.trim(),
35
+ disabled,
36
+ invalid,
37
+ valid,
38
+ });
38
39
 
39
- const radioContent = (
40
- <div className={radioClass} style={style}>
41
- <input
42
- type="radio"
43
- className="c-radio__input"
44
- checked={checked}
45
- onChange={onChange}
46
- disabled={disabled}
47
- required={required}
48
- id={id}
49
- name={name}
50
- value={value}
51
- aria-label={!label ? ariaLabel : undefined}
52
- aria-describedby={ariaDescribedBy}
53
- aria-invalid={invalid}
54
- />
55
- {label && (
56
- <label className="c-radio__label" htmlFor={id}>
57
- {label}
58
- </label>
59
- )}
60
- </div>
61
- );
40
+ const radioContent = (
41
+ <div className={radioClass} style={style}>
42
+ <input
43
+ type="radio"
44
+ className="c-radio__input"
45
+ checked={checked}
46
+ onChange={onChange}
47
+ disabled={disabled}
48
+ required={required}
49
+ id={id}
50
+ name={name}
51
+ value={value}
52
+ aria-label={!label ? ariaLabel : undefined}
53
+ aria-describedby={ariaDescribedBy}
54
+ aria-invalid={invalid}
55
+ />
56
+ {label && (
57
+ <label className="c-radio__label" htmlFor={id}>
58
+ {label}
59
+ </label>
60
+ )}
61
+ </div>
62
+ );
62
63
 
63
- if (glass) {
64
- // Default glass settings for radio buttons
65
- const defaultGlassProps = {
66
- displacementScale: 40,
67
- blurAmount: 1,
68
- saturation: 160,
69
- aberrationIntensity: 0.3,
70
- cornerRadius: 6,
71
- mode: 'shader' as const,
72
- };
64
+ if (glass) {
65
+ // Default glass settings for radio buttons
66
+ const defaultGlassProps = {
67
+ displacementScale: 40,
68
+ blurAmount: 1,
69
+ saturation: 160,
70
+ aberrationIntensity: 0.3,
71
+ cornerRadius: 6,
72
+ mode: 'shader' as const,
73
+ };
73
74
 
74
- const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
75
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
75
76
 
76
- return <AtomixGlass {...glassProps}>{radioContent}</AtomixGlass>;
77
- }
77
+ return <AtomixGlass {...glassProps}>{radioContent}</AtomixGlass>;
78
+ }
78
79
 
79
- return radioContent;
80
- });
80
+ return radioContent;
81
+ }
82
+ );
81
83
 
82
84
  export type { RadioProps };
83
85