@coinbase/cds-mcp-server 8.17.2 → 8.17.4

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 (284) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/mcp-docs/mobile/components/Accordion.txt +188 -0
  3. package/mcp-docs/mobile/components/AccordionItem.txt +29 -0
  4. package/mcp-docs/mobile/components/Alert.txt +155 -0
  5. package/mcp-docs/mobile/components/AreaChart.txt +265 -0
  6. package/mcp-docs/mobile/components/Avatar.txt +195 -0
  7. package/mcp-docs/mobile/components/AvatarButton.txt +225 -0
  8. package/mcp-docs/mobile/components/Banner.txt +221 -0
  9. package/mcp-docs/mobile/components/BarChart.txt +815 -0
  10. package/mcp-docs/mobile/components/Box.txt +173 -0
  11. package/mcp-docs/mobile/components/BrowserBar.txt +146 -0
  12. package/mcp-docs/mobile/components/Button.txt +198 -0
  13. package/mcp-docs/mobile/components/ButtonGroup.txt +79 -0
  14. package/mcp-docs/mobile/components/Carousel.txt +1083 -0
  15. package/mcp-docs/mobile/components/CartesianChart.txt +825 -0
  16. package/mcp-docs/mobile/components/CellMedia.txt +70 -0
  17. package/mcp-docs/mobile/components/Checkbox.txt +245 -0
  18. package/mcp-docs/mobile/components/CheckboxCell.txt +201 -0
  19. package/mcp-docs/mobile/components/CheckboxGroup.txt +284 -0
  20. package/mcp-docs/mobile/components/Chip.txt +194 -0
  21. package/mcp-docs/mobile/components/Coachmark.txt +157 -0
  22. package/mcp-docs/mobile/components/Collapsible.txt +104 -0
  23. package/mcp-docs/mobile/components/ContainedAssetCard.txt +134 -0
  24. package/mcp-docs/mobile/components/ContentCard.txt +365 -0
  25. package/mcp-docs/mobile/components/ContentCardBody.txt +135 -0
  26. package/mcp-docs/mobile/components/ContentCardFooter.txt +127 -0
  27. package/mcp-docs/mobile/components/ContentCardHeader.txt +145 -0
  28. package/mcp-docs/mobile/components/ContentCell.txt +226 -0
  29. package/mcp-docs/mobile/components/ControlGroup.txt +443 -0
  30. package/mcp-docs/mobile/components/DatePicker.txt +496 -0
  31. package/mcp-docs/mobile/components/Divider.txt +138 -0
  32. package/mcp-docs/mobile/components/DotCount.txt +145 -0
  33. package/mcp-docs/mobile/components/DotStatusColor.txt +58 -0
  34. package/mcp-docs/mobile/components/DotSymbol.txt +134 -0
  35. package/mcp-docs/mobile/components/Fallback.txt +157 -0
  36. package/mcp-docs/mobile/components/FloatingAssetCard.txt +155 -0
  37. package/mcp-docs/mobile/components/HStack.txt +234 -0
  38. package/mcp-docs/mobile/components/HeroSquare.txt +47 -0
  39. package/mcp-docs/mobile/components/Icon.txt +51 -0
  40. package/mcp-docs/mobile/components/IconButton.txt +268 -0
  41. package/mcp-docs/mobile/components/InputChip.txt +187 -0
  42. package/mcp-docs/mobile/components/Interactable.txt +186 -0
  43. package/mcp-docs/mobile/components/LineChart.txt +1324 -0
  44. package/mcp-docs/mobile/components/Link.txt +291 -0
  45. package/mcp-docs/mobile/components/ListCell.txt +412 -0
  46. package/mcp-docs/mobile/components/LogoMark.txt +84 -0
  47. package/mcp-docs/mobile/components/LogoWordMark.txt +93 -0
  48. package/mcp-docs/mobile/components/Lottie.txt +138 -0
  49. package/mcp-docs/mobile/components/LottieStatusAnimation.txt +46 -0
  50. package/mcp-docs/mobile/components/Modal.txt +83 -0
  51. package/mcp-docs/mobile/components/ModalBody.txt +33 -0
  52. package/mcp-docs/mobile/components/ModalFooter.txt +24 -0
  53. package/mcp-docs/mobile/components/ModalHeader.txt +27 -0
  54. package/mcp-docs/mobile/components/MultiContentModule.txt +379 -0
  55. package/mcp-docs/mobile/components/NavigationTitle.txt +131 -0
  56. package/mcp-docs/mobile/components/NavigationTitleSelect.txt +141 -0
  57. package/mcp-docs/mobile/components/NudgeCard.txt +89 -0
  58. package/mcp-docs/mobile/components/Numpad.txt +340 -0
  59. package/mcp-docs/mobile/components/Overlay.txt +151 -0
  60. package/mcp-docs/mobile/components/PageFooter.txt +160 -0
  61. package/mcp-docs/mobile/components/PageHeader.txt +185 -0
  62. package/mcp-docs/mobile/components/PeriodSelector.txt +407 -0
  63. package/mcp-docs/mobile/components/Pictogram.txt +47 -0
  64. package/mcp-docs/mobile/components/Point.txt +204 -0
  65. package/mcp-docs/mobile/components/PortalProvider.txt +78 -0
  66. package/mcp-docs/mobile/components/Pressable.txt +210 -0
  67. package/mcp-docs/mobile/components/ProgressBar.txt +129 -0
  68. package/mcp-docs/mobile/components/ProgressBarWithFixedLabels.txt +160 -0
  69. package/mcp-docs/mobile/components/ProgressBarWithFloatLabel.txt +137 -0
  70. package/mcp-docs/mobile/components/ProgressCircle.txt +236 -0
  71. package/mcp-docs/mobile/components/Radio.txt +241 -0
  72. package/mcp-docs/mobile/components/RadioCell.txt +201 -0
  73. package/mcp-docs/mobile/components/RadioGroup.txt +281 -0
  74. package/mcp-docs/mobile/components/ReferenceLine.txt +152 -0
  75. package/mcp-docs/mobile/components/RemoteImage.txt +105 -0
  76. package/mcp-docs/mobile/components/RemoteImageGroup.txt +60 -0
  77. package/mcp-docs/mobile/components/RollingNumber.txt +788 -0
  78. package/mcp-docs/mobile/components/Scrubber.txt +203 -0
  79. package/mcp-docs/mobile/components/SearchInput.txt +191 -0
  80. package/mcp-docs/mobile/components/SectionHeader.txt +204 -0
  81. package/mcp-docs/mobile/components/SegmentedTabs.txt +315 -0
  82. package/mcp-docs/mobile/components/Select.txt +211 -0
  83. package/mcp-docs/mobile/components/SelectChip.txt +323 -0
  84. package/mcp-docs/mobile/components/SelectOption.txt +84 -0
  85. package/mcp-docs/mobile/components/SlideButton.txt +330 -0
  86. package/mcp-docs/mobile/components/Spacer.txt +83 -0
  87. package/mcp-docs/mobile/components/Sparkline.txt +122 -0
  88. package/mcp-docs/mobile/components/SparklineGradient.txt +106 -0
  89. package/mcp-docs/mobile/components/SparklineInteractive.txt +156 -0
  90. package/mcp-docs/mobile/components/SparklineInteractiveHeader.txt +72 -0
  91. package/mcp-docs/mobile/components/Spinner.txt +48 -0
  92. package/mcp-docs/mobile/components/SpotIcon.txt +47 -0
  93. package/mcp-docs/mobile/components/SpotRectangle.txt +47 -0
  94. package/mcp-docs/mobile/components/SpotSquare.txt +47 -0
  95. package/mcp-docs/mobile/components/Stepper.txt +527 -0
  96. package/mcp-docs/mobile/components/SubBrandLogoMark.txt +125 -0
  97. package/mcp-docs/mobile/components/SubBrandLogoWordMark.txt +125 -0
  98. package/mcp-docs/mobile/components/Switch.txt +97 -0
  99. package/mcp-docs/mobile/components/TabIndicator.txt +48 -0
  100. package/mcp-docs/mobile/components/TabLabel.txt +153 -0
  101. package/mcp-docs/mobile/components/TabNavigation.txt +146 -0
  102. package/mcp-docs/mobile/components/TabbedChips.txt +142 -0
  103. package/mcp-docs/mobile/components/Tabs.txt +190 -0
  104. package/mcp-docs/mobile/components/Tag.txt +300 -0
  105. package/mcp-docs/mobile/components/Text.txt +211 -0
  106. package/mcp-docs/mobile/components/TextInput.txt +717 -0
  107. package/mcp-docs/mobile/components/ThemeProvider.txt +132 -0
  108. package/mcp-docs/mobile/components/Toast.txt +196 -0
  109. package/mcp-docs/mobile/components/Tooltip.txt +59 -0
  110. package/mcp-docs/mobile/components/TopNavBar.txt +161 -0
  111. package/mcp-docs/mobile/components/Tour.txt +158 -0
  112. package/mcp-docs/mobile/components/Tray.txt +252 -0
  113. package/mcp-docs/mobile/components/UpsellCard.txt +321 -0
  114. package/mcp-docs/mobile/components/VStack.txt +222 -0
  115. package/mcp-docs/mobile/components/XAxis.txt +621 -0
  116. package/mcp-docs/mobile/components/YAxis.txt +567 -0
  117. package/mcp-docs/mobile/getting-started/ai-overview.txt +108 -0
  118. package/mcp-docs/mobile/getting-started/installation.txt +57 -0
  119. package/mcp-docs/mobile/getting-started/introduction.txt +102 -0
  120. package/mcp-docs/mobile/getting-started/playground.txt +28 -0
  121. package/mcp-docs/mobile/getting-started/styling.txt +84 -0
  122. package/mcp-docs/mobile/getting-started/theming.txt +286 -0
  123. package/mcp-docs/mobile/hooks/useDimensions.txt +72 -0
  124. package/mcp-docs/mobile/hooks/useEventHandler.txt +120 -0
  125. package/mcp-docs/mobile/hooks/useMergeRefs.txt +116 -0
  126. package/mcp-docs/mobile/hooks/useOverlayContentContext.txt +280 -0
  127. package/mcp-docs/mobile/hooks/usePreviousValue.txt +74 -0
  128. package/mcp-docs/mobile/hooks/useRefMap.txt +178 -0
  129. package/mcp-docs/mobile/hooks/useTheme.txt +321 -0
  130. package/mcp-docs/mobile/routes.txt +139 -0
  131. package/mcp-docs/web/components/Accordion.txt +189 -0
  132. package/mcp-docs/web/components/AccordionItem.txt +31 -0
  133. package/mcp-docs/web/components/Alert.txt +164 -0
  134. package/mcp-docs/web/components/AreaChart.txt +510 -0
  135. package/mcp-docs/web/components/Avatar.txt +211 -0
  136. package/mcp-docs/web/components/AvatarButton.txt +240 -0
  137. package/mcp-docs/web/components/Banner.txt +226 -0
  138. package/mcp-docs/web/components/BarChart.txt +1267 -0
  139. package/mcp-docs/web/components/Box.txt +175 -0
  140. package/mcp-docs/web/components/Button.txt +212 -0
  141. package/mcp-docs/web/components/ButtonGroup.txt +79 -0
  142. package/mcp-docs/web/components/Calendar.txt +181 -0
  143. package/mcp-docs/web/components/Carousel.txt +1575 -0
  144. package/mcp-docs/web/components/CartesianChart.txt +1044 -0
  145. package/mcp-docs/web/components/CellMedia.txt +56 -0
  146. package/mcp-docs/web/components/Checkbox.txt +188 -0
  147. package/mcp-docs/web/components/CheckboxCell.txt +202 -0
  148. package/mcp-docs/web/components/CheckboxGroup.txt +219 -0
  149. package/mcp-docs/web/components/Chip.txt +196 -0
  150. package/mcp-docs/web/components/Coachmark.txt +188 -0
  151. package/mcp-docs/web/components/Collapsible.txt +119 -0
  152. package/mcp-docs/web/components/ContainedAssetCard.txt +232 -0
  153. package/mcp-docs/web/components/ContentCard.txt +367 -0
  154. package/mcp-docs/web/components/ContentCardBody.txt +137 -0
  155. package/mcp-docs/web/components/ContentCardFooter.txt +129 -0
  156. package/mcp-docs/web/components/ContentCardHeader.txt +147 -0
  157. package/mcp-docs/web/components/ContentCell.txt +219 -0
  158. package/mcp-docs/web/components/ControlGroup.txt +436 -0
  159. package/mcp-docs/web/components/DatePicker.txt +505 -0
  160. package/mcp-docs/web/components/Divider.txt +143 -0
  161. package/mcp-docs/web/components/DotCount.txt +149 -0
  162. package/mcp-docs/web/components/DotStatusColor.txt +58 -0
  163. package/mcp-docs/web/components/DotSymbol.txt +137 -0
  164. package/mcp-docs/web/components/Dropdown.txt +119 -0
  165. package/mcp-docs/web/components/Fallback.txt +163 -0
  166. package/mcp-docs/web/components/FloatingAssetCard.txt +250 -0
  167. package/mcp-docs/web/components/FullscreenAlert.txt +69 -0
  168. package/mcp-docs/web/components/FullscreenModal.txt +145 -0
  169. package/mcp-docs/web/components/FullscreenModalLayout.txt +187 -0
  170. package/mcp-docs/web/components/Grid.txt +236 -0
  171. package/mcp-docs/web/components/GridColumn.txt +209 -0
  172. package/mcp-docs/web/components/HStack.txt +236 -0
  173. package/mcp-docs/web/components/HeroSquare.txt +48 -0
  174. package/mcp-docs/web/components/Icon.txt +145 -0
  175. package/mcp-docs/web/components/IconButton.txt +390 -0
  176. package/mcp-docs/web/components/InputChip.txt +187 -0
  177. package/mcp-docs/web/components/Interactable.txt +193 -0
  178. package/mcp-docs/web/components/LineChart.txt +1576 -0
  179. package/mcp-docs/web/components/Link.txt +243 -0
  180. package/mcp-docs/web/components/ListCell.txt +418 -0
  181. package/mcp-docs/web/components/LogoMark.txt +84 -0
  182. package/mcp-docs/web/components/LogoWordMark.txt +93 -0
  183. package/mcp-docs/web/components/Lottie.txt +157 -0
  184. package/mcp-docs/web/components/LottieStatusAnimation.txt +57 -0
  185. package/mcp-docs/web/components/MediaQueryProvider.txt +108 -0
  186. package/mcp-docs/web/components/Modal.txt +196 -0
  187. package/mcp-docs/web/components/ModalBody.txt +117 -0
  188. package/mcp-docs/web/components/ModalFooter.txt +119 -0
  189. package/mcp-docs/web/components/ModalHeader.txt +123 -0
  190. package/mcp-docs/web/components/MultiContentModule.txt +381 -0
  191. package/mcp-docs/web/components/NavigationBar.txt +102 -0
  192. package/mcp-docs/web/components/NavigationTitle.txt +25 -0
  193. package/mcp-docs/web/components/NavigationTitleSelect.txt +45 -0
  194. package/mcp-docs/web/components/NudgeCard.txt +181 -0
  195. package/mcp-docs/web/components/Overlay.txt +171 -0
  196. package/mcp-docs/web/components/PageFooter.txt +184 -0
  197. package/mcp-docs/web/components/PageHeader.txt +243 -0
  198. package/mcp-docs/web/components/Pagination.txt +499 -0
  199. package/mcp-docs/web/components/PeriodSelector.txt +703 -0
  200. package/mcp-docs/web/components/Pictogram.txt +48 -0
  201. package/mcp-docs/web/components/Point.txt +460 -0
  202. package/mcp-docs/web/components/PortalProvider.txt +76 -0
  203. package/mcp-docs/web/components/Pressable.txt +193 -0
  204. package/mcp-docs/web/components/ProgressBar.txt +163 -0
  205. package/mcp-docs/web/components/ProgressBarWithFixedLabels.txt +212 -0
  206. package/mcp-docs/web/components/ProgressBarWithFloatLabel.txt +181 -0
  207. package/mcp-docs/web/components/ProgressCircle.txt +443 -0
  208. package/mcp-docs/web/components/Radio.txt +219 -0
  209. package/mcp-docs/web/components/RadioCell.txt +215 -0
  210. package/mcp-docs/web/components/RadioGroup.txt +288 -0
  211. package/mcp-docs/web/components/ReferenceLine.txt +451 -0
  212. package/mcp-docs/web/components/RemoteImage.txt +165 -0
  213. package/mcp-docs/web/components/RemoteImageGroup.txt +86 -0
  214. package/mcp-docs/web/components/RollingNumber.txt +1021 -0
  215. package/mcp-docs/web/components/Scrubber.txt +231 -0
  216. package/mcp-docs/web/components/SearchInput.txt +117 -0
  217. package/mcp-docs/web/components/SectionHeader.txt +217 -0
  218. package/mcp-docs/web/components/SegmentedTabs.txt +324 -0
  219. package/mcp-docs/web/components/Select.txt +224 -0
  220. package/mcp-docs/web/components/SelectChip.txt +314 -0
  221. package/mcp-docs/web/components/SelectOption.txt +165 -0
  222. package/mcp-docs/web/components/Sidebar.txt +349 -0
  223. package/mcp-docs/web/components/SidebarItem.txt +131 -0
  224. package/mcp-docs/web/components/SidebarMoreMenu.txt +30 -0
  225. package/mcp-docs/web/components/Spacer.txt +173 -0
  226. package/mcp-docs/web/components/Sparkline.txt +122 -0
  227. package/mcp-docs/web/components/SparklineGradient.txt +106 -0
  228. package/mcp-docs/web/components/SparklineInteractive.txt +153 -0
  229. package/mcp-docs/web/components/SparklineInteractiveHeader.txt +76 -0
  230. package/mcp-docs/web/components/Spinner.txt +128 -0
  231. package/mcp-docs/web/components/SpotIcon.txt +48 -0
  232. package/mcp-docs/web/components/SpotRectangle.txt +48 -0
  233. package/mcp-docs/web/components/SpotSquare.txt +48 -0
  234. package/mcp-docs/web/components/Stepper.txt +682 -0
  235. package/mcp-docs/web/components/SubBrandLogoMark.txt +125 -0
  236. package/mcp-docs/web/components/SubBrandLogoWordMark.txt +125 -0
  237. package/mcp-docs/web/components/Switch.txt +85 -0
  238. package/mcp-docs/web/components/TabIndicator.txt +48 -0
  239. package/mcp-docs/web/components/TabLabel.txt +158 -0
  240. package/mcp-docs/web/components/TabNavigation.txt +159 -0
  241. package/mcp-docs/web/components/TabbedChips.txt +155 -0
  242. package/mcp-docs/web/components/Table.txt +367 -0
  243. package/mcp-docs/web/components/TableBody.txt +83 -0
  244. package/mcp-docs/web/components/TableCaption.txt +102 -0
  245. package/mcp-docs/web/components/TableCell.txt +165 -0
  246. package/mcp-docs/web/components/TableCellFallback.txt +97 -0
  247. package/mcp-docs/web/components/TableFooter.txt +83 -0
  248. package/mcp-docs/web/components/TableHeader.txt +100 -0
  249. package/mcp-docs/web/components/TableRow.txt +140 -0
  250. package/mcp-docs/web/components/Tabs.txt +212 -0
  251. package/mcp-docs/web/components/Tag.txt +304 -0
  252. package/mcp-docs/web/components/Text.txt +232 -0
  253. package/mcp-docs/web/components/TextInput.txt +652 -0
  254. package/mcp-docs/web/components/ThemeProvider.txt +199 -0
  255. package/mcp-docs/web/components/TileButton.txt +158 -0
  256. package/mcp-docs/web/components/Toast.txt +203 -0
  257. package/mcp-docs/web/components/Tooltip.txt +89 -0
  258. package/mcp-docs/web/components/Tour.txt +179 -0
  259. package/mcp-docs/web/components/Tray.txt +288 -0
  260. package/mcp-docs/web/components/UpsellCard.txt +319 -0
  261. package/mcp-docs/web/components/VStack.txt +224 -0
  262. package/mcp-docs/web/components/XAxis.txt +619 -0
  263. package/mcp-docs/web/components/YAxis.txt +548 -0
  264. package/mcp-docs/web/getting-started/ai-overview.txt +108 -0
  265. package/mcp-docs/web/getting-started/installation.txt +103 -0
  266. package/mcp-docs/web/getting-started/introduction.txt +102 -0
  267. package/mcp-docs/web/getting-started/playground.txt +28 -0
  268. package/mcp-docs/web/getting-started/styling.txt +161 -0
  269. package/mcp-docs/web/getting-started/templates.txt +121 -0
  270. package/mcp-docs/web/getting-started/theming.txt +426 -0
  271. package/mcp-docs/web/hooks/useBreakpoints.txt +61 -0
  272. package/mcp-docs/web/hooks/useDimensions.txt +114 -0
  273. package/mcp-docs/web/hooks/useEventHandler.txt +120 -0
  274. package/mcp-docs/web/hooks/useHasMounted.txt +75 -0
  275. package/mcp-docs/web/hooks/useIsoEffect.txt +58 -0
  276. package/mcp-docs/web/hooks/useMediaQuery.txt +114 -0
  277. package/mcp-docs/web/hooks/useMergeRefs.txt +116 -0
  278. package/mcp-docs/web/hooks/useOverlayContentContext.txt +279 -0
  279. package/mcp-docs/web/hooks/usePreviousValue.txt +74 -0
  280. package/mcp-docs/web/hooks/useRefMap.txt +178 -0
  281. package/mcp-docs/web/hooks/useScrollBlocker.txt +82 -0
  282. package/mcp-docs/web/hooks/useTheme.txt +364 -0
  283. package/mcp-docs/web/routes.txt +163 -0
  284. package/package.json +1 -1
