@coinbase/cds-mcp-server 8.38.6 → 8.39.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 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.39.0 ((1/27/2026, 11:17 AM PST))
12
+
13
+ This is an artificial version bump with no new change.
14
+
15
+ ## 8.38.7 ((1/26/2026, 10:28 AM PST))
16
+
17
+ This is an artificial version bump with no new change.
18
+
11
19
  ## 8.38.6 (1/23/2026 PST)
12
20
 
13
21
  #### 🐞 Fixes
@@ -201,6 +201,9 @@ You can have different area styles for each series.
201
201
  | `justifyContent` | `flex-start \| flex-end \| center \| space-between \| space-around \| space-evenly` | No | `-` | - |
202
202
  | `key` | `Key \| null` | No | `-` | - |
203
203
  | `left` | `string \| number` | No | `-` | - |
204
+ | `legend` | `null \| string \| number \| false \| true \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal` | No | `-` | Whether to show the legend or a custom legend element. - true renders the default Legend component - A React element renders that element as the legend - false or omitted hides the legend |
205
+ | `legendAccessibilityLabel` | `string` | No | `'Legend'` | Accessibility label for the legend group. |
206
+ | `legendPosition` | `top \| bottom \| left \| right` | No | `'bottom'` | Position of the legend relative to the chart. |
204
207
  | `lineHeight` | `inherit \| LineHeight` | No | `-` | - |
205
208
  | `lineType` | `solid \| dotted` | No | `'solid'` | The type of line to render. |
206
209
  | `margin` | `0 \| -1 \| -2 \| -0.25 \| -0.5 \| -0.75 \| -1.5 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10` | No | `-` | - |
@@ -606,88 +606,70 @@ You can also set the `barMinSize` prop to control the minimum size for individua
606
606
 
607
607
  #### Multiple Y Axes
608
608
 
609
- You can render bars from separate y axes in one `BarPlot`, however they aren't able to be stack.
609
+ You can render bars from separate y axes in one `BarPlot`, however they aren't able to be stacked.
610
610
 
611
611
  ```jsx
612
612
  function MultipleYAxes() {
613
613
  const theme = useTheme();
614
614
 
615
615
  return (
616
- <VStack gap={2}>
617
- <CartesianChart
618
- height={150}
619
- inset={{ top: 8, bottom: 8, left: 0, right: 0 }}
620
- series={[
621
- {
622
- id: 'revenue',
623
- data: [455, 520, 380, 455, 285, 235],
624
- yAxisId: 'revenue',
625
- color: theme.color.accentBoldYellow,
626
- },
627
- {
628
- id: 'profitMargin',
629
- data: [23, 20, 16, 38, 12, 9],
630
- yAxisId: 'profitMargin',
631
- color: theme.color.fgPositive,
632
- },
633
- ]}
634
- xAxis={{
635
- data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
636
- scaleType: 'band',
637
- }}
638
- yAxis={[
639
- {
640
- id: 'revenue',
641
- domain: { min: 0 },
642
- },
643
- {
644
- id: 'profitMargin',
645
- domain: { min: 0, max: 100 },
646
- },
647
- ]}
648
- >
649
- <XAxis showLine showTickMarks />
650
- <YAxis
651
- showGrid
652
- showLine
653
- showTickMarks
654
- axisId="revenue"
655
- position="left"
656
- requestedTickCount={5}
657
- width={60}
658
- tickLabelFormatter={(value) => `$${value}k`}
659
- />
660
- <YAxis
661
- showLine
662
- showTickMarks
663
- axisId="profitMargin"
664
- position="right"
665
- requestedTickCount={5}
666
- tickLabelFormatter={(value) => `${value}%`}
667
- />
668
- <BarPlot />
669
- </CartesianChart>
670
- <HStack justifyContent="center" gap={2}>
671
- <Box alignItems="center" gap={0.5}>
672
- <Box
673
- borderRadius={1000}
674
- width={10}
675
- height={10}
676
- style={{ background: theme.color.accentBoldYellow }}
677
- />
678
- <Text font="label2">Revenue ($)</Text>
679
- </Box>
680
- <Box alignItems="center" gap={0.5}>
681
- <Box
682
- borderRadius={1000}
683
- width={10}
684
- height={10}
685
- style={{ background: theme.color.fgPositive }}
686
- />
687
- <Text font="label2">Profit Margin (%)</Text>
688
- </Box>
689
- </HStack>
690
- </VStack>
616
+ <CartesianChart
617
+ legend
618
+ height={150}
619
+ inset={{ top: 8, bottom: 8, left: 0, right: 0 }}
620
+ legendPosition="bottom"
621
+ series={[
622
+ {
623
+ id: 'revenue',
624
+ label: 'Revenue ($)',
625
+ data: [455, 520, 380, 455, 285, 235],
626
+ yAxisId: 'revenue',
627
+ color: theme.color.accentBoldYellow,
628
+ },
629
+ {
630
+ id: 'profitMargin',
631
+ label: 'Profit Margin (%)',
632
+ data: [23, 20, 16, 38, 12, 9],
633
+ yAxisId: 'profitMargin',
634
+ color: theme.color.fgPositive,
635
+ },
636
+ ]}
637
+ xAxis={{
638
+ data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
639
+ scaleType: 'band',
640
+ }}
641
+ yAxis={[
642
+ {
643
+ id: 'revenue',
644
+ domain: { min: 0 },
645
+ },
646
+ {
647
+ id: 'profitMargin',
648
+ domain: { min: 0, max: 100 },
649
+ },
650
+ ]}
651
+ >
652
+ <XAxis showLine showTickMarks />
653
+ <YAxis
654
+ showGrid
655
+ showLine
656
+ showTickMarks
657
+ axisId="revenue"
658
+ position="left"
659
+ requestedTickCount={5}
660
+ width={60}
661
+ tickLabelFormatter={(value) => `$${value}k`}
662
+ />
663
+ <YAxis
664
+ showLine
665
+ showTickMarks
666
+ axisId="profitMargin"
667
+ position="right"
668
+ requestedTickCount={5}
669
+ tickLabelFormatter={(value) => `${value}%`}
670
+ />
671
+ <BarPlot />
672
+ </CartesianChart>
691
673
  );
692
674
  }
693
675
  ```
