aural-ui 2.0.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 (308) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +456 -0
  3. package/dist/components/aspect-ratio/AspectRatio.stories.tsx +1327 -0
  4. package/dist/components/aspect-ratio/index.tsx +10 -0
  5. package/dist/components/aspect-ratio/meta.ts +8 -0
  6. package/dist/components/avatar/Avatar.stories.tsx +645 -0
  7. package/dist/components/avatar/index.tsx +50 -0
  8. package/dist/components/avatar/meta.ts +8 -0
  9. package/dist/components/badge/Badge.stories.tsx +169 -0
  10. package/dist/components/badge/index.tsx +28 -0
  11. package/dist/components/badge/meta.ts +6 -0
  12. package/dist/components/banner/Banner.stories.tsx +475 -0
  13. package/dist/components/banner/index.tsx +256 -0
  14. package/dist/components/banner/meta.ts +36 -0
  15. package/dist/components/button/Button.stories.tsx +74 -0
  16. package/dist/components/button/index.tsx +158 -0
  17. package/dist/components/button/meta.ts +33 -0
  18. package/dist/components/card/Card.stories.tsx +377 -0
  19. package/dist/components/card/index.tsx +85 -0
  20. package/dist/components/card/meta.ts +14 -0
  21. package/dist/components/char-count/CharCount.stories.tsx +334 -0
  22. package/dist/components/char-count/index.tsx +51 -0
  23. package/dist/components/char-count/meta.ts +13 -0
  24. package/dist/components/checkbox/Checkbox.stories.tsx +209 -0
  25. package/dist/components/checkbox/index.tsx +34 -0
  26. package/dist/components/checkbox/meta.ts +19 -0
  27. package/dist/components/chip/Chip.stories.tsx +207 -0
  28. package/dist/components/chip/index.tsx +92 -0
  29. package/dist/components/chip/meta.ts +17 -0
  30. package/dist/components/circular-loader/CircularLoader.stories.tsx +741 -0
  31. package/dist/components/circular-loader/index.tsx +138 -0
  32. package/dist/components/circular-loader/meta.ts +11 -0
  33. package/dist/components/collapsible/Collapsible.stories.tsx +319 -0
  34. package/dist/components/collapsible/index.tsx +158 -0
  35. package/dist/components/collapsible/meta.ts +22 -0
  36. package/dist/components/command/Command.stories.tsx +996 -0
  37. package/dist/components/command/index.tsx +324 -0
  38. package/dist/components/command/meta.ts +18 -0
  39. package/dist/components/dialog/Dialog.stories.tsx +963 -0
  40. package/dist/components/dialog/index.tsx +250 -0
  41. package/dist/components/dialog/meta.ts +28 -0
  42. package/dist/components/divider/Divider.stories.tsx +633 -0
  43. package/dist/components/divider/index.tsx +181 -0
  44. package/dist/components/divider/meta.ts +12 -0
  45. package/dist/components/dot-loader/DotLoader.stories.tsx +352 -0
  46. package/dist/components/dot-loader/index.tsx +78 -0
  47. package/dist/components/dot-loader/meta.ts +14 -0
  48. package/dist/components/dropdown/Dropdown.stories.tsx +1210 -0
  49. package/dist/components/dropdown/index.tsx +479 -0
  50. package/dist/components/dropdown/meta.ts +21 -0
  51. package/dist/components/form/Form.stories.tsx +320 -0
  52. package/dist/components/form/index.tsx +183 -0
  53. package/dist/components/form/meta.ts +11 -0
  54. package/dist/components/helper-text/HelperText.stories.tsx +254 -0
  55. package/dist/components/helper-text/index.tsx +102 -0
  56. package/dist/components/helper-text/meta.ts +18 -0
  57. package/dist/components/hover-card/HoverCard.stories.tsx +1328 -0
  58. package/dist/components/hover-card/index.tsx +42 -0
  59. package/dist/components/hover-card/meta.ts +12 -0
  60. package/dist/components/icon-button/IconButton.stories.tsx +252 -0
  61. package/dist/components/icon-button/index.tsx +130 -0
  62. package/dist/components/icon-button/meta.ts +20 -0
  63. package/dist/components/if-else/if-else.stories.tsx +100 -0
  64. package/dist/components/if-else/index.tsx +56 -0
  65. package/dist/components/if-else/meta.ts +6 -0
  66. package/dist/components/index.ts +70 -0
  67. package/dist/components/input/Input.stories.tsx +431 -0
  68. package/dist/components/input/index.tsx +487 -0
  69. package/dist/components/input/meta.ts +28 -0
  70. package/dist/components/label/Label.stories.tsx +200 -0
  71. package/dist/components/label/index.tsx +43 -0
  72. package/dist/components/label/meta.ts +14 -0
  73. package/dist/components/list/List.stories.tsx +963 -0
  74. package/dist/components/list/index.tsx +567 -0
  75. package/dist/components/list/meta.ts +24 -0
  76. package/dist/components/marquee/Marquee.stories.tsx +819 -0
  77. package/dist/components/marquee/index.tsx +107 -0
  78. package/dist/components/marquee/meta.ts +6 -0
  79. package/dist/components/overlay/Overlay.stories.tsx +954 -0
  80. package/dist/components/overlay/index.tsx +58 -0
  81. package/dist/components/overlay/meta.ts +10 -0
  82. package/dist/components/pagination/Pagination.stories.tsx +354 -0
  83. package/dist/components/pagination/index.tsx +455 -0
  84. package/dist/components/pagination/meta.ts +29 -0
  85. package/dist/components/popover/Popover.stories.tsx +1037 -0
  86. package/dist/components/popover/index.tsx +67 -0
  87. package/dist/components/popover/meta.ts +12 -0
  88. package/dist/components/radio/Radio.stories.tsx +146 -0
  89. package/dist/components/radio/index.tsx +41 -0
  90. package/dist/components/radio/meta.ts +19 -0
  91. package/dist/components/resizable/Resizable.stories.tsx +866 -0
  92. package/dist/components/resizable/index.tsx +55 -0
  93. package/dist/components/resizable/meta.ts +12 -0
  94. package/dist/components/scroll-area/ScrollArea.stories.tsx +1104 -0
  95. package/dist/components/scroll-area/index.tsx +55 -0
  96. package/dist/components/scroll-area/meta.ts +8 -0
  97. package/dist/components/search/Search.stories.tsx +678 -0
  98. package/dist/components/search/index.tsx +141 -0
  99. package/dist/components/search/meta.ts +6 -0
  100. package/dist/components/select/Select.stories.tsx +962 -0
  101. package/dist/components/select/index.tsx +512 -0
  102. package/dist/components/select/meta.ts +40 -0
  103. package/dist/components/sheet/Sheet.stories.tsx +1060 -0
  104. package/dist/components/sheet/index.tsx +440 -0
  105. package/dist/components/sheet/meta.ts +38 -0
  106. package/dist/components/skelton/Skelton.stories.tsx +859 -0
  107. package/dist/components/skelton/index.tsx +17 -0
  108. package/dist/components/skelton/meta.ts +6 -0
  109. package/dist/components/slider/Slider.stories.tsx +876 -0
  110. package/dist/components/slider/index.tsx +156 -0
  111. package/dist/components/slider/meta.ts +29 -0
  112. package/dist/components/stepper/Stepper.stories.tsx +639 -0
  113. package/dist/components/stepper/index.tsx +650 -0
  114. package/dist/components/stepper/meta.ts +19 -0
  115. package/dist/components/switch/Switch.stories.tsx +85 -0
  116. package/dist/components/switch/index.tsx +37 -0
  117. package/dist/components/switch/meta.ts +24 -0
  118. package/dist/components/switch-case/SwitchCase.stories.tsx +209 -0
  119. package/dist/components/switch-case/index.tsx +89 -0
  120. package/dist/components/switch-case/meta.ts +6 -0
  121. package/dist/components/table/Table.stories.tsx +1095 -0
  122. package/dist/components/table/index.tsx +113 -0
  123. package/dist/components/table/meta.ts +20 -0
  124. package/dist/components/tabs/Tabs.stories.tsx +1379 -0
  125. package/dist/components/tabs/index.tsx +186 -0
  126. package/dist/components/tabs/meta.ts +25 -0
  127. package/dist/components/tag/Tag.stories.tsx +625 -0
  128. package/dist/components/tag/index.tsx +320 -0
  129. package/dist/components/tag/meta.ts +52 -0
  130. package/dist/components/textarea/TextArea.stories.tsx +723 -0
  131. package/dist/components/textarea/index.tsx +480 -0
  132. package/dist/components/textarea/meta.ts +23 -0
  133. package/dist/components/toast/Toast.stories.tsx +1427 -0
  134. package/dist/components/toast/index.tsx +26 -0
  135. package/dist/components/toast/meta.ts +19 -0
  136. package/dist/components/toggle/Toggle.stories.tsx +1093 -0
  137. package/dist/components/toggle/index.tsx +44 -0
  138. package/dist/components/toggle/meta.ts +19 -0
  139. package/dist/components/tooltip/Tooltip.stories.tsx +1548 -0
  140. package/dist/components/tooltip/index.tsx +304 -0
  141. package/dist/components/tooltip/meta.ts +21 -0
  142. package/dist/components/typography/Typography.stories.tsx +197 -0
  143. package/dist/components/typography/index.tsx +184 -0
  144. package/dist/components/typography/meta.ts +38 -0
  145. package/dist/fonts/LabGrotesque-Regular.ttf +0 -0
  146. package/dist/fonts/LabGrotesqueTRIAL-Bold.otf +0 -0
  147. package/dist/fonts/LabGrotesqueTRIAL-Light.otf +0 -0
  148. package/dist/fonts/LabGrotesqueTRIAL-Medium.otf +0 -0
  149. package/dist/fonts/LabGrotesqueTRIAL-Regular.otf +0 -0
  150. package/dist/fonts/PPSupplySans-Regular (1).otf +0 -0
  151. package/dist/fonts/PPSupplySans-Regular.otf +0 -0
  152. package/dist/fonts/PPSupplySans-Ultralight.otf +0 -0
  153. package/dist/hooks/index.ts +3 -0
  154. package/dist/hooks/use-previous/UsePrevious.stories.tsx +997 -0
  155. package/dist/hooks/use-previous/index.ts +15 -0
  156. package/dist/hooks/use-previous/meta.ts +6 -0
  157. package/dist/hooks/use-standalone-pagination/UseStandalonePagination.stories.tsx +983 -0
  158. package/dist/hooks/use-standalone-pagination/index.ts +146 -0
  159. package/dist/hooks/use-standalone-pagination/meta.ts +6 -0
  160. package/dist/icons/Icons.stories.tsx +29 -0
  161. package/dist/icons/alert-icon/AlertIcon.stories.tsx +991 -0
  162. package/dist/icons/alert-icon/index.tsx +48 -0
  163. package/dist/icons/alert-icon/meta.ts +8 -0
  164. package/dist/icons/all-icons.tsx +738 -0
  165. package/dist/icons/angle-down-icon/AngleDownIcon.stories.tsx +1031 -0
  166. package/dist/icons/angle-down-icon/index.tsx +25 -0
  167. package/dist/icons/angle-down-icon/meta.ts +8 -0
  168. package/dist/icons/arrow-box-left-icon/ArrowBoxLeftIcon.stories.tsx +1080 -0
  169. package/dist/icons/arrow-box-left-icon/index.tsx +24 -0
  170. package/dist/icons/arrow-box-left-icon/meta.ts +8 -0
  171. package/dist/icons/arrow-right-icon/ArrowRightIcon.stories.tsx +1151 -0
  172. package/dist/icons/arrow-right-icon/index.tsx +26 -0
  173. package/dist/icons/arrow-right-icon/meta.ts +8 -0
  174. package/dist/icons/arrow-right-up-icon/ArrowRightUpIcon.stories.tsx +1273 -0
  175. package/dist/icons/arrow-right-up-icon/index.tsx +24 -0
  176. package/dist/icons/arrow-right-up-icon/meta.ts +8 -0
  177. package/dist/icons/art-board-icon/ArtBoardIcon.stories.tsx +670 -0
  178. package/dist/icons/art-board-icon/index.tsx +24 -0
  179. package/dist/icons/art-board-icon/meta.ts +7 -0
  180. package/dist/icons/audio-bar-icon/AudioBarIcon.stories.tsx +1244 -0
  181. package/dist/icons/audio-bar-icon/index.tsx +19 -0
  182. package/dist/icons/audio-bar-icon/meta.ts +8 -0
  183. package/dist/icons/bubble-check-icon/BubbleCheckIcon.stories.tsx +1239 -0
  184. package/dist/icons/bubble-check-icon/index.tsx +24 -0
  185. package/dist/icons/bubble-check-icon/meta.ts +8 -0
  186. package/dist/icons/bubble-crossed-icon/BubbleCrossedIcon.stories.tsx +1228 -0
  187. package/dist/icons/bubble-crossed-icon/index.tsx +24 -0
  188. package/dist/icons/bubble-crossed-icon/meta.ts +8 -0
  189. package/dist/icons/bubble-sparkle-icon/BubbleSparkleIcon.stories.tsx +912 -0
  190. package/dist/icons/bubble-sparkle-icon/index.tsx +26 -0
  191. package/dist/icons/bubble-sparkle-icon/meta.ts +8 -0
  192. package/dist/icons/chevron-double-left-icon/ChevronDoubleLeftIcon.stories.tsx +1021 -0
  193. package/dist/icons/chevron-double-left-icon/index.tsx +34 -0
  194. package/dist/icons/chevron-double-left-icon/meta.ts +8 -0
  195. package/dist/icons/chevron-double-right-icon/ChevronDoubleRightIcon.stories.tsx +1021 -0
  196. package/dist/icons/chevron-double-right-icon/index.tsx +34 -0
  197. package/dist/icons/chevron-double-right-icon/meta.ts +8 -0
  198. package/dist/icons/chevron-down-icon/ChevronDownIcon.stories.tsx +1001 -0
  199. package/dist/icons/chevron-down-icon/index.tsx +27 -0
  200. package/dist/icons/chevron-down-icon/meta.ts +8 -0
  201. package/dist/icons/chevron-left-icon/ChevronLeftIcon.stories.tsx +1029 -0
  202. package/dist/icons/chevron-left-icon/index.tsx +27 -0
  203. package/dist/icons/chevron-left-icon/meta.ts +8 -0
  204. package/dist/icons/chevron-right-icon/ChevronRightIcon.stories.tsx +1021 -0
  205. package/dist/icons/chevron-right-icon/index.tsx +27 -0
  206. package/dist/icons/chevron-right-icon/meta.ts +8 -0
  207. package/dist/icons/chevron-up-icon/ChevronUpIcon.stories.tsx +1036 -0
  208. package/dist/icons/chevron-up-icon/index.tsx +27 -0
  209. package/dist/icons/chevron-up-icon/meta.ts +8 -0
  210. package/dist/icons/command-icon/CommandIcon.stories.tsx +1098 -0
  211. package/dist/icons/command-icon/index.tsx +24 -0
  212. package/dist/icons/command-icon/meta.ts +8 -0
  213. package/dist/icons/cross-circle-icon/CrossCircleIcon.stories.tsx +1061 -0
  214. package/dist/icons/cross-circle-icon/index.tsx +23 -0
  215. package/dist/icons/cross-circle-icon/meta.ts +8 -0
  216. package/dist/icons/cross-icon/CrossIcon.stories.tsx +1027 -0
  217. package/dist/icons/cross-icon/index.tsx +24 -0
  218. package/dist/icons/cross-icon/meta.ts +8 -0
  219. package/dist/icons/edit-big-icon/EditBigIcon.stories.tsx +1092 -0
  220. package/dist/icons/edit-big-icon/index.tsx +22 -0
  221. package/dist/icons/edit-big-icon/meta.ts +8 -0
  222. package/dist/icons/eye-close-icon/EyeCloseIcon.stories.tsx +1090 -0
  223. package/dist/icons/eye-close-icon/index.tsx +26 -0
  224. package/dist/icons/eye-close-icon/meta.ts +8 -0
  225. package/dist/icons/eye-open-icon/EyeOpenIcon.stories.tsx +1098 -0
  226. package/dist/icons/eye-open-icon/index.tsx +24 -0
  227. package/dist/icons/eye-open-icon/meta.ts +8 -0
  228. package/dist/icons/feature-shine-icon/FeatureShineIcon.stories.tsx +1071 -0
  229. package/dist/icons/feature-shine-icon/index.tsx +29 -0
  230. package/dist/icons/feature-shine-icon/meta.ts +8 -0
  231. package/dist/icons/file-chart-icon/FileChartIcon.stories.tsx +1115 -0
  232. package/dist/icons/file-chart-icon/index.tsx +24 -0
  233. package/dist/icons/file-chart-icon/meta.ts +8 -0
  234. package/dist/icons/file-text-icon/FileTextIcon.stories.tsx +668 -0
  235. package/dist/icons/file-text-icon/index.tsx +24 -0
  236. package/dist/icons/file-text-icon/meta.ts +8 -0
  237. package/dist/icons/grip-vertical-icon/GripVerticalIcon.stories.tsx +1239 -0
  238. package/dist/icons/grip-vertical-icon/index.tsx +28 -0
  239. package/dist/icons/grip-vertical-icon/meta.ts +8 -0
  240. package/dist/icons/image-icon/ImageIcon.stories.tsx +1181 -0
  241. package/dist/icons/image-icon/index.tsx +24 -0
  242. package/dist/icons/image-icon/meta.ts +8 -0
  243. package/dist/icons/import-folder-icon/ImportFolderIcon.stories.tsx +1248 -0
  244. package/dist/icons/import-folder-icon/index.tsx +22 -0
  245. package/dist/icons/import-folder-icon/meta.ts +8 -0
  246. package/dist/icons/index.ts +46 -0
  247. package/dist/icons/light-bulb-simple-icon/LightBulbSimpleIcon.stories.tsx +1272 -0
  248. package/dist/icons/light-bulb-simple-icon/index.tsx +24 -0
  249. package/dist/icons/light-bulb-simple-icon/meta.ts +8 -0
  250. package/dist/icons/magic-book-icon/MagicBookIcon.stories.tsx +1245 -0
  251. package/dist/icons/magic-book-icon/index.tsx +32 -0
  252. package/dist/icons/magic-book-icon/meta.ts +8 -0
  253. package/dist/icons/maintenance-icon/MaintenanceIcon.stories.tsx +1251 -0
  254. package/dist/icons/maintenance-icon/index.tsx +23 -0
  255. package/dist/icons/maintenance-icon/meta.ts +8 -0
  256. package/dist/icons/message-icon/MessageIcon.stories.tsx +595 -0
  257. package/dist/icons/message-icon/index.tsx +30 -0
  258. package/dist/icons/message-icon/meta.ts +8 -0
  259. package/dist/icons/move-horizontal-icon/MoveHorizontalIcon.stories.tsx +1245 -0
  260. package/dist/icons/move-horizontal-icon/index.tsx +23 -0
  261. package/dist/icons/move-horizontal-icon/meta.ts +8 -0
  262. package/dist/icons/move-vertical-icon/MoveVerticalIcon.stories.tsx +1196 -0
  263. package/dist/icons/move-vertical-icon/index.tsx +23 -0
  264. package/dist/icons/move-vertical-icon/meta.ts +8 -0
  265. package/dist/icons/page-search-icon/PageSearchIcon.stories.tsx +1167 -0
  266. package/dist/icons/page-search-icon/index.tsx +21 -0
  267. package/dist/icons/page-search-icon/meta.ts +8 -0
  268. package/dist/icons/pencil-icon/PencilIcon.stories.tsx +1131 -0
  269. package/dist/icons/pencil-icon/index.tsx +21 -0
  270. package/dist/icons/pencil-icon/meta.ts +8 -0
  271. package/dist/icons/plus-icon/PlusIcon.stories.tsx +1151 -0
  272. package/dist/icons/plus-icon/index.tsx +24 -0
  273. package/dist/icons/plus-icon/meta.ts +8 -0
  274. package/dist/icons/search-icon/SearchIcon.stories.tsx +1181 -0
  275. package/dist/icons/search-icon/index.tsx +24 -0
  276. package/dist/icons/search-icon/meta.ts +8 -0
  277. package/dist/icons/site-logo-icon/SiteLogoIcon.stories.tsx +1167 -0
  278. package/dist/icons/site-logo-icon/index.tsx +79 -0
  279. package/dist/icons/site-logo-icon/meta.ts +8 -0
  280. package/dist/icons/spinner-gradient-icon/SpinnerGradientIcon.stories.tsx +637 -0
  281. package/dist/icons/spinner-gradient-icon/index.tsx +53 -0
  282. package/dist/icons/spinner-gradient-icon/meta.ts +8 -0
  283. package/dist/icons/spinner-solid-icon/SpinnerSolidIcon.stories.tsx +644 -0
  284. package/dist/icons/spinner-solid-icon/index.tsx +59 -0
  285. package/dist/icons/spinner-solid-icon/meta.ts +8 -0
  286. package/dist/icons/spinner-solid-neutral-icon/SpinnerSolidINeutralcon.stories.tsx +736 -0
  287. package/dist/icons/spinner-solid-neutral-icon/index.tsx +53 -0
  288. package/dist/icons/spinner-solid-neutral-icon/meta.ts +8 -0
  289. package/dist/icons/tick-circle-icon/TickCircleIcon.stories.tsx +1204 -0
  290. package/dist/icons/tick-circle-icon/index.tsx +23 -0
  291. package/dist/icons/tick-circle-icon/meta.ts +8 -0
  292. package/dist/icons/tick-icon/TickIcon.stories.tsx +1340 -0
  293. package/dist/icons/tick-icon/index.tsx +24 -0
  294. package/dist/icons/tick-icon/meta.ts +8 -0
  295. package/dist/icons/trash-icon/TrashIcon.stories.tsx +996 -0
  296. package/dist/icons/trash-icon/index.tsx +24 -0
  297. package/dist/icons/trash-icon/meta.ts +8 -0
  298. package/dist/icons/upload-icon/UploadIcon.stories.tsx +947 -0
  299. package/dist/icons/upload-icon/index.tsx +24 -0
  300. package/dist/icons/upload-icon/meta.ts +8 -0
  301. package/dist/icons/vertical-menu-icon/VerticalMenuIcon.stories.tsx +1045 -0
  302. package/dist/icons/vertical-menu-icon/index.tsx +27 -0
  303. package/dist/icons/vertical-menu-icon/meta.ts +8 -0
  304. package/dist/index.d.ts +6 -0
  305. package/dist/index.js +206 -0
  306. package/dist/lib/utils.ts +6 -0
  307. package/dist/styles/aural-theme.css +1008 -0
  308. package/package.json +142 -0
