@robr0/design-system 0.13.0 → 0.15.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.
Files changed (91) hide show
  1. package/README.md +15 -6
  2. package/charts.d.ts +1 -0
  3. package/charts.js +2 -0
  4. package/components/AnchorNav/AnchorNav.css +74 -0
  5. package/components/AnchorNav/AnchorNav.d.ts +7 -0
  6. package/components/AnchorNav/AnchorNav.js +74 -21
  7. package/components/Banner/Banner.css +110 -0
  8. package/components/Banner/Banner.d.ts +36 -0
  9. package/components/Banner/Banner.js +59 -0
  10. package/components/Button/Button.css +51 -0
  11. package/components/Button/Button.d.ts +2 -2
  12. package/components/Chart/Chart.css +4 -1
  13. package/components/CircularButton/CircularButton.css +46 -0
  14. package/components/CircularButton/CircularButton.d.ts +13 -2
  15. package/components/CircularButton/CircularButton.js +19 -16
  16. package/components/CommandPalette/CommandPalette.css +26 -1
  17. package/components/CommandPalette/CommandPalette.js +11 -7
  18. package/components/Composer/Composer.css +18 -0
  19. package/components/Composer/Composer.d.ts +4 -2
  20. package/components/Composer/Composer.js +1 -0
  21. package/components/ContributionGraph/ContributionGraph.css +28 -1
  22. package/components/ContributionGraph/ContributionGraph.d.ts +9 -1
  23. package/components/ContributionGraph/ContributionGraph.js +66 -42
  24. package/components/EmptyState/EmptyState.css +5 -0
  25. package/components/Figure/Figure.css +14 -4
  26. package/components/Figure/Figure.js +11 -20
  27. package/components/FunnelChart/FunnelChart.css +11 -35
  28. package/components/FunnelChart/FunnelChart.d.ts +26 -15
  29. package/components/FunnelChart/FunnelChart.js +82 -34
  30. package/components/Gauge/Gauge.css +39 -12
  31. package/components/Gauge/Gauge.d.ts +16 -8
  32. package/components/Gauge/Gauge.js +78 -62
  33. package/components/HoverCard/HoverCard.css +97 -0
  34. package/components/HoverCard/HoverCard.d.ts +29 -0
  35. package/components/HoverCard/HoverCard.js +83 -0
  36. package/components/ImageCompare/ImageCompare.css +112 -0
  37. package/components/ImageCompare/ImageCompare.d.ts +40 -0
  38. package/components/ImageCompare/ImageCompare.js +134 -0
  39. package/components/LinkList/LinkList.d.ts +3 -1
  40. package/components/LinkList/LinkList.js +4 -3
  41. package/components/Meter/Meter.css +98 -0
  42. package/components/Meter/Meter.d.ts +36 -0
  43. package/components/Meter/Meter.js +48 -0
  44. package/components/NotificationCenter/NotificationCenter.css +11 -3
  45. package/components/ProgressBar/ProgressBar.css +1 -1
  46. package/components/Rating/Rating.css +74 -0
  47. package/components/Rating/Rating.d.ts +41 -0
  48. package/components/Rating/Rating.js +124 -0
  49. package/components/SegmentedControl/SegmentedControl.css +23 -0
  50. package/components/SegmentedControl/SegmentedControl.d.ts +3 -1
  51. package/components/SegmentedControl/SegmentedControl.js +3 -1
  52. package/components/Slider/Slider.css +1 -1
  53. package/components/Slider/Slider.js +1 -1
  54. package/components/SourceTrail/SourceTrail.css +209 -0
  55. package/components/SourceTrail/SourceTrail.d.ts +49 -0
  56. package/components/SourceTrail/SourceTrail.js +108 -0
  57. package/components/Sparkline/Sparkline.css +26 -2
  58. package/components/Sparkline/Sparkline.d.ts +5 -3
  59. package/components/Sparkline/Sparkline.js +32 -2
  60. package/components/Spinner/Spinner.css +1 -1
  61. package/components/SplitButton/SplitButton.css +93 -0
  62. package/components/SplitButton/SplitButton.d.ts +43 -0
  63. package/components/SplitButton/SplitButton.js +67 -0
  64. package/components/StreamingText/StreamingText.d.ts +27 -9
  65. package/components/StreamingText/StreamingText.js +17 -29
  66. package/components/StreamingText/useStreamReveal.d.ts +70 -0
  67. package/components/StreamingText/useStreamReveal.js +121 -0
  68. package/components/ToggleGroup/ToggleGroup.css +17 -0
  69. package/components/ToggleGroup/ToggleGroup.d.ts +2 -0
  70. package/components/ToggleGroup/ToggleGroup.js +2 -0
  71. package/components/ToolCall/ToolCall.css +7 -2
  72. package/components/Tooltip/Tooltip.css +24 -7
  73. package/components/Tooltip/Tooltip.d.ts +2 -1
  74. package/components/UsageCard/UsageCard.css +30 -0
  75. package/components/UsageCard/UsageCard.d.ts +48 -0
  76. package/components/UsageCard/UsageCard.js +54 -0
  77. package/components/registry.d.ts +8 -2
  78. package/components/registry.json +89 -14
  79. package/components/registry.json.d.ts +89 -14
  80. package/components/registry.json.js +1 -1
  81. package/index.d.ts +8 -1
  82. package/index.js +19 -2
  83. package/package.json +5 -1
  84. package/tokens/motion.d.ts +9 -4
  85. package/tokens/motion.js +5 -1
  86. package/tokens/registry.json +4 -0
  87. package/tokens/registry.json.d.ts +4 -0
  88. package/tokens/registry.json.js +1 -1
  89. package/tokens/tokens-dark.css +11 -2
  90. package/tokens/tokens-light.css +25 -11
  91. package/tokens/tokens-primitives.css +3 -0
