@coinbase/cds-mcp-server 8.17.2 → 8.17.3

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 (269) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/mcp-docs/mobile/components/Accordion.txt +189 -0
  3. package/mcp-docs/mobile/components/AccordionItem.txt +30 -0
  4. package/mcp-docs/mobile/components/Alert.txt +156 -0
  5. package/mcp-docs/mobile/components/AreaChart.txt +266 -0
  6. package/mcp-docs/mobile/components/Avatar.txt +196 -0
  7. package/mcp-docs/mobile/components/AvatarButton.txt +226 -0
  8. package/mcp-docs/mobile/components/Banner.txt +222 -0
  9. package/mcp-docs/mobile/components/BarChart.txt +816 -0
  10. package/mcp-docs/mobile/components/Box.txt +174 -0
  11. package/mcp-docs/mobile/components/BrowserBar.txt +147 -0
  12. package/mcp-docs/mobile/components/Button.txt +199 -0
  13. package/mcp-docs/mobile/components/ButtonGroup.txt +80 -0
  14. package/mcp-docs/mobile/components/Carousel.txt +1084 -0
  15. package/mcp-docs/mobile/components/CartesianChart.txt +826 -0
  16. package/mcp-docs/mobile/components/CellMedia.txt +71 -0
  17. package/mcp-docs/mobile/components/Checkbox.txt +246 -0
  18. package/mcp-docs/mobile/components/CheckboxCell.txt +202 -0
  19. package/mcp-docs/mobile/components/CheckboxGroup.txt +285 -0
  20. package/mcp-docs/mobile/components/Chip.txt +195 -0
  21. package/mcp-docs/mobile/components/Coachmark.txt +158 -0
  22. package/mcp-docs/mobile/components/Collapsible.txt +105 -0
  23. package/mcp-docs/mobile/components/ContainedAssetCard.txt +135 -0
  24. package/mcp-docs/mobile/components/ContentCard.txt +366 -0
  25. package/mcp-docs/mobile/components/ContentCardBody.txt +136 -0
  26. package/mcp-docs/mobile/components/ContentCardFooter.txt +128 -0
  27. package/mcp-docs/mobile/components/ContentCardHeader.txt +146 -0
  28. package/mcp-docs/mobile/components/ContentCell.txt +227 -0
  29. package/mcp-docs/mobile/components/ControlGroup.txt +444 -0
  30. package/mcp-docs/mobile/components/DatePicker.txt +497 -0
  31. package/mcp-docs/mobile/components/Divider.txt +139 -0
  32. package/mcp-docs/mobile/components/DotCount.txt +146 -0
  33. package/mcp-docs/mobile/components/DotStatusColor.txt +59 -0
  34. package/mcp-docs/mobile/components/DotSymbol.txt +135 -0
  35. package/mcp-docs/mobile/components/Fallback.txt +158 -0
  36. package/mcp-docs/mobile/components/FloatingAssetCard.txt +156 -0
  37. package/mcp-docs/mobile/components/HStack.txt +235 -0
  38. package/mcp-docs/mobile/components/HeroSquare.txt +48 -0
  39. package/mcp-docs/mobile/components/Icon.txt +52 -0
  40. package/mcp-docs/mobile/components/IconButton.txt +269 -0
  41. package/mcp-docs/mobile/components/InputChip.txt +188 -0
  42. package/mcp-docs/mobile/components/Interactable.txt +187 -0
  43. package/mcp-docs/mobile/components/LineChart.txt +1325 -0
  44. package/mcp-docs/mobile/components/Link.txt +292 -0
  45. package/mcp-docs/mobile/components/ListCell.txt +391 -0
  46. package/mcp-docs/mobile/components/LogoMark.txt +85 -0
  47. package/mcp-docs/mobile/components/LogoWordMark.txt +94 -0
  48. package/mcp-docs/mobile/components/Lottie.txt +139 -0
  49. package/mcp-docs/mobile/components/LottieStatusAnimation.txt +47 -0
  50. package/mcp-docs/mobile/components/Modal.txt +84 -0
  51. package/mcp-docs/mobile/components/ModalBody.txt +34 -0
  52. package/mcp-docs/mobile/components/ModalFooter.txt +25 -0
  53. package/mcp-docs/mobile/components/ModalHeader.txt +28 -0
  54. package/mcp-docs/mobile/components/MultiContentModule.txt +380 -0
  55. package/mcp-docs/mobile/components/NavigationTitle.txt +132 -0
  56. package/mcp-docs/mobile/components/NavigationTitleSelect.txt +142 -0
  57. package/mcp-docs/mobile/components/NudgeCard.txt +90 -0
  58. package/mcp-docs/mobile/components/Numpad.txt +341 -0
  59. package/mcp-docs/mobile/components/Overlay.txt +152 -0
  60. package/mcp-docs/mobile/components/PageFooter.txt +161 -0
  61. package/mcp-docs/mobile/components/PageHeader.txt +186 -0
  62. package/mcp-docs/mobile/components/PeriodSelector.txt +408 -0
  63. package/mcp-docs/mobile/components/Pictogram.txt +48 -0
  64. package/mcp-docs/mobile/components/Point.txt +205 -0
  65. package/mcp-docs/mobile/components/PortalProvider.txt +79 -0
  66. package/mcp-docs/mobile/components/Pressable.txt +211 -0
  67. package/mcp-docs/mobile/components/ProgressBar.txt +130 -0
  68. package/mcp-docs/mobile/components/ProgressBarWithFixedLabels.txt +161 -0
  69. package/mcp-docs/mobile/components/ProgressBarWithFloatLabel.txt +138 -0
  70. package/mcp-docs/mobile/components/ProgressCircle.txt +237 -0
  71. package/mcp-docs/mobile/components/Radio.txt +242 -0
  72. package/mcp-docs/mobile/components/RadioCell.txt +202 -0
  73. package/mcp-docs/mobile/components/RadioGroup.txt +282 -0
  74. package/mcp-docs/mobile/components/ReferenceLine.txt +153 -0
  75. package/mcp-docs/mobile/components/RemoteImage.txt +106 -0
  76. package/mcp-docs/mobile/components/RemoteImageGroup.txt +61 -0
  77. package/mcp-docs/mobile/components/RollingNumber.txt +789 -0
  78. package/mcp-docs/mobile/components/Scrubber.txt +204 -0
  79. package/mcp-docs/mobile/components/SearchInput.txt +192 -0
  80. package/mcp-docs/mobile/components/SectionHeader.txt +205 -0
  81. package/mcp-docs/mobile/components/SegmentedTabs.txt +316 -0
  82. package/mcp-docs/mobile/components/Select.txt +212 -0
  83. package/mcp-docs/mobile/components/SelectChip.txt +324 -0
  84. package/mcp-docs/mobile/components/SelectOption.txt +85 -0
  85. package/mcp-docs/mobile/components/SlideButton.txt +331 -0
  86. package/mcp-docs/mobile/components/Spacer.txt +84 -0
  87. package/mcp-docs/mobile/components/Sparkline.txt +123 -0
  88. package/mcp-docs/mobile/components/SparklineGradient.txt +107 -0
  89. package/mcp-docs/mobile/components/SparklineInteractive.txt +157 -0
  90. package/mcp-docs/mobile/components/SparklineInteractiveHeader.txt +73 -0
  91. package/mcp-docs/mobile/components/Spinner.txt +49 -0
  92. package/mcp-docs/mobile/components/SpotIcon.txt +48 -0
  93. package/mcp-docs/mobile/components/SpotRectangle.txt +48 -0
  94. package/mcp-docs/mobile/components/SpotSquare.txt +48 -0
  95. package/mcp-docs/mobile/components/Stepper.txt +528 -0
  96. package/mcp-docs/mobile/components/SubBrandLogoMark.txt +126 -0
  97. package/mcp-docs/mobile/components/SubBrandLogoWordMark.txt +126 -0
  98. package/mcp-docs/mobile/components/Switch.txt +98 -0
  99. package/mcp-docs/mobile/components/TabIndicator.txt +49 -0
  100. package/mcp-docs/mobile/components/TabLabel.txt +154 -0
  101. package/mcp-docs/mobile/components/TabNavigation.txt +147 -0
  102. package/mcp-docs/mobile/components/TabbedChips.txt +143 -0
  103. package/mcp-docs/mobile/components/Tabs.txt +191 -0
  104. package/mcp-docs/mobile/components/Tag.txt +301 -0
  105. package/mcp-docs/mobile/components/Text.txt +212 -0
  106. package/mcp-docs/mobile/components/TextInput.txt +718 -0
  107. package/mcp-docs/mobile/components/ThemeProvider.txt +133 -0
  108. package/mcp-docs/mobile/components/Toast.txt +197 -0
  109. package/mcp-docs/mobile/components/Tooltip.txt +60 -0
  110. package/mcp-docs/mobile/components/TopNavBar.txt +162 -0
  111. package/mcp-docs/mobile/components/Tour.txt +159 -0
  112. package/mcp-docs/mobile/components/Tray.txt +253 -0
  113. package/mcp-docs/mobile/components/UpsellCard.txt +322 -0
  114. package/mcp-docs/mobile/components/VStack.txt +223 -0
  115. package/mcp-docs/mobile/components/XAxis.txt +622 -0
  116. package/mcp-docs/mobile/components/YAxis.txt +568 -0
  117. package/mcp-docs/mobile/getting-started/introduction.txt +99 -0
  118. package/mcp-docs/mobile/getting-started/mcp-server.txt +94 -0
  119. package/mcp-docs/mobile/getting-started/playground.txt +25 -0
  120. package/mcp-docs/mobile/hooks/useDimensions.txt +47 -0
  121. package/mcp-docs/mobile/hooks/useOverlayContentContext.txt +215 -0
  122. package/mcp-docs/mobile/hooks/useTheme.txt +110 -0
  123. package/mcp-docs/mobile/routes.txt +132 -0
  124. package/mcp-docs/web/components/Accordion.txt +190 -0
  125. package/mcp-docs/web/components/AccordionItem.txt +32 -0
  126. package/mcp-docs/web/components/Alert.txt +165 -0
  127. package/mcp-docs/web/components/AreaChart.txt +511 -0
  128. package/mcp-docs/web/components/Avatar.txt +212 -0
  129. package/mcp-docs/web/components/AvatarButton.txt +241 -0
  130. package/mcp-docs/web/components/Banner.txt +227 -0
  131. package/mcp-docs/web/components/BarChart.txt +1268 -0
  132. package/mcp-docs/web/components/Box.txt +176 -0
  133. package/mcp-docs/web/components/Button.txt +213 -0
  134. package/mcp-docs/web/components/ButtonGroup.txt +80 -0
  135. package/mcp-docs/web/components/Calendar.txt +182 -0
  136. package/mcp-docs/web/components/Carousel.txt +1576 -0
  137. package/mcp-docs/web/components/CartesianChart.txt +1045 -0
  138. package/mcp-docs/web/components/CellMedia.txt +57 -0
  139. package/mcp-docs/web/components/Checkbox.txt +189 -0
  140. package/mcp-docs/web/components/CheckboxCell.txt +203 -0
  141. package/mcp-docs/web/components/CheckboxGroup.txt +220 -0
  142. package/mcp-docs/web/components/Chip.txt +197 -0
  143. package/mcp-docs/web/components/Coachmark.txt +189 -0
  144. package/mcp-docs/web/components/Collapsible.txt +120 -0
  145. package/mcp-docs/web/components/ContainedAssetCard.txt +233 -0
  146. package/mcp-docs/web/components/ContentCard.txt +368 -0
  147. package/mcp-docs/web/components/ContentCardBody.txt +138 -0
  148. package/mcp-docs/web/components/ContentCardFooter.txt +130 -0
  149. package/mcp-docs/web/components/ContentCardHeader.txt +148 -0
  150. package/mcp-docs/web/components/ContentCell.txt +220 -0
  151. package/mcp-docs/web/components/ControlGroup.txt +437 -0
  152. package/mcp-docs/web/components/DatePicker.txt +506 -0
  153. package/mcp-docs/web/components/Divider.txt +144 -0
  154. package/mcp-docs/web/components/DotCount.txt +150 -0
  155. package/mcp-docs/web/components/DotStatusColor.txt +59 -0
  156. package/mcp-docs/web/components/DotSymbol.txt +138 -0
  157. package/mcp-docs/web/components/Dropdown.txt +120 -0
  158. package/mcp-docs/web/components/Fallback.txt +164 -0
  159. package/mcp-docs/web/components/FloatingAssetCard.txt +251 -0
  160. package/mcp-docs/web/components/FullscreenAlert.txt +70 -0
  161. package/mcp-docs/web/components/FullscreenModal.txt +146 -0
  162. package/mcp-docs/web/components/FullscreenModalLayout.txt +188 -0
  163. package/mcp-docs/web/components/Grid.txt +237 -0
  164. package/mcp-docs/web/components/GridColumn.txt +210 -0
  165. package/mcp-docs/web/components/HStack.txt +237 -0
  166. package/mcp-docs/web/components/HeroSquare.txt +49 -0
  167. package/mcp-docs/web/components/Icon.txt +146 -0
  168. package/mcp-docs/web/components/IconButton.txt +391 -0
  169. package/mcp-docs/web/components/InputChip.txt +188 -0
  170. package/mcp-docs/web/components/Interactable.txt +194 -0
  171. package/mcp-docs/web/components/LineChart.txt +1577 -0
  172. package/mcp-docs/web/components/Link.txt +244 -0
  173. package/mcp-docs/web/components/ListCell.txt +397 -0
  174. package/mcp-docs/web/components/LogoMark.txt +85 -0
  175. package/mcp-docs/web/components/LogoWordMark.txt +94 -0
  176. package/mcp-docs/web/components/Lottie.txt +158 -0
  177. package/mcp-docs/web/components/LottieStatusAnimation.txt +58 -0
  178. package/mcp-docs/web/components/MediaQueryProvider.txt +109 -0
  179. package/mcp-docs/web/components/Modal.txt +193 -0
  180. package/mcp-docs/web/components/ModalBody.txt +118 -0
  181. package/mcp-docs/web/components/ModalFooter.txt +120 -0
  182. package/mcp-docs/web/components/ModalHeader.txt +124 -0
  183. package/mcp-docs/web/components/MultiContentModule.txt +382 -0
  184. package/mcp-docs/web/components/NavigationBar.txt +103 -0
  185. package/mcp-docs/web/components/NavigationTitle.txt +26 -0
  186. package/mcp-docs/web/components/NavigationTitleSelect.txt +46 -0
  187. package/mcp-docs/web/components/NudgeCard.txt +182 -0
  188. package/mcp-docs/web/components/Overlay.txt +172 -0
  189. package/mcp-docs/web/components/PageFooter.txt +185 -0
  190. package/mcp-docs/web/components/PageHeader.txt +244 -0
  191. package/mcp-docs/web/components/Pagination.txt +500 -0
  192. package/mcp-docs/web/components/PeriodSelector.txt +704 -0
  193. package/mcp-docs/web/components/Pictogram.txt +49 -0
  194. package/mcp-docs/web/components/Point.txt +461 -0
  195. package/mcp-docs/web/components/PortalProvider.txt +77 -0
  196. package/mcp-docs/web/components/Pressable.txt +194 -0
  197. package/mcp-docs/web/components/ProgressBar.txt +164 -0
  198. package/mcp-docs/web/components/ProgressBarWithFixedLabels.txt +213 -0
  199. package/mcp-docs/web/components/ProgressBarWithFloatLabel.txt +182 -0
  200. package/mcp-docs/web/components/ProgressCircle.txt +444 -0
  201. package/mcp-docs/web/components/Radio.txt +220 -0
  202. package/mcp-docs/web/components/RadioCell.txt +216 -0
  203. package/mcp-docs/web/components/RadioGroup.txt +289 -0
  204. package/mcp-docs/web/components/ReferenceLine.txt +452 -0
  205. package/mcp-docs/web/components/RemoteImage.txt +166 -0
  206. package/mcp-docs/web/components/RemoteImageGroup.txt +87 -0
  207. package/mcp-docs/web/components/RollingNumber.txt +1022 -0
  208. package/mcp-docs/web/components/Scrubber.txt +232 -0
  209. package/mcp-docs/web/components/SearchInput.txt +118 -0
  210. package/mcp-docs/web/components/SectionHeader.txt +218 -0
  211. package/mcp-docs/web/components/SegmentedTabs.txt +325 -0
  212. package/mcp-docs/web/components/Select.txt +225 -0
  213. package/mcp-docs/web/components/SelectChip.txt +315 -0
  214. package/mcp-docs/web/components/SelectOption.txt +166 -0
  215. package/mcp-docs/web/components/Sidebar.txt +350 -0
  216. package/mcp-docs/web/components/SidebarItem.txt +132 -0
  217. package/mcp-docs/web/components/SidebarMoreMenu.txt +31 -0
  218. package/mcp-docs/web/components/Spacer.txt +174 -0
  219. package/mcp-docs/web/components/Sparkline.txt +123 -0
  220. package/mcp-docs/web/components/SparklineGradient.txt +107 -0
  221. package/mcp-docs/web/components/SparklineInteractive.txt +154 -0
  222. package/mcp-docs/web/components/SparklineInteractiveHeader.txt +77 -0
  223. package/mcp-docs/web/components/Spinner.txt +129 -0
  224. package/mcp-docs/web/components/SpotIcon.txt +49 -0
  225. package/mcp-docs/web/components/SpotRectangle.txt +49 -0
  226. package/mcp-docs/web/components/SpotSquare.txt +49 -0
  227. package/mcp-docs/web/components/Stepper.txt +683 -0
  228. package/mcp-docs/web/components/SubBrandLogoMark.txt +126 -0
  229. package/mcp-docs/web/components/SubBrandLogoWordMark.txt +126 -0
  230. package/mcp-docs/web/components/Switch.txt +86 -0
  231. package/mcp-docs/web/components/TabIndicator.txt +49 -0
  232. package/mcp-docs/web/components/TabLabel.txt +159 -0
  233. package/mcp-docs/web/components/TabNavigation.txt +160 -0
  234. package/mcp-docs/web/components/TabbedChips.txt +156 -0
  235. package/mcp-docs/web/components/Table.txt +368 -0
  236. package/mcp-docs/web/components/TableBody.txt +84 -0
  237. package/mcp-docs/web/components/TableCaption.txt +103 -0
  238. package/mcp-docs/web/components/TableCell.txt +166 -0
  239. package/mcp-docs/web/components/TableCellFallback.txt +98 -0
  240. package/mcp-docs/web/components/TableFooter.txt +84 -0
  241. package/mcp-docs/web/components/TableHeader.txt +101 -0
  242. package/mcp-docs/web/components/TableRow.txt +141 -0
  243. package/mcp-docs/web/components/Tabs.txt +213 -0
  244. package/mcp-docs/web/components/Tag.txt +305 -0
  245. package/mcp-docs/web/components/Text.txt +233 -0
  246. package/mcp-docs/web/components/TextInput.txt +653 -0
  247. package/mcp-docs/web/components/ThemeProvider.txt +200 -0
  248. package/mcp-docs/web/components/TileButton.txt +159 -0
  249. package/mcp-docs/web/components/Toast.txt +204 -0
  250. package/mcp-docs/web/components/Tooltip.txt +90 -0
  251. package/mcp-docs/web/components/Tour.txt +180 -0
  252. package/mcp-docs/web/components/Tray.txt +289 -0
  253. package/mcp-docs/web/components/UpsellCard.txt +320 -0
  254. package/mcp-docs/web/components/VStack.txt +225 -0
  255. package/mcp-docs/web/components/XAxis.txt +620 -0
  256. package/mcp-docs/web/components/YAxis.txt +549 -0
  257. package/mcp-docs/web/getting-started/introduction.txt +99 -0
  258. package/mcp-docs/web/getting-started/mcp-server.txt +94 -0
  259. package/mcp-docs/web/getting-started/playground.txt +25 -0
  260. package/mcp-docs/web/hooks/useBreakpoints.txt +33 -0
  261. package/mcp-docs/web/hooks/useDimensions.txt +55 -0
  262. package/mcp-docs/web/hooks/useHasMounted.txt +55 -0
  263. package/mcp-docs/web/hooks/useIsoEffect.txt +42 -0
  264. package/mcp-docs/web/hooks/useMediaQuery.txt +94 -0
  265. package/mcp-docs/web/hooks/useOverlayContentContext.txt +217 -0
  266. package/mcp-docs/web/hooks/useScrollBlocker.txt +63 -0
  267. package/mcp-docs/web/hooks/useTheme.txt +105 -0
  268. package/mcp-docs/web/routes.txt +155 -0
  269. package/package.json +1 -1
