@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
@@ -24,241 +24,238 @@ interface PaginationNavButtonProps {
24
24
  /**
25
25
  * PaginationNavButton component for rendering first, previous, next, and last buttons
26
26
  */
27
- export const PaginationNavButton: React.FC<PaginationNavButtonProps> = memo(({
28
- type,
29
- onClick,
30
- disabled,
31
- label,
32
- iconName,
33
- }) => (
34
- <li
35
- className={`c-pagination__item c-pagination__item--${type} ${disabled ? 'is-disabled' : ''}`}
36
- aria-disabled={disabled}
37
- >
38
- <button
39
- type="button"
40
- className="c-pagination__link"
41
- onClick={onClick}
42
- disabled={disabled}
43
- aria-label={label}
27
+ export const PaginationNavButton: React.FC<PaginationNavButtonProps> = memo(
28
+ ({ type, onClick, disabled, label, iconName }) => (
29
+ <li
30
+ className={`c-pagination__item c-pagination__item--${type} ${disabled ? 'is-disabled' : ''}`}
31
+ aria-disabled={disabled}
44
32
  >
45
- <Icon name={iconName} size="sm" aria-hidden="true" />
46
- </button>
47
- </li>
48
- ));
33
+ <button
34
+ type="button"
35
+ className="c-pagination__link"
36
+ onClick={onClick}
37
+ disabled={disabled}
38
+ aria-label={label}
39
+ >
40
+ <Icon name={iconName} size="sm" aria-hidden="true" />
41
+ </button>
42
+ </li>
43
+ )
44
+ );
49
45
 
50
46
  /**
51
47
  * Pagination component
52
48
  */
53
- export const Pagination: React.FC<PaginationProps> = memo(({
54
- currentPage = PAGINATION_DEFAULTS.currentPage,
55
- totalPages = PAGINATION_DEFAULTS.totalPages,
56
- onPageChange,
57
- siblingCount = PAGINATION_DEFAULTS.siblingCount,
58
- showFirstLastButtons = PAGINATION_DEFAULTS.showFirstLastButtons,
59
- showPrevNextButtons = PAGINATION_DEFAULTS.showPrevNextButtons,
60
- showSearch = false,
61
- searchPlaceholder = 'Go to page',
62
- size = PAGINATION_DEFAULTS.size,
63
- className = '',
64
- style,
65
- 'aria-label': ariaLabel = 'Pagination',
66
- glass,
67
- }) => {
68
- const { paginationRange, goToPage, nextPage, prevPage, firstPage, lastPage } = usePagination({
69
- currentPage,
70
- totalPages,
71
- siblingCount,
49
+ export const Pagination: React.FC<PaginationProps> = memo(
50
+ ({
51
+ currentPage = PAGINATION_DEFAULTS.currentPage,
52
+ totalPages = PAGINATION_DEFAULTS.totalPages,
72
53
  onPageChange,
73
- });
54
+ siblingCount = PAGINATION_DEFAULTS.siblingCount,
55
+ showFirstLastButtons = PAGINATION_DEFAULTS.showFirstLastButtons,
56
+ showPrevNextButtons = PAGINATION_DEFAULTS.showPrevNextButtons,
57
+ showSearch = false,
58
+ searchPlaceholder = 'Go to page',
59
+ size = PAGINATION_DEFAULTS.size,
60
+ className = '',
61
+ style,
62
+ 'aria-label': ariaLabel = 'Pagination',
63
+ glass,
64
+ }) => {
65
+ const { paginationRange, goToPage, nextPage, prevPage, firstPage, lastPage } = usePagination({
66
+ currentPage,
67
+ totalPages,
68
+ siblingCount,
69
+ onPageChange,
70
+ });
74
71
 
75
- const [searchValue, setSearchValue] = useState<string>('');
76
- const [searchError, setSearchError] = useState<string>('');
72
+ const [searchValue, setSearchValue] = useState<string>('');
73
+ const [searchError, setSearchError] = useState<string>('');
77
74
 
78
- // Don't render pagination with a single page or no pages
79
- if (currentPage === 0 || paginationRange.length < 2) {
80
- return null;
81
- }
75
+ // Don't render pagination with a single page or no pages
76
+ if (currentPage === 0 || paginationRange.length < 2) {
77
+ return null;
78
+ }
82
79
 
83
- const handleSearchSubmit = (e: FormEvent<HTMLFormElement>) => {
84
- e.preventDefault();
85
- setSearchError('');
80
+ const handleSearchSubmit = (e: FormEvent<HTMLFormElement>) => {
81
+ e.preventDefault();
82
+ setSearchError('');
86
83
 
87
- const pageNumber = parseInt(searchValue, 10);
84
+ const pageNumber = parseInt(searchValue, 10);
88
85
 
89
- if (isNaN(pageNumber)) {
90
- setSearchError('Please enter a valid page number');
91
- return;
92
- }
86
+ if (isNaN(pageNumber)) {
87
+ setSearchError('Please enter a valid page number');
88
+ return;
89
+ }
93
90
 
94
- if (pageNumber < 1 || pageNumber > totalPages) {
95
- setSearchError(`Page must be between 1 and ${totalPages}`);
96
- return;
97
- }
91
+ if (pageNumber < 1 || pageNumber > totalPages) {
92
+ setSearchError(`Page must be between 1 and ${totalPages}`);
93
+ return;
94
+ }
98
95
 
99
- if (pageNumber === currentPage) {
100
- setSearchError('You are already on this page');
101
- return;
102
- }
96
+ if (pageNumber === currentPage) {
97
+ setSearchError('You are already on this page');
98
+ return;
99
+ }
103
100
 
104
- goToPage(pageNumber);
105
- setSearchValue('');
106
- };
101
+ goToPage(pageNumber);
102
+ setSearchValue('');
103
+ };
107
104
 
108
- const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
109
- const value = e.target.value;
110
- // Only allow numbers
111
- if (value === '' || /^\d+$/.test(value)) {
112
- setSearchValue(value);
113
- setSearchError('');
114
- }
115
- };
105
+ const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
106
+ const value = e.target.value;
107
+ // Only allow numbers
108
+ if (value === '' || /^\d+$/.test(value)) {
109
+ setSearchValue(value);
110
+ setSearchError('');
111
+ }
112
+ };
116
113
 
117
- const paginationContent = (
118
- <nav
119
- className={`c-pagination c-pagination--${size} ${className}`}
120
- style={style}
121
- aria-label={ariaLabel}
122
- >
123
- <ul className="c-pagination__items">
124
- {showFirstLastButtons && (
125
- <PaginationNavButton
126
- type="first"
127
- onClick={firstPage}
128
- disabled={currentPage === 1}
129
- label="Go to first page"
130
- iconName="SkipBack"
131
- />
132
- )}
114
+ const paginationContent = (
115
+ <nav
116
+ className={`c-pagination c-pagination--${size} ${className}`}
117
+ style={style}
118
+ aria-label={ariaLabel}
119
+ >
120
+ <ul className="c-pagination__items">
121
+ {showFirstLastButtons && (
122
+ <PaginationNavButton
123
+ type="first"
124
+ onClick={firstPage}
125
+ disabled={currentPage === 1}
126
+ label="Go to first page"
127
+ iconName="SkipBack"
128
+ />
129
+ )}
133
130
 
134
- {showPrevNextButtons && (
135
- <PaginationNavButton
136
- type="prev"
137
- onClick={prevPage}
138
- disabled={currentPage === 1}
139
- label="Go to previous page"
140
- iconName="CaretLeft"
141
- />
142
- )}
131
+ {showPrevNextButtons && (
132
+ <PaginationNavButton
133
+ type="prev"
134
+ onClick={prevPage}
135
+ disabled={currentPage === 1}
136
+ label="Go to previous page"
137
+ iconName="CaretLeft"
138
+ />
139
+ )}
140
+
141
+ {paginationRange.map((pageNumber, index) => {
142
+ if (pageNumber === DOTS) {
143
+ return (
144
+ <li
145
+ key={`dots-${index}`}
146
+ className="c-pagination__item c-pagination__item--dots"
147
+ aria-hidden="true"
148
+ >
149
+ &#8230;
150
+ </li>
151
+ );
152
+ }
153
+
154
+ const isActive = pageNumber === currentPage;
143
155
 
144
- {paginationRange.map((pageNumber, index) => {
145
- if (pageNumber === DOTS) {
146
156
  return (
147
157
  <li
148
- key={`dots-${index}`}
149
- className="c-pagination__item c-pagination__item--dots"
150
- aria-hidden="true"
158
+ key={pageNumber}
159
+ className={`c-pagination__item ${isActive ? 'is-active' : ''}`}
160
+ aria-current={isActive ? 'page' : undefined}
151
161
  >
152
- &#8230;
162
+ <button
163
+ type="button"
164
+ className="c-pagination__link"
165
+ onClick={() => goToPage(pageNumber as number)}
166
+ aria-label={`Page ${pageNumber}`}
167
+ aria-current={isActive ? 'page' : undefined}
168
+ >
169
+ {pageNumber}
170
+ </button>
153
171
  </li>
154
172
  );
155
- }
173
+ })}
156
174
 
157
- const isActive = pageNumber === currentPage;
175
+ {showPrevNextButtons && (
176
+ <PaginationNavButton
177
+ type="next"
178
+ onClick={nextPage}
179
+ disabled={currentPage === totalPages}
180
+ label="Go to next page"
181
+ iconName="CaretRight"
182
+ />
183
+ )}
158
184
 
159
- return (
160
- <li
161
- key={pageNumber}
162
- className={`c-pagination__item ${isActive ? 'is-active' : ''}`}
163
- aria-current={isActive ? 'page' : undefined}
164
- >
165
- <button
166
- type="button"
167
- className="c-pagination__link"
168
- onClick={() => goToPage(pageNumber as number)}
169
- aria-label={`Page ${pageNumber}`}
170
- aria-current={isActive ? 'page' : undefined}
185
+ {showFirstLastButtons && (
186
+ <PaginationNavButton
187
+ type="last"
188
+ onClick={lastPage}
189
+ disabled={currentPage === totalPages}
190
+ label="Go to last page"
191
+ iconName="SkipForward"
192
+ />
193
+ )}
194
+ </ul>
195
+
196
+ {showSearch && (
197
+ <form
198
+ className="c-pagination__search"
199
+ onSubmit={handleSearchSubmit}
200
+ aria-label="Jump to page"
201
+ >
202
+ <div className="c-pagination__search-wrapper">
203
+ <label
204
+ htmlFor={`pagination-search-${currentPage}`}
205
+ className="c-pagination__search-label"
171
206
  >
172
- {pageNumber}
207
+ <span className="c-pagination__search-label-text">Go to page:</span>
208
+ <input
209
+ id={`pagination-search-${currentPage}`}
210
+ type="text"
211
+ inputMode="numeric"
212
+ pattern="[0-9]*"
213
+ className={`c-pagination__search-input ${searchError ? 'is-error' : ''}`}
214
+ placeholder={searchPlaceholder}
215
+ value={searchValue}
216
+ onChange={handleSearchChange}
217
+ aria-label="Page number"
218
+ aria-invalid={searchError ? 'true' : 'false'}
219
+ aria-describedby={searchError ? `pagination-error-${currentPage}` : undefined}
220
+ />
221
+ </label>
222
+ <button type="submit" className="c-pagination__search-button" aria-label="Go to page">
223
+ <Icon name="ArrowRight" size="sm" aria-hidden="true" />
173
224
  </button>
174
- </li>
175
- );
176
- })}
177
-
178
- {showPrevNextButtons && (
179
- <PaginationNavButton
180
- type="next"
181
- onClick={nextPage}
182
- disabled={currentPage === totalPages}
183
- label="Go to next page"
184
- iconName="CaretRight"
185
- />
186
- )}
187
-
188
- {showFirstLastButtons && (
189
- <PaginationNavButton
190
- type="last"
191
- onClick={lastPage}
192
- disabled={currentPage === totalPages}
193
- label="Go to last page"
194
- iconName="SkipForward"
195
- />
225
+ </div>
226
+ {searchError && (
227
+ <div
228
+ id={`pagination-error-${currentPage}`}
229
+ className="c-pagination__search-error"
230
+ role="alert"
231
+ >
232
+ {searchError}
233
+ </div>
234
+ )}
235
+ </form>
196
236
  )}
197
- </ul>
237
+ </nav>
238
+ );
198
239
 
199
- {showSearch && (
200
- <form
201
- className="c-pagination__search"
202
- onSubmit={handleSearchSubmit}
203
- aria-label="Jump to page"
204
- >
205
- <div className="c-pagination__search-wrapper">
206
- <label htmlFor={`pagination-search-${currentPage}`} className="c-pagination__search-label">
207
- <span className="c-pagination__search-label-text">Go to page:</span>
208
- <input
209
- id={`pagination-search-${currentPage}`}
210
- type="text"
211
- inputMode="numeric"
212
- pattern="[0-9]*"
213
- className={`c-pagination__search-input ${searchError ? 'is-error' : ''}`}
214
- placeholder={searchPlaceholder}
215
- value={searchValue}
216
- onChange={handleSearchChange}
217
- aria-label="Page number"
218
- aria-invalid={searchError ? 'true' : 'false'}
219
- aria-describedby={searchError ? `pagination-error-${currentPage}` : undefined}
220
- />
221
- </label>
222
- <button
223
- type="submit"
224
- className="c-pagination__search-button"
225
- aria-label="Go to page"
226
- >
227
- <Icon name="ArrowRight" size="sm" aria-hidden="true" />
228
- </button>
229
- </div>
230
- {searchError && (
231
- <div
232
- id={`pagination-error-${currentPage}`}
233
- className="c-pagination__search-error"
234
- role="alert"
235
- >
236
- {searchError}
237
- </div>
238
- )}
239
- </form>
240
- )}
241
- </nav>
242
- );
240
+ if (glass) {
241
+ // Default glass settings for pagination
242
+ const defaultGlassProps = {
243
+ displacementScale: 60,
244
+ blurAmount: 1,
245
+ saturation: 160,
246
+ aberrationIntensity: 0.5,
247
+ cornerRadius: 8,
248
+ mode: 'shader' as const,
249
+ };
243
250
 
244
- if (glass) {
245
- // Default glass settings for pagination
246
- const defaultGlassProps = {
247
- displacementScale: 60,
248
- blurAmount: 1,
249
- saturation: 160,
250
- aberrationIntensity: 0.5,
251
- cornerRadius: 8,
252
- mode: 'shader' as const,
253
- };
251
+ const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
254
252
 
255
- const glassProps = glass === true ? defaultGlassProps : { ...defaultGlassProps, ...glass };
253
+ return <AtomixGlass {...glassProps}>{paginationContent}</AtomixGlass>;
254
+ }
256
255
 
257
- return <AtomixGlass {...glassProps}>{paginationContent}</AtomixGlass>;
256
+ return paginationContent;
258
257
  }
259
-
260
- return paginationContent;
261
- });
258
+ );
262
259
 
263
260
  export type { PaginationProps };
264
261
 
@@ -111,7 +111,10 @@ export const PhotoViewer: React.FC<PhotoViewerProps> = ({
111
111
 
112
112
  const link = document.createElement('a');
113
113
  link.href = currentImage.src;
114
- const sanitizedTitle = (currentImage.title || `image-${currentIndex + 1}`).replace(/[^a-zA-Z0-9.-]/g, '_');
114
+ const sanitizedTitle = (currentImage.title || `image-${currentIndex + 1}`).replace(
115
+ /[^a-zA-Z0-9.-]/g,
116
+ '_'
117
+ );
115
118
  link.download = sanitizedTitle;
116
119
  document.body.appendChild(link);
117
120
  link.click();