@@ -0,0 +1,455 @@
1
+ import React, { createContext, useContext, useMemo } from "react"
2
+ import { SelectField, SelectItem, SelectSeparator } from "@components/select"
3
+ import {
4
+ useStandalonePagination,
5
+ type UseStandalonePaginationProps,
6
+ type UseStandalonePaginationReturn,
7
+ } from "@hooks/use-standalone-pagination"
8
+ import { ChevronDoubleLeftIcon } from "@icons/chevron-double-left-icon"
9
+ import { ChevronDoubleRightIcon } from "@icons/chevron-double-right-icon"
10
+ import { ChevronLeftIcon } from "@icons/chevron-left-icon"
11
+ import { ChevronRightIcon } from "@icons/chevron-right-icon"
12
+ import { cn } from "@lib/utils"
13
+ import { cva } from "class-variance-authority"
14
+
15
+ /**
16
+ * Pagination context interface - now just wraps the hook return
17
+ */
18
+ export type PaginationContextProps = UseStandalonePaginationReturn
19
+
20
+ export interface PaginationProviderProps extends UseStandalonePaginationProps {
21
+ children: React.ReactNode
22
+ }
23
+
24
+ const PaginationContext = createContext<PaginationContextProps | null>(null)
25
+
26
+ /**
27
+ * Provider component for Pagination context
28
+ */
29
+ export const PaginationProvider: React.FC<PaginationProviderProps> = ({
30
+ children,
31
+ ...hookProps
32
+ }) => {
33
+ const paginationState = useStandalonePagination(hookProps)
34
+
35
+ const value = useMemo(() => paginationState, [paginationState])
36
+
37
+ return (
38
+ <PaginationContext.Provider value={value}>
39
+ {children}
40
+ </PaginationContext.Provider>
41
+ )
42
+ }
43
+
44
+ /**
45
+ * Hook to use pagination context
46
+ */
47
+ export const usePagination = (): PaginationContextProps => {
48
+ const context = useContext(PaginationContext)
49
+
50
+ if (context === null) {
51
+ throw new Error("usePagination must be used within a PaginationProvider")
52
+ }
53
+
54
+ return context
55
+ }
56
+
57
+ /**
58
+ * Pagination Primitives
59
+ */
60
+ // Base pagination container
61
+ export interface PaginationRootProps
62
+ extends React.HTMLAttributes<HTMLDivElement> {
63
+ className?: string
64
+ }
65
+
66
+ export const PaginationRoot = React.forwardRef<
67
+ HTMLDivElement,
68
+ PaginationRootProps
69
+ >(({ className, ...props }, ref) => (
70
+ <div
71
+ ref={ref}
72
+ className={cn(
73
+ "flex flex-wrap items-center justify-between gap-y-4",
74
+ className
75
+ )}
76
+ {...props}
77
+ />
78
+ ))
79
+ PaginationRoot.displayName = "PaginationRoot"
80
+
81
+ // Pagination navigation container
82
+ export interface PaginationContentProps
83
+ extends React.ComponentPropsWithoutRef<"nav"> {
84
+ className?: string
85
+ size?: "sm" | "md" | "lg"
86
+ }
87
+
88
+ export const PaginationContent = React.forwardRef<
89
+ HTMLElement,
90
+ PaginationContentProps
91
+ >(({ className, ...props }, ref) => (
92
+ <nav
93
+ ref={ref}
94
+ className={cn("flex items-center gap-2", className)}
95
+ aria-label="Pagination navigation"
96
+ {...props}
97
+ />
98
+ ))
99
+ PaginationContent.displayName = "PaginationContent"
100
+
101
+ interface PaginationSizeSelectorClasses {
102
+ label?: string
103
+ select?: string
104
+ trigger?: {
105
+ root?: string
106
+ icon?: string
107
+ }
108
+ content?: {
109
+ root?: string
110
+ border?: string
111
+ scrollButton?: {
112
+ root?: string
113
+ icon?: string
114
+ }
115
+ viewport?: string
116
+ }
117
+ }
118
+
119
+ // Page size selector component
120
+ export interface PaginationSizeSelectorProps
121
+ extends React.HTMLAttributes<HTMLDivElement> {
122
+ className?: string
123
+ size?: "sm" | "md" | "lg"
124
+ pageSizeOptions?: number[]
125
+ pageSize: number
126
+ setPageSize: (size: number) => void
127
+ label?: string
128
+ classes?: PaginationSizeSelectorClasses
129
+ }
130
+
131
+ const pageFontVariants = cva("", {
132
+ variants: {
133
+ size: {
134
+ sm: "[font-size:var(--text-fm-sm)] leading-fm-sm",
135
+ md: "[font-size:var(--text-fm-md)] leading-fm-md",
136
+ lg: "[font-size:var(--text-fm-lg)] leading-fm-lg",
137
+ },
138
+ },
139
+ defaultVariants: {
140
+ size: "md",
141
+ },
142
+ })
143
+
144
+ export const PaginationSizeSelector: React.FC<PaginationSizeSelectorProps> = ({
145
+ className,
146
+ size = "md",
147
+ pageSizeOptions = [10, 20, 50, 100],
148
+ pageSize,
149
+ setPageSize,
150
+ label = "PAGE SIZE",
151
+ classes = {},
152
+ ...props
153
+ }) => {
154
+ const selectId = React.useId()
155
+
156
+ return (
157
+ <SelectField
158
+ id={selectId}
159
+ value={pageSize.toString()}
160
+ onValueChange={(val) => setPageSize(Number(val))}
161
+ aria-label="Select page size"
162
+ decoration="outline"
163
+ label={label}
164
+ classes={{
165
+ root: cn(
166
+ "flex items-center justify-center gap-4",
167
+ className,
168
+ classes.select
169
+ ),
170
+ trigger: {
171
+ root: cn("h-10 p-2 min-w-18", pageFontVariants({ size })),
172
+ icon: pageIconVariants({ size }),
173
+ ...classes.trigger,
174
+ },
175
+ label: cn(
176
+ "text-fm-tertiary",
177
+ pageFontVariants({ size }),
178
+ classes.label
179
+ ),
180
+ content: {
181
+ scrollButton: {
182
+ icon: pageIconVariants({ size }),
183
+ },
184
+ ...classes.content,
185
+ },
186
+ }}
187
+ {...props}
188
+ >
189
+ {pageSizeOptions.map((option, index) => (
190
+ <div key={option}>
191
+ <SelectItem
192
+ value={option.toString()}
193
+ classes={{
194
+ root: cn("h-10", pageFontVariants({ size })),
195
+ icon: pageIconVariants({ size }),
196
+ }}
197
+ >
198
+ {option}
199
+ </SelectItem>
200
+ {index < pageSizeOptions.length - 1 && <SelectSeparator />}
201
+ </div>
202
+ ))}
203
+ </SelectField>
204
+ )
205
+ }
206
+ PaginationSizeSelector.displayName = "PaginationSizeSelector"
207
+
208
+ export const pageIconVariants = cva("", {
209
+ variants: {
210
+ size: {
211
+ sm: "size-5",
212
+ md: "size-6",
213
+ lg: "size-7",
214
+ },
215
+ },
216
+ defaultVariants: {
217
+ size: "md",
218
+ },
219
+ })
220
+
221
+ // Item variants for buttons and items
222
+ export const pageButtonVariants = cva(
223
+ "flex items-center justify-center transition-colors duration-200 border rounded-fm-s disabled:cursor-not-allowed font-fm-text cursor-pointer focus-visible:ring-fm-primary focus-visible:ring-offset-fm-contrast outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
224
+ {
225
+ variants: {
226
+ size: {
227
+ sm: "size-8 [font-size:var(--text-fm-sm)] leading-fm-sm",
228
+ md: "size-10 [font-size:var(--text-fm-md)] leading-fm-md",
229
+ lg: "size-12 [font-size:var(--text-fm-lg)] leading-fm-lg",
230
+ },
231
+ variant: {
232
+ number:
233
+ "border-fm-divider-tertiary text-fm-primary hover:border-fm-divider-contrast disabled:hover:border-fm-divider-tertiary disabled:text-fm-inactive",
234
+ active:
235
+ "bg-fm-surface-contrast text-fm-contrast border-fm-divider-contrast disabled:bg-fm-surface-primary disabled:text-fm-inactive ",
236
+ navigation:
237
+ "border-fm-divider-tertiary text-fm-primary hover:border-fm-divider-contrast disabled:hover:border-fm-divider-tertiary disabled:text-fm-inactive",
238
+ ellipsis: "text-fm-tertiary cursor-default border-transparent",
239
+ },
240
+ },
241
+ defaultVariants: {
242
+ size: "md",
243
+ variant: "number",
244
+ },
245
+ }
246
+ )
247
+
248
+ // Page button component
249
+ export interface PaginationButtonProps
250
+ extends React.ButtonHTMLAttributes<HTMLButtonElement> {
251
+ className?: string
252
+ size?: "sm" | "md" | "lg"
253
+ variant?: "number" | "active" | "navigation"
254
+ }
255
+
256
+ export const PaginationButton = React.forwardRef<
257
+ HTMLButtonElement,
258
+ PaginationButtonProps
259
+ >(({ className, size = "md", variant = "number", ...props }, ref) => (
260
+ <button
261
+ ref={ref}
262
+ className={cn(pageButtonVariants({ size, variant }), className)}
263
+ {...props}
264
+ />
265
+ ))
266
+ PaginationButton.displayName = "PaginationButton"
267
+
268
+ // Ellipsis component
269
+ export interface PaginationEllipsisProps
270
+ extends React.HTMLAttributes<HTMLSpanElement> {
271
+ className?: string
272
+ size?: "sm" | "md" | "lg"
273
+ }
274
+
275
+ export const PaginationEllipsis = React.forwardRef<
276
+ HTMLSpanElement,
277
+ PaginationEllipsisProps
278
+ >(({ className, size = "md", ...props }, ref) => (
279
+ <span
280
+ ref={ref}
281
+ className={cn(pageButtonVariants({ variant: "ellipsis", size }), className)}
282
+ aria-hidden="true"
283
+ {...props}
284
+ >
285
+
286
+ </span>
287
+ ))
288
+ PaginationEllipsis.displayName = "PaginationEllipsis"
289
+
290
+ /**
291
+ * Pagination Primitives Composition
292
+ */
293
+ export interface PaginationProps {
294
+ /**
295
+ * Additional CSS class name
296
+ */
297
+ className?: string
298
+
299
+ /**
300
+ * Size of the pagination component
301
+ */
302
+ size?: "sm" | "md" | "lg"
303
+
304
+ /**
305
+ * Show first/last page navigation buttons
306
+ */
307
+ showFirstLast?: boolean
308
+
309
+ /**
310
+ * Show page size selector
311
+ */
312
+ showPageSize?: boolean
313
+
314
+ /**
315
+ * Available page sizes
316
+ */
317
+ pageSizeOptions?: number[]
318
+
319
+ /**
320
+ * Custom classes for styling
321
+ */
322
+ classes?: {
323
+ root?: string
324
+ content?: string
325
+ button?: string
326
+ ellipsis?: string
327
+ sizeSelector?: PaginationSizeSelectorClasses
328
+ icon?: string
329
+ }
330
+ }
331
+
332
+ /**
333
+ * Pagination component for navigating through paginated data
334
+ */
335
+ export const Pagination: React.FC<PaginationProps> = ({
336
+ className,
337
+ size = "md",
338
+ showFirstLast = true,
339
+ showPageSize = false,
340
+ pageSizeOptions = [10, 20, 50, 100],
341
+ classes = {},
342
+ }) => {
343
+ const {
344
+ currentPage,
345
+ pageSize,
346
+ setPage,
347
+ nextPage,
348
+ prevPage,
349
+ firstPage,
350
+ lastPage,
351
+ setPageSize,
352
+ isFirstPage,
353
+ isLastPage,
354
+ visiblePages,
355
+ } = usePagination()
356
+
357
+ return (
358
+ <PaginationRoot className={cn(className, classes.root)}>
359
+ {showPageSize && (
360
+ <PaginationSizeSelector
361
+ size={size}
362
+ pageSizeOptions={pageSizeOptions}
363
+ pageSize={pageSize}
364
+ setPageSize={setPageSize}
365
+ classes={classes.sizeSelector}
366
+ />
367
+ )}
368
+
369
+ <PaginationContent className={cn(classes.content)}>
370
+ {showFirstLast && (
371
+ <PaginationButton
372
+ onClick={firstPage}
373
+ disabled={isFirstPage}
374
+ variant="navigation"
375
+ size={size}
376
+ className={cn(classes.button)}
377
+ aria-label="Go to first page"
378
+ >
379
+ <ChevronDoubleLeftIcon className={pageIconVariants({ size })} />
380
+ </PaginationButton>
381
+ )}
382
+
383
+ <PaginationButton
384
+ onClick={prevPage}
385
+ disabled={isFirstPage}
386
+ variant="navigation"
387
+ size={size}
388
+ aria-label="Go to previous page"
389
+ className={cn(classes.button)}
390
+ >
391
+ <ChevronLeftIcon
392
+ className={cn(pageIconVariants({ size }), classes.icon)}
393
+ />
394
+ </PaginationButton>
395
+
396
+ {visiblePages.map((page, index) => {
397
+ if (page < 0) {
398
+ // It's an ellipsis
399
+ return (
400
+ <PaginationEllipsis
401
+ key={`ellipsis-${index}`}
402
+ size={size}
403
+ className={cn(classes.ellipsis)}
404
+ />
405
+ )
406
+ }
407
+
408
+ return (
409
+ <PaginationButton
410
+ key={page}
411
+ onClick={() => setPage(page)}
412
+ variant={currentPage === page ? "active" : "number"}
413
+ size={size}
414
+ aria-label={`Page ${page}`}
415
+ aria-current={currentPage === page ? "page" : undefined}
416
+ className={cn(classes.button)}
417
+ >
418
+ {page}
419
+ </PaginationButton>
420
+ )
421
+ })}
422
+
423
+ <PaginationButton
424
+ onClick={nextPage}
425
+ disabled={isLastPage}
426
+ variant="navigation"
427
+ size={size}
428
+ aria-label="Go to next page"
429
+ className={cn(classes.button)}
430
+ >
431
+ <ChevronRightIcon
432
+ className={cn(pageIconVariants({ size }), classes.icon)}
433
+ />
434
+ </PaginationButton>
435
+
436
+ {showFirstLast && (
437
+ <PaginationButton
438
+ onClick={lastPage}
439
+ disabled={isLastPage}
440
+ variant="navigation"
441
+ size={size}
442
+ aria-label="Go to last page"
443
+ className={cn(classes.button)}
444
+ >
445
+ <ChevronDoubleRightIcon
446
+ className={cn(pageIconVariants({ size }), classes.icon)}
447
+ />
448
+ </PaginationButton>
449
+ )}
450
+ </PaginationContent>
451
+ </PaginationRoot>
452
+ )
453
+ }
454
+
455
+ Pagination.displayName = "Pagination"
@@ -0,0 +1,29 @@
1
+ export const meta = {
2
+ dependencies: {},
3
+ devDependencies: {},
4
+ internalDependencies: [
5
+ "use-standalone-pagination",
6
+ "chevron-double-left-icon",
7
+ "chevron-double-right-icon",
8
+ "chevron-left-icon",
9
+ "chevron-right-icon",
10
+ "select",
11
+ ],
12
+ tokens: [
13
+ "--color-fm-contrast",
14
+ "--color-fm-divider-contrast",
15
+ "--color-fm-divider-tertiary",
16
+ "--color-fm-inactive",
17
+ "--color-fm-primary",
18
+ "--color-fm-surface-contrast",
19
+ "--color-fm-surface-primary",
20
+ "--color-fm-tertiary",
21
+ "--leading-fm-lg",
22
+ "--leading-fm-md",
23
+ "--leading-fm-sm",
24
+ "--radius-fm-s",
25
+ "--text-fm-lg",
26
+ "--text-fm-md",
27
+ "--text-fm-sm",
28
+ ],
29
+ }