@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,4 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
2
3
  import React, { useState } from 'react';
3
4
  import { Upload } from './Upload';
4
5
  import { SIZES } from '../../lib/constants/components';
@@ -10,8 +11,68 @@ const meta = {
10
11
  layout: 'centered',
11
12
  docs: {
12
13
  description: {
13
- component:
14
- 'The Upload component provides a modern file upload interface with drag & drop functionality, progress tracking, file preview, and validation. It supports single and multiple file uploads, custom file size limits, and provides visual feedback throughout the upload process. Ideal for forms requiring file attachments or media uploads.',
14
+ component: `
15
+ # Upload
16
+
17
+ ## Overview
18
+
19
+ Upload provides a modern file upload interface with drag & drop functionality, progress tracking, file preview, and validation. It supports single and multiple file uploads, custom file size limits, and provides visual feedback throughout the upload process. Ideal for forms requiring file attachments or media uploads.
20
+
21
+ ## Features
22
+
23
+ - Drag & drop file upload
24
+ - Progress tracking
25
+ - File preview
26
+ - Validation
27
+ - Multiple file support
28
+ - Customizable size limits
29
+ - Accessible design
30
+ - Responsive behavior
31
+
32
+ ## Accessibility
33
+
34
+ - Keyboard support: Upload via keyboard navigation
35
+ - Screen reader: File selection and status announced appropriately
36
+ - ARIA support: Proper roles and properties for upload components
37
+ - Focus management: Visible focus indicators maintained
38
+
39
+ ## Usage Examples
40
+
41
+ ### Basic Usage
42
+
43
+ \`\`\`tsx
44
+ <Upload
45
+ title="Drag and Drop files here"
46
+ onFileSelect={(files) => console.log(files)}
47
+ />
48
+ \`\`\`
49
+
50
+ ### Multiple Files
51
+
52
+ \`\`\`tsx
53
+ <Upload
54
+ multiple={true}
55
+ title="Drag and Drop files here"
56
+ onFileSelect={(files) => console.log(files)}
57
+ />
58
+ \`\`\`
59
+
60
+ ## API Reference
61
+
62
+ ### Props
63
+
64
+ | Prop | Type | Default | Description |
65
+ | ---- | ---- | ------- | ----------- |
66
+ | size | 'sm' \\| 'md' \\| 'lg' | 'md' | Size variant of the upload component |
67
+ | disabled | boolean | false | Whether the upload component is disabled |
68
+ | maxSizeInMB | number | 5 | Maximum file size in MB |
69
+ | multiple | boolean | false | Whether multiple files can be selected |
70
+ | title | string | 'Drag and Drop files here' | Text for the drag and drop section |
71
+ | supportedFilesText | string | 'Files supported: PDF, XSLS, JPEG, PNG, Scanner' | Text describing supported file types |
72
+ | buttonText | string | 'Choose File' | Text for the upload button |
73
+ | helperText | string | 'Maximum size: 5MB' | Helper text displayed below the button |
74
+ | onFileSelect | (files: File[]) => void | - | Callback when files are selected |
75
+ `,
15
76
  },
16
77
  },
17
78
  },
