@neuronection/assistant-ui 0.13.1 → 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.
- package/CHANGELOG.md +72 -0
- package/README.md +2 -0
- package/dist/chip-input.d.ts +2 -0
- package/dist/chip-input.js +1 -1
- package/dist/chunk-535TM7SK.js +119 -0
- package/dist/chunk-535TM7SK.js.map +1 -0
- package/dist/chunk-EZTQMJ5I.js +428 -0
- package/dist/chunk-EZTQMJ5I.js.map +1 -0
- package/dist/{chunk-TPLQL62V.js → chunk-HIRR2F4R.js} +42 -5
- package/dist/chunk-HIRR2F4R.js.map +1 -0
- package/dist/{chunk-LY2B3UJH.js → chunk-OGQF4XJB.js} +3 -3
- package/dist/{chunk-LY2B3UJH.js.map → chunk-OGQF4XJB.js.map} +1 -1
- package/dist/{chunk-UIUALJNR.js → chunk-PSFJN7WH.js} +12 -7
- package/dist/chunk-PSFJN7WH.js.map +1 -0
- package/dist/{chunk-JSPXF5YG.js → chunk-RBEPQY2A.js} +60 -10
- package/dist/chunk-RBEPQY2A.js.map +1 -0
- package/dist/{chunk-YGYKYELC.js → chunk-VULOVVKF.js} +12 -6
- package/dist/chunk-VULOVVKF.js.map +1 -0
- package/dist/{chunk-JWAX2AOO.js → chunk-XSJ3TWWZ.js} +43 -3
- package/dist/chunk-XSJ3TWWZ.js.map +1 -0
- package/dist/{chunk-WA7Q4TTA.js → chunk-YIGLULRG.js} +3 -3
- package/dist/{chunk-WA7Q4TTA.js.map → chunk-YIGLULRG.js.map} +1 -1
- package/dist/connection-test-row.js +1 -1
- package/dist/context-menu.js +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/dist/menu.d.ts +7 -1
- package/dist/menu.js +1 -1
- package/dist/model-registry.d.ts +19 -0
- package/dist/model-registry.js +1 -1
- package/dist/scale-slider.js +1 -1
- package/dist/sidebar-nav.d.ts +62 -0
- package/dist/sidebar-nav.js +3 -0
- package/dist/sidebar-nav.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/task-assignment-picker.d.ts +6 -0
- package/dist/task-assignment-picker.js +1 -1
- package/dist/user-menu.d.ts +30 -0
- package/dist/user-menu.js +3 -0
- package/dist/user-menu.js.map +1 -0
- package/package.json +9 -1
- package/dist/chunk-JSPXF5YG.js.map +0 -1
- package/dist/chunk-JWAX2AOO.js.map +0 -1
- package/dist/chunk-TPLQL62V.js.map +0 -1
- package/dist/chunk-UIUALJNR.js.map +0 -1
- package/dist/chunk-YGYKYELC.js.map +0 -1
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
4
|
+
import { ChevronRight, ChevronLeft, ChevronDown } from 'lucide-react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var FLYOUT_DELAY_MS = 150;
|
|
8
|
+
var itemButtonClass = (active) => cn(
|
|
9
|
+
"flex w-full cursor-pointer items-center gap-3 rounded-[var(--as-radius)] px-3 py-2.5 text-left text-sm transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)] disabled:pointer-events-none disabled:opacity-50",
|
|
10
|
+
active ? "bg-[color-mix(in_srgb,var(--as-primary)_12%,transparent)] font-bold text-[var(--as-primary)]" : "font-medium text-[var(--as-fg)] hover:bg-[var(--as-muted)]"
|
|
11
|
+
);
|
|
12
|
+
var flyoutContentClass = "as-anim-pop z-[var(--as-z-popover)] min-w-44 rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-1 text-[var(--as-fg)] shadow-[var(--as-shadow-3)] focus:outline-none";
|
|
13
|
+
function Badge({ value, active }) {
|
|
14
|
+
return /* @__PURE__ */ jsx(
|
|
15
|
+
"span",
|
|
16
|
+
{
|
|
17
|
+
className: cn(
|
|
18
|
+
"inline-flex min-w-5 shrink-0 items-center justify-center rounded-full px-1.5 py-0.5 text-[11px] font-bold leading-none",
|
|
19
|
+
active ? "bg-[var(--as-primary)] text-[var(--as-primary-fg)]" : "bg-[var(--as-muted)] text-[var(--as-muted-fg)]"
|
|
20
|
+
),
|
|
21
|
+
children: value
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
function ItemBadge({ badge, active }) {
|
|
26
|
+
if (badge === void 0) return null;
|
|
27
|
+
return /* @__PURE__ */ jsx("span", { className: "ml-auto", children: /* @__PURE__ */ jsx(Badge, { value: badge, active }) });
|
|
28
|
+
}
|
|
29
|
+
var SidebarNav = React.forwardRef(
|
|
30
|
+
function SidebarNav2({
|
|
31
|
+
items,
|
|
32
|
+
activeId,
|
|
33
|
+
onNavigate,
|
|
34
|
+
collapsed = false,
|
|
35
|
+
onCollapsedChange,
|
|
36
|
+
collapsible = false,
|
|
37
|
+
expandedIds,
|
|
38
|
+
onExpandedIdsChange,
|
|
39
|
+
header,
|
|
40
|
+
footer,
|
|
41
|
+
labels,
|
|
42
|
+
className,
|
|
43
|
+
navClassName
|
|
44
|
+
}, ref) {
|
|
45
|
+
const baseId = React.useId();
|
|
46
|
+
const listRef = React.useRef(null);
|
|
47
|
+
const flyoutTimer = React.useRef(null);
|
|
48
|
+
const [openFlyout, setOpenFlyout] = React.useState(null);
|
|
49
|
+
const [internalExpanded, setInternalExpanded] = React.useState([]);
|
|
50
|
+
const controlledExpanded = expandedIds !== void 0 && onExpandedIdsChange !== void 0;
|
|
51
|
+
const expanded = controlledExpanded ? expandedIds : internalExpanded;
|
|
52
|
+
const setExpandedList = React.useCallback(
|
|
53
|
+
(next) => {
|
|
54
|
+
if (controlledExpanded) onExpandedIdsChange?.(next);
|
|
55
|
+
else setInternalExpanded(next);
|
|
56
|
+
},
|
|
57
|
+
[controlledExpanded, onExpandedIdsChange]
|
|
58
|
+
);
|
|
59
|
+
const toggleGroup = React.useCallback(
|
|
60
|
+
(id) => {
|
|
61
|
+
setExpandedList(
|
|
62
|
+
expanded.includes(id) ? expanded.filter((g) => g !== id) : [...expanded, id]
|
|
63
|
+
);
|
|
64
|
+
},
|
|
65
|
+
[expanded, setExpandedList]
|
|
66
|
+
);
|
|
67
|
+
React.useEffect(() => {
|
|
68
|
+
if (controlledExpanded || activeId == null) return;
|
|
69
|
+
const owner = items.find((it) => it.children?.some((c) => c.id === activeId));
|
|
70
|
+
if (owner && !expanded.includes(owner.id)) {
|
|
71
|
+
setExpandedList([...expanded, owner.id]);
|
|
72
|
+
}
|
|
73
|
+
}, [activeId, items, controlledExpanded]);
|
|
74
|
+
React.useEffect(() => {
|
|
75
|
+
return () => {
|
|
76
|
+
if (flyoutTimer.current) clearTimeout(flyoutTimer.current);
|
|
77
|
+
};
|
|
78
|
+
}, []);
|
|
79
|
+
const flyoutEnter = (id) => {
|
|
80
|
+
if (flyoutTimer.current) clearTimeout(flyoutTimer.current);
|
|
81
|
+
flyoutTimer.current = setTimeout(() => setOpenFlyout(id), FLYOUT_DELAY_MS);
|
|
82
|
+
};
|
|
83
|
+
const flyoutLeave = () => {
|
|
84
|
+
if (flyoutTimer.current) clearTimeout(flyoutTimer.current);
|
|
85
|
+
flyoutTimer.current = setTimeout(() => setOpenFlyout(null), FLYOUT_DELAY_MS);
|
|
86
|
+
};
|
|
87
|
+
const flyoutEnterCancel = () => {
|
|
88
|
+
if (flyoutTimer.current) clearTimeout(flyoutTimer.current);
|
|
89
|
+
};
|
|
90
|
+
const navigate = (id) => {
|
|
91
|
+
setOpenFlyout(null);
|
|
92
|
+
onNavigate?.(id);
|
|
93
|
+
};
|
|
94
|
+
const visibleItems = () => {
|
|
95
|
+
const list = listRef.current;
|
|
96
|
+
if (!list) return [];
|
|
97
|
+
return Array.from(
|
|
98
|
+
list.querySelectorAll("[data-as-nav-item]")
|
|
99
|
+
).filter((el) => el.closest("[hidden]") === null);
|
|
100
|
+
};
|
|
101
|
+
const focusSibling = (current, offset) => {
|
|
102
|
+
const all = visibleItems();
|
|
103
|
+
const index = all.indexOf(current);
|
|
104
|
+
if (index === -1) return;
|
|
105
|
+
const next = all[Math.min(Math.max(index + offset, 0), all.length - 1)];
|
|
106
|
+
next?.focus();
|
|
107
|
+
};
|
|
108
|
+
const handleFlyoutArrowKeys = (e) => {
|
|
109
|
+
if (e.key !== "ArrowDown" && e.key !== "ArrowUp") return;
|
|
110
|
+
e.preventDefault();
|
|
111
|
+
const buttons = Array.from(
|
|
112
|
+
e.currentTarget.querySelectorAll(
|
|
113
|
+
"button[data-as-flyout-item]:not([disabled])"
|
|
114
|
+
)
|
|
115
|
+
);
|
|
116
|
+
const index = buttons.indexOf(document.activeElement);
|
|
117
|
+
const step = e.key === "ArrowDown" ? 1 : buttons.length - 1;
|
|
118
|
+
buttons[(index + step) % buttons.length]?.focus();
|
|
119
|
+
};
|
|
120
|
+
const groupTriggerFor = (id) => Array.from(
|
|
121
|
+
listRef.current?.querySelectorAll(
|
|
122
|
+
"[data-as-nav-group-id]"
|
|
123
|
+
) ?? []
|
|
124
|
+
).find((b) => b.dataset.asNavGroupId === id);
|
|
125
|
+
const firstChildFor = (id) => Array.from(
|
|
126
|
+
listRef.current?.querySelectorAll(
|
|
127
|
+
"[data-as-nav-parent-id]"
|
|
128
|
+
) ?? []
|
|
129
|
+
).find((b) => b.dataset.asNavParentId === id && !b.disabled);
|
|
130
|
+
const handleListKeyDown = (e) => {
|
|
131
|
+
const button = e.target.closest(
|
|
132
|
+
"[data-as-nav-item]"
|
|
133
|
+
);
|
|
134
|
+
if (!button) return;
|
|
135
|
+
const groupId = button.dataset.asNavGroupId;
|
|
136
|
+
const parentId = button.dataset.asNavParentId;
|
|
137
|
+
switch (e.key) {
|
|
138
|
+
case "ArrowDown":
|
|
139
|
+
e.preventDefault();
|
|
140
|
+
focusSibling(button, 1);
|
|
141
|
+
break;
|
|
142
|
+
case "ArrowUp":
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
focusSibling(button, -1);
|
|
145
|
+
break;
|
|
146
|
+
case "Home": {
|
|
147
|
+
e.preventDefault();
|
|
148
|
+
visibleItems()[0]?.focus();
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case "End": {
|
|
152
|
+
e.preventDefault();
|
|
153
|
+
const all = visibleItems();
|
|
154
|
+
all[all.length - 1]?.focus();
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
case "ArrowRight":
|
|
158
|
+
if (groupId) {
|
|
159
|
+
e.preventDefault();
|
|
160
|
+
if (!expanded.includes(groupId)) {
|
|
161
|
+
setExpandedList([...expanded, groupId]);
|
|
162
|
+
} else {
|
|
163
|
+
firstChildFor(groupId)?.focus();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
case "ArrowLeft":
|
|
168
|
+
if (parentId) {
|
|
169
|
+
e.preventDefault();
|
|
170
|
+
groupTriggerFor(parentId)?.focus();
|
|
171
|
+
} else if (groupId && expanded.includes(groupId)) {
|
|
172
|
+
e.preventDefault();
|
|
173
|
+
toggleGroup(groupId);
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
const navAria = labels?.navAria ?? "Main navigation";
|
|
179
|
+
const rail = collapsed;
|
|
180
|
+
const flyoutHeader = (text) => /* @__PURE__ */ jsx("div", { className: "border-b border-[var(--as-border)] px-2 py-1.5 text-xs font-bold text-[var(--as-muted-fg)]", children: text });
|
|
181
|
+
return /* @__PURE__ */ jsxs(
|
|
182
|
+
"nav",
|
|
183
|
+
{
|
|
184
|
+
ref,
|
|
185
|
+
"data-as": "sidebar-nav",
|
|
186
|
+
"aria-label": navAria,
|
|
187
|
+
className: cn(
|
|
188
|
+
"relative flex h-full flex-col border-r border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-fg)] transition-[width] duration-200",
|
|
189
|
+
rail ? "w-20" : "w-64",
|
|
190
|
+
className
|
|
191
|
+
),
|
|
192
|
+
children: [
|
|
193
|
+
collapsible ? /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-y-0 -right-3 z-10 hidden flex-col justify-center lg:flex", children: /* @__PURE__ */ jsx(
|
|
194
|
+
"button",
|
|
195
|
+
{
|
|
196
|
+
type: "button",
|
|
197
|
+
onClick: () => onCollapsedChange?.(!collapsed),
|
|
198
|
+
title: collapsed ? labels?.expand ?? "Expand sidebar" : labels?.collapse ?? "Collapse sidebar",
|
|
199
|
+
"aria-label": collapsed ? labels?.expand ?? "Expand sidebar" : labels?.collapse ?? "Collapse sidebar",
|
|
200
|
+
className: "pointer-events-auto flex size-6 items-center justify-center rounded-lg border border-[var(--as-border)] bg-[var(--as-surface-raised)] text-[var(--as-muted-fg)] shadow-[var(--as-shadow-2)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
|
|
201
|
+
children: collapsed ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-3.5", "aria-hidden": true }) : /* @__PURE__ */ jsx(ChevronLeft, { className: "size-3.5", "aria-hidden": true })
|
|
202
|
+
}
|
|
203
|
+
) }) : null,
|
|
204
|
+
header ? /* @__PURE__ */ jsx("div", { className: "shrink-0", children: header }) : null,
|
|
205
|
+
/* @__PURE__ */ jsx(
|
|
206
|
+
"div",
|
|
207
|
+
{
|
|
208
|
+
ref: listRef,
|
|
209
|
+
onKeyDown: handleListKeyDown,
|
|
210
|
+
className: cn("min-h-0 flex-1 overflow-y-auto px-3 py-3", navClassName),
|
|
211
|
+
children: /* @__PURE__ */ jsx("ul", { className: "space-y-1", children: items.map((item, index) => {
|
|
212
|
+
if (item.children !== void 0 && item.children.length === 0) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
const sectionSeen = !rail && item.section !== void 0 && items.findIndex((i) => i.section === item.section) === index;
|
|
216
|
+
const sectionDivider = sectionSeen ? /* @__PURE__ */ jsx(
|
|
217
|
+
"div",
|
|
218
|
+
{
|
|
219
|
+
role: "presentation",
|
|
220
|
+
className: "mt-2 border-t border-[var(--as-border)] px-3 pb-1 pt-3 text-[11px] font-bold uppercase tracking-wide text-[var(--as-muted-fg)]",
|
|
221
|
+
children: item.section
|
|
222
|
+
}
|
|
223
|
+
) : null;
|
|
224
|
+
const active = item.id === activeId;
|
|
225
|
+
const childActive = item.children?.some((c) => c.id === activeId) ?? false;
|
|
226
|
+
const isExpanded = expanded.includes(item.id);
|
|
227
|
+
const Icon = item.icon;
|
|
228
|
+
const groupId = `${baseId}-group-${item.id}`;
|
|
229
|
+
if (item.children && item.children.length > 0 && rail) {
|
|
230
|
+
return /* @__PURE__ */ jsxs("li", { children: [
|
|
231
|
+
sectionDivider,
|
|
232
|
+
/* @__PURE__ */ jsxs(
|
|
233
|
+
PopoverPrimitive.Root,
|
|
234
|
+
{
|
|
235
|
+
open: openFlyout === item.id,
|
|
236
|
+
onOpenChange: (open) => {
|
|
237
|
+
if (!open) setOpenFlyout(null);
|
|
238
|
+
},
|
|
239
|
+
children: [
|
|
240
|
+
/* @__PURE__ */ jsx(PopoverPrimitive.Anchor, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
241
|
+
"button",
|
|
242
|
+
{
|
|
243
|
+
type: "button",
|
|
244
|
+
"data-as-nav-item": true,
|
|
245
|
+
"data-as-nav-group-id": item.id,
|
|
246
|
+
disabled: item.disabled,
|
|
247
|
+
"aria-label": labels?.openGroup ?? `Open ${item.label} menu`,
|
|
248
|
+
"aria-haspopup": "true",
|
|
249
|
+
"aria-expanded": openFlyout === item.id,
|
|
250
|
+
onClick: () => setOpenFlyout(item.id),
|
|
251
|
+
onKeyDown: (e) => {
|
|
252
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
253
|
+
e.preventDefault();
|
|
254
|
+
setOpenFlyout(item.id);
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
onMouseEnter: () => flyoutEnter(item.id),
|
|
258
|
+
onMouseLeave: flyoutLeave,
|
|
259
|
+
className: cn(itemButtonClass(active || childActive), "justify-center px-0"),
|
|
260
|
+
children: Icon ? /* @__PURE__ */ jsx(
|
|
261
|
+
Icon,
|
|
262
|
+
{
|
|
263
|
+
className: cn(
|
|
264
|
+
"size-5 shrink-0",
|
|
265
|
+
active || childActive ? "text-[var(--as-primary)]" : "text-[var(--as-muted-fg)]"
|
|
266
|
+
),
|
|
267
|
+
"aria-hidden": true
|
|
268
|
+
}
|
|
269
|
+
) : null
|
|
270
|
+
}
|
|
271
|
+
) }),
|
|
272
|
+
/* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
|
|
273
|
+
PopoverPrimitive.Content,
|
|
274
|
+
{
|
|
275
|
+
side: "right",
|
|
276
|
+
sideOffset: 8,
|
|
277
|
+
"aria-label": item.label,
|
|
278
|
+
onCloseAutoFocus: (e) => {
|
|
279
|
+
e.preventDefault();
|
|
280
|
+
groupTriggerFor(item.id)?.focus();
|
|
281
|
+
},
|
|
282
|
+
onMouseEnter: flyoutEnterCancel,
|
|
283
|
+
onMouseLeave: flyoutLeave,
|
|
284
|
+
onKeyDown: handleFlyoutArrowKeys,
|
|
285
|
+
className: flyoutContentClass,
|
|
286
|
+
children: [
|
|
287
|
+
flyoutHeader(item.label),
|
|
288
|
+
/* @__PURE__ */ jsx("ul", { className: "mt-1 space-y-0.5", children: item.children.map((child) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
289
|
+
"button",
|
|
290
|
+
{
|
|
291
|
+
type: "button",
|
|
292
|
+
"data-as-flyout-item": true,
|
|
293
|
+
disabled: child.disabled,
|
|
294
|
+
onClick: () => navigate(child.id),
|
|
295
|
+
"aria-current": child.id === activeId ? "page" : void 0,
|
|
296
|
+
className: cn(
|
|
297
|
+
"flex w-full cursor-pointer items-center gap-2 rounded-[calc(var(--as-radius-sm)-2px)] px-2 py-1.5 text-left text-sm outline-none transition-colors focus:bg-[var(--as-secondary)] disabled:pointer-events-none disabled:opacity-50",
|
|
298
|
+
child.id === activeId && "font-bold text-[var(--as-primary)]"
|
|
299
|
+
),
|
|
300
|
+
children: [
|
|
301
|
+
child.icon ? /* @__PURE__ */ jsx(child.icon, { "aria-hidden": true }) : null,
|
|
302
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: child.label }),
|
|
303
|
+
/* @__PURE__ */ jsx(ItemBadge, { badge: child.badge, active: child.id === activeId })
|
|
304
|
+
]
|
|
305
|
+
}
|
|
306
|
+
) }, child.id)) })
|
|
307
|
+
]
|
|
308
|
+
}
|
|
309
|
+
) })
|
|
310
|
+
]
|
|
311
|
+
}
|
|
312
|
+
)
|
|
313
|
+
] }, item.id);
|
|
314
|
+
}
|
|
315
|
+
if (item.children && item.children.length > 0) {
|
|
316
|
+
return /* @__PURE__ */ jsxs("li", { children: [
|
|
317
|
+
sectionDivider,
|
|
318
|
+
/* @__PURE__ */ jsxs(
|
|
319
|
+
"button",
|
|
320
|
+
{
|
|
321
|
+
type: "button",
|
|
322
|
+
"data-as-nav-item": true,
|
|
323
|
+
"data-as-nav-group-id": item.id,
|
|
324
|
+
disabled: item.disabled,
|
|
325
|
+
"aria-expanded": isExpanded,
|
|
326
|
+
"aria-controls": groupId,
|
|
327
|
+
onClick: () => toggleGroup(item.id),
|
|
328
|
+
className: itemButtonClass(active || childActive),
|
|
329
|
+
children: [
|
|
330
|
+
Icon ? /* @__PURE__ */ jsx(
|
|
331
|
+
Icon,
|
|
332
|
+
{
|
|
333
|
+
className: cn(
|
|
334
|
+
"size-4 shrink-0",
|
|
335
|
+
active || childActive ? "text-[var(--as-primary)]" : "text-[var(--as-muted-fg)]"
|
|
336
|
+
),
|
|
337
|
+
"aria-hidden": true
|
|
338
|
+
}
|
|
339
|
+
) : null,
|
|
340
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
|
|
341
|
+
/* @__PURE__ */ jsx(ItemBadge, { badge: item.badge, active: active || childActive }),
|
|
342
|
+
isExpanded ? /* @__PURE__ */ jsx(ChevronDown, { className: "size-4 shrink-0 text-[var(--as-muted-fg)]", "aria-hidden": true }) : /* @__PURE__ */ jsx(ChevronRight, { className: "size-4 shrink-0 text-[var(--as-muted-fg)]", "aria-hidden": true })
|
|
343
|
+
]
|
|
344
|
+
}
|
|
345
|
+
),
|
|
346
|
+
/* @__PURE__ */ jsx("ul", { id: groupId, hidden: !isExpanded, className: "mt-1 space-y-0.5 pl-6", children: item.children.map((child) => {
|
|
347
|
+
const childActiveItem = child.id === activeId;
|
|
348
|
+
const ChildIcon = child.icon;
|
|
349
|
+
const sectionSeen2 = child.section !== void 0 && item.children.findIndex(
|
|
350
|
+
(c) => c.section === child.section
|
|
351
|
+
) === item.children.indexOf(child);
|
|
352
|
+
return /* @__PURE__ */ jsxs("li", { children: [
|
|
353
|
+
sectionSeen2 ? /* @__PURE__ */ jsx(
|
|
354
|
+
"div",
|
|
355
|
+
{
|
|
356
|
+
role: "presentation",
|
|
357
|
+
className: "mt-2 border-t border-[var(--as-border)] px-3 pb-1 pt-3 text-[11px] font-bold uppercase tracking-wide text-[var(--as-muted-fg)]",
|
|
358
|
+
children: child.section
|
|
359
|
+
}
|
|
360
|
+
) : null,
|
|
361
|
+
/* @__PURE__ */ jsxs(
|
|
362
|
+
"button",
|
|
363
|
+
{
|
|
364
|
+
type: "button",
|
|
365
|
+
"data-as-nav-item": true,
|
|
366
|
+
"data-as-nav-parent-id": item.id,
|
|
367
|
+
disabled: child.disabled,
|
|
368
|
+
"aria-current": childActiveItem ? "page" : void 0,
|
|
369
|
+
onClick: () => navigate(child.id),
|
|
370
|
+
className: cn(
|
|
371
|
+
itemButtonClass(childActiveItem),
|
|
372
|
+
"py-2 pl-3 pr-2"
|
|
373
|
+
),
|
|
374
|
+
children: [
|
|
375
|
+
ChildIcon ? /* @__PURE__ */ jsx(ChildIcon, { className: "size-4 shrink-0", "aria-hidden": true }) : null,
|
|
376
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: child.label }),
|
|
377
|
+
/* @__PURE__ */ jsx(ItemBadge, { badge: child.badge, active: childActiveItem })
|
|
378
|
+
]
|
|
379
|
+
}
|
|
380
|
+
)
|
|
381
|
+
] }, child.id);
|
|
382
|
+
}) })
|
|
383
|
+
] }, item.id);
|
|
384
|
+
}
|
|
385
|
+
return /* @__PURE__ */ jsxs("li", { children: [
|
|
386
|
+
sectionDivider,
|
|
387
|
+
/* @__PURE__ */ jsxs(
|
|
388
|
+
"button",
|
|
389
|
+
{
|
|
390
|
+
type: "button",
|
|
391
|
+
"data-as-nav-item": true,
|
|
392
|
+
disabled: item.disabled,
|
|
393
|
+
title: rail ? item.label : void 0,
|
|
394
|
+
"aria-label": rail ? item.label : void 0,
|
|
395
|
+
"aria-current": active ? "page" : void 0,
|
|
396
|
+
onClick: () => navigate(item.id),
|
|
397
|
+
className: cn(itemButtonClass(active), rail && "justify-center px-0"),
|
|
398
|
+
children: [
|
|
399
|
+
Icon ? /* @__PURE__ */ jsx(
|
|
400
|
+
Icon,
|
|
401
|
+
{
|
|
402
|
+
className: cn(
|
|
403
|
+
"shrink-0",
|
|
404
|
+
rail ? "size-5" : "size-4",
|
|
405
|
+
active ? "text-[var(--as-primary)]" : "text-[var(--as-muted-fg)]"
|
|
406
|
+
),
|
|
407
|
+
"aria-hidden": true
|
|
408
|
+
}
|
|
409
|
+
) : null,
|
|
410
|
+
!rail ? /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }) : null,
|
|
411
|
+
!rail ? /* @__PURE__ */ jsx(ItemBadge, { badge: item.badge, active }) : null
|
|
412
|
+
]
|
|
413
|
+
}
|
|
414
|
+
)
|
|
415
|
+
] }, item.id);
|
|
416
|
+
}) })
|
|
417
|
+
}
|
|
418
|
+
),
|
|
419
|
+
footer ? /* @__PURE__ */ jsx("div", { className: "shrink-0 border-t border-[var(--as-border)] p-3", children: footer }) : null
|
|
420
|
+
]
|
|
421
|
+
}
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
export { SidebarNav };
|
|
427
|
+
//# sourceMappingURL=chunk-EZTQMJ5I.js.map
|
|
428
|
+
//# sourceMappingURL=chunk-EZTQMJ5I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/sidebar-nav/SidebarNav.tsx"],"names":["SidebarNav","sectionSeen"],"mappings":"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","file":"chunk-EZTQMJ5I.js","sourcesContent":["import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport {\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface NavChild {\n id: string\n label: string\n icon?: LucideIcon\n badge?: string | number\n /** Divider label rendered above this child (first occurrence only). */\n section?: string\n disabled?: boolean\n}\n\nexport interface NavItem {\n id: string\n label: string\n icon?: LucideIcon\n badge?: string | number\n /** One nesting level; deeper trees stay app-side. */\n children?: NavChild[]\n disabled?: boolean\n /** Divider label rendered above this item (first occurrence only) —\n * for flat sidebars with visual groups. Ignored in the collapsed rail. */\n section?: string\n}\n\nexport interface SidebarNavLabels {\n /** aria-label on the <nav> element. */\n navAria?: string\n /** Collapsed-rail toggle title when collapsed. */\n expand?: string\n /** Collapsed-rail toggle title when expanded. */\n collapse?: string\n /** aria-label for a collapsed group's flyout trigger. */\n openGroup?: string\n}\n\nexport interface SidebarNavProps {\n /** Pre-filtered by the app (roles, feature flags); order = render order. */\n items: NavItem[]\n /** The app resolves route → id; matching logic stays app-side. */\n activeId?: string | null\n /** Fires for leaves only; group triggers toggle expansion instead. */\n onNavigate?: (id: string) => void\n /** Controlled icon rail. */\n collapsed?: boolean\n onCollapsedChange?: (collapsed: boolean) => void\n /** Renders the rail collapse/expand toggle handle (desktop only). */\n collapsible?: boolean\n /** Controlled group expansion; uncontrolled defaults to internal\n * state + auto-expand when activeId enters a group. */\n expandedIds?: string[]\n onExpandedIdsChange?: (ids: string[]) => void\n /** Slot above the list (brand, logo). */\n header?: React.ReactNode\n /** Slot below the list (settings, profile, version). */\n footer?: React.ReactNode\n labels?: SidebarNavLabels\n className?: string\n /** Targets the scrollable list region. */\n navClassName?: string\n}\n\nconst FLYOUT_DELAY_MS = 150\n\nconst itemButtonClass = (active: boolean) =>\n cn(\n 'flex w-full cursor-pointer items-center gap-3 rounded-[var(--as-radius)] px-3 py-2.5 text-left text-sm transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)] disabled:pointer-events-none disabled:opacity-50',\n active\n ? 'bg-[color-mix(in_srgb,var(--as-primary)_12%,transparent)] font-bold text-[var(--as-primary)]'\n : 'font-medium text-[var(--as-fg)] hover:bg-[var(--as-muted)]',\n )\n\nconst flyoutContentClass =\n 'as-anim-pop z-[var(--as-z-popover)] min-w-44 rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-1 text-[var(--as-fg)] shadow-[var(--as-shadow-3)] focus:outline-none'\n\nfunction Badge({ value, active }: { value: string | number; active: boolean }) {\n return (\n <span\n className={cn(\n 'inline-flex min-w-5 shrink-0 items-center justify-center rounded-full px-1.5 py-0.5 text-[11px] font-bold leading-none',\n active\n ? 'bg-[var(--as-primary)] text-[var(--as-primary-fg)]'\n : 'bg-[var(--as-muted)] text-[var(--as-muted-fg)]',\n )}\n >\n {value}\n </span>\n )\n}\n\nfunction ItemBadge({ badge, active }: { badge?: string | number; active: boolean }) {\n if (badge === undefined) return null\n return (\n <span className=\"ml-auto\">\n <Badge value={badge} active={active} />\n </span>\n )\n}\n\nexport const SidebarNav = React.forwardRef<HTMLElement, SidebarNavProps>(\n function SidebarNav(\n {\n items,\n activeId,\n onNavigate,\n collapsed = false,\n onCollapsedChange,\n collapsible = false,\n expandedIds,\n onExpandedIdsChange,\n header,\n footer,\n labels,\n className,\n navClassName,\n },\n ref,\n ) {\n const baseId = React.useId()\n const listRef = React.useRef<HTMLDivElement>(null)\n const flyoutTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const [openFlyout, setOpenFlyout] = React.useState<string | null>(null)\n const [internalExpanded, setInternalExpanded] = React.useState<string[]>([])\n\n const controlledExpanded =\n expandedIds !== undefined && onExpandedIdsChange !== undefined\n const expanded = controlledExpanded ? (expandedIds as string[]) : internalExpanded\n\n const setExpandedList = React.useCallback(\n (next: string[]) => {\n if (controlledExpanded) onExpandedIdsChange?.(next)\n else setInternalExpanded(next)\n },\n [controlledExpanded, onExpandedIdsChange],\n )\n\n const toggleGroup = React.useCallback(\n (id: string) => {\n setExpandedList(\n expanded.includes(id)\n ? expanded.filter((g) => g !== id)\n : [...expanded, id],\n )\n },\n [expanded, setExpandedList],\n )\n\n // Auto-expand the group containing the active item so the highlighted\n // entry is always visible (uncontrolled mode only — the app owns\n // expansion when controlled).\n React.useEffect(() => {\n if (controlledExpanded || activeId == null) return\n const owner = items.find((it) => it.children?.some((c) => c.id === activeId))\n if (owner && !expanded.includes(owner.id)) {\n setExpandedList([...expanded, owner.id])\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeId, items, controlledExpanded])\n\n React.useEffect(() => {\n return () => {\n if (flyoutTimer.current) clearTimeout(flyoutTimer.current)\n }\n }, [])\n\n const flyoutEnter = (id: string) => {\n if (flyoutTimer.current) clearTimeout(flyoutTimer.current)\n flyoutTimer.current = setTimeout(() => setOpenFlyout(id), FLYOUT_DELAY_MS)\n }\n const flyoutLeave = () => {\n if (flyoutTimer.current) clearTimeout(flyoutTimer.current)\n flyoutTimer.current = setTimeout(() => setOpenFlyout(null), FLYOUT_DELAY_MS)\n }\n const flyoutEnterCancel = () => {\n if (flyoutTimer.current) clearTimeout(flyoutTimer.current)\n }\n\n const navigate = (id: string) => {\n setOpenFlyout(null)\n onNavigate?.(id)\n }\n\n // ---- keyboard navigation over the visible list ----\n const visibleItems = (): HTMLButtonElement[] => {\n const list = listRef.current\n if (!list) return []\n return Array.from(\n list.querySelectorAll<HTMLButtonElement>('[data-as-nav-item]'),\n ).filter((el) => el.closest('[hidden]') === null)\n }\n\n const focusSibling = (current: HTMLElement, offset: number) => {\n const all = visibleItems()\n const index = all.indexOf(current as HTMLButtonElement)\n if (index === -1) return\n const next = all[Math.min(Math.max(index + offset, 0), all.length - 1)]\n next?.focus()\n }\n\n const handleFlyoutArrowKeys = (e: React.KeyboardEvent) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return\n e.preventDefault()\n const buttons = Array.from(\n (e.currentTarget as HTMLElement).querySelectorAll<HTMLButtonElement>(\n 'button[data-as-flyout-item]:not([disabled])',\n ),\n )\n const index = buttons.indexOf(document.activeElement as HTMLButtonElement)\n const step = e.key === 'ArrowDown' ? 1 : buttons.length - 1\n buttons[(index + step) % buttons.length]?.focus()\n }\n\n const groupTriggerFor = (id: string) =>\n Array.from(\n listRef.current?.querySelectorAll<HTMLButtonElement>(\n '[data-as-nav-group-id]',\n ) ?? [],\n ).find((b) => b.dataset.asNavGroupId === id)\n\n const firstChildFor = (id: string) =>\n Array.from(\n listRef.current?.querySelectorAll<HTMLButtonElement>(\n '[data-as-nav-parent-id]',\n ) ?? [],\n ).find((b) => b.dataset.asNavParentId === id && !b.disabled)\n\n const handleListKeyDown = (e: React.KeyboardEvent) => {\n const button = (e.target as HTMLElement).closest<HTMLButtonElement>(\n '[data-as-nav-item]',\n )\n if (!button) return\n const groupId = button.dataset.asNavGroupId\n const parentId = button.dataset.asNavParentId\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n focusSibling(button, 1)\n break\n case 'ArrowUp':\n e.preventDefault()\n focusSibling(button, -1)\n break\n case 'Home': {\n e.preventDefault()\n visibleItems()[0]?.focus()\n break\n }\n case 'End': {\n e.preventDefault()\n const all = visibleItems()\n all[all.length - 1]?.focus()\n break\n }\n case 'ArrowRight':\n if (groupId) {\n e.preventDefault()\n if (!expanded.includes(groupId)) {\n setExpandedList([...expanded, groupId])\n } else {\n firstChildFor(groupId)?.focus()\n }\n }\n break\n case 'ArrowLeft':\n if (parentId) {\n e.preventDefault()\n groupTriggerFor(parentId)?.focus()\n } else if (groupId && expanded.includes(groupId)) {\n e.preventDefault()\n toggleGroup(groupId)\n }\n break\n }\n }\n\n const navAria = labels?.navAria ?? 'Main navigation'\n const rail = collapsed\n\n const flyoutHeader = (text: string) => (\n <div className=\"border-b border-[var(--as-border)] px-2 py-1.5 text-xs font-bold text-[var(--as-muted-fg)]\">\n {text}\n </div>\n )\n\n return (\n <nav\n ref={ref}\n data-as=\"sidebar-nav\"\n aria-label={navAria}\n className={cn(\n 'relative flex h-full flex-col border-r border-[var(--as-border)] bg-[var(--as-surface)] text-[var(--as-fg)] transition-[width] duration-200',\n rail ? 'w-20' : 'w-64',\n className,\n )}\n >\n {collapsible ? (\n <div className=\"pointer-events-none absolute inset-y-0 -right-3 z-10 hidden flex-col justify-center lg:flex\">\n <button\n type=\"button\"\n onClick={() => onCollapsedChange?.(!collapsed)}\n title={\n collapsed\n ? (labels?.expand ?? 'Expand sidebar')\n : (labels?.collapse ?? 'Collapse sidebar')\n }\n aria-label={\n collapsed\n ? (labels?.expand ?? 'Expand sidebar')\n : (labels?.collapse ?? 'Collapse sidebar')\n }\n className=\"pointer-events-auto flex size-6 items-center justify-center rounded-lg border border-[var(--as-border)] bg-[var(--as-surface-raised)] text-[var(--as-muted-fg)] shadow-[var(--as-shadow-2)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n {collapsed ? (\n <ChevronRight className=\"size-3.5\" aria-hidden />\n ) : (\n <ChevronLeft className=\"size-3.5\" aria-hidden />\n )}\n </button>\n </div>\n ) : null}\n\n {header ? <div className=\"shrink-0\">{header}</div> : null}\n\n <div\n ref={listRef}\n onKeyDown={handleListKeyDown}\n className={cn('min-h-0 flex-1 overflow-y-auto px-3 py-3', navClassName)}\n >\n <ul className=\"space-y-1\">\n {items.map((item, index) => {\n // Group whose children were all filtered out app-side renders\n // nothing (presentational).\n if (item.children !== undefined && item.children.length === 0) {\n return null\n }\n const sectionSeen =\n !rail &&\n item.section !== undefined &&\n items.findIndex((i) => i.section === item.section) === index\n const sectionDivider = sectionSeen ? (\n <div\n role=\"presentation\"\n className=\"mt-2 border-t border-[var(--as-border)] px-3 pb-1 pt-3 text-[11px] font-bold uppercase tracking-wide text-[var(--as-muted-fg)]\"\n >\n {item.section}\n </div>\n ) : null\n const active = item.id === activeId\n const childActive = item.children?.some((c) => c.id === activeId) ?? false\n const isExpanded = expanded.includes(item.id)\n const Icon = item.icon\n const groupId = `${baseId}-group-${item.id}`\n\n if (item.children && item.children.length > 0 && rail) {\n return (\n <li key={item.id}>\n {sectionDivider}\n <PopoverPrimitive.Root\n open={openFlyout === item.id}\n onOpenChange={(open) => {\n if (!open) setOpenFlyout(null)\n }}\n >\n <PopoverPrimitive.Anchor asChild>\n <button\n type=\"button\"\n data-as-nav-item\n data-as-nav-group-id={item.id}\n disabled={item.disabled}\n aria-label={labels?.openGroup ?? `Open ${item.label} menu`}\n aria-haspopup=\"true\"\n aria-expanded={openFlyout === item.id}\n onClick={() => setOpenFlyout(item.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setOpenFlyout(item.id)\n }\n }}\n onMouseEnter={() => flyoutEnter(item.id)}\n onMouseLeave={flyoutLeave}\n className={cn(itemButtonClass(active || childActive), 'justify-center px-0')}\n >\n {Icon ? (\n <Icon\n className={cn(\n 'size-5 shrink-0',\n active || childActive\n ? 'text-[var(--as-primary)]'\n : 'text-[var(--as-muted-fg)]',\n )}\n aria-hidden\n />\n ) : null}\n </button>\n </PopoverPrimitive.Anchor>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side=\"right\"\n sideOffset={8}\n aria-label={item.label}\n onCloseAutoFocus={(e) => {\n // Menu-standard: focus returns to the trigger.\n e.preventDefault()\n groupTriggerFor(item.id)?.focus()\n }}\n onMouseEnter={flyoutEnterCancel}\n onMouseLeave={flyoutLeave}\n onKeyDown={handleFlyoutArrowKeys}\n className={flyoutContentClass}\n >\n {flyoutHeader(item.label)}\n <ul className=\"mt-1 space-y-0.5\">\n {item.children.map((child) => (\n <li key={child.id}>\n <button\n type=\"button\"\n data-as-flyout-item\n disabled={child.disabled}\n onClick={() => navigate(child.id)}\n aria-current={child.id === activeId ? 'page' : undefined}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-2 rounded-[calc(var(--as-radius-sm)-2px)] px-2 py-1.5 text-left text-sm outline-none transition-colors focus:bg-[var(--as-secondary)] disabled:pointer-events-none disabled:opacity-50',\n child.id === activeId && 'font-bold text-[var(--as-primary)]',\n )}\n >\n {child.icon ? <child.icon aria-hidden /> : null}\n <span className=\"min-w-0 flex-1 truncate\">{child.label}</span>\n <ItemBadge badge={child.badge} active={child.id === activeId} />\n </button>\n </li>\n ))}\n </ul>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </li>\n )\n }\n\n if (item.children && item.children.length > 0) {\n return (\n <li key={item.id}>\n {sectionDivider}\n <button\n type=\"button\"\n data-as-nav-item\n data-as-nav-group-id={item.id}\n disabled={item.disabled}\n aria-expanded={isExpanded}\n aria-controls={groupId}\n onClick={() => toggleGroup(item.id)}\n className={itemButtonClass(active || childActive)}\n >\n {Icon ? (\n <Icon\n className={cn(\n 'size-4 shrink-0',\n active || childActive\n ? 'text-[var(--as-primary)]'\n : 'text-[var(--as-muted-fg)]',\n )}\n aria-hidden\n />\n ) : null}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <ItemBadge badge={item.badge} active={active || childActive} />\n {isExpanded ? (\n <ChevronDown className=\"size-4 shrink-0 text-[var(--as-muted-fg)]\" aria-hidden />\n ) : (\n <ChevronRight className=\"size-4 shrink-0 text-[var(--as-muted-fg)]\" aria-hidden />\n )}\n </button>\n <ul id={groupId} hidden={!isExpanded} className=\"mt-1 space-y-0.5 pl-6\">\n {item.children.map((child) => {\n const childActiveItem = child.id === activeId\n const ChildIcon = child.icon\n const sectionSeen =\n child.section !== undefined &&\n item.children!.findIndex(\n (c) => c.section === child.section,\n ) === item.children!.indexOf(child)\n return (\n <li key={child.id}>\n {sectionSeen ? (\n <div\n role=\"presentation\"\n className=\"mt-2 border-t border-[var(--as-border)] px-3 pb-1 pt-3 text-[11px] font-bold uppercase tracking-wide text-[var(--as-muted-fg)]\"\n >\n {child.section}\n </div>\n ) : null}\n <button\n type=\"button\"\n data-as-nav-item\n data-as-nav-parent-id={item.id}\n disabled={child.disabled}\n aria-current={childActiveItem ? 'page' : undefined}\n onClick={() => navigate(child.id)}\n className={cn(\n itemButtonClass(childActiveItem),\n 'py-2 pl-3 pr-2',\n )}\n >\n {ChildIcon ? (\n <ChildIcon className=\"size-4 shrink-0\" aria-hidden />\n ) : null}\n <span className=\"min-w-0 flex-1 truncate\">{child.label}</span>\n <ItemBadge badge={child.badge} active={childActiveItem} />\n </button>\n </li>\n )\n })}\n </ul>\n </li>\n )\n }\n\n return (\n <li key={item.id}>\n {sectionDivider}\n <button\n type=\"button\"\n data-as-nav-item\n disabled={item.disabled}\n title={rail ? item.label : undefined}\n aria-label={rail ? item.label : undefined}\n aria-current={active ? 'page' : undefined}\n onClick={() => navigate(item.id)}\n className={cn(itemButtonClass(active), rail && 'justify-center px-0')}\n >\n {Icon ? (\n <Icon\n className={cn(\n 'shrink-0',\n rail ? 'size-5' : 'size-4',\n active ? 'text-[var(--as-primary)]' : 'text-[var(--as-muted-fg)]',\n )}\n aria-hidden\n />\n ) : null}\n {!rail ? <span className=\"min-w-0 flex-1 truncate\">{item.label}</span> : null}\n {!rail ? <ItemBadge badge={item.badge} active={active} /> : null}\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n\n {footer ? (\n <div className=\"shrink-0 border-t border-[var(--as-border)] p-3\">{footer}</div>\n ) : null}\n </nav>\n )\n },\n)\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { cn } from './chunk-BLJWR4ZV.js';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { X } from 'lucide-react';
|
|
3
|
+
import { X, Plus } from 'lucide-react';
|
|
4
4
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
function escapeRegex(value) {
|
|
@@ -14,12 +14,16 @@ var ChipInput = React.forwardRef(
|
|
|
14
14
|
separators = [","],
|
|
15
15
|
inputLabel = "Add",
|
|
16
16
|
removeLabel = "Remove",
|
|
17
|
+
addLabel,
|
|
18
|
+
hint,
|
|
17
19
|
disabled = false,
|
|
18
20
|
className,
|
|
19
21
|
...props
|
|
20
22
|
}, ref) {
|
|
21
23
|
const [draft, setDraft] = React.useState("");
|
|
22
24
|
const inputRef = React.useRef(null);
|
|
25
|
+
const hintId = React.useId();
|
|
26
|
+
const hasDraft = draft.trim().length > 0;
|
|
23
27
|
const commit = (raw) => {
|
|
24
28
|
const separatorPattern = new RegExp(
|
|
25
29
|
`[${separators.map(escapeRegex).join("")}\\n\\r]`
|
|
@@ -60,6 +64,7 @@ var ChipInput = React.forwardRef(
|
|
|
60
64
|
{
|
|
61
65
|
ref,
|
|
62
66
|
"data-as": "chip-input",
|
|
67
|
+
"data-pending": hasDraft || void 0,
|
|
63
68
|
role: "group",
|
|
64
69
|
onClick: () => {
|
|
65
70
|
if (!disabled) inputRef.current?.focus();
|
|
@@ -110,9 +115,41 @@ var ChipInput = React.forwardRef(
|
|
|
110
115
|
if (draft.trim()) commit(draft);
|
|
111
116
|
},
|
|
112
117
|
placeholder: value.length === 0 ? placeholder : "",
|
|
113
|
-
|
|
118
|
+
"aria-describedby": hint ? hintId : void 0,
|
|
119
|
+
className: cn(
|
|
120
|
+
"min-w-24 flex-1 bg-transparent text-sm text-[var(--as-fg)] outline-none placeholder:text-[var(--as-muted-fg)]",
|
|
121
|
+
hasDraft && "rounded-[calc(var(--as-radius-sm)-2px)] border border-dashed border-[var(--as-primary)] bg-[color-mix(in_srgb,var(--as-primary)_8%,transparent)] px-2 py-0.5"
|
|
122
|
+
)
|
|
114
123
|
}
|
|
115
|
-
)
|
|
124
|
+
),
|
|
125
|
+
hint ? /* @__PURE__ */ jsx(
|
|
126
|
+
"span",
|
|
127
|
+
{
|
|
128
|
+
id: hintId,
|
|
129
|
+
"data-as": "chip-input-hint",
|
|
130
|
+
className: "w-full text-xs text-[var(--as-muted-fg)]",
|
|
131
|
+
children: hint
|
|
132
|
+
}
|
|
133
|
+
) : null,
|
|
134
|
+
addLabel ? /* @__PURE__ */ jsxs(
|
|
135
|
+
"button",
|
|
136
|
+
{
|
|
137
|
+
type: "button",
|
|
138
|
+
disabled: disabled || !draft.trim(),
|
|
139
|
+
"aria-label": addLabel,
|
|
140
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
141
|
+
onClick: (event) => {
|
|
142
|
+
event.stopPropagation();
|
|
143
|
+
commit(draft);
|
|
144
|
+
inputRef.current?.focus();
|
|
145
|
+
},
|
|
146
|
+
className: "inline-flex shrink-0 items-center gap-1 rounded-[calc(var(--as-radius-sm)-2px)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] px-2 py-0.5 text-xs font-medium text-[var(--as-fg)] transition-colors hover:border-[var(--as-primary)] hover:text-[var(--as-primary)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)] disabled:pointer-events-none disabled:opacity-50",
|
|
147
|
+
children: [
|
|
148
|
+
/* @__PURE__ */ jsx(Plus, { className: "size-3", "aria-hidden": true }),
|
|
149
|
+
addLabel
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
) : null
|
|
116
153
|
]
|
|
117
154
|
}
|
|
118
155
|
);
|
|
@@ -120,5 +157,5 @@ var ChipInput = React.forwardRef(
|
|
|
120
157
|
);
|
|
121
158
|
|
|
122
159
|
export { ChipInput };
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
124
|
-
//# sourceMappingURL=chunk-
|
|
160
|
+
//# sourceMappingURL=chunk-HIRR2F4R.js.map
|
|
161
|
+
//# sourceMappingURL=chunk-HIRR2F4R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/chip-input/ChipInput.tsx"],"names":["ChipInput"],"mappings":"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","file":"chunk-HIRR2F4R.js","sourcesContent":["import * as React from 'react'\nimport { Plus, X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface ChipInputProps\n extends Omit<React.ComponentProps<'div'>, 'onChange'> {\n value: string[]\n onChange: (value: string[]) => void\n placeholder?: string\n separators?: string[]\n inputLabel?: string\n removeLabel?: string\n addLabel?: string\n hint?: string\n disabled?: boolean\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nexport const ChipInput = React.forwardRef<HTMLDivElement, ChipInputProps>(\n function ChipInput(\n {\n value,\n onChange,\n placeholder,\n separators = [','],\n inputLabel = 'Add',\n removeLabel = 'Remove',\n addLabel,\n hint,\n disabled = false,\n className,\n ...props\n },\n ref,\n ) {\n const [draft, setDraft] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement>(null)\n const hintId = React.useId()\n const hasDraft = draft.trim().length > 0\n\n const commit = (raw: string) => {\n const separatorPattern = new RegExp(\n `[${separators.map(escapeRegex).join('')}\\\\n\\\\r]`,\n )\n const existing = new Set(value.map((chip) => chip.toLowerCase()))\n const next = [...value]\n for (const part of raw.split(separatorPattern)) {\n const trimmed = part.trim()\n if (trimmed && !existing.has(trimmed.toLowerCase())) {\n next.push(trimmed)\n existing.add(trimmed.toLowerCase())\n }\n }\n if (next.length !== value.length) {\n onChange(next)\n }\n setDraft('')\n }\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' || separators.includes(event.key)) {\n event.preventDefault()\n commit(draft)\n } else if (event.key === 'Backspace' && draft === '' && value.length > 0) {\n event.preventDefault()\n onChange(value.slice(0, -1))\n }\n }\n\n const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n event.preventDefault()\n const text = event.clipboardData.getData('text')\n commit(`${draft}${text}`)\n }\n\n const removeAt = (index: number) => {\n onChange(value.filter((_, i) => i !== index))\n }\n\n return (\n <div\n ref={ref}\n data-as=\"chip-input\"\n data-pending={hasDraft || undefined}\n role=\"group\"\n onClick={() => {\n if (!disabled) inputRef.current?.focus()\n }}\n className={cn(\n 'flex min-h-9 w-full cursor-text flex-wrap items-center gap-1.5 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-2.5 py-1.5 text-sm outline-none transition-colors focus-within:border-[var(--as-focus-ring)] focus-within:ring-2 focus-within:ring-[var(--as-focus-ring)]',\n disabled && 'cursor-not-allowed opacity-50',\n className,\n )}\n {...props}\n >\n {value.map((chip, index) => (\n <span\n key={`${chip}-${index}`}\n className=\"inline-flex items-center gap-1 rounded-[calc(var(--as-radius-sm)-2px)] bg-[color-mix(in_srgb,var(--as-primary)_12%,transparent)] py-0.5 pl-2.5 pr-1.5 text-xs font-medium text-[var(--as-primary)]\"\n >\n {chip}\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={`${removeLabel} ${chip}`}\n onClick={(event) => {\n event.stopPropagation()\n removeAt(index)\n }}\n className=\"cursor-pointer rounded-full opacity-70 transition-colors hover:text-[var(--as-danger)] hover:opacity-100 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)] disabled:pointer-events-none\"\n >\n <X className=\"size-3\" aria-hidden />\n </button>\n </span>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n aria-label={inputLabel}\n disabled={disabled}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onBlur={() => {\n if (draft.trim()) commit(draft)\n }}\n placeholder={value.length === 0 ? placeholder : ''}\n aria-describedby={hint ? hintId : undefined}\n className={cn(\n 'min-w-24 flex-1 bg-transparent text-sm text-[var(--as-fg)] outline-none placeholder:text-[var(--as-muted-fg)]',\n hasDraft &&\n 'rounded-[calc(var(--as-radius-sm)-2px)] border border-dashed border-[var(--as-primary)] bg-[color-mix(in_srgb,var(--as-primary)_8%,transparent)] px-2 py-0.5',\n )}\n />\n {hint ? (\n <span\n id={hintId}\n data-as=\"chip-input-hint\"\n className=\"w-full text-xs text-[var(--as-muted-fg)]\"\n >\n {hint}\n </span>\n ) : null}\n {addLabel ? (\n <button\n type=\"button\"\n disabled={disabled || !draft.trim()}\n aria-label={addLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => {\n event.stopPropagation()\n commit(draft)\n inputRef.current?.focus()\n }}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-[calc(var(--as-radius-sm)-2px)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] px-2 py-0.5 text-xs font-medium text-[var(--as-fg)] transition-colors hover:border-[var(--as-primary)] hover:text-[var(--as-primary)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)] disabled:pointer-events-none disabled:opacity-50\"\n >\n <Plus className=\"size-3\" aria-hidden />\n {addLabel}\n </button>\n ) : null}\n </div>\n )\n },\n)\n"]}
|
|
@@ -53,7 +53,7 @@ var ConnectionTestRow = React.forwardRef(function ConnectionTestRow2({
|
|
|
53
53
|
latencyLabel
|
|
54
54
|
] }) : null
|
|
55
55
|
] }) : null,
|
|
56
|
-
status === "fail" && errorMessage ? /* @__PURE__ */ jsx("span", { className: "
|
|
56
|
+
status === "fail" && errorMessage ? /* @__PURE__ */ jsx("span", { className: "min-w-0 whitespace-pre-wrap break-words text-xs text-[var(--as-danger)]", children: errorMessage }) : null,
|
|
57
57
|
meta ? /* @__PURE__ */ jsx("span", { className: "text-xs text-[var(--as-muted-fg)]", children: meta }) : null
|
|
58
58
|
] }),
|
|
59
59
|
onTest ? /* @__PURE__ */ jsxs(
|
|
@@ -75,5 +75,5 @@ var ConnectionTestRow = React.forwardRef(function ConnectionTestRow2({
|
|
|
75
75
|
});
|
|
76
76
|
|
|
77
77
|
export { ConnectionTestRow };
|
|
78
|
-
//# sourceMappingURL=chunk-
|
|
79
|
-
//# sourceMappingURL=chunk-
|
|
78
|
+
//# sourceMappingURL=chunk-OGQF4XJB.js.map
|
|
79
|
+
//# sourceMappingURL=chunk-OGQF4XJB.js.map
|