@coinbase/cds-mcp-server 8.20.1 → 8.21.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.21.0 ((11/12/2025, 11:45 AM PST))
12
+
13
+ This is an artificial version bump with no new change.
14
+
15
+ ## 8.20.2 ((11/12/2025, 10:01 AM PST))
16
+
17
+ This is an artificial version bump with no new change.
18
+
11
19
  ## 8.20.1 ((11/7/2025, 01:20 PM PST))
12
20
 
13
21
  This is an artificial version bump with no new change.
@@ -0,0 +1,174 @@
1
+ # TabbedChipsAlpha
2
+
3
+ A chip component commonly used in filter context to refine a date source
4
+
5
+ ## Import
6
+
7
+ ```tsx
8
+ import { TabbedChips } from '@coinbase/cds-mobile/alpha/tabbed-chips/TabbedChips'
9
+ ```
10
+
11
+ ## Examples
12
+
13
+ ### Basic usage
14
+
15
+ ```tsx
16
+ function ExampleDefault() {
17
+ const tabs = [
18
+ { id: 'all', label: 'All' },
19
+ { id: 'swap', label: 'Swap' },
20
+ { id: 'collect', label: 'Collect' },
21
+ { id: 'bridge', label: 'Bridge' },
22
+ ];
23
+ const [activeTab, setActiveTab] = useState(tabs[0]);
24
+ return <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />;
25
+ }
26
+ ```
27
+
28
+ ### Compact
29
+
30
+ ```tsx
31
+ function ExampleCompactNoStart() {
32
+ const tabs = [
33
+ { id: 'all', label: 'All' },
34
+ { id: 'swap', label: 'Swap' },
35
+ { id: 'collect', label: 'Collect' },
36
+ { id: 'bridge', label: 'Bridge' },
37
+ ];
38
+ const [activeTab, setActiveTab] = useState(tabs[0]);
39
+ return <TabbedChips activeTab={activeTab} compact onChange={setActiveTab} tabs={tabs} />;
40
+ }
41
+ ```
42
+
43
+ ### Many tabs (scrollable)
44
+
45
+ :::tip Scrolling behavior
46
+ The list becomes horizontally scrollable when content overflows; an `OverflowGradient` appears on the edge to hint more content.
47
+ :::
48
+
49
+ ```tsx
50
+ function ExampleManyTabs() {
51
+ const tabs = Array.from({ length: 12 }).map((_, i) => ({
52
+ id: `tab_${i + 1}`,
53
+ label: `Tab ${i + 1}`,
54
+ }));
55
+ const [activeTab, setActiveTab] = useState(tabs[0]);
56
+ return <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />;
57
+ }
58
+ ```
59
+
60
+ ### Long text tabs
61
+
62
+ ```tsx
63
+ function ExampleLongText() {
64
+ const tabs = [
65
+ { id: 'a', label: 'Very long tab label that can wrap on small widths' },
66
+ { id: 'b', label: 'Another extra long label to test overflow' },
67
+ { id: 'c', label: 'Short' },
68
+ ];
69
+ const [activeTab, setActiveTab] = useState(tabs[0]);
70
+ return <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />;
71
+ }
72
+ ```
73
+
74
+ ### Disabled tab
75
+
76
+ ```tsx
77
+ function ExampleDisabled() {
78
+ const tabs = [
79
+ { id: 'first', label: 'First' },
80
+ { id: 'second', label: 'Second', disabled: true },
81
+ { id: 'third', label: 'Third' },
82
+ ];
83
+ const [activeTab, setActiveTab] = useState(tabs[0]);
84
+ return <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />;
85
+ }
86
+ ```
87
+
88
+ ### With start media
89
+
90
+ :::tip Media sizing
91
+ For start media, use circular images sized 24×24 for regular chips and 16×16 for compact chips.
92
+ :::
93
+
94
+ ```tsx
95
+ function ExampleWithStart() {
96
+ const icon = { height: 24, width: 24, shape: 'circle', source: assets.eth.imageUrl };
97
+ const compactIcon = { height: 16, width: 16, shape: 'circle', source: assets.eth.imageUrl };
98
+ const tabs = [
99
+ { id: 'all', label: 'All', start: <RemoteImage {...icon} /> },
100
+ { id: 'swap', label: 'Swap', start: <RemoteImage {...icon} /> },
101
+ { id: 'collect', label: 'Collect', start: <RemoteImage {...icon} /> },
102
+ { id: 'bridge', label: 'Bridge', start: <RemoteImage {...icon} /> },
103
+ ];
104
+ const compactTabs = tabs.map((tab) => ({ ...tab, start: <RemoteImage {...compactIcon} /> }));
105
+ const [activeTab, setActiveTab] = useState(tabs[0]);
106
+ return (
107
+ <VStack gap={2}>
108
+ <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />
109
+ <TabbedChips compact activeTab={activeTab} onChange={setActiveTab} tabs={compactTabs} />
110
+ </VStack>
111
+ );
112
+ }
113
+ ```
114
+
115
+ ### Custom TabComponent
116
+
117
+ :::tip Custom Tab behavior
118
+ When providing a custom TabComponent, use `useTabsContext()` and call `updateActiveTab(id)` to update selection state. Reflect the active state (e.g., end icon state) based on `activeTab?.id === id`.
119
+ :::
120
+
121
+ ```tsx
122
+ function CustomTab({ id, label, ...props }: TabbedChipProps) {
123
+ const { activeTab, updateActiveTab } = useTabsContext();
124
+ const isActive = activeTab?.id === id;
125
+ return (
126
+ <MediaChip
127
+ onPress={() => updateActiveTab(id)}
128
+ end={<Icon size="s" active={isActive} name="star" />}
129
+ {...props}
130
+ >
131
+ {label}
132
+ </MediaChip>
133
+ );
134
+ }
135
+
136
+ const tabs = [
137
+ { id: 'all', label: 'All' },
138
+ { id: 'swap', label: 'Swap' },
139
+ { id: 'collect', label: 'Collect' },
140
+ ];
141
+
142
+ function Example() {
143
+ const [activeTab, setActiveTab] = useState(tabs[0]);
144
+ return (
145
+ <TabbedChips
146
+ activeTab={activeTab}
147
+ onChange={setActiveTab}
148
+ tabs={tabs}
149
+ TabComponent={CustomTab}
150
+ />
151
+ );
152
+ }
153
+
154
+ render(<Example />);
155
+ ```
156
+
157
+ ## Props
158
+
159
+ | Prop | Type | Required | Default | Description |
160
+ | --- | --- | --- | --- | --- |
161
+ | `activeTab` | `TabValue<T> \| null` | Yes | `-` | React state for the currently active tab. Setting it to null results in no active tab. |
162
+ | `onChange` | `(activeTab: TabValue<T> \| null) => void` | Yes | `-` | Callback that is fired when the active tab changes. Use this callback to update the activeTab state. |
163
+ | `tabs` | `TabbedChipProps<T>[]` | Yes | `-` | - |
164
+ | `TabComponent` | `FC<TabbedChipProps<T>>` | No | `-` | - |
165
+ | `TabsActiveIndicatorComponent` | `TabsActiveIndicatorComponent` | No | `-` | - |
166
+ | `compact` | `boolean` | No | `false` | Turn on to use a compact Chip component for each tab. |
167
+ | `disabled` | `boolean` | No | `-` | Disable interactions on all the tabs. |
168
+ | `gap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `1` | The spacing between Tabs |
169
+ | `ref` | `null \| (instance: View \| null) => void \| MutableRefObject<View \| null>` | No | `-` | - |
170
+ | `styles` | `{ root?: StyleProp<ViewStyle>; tabs?: StyleProp<ViewStyle>; }` | No | `-` | - |
171
+ | `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 |
172
+ | `width` | `string \| number` | No | `-` | The width of the scroll container, defaults to 100% of the parent container If the tabs are wider than the width of the container, paddles will be shown to scroll the tabs. |
173
+
174
+
@@ -59,7 +59,7 @@ function ToastExample() {
59
59
 
60
60
  const handleVariant = () => {
61
61
  toast.show('Toast copy', {
62
- variant: 'negative',
62
+ variant: 'bgNegative',
63
63
  });
64
64
  };
65
65
 
@@ -147,7 +147,7 @@ The `color` variables have semantic names which describe their application in th
147
147
  const theme = useTheme();
148
148
  theme.lightSpectrum.gray0; // "255,255,255"
149
149
  theme.darkSpectrum.gray0; // "10,11,13"
150
- theme.spectrum.gray100; // "255,255,255" or "10,11,13", depends on activeColorScheme
150
+ theme.spectrum.gray0; // "255,255,255" or "10,11,13", depends on activeColorScheme
151
151
  theme.lightColor.bg; // "rgb(255,255,255)"
152
152
  theme.darkColor.bg; // "rgb(10,11,13)"
153
153
  theme.color.bg; // "rgb(255,255,255)" or "rgb(10,11,13)", depends on activeColorScheme
@@ -34,6 +34,7 @@
34
34
  - [Tour](mobile/components/Tour.txt): Creates guided tours of a user interface.
35
35
  - [TopNavBar](mobile/components/TopNavBar.txt): A customizable top navigation bar that can contain start, middle, and end content, as well as a bottom section for elements like tabs. It remains sticky at the top of the screen.
36
36
  - [Tabs](mobile/components/Tabs.txt): Tabs is a flexible, accessible tab navigation component for React Native, supporting animated indicators, custom tab components, and full accessibility.
37
+ - [TabbedChipsAlpha](mobile/components/TabbedChipsAlpha.txt): A chip component commonly used in filter context to refine a date source
37
38
  - [TabbedChips](mobile/components/TabbedChips.txt): Tab chips are to be used in a filter setting where the user is given the ability to refine the data source they are accessing.
38
39
  - [TabNavigation](mobile/components/TabNavigation.txt): Organizes content across different screens or data sets.
39
40
  - [TabLabel](mobile/components/TabLabel.txt): A text label component used within tab navigation.
@@ -39,7 +39,7 @@ function TabbedChipsExample() {
39
39
  <TextTitle3 as="p">Popular assets</TextTitle3>
40
40
  </VStack>
41
41
  <SearchInput compact placeholder="Search by name" />
42
- <TabbedChips value={value} onChange={setValue} tabs={tabs} />
42
+ <OldTabbedChips value={value} onChange={setValue} tabs={tabs} />
43
43
  </VStack>
44
44
  );
45
45
  }