@@ -20,43 +81,71 @@ const meta = {
20
81
  size: {
21
82
  control: { type: 'select' },
22
83
  options: SIZES,
23
- defaultValue: 'md',
24
84
  description: 'Size variant of the upload component',
85
+ table: {
86
+ type: { summary: '"sm" | "md" | "lg"' },
87
+ defaultValue: { summary: 'md' },
88
+ },
25
89
  },
26
90
  disabled: {
27
91
  control: { type: 'boolean' },
28
- defaultValue: false,
29
92
  description: 'Whether the upload component is disabled',
93
+ table: {
94
+ type: { summary: 'boolean' },
95
+ defaultValue: { summary: false },
96
+ },
30
97
  },
31
98
  maxSizeInMB: {
32
99
  control: { type: 'number' },
33
- defaultValue: 5,
34
100
  description: 'Maximum file size in MB',
101
+ table: {
102
+ type: { summary: 'number' },
103
+ defaultValue: { summary: 5 },
104
+ },
35
105
  },
36
106
  multiple: {
37
107
  control: { type: 'boolean' },
38
- defaultValue: false,
39
108
  description: 'Whether multiple files can be selected',
109
+ table: {
110
+ type: { summary: 'boolean' },
111
+ defaultValue: { summary: false },
112
+ },
40
113
  },
41
114
  title: {
42
115
  control: { type: 'text' },
43
- defaultValue: 'Drag and Drop files here',
44
116
  description: 'Text for the drag and drop section',
117
+ table: {
118
+ type: { summary: 'string' },
119
+ defaultValue: { summary: 'Drag and Drop files here' },
120
+ },
45
121
  },
46
122
  supportedFilesText: {
47
123
  control: { type: 'text' },
48
- defaultValue: 'Files supported: PDF, XSLS, JPEG, PNG, Scanner',
49
124
  description: 'Text describing supported file types',
125
+ table: {
126
+ type: { summary: 'string' },
127
+ defaultValue: { summary: 'Files supported: PDF, XSLS, JPEG, PNG, Scanner' },
128
+ },
50
129
  },
51
130
  buttonText: {
52
131
  control: { type: 'text' },
53
- defaultValue: 'Choose File',
54
132
  description: 'Text for the upload button',
133
+ table: {
134
+ type: { summary: 'string' },
135
+ defaultValue: { summary: 'Choose File' },
136
+ },
55
137
  },
56
138
  helperText: {
57
139
  control: { type: 'text' },
58
- defaultValue: 'Maximum size: 5MB',
59
140
  description: 'Helper text displayed below the button',
141
+ table: {
142
+ type: { summary: 'string' },
143
+ defaultValue: { summary: 'Maximum size: 5MB' },
144
+ },
145
+ },
146
+ onFileSelect: {
147
+ action: 'file selected',
148
+ description: 'Callback when files are selected',
60
149
  },
61
150
  },
62
151
  } satisfies Meta<typeof Upload>;
