@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,138 @@
1
+ # ProgressBarWithFloatLabel
2
+
3
+ A ProgressBar with a floating label that moves with progress.
4
+
5
+ ## Import
6
+
7
+ ```jsx
8
+ import { ProgressBarWithFloatLabel } from '@coinbase/cds-mobile/visualizations/ProgressBarWithFloatLabel'
9
+ ```
10
+
11
+ ## Props
12
+
13
+ | Prop | Type | Required | Default | Description |
14
+ | --- | --- | --- | --- | --- |
15
+ | `label` | `number \| { value: number; render: (num: number, disabled?: boolean \| undefined) => ReactNode; }` | Yes | `-` | Label that is floated at the end of the filled in bar. If a number is used then it will format it as a percentage. |
16
+ | `progress` | `number` | Yes | `-` | Number between 0-1 representing the progress percentage |
17
+ | `disabled` | `boolean` | No | `false` | Toggle used to show a disabled progress visualization |
18
+ | `labelPlacement` | `above \| below` | No | `above` | Position of label relative to the bar |
19
+ | `style` | `null \| false \| ViewStyle \| RegisteredStyle<ViewStyle> \| RecursiveArray<Falsy \| ViewStyle \| RegisteredStyle<ViewStyle>>` | No | `-` | Custom styles for the progress bar with float label root. |
20
+ | `styles` | `{ root?: StyleProp<ViewStyle>; labelContainer?: StyleProp<ViewStyle>; label?: StyleProp<TextStyle>; }` | No | `-` | Custom styles for the progress bar with float label. |
21
+ | `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 |
22
+
23
+
24
+ ## Examples
25
+
26
+ ### Label Above
27
+
28
+ ```jsx live
29
+ <VStack gap={2}>
30
+ <ProgressBarWithFloatLabel label={0} progress={0} labelPlacement="above">
31
+ <ProgressBar progress={0} />
32
+ </ProgressBarWithFloatLabel>
33
+ <ProgressBarWithFloatLabel label={20} progress={0.2} labelPlacement="above">
34
+ <ProgressBar progress={0.2} />
35
+ </ProgressBarWithFloatLabel>
36
+ </VStack>
37
+ ```
38
+
39
+ ### Label Below
40
+
41
+ ```jsx live
42
+ <VStack gap={2}>
43
+ <ProgressBarWithFloatLabel label={0} progress={0} labelPlacement="below">
44
+ <ProgressBar progress={0} />
45
+ </ProgressBarWithFloatLabel>
46
+ <ProgressBarWithFloatLabel label={20} progress={0.2} labelPlacement="below">
47
+ <ProgressBar progress={0.2} />
48
+ </ProgressBarWithFloatLabel>
49
+ </VStack>
50
+ ```
51
+
52
+ ### Disabled
53
+
54
+ ```jsx live
55
+ <VStack gap={2}>
56
+ <ProgressBarWithFloatLabel label={70} progress={0.7} disabled>
57
+ <ProgressBar progress={0.7} disabled />
58
+ </ProgressBarWithFloatLabel>
59
+ </VStack>
60
+ ```
61
+
62
+ ### Custom Labels
63
+
64
+ ```jsx live
65
+ function Example() {
66
+ const renderLabelNumStr = useCallback((num) => {
67
+ return `$${num.toLocaleString()}`;
68
+ }, []);
69
+
70
+ const renderLabelNum = useCallback((num, disabled) => {
71
+ return (
72
+ <TextTitle3 as="span" disabled={disabled}>
73
+ ${num.toLocaleString()}
74
+ </TextTitle3>
75
+ );
76
+ }, []);
77
+
78
+ return (
79
+ <VStack gap={2}>
80
+ <ProgressBarWithFloatLabel
81
+ progress={0.6}
82
+ label={{ value: 12500, render: renderLabelNumStr }}
83
+ labelPlacement="above"
84
+ >
85
+ <ProgressBar progress={0.6} />
86
+ </ProgressBarWithFloatLabel>
87
+ <ProgressBarWithFloatLabel
88
+ progress={0.6}
89
+ label={{ value: 12500, render: renderLabelNum }}
90
+ labelPlacement="above"
91
+ >
92
+ <ProgressBar progress={0.6} />
93
+ </ProgressBarWithFloatLabel>
94
+ <ProgressBarWithFloatLabel
95
+ progress={0.6}
96
+ label={{ value: 12500, render: renderLabelNumStr }}
97
+ labelPlacement="above"
98
+ disabled
99
+ >
100
+ <ProgressBar disabled progress={0.6} />
101
+ </ProgressBarWithFloatLabel>
102
+ <ProgressBarWithFloatLabel
103
+ progress={0.6}
104
+ label={{ value: 12500, render: renderLabelNum }}
105
+ labelPlacement="above"
106
+ disabled
107
+ >
108
+ <ProgressBar disabled progress={0.6} />
109
+ </ProgressBarWithFloatLabel>
110
+ </VStack>
111
+ );
112
+ }
113
+ ```
114
+
115
+ ### Custom Styles
116
+
117
+ You can customize the appearance of the progress bar and float label using the `styles` prop.
118
+
119
+ ```tsx live
120
+ <ProgressContainerWithButtons>
121
+ {({ calculateProgress }) => (
122
+ <VStack gap={2}>
123
+ <ProgressBarWithFloatLabel
124
+ label={Math.round(calculateProgress(0.4) * 100)}
125
+ labelPlacement="above"
126
+ progress={calculateProgress(0.4)}
127
+ styles={{
128
+ label: { color: 'blue' },
129
+ }}
130
+ >
131
+ <ProgressBar progress={calculateProgress(0.4)} />
132
+ </ProgressBarWithFloatLabel>
133
+ </VStack>
134
+ )}
135
+ </ProgressContainerWithButtons>
136
+ ```
137
+
138
+
@@ -0,0 +1,237 @@
1
+ # ProgressCircle
2
+
3
+ A circular visual indicator of completion progress.
4
+
5
+ ## Import
6
+
7
+ ```jsx
8
+ import { ProgressCircle } from '@coinbase/cds-mobile/visualizations/ProgressCircle'
9
+ ```
10
+
11
+ ## Props
12
+
13
+ | Prop | Type | Required | Default | Description |
14
+ | --- | --- | --- | --- | --- |
15
+ | `progress` | `number` | Yes | `-` | Number between 0-1 representing the progress percentage |
16
+ | `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 | `primary` | Custom progress color. |
17
+ | `contentNode` | `null \| string \| number \| false \| true \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal` | No | `-` | Optional component to override the default content rendered inside the circle. |
18
+ | `disableAnimateOnMount` | `boolean` | No | `false` | Disable animation on component mount |
19
+ | `disabled` | `boolean` | No | `false` | Toggle used to show a disabled progress visualization |
20
+ | `hideContent` | `boolean` | No | `-` | Toggle used to hide the content node rendered inside the circle. |
21
+ | `hideText` | `boolean` | No | `-` | - |
22
+ | `key` | `Key \| null` | No | `-` | - |
23
+ | `onAnimationEnd` | `(() => void)` | No | `-` | Callback fired when the progress animation ends. |
24
+ | `onAnimationStart` | `(() => void)` | No | `-` | Callback fired when the progress animation starts. |
25
+ | `ref` | `((instance: View \| null) => void) \| RefObject<View> \| null` | No | `-` | - |
26
+ | `size` | `number` | No | `-` | Optional size in px for the visualization. This is useful if the visualization is used in an HStack. If this is omitted the visualization will fill the parent width or height. Since its a circular visualization it will fill the smaller of the parent width or height |
27
+ | `style` | `null \| false \| ViewStyle \| RegisteredStyle<ViewStyle> \| RecursiveArray<Falsy \| ViewStyle \| RegisteredStyle<ViewStyle>>` | No | `-` | Custom styles for the progress circle root. |
28
+ | `styles` | `{ root?: StyleProp<ViewStyle>; svgContainer?: StyleProp<ViewStyle>; svg?: StyleProp<ViewStyle>; textContainer?: StyleProp<ViewStyle>; progress?: Partial<CircleProps>; circle?: Partial<CircleProps> \| undefined; } \| undefined` | No | `-` | Custom styles for the progress circle. |
29
+ | `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 |
30
+ | `weight` | `normal \| heavy \| thin \| semiheavy` | No | `normal` | Toggle used to change thickness of progress visualization |
31
+
32
+
33
+ ## Examples
34
+
35
+ ### Default
36
+
37
+ ```jsx
38
+ <HStack gap={2}>
39
+ <ProgressCircle progress={0} size={100} />
40
+ <ProgressCircle progress={0.5} size={100} />
41
+ <ProgressCircle progress={1} size={100} />
42
+ </HStack>
43
+ ```
44
+
45
+ ### Thin
46
+
47
+ ```jsx
48
+ <HStack gap={2}>
49
+ <ProgressCircle progress={0} weight="thin" size={100} />
50
+ <ProgressCircle progress={0.5} weight="thin" size={100} />
51
+ <ProgressCircle progress={1} weight="thin" size={100} />
52
+ </HStack>
53
+ ```
54
+
55
+ ### Semiheavy
56
+
57
+ ```jsx
58
+ <HStack gap={2}>
59
+ <ProgressCircle progress={0} weight="semiheavy" size={100} />
60
+ <ProgressCircle progress={0.5} weight="semiheavy" size={100} />
61
+ <ProgressCircle progress={1} weight="semiheavy" size={100} />
62
+ </HStack>
63
+ ```
64
+
65
+ ### Heavy
66
+
67
+ ```jsx
68
+ <HStack gap={2}>
69
+ <ProgressCircle progress={0} weight="heavy" size={100} />
70
+ <ProgressCircle progress={0.5} weight="heavy" size={100} />
71
+ <ProgressCircle progress={1} weight="heavy" size={100} />
72
+ </HStack>
73
+ ```
74
+
75
+ ### No Text
76
+
77
+ ```jsx
78
+ <HStack gap={2}>
79
+ <ProgressCircle progress={0} hideContent size={25} />
80
+ <ProgressCircle progress={0.5} hideContent size={25} />
81
+ <ProgressCircle progress={1} hideContent size={25} />
82
+ </HStack>
83
+ ```
84
+
85
+ ### Disabled
86
+
87
+ ```jsx
88
+ <HStack gap={2}>
89
+ <ProgressCircle progress={0} disabled size={100} />
90
+ <ProgressCircle progress={0.5} disabled size={100} />
91
+ <ProgressCircle progress={1} disabled size={100} />
92
+ </HStack>
93
+ ```
94
+
95
+ ### Colors
96
+
97
+ ```jsx
98
+ <HStack gap={2}>
99
+ <ProgressCircle progress={0.5} color="fgPositive" size={100} />
100
+ <ProgressCircle progress={0.5} color="bgNegative" size={100} />
101
+ <ProgressCircle progress={0.5} color="bgPrimary" size={100} />
102
+ <ProgressCircle progress={0.5} color="fg" size={100} />
103
+ </HStack>
104
+ ```
105
+
106
+ ### Fill Parent
107
+
108
+ The progress circle can be dynamically sized to fit its parent. If you drag the browser window smaller or larger then the ProgressCircle will resize accordingly.
109
+
110
+ ```jsx
111
+ <HStack gap={2} flexWrap="wrap">
112
+ <div style={{ height: '15vw', width: '15vw', minWidth: '60px', minHeight: '60px' }}>
113
+ <ProgressCircle progress={1} />
114
+ </div>
115
+ <div style={{ height: '10vw', width: '10vw', minWidth: '60px', minHeight: '60px' }}>
116
+ <ProgressCircle progress={1} />
117
+ </div>
118
+ <div style={{ height: '5vw', width: '5vw', minWidth: '60px', minHeight: '60px' }}>
119
+ <ProgressCircle progress={1} />
120
+ </div>
121
+ </HStack>
122
+ ```
123
+
124
+ ### Content Node Customization
125
+
126
+ You can override the default content node to display a custom node. Note that the content node is clipped to the circle.
127
+
128
+ #### With Asset
129
+
130
+ You can provide an image, such as an asset, as the content node.
131
+
132
+ ```jsx
133
+ <ProgressCircle
134
+ progress={1}
135
+ size={56}
136
+ styles={{
137
+ progress: {
138
+ stroke: assets.eth.color,
139
+ },
140
+ }}
141
+ contentNode={
142
+ <Box height="100%" padding={0.25} width="100%">
143
+ <RemoteImage
144
+ alt={assets.eth.name}
145
+ shape="circle"
146
+ source={assets.eth.imageUrl}
147
+ style={{ width: '100%', height: '100%' }}
148
+ />
149
+ </Box>
150
+ }
151
+ weight="thin"
152
+ />
153
+ ```
154
+
155
+ #### Custom Text Color
156
+
157
+ The progress circle's default content can be customized to display a custom text color.
158
+
159
+ ```jsx
160
+ <HStack gap={2}>
161
+ <ProgressCircle
162
+ color="fgPrimary"
163
+ progress={0.2}
164
+ size={100}
165
+ contentNode={<DefaultProgressCircleContent color="fgPrimary" progress={0.2} />}
166
+ />
167
+ <ProgressCircle
168
+ color="fgPositive"
169
+ progress={0.4}
170
+ size={100}
171
+ contentNode={<DefaultProgressCircleContent color="fgPositive" progress={0.4} />}
172
+ />
173
+ </HStack>
174
+ ```
175
+
176
+ ### Custom Styles
177
+
178
+ The progress circle can be customized with styles.
179
+
180
+ ```jsx
181
+ <HStack gap={2}>
182
+ <ProgressCircle
183
+ progress={0.4}
184
+ size={100}
185
+ styles={{
186
+ circle: {
187
+ stroke: 'transparent',
188
+ },
189
+ }}
190
+ contentNode={<TextTitle1 color="fgPrimary">40%</TextTitle1>}
191
+ weight="semiheavy"
192
+ />
193
+ <ProgressCircle
194
+ color="fgPositive"
195
+ progress={0.6}
196
+ size={100}
197
+ styles={{
198
+ progress: {
199
+ strokeLinecap: 'square',
200
+ },
201
+ }}
202
+ contentNode={<Icon color="fgPositive" name="circleCheckmark" size="l" />}
203
+ />
204
+ </HStack>
205
+ ```
206
+
207
+ #### Animation Callbacks
208
+
209
+ You can use the `onAnimationStart` and `onAnimationEnd` callbacks to track the progress of the animation.
210
+
211
+ ```jsx
212
+ function Example() {
213
+ const [animationStatus, setAnimationStatus] = React.useState('Ready');
214
+
215
+ const handleAnimationStart = useCallback(() => {
216
+ setAnimationStatus('Animating...');
217
+ }, []);
218
+
219
+ const handleAnimationEnd = useCallback(() => {
220
+ setAnimationStatus('Animation Ended');
221
+ }, []);
222
+
223
+ return (
224
+ <VStack gap={2}>
225
+ <Text>Animation Status: {animationStatus}</Text>
226
+ <ProgressCircle
227
+ onAnimationEnd={handleAnimationEnd}
228
+ onAnimationStart={handleAnimationStart}
229
+ progress={calculateProgress(0.2)}
230
+ size={100}
231
+ />
232
+ </VStack>
233
+ );
234
+ }
235
+ ```
236
+
237
+
@@ -0,0 +1,242 @@
1
+ # Radio
2
+
3
+ Radio is a control component that allows users to select one option from a set of mutually exclusive options.
4
+
5
+ ## Import
6
+
7
+ ```jsx
8
+ import { Radio } from '@coinbase/cds-mobile/controls/Radio'
9
+ ```
10
+
11
+ ## Props
12
+
13
+ | Prop | Type | Required | Default | Description |
14
+ | --- | --- | --- | --- | --- |
15
+ | `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). |
16
+ | `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'` | - |
17
+ | `borderRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `1000` | - |
18
+ | `borderWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - |
19
+ | `checked` | `boolean` | No | `-` | Set the control to selected/on. |
20
+ | `children` | `null \| string \| number \| false \| true \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal` | No | `-` | Label for the control option. |
21
+ | `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` | - |
22
+ | `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. |
23
+ | `disabled` | `boolean` | No | `-` | Disable user interaction. |
24
+ | `indeterminate` | `boolean` | No | `-` | Enable indeterminate state. Useful when you want to indicate that sub-items of a control are partially filled. |
25
+ | `onChange` | `((value: T, checked?: boolean \| undefined) => void) \| undefined` | No | `-` | Toggle control selected state. |
26
+ | `onPointerCancel` | `((event: PointerEvent) => void)` | No | `-` | - |
27
+ | `onPointerCancelCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
28
+ | `onPointerDown` | `((event: PointerEvent) => void)` | No | `-` | - |
29
+ | `onPointerDownCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
30
+ | `onPointerEnter` | `((event: PointerEvent) => void)` | No | `-` | - |
31
+ | `onPointerEnterCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
32
+ | `onPointerLeave` | `((event: PointerEvent) => void)` | No | `-` | - |
33
+ | `onPointerLeaveCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
34
+ | `onPointerMove` | `((event: PointerEvent) => void)` | No | `-` | - |
35
+ | `onPointerMoveCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
36
+ | `onPointerUp` | `((event: PointerEvent) => void)` | No | `-` | - |
37
+ | `onPointerUpCapture` | `((event: PointerEvent) => void)` | No | `-` | - |
38
+ | `onPress` | `((event: GestureResponderEvent) => void) \| null` | No | `-` | Called when a single tap gesture is detected. |
39
+ | `readOnly` | `boolean` | No | `-` | Set the control to ready-only. Similar effect as disabled. |
40
+ | `ref` | `null \| (instance: View \| null) => void \| RefObject<View>` | No | `-` | - |
41
+ | `style` | `ViewStyle` | No | `-` | - |
42
+ | `testID` | `string` | No | `-` | Used to locate this view in end-to-end tests. |
43
+ | `value` | `string` | No | `-` | Value of the option. Useful for multiple choice. |
44
+
45
+
46
+ ## Examples
47
+
48
+ ### Basic Usage
49
+
50
+ Radio components are typically used individually as part of a radio group. Each radio represents a single option in a mutually exclusive set.
51
+
52
+ ```jsx
53
+ function BasicRadio() {
54
+ const [selectedValue, setSelectedValue] = useState('option1');
55
+
56
+ return (
57
+ <VStack gap={2}>
58
+ <Radio
59
+ name="basic-radio"
60
+ value="option1"
61
+ checked={selectedValue === 'option1'}
62
+ onChange={(value) => setSelectedValue(value)}
63
+ >
64
+ Option 1
65
+ </Radio>
66
+ <Radio
67
+ name="basic-radio"
68
+ value="option2"
69
+ checked={selectedValue === 'option2'}
70
+ onChange={(value) => setSelectedValue(value)}
71
+ >
72
+ Option 2
73
+ </Radio>
74
+ <Radio
75
+ name="basic-radio"
76
+ value="option3"
77
+ checked={selectedValue === 'option3'}
78
+ onChange={(value) => setSelectedValue(value)}
79
+ >
80
+ Option 3
81
+ </Radio>
82
+ </VStack>
83
+ );
84
+ }
85
+ ```
86
+
87
+ ### Radio Groups
88
+
89
+ The recommended way to use Radio components is with a ControlGroup for better accessibility and easier state management.
90
+
91
+ ```jsx
92
+ function RadioGroupExample() {
93
+ const options = [
94
+ { value: 'btc', children: 'Bitcoin' },
95
+ { value: 'eth', children: 'Ethereum' },
96
+ { value: 'ltc', children: 'Litecoin' },
97
+ ];
98
+
99
+ const [selectedCurrency, setSelectedCurrency] = useState('btc');
100
+
101
+ return (
102
+ <ControlGroup
103
+ accessibilityRole="radiogroup"
104
+ ControlComponent={Radio}
105
+ label="Choose a cryptocurrency"
106
+ options={options}
107
+ value={selectedCurrency}
108
+ onChange={setSelectedCurrency}
109
+ name="currency-radio-group"
110
+ />
111
+ );
112
+ }
113
+ ```
114
+
115
+ ### Custom Colors
116
+
117
+ You can customize the radio's color using the `controlColor` prop.
118
+
119
+ ```jsx
120
+ function CustomColorRadio() {
121
+ const [selectedColor, setSelectedColor] = useState('default');
122
+
123
+ return (
124
+ <VStack gap={2}>
125
+ <Radio
126
+ name="color-radio"
127
+ value="default"
128
+ checked={selectedColor === 'default'}
129
+ onChange={(value) => setSelectedColor(value)}
130
+ >
131
+ Default Color
132
+ </Radio>
133
+ <Radio
134
+ name="color-radio"
135
+ value="green"
136
+ checked={selectedColor === 'green'}
137
+ onChange={(value) => setSelectedColor(value)}
138
+ controlColor="accentBoldGreen"
139
+ >
140
+ Custom Green
141
+ </Radio>
142
+ <Radio
143
+ name="color-radio"
144
+ value="purple"
145
+ checked={selectedColor === 'purple'}
146
+ onChange={(value) => setSelectedColor(value)}
147
+ controlColor="accentBoldPurple"
148
+ >
149
+ Custom Purple
150
+ </Radio>
151
+ </VStack>
152
+ );
153
+ }
154
+ ```
155
+
156
+ ### Disabled State
157
+
158
+ Radio components can be disabled to prevent user interaction.
159
+
160
+ ```jsx
161
+ function DisabledRadio() {
162
+ const [selectedValue, setSelectedValue] = useState('enabled');
163
+
164
+ return (
165
+ <VStack gap={2}>
166
+ <Radio
167
+ name="disabled-radio"
168
+ value="enabled"
169
+ checked={selectedValue === 'enabled'}
170
+ onChange={(value) => setSelectedValue(value)}
171
+ >
172
+ Enabled Radio
173
+ </Radio>
174
+ <Radio
175
+ name="disabled-radio"
176
+ value="disabled-unchecked"
177
+ checked={false}
178
+ disabled
179
+ onChange={(value) => setSelectedValue(value)}
180
+ >
181
+ Disabled & Unchecked
182
+ </Radio>
183
+ <Radio
184
+ name="disabled-radio"
185
+ value="disabled-checked"
186
+ checked={true}
187
+ disabled
188
+ onChange={(value) => setSelectedValue(value)}
189
+ >
190
+ Disabled & Checked
191
+ </Radio>
192
+ </VStack>
193
+ );
194
+ }
195
+ ```
196
+
197
+ ### Accessibility
198
+
199
+ Radio components on mobile should always include proper accessibility labels and hints.
200
+
201
+ ```jsx
202
+ function AccessibleRadio() {
203
+ const [selectedPayment, setSelectedPayment] = useState('credit');
204
+
205
+ return (
206
+ <VStack gap={2}>
207
+ <Radio
208
+ name="payment-radio"
209
+ value="credit"
210
+ checked={selectedPayment === 'credit'}
211
+ onChange={(value) => setSelectedPayment(value)}
212
+ accessibilityLabel="Credit Card"
213
+ accessibilityHint="Pay with credit card"
214
+ >
215
+ Credit Card
216
+ </Radio>
217
+ <Radio
218
+ name="payment-radio"
219
+ value="debit"
220
+ checked={selectedPayment === 'debit'}
221
+ onChange={(value) => setSelectedPayment(value)}
222
+ accessibilityLabel="Debit Card"
223
+ accessibilityHint="Pay with debit card"
224
+ >
225
+ Debit Card
226
+ </Radio>
227
+ <Radio
228
+ name="payment-radio"
229
+ value="crypto"
230
+ checked={selectedPayment === 'crypto'}
231
+ onChange={(value) => setSelectedPayment(value)}
232
+ accessibilityLabel="Cryptocurrency"
233
+ accessibilityHint="Pay with cryptocurrency"
234
+ >
235
+ Cryptocurrency
236
+ </Radio>
237
+ </VStack>
238
+ );
239
+ }
240
+ ```
241
+
242
+