@@ -0,0 +1,315 @@
1
+ # SegmentedTabs
2
+
3
+ Switches between different views of content.
4
+
5
+ ## Import
6
+
7
+ ```tsx
8
+ import { SegmentedTabs } from '@coinbase/cds-mobile/tabs/SegmentedTabs'
9
+ ```
10
+
11
+ ## Examples
12
+
13
+ ### Basic Example
14
+
15
+ Use the `onChange` prop to listen and make changes to the `activeTab` state.
16
+
17
+ ```jsx
18
+ function Example() {
19
+ const tabs = [
20
+ { id: 'buy', label: 'Buy' },
21
+ { id: 'sell', label: 'Sell' },
22
+ { id: 'convert', label: 'Convert' },
23
+ ];
24
+ const [activeTab, updateActiveTab] = useState(tabs[0]);
25
+ const handleChange = useCallback((activeTab) => updateActiveTab(activeTab), []);
26
+ return (
27
+ <SegmentedTabs
28
+ accessibilityLabel="Switch token action views"
29
+ activeTab={activeTab}
30
+ onChange={handleChange}
31
+ tabs={tabs}
32
+ />
33
+ );
34
+ }
35
+ ```
36
+
37
+ ### With Initial Value
38
+
39
+ You can set any tab as the initial active tab.
40
+
41
+ ```jsx
42
+ function Example() {
43
+ const tabs = [
44
+ { id: 'buy', label: 'Buy' },
45
+ { id: 'sell', label: 'Sell' },
46
+ { id: 'convert', label: 'Convert' },
47
+ ];
48
+ const [activeTab, updateActiveTab] = useState(tabs[1]); // Start with 'Sell'
49
+ const handleChange = useCallback((activeTab) => updateActiveTab(activeTab), []);
50
+ return (
51
+ <SegmentedTabs
52
+ accessibilityLabel="Switch token action views"
53
+ activeTab={activeTab}
54
+ onChange={handleChange}
55
+ tabs={tabs}
56
+ />
57
+ );
58
+ }
59
+ ```
60
+
61
+ ### No Initial Value
62
+
63
+ SegmentedTabs can start with no active selection.
64
+
65
+ ```jsx
66
+ function Example() {
67
+ const tabs = [
68
+ { id: 'buy', label: 'Buy' },
69
+ { id: 'sell', label: 'Sell' },
70
+ { id: 'convert', label: 'Convert' },
71
+ ];
72
+ const [activeTab, updateActiveTab] = useState(null); // No initial selection
73
+ const handleChange = useCallback((activeTab) => updateActiveTab(activeTab), []);
74
+ return (
75
+ <SegmentedTabs
76
+ accessibilityLabel="Switch token action views"
77
+ activeTab={activeTab}
78
+ onChange={handleChange}
79
+ tabs={tabs}
80
+ />
81
+ );
82
+ }
83
+ ```
84
+
85
+ ### Disabled State
86
+
87
+ You can disable the entire SegmentedTabs component.
88
+
89
+ ```jsx
90
+ function Example() {
91
+ const tabs = [
92
+ { id: 'buy', label: 'Buy' },
93
+ { id: 'sell', label: 'Sell' },
94
+ { id: 'convert', label: 'Convert' },
95
+ ];
96
+ const [activeTab, updateActiveTab] = useState(tabs[0]);
97
+ const handleChange = useCallback((activeTab) => updateActiveTab(activeTab), []);
98
+ return (
99
+ <SegmentedTabs
100
+ accessibilityLabel="Switch token action views"
101
+ activeTab={activeTab}
102
+ disabled
103
+ onChange={handleChange}
104
+ tabs={tabs}
105
+ />
106
+ );
107
+ }
108
+ ```
109
+
110
+ ### Disabled Individual Tab
111
+
112
+ Individual tabs can be disabled while keeping others interactive.
113
+
114
+ ```jsx
115
+ function Example() {
116
+ const tabs = [
117
+ { id: 'buy', label: 'Buy' },
118
+ { id: 'sell', label: 'Sell', disabled: true },
119
+ { id: 'convert', label: 'Convert' },
120
+ ];
121
+ const [activeTab, updateActiveTab] = useState(tabs[0]);
122
+ const handleChange = useCallback((activeTab) => updateActiveTab(activeTab), []);
123
+ return (
124
+ <SegmentedTabs
125
+ accessibilityLabel="Switch token action views"
126
+ activeTab={activeTab}
127
+ onChange={handleChange}
128
+ tabs={tabs}
129
+ />
130
+ );
131
+ }
132
+ ```
133
+
134
+ ### Custom Tab Component
135
+
136
+ You can customize individual tabs by providing a custom `Component` for specific tabs.
137
+
138
+ ```jsx
139
+ function Example() {
140
+ const CustomSegmentedTabColor = useCallback(
141
+ (props) => <SegmentedTab {...props} activeColor="fgWarning" color="bgPrimary" font="label2" />,
142
+ [],
143
+ );
144
+
145
+ const CustomSegmentedTabFont = useCallback(
146
+ (props) => <SegmentedTab {...props} font="label2" />,
147
+ [],
148
+ );
149
+
150
+ const tabs = [
151
+ { id: 'buy', label: 'Buy', Component: CustomSegmentedTabColor },
152
+ { id: 'sell', label: 'Sell', Component: CustomSegmentedTabFont },
153
+ { id: 'convert', label: 'Convert', Component: CustomSegmentedTabColor },
154
+ ];
155
+ const [activeTab, updateActiveTab] = useState(tabs[0]);
156
+ const handleChange = useCallback((activeTab) => updateActiveTab(activeTab), []);
157
+ return (
158
+ <SegmentedTabs
159
+ accessibilityLabel="Switch token action views"
160
+ activeTab={activeTab}
161
+ onChange={handleChange}
162
+ tabs={tabs}
163
+ />
164
+ );
165
+ }
166
+ ```
167
+
168
+ ### Custom Active Indicator
169
+
170
+ You can customize the active indicator component and overall styling.
171
+
172
+ ```jsx
173
+ function Example() {
174
+ const CustomActiveIndicator = ({ activeTabRect }) => (
175
+ <TabsActiveIndicator activeTabRect={activeTabRect} background="bgOverlay" />
176
+ );
177
+
178
+ const AnotherCustomSegmentedTab = ({ id, label, disabled }) => {
179
+ const { activeTab } = useTabsContext();
180
+ const isActive = activeTab?.id === id;
181
+ const renderedLabel = (
182
+ <Text color={isActive ? 'fgPositive' : 'fgNegative'} font="label2">
183
+ {label}
184
+ </Text>
185
+ );
186
+
187
+ return <SegmentedTab disabled={disabled} id={id} label={renderedLabel} />;
188
+ };
189
+
190
+ const tabs = [
191
+ { id: 'buy', label: 'Buy' },
192
+ { id: 'sell', label: 'Sell' },
193
+ { id: 'convert', label: 'Convert' },
194
+ ];
195
+ const [activeTab, updateActiveTab] = useState(tabs[0]);
196
+ const handleChange = useCallback((activeTab) => updateActiveTab(activeTab), []);
197
+ return (
198
+ <SegmentedTabs
199
+ accessibilityLabel="Switch token action views"
200
+ activeTab={activeTab}
201
+ borderRadius={0}
202
+ onChange={handleChange}
203
+ tabs={tabs}
204
+ TabComponent={AnotherCustomSegmentedTab}
205
+ TabsActiveIndicatorComponent={CustomActiveIndicator}
206
+ />
207
+ );
208
+ }
209
+ ```
210
+
211
+ ## Props
212
+
213
+ | Prop | Type | Required | Default | Description |
214
+ | --- | --- | --- | --- | --- |
215
+ | `activeTab` | `TabValue<T> \| null` | Yes | `-` | React state for the currently active tab. Setting it to null results in no active tab. |
216
+ | `onChange` | `(activeTab: TabValue<T> \| null) => void` | Yes | `-` | Callback that is fired when the active tab changes. Use this callback to update the activeTab state. |
217
+ | `tabs` | `(TabValue<T> & { Component?: TabComponent<T> \| undefined; })[]` | Yes | `-` | The array of tabs data. Each tab may optionally define a custom Component to render. |
218
+ | `TabComponent` | `TabComponent<T>` | No | `-` | The default Component to render each tab. |
219
+ | `TabsActiveIndicatorComponent` | `TabsActiveIndicatorComponent` | No | `-` | The default Component to render the tabs active indicator. |
220
+ | `activeBackground` | `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 | `-` | Background color passed to the TabsActiveIndicatorComponent. |
221
+ | `alignContent` | `flex-start \| flex-end \| center \| stretch \| space-between \| space-around \| space-evenly` | No | `-` | - |
222
+ | `alignItems` | `flex-start \| flex-end \| center \| stretch \| baseline` | No | `-` | - |
223
+ | `alignSelf` | `auto \| FlexAlignType` | No | `-` | - |
224
+ | `animated` | `boolean` | No | `-` | - |
225
+ | `aspectRatio` | `string \| number` | No | `-` | - |
226
+ | `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 | `-` | - |
227
+ | `borderBottomLeftRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
228
+ | `borderBottomRightRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
229
+ | `borderBottomWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
230
+ | `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 | `-` | - |
231
+ | `borderEndWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
232
+ | `borderRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
233
+ | `borderStartWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
234
+ | `borderTopLeftRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
235
+ | `borderTopRightRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - |
236
+ | `borderTopWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
237
+ | `borderWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
238
+ | `bordered` | `boolean` | No | `-` | Add a border around all sides of the box. |
239
+ | `borderedBottom` | `boolean` | No | `-` | Add a border to the bottom side of the box. |
240
+ | `borderedEnd` | `boolean` | No | `-` | Add a border to the trailing side of the box. |
241
+ | `borderedHorizontal` | `boolean` | No | `-` | Add a border to the leading and trailing sides of the box. |
242
+ | `borderedStart` | `boolean` | No | `-` | Add a border to the leading side of the box. |
243
+ | `borderedTop` | `boolean` | No | `-` | Add a border to the top side of the box. |
244
+ | `borderedVertical` | `boolean` | No | `-` | Add a border to the top and bottom sides of the box. |
245
+ | `bottom` | `string \| number` | No | `-` | - |
246
+ | `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 | `-` | - |
247
+ | `columnGap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
248
+ | `dangerouslySetBackground` | `string` | No | `-` | - |
249
+ | `disabled` | `boolean` | No | `-` | Disable interactions on all the tabs. |
250
+ | `display` | `flex \| none` | No | `-` | - |
251
+ | `elevation` | `0 \| 1 \| 2` | No | `-` | Determines box shadow styles. Parent should have overflow set to visible to ensure styles are not clipped. |
252
+ | `flexBasis` | `string \| number` | No | `-` | - |
253
+ | `flexDirection` | `row \| column \| row-reverse \| column-reverse` | No | `-` | - |
254
+ | `flexGrow` | `number` | No | `-` | - |
255
+ | `flexShrink` | `number` | No | `-` | - |
256
+ | `flexWrap` | `wrap \| nowrap \| wrap-reverse` | No | `-` | - |
257
+ | `font` | `inherit \| FontFamily` | No | `-` | - |
258
+ | `fontFamily` | `inherit \| FontFamily` | No | `-` | - |
259
+ | `fontSize` | `inherit \| FontSize` | No | `-` | - |
260
+ | `fontWeight` | `inherit \| FontWeight` | No | `-` | - |
261
+ | `gap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
262
+ | `height` | `string \| number` | No | `-` | - |
263
+ | `justifyContent` | `flex-start \| flex-end \| center \| space-between \| space-around \| space-evenly` | No | `-` | - |
264
+ | `left` | `string \| number` | No | `-` | - |
265
+ | `lineHeight` | `inherit \| LineHeight` | No | `-` | - |
266
+ | `margin` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
267
+ | `marginBottom` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
268
+ | `marginEnd` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
269
+ | `marginStart` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
270
+ | `marginTop` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
271
+ | `marginX` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
272
+ | `marginY` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - |
273
+ | `maxHeight` | `string \| number` | No | `-` | - |
274
+ | `maxWidth` | `string \| number` | No | `-` | - |
275
+ | `minHeight` | `string \| number` | No | `-` | - |
276
+ | `minWidth` | `string \| number` | No | `-` | - |
277
+ | `onPointerCancel` | `((event: PointerEvent) => void)` | No | `-` | - |
278
+ | `onPointerCancelCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
279
+ | `onPointerDown` | `((event: PointerEvent) => void)` | No | `-` | - |
280
+ | `onPointerDownCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
281
+ | `onPointerEnter` | `((event: PointerEvent) => void)` | No | `-` | - |
282
+ | `onPointerEnterCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
283
+ | `onPointerLeave` | `((event: PointerEvent) => void)` | No | `-` | - |
284
+ | `onPointerLeaveCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
285
+ | `onPointerMove` | `((event: PointerEvent) => void)` | No | `-` | - |
286
+ | `onPointerMoveCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
287
+ | `onPointerUp` | `((event: PointerEvent) => void)` | No | `-` | - |
288
+ | `onPointerUpCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
289
+ | `opacity` | `number \| AnimatedNode` | No | `-` | - |
290
+ | `overflow` | `visible \| hidden \| scroll` | No | `-` | - |
291
+ | `padding` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
292
+ | `paddingBottom` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
293
+ | `paddingEnd` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
294
+ | `paddingStart` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
295
+ | `paddingTop` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
296
+ | `paddingX` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
297
+ | `paddingY` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
298
+ | `pin` | `top \| bottom \| left \| right \| all` | No | `-` | Direction in which to absolutely pin the box. |
299
+ | `position` | `absolute \| relative \| static \| fixed \| sticky` | No | `-` | - |
300
+ | `ref` | `null \| (instance: View \| null) => void \| MutableRefObject<View \| null>` | No | `-` | - |
301
+ | `right` | `string \| number` | No | `-` | - |
302
+ | `rowGap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - |
303
+ | `style` | `false \| RegisteredStyle<ViewStyle> \| Value \| AnimatedInterpolation<string \| number> \| WithAnimatedObject<ViewStyle> \| WithAnimatedArray<Falsy \| ViewStyle \| RegisteredStyle<ViewStyle> \| RecursiveArray<Falsy \| ViewStyle \| RegisteredStyle<ViewStyle>> \| readonly (Falsy \| ViewStyle \| RegisteredStyle<ViewStyle>)[]> \| null` | No | `-` | - |
304
+ | `testID` | `string` | No | `-` | Used to locate this element in unit and end-to-end tests. Used to locate this view in end-to-end tests. |
305
+ | `textAlign` | `left \| right \| auto \| center \| justify` | No | `-` | - |
306
+ | `textDecorationLine` | `none \| underline \| line-through \| underline line-through` | No | `-` | - |
307
+ | `textDecorationStyle` | `solid \| dotted \| dashed \| double` | No | `-` | - |
308
+ | `textTransform` | `none \| capitalize \| uppercase \| lowercase` | No | `-` | - |
309
+ | `top` | `string \| number` | No | `-` | - |
310
+ | `transform` | `string \| (({ scaleX: AnimatableNumericValue; } & { scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ scaleY: AnimatableNumericValue; } & { scaleX?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ translateX: AnimatableNumericValue \| ${number}%; } & { scaleX?: undefined; scaleY?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ translateY: AnimatableNumericValue \| ${number}%; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ perspective: AnimatableNumericValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotate: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotateX: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotateY: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotateZ: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ scale: AnimatableNumericValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ skewX: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ skewY: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; matrix?: undefined; }) \| ({ matrix: AnimatableNumericValue[]; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; }))[]` | No | `-` | - |
311
+ | `userSelect` | `none \| auto \| contain \| text \| all` | No | `-` | - |
312
+ | `width` | `string \| number` | No | `-` | - |
313
+ | `zIndex` | `number` | No | `-` | - |
314
+
315
+
@@ -0,0 +1,211 @@
1
+ # Select
2
+
3
+ A control for selecting from a list of options.
4
+
5
+ ## Import
6
+
7
+ ```tsx
8
+ import { Select } from '@coinbase/cds-mobile/controls/Select'
9
+ ```
10
+
11
+ ## Examples
12
+
13
+ ### Default Composition
14
+
15
+ The mobile version of `Select` is quite different from web; where on mobile, `Select` is just the trigger to toggle the visibility of a `Menu` that is contained in a `Tray`.
16
+
17
+ On mobile, all `SelectOption`s must be wrapped in a `Menu`. Think of it as a controlled `Select` on web, where you pass it the `value` and `onChange` handler.
18
+
19
+ ```jsx
20
+ const SelectMobile = () => {
21
+ const [isTrayVisible, { toggleOff: handleClose, toggleOn: handleOpenTray }] = useToggler(false);
22
+ const [value, setValue] = useState();
23
+ const trayRef = useRef(undefined);
24
+
25
+ const options = ['Option 1', 'Option 2', 'Option 3', 'Option 4', 'Option 5'];
26
+
27
+ const handleOptionPress = () => {
28
+ trayRef.current?.handleClose();
29
+ };
30
+
31
+ return (
32
+ <>
33
+ <Select value={value} onPress={handleOpenTray} />
34
+ {isTrayVisible && (
35
+ <Tray title={title} onCloseComplete={handleClose} ref={trayRef}>
36
+ {/* You must wrap options in Menu. Treat it as a Select on web */}
37
+ <Menu value={value} onChange={setValue}>
38
+ {options.map((option: string) => (
39
+ <SelectOption
40
+ key={option}
41
+ title={option}
42
+ description="BTC"
43
+ onPress={handleOptionPress}
44
+ value={option}
45
+ />
46
+ ))}
47
+ </Menu>
48
+ </Tray>
49
+ )}
50
+ </>
51
+ );
52
+ };
53
+ ```
54
+
55
+ ### Value/Label Object Model
56
+
57
+ Sometimes you may want to surface a label instead of the select value. You can pass a `valueLabel` prop with the currently selected value's corresponding label, which will appear to be the value of the Select.
58
+
59
+ ```jsx
60
+ const SelectWithValueLabel = () => {
61
+ const [value, setValue] = useState();
62
+ const options = [
63
+ { value: '1', label: 'Option 1' },
64
+ { value: '2', label: 'Option 2' },
65
+ { value: '3', label: 'Option 3' },
66
+ { value: '4', label: 'Option 4' },
67
+ ];
68
+ const selectedValueLabel = value && options.find((option) => option.value === value).label;
69
+
70
+ return (
71
+ <>
72
+ <Select
73
+ value={value}
74
+ valueLabel={selectedValueLabel}
75
+ placeholder="Choose something..."
76
+ onPress={handleOpenTray}
77
+ />
78
+ {isTrayVisible && (
79
+ <Tray title="Select Option" onCloseComplete={handleClose} ref={trayRef}>
80
+ <Menu value={value} onChange={setValue}>
81
+ {options.map((option) => (
82
+ <SelectOption
83
+ key={option.value}
84
+ title={option.label}
85
+ description="Description"
86
+ onPress={handleOptionPress}
87
+ value={option.value}
88
+ />
89
+ ))}
90
+ </Menu>
91
+ </Tray>
92
+ )}
93
+ </>
94
+ );
95
+ };
96
+ ```
97
+
98
+ ### Input Stack Options
99
+
100
+ The `Select` trigger can be customized similar to `TextInput`. These options are also available for mobile implementations.
101
+
102
+ #### Label and Helper Text
103
+
104
+ You can add a label above the input and helper text below to provide context and guidance to users.
105
+
106
+ ```jsx
107
+ <Select
108
+ label="Make a selection"
109
+ helperText="You can only choose one"
110
+ value={value}
111
+ onChange={setValue}
112
+ startNode={<InputIcon name="calendar" />}
113
+ >
114
+ ...
115
+ </Select>
116
+ ```
117
+
118
+ ### Compact
119
+
120
+ When space is tight, this brings the label inside of the Input. Should be used with a `compact` `SelectOption`.
121
+
122
+ ```jsx
123
+ <Select compact label="Make a selection" value={value} onChange={setValue}>
124
+ ...
125
+ </Select>
126
+ ```
127
+
128
+ ### Variants
129
+
130
+ Variants can be used to surface positive or negative feedback. The available variants are `positive`, `negative`, `primary`, `foreground`, `foregroundMuted`, and `secondary`.
131
+
132
+ ```jsx
133
+ <Select variant="positive" label="Make a selection">
134
+ ...
135
+ </Select>
136
+ ```
137
+
138
+ ### Label Variants
139
+
140
+ Select supports two label variants: `outside` (default) and `inside`. Note that the `compact` prop, when set to true, will override label variant preference.
141
+
142
+ :::warning
143
+
144
+ When using the `inside` label variant, you should always include a `placeholder` prop.
145
+
146
+ :::
147
+
148
+ #### Outside label (default)
149
+
150
+ ```jsx
151
+ <Select label="Choose Option" placeholder="Select from list">
152
+ ...
153
+ </Select>
154
+ ```
155
+
156
+ #### Inside label
157
+
158
+ ```jsx
159
+ <Select label="Choose Option" labelVariant="inside" placeholder="Select from list">
160
+ ...
161
+ </Select>
162
+ ```
163
+
164
+ #### Inside label (with start content)
165
+
166
+ ```jsx
167
+ <Select
168
+ label="Filter Options"
169
+ labelVariant="inside"
170
+ startNode={<InputIcon name="search" />}
171
+ placeholder="Search and select"
172
+ >
173
+ ...
174
+ </Select>
175
+ ```
176
+
177
+ ## Props
178
+
179
+ | Prop | Type | Required | Default | Description |
180
+ | --- | --- | --- | --- | --- |
181
+ | `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 | `bg` | Background color of the overlay (element being interacted with). |
182
+ | `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 | `checked ? controlColor : 'bgLineHeavy'` | - |
183
+ | `borderRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `1000` | - |
184
+ | `borderWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
185
+ | `checked` | `boolean` | No | `-` | Set the control to selected/on. |
186
+ | `children` | `null \| string \| number \| false \| true \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal` | No | `-` | Label for the control option. |
187
+ | `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 | `black` | - |
188
+ | `controlColor` | `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 | `bgPrimary` | Sets the checked/active color of the control. |
189
+ | `disabled` | `boolean` | No | `-` | Disable user interaction. |
190
+ | `indeterminate` | `boolean` | No | `-` | Enable indeterminate state. Useful when you want to indicate that sub-items of a control are partially filled. |
191
+ | `onChange` | `((value: T, checked?: boolean \| undefined) => void) \| undefined` | No | `-` | Toggle control selected state. |
192
+ | `onPointerCancel` | `((event: PointerEvent) => void)` | No | `-` | - |
193
+ | `onPointerCancelCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
194
+ | `onPointerDown` | `((event: PointerEvent) => void)` | No | `-` | - |
195
+ | `onPointerDownCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
196
+ | `onPointerEnter` | `((event: PointerEvent) => void)` | No | `-` | - |
197
+ | `onPointerEnterCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
198
+ | `onPointerLeave` | `((event: PointerEvent) => void)` | No | `-` | - |
199
+ | `onPointerLeaveCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
200
+ | `onPointerMove` | `((event: PointerEvent) => void)` | No | `-` | - |
201
+ | `onPointerMoveCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
202
+ | `onPointerUp` | `((event: PointerEvent) => void)` | No | `-` | - |
203
+ | `onPointerUpCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
204
+ | `onPress` | `((event: GestureResponderEvent) => void) \| null` | No | `-` | Called when a single tap gesture is detected. |
205
+ | `readOnly` | `boolean` | No | `-` | Set the control to ready-only. Similar effect as disabled. |
206
+ | `ref` | `null \| (instance: View \| null) => void \| RefObject<View>` | No | `-` | - |
207
+ | `style` | `ViewStyle` | No | `-` | - |
208
+ | `testID` | `string` | No | `-` | Used to locate this view in end-to-end tests. |
209
+ | `value` | `string` | No | `-` | Value of the option. Useful for multiple choice. |
210
+
211
+