@@ -64,8 +153,7 @@ const meta = {
64
153
  export default meta;
65
154
  type Story = StoryObj<typeof meta>;
66
155
 
67
- // Default upload component
68
- export const Default: Story = {
156
+ export const BasicUsage: Story = {
69
157
  render: args => (
70
158
  <div style={{ padding: '30px', maxWidth: '600px' }}>
71
159
  <Upload {...args} />
@@ -77,6 +165,7 @@ export const Default: Story = {
77
165
  supportedFilesText: 'Files supported: PDF, XSLS, JPEG, PNG, Scanner',
78
166
  buttonText: 'Choose File',
79
167
  helperText: 'Maximum size: 5MB',
168
+ onFileSelect: fn(),
80
169
  },
81
170
  parameters: {
82
171
  docs: {
@@ -90,48 +179,48 @@ export const Default: Story = {
90
179
  // Size Variants
91
180
  export const SizeVariants: Story = {
92
181
  render: () => (
93
- <div style={{ padding: '30px' }}>
94
- <div style={{ marginBottom: '40px' }}>
95
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Small Size</h3>
96
- <div style={{ maxWidth: '400px' }}>
97
- <Upload
98
- size="sm"
99
- title="Small Upload Area"
100
- supportedFilesText="PDF, JPEG, PNG"
101
- buttonText="Choose File"
102
- helperText="Max: 2MB"
103
- />
182
+ <div style={{ padding: '30px' }}>
183
+ <div style={{ marginBottom: '40px' }}>
184
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Small Size</h3>
185
+ <div style={{ maxWidth: '400px' }}>
186
+ <Upload
187
+ size="sm"
188
+ title="Small Upload Area"
189
+ supportedFilesText="PDF, JPEG, PNG"
190
+ buttonText="Choose File"
191
+ helperText="Max: 2MB"
192
+ />
193
+ </div>
104
194
  </div>
105
- </div>
106
195
 
107
- <div style={{ marginBottom: '40px' }}>
108
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>
109
- Medium Size (Default)
110
- </h3>
111
- <div style={{ maxWidth: '500px' }}>
112
- <Upload
113
- size="md"
114
- title="Drag and Drop files here"
115
- supportedFilesText="Files supported: PDF, XSLS, JPEG, PNG, Scanner"
116
- buttonText="Choose File"
117
- helperText="Maximum size: 5MB"
118
- />
196
+ <div style={{ marginBottom: '40px' }}>
197
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>
198
+ Medium Size (Default)
199
+ </h3>
200
+ <div style={{ maxWidth: '500px' }}>
201
+ <Upload
202
+ size="md"
203
+ title="Drag and Drop files here"
204
+ supportedFilesText="Files supported: PDF, XSLS, JPEG, PNG, Scanner"
205
+ buttonText="Choose File"
206
+ helperText="Maximum size: 5MB"
207
+ />
208
+ </div>
119
209
  </div>
120
- </div>
121
210
 
122
- <div>
123
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Large Size</h3>
124
- <div style={{ maxWidth: '700px' }}>
125
- <Upload
126
- size="lg"
127
- title="Drop your files here for upload"
128
- supportedFilesText="Supported formats: PDF, Excel, Word, Images, and more"
129
- buttonText="Browse Files"
130
- helperText="Maximum file size: 10MB per file"
131
- />
211
+ <div>
212
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Large Size</h3>
213
+ <div style={{ maxWidth: '700px' }}>
214
+ <Upload
215
+ size="lg"
216
+ title="Drop your files here for upload"
217
+ supportedFilesText="Supported formats: PDF, Excel, Word, Images, and more"
218
+ buttonText="Browse Files"
219
+ helperText="Maximum file size: 10MB per file"
220
+ />
221
+ </div>
132
222
  </div>
133
223
  </div>
134
- </div>
135
224
  ),
136
225
  parameters: {
137
226
  docs: {
@@ -142,8 +231,7 @@ export const SizeVariants: Story = {
142
231
  },
143
232
  };
144
233
 
145
- // Disabled state
146
- export const Disabled: Story = {
234
+ export const DisabledState: Story = {
147
235
  render: args => (
148
236
  <div style={{ padding: '30px', maxWidth: '600px' }}>
149
237
  <Upload {...args} />
@@ -151,16 +239,17 @@ export const Disabled: Story = {
151
239
  ),
152
240
  args: {
153
241
  size: 'md',
154
- title: 'Drag and Drop files here',
155
- supportedFilesText: 'Files supported: PDF, XSLS, JPEG, PNG, Scanner',
156
- buttonText: 'Choose File',
157
- helperText: 'Maximum size: 5MB',
158
242
  disabled: true,
243
+ title: 'Upload Disabled',
244
+ supportedFilesText: 'PDF, JPEG, PNG',
245
+ buttonText: 'Choose File',
246
+ helperText: 'This upload component is disabled',
247
+ onFileSelect: fn(),
159
248
  },
160
249
  parameters: {
161
250
  docs: {
162
251
  description: {
163
- story: 'Upload component in disabled state with reduced opacity and no interactions.',
252
+ story: 'Upload component in disabled state.',
164
253
  },
165
254
  },
166
255
  },
@@ -353,7 +442,6 @@ export const CustomIcon: Story = {
353
442
  },
354
443
  };
355
444
 
356
- // Multiple file upload
357
445
  export const MultipleFiles: Story = {
358
446
  render: args => (
359
447
  <div style={{ padding: '30px', maxWidth: '600px' }}>
@@ -363,15 +451,16 @@ export const MultipleFiles: Story = {
363
451
  args: {
364
452
  size: 'md',
365
453
  multiple: true,
454
+ title: 'Drag and Drop files here',
455
+ supportedFilesText: 'PDF, JPEG, PNG, DOCX',
366
456
  buttonText: 'Choose Files',
367
- title: 'Upload multiple files',
368
- supportedFilesText: 'Select multiple files at once',
369
- helperText: 'Maximum size: 5MB per file',
457
+ helperText: 'Multiple files supported, max size: 5MB each',
458
+ onFileSelect: fn(),
370
459
  },
371
460
  parameters: {
372
461
  docs: {
373
462
  description: {
374
- story: 'Upload component configured to accept multiple files at once.',
463
+ story: 'Upload component configured to allow multiple file selections.',
375
464
  },
376
465
  },
377
466
  },
@@ -383,73 +472,73 @@ export const DragDropDemo: Story = {
383
472
  const [dragState, setDragState] = useState<'idle' | 'dragging'>('idle');
384
473
  const [uploadedFiles, setUploadedFiles] = useState<string[]>([]);
385
474
 
386
- const handleFileSelect = (files: File[]) => {
387
- const fileNames = files.map(file => file.name);
388
- setUploadedFiles(prev => [...prev, ...fileNames]);
389
- };
475
+ const handleFileSelect = (files: File[]) => {
476
+ const fileNames = files.map(file => file.name);
477
+ setUploadedFiles(prev => [...prev, ...fileNames]);
478
+ };
390
479
 
391
- return (
392
- <div style={{ padding: '30px' }}>
393
- <div style={{ marginBottom: '20px' }}>
394
- <h3 style={{ fontSize: '18px', fontWeight: '600', marginBottom: '10px' }}>
395
- Interactive Drag & Drop Demo
396
- </h3>
397
- <p style={{ color: '#666', fontSize: '14px', marginBottom: '20px' }}>
398
- Try dragging files over the upload area to see the hover effects, or click to select
399
- files.
400
- </p>
401
- </div>
480
+ return (
481
+ <div style={{ padding: '30px' }}>
482
+ <div style={{ marginBottom: '20px' }}>
483
+ <h3 style={{ fontSize: '18px', fontWeight: '600', marginBottom: '10px' }}>
484
+ Interactive Drag & Drop Demo
485
+ </h3>
486
+ <p style={{ color: '#666', fontSize: '14px', marginBottom: '20px' }}>
487
+ Try dragging files over the upload area to see the hover effects, or click to select
488
+ files.
489
+ </p>
490
+ </div>
402
491
 
403
- <div style={{ maxWidth: '600px', marginBottom: '20px' }}>
404
- <Upload
405
- title="Drag files here to see the magic ✨"
406
- supportedFilesText="PDF, Images, Documents - All welcome!"
407
- buttonText="Or click to browse"
408
- helperText="Watch the upload area respond to your interactions"
409
- onFileSelect={handleFileSelect}
410
- multiple={true}
411
- />
412
- </div>
492
+ <div style={{ maxWidth: '600px', marginBottom: '20px' }}>
493
+ <Upload
494
+ title="Drag files here to see the magic ✨"
495
+ supportedFilesText="PDF, Images, Documents - All welcome!"
496
+ buttonText="Or click to browse"
497
+ helperText="Watch the upload area respond to your interactions"
498
+ onFileSelect={handleFileSelect}
499
+ multiple={true}
500
+ />
501
+ </div>
413
502
 
414
- {uploadedFiles.length > 0 && (
415
- <div
416
- style={{
417
- padding: '16px',
418
- backgroundColor: '#f8f9fa',
419
- borderRadius: '8px',
420
- border: '1px solid #e9ecef',
421
- }}
422
- >
423
- <h4
424
- style={{ fontSize: '14px', fontWeight: '600', marginBottom: '8px', color: '#495057' }}
425
- >
426
- Selected Files:
427
- </h4>
428
- <ul style={{ margin: 0, paddingLeft: '20px' }}>
429
- {uploadedFiles.map((fileName, index) => (
430
- <li key={index} style={{ fontSize: '14px', color: '#6c757d', marginBottom: '4px' }}>
431
- {fileName}
432
- </li>
433
- ))}
434
- </ul>
435
- <button
436
- onClick={() => setUploadedFiles([])}
503
+ {uploadedFiles.length > 0 && (
504
+ <div
437
505
  style={{
438
- marginTop: '12px',
439
- padding: '6px 12px',
440
- fontSize: '12px',
441
- backgroundColor: '#6c757d',
442
- color: 'white',
443
- border: 'none',
444
- borderRadius: '4px',
445
- cursor: 'pointer',
506
+ padding: '16px',
507
+ backgroundColor: '#f8f9fa',
508
+ borderRadius: '8px',
509
+ border: '1px solid #e9ecef',
446
510
  }}
447
511
  >
448
- Clear List
449
- </button>
450
- </div>
451
- )}
452
- </div>
512
+ <h4
513
+ style={{ fontSize: '14px', fontWeight: '600', marginBottom: '8px', color: '#495057' }}
514
+ >
515
+ Selected Files:
516
+ </h4>
517
+ <ul style={{ margin: 0, paddingLeft: '20px' }}>
518
+ {uploadedFiles.map((fileName, index) => (
519
+ <li key={index} style={{ fontSize: '14px', color: '#6c757d', marginBottom: '4px' }}>
520
+ {fileName}
521
+ </li>
522
+ ))}
523
+ </ul>
524
+ <button
525
+ onClick={() => setUploadedFiles([])}
526
+ style={{
527
+ marginTop: '12px',
528
+ padding: '6px 12px',
529
+ fontSize: '12px',
530
+ backgroundColor: '#6c757d',
531
+ color: 'white',
532
+ border: 'none',
533
+ borderRadius: '4px',
534
+ cursor: 'pointer',
535
+ }}
536
+ >
537
+ Clear List
538
+ </button>
539
+ </div>
540
+ )}
541
+ </div>
453
542
  );
454
543
  },
455
544
  parameters: {
@@ -466,39 +555,41 @@ export const DragDropDemo: Story = {
466
555
  export const FileTypeRestrictions: Story = {
467
556
  render: () => (
468
557
  <div style={{ padding: '30px' }}>
469
- <div style={{ marginBottom: '40px' }}>
470
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Images Only</h3>
471
- <div style={{ maxWidth: '500px' }}>
472
- <Upload
473
- title="Upload Images"
474
- supportedFilesText="JPEG, PNG, GIF, WebP"
475
- buttonText="Choose Images"
476
- helperText="Maximum size: 10MB"
477
- acceptedFileTypes={['image/jpeg', 'image/png', 'image/gif', 'image/webp']}
478
- multiple={true}
479
- />
558
+ <div style={{ marginBottom: '40px' }}>
559
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Images Only</h3>
560
+ <div style={{ maxWidth: '500px' }}>
561
+ <Upload
562
+ title="Upload Images"
563
+ supportedFilesText="JPEG, PNG, GIF, WebP"
564
+ buttonText="Choose Images"
565
+ helperText="Maximum size: 10MB"
566
+ acceptedFileTypes={['image/jpeg', 'image/png', 'image/gif', 'image/webp']}
567
+ multiple={true}
568
+ />
569
+ </div>
480
570
  </div>
481
- </div>
482
571
 
483
- <div style={{ marginBottom: '40px' }}>
484
- <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>Documents Only</h3>
485
- <div style={{ maxWidth: '500px' }}>
486
- <Upload
487
- title="Upload Documents"
488
- supportedFilesText="PDF, Word, Excel, PowerPoint"
489
- buttonText="Choose Documents"
490
- helperText="Maximum size: 25MB"
491
- acceptedFileTypes={[
492
- 'application/pdf',
493
- 'application/msword',
494
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
495
- 'application/vnd.ms-excel',
496
- 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
497
- ]}
498
- />
572
+ <div style={{ marginBottom: '40px' }}>
573
+ <h3 style={{ marginBottom: '20px', fontSize: '18px', fontWeight: '600' }}>
574
+ Documents Only
575
+ </h3>
576
+ <div style={{ maxWidth: '500px' }}>
577
+ <Upload
578
+ title="Upload Documents"
579
+ supportedFilesText="PDF, Word, Excel, PowerPoint"
580
+ buttonText="Choose Documents"
581
+ helperText="Maximum size: 25MB"
582
+ acceptedFileTypes={[
583
+ 'application/pdf',
584
+ 'application/msword',
585
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
586
+ 'application/vnd.ms-excel',
587
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
588
+ ]}
589
+ />
590
+ </div>
499
591
  </div>
500
592
  </div>
501
- </div>
502
593
  ),
503
594
  parameters: {
504
595
  docs: {