@@ -0,0 +1,202 @@
1
+ # TabbedChipsAlpha
2
+
3
+ A chip component commonly used in filter context to refine a date source
4
+
5
+ ## Import
6
+
7
+ ```tsx
8
+ import { TabbedChips } from '@coinbase/cds-web/alpha/tabbed-chips/TabbedChips'
9
+ ```
10
+
11
+ ## Examples
12
+
13
+ ### Basic usage
14
+
15
+ ```jsx live
16
+ function ExampleDefault() {
17
+ const tabs = [
18
+ { id: 'all', label: 'All' },
19
+ { id: 'swap', label: 'Swap' },
20
+ { id: 'collect', label: 'Collect' },
21
+ { id: 'bridge', label: 'Bridge' },
22
+ ];
23
+ const [activeTab, setActiveTab] = useState(tabs[0]);
24
+ return <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />;
25
+ }
26
+ ```
27
+
28
+ ### Compact
29
+
30
+ ```jsx live
31
+ function ExampleCompactNoStart() {
32
+ const tabs = [
33
+ { id: 'all', label: 'All' },
34
+ { id: 'swap', label: 'Swap' },
35
+ { id: 'collect', label: 'Collect' },
36
+ { id: 'bridge', label: 'Bridge' },
37
+ ];
38
+ const [activeTab, setActiveTab] = useState(tabs[0]);
39
+ return <TabbedChips activeTab={activeTab} compact onChange={setActiveTab} tabs={tabs} />;
40
+ }
41
+ ```
42
+
43
+ ### Many tabs (paddles)
44
+
45
+ :::tip Paddles & overflow
46
+ Paddles appear automatically when the tab list overflows.
47
+ :::
48
+
49
+ ```jsx live
50
+ function ExampleWithPaddles() {
51
+ const tabs = Array.from({ length: 12 }).map((_, i) => ({
52
+ id: `tab_${i + 1}`,
53
+ label: `Tab ${i + 1}`,
54
+ }));
55
+ const [activeTab, setActiveTab] = useState(tabs[0]);
56
+ return <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />;
57
+ }
58
+ ```
59
+
60
+ ### With custom sized paddles
61
+
62
+ :::tip Paddle styling
63
+ You can adjust the size of the paddles via `styles.paddle`.
64
+ :::
65
+
66
+ ```jsx live
67
+ function ExampleCustomPaddles() {
68
+ const tabs = Array.from({ length: 10 }).map((_, i) => ({
69
+ id: `t_${i + 1}`,
70
+ label: `Item ${i + 1}`,
71
+ }));
72
+ const [activeTab, setActiveTab] = useState(tabs[0]);
73
+ return (
74
+ <TabbedChips
75
+ activeTab={activeTab}
76
+ onChange={setActiveTab}
77
+ tabs={tabs}
78
+ styles={{ paddle: { transform: 'scale(0.8)' } }}
79
+ />
80
+ );
81
+ }
82
+ ```
83
+
84
+ ### Long text tabs
85
+
86
+ ```jsx live
87
+ function ExampleLongText() {
88
+ const tabs = [
89
+ { id: 'a', label: 'Very long tab label that can wrap on small widths' },
90
+ { id: 'b', label: 'Another extra long label to test overflow' },
91
+ { id: 'c', label: 'Short' },
92
+ ];
93
+ const [activeTab, setActiveTab] = useState(tabs[0]);
94
+ return <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />;
95
+ }
96
+ ```
97
+
98
+ ### Disabled tab
99
+
100
+ ```jsx live
101
+ function ExampleDisabled() {
102
+ const tabs = [
103
+ { id: 'first', label: 'First' },
104
+ { id: 'second', label: 'Second', disabled: true },
105
+ { id: 'third', label: 'Third' },
106
+ ];
107
+ const [activeTab, setActiveTab] = useState(tabs[0]);
108
+ return <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />;
109
+ }
110
+ ```
111
+
112
+ ### With start media
113
+
114
+ :::tip Media sizing
115
+ For start media, use circular images sized 24×24 for regular chips and 16×16 for compact chips.
116
+ :::
117
+
118
+ ```jsx live
119
+ function ExampleWithStart() {
120
+ const icon = { height: 24, width: 24, shape: 'circle', source: assets.eth.imageUrl };
121
+ const compactIcon = { height: 16, width: 16, shape: 'circle', source: assets.eth.imageUrl };
122
+ const tabs = [
123
+ { id: 'all', label: 'All', start: <RemoteImage {...icon} /> },
124
+ { id: 'swap', label: 'Swap', start: <RemoteImage {...icon} /> },
125
+ { id: 'collect', label: 'Collect', start: <RemoteImage {...icon} /> },
126
+ { id: 'bridge', label: 'Bridge', start: <RemoteImage {...icon} /> },
127
+ ];
128
+ const compactTabs = tabs.map((tab) => ({ ...tab, start: <RemoteImage {...compactIcon} /> }));
129
+ const [activeTab, setActiveTab] = useState(tabs[0]);
130
+ return (
131
+ <VStack gap={2}>
132
+ <TabbedChips activeTab={activeTab} onChange={setActiveTab} tabs={tabs} />
133
+ <TabbedChips compact activeTab={activeTab} onChange={setActiveTab} tabs={compactTabs} />
134
+ </VStack>
135
+ );
136
+ }
137
+ ```
138
+
139
+ ### Custom TabComponent
140
+
141
+ :::tip Custom Tab behavior
142
+ When providing a custom TabComponent, use `useTabsContext()` and call `updateActiveTab(id)` to update selection state. Reflect the active state (e.g., end icon state) based on `activeTab?.id === id`.
143
+ :::
144
+
145
+ ```jsx live noInline
146
+ function CustomTab({ id, label, ...props }: TabbedChipProps) {
147
+ const { activeTab, updateActiveTab } = useTabsContext();
148
+ const isActive = activeTab?.id === id;
149
+ return (
150
+ <MediaChip
151
+ end={<Icon size="s" active={isActive} name="star" />}
152
+ onClick={() => updateActiveTab(id)}
153
+ {...props}
154
+ >
155
+ {label}
156
+ </MediaChip>
157
+ );
158
+ }
159
+
160
+ const tabs = [
161
+ { id: 'all', label: 'All' },
162
+ { id: 'swap', label: 'Swap' },
163
+ { id: 'collect', label: 'Collect' },
164
+ ];
165
+
166
+ function Example() {
167
+ const [activeTab, setActiveTab] = useState(tabs[0]);
168
+ return (
169
+ <TabbedChips
170
+ activeTab={activeTab}
171
+ onChange={setActiveTab}
172
+ tabs={tabs}
173
+ TabComponent={CustomTab}
174
+ />
175
+ );
176
+ }
177
+
178
+ render(<Example />);
179
+ ```
180
+
181
+ ## Props
182
+
183
+ | Prop | Type | Required | Default | Description |
184
+ | --- | --- | --- | --- | --- |
185
+ | `activeTab` | `TabValue<T> \| null` | Yes | `-` | React state for the currently active tab. Setting it to null results in no active tab. |
186
+ | `onChange` | `(activeTab: TabValue<T> \| null) => void` | Yes | `-` | Callback that is fired when the active tab changes. Use this callback to update the activeTab state. |
187
+ | `tabs` | `TabbedChipProps<T>[]` | Yes | `-` | - |
188
+ | `TabComponent` | `FC<TabbedChipProps<T>>` | No | `-` | - |
189
+ | `TabsActiveIndicatorComponent` | `TabsActiveIndicatorComponent` | No | `-` | - |
190
+ | `background` | `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 | `-` | - |
191
+ | `classNames` | `{ root?: string; scrollContainer?: string \| undefined; tabs?: string \| undefined; } \| undefined` | No | `-` | - |
192
+ | `compact` | `boolean` | No | `false` | Turn on to use a compact Chip component for each tab. |
193
+ | `disabled` | `boolean` | No | `-` | Disable interactions on all the tabs. |
194
+ | `gap` | `0 \| 5 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1 \| 1.5 \| 2 \| 3 \| 4 \| 6 \| 7 \| 8 \| 9` | No | `1` | The spacing between Tabs |
195
+ | `nextArrowAccessibilityLabel` | `string` | No | `-` | - |
196
+ | `previousArrowAccessibilityLabel` | `string` | No | `-` | - |
197
+ | `ref` | `null \| (instance: HTMLElement \| null) => void \| MutableRefObject<HTMLElement \| null>` | No | `-` | - |
198
+ | `styles` | `{ root?: CSSProperties; scrollContainer?: CSSProperties \| undefined; paddle?: CSSProperties \| undefined; tabs?: CSSProperties \| undefined; } \| undefined` | No | `-` | - |
199
+ | `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 |
200
+ | `width` | `ResponsiveProp<Width<string \| number>>` | No | `100%` | The width of the scroll container, defaults to 100% of the parent container If the tabs are wider than the width of the container, paddles will be shown to scroll the tabs. |
201
+
202
+
@@ -59,7 +59,7 @@ function ToastExample() {
59
59
 
60
60
  const handleVariant = () => {
61
61
  toast.show('Toast copy', {
62
- variant: 'negative',
62
+ variant: 'bgNegative',
63
63
  });
64
64
  };
65
65
 
@@ -186,7 +186,7 @@ The `color` variables have semantic names which describe their application in th
186
186
  const theme = useTheme();
187
187
  theme.lightSpectrum.gray0; // "255,255,255"
188
188
  theme.darkSpectrum.gray0; // "10,11,13"
189
- theme.spectrum.gray100; // "255,255,255" or "10,11,13", depends on activeColorScheme
189
+ theme.spectrum.gray0; // "255,255,255" or "10,11,13", depends on activeColorScheme
190
190
  theme.lightColor.bg; // "rgb(255,255,255)"
191
191
  theme.darkColor.bg; // "rgb(10,11,13)"
192
192
  theme.color.bg; // "rgb(255,255,255)" or "rgb(10,11,13)", depends on activeColorScheme
@@ -39,6 +39,7 @@
39
39
  - [RollingNumber](web/components/RollingNumber.txt): A numeric display that animates value changes with rolling digits.
40
40
  - [Tour](web/components/Tour.txt): Creates guided tours of a user interface.
41
41
  - [Tabs](web/components/Tabs.txt): Tabs is a flexible, accessible tab navigation component for switching between content sections. It supports custom tab components, animated active indicators, and full keyboard navigation.
42
+ - [TabbedChipsAlpha](web/components/TabbedChipsAlpha.txt): A chip component commonly used in filter context to refine a date source
42
43
  - [TabbedChips](web/components/TabbedChips.txt): Tab chips are to be used in a filter setting where the user is given the ability to refine the data source they are accessing.
43
44
  - [TabNavigation](web/components/TabNavigation.txt): Organizes content across different screens or data sets.
44
45
  - [TabLabel](web/components/TabLabel.txt): A text label component used within tab navigation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cds-mcp-server",
3
- "version": "8.20.1",
3
+ "version": "8.21.0",
4
4
  "description": "Coinbase Design System - MCP Server",
5
5
  "repository": {
6
6
  "type": "git",