@@ -0,0 +1,500 @@
1
+ # Pagination
2
+
3
+ Pagination is used to navigate through a list of items.
4
+
5
+ ## Import
6
+
7
+ ```jsx
8
+ import { Pagination } from '@coinbase/cds-web/pagination/Pagination'
9
+ ```
10
+
11
+ ## Props
12
+
13
+ | Prop | Type | Required | Default | Description |
14
+ | --- | --- | --- | --- | --- |
15
+ | `activePage` | `number` | Yes | `-` | React state for the currently active page. Current active page number (1-based) |
16
+ | `onChange` | `(activePage: number) => void` | Yes | `-` | Callback that is fired when the active page changes. Use this callback to update the activePage state. |
17
+ | `totalPages` | `number` | Yes | `-` | Total number of pages. |
18
+ | `PaginationEllipsisComponent` | `PaginationEllipsisComponent` | No | `({ content = '...', testID }: PaginationEllipsisProps) => ( <Text noWrap aria-hidden="true" color="fgMuted" font="headline" testID={testID}> {content} </Text> )` | Custom component for rendering ellipsis |
19
+ | `PaginationNavigationButtonComponent` | `PaginationNavigationButtonComponent` | No | `forwardRef( ( { direction, onClick, disabled, accessibilityLabel, testID }: PaginationNavigationButtonProps, ref: React.ForwardedRef<HTMLButtonElement>, ) => { return ( <IconButton ref={ref} compact transparent accessibilityLabel={accessibilityLabel} disabled={disabled} name={iconMap[direction]} onClick={onClick} testID={testID} variant="secondary" /> ); }, )` | Custom component for rendering navigation buttons. Must use forwardRef to properly receive and forward the ref to a focusable DOM element for focus management to work correctly. |
20
+ | `PaginationPageButtonComponent` | `PaginationPageButtonComponent` | No | `forwardRef( ( { page, onClick, isCurrentPage, disabled, accessibilityLabel, testID, ...props }: PaginationPageButtonProps, ref: React.ForwardedRef<HTMLButtonElement>, ) => { const handleClick = useCallback(() => onClick(page), [onClick, page]); const isSingleDigit = page < 10; return ( <Button ref={ref} compact accessibilityLabel={accessibilityLabel} aria-current={isCurrentPage ? 'page' : undefined} className={cx(isSingleDigit && circularButtonCss)} disabled={disabled} onClick={handleClick} testID={testID} transparent={!isCurrentPage} variant={isCurrentPage ? 'primary' : 'secondary'} {...props} > {page} </Button> ); }, )` | Custom component for rendering page buttons. Must use forwardRef to properly receive and forward the ref to a focusable DOM element for focus management to work correctly. |
21
+ | `accessibilityLabel` | `string` | No | `Pagination` | - |
22
+ | `accessibilityLabels` | `{ next?: string; previous?: string \| undefined; first?: string \| undefined; last?: string \| undefined; page?: ((page: number) => string) \| undefined; } \| undefined` | No | `-` | Custom accessibility labels for navigation buttons |
23
+ | `alignContent` | `ResponsiveProp<center \| normal \| start \| end \| flex-start \| flex-end \| stretch \| baseline \| first baseline \| last baseline \| space-between \| space-around \| space-evenly>` | No | `-` | - |
24
+ | `alignItems` | `ResponsiveProp<center \| normal \| start \| end \| flex-start \| flex-end \| self-start \| self-end \| stretch \| baseline \| first baseline \| last baseline>` | No | `-` | - |
25
+ | `alignSelf` | `ResponsiveProp<center \| normal \| auto \| start \| end \| flex-start \| flex-end \| self-start \| self-end \| stretch \| baseline \| first baseline \| last baseline>` | No | `-` | - |
26
+ | `as` | `div` | No | `-` | - |
27
+ | `aspectRatio` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| auto` | No | `-` | - |
28
+ | `background` | `currentColor \| fg \| fgMuted \| fgInverse \| fgPrimary \| fgWarning \| fgPositive \| fgNegative \| bg \| bgAlternate \| bgInverse \| bgOverlay \| bgElevation1 \| bgElevation2 \| bgPrimary \| bgPrimaryWash \| bgSecondary \| bgTertiary \| bgSecondaryWash \| bgNegative \| bgNegativeWash \| bgPositive \| bgPositiveWash \| bgWarning \| bgWarningWash \| bgLine \| bgLineHeavy \| bgLineInverse \| bgLinePrimary \| bgLinePrimarySubtle \| accentSubtleRed \| accentBoldRed \| accentSubtleGreen \| accentBoldGreen \| accentSubtleBlue \| accentBoldBlue \| accentSubtlePurple \| accentBoldPurple \| accentSubtleYellow \| accentBoldYellow \| accentSubtleGray \| accentBoldGray \| transparent` | No | `-` | - |
29
+ | `borderBottomLeftRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
30
+ | `borderBottomRightRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
31
+ | `borderBottomWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
32
+ | `borderColor` | `currentColor \| fg \| fgMuted \| fgInverse \| fgPrimary \| fgWarning \| fgPositive \| fgNegative \| bg \| bgAlternate \| bgInverse \| bgOverlay \| bgElevation1 \| bgElevation2 \| bgPrimary \| bgPrimaryWash \| bgSecondary \| bgTertiary \| bgSecondaryWash \| bgNegative \| bgNegativeWash \| bgPositive \| bgPositiveWash \| bgWarning \| bgWarningWash \| bgLine \| bgLineHeavy \| bgLineInverse \| bgLinePrimary \| bgLinePrimarySubtle \| accentSubtleRed \| accentBoldRed \| accentSubtleGreen \| accentBoldGreen \| accentSubtleBlue \| accentBoldBlue \| accentSubtlePurple \| accentBoldPurple \| accentSubtleYellow \| accentBoldYellow \| accentSubtleGray \| accentBoldGray \| transparent` | No | `-` | - |
33
+ | `borderEndWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
34
+ | `borderRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
35
+ | `borderStartWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
36
+ | `borderTopLeftRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
37
+ | `borderTopRightRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
38
+ | `borderTopWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
39
+ | `borderWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
40
+ | `bordered` | `boolean` | No | `-` | Add a border around all sides of the box. |
41
+ | `borderedBottom` | `boolean` | No | `-` | Add a border to the bottom side of the box. |
42
+ | `borderedEnd` | `boolean` | No | `-` | Add a border to the trailing side of the box. |
43
+ | `borderedHorizontal` | `boolean` | No | `-` | Add a border to the leading and trailing sides of the box. |
44
+ | `borderedStart` | `boolean` | No | `-` | Add a border to the leading side of the box. |
45
+ | `borderedTop` | `boolean` | No | `-` | Add a border to the top side of the box. |
46
+ | `borderedVertical` | `boolean` | No | `-` | Add a border to the top and bottom sides of the box. |
47
+ | `bottom` | `ResponsiveProp<Bottom<string \| number>>` | No | `-` | - |
48
+ | `boundaryCount` | `number` | No | `1` | Number of pages to show at the beginning and end of pagination. |
49
+ | `color` | `currentColor \| fg \| fgMuted \| fgInverse \| fgPrimary \| fgWarning \| fgPositive \| fgNegative \| bg \| bgAlternate \| bgInverse \| bgOverlay \| bgElevation1 \| bgElevation2 \| bgPrimary \| bgPrimaryWash \| bgSecondary \| bgTertiary \| bgSecondaryWash \| bgNegative \| bgNegativeWash \| bgPositive \| bgPositiveWash \| bgWarning \| bgWarningWash \| bgLine \| bgLineHeavy \| bgLineInverse \| bgLinePrimary \| bgLinePrimarySubtle \| accentSubtleRed \| accentBoldRed \| accentSubtleGreen \| accentBoldGreen \| accentSubtleBlue \| accentBoldBlue \| accentSubtlePurple \| accentBoldPurple \| accentSubtleYellow \| accentBoldYellow \| accentSubtleGray \| accentBoldGray \| transparent` | No | `-` | - |
50
+ | `columnGap` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
51
+ | `dangerouslySetBackground` | `string` | No | `-` | - |
52
+ | `disabled` | `boolean` | No | `-` | - |
53
+ | `display` | `ResponsiveProp<grid \| revert \| none \| block \| inline \| inline-block \| flex \| inline-flex \| inline-grid \| contents \| flow-root \| list-item>` | No | `-` | - |
54
+ | `elevation` | `0 \| 1 \| 2` | No | `-` | - |
55
+ | `flexBasis` | `ResponsiveProp<FlexBasis<string \| number>>` | No | `-` | - |
56
+ | `flexDirection` | `ResponsiveProp<column \| row \| row-reverse \| column-reverse>` | No | `-` | - |
57
+ | `flexGrow` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset` | No | `-` | - |
58
+ | `flexShrink` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset` | No | `-` | - |
59
+ | `flexWrap` | `ResponsiveProp<nowrap \| wrap \| wrap-reverse>` | No | `-` | - |
60
+ | `font` | `ResponsiveProp<FontFamily \| inherit>` | No | `-` | - |
61
+ | `fontFamily` | `ResponsiveProp<FontFamily \| inherit>` | No | `-` | - |
62
+ | `fontSize` | `ResponsiveProp<FontSize \| inherit>` | No | `-` | - |
63
+ | `fontWeight` | `ResponsiveProp<FontWeight \| inherit>` | No | `-` | - |
64
+ | `gap` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
65
+ | `grid` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| none` | No | `-` | - |
66
+ | `gridArea` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| auto` | No | `-` | - |
67
+ | `gridAutoColumns` | `ResponsiveProp<GridAutoColumns<string \| number>>` | No | `-` | - |
68
+ | `gridAutoFlow` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| row \| column \| dense` | No | `-` | - |
69
+ | `gridAutoRows` | `ResponsiveProp<GridAutoRows<string \| number>>` | No | `-` | - |
70
+ | `gridColumn` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| auto` | No | `-` | - |
71
+ | `gridColumnEnd` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| auto` | No | `-` | - |
72
+ | `gridColumnStart` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| auto` | No | `-` | - |
73
+ | `gridRow` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| auto` | No | `-` | - |
74
+ | `gridRowEnd` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| auto` | No | `-` | - |
75
+ | `gridRowStart` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| auto` | No | `-` | - |
76
+ | `gridTemplate` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| none` | No | `-` | - |
77
+ | `gridTemplateAreas` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| none` | No | `-` | - |
78
+ | `gridTemplateColumns` | `ResponsiveProp<GridTemplateColumns<string \| number>>` | No | `-` | - |
79
+ | `gridTemplateRows` | `ResponsiveProp<GridTemplateRows<string \| number>>` | No | `-` | - |
80
+ | `height` | `ResponsiveProp<Height<string \| number>>` | No | `-` | - |
81
+ | `justifyContent` | `ResponsiveProp<left \| right \| center \| normal \| start \| end \| flex-start \| flex-end \| stretch \| space-between \| space-around \| space-evenly>` | No | `-` | - |
82
+ | `key` | `Key \| null` | No | `-` | - |
83
+ | `left` | `ResponsiveProp<Left<string \| number>>` | No | `-` | - |
84
+ | `lineHeight` | `ResponsiveProp<LineHeight \| inherit>` | No | `-` | - |
85
+ | `margin` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
86
+ | `marginBottom` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
87
+ | `marginEnd` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
88
+ | `marginStart` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
89
+ | `marginTop` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
90
+ | `marginX` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
91
+ | `marginY` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
92
+ | `maxHeight` | `ResponsiveProp<MaxHeight<string \| number>>` | No | `-` | - |
93
+ | `maxWidth` | `ResponsiveProp<MaxWidth<string \| number>>` | No | `-` | - |
94
+ | `minHeight` | `ResponsiveProp<MinHeight<string \| number>>` | No | `-` | - |
95
+ | `minWidth` | `ResponsiveProp<MinWidth<string \| number>>` | No | `-` | - |
96
+ | `opacity` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset` | No | `-` | - |
97
+ | `overflow` | `ResponsiveProp<hidden \| auto \| visible \| clip \| scroll>` | No | `-` | - |
98
+ | `padding` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
99
+ | `paddingBottom` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
100
+ | `paddingEnd` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
101
+ | `paddingStart` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
102
+ | `paddingTop` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
103
+ | `paddingX` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
104
+ | `paddingY` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
105
+ | `pin` | `top \| bottom \| left \| right \| all` | No | `-` | Direction in which to absolutely pin the box. |
106
+ | `position` | `ResponsiveProp<fixed \| static \| relative \| absolute \| sticky>` | No | `-` | - |
107
+ | `ref` | `RefObject<HTMLDivElement> \| ((instance: HTMLDivElement \| null) => void) \| null` | No | `-` | - |
108
+ | `right` | `ResponsiveProp<Right<string \| number>>` | No | `-` | - |
109
+ | `rowGap` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `-` | - |
110
+ | `showFirstLastButtons` | `boolean` | No | `-` | Whether to show first and last page navigation buttons |
111
+ | `siblingCount` | `number` | No | `1` | Number of pages to show on each side of current page. |
112
+ | `style` | `CSSProperties` | No | `-` | - |
113
+ | `testID` | `string` | No | `-` | Used to locate this element in unit and end-to-end tests. Under the hood, testID translates to data-testid on Web. On Mobile, testID stays the same - testID |
114
+ | `testIDMap` | `{ nav?: string; nextButton?: string \| undefined; prevButton?: string \| undefined; firstButton?: string \| undefined; lastButton?: string \| undefined; } \| undefined` | No | `-` | Custom test IDs for specific elements within pagination |
115
+ | `textAlign` | `ResponsiveProp<center \| start \| end \| justify>` | No | `-` | - |
116
+ | `textDecoration` | `ResponsiveProp<none \| underline \| overline \| line-through \| underline overline \| underline double>` | No | `-` | - |
117
+ | `textTransform` | `ResponsiveProp<capitalize \| lowercase \| none \| uppercase>` | No | `-` | - |
118
+ | `top` | `ResponsiveProp<Top<string \| number>>` | No | `-` | - |
119
+ | `transform` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| none` | No | `-` | - |
120
+ | `userSelect` | `ResponsiveProp<text \| none \| auto \| all>` | No | `-` | - |
121
+ | `visibility` | `ResponsiveProp<hidden \| visible>` | No | `-` | - |
122
+ | `width` | `ResponsiveProp<Width<string \| number>>` | No | `-` | - |
123
+ | `zIndex` | `-moz-initial \| inherit \| initial \| revert \| revert-layer \| unset \| auto` | No | `-` | - |
124
+
125
+
126
+ ## Examples
127
+
128
+ ### Basic Pagination
129
+
130
+ A simple example showing basic pagination with 10 total pages.
131
+
132
+ ```jsx live
133
+ function BasicPaginationExample() {
134
+ const [activePage, setActivePage] = useState(1);
135
+ const totalPages = 10;
136
+
137
+ return <Pagination totalPages={totalPages} activePage={activePage} onChange={setActivePage} />;
138
+ }
139
+ ```
140
+
141
+ ### Pagination with First/Last Buttons
142
+
143
+ Shows pagination with the optional First and Last page navigation buttons enabled.
144
+
145
+ ```jsx live
146
+ function FirstLastButtonsPaginationExample() {
147
+ const [activePage, setActivePage] = useState(5);
148
+ const totalPages = 15;
149
+
150
+ return (
151
+ <Pagination
152
+ totalPages={totalPages}
153
+ activePage={activePage}
154
+ onChange={setActivePage}
155
+ showFirstLastButtons
156
+ />
157
+ );
158
+ }
159
+ ```
160
+
161
+ ### Pagination with Custom Counts
162
+
163
+ Demonstrates using `siblingCount` and `boundaryCount` to adjust the number of pages displayed around the current page and at the boundaries, useful for larger page ranges.
164
+
165
+ ```jsx live
166
+ function CustomCountsPaginationExample() {
167
+ const [activePage, setActivePage] = useState(10);
168
+ const totalPages = 20;
169
+
170
+ return (
171
+ <Pagination
172
+ totalPages={totalPages}
173
+ activePage={activePage}
174
+ onChange={setActivePage}
175
+ showFirstLastButtons
176
+ siblingCount={2} // Show 2 pages on each side of the current page
177
+ boundaryCount={1} // Show 1 page at the start and end
178
+ />
179
+ );
180
+ }
181
+ ```
182
+
183
+ ### Controlled Pagination
184
+
185
+ This example explicitly manages the current page state, which might be necessary if the page change triggers other actions like fetching data.
186
+
187
+ ```jsx live
188
+ function ControlledPaginationExample() {
189
+ const [activePage, setActivePage] = useState(3);
190
+ const totalPages = 10;
191
+
192
+ const handlePageChange = (newPage) => {
193
+ console.log(`Navigating to page: ${newPage}`);
194
+ // Here you might fetch data for the new page
195
+ setActivePage(newPage);
196
+ };
197
+
198
+ return (
199
+ <Pagination
200
+ totalPages={totalPages}
201
+ activePage={activePage}
202
+ onChange={handlePageChange}
203
+ showFirstLastButtons
204
+ tooltipLabels={{
205
+ first: 'Jump to first page',
206
+ previous: 'Go back one page',
207
+ next: 'Go forward one page',
208
+ last: 'Jump to last page',
209
+ }}
210
+ />
211
+ );
212
+ }
213
+ ```
214
+
215
+ ### Using the `usePagination` Hook
216
+
217
+ This example shows how to use the headless `usePagination` hook to build a custom pagination interface. The hook provides the logic, and you render the UI.
218
+
219
+ ```jsx live
220
+ function UsePaginationHookExample() {
221
+ const [activePage, setActivePage] = useState(5);
222
+ const totalPages = 12;
223
+
224
+ const { items, goNextPage, goPrevPage, updateActivePage, isFirstPage, isLastPage } =
225
+ usePagination({
226
+ totalPages,
227
+ activePage,
228
+ onChange: setActivePage,
229
+ siblingCount: 1,
230
+ boundaryCount: 1,
231
+ });
232
+
233
+ return (
234
+ <HStack gap={0.5} alignItems="center" justifyContent="center">
235
+ <IconButton
236
+ name="caretLeft"
237
+ onClick={goPrevPage}
238
+ disabled={isFirstPage}
239
+ accessibilityLabel="Previous page"
240
+ compact
241
+ variant="secondary"
242
+ transparent
243
+ />
244
+ {items.map((item, index) => {
245
+ if (item.type === 'ellipsis') {
246
+ // Render ellipsis as simple text
247
+ return (
248
+ <Text
249
+ key={`ellipsis-${index}`}
250
+ aria-hidden="true"
251
+ color="fgMuted"
252
+ paddingX={1}
253
+ noWrap
254
+ testID={`pagination-ellipsis-${index}`}
255
+ >
256
+ ...
257
+ </Text>
258
+ );
259
+ }
260
+ // Render page buttons
261
+ return (
262
+ <Button
263
+ key={item.page}
264
+ onClick={() => updateActivePage(item.page)}
265
+ variant={item.selected ? 'primary' : 'secondary'}
266
+ compact
267
+ transparent={!item.selected}
268
+ aria-current={item.selected ? 'page' : undefined}
269
+ accessibilityLabel={`Page ${item.page}`}
270
+ >
271
+ {item.page}
272
+ </Button>
273
+ );
274
+ })}
275
+ <IconButton
276
+ name="caretRight"
277
+ onClick={goNextPage}
278
+ disabled={isLastPage}
279
+ accessibilityLabel="Next page"
280
+ compact
281
+ variant="secondary"
282
+ transparent
283
+ />
284
+ </HStack>
285
+ );
286
+ }
287
+ ```
288
+
289
+ ### Customized Components
290
+
291
+ This example demonstrates how to customize the appearance of pagination by providing custom components for page buttons, navigation buttons, and ellipsis.
292
+
293
+ ```jsx live
294
+ function CustomizedPaginationExample() {
295
+ const [activePage, setActivePage] = useState(5);
296
+ const totalPages = 20;
297
+
298
+ // Custom page button component
299
+ const CustomPageButton = forwardRef(
300
+ ({ page, isCurrentPage, onClick, accessibilityLabel }, ref) => (
301
+ <Box
302
+ ref={ref}
303
+ as="button"
304
+ aria-current={isCurrentPage ? 'page' : undefined}
305
+ aria-label={accessibilityLabel}
306
+ background={isCurrentPage ? 'bgSecondary' : 'bg'}
307
+ borderRadius={100}
308
+ color={isCurrentPage ? 'fgPrimary' : 'fgMuted'}
309
+ margin={0}
310
+ minWidth={8}
311
+ onClick={() => onClick(page)}
312
+ onKeyDown={(e) => {
313
+ if (e.key === 'Enter' || e.key === ' ') {
314
+ e.preventDefault();
315
+ onClick(page);
316
+ }
317
+ }}
318
+ padding={1}
319
+ role="button"
320
+ tabIndex={0}
321
+ style={{ cursor: 'pointer' }}
322
+ >
323
+ <Text font="body">{page}</Text>
324
+ </Box>
325
+ ),
326
+ );
327
+
328
+ // Custom navigation button component
329
+ const CustomNavButton = forwardRef(
330
+ ({ direction, disabled, onClick, accessibilityLabel }, ref) => {
331
+ // Direction-specific arrows
332
+ const getArrow = () => {
333
+ switch (direction) {
334
+ case 'first':
335
+ return '««';
336
+ case 'previous':
337
+ return '«';
338
+ case 'next':
339
+ return '»';
340
+ case 'last':
341
+ return '»»';
342
+ default:
343
+ return '';
344
+ }
345
+ };
346
+
347
+ return (
348
+ <Box
349
+ ref={ref}
350
+ aria-disabled={disabled}
351
+ aria-label={accessibilityLabel}
352
+ as="button"
353
+ background="bgSecondary"
354
+ borderRadius={100}
355
+ color={disabled ? 'fgMuted' : 'fgPrimary'}
356
+ disabled={disabled}
357
+ display="flex"
358
+ justifyContent="center"
359
+ alignItems="center"
360
+ margin={0}
361
+ minWidth={8}
362
+ onClick={disabled ? undefined : onClick}
363
+ onKeyDown={(e) => {
364
+ if (!disabled && (e.key === 'Enter' || e.key === ' ')) {
365
+ e.preventDefault();
366
+ onClick();
367
+ }
368
+ }}
369
+ opacity={disabled ? 0.7 : 1}
370
+ padding={1}
371
+ role="button"
372
+ tabIndex={disabled ? -1 : 0}
373
+ style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}
374
+ >
375
+ {getArrow()}
376
+ </Box>
377
+ );
378
+ },
379
+ );
380
+
381
+ // Custom ellipsis component
382
+ const CustomEllipsis = ({ content = '•••', testID }) => (
383
+ <Box
384
+ alignItems="center"
385
+ aria-hidden="true"
386
+ color="fgMuted"
387
+ display="flex"
388
+ margin={0}
389
+ padding={1}
390
+ testID={testID}
391
+ >
392
+ <Text font="body" noWrap>
393
+ {content}
394
+ </Text>
395
+ </Box>
396
+ );
397
+
398
+ return (
399
+ <Pagination
400
+ activePage={activePage}
401
+ onChange={setActivePage}
402
+ totalPages={totalPages}
403
+ showFirstLastButtons
404
+ PaginationPageButtonComponent={CustomPageButton}
405
+ PaginationNavigationButtonComponent={CustomNavButton}
406
+ PaginationEllipsisComponent={CustomEllipsis}
407
+ />
408
+ );
409
+ }
410
+ ```
411
+
412
+ ### Pagination with Table
413
+
414
+ This example demonstrates integrating the Pagination component with a Table, a common use case for pagination.
415
+
416
+ ```jsx live
417
+ function TablePaginationExample() {
418
+ const totalResults = accounts.length;
419
+ const PAGE_SIZE = 5;
420
+ const [activePage, setActivePage] = useState(1);
421
+ const [isFixed, setIsFixed] = useState(false);
422
+
423
+ // Calculate pagination indexes
424
+ const startIdx = (activePage - 1) * PAGE_SIZE;
425
+ const endIdx = Math.min(startIdx + PAGE_SIZE, totalResults);
426
+ const paginatedAccounts = accounts.slice(startIdx, endIdx);
427
+ const totalPages = Math.ceil(totalResults / PAGE_SIZE);
428
+
429
+ const toggleFixed = () => setIsFixed(!isFixed);
430
+
431
+ return (
432
+ <VStack gap={4}>
433
+ <HStack justifyContent="flex-end">
434
+ <Switch onChange={toggleFixed} checked={isFixed}>
435
+ Fixed Layout
436
+ </Switch>
437
+ </HStack>
438
+
439
+ <Table bordered variant="ruled" tableLayout={isFixed ? 'fixed' : 'auto'}>
440
+ <TableCaption>Cryptocurrency Accounts</TableCaption>
441
+ <TableHeader>
442
+ <TableRow>
443
+ <TableCell title="Asset" width="30%" />
444
+ <TableCell title="Balance" width="40%" />
445
+ <TableCell title="Primary" alignItems="flex-end" width="30%" />
446
+ </TableRow>
447
+ </TableHeader>
448
+
449
+ <TableBody>
450
+ {paginatedAccounts.map((account) => (
451
+ <TableRow key={account.id}>
452
+ <TableCell
453
+ start={
454
+ <Icon name="currencies" size="m" color={account.currency?.color || 'fgMuted'} />
455
+ }
456
+ title={account.name}
457
+ subtitle={account.currency?.code}
458
+ />
459
+ <TableCell title={account.balance?.amount} subtitle={account.balance?.currency} />
460
+ <TableCell direction="horizontal" justifyContent="flex-end">
461
+ <Icon
462
+ name={account.primary ? 'circleCheckmark' : 'circleCross'}
463
+ size="m"
464
+ color={account.primary ? 'fgPositive' : 'fgNegative'}
465
+ />
466
+ </TableCell>
467
+ </TableRow>
468
+ ))}
469
+ </TableBody>
470
+
471
+ <TableFooter>
472
+ <TableRow fullWidth>
473
+ <TableCell colSpan={3} direction="horizontal">
474
+ <HStack gap={2} alignItems="center">
475
+ <Text color="fgMuted" font="body">
476
+ Page {startIdx + 1}-{endIdx}
477
+ </Text>
478
+ <Pagination
479
+ activePage={activePage}
480
+ onChange={setActivePage}
481
+ totalPages={totalPages}
482
+ showFirstLastButtons
483
+ tooltipLabels={{
484
+ first: 'First page of accounts',
485
+ previous: 'Previous page of accounts',
486
+ next: 'Next page of accounts',
487
+ last: 'Last page of accounts',
488
+ }}
489
+ />
490
+ </HStack>
491
+ </TableCell>
492
+ </TableRow>
493
+ </TableFooter>
494
+ </Table>
495
+ </VStack>
496
+ );
497
+ }
498
+ ```
499
+
500
+