@coinbase/cds-mcp-server 8.47.4 → 8.48.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.
@@ -376,6 +376,255 @@ function Scrubbing() {
376
376
  }
377
377
  ```
378
378
 
379
+ ### Animations
380
+
381
+ CartesianChart delegates transition control to its child components. You can also disable all animations chart-wide by passing `animate={false}` on CartesianChart.
382
+
383
+ #### Enter Only
384
+
385
+ Disable the update morph animation while keeping a slow enter reveal. Data changes snap instantly but the initial chart appearance animates. Useful when new data arrives frequently and morphing would be distracting.
386
+
387
+ ```tsx live
388
+ function EnterAnimationOnly() {
389
+ const dataCount = 15;
390
+ const updateInterval = 2500;
391
+
392
+ function generateNextValue(prev: number) {
393
+ const step = Math.random() * 30 - 15;
394
+ return Math.max(0, Math.min(100, prev + step));
395
+ }
396
+
397
+ function generateInitialData() {
398
+ const data = [50];
399
+ for (let i = 1; i < dataCount; i++) {
400
+ data.push(generateNextValue(data[i - 1]));
401
+ }
402
+ return data;
403
+ }
404
+
405
+ function Chart() {
406
+ const [data, setData] = useState(generateInitialData);
407
+
408
+ useEffect(() => {
409
+ const intervalId = setInterval(() => {
410
+ setData((current) => {
411
+ const last = current[current.length - 1];
412
+ return [...current.slice(1), generateNextValue(last)];
413
+ });
414
+ }, updateInterval);
415
+ return () => clearInterval(intervalId);
416
+ }, []);
417
+
418
+ return (
419
+ <CartesianChart
420
+ height={{ base: 200, tablet: 225, desktop: 250 }}
421
+ inset={{ top: 16, bottom: 16, left: 16, right: 16 }}
422
+ series={[{ id: 'values', data }]}
423
+ aria-hidden="true"
424
+ >
425
+ <Line
426
+ seriesId="values"
427
+ strokeWidth={3}
428
+ transitions={{
429
+ update: null,
430
+ enter: { type: 'tween', duration: 1.0 },
431
+ }}
432
+ />
433
+ </CartesianChart>
434
+ );
435
+ }
436
+
437
+ return <Chart />;
438
+ }
439
+ ```
440
+
441
+ #### Update Only
442
+
443
+ Disable the enter reveal animation while keeping a slow update morph. The chart appears instantly but data changes animate smoothly. Useful when the chart is embedded in content that should not animate on load.
444
+
445
+ ```tsx live
446
+ function UpdateAnimationOnly() {
447
+ const dataCount = 15;
448
+ const updateInterval = 2500;
449
+
450
+ function generateNextValue(prev: number) {
451
+ const step = Math.random() * 30 - 15;
452
+ return Math.max(0, Math.min(100, prev + step));
453
+ }
454
+
455
+ function generateInitialData() {
456
+ const data = [50];
457
+ for (let i = 1; i < dataCount; i++) {
458
+ data.push(generateNextValue(data[i - 1]));
459
+ }
460
+ return data;
461
+ }
462
+
463
+ function Chart() {
464
+ const [data, setData] = useState(generateInitialData);
465
+
466
+ useEffect(() => {
467
+ const intervalId = setInterval(() => {
468
+ setData((current) => {
469
+ const last = current[current.length - 1];
470
+ return [...current.slice(1), generateNextValue(last)];
471
+ });
472
+ }, updateInterval);
473
+ return () => clearInterval(intervalId);
474
+ }, []);
475
+
476
+ return (
477
+ <CartesianChart
478
+ height={{ base: 200, tablet: 225, desktop: 250 }}
479
+ inset={{ top: 16, bottom: 16, left: 16, right: 16 }}
480
+ series={[{ id: 'values', data }]}
481
+ aria-hidden="true"
482
+ >
483
+ <Line
484
+ seriesId="values"
485
+ strokeWidth={3}
486
+ transitions={{
487
+ enter: null,
488
+ update: { type: 'spring', stiffness: 900, damping: 120, mass: 8 },
489
+ }}
490
+ />
491
+ </CartesianChart>
492
+ );
493
+ }
494
+
495
+ return <Chart />;
496
+ }
497
+ ```
498
+
499
+ #### Mixed Transitions Per Child
500
+
501
+ Each child component can define its own transitions independently. Here, the `Line` uses a spring morph while the bars snap with no update animation. This lets you fine-tune each visual layer within a single chart.
502
+
503
+ ```tsx live
504
+ function MixedTransitions() {
505
+ const dataCount = 10;
506
+ const updateInterval = 2000;
507
+
508
+ function generateNextValue(prev: number) {
509
+ const step = Math.random() * 20 - 10;
510
+ return Math.max(10, Math.min(100, prev + step));
511
+ }
512
+
513
+ function generateInitialData() {
514
+ const data = [50];
515
+ for (let i = 1; i < dataCount; i++) {
516
+ data.push(generateNextValue(data[i - 1]));
517
+ }
518
+ return data;
519
+ }
520
+
521
+ function Chart() {
522
+ const [data, setData] = useState(generateInitialData);
523
+
524
+ useEffect(() => {
525
+ const intervalId = setInterval(() => {
526
+ setData((current) => {
527
+ const last = current[current.length - 1];
528
+ return [...current.slice(1), generateNextValue(last)];
529
+ });
530
+ }, updateInterval);
531
+ return () => clearInterval(intervalId);
532
+ }, []);
533
+
534
+ return (
535
+ <CartesianChart
536
+ height={{ base: 200, tablet: 225, desktop: 250 }}
537
+ inset={{ top: 16, bottom: 16, left: 16, right: 16 }}
538
+ series={[
539
+ { id: 'line', data, color: 'var(--color-accentBoldBlue)', yAxisId: 'default' },
540
+ {
541
+ id: 'bars',
542
+ data: data.map((d) => d * 0.3),
543
+ color: 'var(--color-accentBoldPurple)',
544
+ yAxisId: 'bars',
545
+ },
546
+ ]}
547
+ xAxis={{ scaleType: 'band' }}
548
+ yAxis={[
549
+ { id: 'default' },
550
+ { id: 'bars', range: ({ min, max }) => ({ min: max - 48, max }) },
551
+ ]}
552
+ aria-hidden="true"
553
+ >
554
+ <BarPlot
555
+ seriesIds={['bars']}
556
+ transitions={{
557
+ update: null,
558
+ enter: { type: 'tween', duration: 0.6 },
559
+ }}
560
+ />
561
+ <Line
562
+ seriesId="line"
563
+ strokeWidth={3}
564
+ transitions={{
565
+ update: { type: 'spring', stiffness: 700, damping: 20 },
566
+ }}
567
+ />
568
+ </CartesianChart>
569
+ );
570
+ }
571
+
572
+ return <Chart />;
573
+ }
574
+ ```
575
+
576
+ #### No Animations
577
+
578
+ You can disable all animations chart-wide by setting `animate` to `false` on CartesianChart. This is useful for static snapshots or when performance is a concern. Compare this to the animated examples above — data still updates, but changes snap instantly without any transition.
579
+
580
+ ```tsx live
581
+ function DisableAnimations() {
582
+ const dataCount = 15;
583
+ const updateInterval = 2500;
584
+
585
+ function generateNextValue(prev: number) {
586
+ const step = Math.random() * 30 - 15;
587
+ return Math.max(0, Math.min(100, prev + step));
588
+ }
589
+
590
+ function generateInitialData() {
591
+ const data = [50];
592
+ for (let i = 1; i < dataCount; i++) {
593
+ data.push(generateNextValue(data[i - 1]));
594
+ }
595
+ return data;
596
+ }
597
+
598
+ function Chart() {
599
+ const [data, setData] = useState(generateInitialData);
600
+
601
+ useEffect(() => {
602
+ const intervalId = setInterval(() => {
603
+ setData((current) => {
604
+ const last = current[current.length - 1];
605
+ return [...current.slice(1), generateNextValue(last)];
606
+ });
607
+ }, updateInterval);
608
+ return () => clearInterval(intervalId);
609
+ }, []);
610
+
611
+ return (
612
+ <CartesianChart
613
+ animate={false}
614
+ height={{ base: 200, tablet: 225, desktop: 250 }}
615
+ inset={{ top: 16, bottom: 16, left: 16, right: 16 }}
616
+ series={[{ id: 'values', data }]}
617
+ aria-hidden="true"
618
+ >
619
+ <Line seriesId="values" showArea strokeWidth={3} />
620
+ </CartesianChart>
621
+ );
622
+ }
623
+
624
+ return <Chart />;
625
+ }
626
+ ```
627
+
379
628
  ### Customization
380
629
 
381
630
  #### Price with Volume
@@ -402,7 +402,7 @@ function Points() {
402
402
 
403
403
  ### Animations
404
404
 
405
- You can configure chart transitions using `transition` on LineChart and `beaconTransitions` on [Scrubber](/components/graphs/Scrubber). You can also disable animations by setting the `animate` on LineChart to `false`.
405
+ You can configure chart transitions using `transitions`. The `transitions` prop accepts an object with `enter` (the clip-path reveal animation) and `update` (data change morph animation) keys. Set either to `null` to disable that animation phase. You can also disable all animations by setting `animate` on LineChart to `false`.
406
406
 
407
407
  ```jsx live