@@ -62,6 +62,23 @@
62
62
  color: var(--color-action-primary-text);
63
63
  }
64
64
 
65
+ /* ============================================
66
+ NEUTRAL VARIANT
67
+ Active items fill grey instead of the action
68
+ teal — for sets where the selection should
69
+ not carry the action colour's weight.
70
+ ============================================ */
71
+
72
+ .ds-toggle-group--neutral .ds-toggle-group__item--active {
73
+ background-color: var(--color-action-neutral-bg);
74
+ color: var(--color-action-neutral-text);
75
+ }
76
+
77
+ .ds-toggle-group--neutral .ds-toggle-group__item--active:hover {
78
+ background-color: var(--color-action-neutral-bg-hover);
79
+ color: var(--color-action-neutral-text);
80
+ }
81
+
65
82
  /* ============================================
66
83
  COMPACT
67
84
  ============================================ */
@@ -17,6 +17,8 @@ type ToggleGroupOwnProps = {
17
17
  multiple?: boolean;
18
18
  /** Component size */
19
19
  size?: 'default' | 'compact';
20
+ /** Visual treatment of active items — teal by default, `neutral` fills them grey */
21
+ variant?: 'primary' | 'neutral';
20
22
  /** Whether the whole group is disabled */
21
23
  disabled?: boolean;
22
24
  /** Called with the next selection — a string when single, an array when `multiple` */
@@ -8,6 +8,7 @@ const ToggleGroup = React.forwardRef(
8
8
  value = [],
9
9
  multiple = false,
10
10
  size = "default",
11
+ variant = "primary",
11
12
  disabled = false,
12
13
  onValueChange,
13
14
  onChange,
@@ -19,6 +20,7 @@ const ToggleGroup = React.forwardRef(
19
20
  const classes = [
20
21
  baseClass,
21
22
  `${baseClass}--${size}`,
23
+ `${baseClass}--${variant}`,
22
24
  disabled ? `${baseClass}--disabled` : "",
23
25
  className
24
26
  ].filter(Boolean).join(" ");
@@ -40,6 +40,9 @@
40
40
  padding: var(--padding-sm) var(--padding-lg);
41
41
  background: none;
42
42
  border: none;
43
+ /* Buttons default to the UA's buttontext, not the inherited colour, so
44
+ anything in the header that inherits would read black in both themes. */
45
+ color: var(--color-text-primary);
43
46
  text-align: left;
44
47
  cursor: pointer;
45
48
  transition: background-color var(--motion-duration-fast) var(--motion-ease-standard);
@@ -215,7 +218,9 @@
215
218
  inherited by default: a consumer stylesheet that sets a colour on
216
219
  .material-symbols-rounded itself (a common global default) would
217
220
  otherwise override inheritance and detach the icon from the state
218
- colours this component sets on its parents. */
219
- .ds-tool-call .material-symbols-rounded {
221
+ colours this component sets on its parents. The chevron is excluded —
222
+ it is the one icon that carries its own colour rule, which this
223
+ higher-specificity rule would otherwise silently override. */
224
+ .ds-tool-call .material-symbols-rounded:not(.ds-tool-call__chevron) {
220
225
  color: inherit;
221
226
  }
@@ -17,8 +17,14 @@
17
17
  z-index: 50;
18
18
  padding: var(--padding-xs) var(--padding-sm); /* 6px 8px */
19
19
  border-radius: var(--radius-xs); /* 4px */
20
- background-color: var(--color-bg-container-inverse);
21
- color: var(--color-text-on-inverse);
20
+ /* The floating surface, same recipe as Popover: page background (the
21
+ container fill is semi-transparent), hairline border, floating shadow.
22
+ Same-polarity in both themes — light bubble on light, dark on dark —
23
+ softer than the old inverse fill. */
24
+ border: var(--border-xs) solid var(--color-bg-container-border);
25
+ background-color: var(--color-bg-page-primary);
26
+ color: var(--color-text-primary);
27
+ box-shadow: var(--shadow-floating);
22
28
  font-family: var(--font-paragraph-sm-family);
23
29
  font-size: var(--font-paragraph-sm-size);
24
30
  font-weight: var(--font-paragraph-sm-weight);
@@ -85,38 +91,49 @@
85
91
  ARROW
86
92
  ============================================ */
87
93
 
94
+ /* The arrow is a rotated square in the panel's fill. It overlaps the panel
95
+ by a pixel more than before so its opaque fill covers the panel border
96
+ behind it, and draws the hairline itself on its two outward edges only. */
88
97
  .ds-tooltip__arrow {
89
98
  position: absolute;
90
99
  width: 8px;
91
100
  height: 8px;
92
- background-color: var(--color-bg-container-inverse);
101
+ background-color: var(--color-bg-page-primary);
93
102
  transform: rotate(45deg);
94
103
  }
95
104
 
96
105
  /* Arrow — top position (arrow points down) */
97
106
  .ds-tooltip__panel--top .ds-tooltip__arrow {
98
- bottom: -4px;
107
+ bottom: -5px;
99
108
  left: 50%;
100
109
  margin-left: -4px;
110
+ border-right: var(--border-xs) solid var(--color-bg-container-border);
111
+ border-bottom: var(--border-xs) solid var(--color-bg-container-border);
101
112
  }
102
113
 
103
114
  /* Arrow — bottom position (arrow points up) */
104
115
  .ds-tooltip__panel--bottom .ds-tooltip__arrow {
105
- top: -4px;
116
+ top: -5px;
106
117
  left: 50%;
107
118
  margin-left: -4px;
119
+ border-top: var(--border-xs) solid var(--color-bg-container-border);
120
+ border-left: var(--border-xs) solid var(--color-bg-container-border);
108
121
  }
109
122
 
110
123
  /* Arrow — left position (arrow points right) */
111
124
  .ds-tooltip__panel--left .ds-tooltip__arrow {
112
- right: -4px;
125
+ right: -5px;
113
126
  top: 50%;
114
127
  margin-top: -4px;
128
+ border-top: var(--border-xs) solid var(--color-bg-container-border);
129
+ border-right: var(--border-xs) solid var(--color-bg-container-border);
115
130
  }
116
131
 
117
132
  /* Arrow — right position (arrow points left) */
118
133
  .ds-tooltip__panel--right .ds-tooltip__arrow {
119
- left: -4px;
134
+ left: -5px;
120
135
  top: 50%;
121
136
  margin-top: -4px;
137
+ border-bottom: var(--border-xs) solid var(--color-bg-container-border);
138
+ border-left: var(--border-xs) solid var(--color-bg-container-border);
122
139
  }
@@ -16,6 +16,7 @@ export interface TooltipProps {
16
16
  /**
17
17
  * Tooltip component for contextual text labels.
18
18
  * Appears on hover or focus with a short delay.
19
- * Uses inverted colours (dark background in light theme).
19
+ * Rides the system's floating surface — page background, hairline border,
20
+ * floating shadow — so the bubble stays light in light theme and dark in dark.
20
21
  */
21
22
  export declare const Tooltip: ({ children, content, position, showDelay, hideDelay, className, }: TooltipProps) => import("react").JSX.Element;
@@ -0,0 +1,30 @@
1
+ /* ============================================
2
+ USAGE CARD COMPONENT
3
+ An agent's budgets at a glance — meter rows
4
+ with reset captions, in the chart card chrome
5
+ ============================================ */
6
+
7
+ /* Base — the card chrome itself comes from ds-chart */
8
+
9
+ .ds-usage-card__items {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: var(--gap-lg);
13
+ }
14
+
15
+ .ds-usage-card__item {
16
+ display: flex;
17
+ flex-direction: column;
18
+ gap: var(--gap-xxs);
19
+ }
20
+
21
+ /* Reset caption — sits under the bar's trailing edge */
22
+
23
+ .ds-usage-card__reset {
24
+ align-self: flex-end;
25
+ font-family: var(--font-caption-family);
26
+ font-size: var(--font-caption-size);
27
+ font-weight: var(--font-caption-weight);
28
+ line-height: var(--font-caption-line-height);
29
+ color: var(--color-text-secondary);
30
+ }
@@ -0,0 +1,48 @@
1
+ import { default as React } from 'react';
2
+ /** One budgeted quantity in the card — a meter row with an optional reset caption. */
3
+ export interface UsageItem {
4
+ /** What is being budgeted, e.g. the context window or a weekly limit */
5
+ label: string;
6
+ /** Current level */
7
+ value: number;
8
+ /** Upper bound of the budget; defaults to 100 */
9
+ max?: number;
10
+ /** Readout override replacing the default percentage, e.g. a token count */
11
+ valueText?: string;
12
+ /** Caption under the bar's trailing edge, e.g. when the limit resets */
13
+ resetLabel?: string;
14
+ /** Status override; left unset, the fill recolours through the card's thresholds */
15
+ variant?: 'info' | 'positive' | 'warning' | 'error' | 'neutral';
16
+ }
17
+ /** Props owned by UsageCard itself — everything else falls through to the root node. */
18
+ type UsageCardOwnProps = {
19
+ /** The budgets to show, one meter row each */
20
+ items: UsageItem[];
21
+ /** Card title in the shared chart-chrome header */
22
+ title?: string;
23
+ /** Supporting line under the title */
24
+ subtitle?: string;
25
+ /** Fractions of an item's max where its fill recolours to warning and then error */
26
+ thresholds?: {
27
+ warning?: number;
28
+ error?: number;
29
+ };
30
+ /** Chrome off (no border, padding, or fill) for use inside a panel that supplies the surface */
31
+ bare?: boolean;
32
+ /** Additional CSS classes */
33
+ className?: string;
34
+ };
35
+ export interface UsageCardProps extends UsageCardOwnProps, Omit<React.ComponentPropsWithoutRef<'div'>, keyof UsageCardOwnProps> {
36
+ }
37
+ /**
38
+ * An agent's budgets at a glance — the context window plus any number of
39
+ * plan or rate limits, one Meter row each, with reset captions. Wears the
40
+ * chart family's card chrome and takes `bare` for use inside a panel.
41
+ *
42
+ * Each fill recolours as its level crosses the card's thresholds (info
43
+ * until warning, then warning, then error), mirroring Gauge's threshold
44
+ * idea; an item's own `variant` overrides the derivation. Purely
45
+ * presentational (no 'use client'), so it renders from a Server Component.
46
+ */
47
+ export declare const UsageCard: React.ForwardRefExoticComponent<UsageCardProps & React.RefAttributes<HTMLDivElement>>;
48
+ export {};
@@ -0,0 +1,54 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Meter } from "../Meter/Meter.js";
4
+ import "../Chart/Chart.css";
5
+ import "./UsageCard.css";
6
+ const DEFAULT_THRESHOLDS = { warning: 0.8, error: 0.95 };
7
+ const UsageCard = React.forwardRef(
8
+ ({
9
+ items,
10
+ title,
11
+ subtitle,
12
+ thresholds,
13
+ bare = false,
14
+ className = "",
15
+ ...rest
16
+ }, ref) => {
17
+ const baseClass = "ds-usage-card";
18
+ const limits = { ...DEFAULT_THRESHOLDS, ...thresholds };
19
+ const variantFor = (item) => {
20
+ if (item.variant) return item.variant;
21
+ const max = item.max ?? 100;
22
+ const fraction = max > 0 ? Math.max(0, Math.min(1, item.value / max)) : 0;
23
+ if (fraction >= limits.error) return "error";
24
+ if (fraction >= limits.warning) return "warning";
25
+ return "info";
26
+ };
27
+ const classes = [baseClass, "ds-chart", bare && "ds-chart--bare", className].filter(Boolean).join(" ");
28
+ return /* @__PURE__ */ jsxs("div", { ...rest, ref, className: classes, children: [
29
+ (title || subtitle) && /* @__PURE__ */ jsx("div", { className: "ds-chart__header", children: /* @__PURE__ */ jsxs("div", { className: "ds-chart__header-text", children: [
30
+ title && /* @__PURE__ */ jsx("span", { className: "ds-chart__title", children: title }),
31
+ subtitle && /* @__PURE__ */ jsx("span", { className: "ds-chart__subtitle", children: subtitle })
32
+ ] }) }),
33
+ /* @__PURE__ */ jsx("div", { className: `${baseClass}__items`, children: items.map((item, index) => /* @__PURE__ */ jsxs("div", { className: `${baseClass}__item`, children: [
34
+ /* @__PURE__ */ jsx(
35
+ Meter,
36
+ {
37
+ label: item.label,
38
+ value: item.value,
39
+ max: item.max ?? 100,
40
+ valueText: item.valueText,
41
+ showValue: true,
42
+ variant: variantFor(item),
43
+ size: "compact"
44
+ }
45
+ ),
46
+ item.resetLabel && /* @__PURE__ */ jsx("span", { className: `${baseClass}__reset`, children: item.resetLabel })
47
+ ] }, `${item.label}-${index}`)) })
48
+ ] });
49
+ }
50
+ );
51
+ UsageCard.displayName = "UsageCard";
52
+ export {
53
+ UsageCard
54
+ };
@@ -18,8 +18,12 @@
18
18
  * deliberately false so consumers can render them from a React
19
19
  * Server Component.
20
20
  * folder set only when the implementation lives in a shared folder
21
- * rather than one named after the component — the nine chart
22
- * components all live in Chart/. Omitted everywhere else.
21
+ * rather than one named after the component — the recharts
22
+ * wrapper set lives in Chart/. Omitted everywhere else.
23
+ * recharts true when the component's module imports recharts, so it
24
+ * exports from the charts barrel rather than the main one
25
+ * (recharts is an optional peer). Held to the actual imports
26
+ * by scripts/generate-library-barrel.mjs on every build.
23
27
  *
24
28
  * `docOnlyHelpers` names the internal documentation helpers that are
25
29
  * deliberately excluded from the public count.
@@ -47,6 +51,8 @@ export interface ComponentMeta {
47
51
  client: boolean;
48
52
  /** Folder under src/components when it differs from `name` (shared folders like Chart) */
49
53
  folder?: string;
54
+ /** True when the module imports recharts and so exports from the charts barrel, not the main one */
55
+ recharts?: boolean;
50
56
  }
51
57
  export interface ComponentCategoryMeta {
52
58
  /** Category id — the value each component's `category` field carries, and the website route segment under /components */
@@ -137,7 +137,8 @@
137
137
  "description": "Filled area chart for showing volume over time, with stacked and single-series variants.",
138
138
  "category": "charts",
139
139
  "client": false,
140
- "folder": "Chart"
140
+ "folder": "Chart",
141
+ "recharts": true
141
142
  },
142
143
  {
143
144
  "name": "Avatar",
@@ -163,6 +164,14 @@
163
164
  "category": "data-display",
164
165
  "client": false
165
166
  },
167
+ {
168
+ "name": "Banner",
169
+ "label": "Banner",
170
+ "slug": "banner",
171
+ "description": "Full-width status strip for page-level announcements, with an action slot and optional dismissal.",
172
+ "category": "feedback",
173
+ "client": false
174
+ },
166
175
  {
167
176
  "name": "BarChart",
168
177
  "label": "Bar chart",
@@ -170,7 +179,8 @@
170
179
  "description": "Vertical bars for comparing values across categories or time, with summary stats and tooltips.",
171
180
  "category": "charts",
172
181
  "client": false,
173
- "folder": "Chart"
182
+ "folder": "Chart",
183
+ "recharts": true
174
184
  },
175
185
  {
176
186
  "name": "Breadcrumb",
@@ -184,7 +194,7 @@
184
194
  "name": "Button",
185
195
  "label": "Button",
186
196
  "slug": "button",
187
- "description": "Primary and secondary button variants in default and compact sizes, with icon support and multiple states.",
197
+ "description": "Primary, secondary, tertiary, neutral and destructive variants in default and compact sizes, with icon support and multiple states.",
188
198
  "category": "actions",
189
199
  "client": true
190
200
  },
@@ -272,7 +282,7 @@
272
282
  "name": "CircularButton",
273
283
  "label": "Circular button",
274
284
  "slug": "circular-button",
275
- "description": "Round icon button with primary and secondary variants, default and compact sizes.",
285
+ "description": "Round icon button with primary, secondary, tertiary and neutral variants, default and compact sizes.",
276
286
  "category": "actions",
277
287
  "client": false
278
288
  },
@@ -307,7 +317,8 @@
307
317
  "description": "Bar and line series in one chart, with an optional second y-axis for pairs in different units, like spend and ROAS.",
308
318
  "category": "charts",
309
319
  "client": false,
310
- "folder": "Chart"
320
+ "folder": "Chart",
321
+ "recharts": true
311
322
  },
312
323
  {
313
324
  "name": "Combobox",
@@ -489,9 +500,10 @@
489
500
  "name": "FunnelChart",
490
501
  "label": "Funnel chart",
491
502
  "slug": "funnel-chart",
492
- "description": "Ordered funnel stages as stepped bars with conversion percentages, each sized by its share of the first stage.",
503
+ "description": "Ordered funnel stages as centred trapezoid bands, each sized by its share of the first stage.",
493
504
  "category": "charts",
494
- "client": false
505
+ "client": false,
506
+ "recharts": true
495
507
  },
496
508
  {
497
509
  "name": "Gauge",
@@ -509,6 +521,22 @@
509
521
  "category": "maps",
510
522
  "client": true
511
523
  },
524
+ {
525
+ "name": "HoverCard",
526
+ "label": "Hover card",
527
+ "slug": "hover-card",
528
+ "description": "Rich preview panel that opens from hover or focus, with interactive content and position options.",
529
+ "category": "overlays",
530
+ "client": true
531
+ },
532
+ {
533
+ "name": "ImageCompare",
534
+ "label": "Image compare",
535
+ "slug": "image-compare",
536
+ "description": "Before-and-after image comparison with a draggable divider, keyboard control, and corner labels.",
537
+ "category": "data-display",
538
+ "client": true
539
+ },
512
540
  {
513
541
  "name": "Input",
514
542
  "label": "Input",
@@ -556,7 +584,8 @@
556
584
  "description": "Multi-series line chart for trends over time, with per-series colours and a summary row.",
557
585
  "category": "charts",
558
586
  "client": false,
559
- "folder": "Chart"
587
+ "folder": "Chart",
588
+ "recharts": true
560
589
  },
561
590
  {
562
591
  "name": "LinkList",
@@ -598,6 +627,14 @@
598
627
  "category": "ai",
599
628
  "client": false
600
629
  },
630
+ {
631
+ "name": "Meter",
632
+ "label": "Meter",
633
+ "slug": "meter",
634
+ "description": "Level indicator for a known quantity, with a status-coloured fill and an optional value readout.",
635
+ "category": "feedback",
636
+ "client": false
637
+ },
601
638
  {
602
639
  "name": "ModelPicker",
603
640
  "label": "Model picker",
@@ -661,7 +698,8 @@
661
698
  "description": "Proportional share of a whole as a pie or donut, with per-slice colours.",
662
699
  "category": "charts",
663
700
  "client": false,
664
- "folder": "Chart"
701
+ "folder": "Chart",
702
+ "recharts": true
665
703
  },
666
704
  {
667
705
  "name": "PinInput",
@@ -718,7 +756,8 @@
718
756
  "description": "Multi-axis comparison of series across categories on a radial grid.",
719
757
  "category": "charts",
720
758
  "client": false,
721
- "folder": "Chart"
759
+ "folder": "Chart",
760
+ "recharts": true
722
761
  },
723
762
  {
724
763
  "name": "RadialChart",
@@ -727,7 +766,8 @@
727
766
  "description": "Concentric progress rings for completion and KPI readouts.",
728
767
  "category": "charts",
729
768
  "client": false,
730
- "folder": "Chart"
769
+ "folder": "Chart",
770
+ "recharts": true
731
771
  },
732
772
  {
733
773
  "name": "RadioButton",
@@ -737,6 +777,14 @@
737
777
  "category": "forms",
738
778
  "client": true
739
779
  },
780
+ {
781
+ "name": "Rating",
782
+ "label": "Rating",
783
+ "slug": "rating",
784
+ "description": "Star-scale rating control with keyboard selection, a read-only mode, and a configurable icon.",
785
+ "category": "forms",
786
+ "client": true
787
+ },
740
788
  {
741
789
  "name": "Reasoning",
742
790
  "label": "Reasoning",
@@ -752,7 +800,8 @@
752
800
  "description": "Plots point clusters across two axes to show correlation and distribution.",
753
801
  "category": "charts",
754
802
  "client": false,
755
- "folder": "Chart"
803
+ "folder": "Chart",
804
+ "recharts": true
756
805
  },
757
806
  {
758
807
  "name": "SectionTitle",
@@ -810,6 +859,14 @@
810
859
  "category": "ai",
811
860
  "client": false
812
861
  },
862
+ {
863
+ "name": "SourceTrail",
864
+ "label": "Source trail",
865
+ "slug": "source-trail",
866
+ "description": "The sources an agent opened while answering, as a collapsible list with per-item status.",
867
+ "category": "ai",
868
+ "client": true
869
+ },
813
870
  {
814
871
  "name": "Sparkline",
815
872
  "label": "Sparkline",
@@ -826,6 +883,14 @@
826
883
  "category": "feedback",
827
884
  "client": false
828
885
  },
886
+ {
887
+ "name": "SplitButton",
888
+ "label": "Split button",
889
+ "slug": "split-button",
890
+ "description": "Primary action with an attached menu of alternatives, composing Button and DropdownMenu in one pill.",
891
+ "category": "actions",
892
+ "client": false
893
+ },
829
894
  {
830
895
  "name": "SplitPane",
831
896
  "label": "Split pane",
@@ -841,7 +906,8 @@
841
906
  "description": "Bars split into stacked segments to compare totals and their composition.",
842
907
  "category": "charts",
843
908
  "client": false,
844
- "folder": "Chart"
909
+ "folder": "Chart",
910
+ "recharts": true
845
911
  },
846
912
  {
847
913
  "name": "Stat",
@@ -978,7 +1044,16 @@
978
1044
  "description": "Nested rectangles sized by value for part-to-whole breakdowns.",
979
1045
  "category": "charts",
980
1046
  "client": false,
981
- "folder": "Chart"
1047
+ "folder": "Chart",
1048
+ "recharts": true
1049
+ },
1050
+ {
1051
+ "name": "UsageCard",
1052
+ "label": "Usage card",
1053
+ "slug": "usage-card",
1054
+ "description": "An agent's budgets at a glance: context window and plan limits as meter rows with reset captions.",
1055
+ "category": "ai",
1056
+ "client": false
982
1057
  }
983
1058
  ],
984
1059
  "docOnlyHelpers": [