@coinbase/cds-mcp-server 8.33.0 → 8.33.1

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 CHANGED
@@ -8,6 +8,10 @@ All notable changes to this project will be documented in this file.
8
8
 
9
9
  <!-- template-start -->
10
10
 
11
+ ## 8.33.1 ((12/19/2025, 08:09 AM PST))
12
+
13
+ This is an artificial version bump with no new change.
14
+
11
15
  ## 8.33.0 ((12/18/2025, 11:46 AM PST))
12
16
 
13
17
  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
@@ -43,7 +43,7 @@ function MyCarousel() {
43
43
  );
44
44
  }
45
45
  return (
46
- <Box style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginInline: 'calc(-1 * var(--space-3))' }}>
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
- <div
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
- </div>
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 style={{ marginLeft: 'calc(-1 * var(--space-3))', marginRight: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginLeft: 'calc(-1 * var(--space-3))', marginRight: 'calc(-1 * var(--space-3))' }}>
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 style={{ marginLeft: 'calc(-1 * var(--space-3))', marginRight: 'calc(-1 * var(--space-3))' }}>
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cds-mcp-server",
3
- "version": "8.33.0",
3
+ "version": "8.33.1",
4
4
  "description": "Coinbase Design System - MCP Server",
5
5
  "repository": {
6
6
  "type": "git",