@coinbase/cds-mcp-server 8.33.0 → 8.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/mcp-docs/mobile/components/SelectChipAlpha.txt +53 -0
- package/mcp-docs/mobile/components/SlideButton.txt +22 -0
- package/mcp-docs/web/components/Carousel.txt +15 -15
- package/mcp-docs/web/components/LineChart.txt +5 -10
- package/mcp-docs/web/components/ReferenceLine.txt +1 -1
- package/mcp-docs/web/components/Scrubber.txt +2 -2
- package/mcp-docs/web/components/SelectChipAlpha.txt +54 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,14 @@ All notable changes to this project will be documented in this file.
|
|
|
8
8
|
|
|
9
9
|
<!-- template-start -->
|
|
10
10
|
|
|
11
|
+
## 8.34.0 ((12/19/2025, 02:32 PM PST))
|
|
12
|
+
|
|
13
|
+
This is an artificial version bump with no new change.
|
|
14
|
+
|
|
15
|
+
## 8.33.1 ((12/19/2025, 08:09 AM PST))
|
|
16
|
+
|
|
17
|
+
This is an artificial version bump with no new change.
|
|
18
|
+
|
|
11
19
|
## 8.33.0 ((12/18/2025, 11:46 AM PST))
|
|
12
20
|
|
|
13
21
|
This is an artificial version bump with no new change.
|
|
@@ -190,6 +190,59 @@ function ExampleMultiGroups() {
|
|
|
190
190
|
}
|
|
191
191
|
```
|
|
192
192
|
|
|
193
|
+
### Multi-select with assets
|
|
194
|
+
|
|
195
|
+
```tsx
|
|
196
|
+
function ExampleMultiAssets() {
|
|
197
|
+
const assetImageMap: Record<string, string> = {
|
|
198
|
+
btc: assets.btc.imageUrl,
|
|
199
|
+
eth: assets.eth.imageUrl,
|
|
200
|
+
dai: assets.dai.imageUrl,
|
|
201
|
+
ltc: assets.ltc.imageUrl,
|
|
202
|
+
xrp: assets.xrp.imageUrl,
|
|
203
|
+
};
|
|
204
|
+
const exampleOptions = [
|
|
205
|
+
{ value: 'btc', label: assets.btc.name },
|
|
206
|
+
{ value: 'eth', label: assets.eth.name },
|
|
207
|
+
{ value: 'dai', label: assets.dai.name },
|
|
208
|
+
{ value: 'ltc', label: assets.ltc.name },
|
|
209
|
+
{ value: 'xrp', label: assets.xrp.name },
|
|
210
|
+
];
|
|
211
|
+
const { value, onChange } = useMultiSelect({
|
|
212
|
+
initialValue: ['eth', 'btc'],
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// Get startNode based on selected assets
|
|
216
|
+
const startNode = useMemo(() => {
|
|
217
|
+
if (value.length === 0) return null;
|
|
218
|
+
|
|
219
|
+
// Multiple assets selected - use RemoteImageGroup
|
|
220
|
+
return (
|
|
221
|
+
<RemoteImageGroup shape="circle" size={24}>
|
|
222
|
+
{value.map((assetValue) => {
|
|
223
|
+
const imageUrl = assetImageMap[assetValue];
|
|
224
|
+
if (!imageUrl) return null;
|
|
225
|
+
return <RemoteImage key={assetValue} source={imageUrl} />;
|
|
226
|
+
})}
|
|
227
|
+
</RemoteImageGroup>
|
|
228
|
+
);
|
|
229
|
+
}, [value]);
|
|
230
|
+
|
|
231
|
+
return (
|
|
232
|
+
<SelectChip
|
|
233
|
+
accessibilityLabel="Select multiple assets"
|
|
234
|
+
maxWidth={400}
|
|
235
|
+
onChange={onChange}
|
|
236
|
+
options={exampleOptions}
|
|
237
|
+
placeholder="Choose assets"
|
|
238
|
+
startNode={startNode}
|
|
239
|
+
type="multi"
|
|
240
|
+
value={value}
|
|
241
|
+
/>
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
193
246
|
### Compact
|
|
194
247
|
|
|
195
248
|
```tsx
|
|
@@ -78,6 +78,27 @@ function Example() {
|
|
|
78
78
|
}
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
+
### Compact SlideButton
|
|
82
|
+
|
|
83
|
+
Use the `compact` prop to reduce the height, border-radius and padding of the button:
|
|
84
|
+
|
|
85
|
+
```jsx
|
|
86
|
+
function Example() {
|
|
87
|
+
const [checked, setChecked] = useState(false);
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<SlideButton
|
|
91
|
+
checked={checked}
|
|
92
|
+
onChange={setChecked}
|
|
93
|
+
onSlideComplete={() => console.log('Completed')}
|
|
94
|
+
uncheckedLabel="Swipe to confirm"
|
|
95
|
+
checkedLabel="Confirming..."
|
|
96
|
+
compact
|
|
97
|
+
/>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
81
102
|
### Auto Complete on Threshold
|
|
82
103
|
|
|
83
104
|
You can set the button to automatically complete when the slide reaches the threshold:
|
|
@@ -239,6 +260,7 @@ function Example() {
|
|
|
239
260
|
| `children` | `((string \| number \| boolean \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal) & (string \| number \| boolean \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| ((state: PressableStateCallbackType) => ReactNode))) \| null` | No | `-` | Either children or a render prop that receives a boolean reflecting whether the component is currently pressed. |
|
|
240
261
|
| `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 | `-` | - |
|
|
241
262
|
| `columnGap` | `0 \| 1 \| 2 \| 0.25 \| 0.5 \| 0.75 \| 1.5 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10` | No | `-` | - |
|
|
263
|
+
| `compact` | `boolean` | No | `-` | Reduces the height, borderRadius and inner padding within the button. |
|
|
242
264
|
| `contentStyle` | `null \| false \| ViewStyle \| RegisteredStyle<ViewStyle> \| RecursiveArray<ViewStyle \| Falsy \| RegisteredStyle<ViewStyle>>` | No | `-` | Apply animated styles to the inner container. |
|
|
243
265
|
| `dangerouslySetBackground` | `string` | No | `-` | - |
|
|
244
266
|
| `debounceTime` | `number` | No | `500` | The amount of time to wait (in milliseconds) before invoking the debounced function. This prop is used in conjunction with the disableDebounce prop. The debounce function is configured to be invoked as soon as its called, but subsequent calls within the debounceTime period will be ignored. |
|
|
@@ -43,7 +43,7 @@ function MyCarousel() {
|
|
|
43
43
|
);
|
|
44
44
|
}
|
|
45
45
|
return (
|
|
46
|
-
<Box
|
|
46
|
+
<Box marginX={-3}>
|
|
47
47
|
<Carousel
|
|
48
48
|
hidePagination
|
|
49
49
|
title="Explore Assets"
|
|
@@ -122,7 +122,7 @@ function DynamicSizingCarousel() {
|
|
|
122
122
|
tabs={itemsPerPage}
|
|
123
123
|
/>
|
|
124
124
|
</HStack>
|
|
125
|
-
<Box
|
|
125
|
+
<Box marginX={-3}>
|
|
126
126
|
<Carousel
|
|
127
127
|
hidePagination
|
|
128
128
|
title="Learn more"
|
|
@@ -310,7 +310,7 @@ function ResponsiveSizingCarousel() {
|
|
|
310
310
|
);
|
|
311
311
|
}
|
|
312
312
|
return (
|
|
313
|
-
<Box
|
|
313
|
+
<Box marginX={-3}>
|
|
314
314
|
<Carousel
|
|
315
315
|
hidePagination
|
|
316
316
|
title="Learn more"
|
|
@@ -403,7 +403,7 @@ function VariedSizingCarousel() {
|
|
|
403
403
|
desktop: 'calc((100% - var(--space-1)) / 2)',
|
|
404
404
|
};
|
|
405
405
|
return (
|
|
406
|
-
<Box
|
|
406
|
+
<Box marginX={-3}>
|
|
407
407
|
<Carousel
|
|
408
408
|
hidePagination
|
|
409
409
|
title="Varied Sizing"
|
|
@@ -495,7 +495,7 @@ function DragCarousel() {
|
|
|
495
495
|
</Text>
|
|
496
496
|
<SegmentedTabs activeTab={drag} onChange={setDrag} tabs={dragOptions} />
|
|
497
497
|
</HStack>
|
|
498
|
-
<Box
|
|
498
|
+
<Box marginX={-3}>
|
|
499
499
|
<Carousel
|
|
500
500
|
title="Explore Assets"
|
|
501
501
|
hidePagination
|
|
@@ -554,7 +554,7 @@ function SnapModeCarousel() {
|
|
|
554
554
|
</Text>
|
|
555
555
|
<SegmentedTabs activeTab={snapMode} onChange={setSnapMode} tabs={snapModeOptions} />
|
|
556
556
|
</HStack>
|
|
557
|
-
<Box
|
|
557
|
+
<Box marginX={-3}>
|
|
558
558
|
<Carousel
|
|
559
559
|
title="Explore Assets"
|
|
560
560
|
styles={{
|
|
@@ -609,7 +609,7 @@ function OverflowCarousel() {
|
|
|
609
609
|
);
|
|
610
610
|
}
|
|
611
611
|
return (
|
|
612
|
-
<Box
|
|
612
|
+
<Box marginX={-3}>
|
|
613
613
|
<Carousel
|
|
614
614
|
title="Explore Assets"
|
|
615
615
|
snapMode="item"
|
|
@@ -770,7 +770,7 @@ function CustomComponentsCarousel() {
|
|
|
770
770
|
desktop: 'round(down, calc((100% - var(--space-1)) / 2), 1px)',
|
|
771
771
|
};
|
|
772
772
|
return (
|
|
773
|
-
<Box
|
|
773
|
+
<Box marginX={-3}>
|
|
774
774
|
<Carousel
|
|
775
775
|
NavigationComponent={SeeAllComponent}
|
|
776
776
|
PaginationComponent={PaginationComponent}
|
|
@@ -913,7 +913,7 @@ You can use the `classNames` and `styles` props to customize different parts of
|
|
|
913
913
|
```jsx live
|
|
914
914
|
function CustomStylesCarousel() {
|
|
915
915
|
return (
|
|
916
|
-
<Box
|
|
916
|
+
<Box marginX={-3}>
|
|
917
917
|
<Carousel
|
|
918
918
|
styles={{
|
|
919
919
|
root: { position: 'relative', paddingInline: 'var(--space-6)' },
|
|
@@ -1033,7 +1033,7 @@ function DynamicContentCarousel() {
|
|
|
1033
1033
|
Remove Last
|
|
1034
1034
|
</Button>
|
|
1035
1035
|
</HStack>
|
|
1036
|
-
<Box
|
|
1036
|
+
<Box marginX={-3}>
|
|
1037
1037
|
<Carousel
|
|
1038
1038
|
title="Explore Assets"
|
|
1039
1039
|
styles={{
|
|
@@ -1087,7 +1087,7 @@ function AnimatedCarousel() {
|
|
|
1087
1087
|
);
|
|
1088
1088
|
}
|
|
1089
1089
|
return (
|
|
1090
|
-
<Box
|
|
1090
|
+
<Box marginX={-3}>
|
|
1091
1091
|
<Carousel
|
|
1092
1092
|
title="Explore Assets"
|
|
1093
1093
|
styles={{
|
|
@@ -1171,7 +1171,7 @@ function AnimatedSelectionCarousel() {
|
|
|
1171
1171
|
);
|
|
1172
1172
|
});
|
|
1173
1173
|
return (
|
|
1174
|
-
<Box
|
|
1174
|
+
<Box marginX={-3}>
|
|
1175
1175
|
<Carousel
|
|
1176
1176
|
title="Explore Assets"
|
|
1177
1177
|
styles={{
|
|
@@ -1222,7 +1222,7 @@ function HideNavigationAndPaginationCarousel() {
|
|
|
1222
1222
|
);
|
|
1223
1223
|
}
|
|
1224
1224
|
return (
|
|
1225
|
-
<Box
|
|
1225
|
+
<Box marginX={-3}>
|
|
1226
1226
|
<Carousel
|
|
1227
1227
|
title="Explore Assets"
|
|
1228
1228
|
hidePagination
|
|
@@ -1300,7 +1300,7 @@ function AnimatedPaginationCarousel() {
|
|
|
1300
1300
|
}
|
|
1301
1301
|
|
|
1302
1302
|
return (
|
|
1303
|
-
<Box
|
|
1303
|
+
<Box marginX={-3}>
|
|
1304
1304
|
<Carousel
|
|
1305
1305
|
PaginationComponent={AnimatedPagination}
|
|
1306
1306
|
drag="snap"
|
|
@@ -1424,7 +1424,7 @@ function ImperativeApiCarousel() {
|
|
|
1424
1424
|
/>
|
|
1425
1425
|
</HStack>
|
|
1426
1426
|
</HStack>
|
|
1427
|
-
<Box
|
|
1427
|
+
<Box marginX={-3}>
|
|
1428
1428
|
<Carousel
|
|
1429
1429
|
ref={carouselRef}
|
|
1430
1430
|
hidePagination
|
|
@@ -1103,11 +1103,11 @@ function DynamicChartSizing() {
|
|
|
1103
1103
|
borderBottomLeftRadius={300}
|
|
1104
1104
|
borderTopLeftRadius={300}
|
|
1105
1105
|
flexGrow={1}
|
|
1106
|
+
marginTop={-3}
|
|
1107
|
+
marginStart={-3}
|
|
1108
|
+
marginBottom={-3}
|
|
1106
1109
|
style={{
|
|
1107
1110
|
background: 'linear-gradient(0deg, #D07609 0%, #F7931A 100%)',
|
|
1108
|
-
marginTop: 'calc(-1 * var(--space-3))',
|
|
1109
|
-
marginLeft: 'calc(-1 * var(--space-3))',
|
|
1110
|
-
marginBottom: 'calc(-1 * var(--space-3))',
|
|
1111
1111
|
}}
|
|
1112
1112
|
>
|
|
1113
1113
|
{/* LineChart fills to take up available width and height */}
|
|
@@ -1688,12 +1688,7 @@ function AssetPriceWidget() {
|
|
|
1688
1688
|
</Text>
|
|
1689
1689
|
</VStack>
|
|
1690
1690
|
</HStack>
|
|
1691
|
-
<
|
|
1692
|
-
style={{
|
|
1693
|
-
marginLeft: 'calc(-1 * var(--space-2))',
|
|
1694
|
-
marginRight: 'calc(-1 * var(--space-2))',
|
|
1695
|
-
}}
|
|
1696
|
-
>
|
|
1691
|
+
<Box marginX={-2}>
|
|
1697
1692
|
<LineChart
|
|
1698
1693
|
showArea
|
|
1699
1694
|
accessibilityLabel={chartAccessibilityLabel}
|
|
@@ -1714,7 +1709,7 @@ function AssetPriceWidget() {
|
|
|
1714
1709
|
styles={{ beacon: { stroke: 'white' } }}
|
|
1715
1710
|
/>
|
|
1716
1711
|
</LineChart>
|
|
1717
|
-
</
|
|
1712
|
+
</Box>
|
|
1718
1713
|
</VStack>
|
|
1719
1714
|
);
|
|
1720
1715
|
}
|
|
@@ -148,7 +148,7 @@ You can customize label appearance using `labelFont`, `labelDx`, `labelDy`, `lab
|
|
|
148
148
|
Use `labelBoundsInset` to prevent labels from getting too close to chart edges.
|
|
149
149
|
|
|
150
150
|
```jsx live
|
|
151
|
-
<Box
|
|
151
|
+
<Box marginX={-3}>
|
|
152
152
|
<LineChart
|
|
153
153
|
height={{ base: 150, tablet: 200, desktop: 250 }}
|
|
154
154
|
inset={{ left: 0, right: 0 }}
|
|
@@ -480,7 +480,7 @@ You can use `labelFont` to customize the font of the scrubber line label and `be
|
|
|
480
480
|
Use `labelBoundsInset` to prevent the scrubber line label from getting too close to chart edges.
|
|
481
481
|
|
|
482
482
|
```jsx live
|
|
483
|
-
<Box
|
|
483
|
+
<Box marginX={-3}>
|
|
484
484
|
<LineChart
|
|
485
485
|
enableScrubbing
|
|
486
486
|
showArea
|
|
@@ -499,7 +499,7 @@ Use `labelBoundsInset` to prevent the scrubber line label from getting too close
|
|
|
499
499
|
```
|
|
500
500
|
|
|
501
501
|
```jsx live
|
|
502
|
-
<Box
|
|
502
|
+
<Box marginX={-3}>
|
|
503
503
|
<LineChart
|
|
504
504
|
enableScrubbing
|
|
505
505
|
showArea
|
|
@@ -185,6 +185,60 @@ function ExampleMultiGroups() {
|
|
|
185
185
|
}
|
|
186
186
|
```
|
|
187
187
|
|
|
188
|
+
### Multi-select with assets
|
|
189
|
+
|
|
190
|
+
```jsx live
|
|
191
|
+
function ExampleMultiAssets() {
|
|
192
|
+
const assetImageMap: Record<string, string> = {
|
|
193
|
+
btc: assets.btc.imageUrl,
|
|
194
|
+
eth: assets.eth.imageUrl,
|
|
195
|
+
dai: assets.dai.imageUrl,
|
|
196
|
+
ltc: assets.ltc.imageUrl,
|
|
197
|
+
xrp: assets.xrp.imageUrl,
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const exampleOptions = [
|
|
201
|
+
{ value: 'btc', label: assets.btc.name },
|
|
202
|
+
{ value: 'eth', label: assets.eth.name },
|
|
203
|
+
{ value: 'dai', label: assets.dai.name },
|
|
204
|
+
{ value: 'ltc', label: assets.ltc.name },
|
|
205
|
+
{ value: 'xrp', label: assets.xrp.name },
|
|
206
|
+
];
|
|
207
|
+
const { value, onChange } = useMultiSelect({
|
|
208
|
+
initialValue: ['eth', 'btc'],
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// Get startNode based on selected assets
|
|
212
|
+
const startNode = useMemo(() => {
|
|
213
|
+
if (value.length === 0) return null;
|
|
214
|
+
|
|
215
|
+
// Multiple assets selected - use RemoteImageGroup
|
|
216
|
+
return (
|
|
217
|
+
<RemoteImageGroup shape="circle" size={24}>
|
|
218
|
+
{value.map((assetValue) => {
|
|
219
|
+
const imageUrl = assetImageMap[assetValue];
|
|
220
|
+
if (!imageUrl) return null;
|
|
221
|
+
return <RemoteImage key={assetValue} source={imageUrl} />;
|
|
222
|
+
})}
|
|
223
|
+
</RemoteImageGroup>
|
|
224
|
+
);
|
|
225
|
+
}, [value]);
|
|
226
|
+
|
|
227
|
+
return (
|
|
228
|
+
<SelectChip
|
|
229
|
+
controlAccessibilityLabel="Select multiple assets"
|
|
230
|
+
maxWidth={400}
|
|
231
|
+
onChange={onChange}
|
|
232
|
+
options={exampleOptions}
|
|
233
|
+
placeholder="Choose assets"
|
|
234
|
+
startNode={startNode}
|
|
235
|
+
type="multi"
|
|
236
|
+
value={value}
|
|
237
|
+
/>
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
188
242
|
### Compact
|
|
189
243
|
|
|
190
244
|
```jsx live
|