@@ -750,6 +732,9 @@ function MultipleYAxes() {
750
732
  | `justifyContent` | `flex-start \| flex-end \| center \| space-between \| space-around \| space-evenly` | No | `-` | - |
751
733
  | `key` | `Key \| null` | No | `-` | - |
752
734
  | `left` | `string \| number` | No | `-` | - |
735
+ | `legend` | `null \| string \| number \| false \| true \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal` | No | `-` | Whether to show the legend or a custom legend element. - true renders the default Legend component - A React element renders that element as the legend - false or omitted hides the legend |
736
+ | `legendAccessibilityLabel` | `string` | No | `'Legend'` | Accessibility label for the legend group. |
737
+ | `legendPosition` | `top \| bottom \| left \| right` | No | `'bottom'` | Position of the legend relative to the chart. |
753
738
  | `lineHeight` | `inherit \| LineHeight` | No | `-` | - |
754
739
  | `margin` | `0 \| -1 \| -2 \| -0.25 \| -0.5 \| -0.75 \| -1.5 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10` | No | `-` | - |
755
740
  | `marginBottom` | `0 \| -1 \| -2 \| -0.25 \| -0.5 \| -0.75 \| -1.5 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10` | No | `-` | - |
@@ -790,7 +775,7 @@ function MultipleYAxes() {
790
775
  | `right` | `string \| number` | No | `-` | - |
791
776
  | `roundBaseline` | `boolean` | No | `-` | Whether to round the baseline of a bar (where the value is 0). |
792
777
  | `rowGap` | `0 \| 1 \| 2 \| 0.25 \| 0.5 \| 0.75 \| 1.5 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10` | No | `-` | - |
793
- | `series` | `Series[]` | No | `-` | Configuration objects that define how to visualize the data. |
778
+ | `series` | `BarSeries[]` | No | `-` | Configuration objects that define how to visualize the data. Each series can optionally define its own BarComponent. |
794
779
  | `showXAxis` | `boolean` | No | `-` | Whether to show the X axis. |
795
780
  | `showYAxis` | `boolean` | No | `-` | Whether to show the Y axis. |
796
781
  | `stackGap` | `number` | No | `-` | Gap between bars in the stack. |
@@ -381,6 +381,78 @@ function OverflowCarousel() {
381
381
  }
382
382
  ```
383
383
 
384
+ ### Looping
385
+
386
+ Enable infinite looping with the `loop` prop. You must have at least two pages of content to enable looping.
387
+
388
+ Looping works with both `snap` and `free` drag modes, and with both `page` and `item` snap modes.
389
+
390
+ #### Looping with Snap
391
+
392
+ When looping is enabled with snap drag mode, the carousel will snap to the nearest item or page (depending on `snapMode`) after releasing, allowing infinite scrolling in either direction.
393
+
394
+ ```jsx
395
+ function LoopingSnapCarousel() {
396
+ const theme = useTheme();
397
+ const windowWidth = Dimensions.get('window').width;
398
+
399
+ const horizontalPadding = theme.space[2];
400
+ const carouselWidth = windowWidth - horizontalPadding * 2;
401
+ const horizontalGap = theme.space[1];
402
+
403
+ return (
404
+ <Carousel
405
+ loop
406
+ title="Infinite Scroll"
407
+ styles={{
408
+ root: { paddingHorizontal: horizontalPadding },
409
+ carousel: { gap: horizontalGap },
410
+ }}
411
+ >
412
+ {Object.values(assets).map((asset) => (
413
+ <CarouselItem key={asset.symbol} id={asset.symbol} accessibilityLabel={asset.name}>
414
+ <SquareAssetCard imageUrl={asset.imageUrl} name={asset.symbol} />
415
+ </CarouselItem>
416
+ ))}
417
+ </Carousel>
418
+ );
419
+ }
420
+ ```
421
+
422
+ #### Looping with Free Drag
423
+
424
+ When looping with free drag, the carousel scrolls continuously without snapping, creating a smooth endless scrolling experience.
425
+
426
+ ```jsx
427
+ function LoopingFreeDragCarousel() {
428
+ const theme = useTheme();
429
+ const windowWidth = Dimensions.get('window').width;
430
+
431
+ const horizontalPadding = theme.space[2];
432
+ const carouselWidth = windowWidth - horizontalPadding * 2;
433
+ const horizontalGap = theme.space[1];
434
+
435
+ return (
436
+ <Carousel
437
+ loop
438
+ drag="free"
439
+ snapMode="item"
440
+ title="Free Scroll Loop"
441
+ styles={{
442
+ root: { paddingHorizontal: horizontalPadding },
443
+ carousel: { gap: horizontalGap },
444
+ }}
445
+ >
446
+ {Object.values(assets).map((asset) => (
447
+ <CarouselItem key={asset.symbol} id={asset.symbol} accessibilityLabel={asset.name}>
448
+ <SquareAssetCard imageUrl={asset.imageUrl} name={asset.symbol} />
449
+ </CarouselItem>
450
+ ))}
451
+ </Carousel>
452
+ );
453
+ }
454
+ ```
455
+
384
456
  ### Accessibility
385
457
 
386
458
  The carousel is accessible by default.
@@ -1034,6 +1106,7 @@ You can use the `onChangePage`, `onDragStart`, and `onDragEnd` callbacks to list
1034
1106
  | `key` | `Key \| null` | No | `-` | - |
1035
1107
  | `left` | `string \| number` | No | `-` | - |
1036
1108
  | `lineHeight` | `inherit \| LineHeight` | No | `-` | - |
1109
+ | `loop` | `boolean` | No | `-` | Enables infinite looping. When true, the carousel will seamlessly loop from the last item back to the first. |
1037
1110
  | `margin` | `0 \| -1 \| -2 \| -0.25 \| -0.5 \| -0.75 \| -1.5 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10` | No | `-` | - |
1038
1111
  | `marginBottom` | `0 \| -1 \| -2 \| -0.25 \| -0.5 \| -0.75 \| -1.5 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10` | No | `-` | - |
1039
1112
  | `marginEnd` | `0 \| -1 \| -2 \| -0.25 \| -0.5 \| -0.75 \| -1.5 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10` | No | `-` | - |
@@ -646,7 +646,7 @@ function EarningsHistory() {
646
646
  [actualEPS, estimatedEPS],
647
647
  );
648
648
 
649
- const LegendItem = memo(({ opacity = 1, label }: { opacity?: number, label: string }) => {
649
+ const LegendEntry = memo(({ opacity = 1, label }: { opacity?: number, label: string }) => {
650
650
  return (
651
651
  <Box alignItems="center" gap={0.5}>
652
652
  <LegendDot opacity={opacity} />
@@ -687,8 +687,8 @@ function EarningsHistory() {
687
687
  <CirclePlot seriesId="actualEPS" />
688
688
  </CartesianChart>
689
689
  <HStack justifyContent="flex-end" gap={2}>
690
- <LegendItem opacity={0.5} label="Estimated EPS" />
691
- <LegendItem label="Actual EPS" />
690
+ <LegendEntry opacity={0.5} label="Estimated EPS" />
691
+ <LegendEntry label="Actual EPS" />
692
692
  </HStack>
693
693
  </VStack>
694
694
  );
@@ -798,6 +798,9 @@ function TradingTrends() {
798
798
  | `justifyContent` | `flex-start \| flex-end \| center \| space-between \| space-around \| space-evenly` | No | `-` | - |
799
799
  | `key` | `Key \| null` | No | `-` | - |
800
800
  | `left` | `string \| number` | No | `-` | - |
801
+ | `legend` | `null \| string \| number \| false \| true \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal` | No | `-` | Whether to show the legend or a custom legend element. - true renders the default Legend component - A React element renders that element as the legend - false or omitted hides the legend |
802
+ | `legendAccessibilityLabel` | `string` | No | `'Legend'` | Accessibility label for the legend group. |
803
+ | `legendPosition` | `top \| bottom \| left \| right` | No | `'bottom'` | Position of the legend relative to the chart. |
801
804
  | `lineHeight` | `inherit \| LineHeight` | No | `-` | - |
802
805
  | `margin` | `0 \| -1 \| -2 \| -0.25 \| -0.5 \| -0.75 \| -1.5 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10` | No | `-` | - |
803
806
  | `marginBottom` | `0 \| -1 \| -2 \| -0.25 \| -0.5 \| -0.75 \| -1.5 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10` | No | `-` | - |
@@ -221,6 +221,7 @@ function MultipleCheckboxes() {
221
221
  | `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 | `-` | - |
222
222
  | `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 bgPrimary` | Sets the checked/active color of the control. |
223
223
  | `disabled` | `boolean` | No | `-` | Disable user interaction. |
224
+ | `elevation` | `0 \| 1 \| 2` | No | `-` | Sets the elevation/drop shadow of the control. |
224
225
  | `indeterminate` | `boolean` | No | `-` | Enable indeterminate state. Useful when you want to indicate that sub-items of a control are partially filled. |
225
226
  | `onChange` | `((value: T, checked?: boolean \| undefined) => void) \| undefined` | No | `-` | Toggle control selected state. |
226
227
  | `onPointerCancel` | `((event: PointerEvent) => void)` | No | `-` | - |
@@ -122,7 +122,7 @@ function CustomCheckboxCellExample() {
122
122
  | `disableDebounce` | `boolean` | No | `-` | React Native is historically trash at debouncing touch events. This can cause a lot of unwanted behavior such as double navigations where we push a screen onto the stack 2 times. Debouncing the event 500 miliseconds, but taking the leading event prevents this effect and the accidental double-tap. |
123
123
  | `disabled` | `boolean` | No | `-` | Disable user interaction. Is the element currently disabled. |
124
124
  | `display` | `flex \| none` | No | `-` | - |
125
- | `elevation` | `0 \| 1 \| 2` | No | `-` | Determines box shadow styles. Parent should have overflow set to visible to ensure styles are not clipped. Is the element elevated. |
125
+ | `elevation` | `0 \| 1 \| 2` | No | `-` | Sets the elevation/drop shadow of the control. Determines box shadow styles. Parent should have overflow set to visible to ensure styles are not clipped. Is the element elevated. |
126
126
  | `feedback` | `none \| light \| normal \| heavy` | No | `none` | Haptic feedback to trigger when being pressed. |
127
127
  | `flexBasis` | `string \| number` | No | `-` | - |
128
128
  | `flexDirection` | `row \| column \| row-reverse \| column-reverse` | No | `-` | - |