@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 +8 -0
- package/mcp-docs/mobile/components/AreaChart.txt +3 -0
- package/mcp-docs/mobile/components/BarChart.txt +62 -77
- package/mcp-docs/mobile/components/Carousel.txt +73 -0
- package/mcp-docs/mobile/components/CartesianChart.txt +6 -3
- package/mcp-docs/mobile/components/Checkbox.txt +1 -0
- package/mcp-docs/mobile/components/CheckboxCell.txt +1 -1
- package/mcp-docs/mobile/components/Legend.txt +727 -0
- package/mcp-docs/mobile/components/LineChart.txt +47 -3
- package/mcp-docs/mobile/components/Radio.txt +1 -0
- package/mcp-docs/mobile/components/RadioCell.txt +1 -1
- package/mcp-docs/mobile/components/Scrubber.txt +33 -0
- package/mcp-docs/mobile/components/Switch.txt +17 -0
- package/mcp-docs/mobile/routes.txt +1 -0
- package/mcp-docs/web/components/AreaChart.txt +3 -0
- package/mcp-docs/web/components/BarChart.txt +62 -77
- package/mcp-docs/web/components/Carousel.txt +91 -0
- package/mcp-docs/web/components/CartesianChart.txt +6 -3
- package/mcp-docs/web/components/Checkbox.txt +1 -0
- package/mcp-docs/web/components/Legend.txt +886 -0
- package/mcp-docs/web/components/LineChart.txt +47 -18
- package/mcp-docs/web/components/Radio.txt +1 -0
- package/mcp-docs/web/components/ReferenceLine.txt +1 -0
- package/mcp-docs/web/components/Scrubber.txt +33 -0
- package/mcp-docs/web/components/Switch.txt +17 -0
- package/mcp-docs/web/routes.txt +1 -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.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
|
|
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
|
-
<
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
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` | `
|
|
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
|
|
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
|
-
<
|
|
691
|
-
<
|
|
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 | `-` | - |
|