@nexub/mcp 6.1.0 → 6.3.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/dist/skill/references/components/data-table.md +52 -0
- package/dist/skill/references/components/date-time-picker.md +43 -0
- package/dist/skill/references/components/event-calendar.md +61 -0
- package/dist/skill/references/components/time-picker.md +40 -0
- package/dist/skill/references/components/tree-view.md +106 -0
- package/dist/skill/references/components.md +5 -1
- package/dist/skill/references/tokens.md +1 -1
- package/package.json +1 -1
|
@@ -12,6 +12,8 @@ Feature-rich data table with sorting and row selection powered by TanStack Table
|
|
|
12
12
|
| --- | --- | --- | --- |
|
|
13
13
|
| `columns` (required) | `DataTableColumn<TData>[]` | | TanStack Table column definitions (`DataTableColumn` is exported from @nexub/react). Set `meta: { align: 'end' }` for numeric columns; headers, sort buttons and cells follow it. |
|
|
14
14
|
| `data` (required) | `TData[]` | | Array of row data objects to render. |
|
|
15
|
+
| `getSubRows` | `(row, index) => TData[] \| undefined` | | Nested rows (a tree table). The first column gets an expand toggle (`aria-expanded`) and indents each level; sorting sorts within each level. |
|
|
16
|
+
| `expanded / defaultExpanded / onExpandedChange` | `ExpandedState` | | Expanded rows by row id (see `getRowId`), or `true` for all. |
|
|
15
17
|
| `caption` | `ReactNode` | | Names the table for assistive tech (and its scroll region). Shown below the table; add `captionHidden` to keep it screen-reader only. |
|
|
16
18
|
| `enableSorting` | `boolean` | `false` | Click a header to sort; Shift+click adds more columns, numbered 1, 2… (5.3). |
|
|
17
19
|
| `enableRowSelection` | `boolean` | `false` | Turns on row selection state. |
|
|
@@ -242,6 +244,56 @@ export default function Example() {
|
|
|
242
244
|
}
|
|
243
245
|
```
|
|
244
246
|
|
|
247
|
+
## Example: Tree rows
|
|
248
|
+
|
|
249
|
+
`getSubRows` nests rows: the first column gets an expand toggle and indents each level. With pages, a parent and its children stay on one page.
|
|
250
|
+
|
|
251
|
+
```tsx
|
|
252
|
+
'use client';
|
|
253
|
+
|
|
254
|
+
import { DataTable, type DataTableColumn } from '@nexub/react';
|
|
255
|
+
|
|
256
|
+
type Account = { name: string; owner: string; arr: number; children?: Account[] };
|
|
257
|
+
|
|
258
|
+
const data: Account[] = [
|
|
259
|
+
{
|
|
260
|
+
name: 'Acme Group',
|
|
261
|
+
owner: 'Ada',
|
|
262
|
+
arr: 420000,
|
|
263
|
+
children: [
|
|
264
|
+
{ name: 'Acme EU', owner: 'Grace', arr: 180000, children: [{ name: 'Acme Berlin', owner: 'Grace', arr: 60000 }] },
|
|
265
|
+
{ name: 'Acme US', owner: 'Alan', arr: 240000 },
|
|
266
|
+
],
|
|
267
|
+
},
|
|
268
|
+
{ name: 'Globex', owner: 'Linus', arr: 95000 },
|
|
269
|
+
];
|
|
270
|
+
|
|
271
|
+
const columns: DataTableColumn<Account>[] = [
|
|
272
|
+
{ accessorKey: 'name', header: 'Account' },
|
|
273
|
+
{ accessorKey: 'owner', header: 'Owner' },
|
|
274
|
+
{
|
|
275
|
+
accessorKey: 'arr',
|
|
276
|
+
header: 'ARR',
|
|
277
|
+
meta: { align: 'end' },
|
|
278
|
+
cell: ({ getValue }) => new Intl.NumberFormat('en', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }).format(getValue<number>()),
|
|
279
|
+
},
|
|
280
|
+
];
|
|
281
|
+
|
|
282
|
+
export default function Example() {
|
|
283
|
+
return (
|
|
284
|
+
<DataTable
|
|
285
|
+
caption="Accounts by region"
|
|
286
|
+
captionHidden
|
|
287
|
+
columns={columns}
|
|
288
|
+
data={data}
|
|
289
|
+
getSubRows={(row) => row.children}
|
|
290
|
+
getRowId={(row) => row.name}
|
|
291
|
+
defaultExpanded={{ 'Acme Group': true }}
|
|
292
|
+
/>
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
245
297
|
## Accessibility
|
|
246
298
|
|
|
247
299
|
- Roles: table (default), grid (with `grid`), columnheader with aria-sort when sortable
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Date Time Picker
|
|
2
|
+
|
|
3
|
+
A DatePicker and a TimePicker that edit one Date, with an optional time-zone label.
|
|
4
|
+
|
|
5
|
+
- Package: `@nexub/react` · Category: Form & Input · Status: beta
|
|
6
|
+
- Import: `import { DateTimePicker } from '@nexub/react';`
|
|
7
|
+
- Docs: https://nexub-ds-docs.pages.dev/components/date-time-picker
|
|
8
|
+
|
|
9
|
+
## Props
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| --- | --- | --- | --- |
|
|
13
|
+
| `value / onChange` | `Date \| undefined` | | Date and time in the reader’s local time. |
|
|
14
|
+
| `defaultTime` | `string` | `'09:00'` | Time used when the date is picked first. |
|
|
15
|
+
| `minuteStep` | `number` | | Passed to the TimePicker. |
|
|
16
|
+
| `minDate / maxDate` | `Date` | | Limits the calendar. |
|
|
17
|
+
| `timeZone` | `string` | | IANA zone named next to the fields, e.g. "Time zone: GMT+8 (Asia/Singapore)". Label only. |
|
|
18
|
+
| `aria-label` | `string` | | Names the group; the parts read "Date" and "Time". |
|
|
19
|
+
|
|
20
|
+
## Example: Meeting start
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
'use client';
|
|
24
|
+
|
|
25
|
+
import * as React from 'react';
|
|
26
|
+
import { DateTimePicker } from '@nexub/react';
|
|
27
|
+
|
|
28
|
+
export default function Example() {
|
|
29
|
+
const [starts, setStarts] = React.useState<Date | undefined>();
|
|
30
|
+
return (
|
|
31
|
+
<div className="flex w-full max-w-md flex-col gap-2">
|
|
32
|
+
<DateTimePicker aria-label="Meeting starts" value={starts} onChange={setStarts} minuteStep={15} timeZone="Asia/Singapore" />
|
|
33
|
+
<p className="text-body-sm text-[var(--color-on-surface-muted)]">{starts ? starts.toString() : 'Pick a date first; the time defaults to 09:00.'}</p>
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Accessibility
|
|
40
|
+
|
|
41
|
+
- A labelled group holding the DatePicker button and the native time input.
|
|
42
|
+
|
|
43
|
+
Related: [date-picker](date-picker.md), [time-picker](time-picker.md)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Event Calendar
|
|
2
|
+
|
|
3
|
+
A month or week grid of events. Display only: your app owns the events and what a click does.
|
|
4
|
+
|
|
5
|
+
- Package: `@nexub/react` · Category: Data Display · Status: beta
|
|
6
|
+
- Import: `import { EventCalendar } from '@nexub/react';`
|
|
7
|
+
- Docs: https://nexub-ds-docs.pages.dev/components/event-calendar
|
|
8
|
+
|
|
9
|
+
## Props
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| --- | --- | --- | --- |
|
|
13
|
+
| `events` (required) | `CalendarEvent[]` | | `{ id, title, start, end?, allDay?, tone? }`. Events spanning days show on each day; `tone` is primary, success, warning, error or info. |
|
|
14
|
+
| `date / defaultDate / onDateChange` | `Date` | | Any day in the shown month or week; Today and the arrows change it. |
|
|
15
|
+
| `view / defaultView / onViewChange` | `'month' \| 'week'` | `'month'` | Week shows every event; month shows `maxEventsPerDay` then "N more". |
|
|
16
|
+
| `onEventClick` | `(event) => void` | | Makes events buttons. |
|
|
17
|
+
| `onDayClick` | `(date) => void` | | Makes day numbers and "N more" buttons, for example to open the day. |
|
|
18
|
+
| `maxEventsPerDay` | `number` | `3` | Month view only. |
|
|
19
|
+
| `weekStartsOn` | `0–6` | | Defaults to the locale’s first day (Monday for en-GB, Sunday for en-US). |
|
|
20
|
+
|
|
21
|
+
## Example: Team calendar
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
'use client';
|
|
25
|
+
|
|
26
|
+
import * as React from 'react';
|
|
27
|
+
import { EventCalendar, type CalendarEvent } from '@nexub/react';
|
|
28
|
+
|
|
29
|
+
const today = new Date();
|
|
30
|
+
const on = (day: number, hour?: number) => new Date(today.getFullYear(), today.getMonth(), day, hour ?? 0);
|
|
31
|
+
|
|
32
|
+
const events: CalendarEvent[] = [
|
|
33
|
+
{ id: '1', title: 'Design review', start: on(3, 10) },
|
|
34
|
+
{ id: '2', title: 'Offsite', start: on(11), end: on(12), allDay: true, tone: 'success' },
|
|
35
|
+
{ id: '3', title: 'Standup', start: on(16, 9) },
|
|
36
|
+
{ id: '4', title: 'Launch', start: on(16, 14), tone: 'warning' },
|
|
37
|
+
{ id: '5', title: 'Retro', start: on(16, 16) },
|
|
38
|
+
{ id: '6', title: 'Incident review', start: on(16, 17), tone: 'error' },
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
export default function Example() {
|
|
42
|
+
const [picked, setPicked] = React.useState('');
|
|
43
|
+
return (
|
|
44
|
+
<div className="flex w-full flex-col gap-2">
|
|
45
|
+
<EventCalendar
|
|
46
|
+
events={events}
|
|
47
|
+
onEventClick={(e) => setPicked(e.title)}
|
|
48
|
+
onDayClick={(d) => setPicked(d.toDateString())}
|
|
49
|
+
/>
|
|
50
|
+
<p aria-live="polite" className="text-body-sm text-[var(--color-on-surface-muted)]">{picked && `Opened: ${picked}`}</p>
|
|
51
|
+
</div>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Accessibility
|
|
57
|
+
|
|
58
|
+
- A table with weekday column headers; today has `aria-current="date"` and each day reads its full date.
|
|
59
|
+
- The title is a polite live region, so Today and the arrows announce the new month or week.
|
|
60
|
+
|
|
61
|
+
Related: [date-picker](date-picker.md), [date-time-picker](date-time-picker.md)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Time Picker
|
|
2
|
+
|
|
3
|
+
A time field on the native time input: 12 or 24 hours from the reader’s locale, and the platform picker on phones.
|
|
4
|
+
|
|
5
|
+
- Package: `@nexub/react` · Category: Form & Input · Status: beta
|
|
6
|
+
- Import: `import { TimePicker } from '@nexub/react';`
|
|
7
|
+
- Docs: https://nexub-ds-docs.pages.dev/components/time-picker
|
|
8
|
+
|
|
9
|
+
## Props
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| --- | --- | --- | --- |
|
|
13
|
+
| `value / defaultValue / onValueChange` | `string` | | 24-hour `"HH:mm"`, whatever the display format. |
|
|
14
|
+
| `minuteStep` | `number` | `1` | Minutes per step for the arrow keys and the picker. |
|
|
15
|
+
| `min / max / required / name` | `string \| boolean` | | Native attributes; Form validates them. |
|
|
16
|
+
|
|
17
|
+
## Example: Reminder time
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { FormField, TimePicker } from '@nexub/react';
|
|
21
|
+
|
|
22
|
+
export default function Example() {
|
|
23
|
+
return (
|
|
24
|
+
<FormField.Root name="reminder" className="w-40">
|
|
25
|
+
<FormField.Label>Remind me at</FormField.Label>
|
|
26
|
+
<FormField.Control>
|
|
27
|
+
<TimePicker defaultValue="09:00" minuteStep={15} />
|
|
28
|
+
</FormField.Control>
|
|
29
|
+
</FormField.Root>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Accessibility
|
|
35
|
+
|
|
36
|
+
- `ArrowUp / ArrowDown`: Changes the focused segment (hour, minute, AM/PM).
|
|
37
|
+
- `ArrowLeft / ArrowRight`: Moves between segments.
|
|
38
|
+
- Native `<input type="time">`: screen readers announce each segment, and phones open their own time picker.
|
|
39
|
+
|
|
40
|
+
Related: [date-time-picker](date-time-picker.md), [date-picker](date-picker.md)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Tree View
|
|
2
|
+
|
|
3
|
+
A keyboard-friendly hierarchy (ARIA tree) with lazy children and tri-state checkboxes.
|
|
4
|
+
|
|
5
|
+
- Package: `@nexub/react` · Category: Navigation · Status: beta
|
|
6
|
+
- Import: `import { TreeView } from '@nexub/react';`
|
|
7
|
+
- Docs: https://nexub-ds-docs.pages.dev/components/tree-view
|
|
8
|
+
|
|
9
|
+
## Props
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
| --- | --- | --- | --- |
|
|
13
|
+
| `nodes` (required) | `TreeNode[]` | | `{ id, label, textValue?, icon?, children?, hasChildren?, disabled? }`. |
|
|
14
|
+
| `aria-label / aria-labelledby` (required) | `string` | | Names the tree. |
|
|
15
|
+
| `expanded / defaultExpanded / onExpandedChange` | `string[]` | | Open node ids. |
|
|
16
|
+
| `selected / defaultSelected / onSelectedChange` | `string \| null` | | Single selection, set by click, Enter or Space. |
|
|
17
|
+
| `checkable` | `boolean` | | Checkboxes instead of selection. A parent is checked when all its children are and mixed when some are. |
|
|
18
|
+
| `checked / defaultChecked / onCheckedChange` | `string[]` | | Every checked id, parents included. |
|
|
19
|
+
| `onLoadChildren` | `(node) => Promise` | | Called when a `hasChildren` node without `children` opens. Load them and pass the new `nodes`; the item is `aria-busy` meanwhile. |
|
|
20
|
+
|
|
21
|
+
## Example: Lazy loading and selection
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
'use client';
|
|
25
|
+
|
|
26
|
+
import * as React from 'react';
|
|
27
|
+
import { TreeView, type TreeNode } from '@nexub/react';
|
|
28
|
+
|
|
29
|
+
export default function Example() {
|
|
30
|
+
const [nodes, setNodes] = React.useState<TreeNode[]>([
|
|
31
|
+
{
|
|
32
|
+
id: 'eng',
|
|
33
|
+
label: 'Engineering',
|
|
34
|
+
children: [
|
|
35
|
+
{ id: 'web', label: 'Web', children: [{ id: 'ada', label: 'Ada Lovelace' }, { id: 'alan', label: 'Alan Turing' }] },
|
|
36
|
+
{ id: 'mobile', label: 'Mobile', hasChildren: true },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{ id: 'design', label: 'Design', children: [{ id: 'grace', label: 'Grace Hopper' }] },
|
|
40
|
+
]);
|
|
41
|
+
const [selected, setSelected] = React.useState<string | null>('ada');
|
|
42
|
+
|
|
43
|
+
// Pretend server call: fills Mobile's children the first time it opens.
|
|
44
|
+
const load = async (node: TreeNode) => {
|
|
45
|
+
await new Promise((r) => setTimeout(r, 700));
|
|
46
|
+
const fill = (list: TreeNode[]): TreeNode[] =>
|
|
47
|
+
list.map((n) =>
|
|
48
|
+
n.id === node.id
|
|
49
|
+
? { ...n, children: [{ id: 'linus', label: 'Linus Torvalds' }, { id: 'margaret', label: 'Margaret Hamilton' }] }
|
|
50
|
+
: { ...n, children: n.children && fill(n.children) },
|
|
51
|
+
);
|
|
52
|
+
setNodes(fill);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<div className="flex w-full max-w-xs flex-col gap-2">
|
|
57
|
+
<TreeView aria-label="Teams" nodes={nodes} defaultExpanded={['eng', 'web']} selected={selected} onSelectedChange={setSelected} onLoadChildren={load} />
|
|
58
|
+
<p className="text-body-sm text-[var(--color-on-surface-muted)]">Selected: {selected ?? 'none'}</p>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Example: Checkboxes
|
|
65
|
+
|
|
66
|
+
```tsx
|
|
67
|
+
'use client';
|
|
68
|
+
|
|
69
|
+
import * as React from 'react';
|
|
70
|
+
import { TreeView, type TreeNode } from '@nexub/react';
|
|
71
|
+
|
|
72
|
+
const nodes: TreeNode[] = [
|
|
73
|
+
{
|
|
74
|
+
id: 'reports',
|
|
75
|
+
label: 'Reports',
|
|
76
|
+
children: [
|
|
77
|
+
{ id: 'revenue', label: 'Revenue' },
|
|
78
|
+
{ id: 'churn', label: 'Churn' },
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
{ id: 'settings', label: 'Settings', children: [{ id: 'billing', label: 'Billing' }, { id: 'members', label: 'Members' }] },
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
export default function Example() {
|
|
85
|
+
const [checked, setChecked] = React.useState<string[]>(['revenue']);
|
|
86
|
+
return (
|
|
87
|
+
<div className="flex w-full max-w-xs flex-col gap-2">
|
|
88
|
+
<TreeView aria-label="Permissions" nodes={nodes} checkable defaultExpanded={['reports', 'settings']} checked={checked} onCheckedChange={setChecked} />
|
|
89
|
+
<p className="text-body-sm text-[var(--color-on-surface-muted)]">Granted: {checked.join(', ') || 'nothing'}</p>
|
|
90
|
+
</div>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Accessibility
|
|
96
|
+
|
|
97
|
+
- Roles: tree, treeitem with aria-level, aria-setsize, aria-posinset, aria-expanded, group
|
|
98
|
+
- `ArrowDown / ArrowUp`: Next or previous visible item.
|
|
99
|
+
- `ArrowRight`: Opens a closed item, or moves to its first child. Mirrored in RTL.
|
|
100
|
+
- `ArrowLeft`: Closes an open item, or moves to its parent. Mirrored in RTL.
|
|
101
|
+
- `Home / End`: First or last visible item.
|
|
102
|
+
- `Enter / Space`: Selects the item, or toggles its checkbox.
|
|
103
|
+
- `Type a letter`: Moves to the next item starting with the typed text.
|
|
104
|
+
- The tree is one tab stop (roving tabindex); it returns to the last focused or the selected item.
|
|
105
|
+
|
|
106
|
+
Related: [data-table](data-table.md), [sidebar](sidebar.md)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Component index
|
|
2
2
|
|
|
3
|
-
Nexub DS v6.
|
|
3
|
+
Nexub DS v6.3.0. Open `components/<slug>.md` for props, examples and accessibility notes.
|
|
4
4
|
Never use a component marked deprecated.
|
|
5
5
|
|
|
6
6
|
## Components — Actions
|
|
@@ -36,6 +36,7 @@ Never use a component marked deprecated.
|
|
|
36
36
|
- [Donut Chart](components/donut-chart.md) `@nexub/react`: Parts of a whole, with an optional total in the hole. Keep it to six slices or fewer.
|
|
37
37
|
- [Empty State](components/empty-state.md) `@nexub/react`: Placeholder UI shown when a list or page has no content.
|
|
38
38
|
- [Error State](components/error-state.md) `@nexub/react`: Full-page or section error view with retry action.
|
|
39
|
+
- [Event Calendar](components/event-calendar.md) `@nexub/react`: A month or week grid of events. Display only: your app owns the events and what a click does.
|
|
39
40
|
- [Funnel](components/funnel.md) `@nexub/react`: Drop-off through ordered steps, with conversion from the first step.
|
|
40
41
|
- [Gauge](components/gauge.md) `@nexub/react`: Progress toward a target on a 270° arc.
|
|
41
42
|
- [Heatmap](components/heatmap.md) `@nexub/react`: Intensity over a grid, such as activity by weekday and week, in seven sequential steps.
|
|
@@ -67,6 +68,7 @@ Never use a component marked deprecated.
|
|
|
67
68
|
|
|
68
69
|
- [Date Picker](components/date-picker.md) `@nexub/react`: Calendar date picker with text input.
|
|
69
70
|
- [Date Range Picker](components/date-range-picker.md) `@nexub/react`: Dual-calendar date range selector.
|
|
71
|
+
- [Date Time Picker](components/date-time-picker.md) `@nexub/react`: A DatePicker and a TimePicker that edit one Date, with an optional time-zone label.
|
|
70
72
|
- [Fieldset](components/fieldset.md) `@nexub/react`: Groups related fields under a legend; disabling it disables everything inside.
|
|
71
73
|
- [Form](components/form.md) `@nexub/react`: Validates on submit with the browser’s own checks plus yours, shows each message on its FormField and focuses the first invalid field.
|
|
72
74
|
- [Form Field](components/form-field.md) `@nexub/react`: Wraps Label, Input, HelperText and FormError into a single accessible group.
|
|
@@ -79,6 +81,7 @@ Never use a component marked deprecated.
|
|
|
79
81
|
- [Password Input](components/password-input.md) `@nexub/react`: A password field with a built-in toggle to reveal or hide the entered value.
|
|
80
82
|
- [Search Input](components/search-input.md) `@nexub/react`: A text input pre-wired with a search icon and a clear button for filtering content.
|
|
81
83
|
- [Textarea](components/textarea.md) `@nexub/react`: A multi-line text input with configurable resize behaviour, size, and validation states.
|
|
84
|
+
- [Time Picker](components/time-picker.md) `@nexub/react`: A time field on the native time input: 12 or 24 hours from the reader’s locale, and the platform picker on phones.
|
|
82
85
|
|
|
83
86
|
## Components — Form Controls
|
|
84
87
|
|
|
@@ -154,6 +157,7 @@ Never use a component marked deprecated.
|
|
|
154
157
|
- [Pagination](components/pagination.md) `@nexub/react`: Page navigation control with prev/next and page number buttons.
|
|
155
158
|
- [Saved Views](components/saved-views.md) `@nexub/react`: A menu to switch, save, update and delete saved filter views. Your app stores them.
|
|
156
159
|
- [Tabs](components/tabs.md) `@nexub/react`: Layered content panels switched by tab triggers. Built on Radix UI Tabs.
|
|
160
|
+
- [Tree View](components/tree-view.md) `@nexub/react`: A keyboard-friendly hierarchy (ARIA tree) with lazy children and tri-state checkboxes.
|
|
157
161
|
|
|
158
162
|
## Components — Overlays
|
|
159
163
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Tokens
|
|
2
2
|
|
|
3
|
-
Nexub DS v6.
|
|
3
|
+
Nexub DS v6.3.0. Every token is a CSS custom property from `@nexub/tokens/css` (loaded by `@nexub/themes/base`).
|
|
4
4
|
The Tailwind preset (`@nexub/tokens/tailwind`) maps them to utilities. Never hardcode a hex, px spacing or shadow that a token covers.
|
|
5
5
|
|
|
6
6
|
## Color roles
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexub/mcp",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.3.0",
|
|
4
4
|
"description": "MCP server for Nexub Design System: gives Claude, Cursor and any MCP client the components, patterns, tokens and design rules of the installed release.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|