@coinbase/cds-mcp-server 8.38.7 → 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,10 @@ 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
+
11
15
  ## 8.38.7 ((1/26/2026, 10:28 AM PST))
12
16
 
13
17
  This is an artificial version bump with no new change.
@@ -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 | `-` | - |
@@ -635,6 +635,96 @@ function OverflowCarousel() {
635
635
  }
636
636
  ```
637
637
 
638
+ ### Looping
639
+
640
+ Enable infinite looping with the `loop` prop. You must have at least two pages of content to enable looping.
641
+
642
+ Looping works with both `snap` and `free` drag modes, and with both `page` and `item` snap modes.
643
+
644
+ #### Looping with Snap
645
+
646
+ 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.
647
+
648
+ ```jsx live
649
+ function LoopingSnapCarousel() {
650
+ function SquareAssetCard({ imageUrl, name }) {
651
+ return (
652
+ <ContainedAssetCard
653
+ description={
654
+ <Text as="p" font="label2" color="fgPositive" numberOfLines={2}>
655
+ ↗6.37%
656
+ </Text>
657
+ }
658
+ header={<RemoteImage height="32px" source={imageUrl} width="32px" />}
659
+ subtitle={name}
660
+ title="$0.87"
661
+ />
662
+ );
663
+ }
664
+ return (
665
+ <Box marginX={-3}>
666
+ <Carousel
667
+ loop
668
+ title="Infinite Scroll"
669
+ styles={{
670
+ root: { paddingInline: 'var(--space-3)' },
671
+ carousel: { gap: 'var(--space-1)' },
672
+ }}
673
+ >
674
+ {Object.values(assets).map((asset) => (
675
+ <CarouselItem key={asset.symbol} id={asset.symbol} accessibilityLabel={asset.name}>
676
+ <SquareAssetCard imageUrl={asset.imageUrl} name={asset.symbol} />
677
+ </CarouselItem>
678
+ ))}
679
+ </Carousel>
680
+ </Box>
681
+ );
682
+ }
683
+ ```
684
+
685
+ #### Looping with Free Drag
686
+
687
+ When looping with free drag, the carousel scrolls continuously without snapping, creating a smooth endless scrolling experience.
688
+
689
+ ```jsx live
690
+ function LoopingFreeDragCarousel() {
691
+ function SquareAssetCard({ imageUrl, name }) {
692
+ return (
693
+ <ContainedAssetCard
694
+ description={
695
+ <Text as="p" font="label2" color="fgPositive" numberOfLines={2}>
696
+ ↗6.37%
697
+ </Text>
698
+ }
699
+ header={<RemoteImage height="32px" source={imageUrl} width="32px" />}
700
+ subtitle={name}
701
+ title="$0.87"
702
+ />
703
+ );
704
+ }
705
+ return (
706
+ <Box marginX={-3}>
707
+ <Carousel
708
+ loop
709
+ drag="free"
710
+ snapMode="item"
711
+ title="Free Scroll Loop"
712
+ styles={{
713
+ root: { paddingInline: 'var(--space-3)' },
714
+ carousel: { gap: 'var(--space-1)' },
715
+ }}
716
+ >
717
+ {Object.values(assets).map((asset) => (
718
+ <CarouselItem key={asset.symbol} id={asset.symbol} accessibilityLabel={asset.name}>
719
+ <SquareAssetCard imageUrl={asset.imageUrl} name={asset.symbol} />
720
+ </CarouselItem>
721
+ ))}
722
+ </Carousel>
723
+ </Box>
724
+ );
725
+ }
726
+ ```
727
+
638
728
  ### Accessibility
639
729
 
640
730
  The carousel is accessible by default.
@@ -1533,6 +1623,7 @@ You can use the `onChangePage`, `onDragStart`, and `onDragEnd` callbacks to list
1533
1623
  | `key` | `Key \| null` | No | `-` | - |
1534
1624
  | `left` | `ResponsiveProp<Left<string \| number>>` | No | `-` | - |
1535
1625
  | `lineHeight` | `ResponsiveProp<LineHeight \| inherit>` | No | `-` | - |
1626
+ | `loop` | `boolean` | No | `-` | Enables infinite looping. When true, the carousel will seamlessly loop from the last item back to the first. |
1536
1627
  | `margin` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
1537
1628
  | `marginBottom` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
1538
1629
  | `marginEnd` | `ResponsiveProp<0 \| -5 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1 \| -1.5 \| -2 \| -3 \| -4 \| -6 \| -7 \| -8 \| -9>` | No | `-` | - |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cds-mcp-server",
3
- "version": "8.38.7",
3
+ "version": "8.39.0",
4
4
  "description": "Coinbase Design System - MCP Server",
5
5
  "repository": {
6
6
  "type": "git",