408
408
  function Transitions() {
@@ -526,12 +526,12 @@ function Transitions() {
526
526
  AreaComponent={MyGradient}
527
527
  seriesId="prices"
528
528
  strokeWidth={3}
529
- transition={myTransitionConfig}
529
+ transitions={{ update: myTransitionConfig }}
530
530
  />
531
531
  <Scrubber
532
532
  hideOverlay
533
- beaconTransitions={{ update: myTransitionConfig }}
534
533
  label={valueAtIndexFormatter}
534
+ transitions={{ update: myTransitionConfig }}
535
535
  />
536
536
  </CartesianChart>
537
537
  );
@@ -2021,7 +2021,8 @@ function ForecastAssetPrice() {
2021
2021
  | `textTransform` | `ResponsiveProp<none \| uppercase \| lowercase \| capitalize>` | No | `-` | - |
2022
2022
  | `top` | `ResponsiveProp<Top<string \| number>>` | No | `-` | - |
2023
2023
  | `transform` | `inherit \| none \| revert \| -moz-initial \| initial \| revert-layer \| unset` | No | `-` | - |
2024
- | `transition` | `Orchestration & Repeat & Tween \| Orchestration & Repeat & Spring \| Orchestration & Repeat & Keyframes \| Orchestration & Repeat & Inertia \| Orchestration & Repeat & Just \| Orchestration & Repeat & None \| Orchestration & Repeat & PermissiveTransitionDefinition \| Orchestration & Repeat & Tween & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Spring & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Keyframes & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Inertia & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Just & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & None & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & PermissiveTransitionDefinition & { [key: string]: TransitionDefinition; }` | No | `-` | Transition configuration for line animations. |
2024
+ | `transition` | `Orchestration & Repeat & Tween \| Orchestration & Repeat & Spring \| Orchestration & Repeat & Keyframes \| Orchestration & Repeat & Inertia \| Orchestration & Repeat & Just \| Orchestration & Repeat & None \| Orchestration & Repeat & PermissiveTransitionDefinition \| Orchestration & Repeat & Tween & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Spring & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Keyframes & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Inertia & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Just & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & None & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & PermissiveTransitionDefinition & { [key: string]: TransitionDefinition; }` | No | `-` | Transition for updates. |
2025
+ | `transitions` | `{ enter?: Transition$1 \| null; update?: Transition$1 \| null \| undefined; } \| undefined` | No | `transitions = {{ enter: { type: 'tween', duration: 0.5 }, update: { type: 'spring', stiffness: 900, damping: 120, mass: 4 } }}` | Transition configuration for enter and update animations. |
2025
2026
  | `type` | `dotted \| solid` | No | `'solid'` | The type of line to render. |
2026
2027
  | `userSelect` | `ResponsiveProp<text \| none \| all \| auto>` | No | `-` | - |
2027
2028
  | `visibility` | `ResponsiveProp<hidden \| visible>` | No | `-` | - |
@@ -10,19 +10,77 @@ import { Link } from '@coinbase/cds-web/typography/Link'
10
10
 
11
11
  ## Examples
12
12
 
13
- ### Default
13
+ Link renders a pressable [Text](/components/typography/Text) element as an anchor (`<a>`) by default. It inherits parent text styles and supports the same `font` and `color` props as Text.
14
14
 
15
- Default Link text will inherit parent text styles.
15
+ ### Basics
16
+
17
+ By default, Link inherits the text styles of its parent. Pass an `href` to set the destination URL.
18
+
19
+ ```jsx live
20
+ <Text font="body" as="p">
21
+ Check out the <Link href="https://www.coinbase.com/">Coinbase homepage</Link> for more info.
22
+ </Text>
23
+ ```
24
+
25
+ ### Underline
26
+
27
+ Use the `underline` prop to add a text decoration underline to the link. This is particularly important for inline links within body text to meet [WCAG 2.0 accessibility requirements](https://webaim.org/standards/wcag/checklist).
28
+
29
+ ```jsx live
30
+ <Text font="body" as="p">
31
+ Read our{' '}
32
+ <Link underline href="https://www.coinbase.com/">
33
+ terms and conditions
34
+ </Link>{' '}
35
+ before proceeding.
36
+ </Text>
37
+ ```
38
+
39
+ #### Underline with different fonts
40
+
41
+ The underline works across all font styles.
42
+
43
+ ```jsx live
44
+ <VStack alignItems="flex-start" gap={3}>
45
+ <Link underline font="body" href="https://www.coinbase.com/">
46
+ body link
47
+ </Link>
48
+ <Link underline font="label1" href="https://www.coinbase.com/">
49
+ label1 link
50
+ </Link>
51
+ <Link underline font="caption" href="https://www.coinbase.com/">
52
+ caption link
53
+ </Link>
54
+ <Link underline font="legal" href="https://www.coinbase.com/">
55
+ legal link
56
+ </Link>
57
+ <Link underline font="title2" href="https://www.coinbase.com/">
58
+ title2 link
59
+ </Link>
60
+ </VStack>
61
+ ```
62
+
63
+ #### Underline within a paragraph
64
+
65
+ When a link appears inline within body text, always use `underline` so users can distinguish the link from surrounding text without relying on color alone.
16
66
 
17
67
  ```jsx live
18
- <Link>Default is inherited text</Link>
68
+ <Text as="p" display="block" font="body">
69
+ This is a paragraph with an{' '}
70
+ <Link underline href="https://www.coinbase.com/">
71
+ inline underlined link
72
+ </Link>{' '}
73
+ that is clearly distinguishable from the surrounding text.
74
+ </Text>
19
75
  ```
20
76
 
21
- ### Styling your link
77
+ ### Styling
78
+
79
+ #### Font
22
80
 
23
- To style a `<Link />` component, simply wrap the `Link` node in the desired `Text` component, using the `as` prop for your usecase (for example, `p` for body text, `h1`/`h2`/`h3` for titles, etc). However, there may be times when a rendering a span is exactly what you want. In those cases, providing a font prop makes sense.
81
+ To style a Link, either wrap it in the desired [Text](/components/typography/Text) component with the appropriate `as` prop for semantic HTML, or use the `font` prop directly on the Link.
24
82
 
25
- Wrapping your Link in the appropriate Text element
83
+ ##### Wrapping in Text
26
84
 
27
85
  ```jsx live
28
86
  <VStack alignItems="flex-start" gap={3}>
@@ -69,9 +127,9 @@ Wrapping your Link in the appropriate Text element
69
127
  </VStack>
70
128
  ```
71
129
 
72
- ### Using the font prop
130
+ ##### Using the font prop
73
131
 
74
- If you find yourself in a situation where you simply need to style a link as a Text component without wrapping it in the semantically appropriate text element, reach for the `font` prop.
132
+ If you need to style a link without wrapping it in a semantically appropriate text element, use the `font` prop directly.
75
133
 
76
134
  ```jsx live
77
135
  <VStack alignItems="flex-start" gap={3}>
@@ -83,38 +141,51 @@ If you find yourself in a situation where you simply need to style a link as a T
83
141
  </VStack>
84
142
  ```
85
143
 
86
- ### Color override
87
-
88
- ```jsx live
89
- <Link href="https://www.coinbase.com/" color="fgNegative">
90
- With color override
91
- </Link>
92
- ```
144
+ #### Color
93
145
 
94
- ### openInNewWindow and rel props
146
+ Override the default link color using the `color` prop with any CDS foreground token.
95
147
 
96
148
  ```jsx live
97
149
  <VStack alignItems="flex-start" gap={3}>
98
- <Link font="title1" href="https://www.coinbase.com/" openInNewWindow>
99
- Open window in existing tab
150
+ <Link href="https://www.coinbase.com/" color="fgPrimary">
151
+ fgPrimary (default)
100
152
  </Link>
101
- <Link font="title2" href="https://www.coinbase.com/" rel="noreferrer">
102
- Sets rel to noreferrer
153
+ <Link href="https://www.coinbase.com/" color="fgNegative">
154
+ fgNegative
103
155
  </Link>
104
- <Link font="title3" href="https://www.coinbase.com/" rel="noopener">
105
- Sets rel to noopener
156
+ <Link underline href="https://www.coinbase.com/" color="fgNegative">
157
+ fgNegative with underline
106
158
  </Link>
107
159
  </VStack>
108
160
  ```
109
161
 
110
- ### Handling onClick
162
+ ### Navigation
163
+
164
+ #### openInNewWindow
165
+
166
+ Set `openInNewWindow` to open the link in a new browser tab.
111
167
 
112
168
  ```jsx live
113
- <Link font="headline" href="#tagname" onClick={() => console.log('pressed link')} rel="noopener">
114
- Handles onClick
169
+ <Link font="body" href="https://www.coinbase.com/" openInNewWindow>
170
+ Opens in a new tab
115
171
  </Link>
116
172
  ```
117
173
 
174
+ #### rel
175
+
176
+ Use the `rel` prop to set the relationship between the current document and the linked resource.
177
+
178
+ ```jsx live
179
+ <VStack alignItems="flex-start" gap={3}>
180
+ <Link font="body" href="https://www.coinbase.com/" rel="noreferrer">
181
+ rel=noreferrer
182
+ </Link>
183
+ <Link font="body" href="https://www.coinbase.com/" rel="noopener">
184
+ rel=noopener
185
+ </Link>
186
+ </VStack>
187
+ ```
188
+
118
189
  ### Accessibility
119
190
 
120
191
  :::tip Accessibility tip
@@ -127,6 +198,22 @@ _The link text must have a 3:1 contrast ratio from the surrounding non-link text
127
198
 
128
199
  :::
129
200
 
201
+ Use the `underline` prop on inline links within body text to ensure they are distinguishable without relying on color alone.
202
+
203
+ ```jsx live
204
+ <Text as="p" font="body">
205
+ By continuing, you agree to the{' '}
206
+ <Link underline href="https://www.coinbase.com/">
207
+ Terms of Service
208
+ </Link>{' '}
209
+ and{' '}
210
+ <Link underline href="https://www.coinbase.com/">
211
+ Privacy Policy
212
+ </Link>
213
+ .
214
+ </Text>
215
+ ```
216
+
130
217
  ## Props
131
218
 
132
219
  | Prop | Type | Required | Default | Description |
@@ -544,7 +544,8 @@ function ScatterplotWithCustomLabels() {
544
544
  | `textRendering` | `string \| number` | No | `-` | - |
545
545
  | `to` | `string \| number` | No | `-` | - |
546
546
  | `transform` | `string` | No | `-` | - |
547
- | `transition` | `Orchestration & Repeat & Tween \| Orchestration & Repeat & Spring \| Orchestration & Repeat & Keyframes \| Orchestration & Repeat & Inertia \| Orchestration & Repeat & Just \| Orchestration & Repeat & None \| Orchestration & Repeat & PermissiveTransitionDefinition \| Orchestration & Repeat & Tween & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Spring & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Keyframes & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Inertia & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Just & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & None & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & PermissiveTransitionDefinition & { [key: string]: TransitionDefinition; }` | No | `defaultTransition` | Transition configuration for animation. |
547
+ | `transition` | `Orchestration & Repeat & Tween \| Orchestration & Repeat & Spring \| Orchestration & Repeat & Keyframes \| Orchestration & Repeat & Inertia \| Orchestration & Repeat & Just \| Orchestration & Repeat & None \| Orchestration & Repeat & PermissiveTransitionDefinition \| Orchestration & Repeat & Tween & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Spring & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Keyframes & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Inertia & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & Just & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & None & { [key: string]: TransitionDefinition; } \| Orchestration & Repeat & PermissiveTransitionDefinition & { [key: string]: TransitionDefinition; }` | No | `-` | Transition for updates. |
548
+ | `transitions` | `{ enter?: Transition$1 \| null; update?: Transition$1 \| null \| undefined; } \| undefined` | No | `-` | Transition configuration for enter and update animations. |
548
549
  | `type` | `string` | No | `-` | - |
549
550
  | `u1` | `string \| number` | No | `-` | - |
550
551
  | `u2` | `string \| number` | No | `-` | - |
@@ -643,7 +643,7 @@ function DraggablePriceTarget() {
643
643
  | `beaconLabelMinGap` | `number` | No | `-` | Minimum gap between beacon labels to prevent overlap. Measured in pixels. |
644
644
  | `beaconLabelPreferredSide` | `left \| right` | No | `'right'` | Preferred side for beacon labels. |
645
645
  | `beaconStroke` | `string` | No | `'var(--color-bg)'` | Stroke color of the scrubber beacon circle. |
646
- | `beaconTransitions` | `{ update?: Transition$1; pulse?: Transition$1 \| undefined; pulseRepeatDelay?: number \| undefined; } \| undefined` | No | `-` | Transition configuration for the scrubber beacon. |
646
+ | `beaconTransitions` | `{ enter?: Transition$1 \| null; update?: Transition$1 \| null \| undefined; pulse?: Transition$1 \| undefined; pulseRepeatDelay?: number \| undefined; } \| undefined` | No | `-` | Transition configuration for the scrubber beacon. |
647
647
  | `classNames` | `{ overlay?: string; beacon?: string \| undefined; line?: string \| undefined; beaconLabel?: string \| undefined; } \| undefined` | No | `-` | Custom class names for individual elements of the Scrubber component |
648
648
  | `hideBeaconLabels` | `boolean` | No | `-` | Hides the beacon labels while keeping the line label visible (if provided). |
649
649
  | `hideLine` | `boolean` | No | `-` | Hides the scrubber line. |
@@ -651,7 +651,7 @@ function DraggablePriceTarget() {
651
651
  | `idlePulse` | `boolean` | No | `-` | Pulse the beacons while at rest. |
652
652
  | `key` | `Key \| null` | No | `-` | - |
653
653
  | `label` | `ChartTextChildren \| ((dataIndex: number) => ChartTextChildren)` | No | `-` | Label text displayed above the scrubber line. Can be a static string or a function that receives the current dataIndex. |
654
- | `labelBoundsInset` | `number \| ChartInset` | No | `{ top: 4, bottom: 20, left: 12, right: 12 } when labelElevated is true, otherwise none` | Bounds inset for the scrubber line label to prevent cutoff at chart edges. |
654
+ | `labelBoundsInset` | `number \| ChartInset` | No | `inset { top: 4, bottom: 20, left: 12, right: 12 } when labelElevated is true, otherwise none` | Bounds inset for the scrubber line label to prevent cutoff at chart edges. |
655
655
  | `labelElevated` | `boolean` | No | `-` | Whether to elevate the label with a shadow. When true, applies elevation and automatically adds bounds to keep label within chart area. |
656
656
  | `labelFont` | `ResponsiveProp<FontFamily \| inherit>` | No | `-` | Font style for the scrubber line label. |
657
657
  | `lineStroke` | `string` | No | `-` | Stroke color for the scrubber line. |
@@ -660,5 +660,6 @@ function DraggablePriceTarget() {
660
660
  | `seriesIds` | `string[]` | No | `-` | Array of series IDs to highlight when scrubbing with scrubber beacons. By default, all series will be highlighted. |
661
661
  | `styles` | `{ overlay?: CSSProperties; beacon?: CSSProperties \| undefined; line?: CSSProperties \| undefined; beaconLabel?: CSSProperties \| undefined; } \| undefined` | No | `-` | Custom styles for individual elements of the Scrubber component |
662
662
  | `testID` | `string` | No | `-` | Used to locate this element in unit and end-to-end tests. Under the hood, testID translates to data-testid on Web. On Mobile, testID stays the same - testID |
663
+ | `transitions` | `{ enter?: Transition$1 \| null; update?: Transition$1 \| null \| undefined; pulse?: Transition$1 \| undefined; pulseRepeatDelay?: number \| undefined; } \| undefined` | No | `-` | Transition configuration for the scrubber. Controls enter, update, and pulse animations for beacons and beacon labels. |
663
664
 
664
665
 
@@ -738,7 +738,7 @@ function PercentageBeaconLabels() {
738
738
  | `beaconLabelMinGap` | `number` | No | `-` | Minimum gap between beacon labels to prevent overlap. Measured in pixels. |
739
739
  | `beaconLabelPreferredSide` | `left \| right` | No | `'right'` | Preferred side for beacon labels. |
740
740
  | `beaconStroke` | `string` | No | `'var(--color-bg)'` | Stroke color of the scrubber beacon circle. |
741
- | `beaconTransitions` | `{ update?: Transition$1; pulse?: Transition$1 \| undefined; pulseRepeatDelay?: number \| undefined; } \| undefined` | No | `-` | Transition configuration for the scrubber beacon. |
741
+ | `beaconTransitions` | `{ enter?: Transition$1 \| null; update?: Transition$1 \| null \| undefined; pulse?: Transition$1 \| undefined; pulseRepeatDelay?: number \| undefined; } \| undefined` | No | `-` | Transition configuration for the scrubber beacon. |
742
742
  | `classNames` | `{ overlay?: string; beacon?: string \| undefined; line?: string \| undefined; beaconLabel?: string \| undefined; } \| undefined` | No | `-` | Custom class names for individual elements of the Scrubber component |
743
743
  | `hideBeaconLabels` | `boolean` | No | `-` | Hides the beacon labels while keeping the line label visible (if provided). |
744
744
  | `hideLine` | `boolean` | No | `-` | Hides the scrubber line. |
@@ -746,7 +746,7 @@ function PercentageBeaconLabels() {
746
746
  | `idlePulse` | `boolean` | No | `-` | Pulse the beacons while at rest. |
747
747
  | `key` | `Key \| null` | No | `-` | - |
748
748
  | `label` | `ChartTextChildren \| ((dataIndex: number) => ChartTextChildren)` | No | `-` | Label text displayed above the scrubber line. Can be a static string or a function that receives the current dataIndex. |
749
- | `labelBoundsInset` | `number \| ChartInset` | No | `{ top: 4, bottom: 20, left: 12, right: 12 } when labelElevated is true, otherwise none` | Bounds inset for the scrubber line label to prevent cutoff at chart edges. |
749
+ | `labelBoundsInset` | `number \| ChartInset` | No | `inset { top: 4, bottom: 20, left: 12, right: 12 } when labelElevated is true, otherwise none` | Bounds inset for the scrubber line label to prevent cutoff at chart edges. |
750
750
  | `labelElevated` | `boolean` | No | `-` | Whether to elevate the label with a shadow. When true, applies elevation and automatically adds bounds to keep label within chart area. |
751
751
  | `labelFont` | `ResponsiveProp<FontFamily \| inherit>` | No | `-` | Font style for the scrubber line label. |
752
752
  | `lineStroke` | `string` | No | `-` | Stroke color for the scrubber line. |
@@ -755,6 +755,7 @@ function PercentageBeaconLabels() {
755
755
  | `seriesIds` | `string[]` | No | `-` | Array of series IDs to highlight when scrubbing with scrubber beacons. By default, all series will be highlighted. |
756
756
  | `styles` | `{ overlay?: CSSProperties; beacon?: CSSProperties \| undefined; line?: CSSProperties \| undefined; beaconLabel?: CSSProperties \| undefined; } \| undefined` | No | `-` | Custom styles for individual elements of the Scrubber component |
757
757
  | `testID` | `string` | No | `-` | Used to locate this element in unit and end-to-end tests. Under the hood, testID translates to data-testid on Web. On Mobile, testID stays the same - testID |
758
+ | `transitions` | `{ enter?: Transition$1 \| null; update?: Transition$1 \| null \| undefined; pulse?: Transition$1 \| undefined; pulseRepeatDelay?: number \| undefined; } \| undefined` | No | `-` | Transition configuration for the scrubber. Controls enter, update, and pulse animations for beacons and beacon labels. |
758
759
 
759
760
 
760
761
  ## Styles
@@ -102,6 +102,49 @@ You can control the visual prominence of the Tag using the `emphasis` prop. By d
102
102
  </VStack>
103
103
  ```
104
104
 
105
+ ### Icons
106
+
107
+ Use the `startIcon` and `endIcon` props to render an icon at the start or end of the tag.
108
+
109
+ ```jsx live
110
+ <VStack gap={2} alignItems="flex-start">
111
+ <Tag colorScheme="blue" startIcon="add">
112
+ Start icon
113
+ </Tag>
114
+ <Tag colorScheme="green" endIcon="add">
115
+ End icon
116
+ </Tag>
117
+ <Tag colorScheme="purple" startIcon="add" endIcon="add">
118
+ Both icons
119
+ </Tag>
120
+ <Tag colorScheme="red" intent="promotional" startIcon="add" endIcon="add">
121
+ Promotional with icons
122
+ </Tag>
123
+ </VStack>
124
+ ```
125
+
126
+ ### Custom Nodes
127
+
128
+ Use the `start` and `end` props to render custom nodes at the start or end of the tag for full control over styling.
129
+
130
+ ```jsx live
131
+ <VStack gap={2} alignItems="flex-start">
132
+ <Tag colorScheme="blue" start={<Icon color="fgNegative" name="add" size="xs" />}>
133
+ Custom start node
134
+ </Tag>
135
+ <Tag colorScheme="green" end={<Icon color="fgPositive" name="add" size="xs" />}>
136
+ Custom end node
137
+ </Tag>
138
+ <Tag
139
+ colorScheme="purple"
140
+ start={<Icon color="fgPositive" name="add" size="xs" />}
141
+ end={<Icon color="fgNegative" name="close" size="xs" />}
142
+ >
143
+ Both custom nodes
144
+ </Tag>
145
+ </VStack>
146
+ ```
147
+
105
148
  ### Composed Examples
106
149
 
107
150
  #### Account Status
@@ -284,6 +327,9 @@ function MarginExample() {
284
327
  | `display` | `ResponsiveProp<grid \| revert \| none \| block \| inline \| inline-block \| flex \| inline-flex \| inline-grid \| contents \| flow-root \| list-item>` | No | `-` | - |
285
328
  | `elevation` | `0 \| 1 \| 2` | No | `-` | - |
286
329
  | `emphasis` | `low \| high` | No | `'low' when informational intent, 'high' when promotional intent` | Specify the emphasis of the Tag. |
330
+ | `end` | `null \| string \| number \| false \| true \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal` | No | `-` | Set the end node |
331
+ | `endIcon` | `key \| search \| pin \| filter \| visible \| continuous \| auto \| loop \| warning \| error \| account \| activity \| add \| addPeople \| advancedMarketSelector \| advancedTradeProduct \| affiliates \| airdrop \| airdropAlt \| airdropCoins \| airdropParachute \| alien \| allTimeHigh \| allocation \| annotation \| api \| apiPlug \| apothecary \| appSwitcher \| apple \| appleLogo \| application \| arrowDown \| arrowLeft \| arrowRight \| arrowUp \| arrowsHorizontal \| arrowsUpDown \| arrowsVertical \| artwork \| assetHubProduct \| assetManagementProduct \| astronautHelmet \| atSign \| atomScience \| autoCar \| avatar \| average \| backArrow \| ballot \| ballotbox \| bandage \| bank \| barChartSimple \| barChartWindow \| base \| baseApps \| baseFeed \| baseNotification \| baseQuickBuy \| baseSquare \| baseTransact \| baseVerification \| baseWallet \| baseball \| basketball \| beaker \| beginningArrow \| bell \| bellCheck \| bellPlus \| birthcertificate \| block \| blockchain \| blog \| book \| bookmark \| borrowProduct \| boxing \| bridging \| briefcase \| briefcaseAlt \| browser \| bug \| building \| calculator \| calendar \| calendarBlank \| calendarDates \| calendarEmpty \| calendarHeart \| calendarMoney \| calendarStar \| camera \| candlesticks \| car \| card \| caret \| caretDown \| caretLeft \| caretRight \| caretUp \| cash \| cashAustralianDollar \| cashBrazilianReal \| cashBrazillianReal \| cashCanadianDollar \| cashCoins \| cashEUR \| cashGBP \| cashIndonesianRupiah \| cashJPY \| cashPhilippinePeso \| cashPolishZloty \| cashRupee \| cashSingaporeDollar \| cashSwissFranc \| cashThaiBaht \| cashTurkishLira \| cashUSD \| cashUaeDirham \| cashVietnameseDong \| chainLink \| chartBar \| chartCandles \| chartLine \| chartPie \| chartPieCircle \| chartVolume \| chatBotAgent \| chatBubble \| chatRequests \| checkboxChecked \| checkboxEmpty \| checkmark \| chess \| circleCheckmark \| circleCross \| circulatingSupply \| city \| clipboard \| clock \| clockOutline \| close \| closeCaption \| clothing \| cloud \| cloudPartial \| cloudProduct \| cluster \| coinbase \| coinbaseCardProduct \| coinbaseOne \| coinbaseOneCard \| coinbaseOneLogo \| coinbaseRewards \| coinsCrypto \| collapse \| collectibles \| collection \| comment \| commentPlus \| commerceProduct \| compass \| complianceProduct \| compose \| computerChip \| concierge \| conciergeBell \| config \| convert \| copy \| corporation \| creatorCoin \| cricket \| cross \| crossTrade \| crypto \| cryptobasics \| crystalBall \| crystalBallInsight \| currencies \| custodyProduct \| dashboard \| dataMarketplaceProduct \| dataStack \| defi \| delegateProduct \| deposit \| derivatives \| derivativesProduct \| derivativesProductNew \| developerAPIProduct \| developerPlatformProduct \| dex \| diagonalDownArrow \| diagonalRightArrow \| diagonalUpArrow \| diamond \| diamondIncentives \| dinnerPlate \| directDeposit \| directDepositIcon \| disabledPhone \| discordLogo \| distribution \| document \| documentation \| dot \| doubleChevronRight \| downArrow \| download \| drag \| drops \| earn \| earnProduct \| earnRewards \| earthquake \| educationBook \| educationPencil \| email \| endArrow \| entertainment \| ethereum \| eventContracts \| exchangeProduct \| exclamationMark \| expand \| expandAddress \| expandAll \| externalLink \| eye \| faceScan \| faces \| factory \| faucet \| fib \| filmStrip \| fingerprint \| flame \| folder \| folderArrow \| folderOpen \| followAdd \| following \| football \| fork \| forwardArrow \| fscsProtection \| gab \| games \| gaming \| gasFees \| gasFeesAlt \| gauge \| gaugeEmpty \| gaugeHigh \| gaugeHighLow \| gaugeHighMid \| gaugeLow \| gaugeLowHigh \| gaugeLowMid \| gaugeMedium \| gavel \| gear \| generalCharacter \| ghost \| gif \| giftBox \| giftCard \| gitHubLogo \| globe \| golf \| googleLogo \| greenEnergy \| grid \| group \| hamburger \| hammer \| heart \| helpCenterProduct \| helpCenterQuestionMark \| hiddenEye \| hockey \| home \| horizontalLine \| hospital \| hospitalCross \| hurricane \| ideal \| identityCard \| image \| info \| initiator \| instagramLogo \| instantUnstakingClock \| institute \| institutionalProduct \| interest \| invisible \| invoice \| keyboard \| laptop \| leadChart \| leadCoin \| learningRewardsProduct \| light \| lightbulb \| lightning \| lightningBolt \| lineChartCrypto \| list \| location \| lock \| login \| logout \| magnifyingGlass \| marketCap \| medal \| megaphone \| menu \| metaverse \| microphone \| microphoneCordless \| microscope \| mint \| minus \| mma \| moneyCardCoin \| moon \| more \| moreVertical \| motorsport \| music \| musicArticles \| needle \| newsFeed \| newsletter \| nft \| nftBuy \| nftOffer \| nftProduct \| nftSale \| noRocket \| noWifi \| nodeProduct \| oil \| options \| orderBook \| orderHistory \| outline \| pFPS \| paperAirplane \| paperclip \| participate \| participateProduct \| passKey \| passport \| pause \| pay \| payProduct \| paymentCard \| payments \| payouts \| paypal \| pencil \| peopleGroup \| peopleStar \| percentage \| perpetualSwap \| phone \| pieChartData \| pillBottle \| pillCapsule \| plane \| planet \| play \| playbutton \| plusMinus \| podiumStar \| politicsBuilding \| politicsCandidate \| politicsFlag \| politicsGavel \| politicsPodium \| politicsStar \| powerTool \| priceAlerts \| priceAlertsCheck \| primePoduct \| privateClientProduct \| proProduct \| profile \| protection \| pulse \| pyramid \| qrCode \| qrCodeAlt \| queryTransact \| questionMark \| quotation \| rain \| ratingsCheck \| ratingsChecks \| ratingsStar \| reCenter \| rectangle \| recurring \| refresh \| regulated \| regulatedFutures \| report \| rewardsProduct \| ribbon \| robot \| rocket \| rocketShip \| rollingSpot \| rosettaProduct \| rottenTomato \| royalty \| safe \| save \| savingsBank \| scanQrCode \| scienceAtom \| scienceBeaker \| scienceMoon \| securityKey \| securityShield \| seen \| sendReceive \| setPinCode \| settings \| share \| shield \| shieldOutline \| shoe \| shoppingCart \| signinProduct \| singleCoin \| singleNote \| singlecloud \| smartContract \| snow \| soccer \| socialChat \| socialReshare \| socialShare \| sofort \| sortDoubleArrow \| sortDown \| sortDownCenter \| sortUp \| sortUpCenter \| soundOff \| soundOn \| sparkle \| speaker \| speechBubble \| stableCoin \| stablecoinStack \| staggeredList \| stake \| staking \| star \| starAward \| starBubble \| starTrophy \| statusDot \| step0 \| step1 \| step2 \| step3 \| step4 \| step5 \| step6 \| step7 \| step8 \| step9 \| strategy \| sun \| support \| tag \| taxes \| taxesReceipt \| telephone \| tennis \| test \| thermometer \| thumbsDown \| thumbsDownOutline \| thumbsUp \| thumbsUpOutline \| tokenLaunchCoin \| tokenLaunchRocket \| tokenSales \| tornado \| trading \| transactions \| trashCan \| trophy \| trophyCup \| tshirt \| tv \| tvStand \| twitterLogo \| ultility \| umbrella \| undo \| unfollowPeople \| unknown \| unlock \| upArrow \| upload \| venturesProduct \| verifiedBadge \| verifiedPools \| verticalLine \| virus \| waasProduct \| wallet \| walletLogo \| walletProduct \| webhooks \| wellness \| wifi \| wind \| wireTransfer \| withdraw \| wrapToken \| xLogo` | No | `-` | Icon to render at the end of the tag. |
332
+ | `endIconActive` | `boolean` | No | `-` | Whether the end icon is active |
287
333
  | `flexBasis` | `ResponsiveProp<FlexBasis<string \| number>>` | No | `-` | - |
288
334
  | `flexDirection` | `ResponsiveProp<column \| row \| row-reverse \| column-reverse>` | No | `-` | - |
289
335
  | `flexGrow` | `inherit \| revert \| -moz-initial \| initial \| revert-layer \| unset` | No | `-` | - |
@@ -341,6 +387,9 @@ function MarginExample() {
341
387
  | `ref` | `RefObject<HTMLDivElement> \| ((instance: HTMLDivElement \| null) => void) \| null` | No | `-` | - |
342
388
  | `right` | `ResponsiveProp<Right<string \| number>>` | No | `-` | - |
343
389
  | `rowGap` | `0 \| 1 \| 2 \| 0.25 \| 0.5 \| 0.75 \| 1.5 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10` | No | `-` | - |
390
+ | `start` | `null \| string \| number \| false \| true \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal` | No | `-` | Set the start node |
391
+ | `startIcon` | `key \| search \| pin \| filter \| visible \| continuous \| auto \| loop \| warning \| error \| account \| activity \| add \| addPeople \| advancedMarketSelector \| advancedTradeProduct \| affiliates \| airdrop \| airdropAlt \| airdropCoins \| airdropParachute \| alien \| allTimeHigh \| allocation \| annotation \| api \| apiPlug \| apothecary \| appSwitcher \| apple \| appleLogo \| application \| arrowDown \| arrowLeft \| arrowRight \| arrowUp \| arrowsHorizontal \| arrowsUpDown \| arrowsVertical \| artwork \| assetHubProduct \| assetManagementProduct \| astronautHelmet \| atSign \| atomScience \| autoCar \| avatar \| average \| backArrow \| ballot \| ballotbox \| bandage \| bank \| barChartSimple \| barChartWindow \| base \| baseApps \| baseFeed \| baseNotification \| baseQuickBuy \| baseSquare \| baseTransact \| baseVerification \| baseWallet \| baseball \| basketball \| beaker \| beginningArrow \| bell \| bellCheck \| bellPlus \| birthcertificate \| block \| blockchain \| blog \| book \| bookmark \| borrowProduct \| boxing \| bridging \| briefcase \| briefcaseAlt \| browser \| bug \| building \| calculator \| calendar \| calendarBlank \| calendarDates \| calendarEmpty \| calendarHeart \| calendarMoney \| calendarStar \| camera \| candlesticks \| car \| card \| caret \| caretDown \| caretLeft \| caretRight \| caretUp \| cash \| cashAustralianDollar \| cashBrazilianReal \| cashBrazillianReal \| cashCanadianDollar \| cashCoins \| cashEUR \| cashGBP \| cashIndonesianRupiah \| cashJPY \| cashPhilippinePeso \| cashPolishZloty \| cashRupee \| cashSingaporeDollar \| cashSwissFranc \| cashThaiBaht \| cashTurkishLira \| cashUSD \| cashUaeDirham \| cashVietnameseDong \| chainLink \| chartBar \| chartCandles \| chartLine \| chartPie \| chartPieCircle \| chartVolume \| chatBotAgent \| chatBubble \| chatRequests \| checkboxChecked \| checkboxEmpty \| checkmark \| chess \| circleCheckmark \| circleCross \| circulatingSupply \| city \| clipboard \| clock \| clockOutline \| close \| closeCaption \| clothing \| cloud \| cloudPartial \| cloudProduct \| cluster \| coinbase \| coinbaseCardProduct \| coinbaseOne \| coinbaseOneCard \| coinbaseOneLogo \| coinbaseRewards \| coinsCrypto \| collapse \| collectibles \| collection \| comment \| commentPlus \| commerceProduct \| compass \| complianceProduct \| compose \| computerChip \| concierge \| conciergeBell \| config \| convert \| copy \| corporation \| creatorCoin \| cricket \| cross \| crossTrade \| crypto \| cryptobasics \| crystalBall \| crystalBallInsight \| currencies \| custodyProduct \| dashboard \| dataMarketplaceProduct \| dataStack \| defi \| delegateProduct \| deposit \| derivatives \| derivativesProduct \| derivativesProductNew \| developerAPIProduct \| developerPlatformProduct \| dex \| diagonalDownArrow \| diagonalRightArrow \| diagonalUpArrow \| diamond \| diamondIncentives \| dinnerPlate \| directDeposit \| directDepositIcon \| disabledPhone \| discordLogo \| distribution \| document \| documentation \| dot \| doubleChevronRight \| downArrow \| download \| drag \| drops \| earn \| earnProduct \| earnRewards \| earthquake \| educationBook \| educationPencil \| email \| endArrow \| entertainment \| ethereum \| eventContracts \| exchangeProduct \| exclamationMark \| expand \| expandAddress \| expandAll \| externalLink \| eye \| faceScan \| faces \| factory \| faucet \| fib \| filmStrip \| fingerprint \| flame \| folder \| folderArrow \| folderOpen \| followAdd \| following \| football \| fork \| forwardArrow \| fscsProtection \| gab \| games \| gaming \| gasFees \| gasFeesAlt \| gauge \| gaugeEmpty \| gaugeHigh \| gaugeHighLow \| gaugeHighMid \| gaugeLow \| gaugeLowHigh \| gaugeLowMid \| gaugeMedium \| gavel \| gear \| generalCharacter \| ghost \| gif \| giftBox \| giftCard \| gitHubLogo \| globe \| golf \| googleLogo \| greenEnergy \| grid \| group \| hamburger \| hammer \| heart \| helpCenterProduct \| helpCenterQuestionMark \| hiddenEye \| hockey \| home \| horizontalLine \| hospital \| hospitalCross \| hurricane \| ideal \| identityCard \| image \| info \| initiator \| instagramLogo \| instantUnstakingClock \| institute \| institutionalProduct \| interest \| invisible \| invoice \| keyboard \| laptop \| leadChart \| leadCoin \| learningRewardsProduct \| light \| lightbulb \| lightning \| lightningBolt \| lineChartCrypto \| list \| location \| lock \| login \| logout \| magnifyingGlass \| marketCap \| medal \| megaphone \| menu \| metaverse \| microphone \| microphoneCordless \| microscope \| mint \| minus \| mma \| moneyCardCoin \| moon \| more \| moreVertical \| motorsport \| music \| musicArticles \| needle \| newsFeed \| newsletter \| nft \| nftBuy \| nftOffer \| nftProduct \| nftSale \| noRocket \| noWifi \| nodeProduct \| oil \| options \| orderBook \| orderHistory \| outline \| pFPS \| paperAirplane \| paperclip \| participate \| participateProduct \| passKey \| passport \| pause \| pay \| payProduct \| paymentCard \| payments \| payouts \| paypal \| pencil \| peopleGroup \| peopleStar \| percentage \| perpetualSwap \| phone \| pieChartData \| pillBottle \| pillCapsule \| plane \| planet \| play \| playbutton \| plusMinus \| podiumStar \| politicsBuilding \| politicsCandidate \| politicsFlag \| politicsGavel \| politicsPodium \| politicsStar \| powerTool \| priceAlerts \| priceAlertsCheck \| primePoduct \| privateClientProduct \| proProduct \| profile \| protection \| pulse \| pyramid \| qrCode \| qrCodeAlt \| queryTransact \| questionMark \| quotation \| rain \| ratingsCheck \| ratingsChecks \| ratingsStar \| reCenter \| rectangle \| recurring \| refresh \| regulated \| regulatedFutures \| report \| rewardsProduct \| ribbon \| robot \| rocket \| rocketShip \| rollingSpot \| rosettaProduct \| rottenTomato \| royalty \| safe \| save \| savingsBank \| scanQrCode \| scienceAtom \| scienceBeaker \| scienceMoon \| securityKey \| securityShield \| seen \| sendReceive \| setPinCode \| settings \| share \| shield \| shieldOutline \| shoe \| shoppingCart \| signinProduct \| singleCoin \| singleNote \| singlecloud \| smartContract \| snow \| soccer \| socialChat \| socialReshare \| socialShare \| sofort \| sortDoubleArrow \| sortDown \| sortDownCenter \| sortUp \| sortUpCenter \| soundOff \| soundOn \| sparkle \| speaker \| speechBubble \| stableCoin \| stablecoinStack \| staggeredList \| stake \| staking \| star \| starAward \| starBubble \| starTrophy \| statusDot \| step0 \| step1 \| step2 \| step3 \| step4 \| step5 \| step6 \| step7 \| step8 \| step9 \| strategy \| sun \| support \| tag \| taxes \| taxesReceipt \| telephone \| tennis \| test \| thermometer \| thumbsDown \| thumbsDownOutline \| thumbsUp \| thumbsUpOutline \| tokenLaunchCoin \| tokenLaunchRocket \| tokenSales \| tornado \| trading \| transactions \| trashCan \| trophy \| trophyCup \| tshirt \| tv \| tvStand \| twitterLogo \| ultility \| umbrella \| undo \| unfollowPeople \| unknown \| unlock \| upArrow \| upload \| venturesProduct \| verifiedBadge \| verifiedPools \| verticalLine \| virus \| waasProduct \| wallet \| walletLogo \| walletProduct \| webhooks \| wellness \| wifi \| wind \| wireTransfer \| withdraw \| wrapToken \| xLogo` | No | `-` | Icon to render at the start of the tag. |
392
+ | `startIconActive` | `boolean` | No | `-` | Whether the start icon is active |
344
393
  | `style` | `CSSProperties` | No | `-` | - |
345
394
  | `testID` | `string` | No | `-` | Used to locate this element in unit and end-to-end tests. Under the hood, testID translates to data-testid on Web. On Mobile, testID stays the same - testID |
346
395
  | `textAlign` | `ResponsiveProp<center \| start \| end \| justify>` | No | `-` | - |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cds-mcp-server",
3
- "version": "8.47.4",
3
+ "version": "8.48.1",
4
4
  "description": "Coinbase Design System - MCP Server",
5
5
  "repository": {
6
6
  "type": "git",