@robr0/design-system 0.8.0 → 0.10.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/README.md +12 -7
- package/components/Accordion/Accordion.js +1 -0
- package/components/AgentPlan/AgentPlan.css +2 -2
- package/components/AgentPlan/AgentPlan.js +1 -0
- package/components/AgentStatus/AgentStatus.js +1 -0
- package/components/AiButton/AiButton.js +1 -0
- package/components/AlertDialog/AlertDialog.js +1 -0
- package/components/AnchorNav/AnchorNav.css +63 -0
- package/components/AnchorNav/AnchorNav.d.ts +33 -0
- package/components/AnchorNav/AnchorNav.js +82 -0
- package/components/AppLayout/AppLayout.js +1 -0
- package/components/AppSidebar/AppSidebar.css +13 -3
- package/components/AppSidebar/AppSidebar.d.ts +6 -2
- package/components/AppSidebar/AppSidebar.js +68 -36
- package/components/Avatar/Avatar.js +1 -0
- package/components/Button/Button.js +1 -0
- package/components/Card/Card.js +1 -0
- package/components/Carousel/Carousel.js +1 -0
- package/components/Chart/AreaChart.js +1 -1
- package/components/Chart/BarChart.js +1 -1
- package/components/Chart/LineChart.js +1 -1
- package/components/Chart/PieChart.js +2 -2
- package/components/Chart/RadarChart.js +1 -1
- package/components/Chart/RadialChart.js +2 -2
- package/components/Chart/StackedBarChart.js +2 -2
- package/components/ChatThread/ChatThread.js +1 -0
- package/components/Checkbox/Checkbox.js +1 -0
- package/components/CodeBlock/CodeBlock.js +1 -0
- package/components/CodeDiff/CodeDiff.css +175 -0
- package/components/CodeDiff/CodeDiff.d.ts +58 -0
- package/components/CodeDiff/CodeDiff.js +114 -0
- package/components/ColorPicker/ColorPicker.js +1 -0
- package/components/Combobox/Combobox.js +1 -0
- package/components/CommandPalette/CommandPalette.js +1 -0
- package/components/Composer/Composer.js +1 -0
- package/components/ContactCard/ContactCard.js +1 -0
- package/components/ContextMenu/ContextMenu.js +1 -0
- package/components/DataTable/DataTable.js +1 -0
- package/components/DateInput/DateInput.js +1 -0
- package/components/DatePicker/DatePicker.js +1 -0
- package/components/Dialog/Dialog.js +1 -0
- package/components/Drawer/Drawer.js +1 -0
- package/components/Dropdown/Dropdown.js +1 -0
- package/components/DropdownMenu/DropdownMenu.css +1 -1
- package/components/DropdownMenu/DropdownMenu.js +1 -0
- package/components/EventCalendar/EventCalendar.js +1 -0
- package/components/Field/Field.js +1 -0
- package/components/Field/FieldContext.js +1 -0
- package/components/FileInput/FileInput.js +1 -0
- package/components/Input/Input.js +1 -0
- package/components/InterruptCard/InterruptCard.css +11 -21
- package/components/InterruptCard/InterruptCard.d.ts +5 -6
- package/components/MessageCard/MessageCard.css +1 -2
- package/components/ModelPicker/ModelPicker.css +3 -1
- package/components/ModelPicker/ModelPicker.js +1 -0
- package/components/NavList/NavList.js +1 -0
- package/components/NotificationCenter/NotificationCenter.js +1 -0
- package/components/NumberInput/NumberInput.css +154 -0
- package/components/NumberInput/NumberInput.d.ts +44 -0
- package/components/NumberInput/NumberInput.js +147 -0
- package/components/Pagination/Pagination.js +1 -0
- package/components/PinInput/PinInput.css +92 -0
- package/components/PinInput/PinInput.d.ts +46 -0
- package/components/PinInput/PinInput.js +161 -0
- package/components/Popover/Popover.css +5 -6
- package/components/Popover/Popover.js +1 -0
- package/components/RadioButton/RadioButton.js +1 -0
- package/components/Reasoning/Reasoning.js +1 -0
- package/components/SectionTitle/SectionTitle.css +8 -0
- package/components/SectionTitle/SectionTitle.d.ts +3 -1
- package/components/SectionTitle/SectionTitle.js +6 -1
- package/components/SegmentedControl/SegmentedControl.js +1 -0
- package/components/SelectionCard/SelectionCard.js +1 -0
- package/components/ShaderField/ShaderField.js +1 -0
- package/components/ShaderField/useShaderField.js +1 -0
- package/components/Slider/Slider.js +1 -0
- package/components/Sparkline/Sparkline.css +52 -0
- package/components/Sparkline/Sparkline.d.ts +49 -0
- package/components/Sparkline/Sparkline.js +86 -0
- package/components/Stepper/Stepper.css +207 -0
- package/components/Stepper/Stepper.d.ts +41 -0
- package/components/Stepper/Stepper.js +61 -0
- package/components/Tabs/Tabs.js +1 -0
- package/components/TagInput/TagInput.css +160 -0
- package/components/TagInput/TagInput.d.ts +43 -0
- package/components/TagInput/TagInput.js +137 -0
- package/components/Textarea/Textarea.js +1 -0
- package/components/TimePicker/TimePicker.css +230 -0
- package/components/TimePicker/TimePicker.d.ts +46 -0
- package/components/TimePicker/TimePicker.js +246 -0
- package/components/Toast/Toast.js +1 -0
- package/components/ToggleGroup/ToggleGroup.js +1 -0
- package/components/ToggleSwitch/ToggleSwitch.js +1 -0
- package/components/ToolCall/ToolCall.css +7 -11
- package/components/ToolCall/ToolCall.js +1 -0
- package/components/Tooltip/Tooltip.js +1 -0
- package/components/TreeView/TreeView.css +119 -0
- package/components/TreeView/TreeView.d.ts +45 -0
- package/components/TreeView/TreeView.js +232 -0
- package/components/registry.d.ts +22 -6
- package/components/registry.js +3 -1
- package/components/registry.json +206 -20
- package/components/registry.json.d.ts +206 -20
- package/components/registry.json.js +2 -2
- package/index.d.ts +11 -2
- package/index.js +21 -1
- package/package.json +1 -1
- package/tokens/tokens-dark.css +17 -13
- package/tokens/tokens-light.css +15 -12
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React, { useState, useMemo, useRef, useCallback } from "react";
|
|
4
|
+
import "./TreeView.css";
|
|
5
|
+
import "../../fonts/material-symbols.css";
|
|
6
|
+
const isBranchNode = (node) => Array.isArray(node.children) && node.children.length > 0;
|
|
7
|
+
const TreeView = React.forwardRef(
|
|
8
|
+
({
|
|
9
|
+
nodes,
|
|
10
|
+
defaultExpandedIds = [],
|
|
11
|
+
expandedIds,
|
|
12
|
+
onExpandedChange,
|
|
13
|
+
selectedId,
|
|
14
|
+
defaultSelectedId,
|
|
15
|
+
onSelect,
|
|
16
|
+
className = "",
|
|
17
|
+
...rest
|
|
18
|
+
}, ref) => {
|
|
19
|
+
const baseClass = "ds-treeview";
|
|
20
|
+
const baseId = React.useId();
|
|
21
|
+
const [internalExpanded, setInternalExpanded] = useState(
|
|
22
|
+
() => new Set(defaultExpandedIds)
|
|
23
|
+
);
|
|
24
|
+
const [internalSelected, setInternalSelected] = useState(
|
|
25
|
+
defaultSelectedId
|
|
26
|
+
);
|
|
27
|
+
const [focusedId, setFocusedId] = useState(void 0);
|
|
28
|
+
const expandedSet = useMemo(
|
|
29
|
+
() => expandedIds !== void 0 ? new Set(expandedIds) : internalExpanded,
|
|
30
|
+
[expandedIds, internalExpanded]
|
|
31
|
+
);
|
|
32
|
+
const selected = selectedId !== void 0 ? selectedId : internalSelected;
|
|
33
|
+
const itemRefs = useRef(/* @__PURE__ */ new Map());
|
|
34
|
+
const indexById = useMemo(() => {
|
|
35
|
+
const map = /* @__PURE__ */ new Map();
|
|
36
|
+
let i = 0;
|
|
37
|
+
const walk = (list) => {
|
|
38
|
+
for (const node of list) {
|
|
39
|
+
map.set(node.id, i);
|
|
40
|
+
i += 1;
|
|
41
|
+
if (node.children) walk(node.children);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
walk(nodes);
|
|
45
|
+
return map;
|
|
46
|
+
}, [nodes]);
|
|
47
|
+
const parentById = useMemo(() => {
|
|
48
|
+
const map = /* @__PURE__ */ new Map();
|
|
49
|
+
const walk = (list, parent) => {
|
|
50
|
+
for (const node of list) {
|
|
51
|
+
map.set(node.id, parent);
|
|
52
|
+
if (node.children) walk(node.children, node.id);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
walk(nodes);
|
|
56
|
+
return map;
|
|
57
|
+
}, [nodes]);
|
|
58
|
+
const visibleNodes = useMemo(() => {
|
|
59
|
+
const out = [];
|
|
60
|
+
const walk = (list) => {
|
|
61
|
+
for (const node of list) {
|
|
62
|
+
out.push(node);
|
|
63
|
+
if (isBranchNode(node) && expandedSet.has(node.id)) walk(node.children);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
walk(nodes);
|
|
67
|
+
return out;
|
|
68
|
+
}, [nodes, expandedSet]);
|
|
69
|
+
const visibleIds = useMemo(
|
|
70
|
+
() => new Set(visibleNodes.map((node) => node.id)),
|
|
71
|
+
[visibleNodes]
|
|
72
|
+
);
|
|
73
|
+
const tabbableId = focusedId !== void 0 && visibleIds.has(focusedId) ? focusedId : selected !== void 0 && visibleIds.has(selected) ? selected : visibleNodes[0]?.id;
|
|
74
|
+
const commitExpanded = useCallback(
|
|
75
|
+
(next) => {
|
|
76
|
+
if (expandedIds === void 0) setInternalExpanded(next);
|
|
77
|
+
onExpandedChange?.(Array.from(next));
|
|
78
|
+
},
|
|
79
|
+
[expandedIds, onExpandedChange]
|
|
80
|
+
);
|
|
81
|
+
const toggleBranch = useCallback(
|
|
82
|
+
(id) => {
|
|
83
|
+
const next = new Set(expandedSet);
|
|
84
|
+
if (next.has(id)) {
|
|
85
|
+
next.delete(id);
|
|
86
|
+
} else {
|
|
87
|
+
next.add(id);
|
|
88
|
+
}
|
|
89
|
+
commitExpanded(next);
|
|
90
|
+
},
|
|
91
|
+
[expandedSet, commitExpanded]
|
|
92
|
+
);
|
|
93
|
+
const selectNode = useCallback(
|
|
94
|
+
(id) => {
|
|
95
|
+
if (selectedId === void 0) setInternalSelected(id);
|
|
96
|
+
onSelect?.(id);
|
|
97
|
+
},
|
|
98
|
+
[selectedId, onSelect]
|
|
99
|
+
);
|
|
100
|
+
const focusNode = useCallback((id) => {
|
|
101
|
+
if (id === void 0) return;
|
|
102
|
+
setFocusedId(id);
|
|
103
|
+
itemRefs.current.get(id)?.focus();
|
|
104
|
+
}, []);
|
|
105
|
+
const handleKeyDown = (event, node) => {
|
|
106
|
+
const branch = isBranchNode(node);
|
|
107
|
+
const expanded = expandedSet.has(node.id);
|
|
108
|
+
const index = visibleNodes.findIndex((n) => n.id === node.id);
|
|
109
|
+
let handled = true;
|
|
110
|
+
switch (event.key) {
|
|
111
|
+
case "ArrowDown":
|
|
112
|
+
focusNode(visibleNodes[index + 1]?.id);
|
|
113
|
+
break;
|
|
114
|
+
case "ArrowUp":
|
|
115
|
+
focusNode(visibleNodes[index - 1]?.id);
|
|
116
|
+
break;
|
|
117
|
+
case "ArrowRight":
|
|
118
|
+
if (branch && !expanded) {
|
|
119
|
+
toggleBranch(node.id);
|
|
120
|
+
} else if (branch && expanded) {
|
|
121
|
+
focusNode(node.children[0]?.id);
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
case "ArrowLeft":
|
|
125
|
+
if (branch && expanded) {
|
|
126
|
+
toggleBranch(node.id);
|
|
127
|
+
} else {
|
|
128
|
+
focusNode(parentById.get(node.id));
|
|
129
|
+
}
|
|
130
|
+
break;
|
|
131
|
+
case "Home":
|
|
132
|
+
focusNode(visibleNodes[0]?.id);
|
|
133
|
+
break;
|
|
134
|
+
case "End":
|
|
135
|
+
focusNode(visibleNodes[visibleNodes.length - 1]?.id);
|
|
136
|
+
break;
|
|
137
|
+
case "Enter":
|
|
138
|
+
case " ":
|
|
139
|
+
selectNode(node.id);
|
|
140
|
+
break;
|
|
141
|
+
default:
|
|
142
|
+
handled = false;
|
|
143
|
+
}
|
|
144
|
+
if (handled) {
|
|
145
|
+
event.preventDefault();
|
|
146
|
+
event.stopPropagation();
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
const renderNode = (node, depth) => {
|
|
150
|
+
const branch = isBranchNode(node);
|
|
151
|
+
const expanded = branch && expandedSet.has(node.id);
|
|
152
|
+
const isSelected = selected === node.id;
|
|
153
|
+
const labelId = `${baseId}-label-${indexById.get(node.id)}`;
|
|
154
|
+
const icon = node.icon ?? (branch ? "folder" : "draft");
|
|
155
|
+
const rowClasses = [
|
|
156
|
+
`${baseClass}__row`,
|
|
157
|
+
isSelected && `${baseClass}__row--selected`
|
|
158
|
+
].filter(Boolean).join(" ");
|
|
159
|
+
return /* @__PURE__ */ jsxs(
|
|
160
|
+
"li",
|
|
161
|
+
{
|
|
162
|
+
role: "treeitem",
|
|
163
|
+
"aria-expanded": branch ? expanded : void 0,
|
|
164
|
+
"aria-selected": isSelected,
|
|
165
|
+
"aria-labelledby": labelId,
|
|
166
|
+
tabIndex: node.id === tabbableId ? 0 : -1,
|
|
167
|
+
className: `${baseClass}__item`,
|
|
168
|
+
ref: (el) => {
|
|
169
|
+
if (el) {
|
|
170
|
+
itemRefs.current.set(node.id, el);
|
|
171
|
+
} else {
|
|
172
|
+
itemRefs.current.delete(node.id);
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
onKeyDown: (event) => handleKeyDown(event, node),
|
|
176
|
+
onFocus: (event) => {
|
|
177
|
+
event.stopPropagation();
|
|
178
|
+
setFocusedId(node.id);
|
|
179
|
+
},
|
|
180
|
+
onClick: (event) => {
|
|
181
|
+
event.stopPropagation();
|
|
182
|
+
if (branch) toggleBranch(node.id);
|
|
183
|
+
selectNode(node.id);
|
|
184
|
+
focusNode(node.id);
|
|
185
|
+
},
|
|
186
|
+
children: [
|
|
187
|
+
/* @__PURE__ */ jsxs(
|
|
188
|
+
"div",
|
|
189
|
+
{
|
|
190
|
+
className: rowClasses,
|
|
191
|
+
style: { "--ds-treeview-depth": depth },
|
|
192
|
+
children: [
|
|
193
|
+
branch ? /* @__PURE__ */ jsx(
|
|
194
|
+
"span",
|
|
195
|
+
{
|
|
196
|
+
className: `${baseClass}__chevron material-symbols-rounded`,
|
|
197
|
+
"aria-hidden": "true",
|
|
198
|
+
children: "chevron_right"
|
|
199
|
+
}
|
|
200
|
+
) : /* @__PURE__ */ jsx(
|
|
201
|
+
"span",
|
|
202
|
+
{
|
|
203
|
+
className: `${baseClass}__chevron ${baseClass}__chevron--spacer`,
|
|
204
|
+
"aria-hidden": "true"
|
|
205
|
+
}
|
|
206
|
+
),
|
|
207
|
+
/* @__PURE__ */ jsx(
|
|
208
|
+
"span",
|
|
209
|
+
{
|
|
210
|
+
className: `${baseClass}__icon material-symbols-rounded`,
|
|
211
|
+
"aria-hidden": "true",
|
|
212
|
+
children: icon
|
|
213
|
+
}
|
|
214
|
+
),
|
|
215
|
+
/* @__PURE__ */ jsx("span", { id: labelId, className: `${baseClass}__label`, children: node.label })
|
|
216
|
+
]
|
|
217
|
+
}
|
|
218
|
+
),
|
|
219
|
+
expanded && /* @__PURE__ */ jsx("ul", { role: "group", className: `${baseClass}__group`, children: node.children.map((child) => renderNode(child, depth + 1)) })
|
|
220
|
+
]
|
|
221
|
+
},
|
|
222
|
+
node.id
|
|
223
|
+
);
|
|
224
|
+
};
|
|
225
|
+
const classes = [baseClass, className].filter(Boolean).join(" ");
|
|
226
|
+
return /* @__PURE__ */ jsx("ul", { ...rest, ref, role: "tree", className: classes, children: nodes.map((node) => renderNode(node, 0)) });
|
|
227
|
+
}
|
|
228
|
+
);
|
|
229
|
+
TreeView.displayName = "TreeView";
|
|
230
|
+
export {
|
|
231
|
+
TreeView
|
|
232
|
+
};
|
package/components/registry.d.ts
CHANGED
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
*
|
|
5
5
|
* The data lives in registry.json. Each entry in `components` carries:
|
|
6
6
|
*
|
|
7
|
-
* name the
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* name the exported component name; also the folder under
|
|
8
|
+
* src/components unless `folder` says otherwise
|
|
9
|
+
* label the display name — "Nav list" for the NavList folder
|
|
10
|
+
* slug the website route segment — stored, not derived, so a
|
|
11
|
+
* name-to-slug exception stays plain data rather than a
|
|
11
12
|
* special case duplicated across validators
|
|
12
13
|
* description one line, used for the page title, the sidebar search index,
|
|
13
14
|
* and anywhere the component is summarised
|
|
@@ -16,6 +17,9 @@
|
|
|
16
17
|
* uses hooks or defines handlers. Presentational components are
|
|
17
18
|
* deliberately false so consumers can render them from a React
|
|
18
19
|
* Server Component.
|
|
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.
|
|
19
23
|
*
|
|
20
24
|
* `docOnlyHelpers` names the internal documentation helpers that are
|
|
21
25
|
* deliberately excluded from the public count.
|
|
@@ -31,7 +35,7 @@
|
|
|
31
35
|
export interface ComponentMeta {
|
|
32
36
|
/** Folder under src/components, and the exported component name */
|
|
33
37
|
name: string;
|
|
34
|
-
/** Display name — may differ from `name` (
|
|
38
|
+
/** Display name — may differ from `name` (NavList → "Nav list") */
|
|
35
39
|
label: string;
|
|
36
40
|
/** Website route segment under /components */
|
|
37
41
|
slug: string;
|
|
@@ -41,10 +45,22 @@ export interface ComponentMeta {
|
|
|
41
45
|
category: string;
|
|
42
46
|
/** Whether the component declares 'use client' */
|
|
43
47
|
client: boolean;
|
|
48
|
+
/** Folder under src/components when it differs from `name` (shared folders like Chart) */
|
|
49
|
+
folder?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface ComponentCategoryMeta {
|
|
52
|
+
/** Category id — the value each component's `category` field carries, and the website route segment under /components */
|
|
53
|
+
id: string;
|
|
54
|
+
/** Display name for the category, used for section headings and landing pages */
|
|
55
|
+
label: string;
|
|
56
|
+
/** One-line summary of what the category holds */
|
|
57
|
+
description: string;
|
|
44
58
|
}
|
|
45
59
|
/** Full metadata for every public component, alphabetical by name. */
|
|
46
60
|
export declare const componentMetadata: readonly ComponentMeta[];
|
|
47
|
-
/**
|
|
61
|
+
/** Full metadata for every component category, alphabetical by id. */
|
|
62
|
+
export declare const componentCategoryMetadata: readonly ComponentCategoryMeta[];
|
|
63
|
+
/** The category ids a component may belong to. */
|
|
48
64
|
export declare const componentCategories: readonly string[];
|
|
49
65
|
/**
|
|
50
66
|
* The official public component list, names only.
|
package/components/registry.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import registry from "./registry.json.js";
|
|
2
2
|
const componentMetadata = registry.components;
|
|
3
|
-
const
|
|
3
|
+
const componentCategoryMetadata = registry.categories;
|
|
4
|
+
const componentCategories = registry.categories.map((c) => c.id);
|
|
4
5
|
const componentRegistry = registry.components.map((c) => c.name);
|
|
5
6
|
const COMPONENT_COUNT = registry.components.length;
|
|
6
7
|
export {
|
|
7
8
|
COMPONENT_COUNT,
|
|
8
9
|
componentCategories,
|
|
10
|
+
componentCategoryMetadata,
|
|
9
11
|
componentMetadata,
|
|
10
12
|
componentRegistry
|
|
11
13
|
};
|
package/components/registry.json
CHANGED
|
@@ -1,15 +1,56 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "SINGLE SOURCE OF TRUTH for the public component count. Every folder in src/components must appear in exactly one of these lists; scripts/validate-component-registry.mjs enforces this at build time. Import COMPONENT_COUNT from src/components/registry.ts wherever a count is displayed - never hardcode the number.",
|
|
3
3
|
"categories": [
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
{
|
|
5
|
+
"id": "actions",
|
|
6
|
+
"label": "Actions",
|
|
7
|
+
"description": "Buttons, button groups, and toggles for triggering actions and switching modes."
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "ai",
|
|
11
|
+
"label": "AI",
|
|
12
|
+
"description": "Chat, agent, and model surfaces for building AI products, from the composer to the reasoning trace and the diff an agent proposes."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "charts",
|
|
16
|
+
"label": "Charts",
|
|
17
|
+
"description": "Data visualisation components for plotting series and activity over time."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "data-display",
|
|
21
|
+
"label": "Data display",
|
|
22
|
+
"description": "Cards, tables, lists, and badges for presenting structured content."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "effects",
|
|
26
|
+
"label": "Effects",
|
|
27
|
+
"description": "Ambient and decorative surfaces that sit behind or around the interface."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "feedback",
|
|
31
|
+
"label": "Feedback",
|
|
32
|
+
"description": "Alerts, toasts, progress, and empty states that tell people what is happening."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "forms",
|
|
36
|
+
"label": "Forms",
|
|
37
|
+
"description": "Inputs, pickers, and selection controls for collecting and editing values."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "layout",
|
|
41
|
+
"label": "Layout",
|
|
42
|
+
"description": "Page scaffolding: app shells, sidebars, dividers, and section headings."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "navigation",
|
|
46
|
+
"label": "Navigation",
|
|
47
|
+
"description": "Top bars, breadcrumbs, tabs, steppers, and pagination for moving through a product."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "overlays",
|
|
51
|
+
"label": "Overlays",
|
|
52
|
+
"description": "Dialogs, drawers, menus, and tooltips that float above the page."
|
|
53
|
+
}
|
|
13
54
|
],
|
|
14
55
|
"components": [
|
|
15
56
|
{
|
|
@@ -60,6 +101,14 @@
|
|
|
60
101
|
"category": "overlays",
|
|
61
102
|
"client": true
|
|
62
103
|
},
|
|
104
|
+
{
|
|
105
|
+
"name": "AnchorNav",
|
|
106
|
+
"label": "Anchor nav",
|
|
107
|
+
"slug": "anchor-nav",
|
|
108
|
+
"description": "An on-page list of anchor links that tracks the reader's position and jumps between sections.",
|
|
109
|
+
"category": "navigation",
|
|
110
|
+
"client": true
|
|
111
|
+
},
|
|
63
112
|
{
|
|
64
113
|
"name": "AppLayout",
|
|
65
114
|
"label": "App layout",
|
|
@@ -76,6 +125,15 @@
|
|
|
76
125
|
"category": "layout",
|
|
77
126
|
"client": true
|
|
78
127
|
},
|
|
128
|
+
{
|
|
129
|
+
"name": "AreaChart",
|
|
130
|
+
"label": "Area chart",
|
|
131
|
+
"slug": "area-chart",
|
|
132
|
+
"description": "Filled area chart for showing volume over time, with stacked and single-series variants.",
|
|
133
|
+
"category": "charts",
|
|
134
|
+
"client": false,
|
|
135
|
+
"folder": "Chart"
|
|
136
|
+
},
|
|
79
137
|
{
|
|
80
138
|
"name": "Avatar",
|
|
81
139
|
"label": "Avatar",
|
|
@@ -92,6 +150,15 @@
|
|
|
92
150
|
"category": "data-display",
|
|
93
151
|
"client": false
|
|
94
152
|
},
|
|
153
|
+
{
|
|
154
|
+
"name": "BarChart",
|
|
155
|
+
"label": "Bar chart",
|
|
156
|
+
"slug": "bar-chart",
|
|
157
|
+
"description": "Vertical bars for comparing values across categories or time, with summary stats and tooltips.",
|
|
158
|
+
"category": "charts",
|
|
159
|
+
"client": false,
|
|
160
|
+
"folder": "Chart"
|
|
161
|
+
},
|
|
95
162
|
{
|
|
96
163
|
"name": "Breadcrumb",
|
|
97
164
|
"label": "Breadcrumb",
|
|
@@ -132,14 +199,6 @@
|
|
|
132
199
|
"category": "data-display",
|
|
133
200
|
"client": true
|
|
134
201
|
},
|
|
135
|
-
{
|
|
136
|
-
"name": "Chart",
|
|
137
|
-
"label": "Chart",
|
|
138
|
-
"slug": "chart",
|
|
139
|
-
"description": "Data visualisation components built on Recharts. Includes bar, line, pie, and radial chart types with design-system token integration.",
|
|
140
|
-
"category": "charts",
|
|
141
|
-
"client": false
|
|
142
|
-
},
|
|
143
202
|
{
|
|
144
203
|
"name": "ChatHeader",
|
|
145
204
|
"label": "Chat header",
|
|
@@ -204,6 +263,14 @@
|
|
|
204
263
|
"category": "data-display",
|
|
205
264
|
"client": true
|
|
206
265
|
},
|
|
266
|
+
{
|
|
267
|
+
"name": "CodeDiff",
|
|
268
|
+
"label": "Code diff",
|
|
269
|
+
"slug": "code-diff",
|
|
270
|
+
"description": "Unified diff view for code changes, with added, removed, and context lines.",
|
|
271
|
+
"category": "ai",
|
|
272
|
+
"client": false
|
|
273
|
+
},
|
|
207
274
|
{
|
|
208
275
|
"name": "ColorPicker",
|
|
209
276
|
"label": "Colour picker",
|
|
@@ -412,6 +479,15 @@
|
|
|
412
479
|
"category": "data-display",
|
|
413
480
|
"client": false
|
|
414
481
|
},
|
|
482
|
+
{
|
|
483
|
+
"name": "LineChart",
|
|
484
|
+
"label": "Line chart",
|
|
485
|
+
"slug": "line-chart",
|
|
486
|
+
"description": "Multi-series line chart for trends over time, with per-series colours and a summary row.",
|
|
487
|
+
"category": "charts",
|
|
488
|
+
"client": false,
|
|
489
|
+
"folder": "Chart"
|
|
490
|
+
},
|
|
415
491
|
{
|
|
416
492
|
"name": "LinkList",
|
|
417
493
|
"label": "Link list",
|
|
@@ -446,8 +522,8 @@
|
|
|
446
522
|
},
|
|
447
523
|
{
|
|
448
524
|
"name": "Nav",
|
|
449
|
-
"label": "
|
|
450
|
-
"slug": "
|
|
525
|
+
"label": "Nav",
|
|
526
|
+
"slug": "nav",
|
|
451
527
|
"description": "Desktop top navigation bar with a brand slot, horizontal button group, and optional trailing content.",
|
|
452
528
|
"category": "navigation",
|
|
453
529
|
"client": false
|
|
@@ -468,6 +544,14 @@
|
|
|
468
544
|
"category": "feedback",
|
|
469
545
|
"client": true
|
|
470
546
|
},
|
|
547
|
+
{
|
|
548
|
+
"name": "NumberInput",
|
|
549
|
+
"label": "Number input",
|
|
550
|
+
"slug": "number-input",
|
|
551
|
+
"description": "Numeric field with increment and decrement steppers and min/max clamping.",
|
|
552
|
+
"category": "forms",
|
|
553
|
+
"client": true
|
|
554
|
+
},
|
|
471
555
|
{
|
|
472
556
|
"name": "Pagination",
|
|
473
557
|
"label": "Pagination",
|
|
@@ -476,6 +560,23 @@
|
|
|
476
560
|
"category": "navigation",
|
|
477
561
|
"client": true
|
|
478
562
|
},
|
|
563
|
+
{
|
|
564
|
+
"name": "PieChart",
|
|
565
|
+
"label": "Pie chart",
|
|
566
|
+
"slug": "pie-chart",
|
|
567
|
+
"description": "Proportional share of a whole as a pie or donut, with per-slice colours.",
|
|
568
|
+
"category": "charts",
|
|
569
|
+
"client": false,
|
|
570
|
+
"folder": "Chart"
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
"name": "PinInput",
|
|
574
|
+
"label": "Pin input",
|
|
575
|
+
"slug": "pin-input",
|
|
576
|
+
"description": "Segmented one-time-code input with auto-advance, paste support, and completion callback.",
|
|
577
|
+
"category": "forms",
|
|
578
|
+
"client": true
|
|
579
|
+
},
|
|
479
580
|
{
|
|
480
581
|
"name": "Popover",
|
|
481
582
|
"label": "Popover",
|
|
@@ -516,6 +617,24 @@
|
|
|
516
617
|
"category": "data-display",
|
|
517
618
|
"client": false
|
|
518
619
|
},
|
|
620
|
+
{
|
|
621
|
+
"name": "RadarChart",
|
|
622
|
+
"label": "Radar chart",
|
|
623
|
+
"slug": "radar-chart",
|
|
624
|
+
"description": "Multi-axis comparison of series across categories on a radial grid.",
|
|
625
|
+
"category": "charts",
|
|
626
|
+
"client": false,
|
|
627
|
+
"folder": "Chart"
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
"name": "RadialChart",
|
|
631
|
+
"label": "Radial chart",
|
|
632
|
+
"slug": "radial-chart",
|
|
633
|
+
"description": "Concentric progress rings for completion and KPI readouts.",
|
|
634
|
+
"category": "charts",
|
|
635
|
+
"client": false,
|
|
636
|
+
"folder": "Chart"
|
|
637
|
+
},
|
|
519
638
|
{
|
|
520
639
|
"name": "RadioButton",
|
|
521
640
|
"label": "Radio button",
|
|
@@ -532,6 +651,15 @@
|
|
|
532
651
|
"category": "ai",
|
|
533
652
|
"client": true
|
|
534
653
|
},
|
|
654
|
+
{
|
|
655
|
+
"name": "ScatterChart",
|
|
656
|
+
"label": "Scatter chart",
|
|
657
|
+
"slug": "scatter-chart",
|
|
658
|
+
"description": "Plots point clusters across two axes to show correlation and distribution.",
|
|
659
|
+
"category": "charts",
|
|
660
|
+
"client": false,
|
|
661
|
+
"folder": "Chart"
|
|
662
|
+
},
|
|
535
663
|
{
|
|
536
664
|
"name": "SectionTitle",
|
|
537
665
|
"label": "Section title",
|
|
@@ -561,7 +689,7 @@
|
|
|
561
689
|
"label": "Shader field",
|
|
562
690
|
"slug": "shader-field",
|
|
563
691
|
"description": "An ambient WebGL2 field of soft light sources that sample colour tokens, with a reported fallback status.",
|
|
564
|
-
"category": "
|
|
692
|
+
"category": "effects",
|
|
565
693
|
"client": true
|
|
566
694
|
},
|
|
567
695
|
{
|
|
@@ -588,6 +716,14 @@
|
|
|
588
716
|
"category": "ai",
|
|
589
717
|
"client": false
|
|
590
718
|
},
|
|
719
|
+
{
|
|
720
|
+
"name": "Sparkline",
|
|
721
|
+
"label": "Sparkline",
|
|
722
|
+
"slug": "sparkline",
|
|
723
|
+
"description": "Inline trend line for stats and table cells, drawn without axes or chrome.",
|
|
724
|
+
"category": "charts",
|
|
725
|
+
"client": false
|
|
726
|
+
},
|
|
591
727
|
{
|
|
592
728
|
"name": "Spinner",
|
|
593
729
|
"label": "Spinner",
|
|
@@ -596,6 +732,15 @@
|
|
|
596
732
|
"category": "feedback",
|
|
597
733
|
"client": false
|
|
598
734
|
},
|
|
735
|
+
{
|
|
736
|
+
"name": "StackedBarChart",
|
|
737
|
+
"label": "Stacked bar chart",
|
|
738
|
+
"slug": "stacked-bar-chart",
|
|
739
|
+
"description": "Bars split into stacked segments to compare totals and their composition.",
|
|
740
|
+
"category": "charts",
|
|
741
|
+
"client": false,
|
|
742
|
+
"folder": "Chart"
|
|
743
|
+
},
|
|
599
744
|
{
|
|
600
745
|
"name": "Stat",
|
|
601
746
|
"label": "Stat",
|
|
@@ -604,6 +749,14 @@
|
|
|
604
749
|
"category": "data-display",
|
|
605
750
|
"client": false
|
|
606
751
|
},
|
|
752
|
+
{
|
|
753
|
+
"name": "Stepper",
|
|
754
|
+
"label": "Stepper",
|
|
755
|
+
"slug": "stepper",
|
|
756
|
+
"description": "Step-by-step progress indicator for wizards and multi-stage flows.",
|
|
757
|
+
"category": "navigation",
|
|
758
|
+
"client": true
|
|
759
|
+
},
|
|
607
760
|
{
|
|
608
761
|
"name": "Swatch",
|
|
609
762
|
"label": "Swatch",
|
|
@@ -628,6 +781,14 @@
|
|
|
628
781
|
"category": "navigation",
|
|
629
782
|
"client": true
|
|
630
783
|
},
|
|
784
|
+
{
|
|
785
|
+
"name": "TagInput",
|
|
786
|
+
"label": "Tag input",
|
|
787
|
+
"slug": "tag-input",
|
|
788
|
+
"description": "Multi-value text input with entries held as removable tags.",
|
|
789
|
+
"category": "forms",
|
|
790
|
+
"client": true
|
|
791
|
+
},
|
|
631
792
|
{
|
|
632
793
|
"name": "Textarea",
|
|
633
794
|
"label": "Textarea",
|
|
@@ -636,6 +797,14 @@
|
|
|
636
797
|
"category": "forms",
|
|
637
798
|
"client": true
|
|
638
799
|
},
|
|
800
|
+
{
|
|
801
|
+
"name": "TimePicker",
|
|
802
|
+
"label": "Time picker",
|
|
803
|
+
"slug": "time-picker",
|
|
804
|
+
"description": "Time-of-day field with a dropdown list of selectable times.",
|
|
805
|
+
"category": "forms",
|
|
806
|
+
"client": true
|
|
807
|
+
},
|
|
639
808
|
{
|
|
640
809
|
"name": "Timeline",
|
|
641
810
|
"label": "Timeline",
|
|
@@ -683,6 +852,23 @@
|
|
|
683
852
|
"description": "Contextual text label that appears on hover or focus with position and delay options.",
|
|
684
853
|
"category": "overlays",
|
|
685
854
|
"client": true
|
|
855
|
+
},
|
|
856
|
+
{
|
|
857
|
+
"name": "TreeView",
|
|
858
|
+
"label": "Tree view",
|
|
859
|
+
"slug": "tree-view",
|
|
860
|
+
"description": "Collapsible hierarchy for files, folders, and nested structures.",
|
|
861
|
+
"category": "data-display",
|
|
862
|
+
"client": true
|
|
863
|
+
},
|
|
864
|
+
{
|
|
865
|
+
"name": "Treemap",
|
|
866
|
+
"label": "Treemap",
|
|
867
|
+
"slug": "treemap",
|
|
868
|
+
"description": "Nested rectangles sized by value for part-to-whole breakdowns.",
|
|
869
|
+
"category": "charts",
|
|
870
|
+
"client": false,
|
|
871
|
+
"folder": "Chart"
|
|
686
872
|
}
|
|
687
873
|
],
|
|
688
874
|
"docOnlyHelpers": [
|