@neuronection/assistant-ui 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +26 -5
  3. package/dist/breadcrumbs.d.ts +24 -0
  4. package/dist/breadcrumbs.js +3 -0
  5. package/dist/breadcrumbs.js.map +1 -0
  6. package/dist/chip-input.d.ts +14 -0
  7. package/dist/chip-input.js +3 -0
  8. package/dist/chip-input.js.map +1 -0
  9. package/dist/chip-list.d.ts +15 -0
  10. package/dist/chip-list.js +3 -0
  11. package/dist/chip-list.js.map +1 -0
  12. package/dist/chunk-5AVBKEDQ.js +74 -0
  13. package/dist/chunk-5AVBKEDQ.js.map +1 -0
  14. package/dist/{chunk-GPIN2ITX.js → chunk-5HXDKOBY.js} +24 -7
  15. package/dist/chunk-5HXDKOBY.js.map +1 -0
  16. package/dist/chunk-5X3RYDPC.js +54 -0
  17. package/dist/chunk-5X3RYDPC.js.map +1 -0
  18. package/dist/chunk-CZ2BL2ZL.js +89 -0
  19. package/dist/chunk-CZ2BL2ZL.js.map +1 -0
  20. package/dist/chunk-MEBOS2FX.js +359 -0
  21. package/dist/chunk-MEBOS2FX.js.map +1 -0
  22. package/dist/chunk-TFS2NUET.js +66 -0
  23. package/dist/chunk-TFS2NUET.js.map +1 -0
  24. package/dist/chunk-TPLQL62V.js +124 -0
  25. package/dist/chunk-TPLQL62V.js.map +1 -0
  26. package/dist/chunk-UIUALJNR.js +110 -0
  27. package/dist/chunk-UIUALJNR.js.map +1 -0
  28. package/dist/chunk-WPO6CDA4.js +92 -0
  29. package/dist/chunk-WPO6CDA4.js.map +1 -0
  30. package/dist/chunk-XLD2BPTT.js +82 -0
  31. package/dist/chunk-XLD2BPTT.js.map +1 -0
  32. package/dist/copy-button.d.ts +14 -0
  33. package/dist/copy-button.js +3 -0
  34. package/dist/copy-button.js.map +1 -0
  35. package/dist/date-picker.d.ts +27 -0
  36. package/dist/date-picker.js +3 -0
  37. package/dist/date-picker.js.map +1 -0
  38. package/dist/form-modal.d.ts +6 -1
  39. package/dist/form-modal.js +1 -1
  40. package/dist/index.d.ts +10 -2
  41. package/dist/index.js +20 -11
  42. package/dist/modal.d.ts +23 -1
  43. package/dist/modal.js +1 -0
  44. package/dist/range-bar.d.ts +15 -0
  45. package/dist/range-bar.js +3 -0
  46. package/dist/range-bar.js.map +1 -0
  47. package/dist/scale-slider.d.ts +18 -0
  48. package/dist/scale-slider.js +3 -0
  49. package/dist/scale-slider.js.map +1 -0
  50. package/dist/styles.css +1 -1
  51. package/dist/table.d.ts +10 -0
  52. package/dist/table.js +3 -0
  53. package/dist/table.js.map +1 -0
  54. package/package.json +36 -2
  55. package/dist/chunk-GPIN2ITX.js.map +0 -1
  56. package/dist/chunk-IFNT6JSQ.js +0 -3
  57. package/dist/chunk-IFNT6JSQ.js.map +0 -1
@@ -0,0 +1,359 @@
1
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-CI56SSO2.js';
2
+ import { cn } from './chunk-BLJWR4ZV.js';
3
+ import * as React from 'react';
4
+ import { parseISO, isValid, startOfDay, startOfMonth, endOfMonth, startOfWeek, endOfWeek, addDays, format, isSameDay, isSameMonth, setMonth, setYear, subMonths, subYears, addMonths, addYears } from 'date-fns';
5
+ import { Calendar, X, ChevronLeft, ChevronDown, ChevronRight } from 'lucide-react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ function dayKey(date) {
9
+ return format(date, "yyyy-MM-dd");
10
+ }
11
+ var DatePicker = React.forwardRef(
12
+ function DatePicker2({
13
+ value,
14
+ onChange,
15
+ onClear,
16
+ allowClear = false,
17
+ clearLabel = "Clear",
18
+ placeholder = "Select date",
19
+ displayFormat = "dd/MM/yyyy",
20
+ minDate,
21
+ maxDate,
22
+ weekStartsOn = 1,
23
+ disabled = false,
24
+ required,
25
+ variant = "default",
26
+ id,
27
+ name,
28
+ label = "Choose date",
29
+ prevLabel = "Previous",
30
+ nextLabel = "Next",
31
+ className,
32
+ panelClassName
33
+ }, ref) {
34
+ const autoId = React.useId();
35
+ const hiddenId = id ?? `date-picker-${autoId}`;
36
+ const [open, setOpen] = React.useState(false);
37
+ const [viewMode, setViewMode] = React.useState("days");
38
+ const [currentDate, setCurrentDate] = React.useState(() => /* @__PURE__ */ new Date());
39
+ const [focusedDay, setFocusedDay] = React.useState(() => /* @__PURE__ */ new Date());
40
+ const [yearPage, setYearPage] = React.useState(() => (/* @__PURE__ */ new Date()).getFullYear());
41
+ const gridRef = React.useRef(null);
42
+ const selectedDate = React.useMemo(() => {
43
+ if (!value) return null;
44
+ const parsed = parseISO(value);
45
+ return isValid(parsed) ? parsed : null;
46
+ }, [value]);
47
+ const isDisabled = React.useCallback(
48
+ (date) => Boolean(minDate && date < startOfDay(minDate)) || Boolean(maxDate && date > startOfDay(maxDate)),
49
+ [minDate, maxDate]
50
+ );
51
+ const handleOpenChange = (next) => {
52
+ setOpen(next);
53
+ if (next) {
54
+ const base = selectedDate ?? /* @__PURE__ */ new Date();
55
+ setCurrentDate(base);
56
+ setFocusedDay(base);
57
+ setYearPage(base.getFullYear());
58
+ setViewMode("days");
59
+ }
60
+ };
61
+ const handleSelect = (date) => {
62
+ if (isDisabled(date)) return;
63
+ onChange(format(date, "yyyy-MM-dd"));
64
+ setOpen(false);
65
+ };
66
+ const handleClear = (event) => {
67
+ event.stopPropagation();
68
+ onChange("");
69
+ onClear?.();
70
+ setOpen(false);
71
+ };
72
+ const moveFocus = (next) => {
73
+ if (isDisabled(next)) return;
74
+ setFocusedDay(next);
75
+ setCurrentDate(
76
+ (current) => isSameMonth(current, next) ? current : startOfMonth(next)
77
+ );
78
+ };
79
+ const handleGridKeyDown = (event) => {
80
+ const step = event.key === "ArrowLeft" ? -1 : event.key === "ArrowRight" ? 1 : event.key === "ArrowUp" ? -7 : event.key === "ArrowDown" ? 7 : 0;
81
+ if (step !== 0) {
82
+ event.preventDefault();
83
+ moveFocus(addDays(focusedDay, step));
84
+ return;
85
+ }
86
+ if (event.key === "PageUp" || event.key === "PageDown") {
87
+ event.preventDefault();
88
+ const direction = event.key === "PageUp" ? -1 : 1;
89
+ moveFocus(addMonths(focusedDay, direction));
90
+ return;
91
+ }
92
+ if (event.key === "Home") {
93
+ event.preventDefault();
94
+ moveFocus(startOfMonth(focusedDay));
95
+ } else if (event.key === "End") {
96
+ event.preventDefault();
97
+ moveFocus(endOfMonth(focusedDay));
98
+ }
99
+ };
100
+ React.useEffect(() => {
101
+ if (!open || viewMode !== "days") return;
102
+ const target = gridRef.current?.querySelector(
103
+ `[data-day="${dayKey(focusedDay)}"]`
104
+ );
105
+ target?.focus();
106
+ }, [open, viewMode, focusedDay]);
107
+ const monthStart = startOfMonth(currentDate);
108
+ const monthEnd = endOfMonth(monthStart);
109
+ const gridStart = startOfWeek(monthStart, { weekStartsOn });
110
+ const gridEnd = endOfWeek(monthEnd, { weekStartsOn });
111
+ const weeks = [];
112
+ let cursor = gridStart;
113
+ while (cursor <= gridEnd) {
114
+ const week = [];
115
+ for (let i = 0; i < 7; i++) {
116
+ week.push(cursor);
117
+ cursor = addDays(cursor, 1);
118
+ }
119
+ weeks.push(week);
120
+ }
121
+ const today = /* @__PURE__ */ new Date();
122
+ const weekdayStart = startOfWeek(/* @__PURE__ */ new Date(), { weekStartsOn });
123
+ const headerTitle = viewMode === "days" ? format(currentDate, "MMMM yyyy") : viewMode === "months" ? format(currentDate, "yyyy") : `${Math.floor(yearPage / 12) * 12} \u2013 ${Math.floor(yearPage / 12) * 12 + 11}`;
124
+ const handlePrev = () => {
125
+ if (viewMode === "days") setCurrentDate(subMonths(currentDate, 1));
126
+ else if (viewMode === "months") setCurrentDate(subYears(currentDate, 1));
127
+ else setYearPage(yearPage - 12);
128
+ };
129
+ const handleNext = () => {
130
+ if (viewMode === "days") setCurrentDate(addMonths(currentDate, 1));
131
+ else if (viewMode === "months") setCurrentDate(addYears(currentDate, 1));
132
+ else setYearPage(yearPage + 12);
133
+ };
134
+ const toggleViewMode = () => {
135
+ if (viewMode !== "years") setViewMode("years");
136
+ };
137
+ const navButtonClass = "cursor-pointer rounded-[var(--as-radius-sm)] p-1.5 text-[var(--as-muted-fg)] transition-colors hover:bg-[var(--as-muted)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]";
138
+ return /* @__PURE__ */ jsx(
139
+ "div",
140
+ {
141
+ ref,
142
+ "data-as": "date-picker",
143
+ className: cn("relative w-full", className),
144
+ children: /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
145
+ /* @__PURE__ */ jsxs("span", { className: "relative inline-flex w-full", children: [
146
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, disabled, children: /* @__PURE__ */ jsxs(
147
+ "button",
148
+ {
149
+ type: "button",
150
+ "aria-label": label,
151
+ className: cn(
152
+ "disabled:cursor-not-allowed disabled:opacity-50",
153
+ variant === "default" ? "flex h-9 w-full items-center gap-2 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-left text-sm text-[var(--as-fg)] transition-colors hover:border-[var(--as-fg)]/30 focus-visible:border-[var(--as-focus-ring)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]" : "flex items-center gap-1 text-left text-sm text-[var(--as-fg)] outline-none focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
154
+ variant === "default" && allowClear && selectedDate && !disabled && "pr-8"
155
+ ),
156
+ children: [
157
+ variant === "default" ? /* @__PURE__ */ jsx(
158
+ Calendar,
159
+ {
160
+ className: "size-4 shrink-0 text-[var(--as-muted-fg)]",
161
+ "aria-hidden": true
162
+ }
163
+ ) : null,
164
+ /* @__PURE__ */ jsx(
165
+ "span",
166
+ {
167
+ className: cn(
168
+ "flex-1 truncate text-left",
169
+ !selectedDate && (variant === "default" ? "text-[var(--as-muted-fg)]" : "opacity-70")
170
+ ),
171
+ children: selectedDate ? format(selectedDate, displayFormat) : placeholder
172
+ }
173
+ )
174
+ ]
175
+ }
176
+ ) }),
177
+ allowClear && selectedDate && !disabled ? /* @__PURE__ */ jsx(
178
+ "button",
179
+ {
180
+ type: "button",
181
+ "aria-label": clearLabel,
182
+ onClick: handleClear,
183
+ className: "absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer rounded-full p-0.5 text-[var(--as-muted-fg)] transition-colors hover:bg-[var(--as-muted)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
184
+ children: /* @__PURE__ */ jsx(X, { className: "size-3.5", "aria-hidden": true })
185
+ }
186
+ ) : null
187
+ ] }),
188
+ /* @__PURE__ */ jsx(
189
+ "input",
190
+ {
191
+ type: "hidden",
192
+ id: hiddenId,
193
+ name: name ?? hiddenId,
194
+ value: value ?? "",
195
+ required
196
+ }
197
+ ),
198
+ /* @__PURE__ */ jsxs(
199
+ PopoverContent,
200
+ {
201
+ align: "start",
202
+ sideOffset: 4,
203
+ collisionPadding: 8,
204
+ "aria-label": label,
205
+ onOpenAutoFocus: (event) => {
206
+ event.preventDefault();
207
+ const panel = event.currentTarget;
208
+ const target = panel?.querySelector(
209
+ '[data-day][tabindex="0"]'
210
+ );
211
+ target?.focus();
212
+ },
213
+ className: cn(
214
+ "as-anim-pop z-50 w-[280px] rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-2 text-[var(--as-fg)] shadow-[var(--as-shadow-3)] outline-none",
215
+ panelClassName
216
+ ),
217
+ children: [
218
+ /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center justify-between px-1 pt-1", children: [
219
+ /* @__PURE__ */ jsx(
220
+ "button",
221
+ {
222
+ type: "button",
223
+ "aria-label": prevLabel,
224
+ onClick: handlePrev,
225
+ className: navButtonClass,
226
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-5", "aria-hidden": true })
227
+ }
228
+ ),
229
+ /* @__PURE__ */ jsxs(
230
+ "button",
231
+ {
232
+ type: "button",
233
+ onClick: toggleViewMode,
234
+ className: "flex cursor-pointer items-center rounded-[var(--as-radius-sm)] px-3 py-1.5 text-sm font-semibold transition-colors hover:bg-[var(--as-muted)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
235
+ children: [
236
+ /* @__PURE__ */ jsx("span", { children: headerTitle }),
237
+ viewMode !== "years" ? /* @__PURE__ */ jsx(ChevronDown, { className: "ml-1 size-4", "aria-hidden": true }) : null
238
+ ]
239
+ }
240
+ ),
241
+ /* @__PURE__ */ jsx(
242
+ "button",
243
+ {
244
+ type: "button",
245
+ "aria-label": nextLabel,
246
+ onClick: handleNext,
247
+ className: navButtonClass,
248
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-5", "aria-hidden": true })
249
+ }
250
+ )
251
+ ] }),
252
+ viewMode === "days" ? /* @__PURE__ */ jsx("div", { className: "px-2 pb-2", children: /* @__PURE__ */ jsxs(
253
+ "div",
254
+ {
255
+ ref: gridRef,
256
+ role: "grid",
257
+ "aria-label": label,
258
+ onKeyDown: handleGridKeyDown,
259
+ children: [
260
+ /* @__PURE__ */ jsx("div", { role: "row", className: "mb-2 grid grid-cols-7 gap-1", children: Array.from({ length: 7 }, (_, i) => /* @__PURE__ */ jsx(
261
+ "div",
262
+ {
263
+ role: "columnheader",
264
+ className: "py-1 text-center text-xs font-medium text-[var(--as-muted-fg)]",
265
+ children: format(addDays(weekdayStart, i), "EEEEE")
266
+ },
267
+ i
268
+ )) }),
269
+ weeks.map((week, weekIndex) => /* @__PURE__ */ jsx("div", { role: "row", className: "grid grid-cols-7 gap-1", children: week.map((day) => {
270
+ const isSelected = selectedDate ? isSameDay(day, selectedDate) : false;
271
+ const isFocused = isSameDay(day, focusedDay);
272
+ const outside = !isSameMonth(day, monthStart);
273
+ const isToday = isSameDay(day, today);
274
+ const dayDisabled = isDisabled(day);
275
+ return /* @__PURE__ */ jsx(
276
+ "div",
277
+ {
278
+ role: "gridcell",
279
+ "aria-selected": isSelected,
280
+ className: "p-0",
281
+ children: /* @__PURE__ */ jsx(
282
+ "button",
283
+ {
284
+ type: "button",
285
+ "data-day": dayKey(day),
286
+ tabIndex: isFocused ? 0 : -1,
287
+ disabled: dayDisabled,
288
+ "aria-current": isToday ? "date" : void 0,
289
+ onClick: () => handleSelect(day),
290
+ className: cn(
291
+ "flex size-8 cursor-pointer items-center justify-center rounded-full text-sm transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
292
+ outside ? "text-[var(--as-muted-fg)] opacity-50" : "text-[var(--as-fg)]",
293
+ isSelected && "bg-[var(--as-primary)] font-medium text-[var(--as-primary-fg)] hover:brightness-110",
294
+ !isSelected && isToday && "bg-[color-mix(in_srgb,var(--as-primary)_12%,transparent)] font-medium text-[var(--as-primary)]",
295
+ !isSelected && !dayDisabled && "hover:bg-[var(--as-muted)]",
296
+ dayDisabled && "cursor-not-allowed opacity-30 hover:bg-transparent"
297
+ ),
298
+ children: format(day, "d")
299
+ }
300
+ )
301
+ },
302
+ dayKey(day)
303
+ );
304
+ }) }, weekIndex))
305
+ ]
306
+ }
307
+ ) }) : null,
308
+ viewMode === "months" ? /* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2 p-2", children: Array.from({ length: 12 }, (_, i) => {
309
+ const isSelected = selectedDate?.getMonth() === i && selectedDate?.getFullYear() === currentDate.getFullYear();
310
+ return /* @__PURE__ */ jsx(
311
+ "button",
312
+ {
313
+ type: "button",
314
+ onClick: () => {
315
+ setCurrentDate(setMonth(currentDate, i));
316
+ setViewMode("days");
317
+ },
318
+ className: cn(
319
+ "cursor-pointer rounded-[var(--as-radius)] py-3 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
320
+ isSelected ? "bg-[var(--as-primary)] text-[var(--as-primary-fg)]" : "text-[var(--as-fg)] hover:bg-[var(--as-muted)]"
321
+ ),
322
+ children: format(setMonth(/* @__PURE__ */ new Date(), i), "MMM")
323
+ },
324
+ i
325
+ );
326
+ }) }) : null,
327
+ viewMode === "years" ? /* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2 p-2", children: Array.from({ length: 12 }, (_, i) => {
328
+ const year = Math.floor(yearPage / 12) * 12 + i;
329
+ const isSelected = selectedDate?.getFullYear() === year;
330
+ return /* @__PURE__ */ jsx(
331
+ "button",
332
+ {
333
+ type: "button",
334
+ onClick: () => {
335
+ setCurrentDate(setYear(currentDate, year));
336
+ setFocusedDay((current) => setYear(current, year));
337
+ setViewMode("months");
338
+ },
339
+ className: cn(
340
+ "cursor-pointer rounded-[var(--as-radius)] py-3 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]",
341
+ isSelected ? "bg-[var(--as-primary)] text-[var(--as-primary-fg)]" : "text-[var(--as-fg)] hover:bg-[var(--as-muted)]"
342
+ ),
343
+ children: year
344
+ },
345
+ year
346
+ );
347
+ }) }) : null
348
+ ]
349
+ }
350
+ )
351
+ ] })
352
+ }
353
+ );
354
+ }
355
+ );
356
+
357
+ export { DatePicker };
358
+ //# sourceMappingURL=chunk-MEBOS2FX.js.map
359
+ //# sourceMappingURL=chunk-MEBOS2FX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/date-picker/DatePicker.tsx"],"names":["DatePicker","CalendarIcon"],"mappings":"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","file":"chunk-MEBOS2FX.js","sourcesContent":["import * as React from 'react'\nimport {\n addDays,\n addMonths,\n addYears,\n endOfMonth,\n endOfWeek,\n format,\n isSameDay,\n isSameMonth,\n isValid,\n parseISO,\n setMonth,\n setYear,\n startOfDay,\n startOfMonth,\n startOfWeek,\n subMonths,\n subYears,\n} from 'date-fns'\nimport {\n Calendar as CalendarIcon,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n X,\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../popover'\n\ntype ViewMode = 'days' | 'months' | 'years'\n\nexport interface DatePickerProps {\n value: string | null | undefined\n onChange: (value: string) => void\n onClear?: () => void\n allowClear?: boolean\n clearLabel?: string\n placeholder?: string\n displayFormat?: string\n minDate?: Date\n maxDate?: Date\n weekStartsOn?: 0 | 1\n disabled?: boolean\n required?: boolean\n variant?: 'default' | 'unstyled'\n id?: string\n name?: string\n label?: string\n prevLabel?: string\n nextLabel?: string\n className?: string\n panelClassName?: string\n}\n\nfunction dayKey(date: Date): string {\n return format(date, 'yyyy-MM-dd')\n}\n\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n function DatePicker(\n {\n value,\n onChange,\n onClear,\n allowClear = false,\n clearLabel = 'Clear',\n placeholder = 'Select date',\n displayFormat = 'dd/MM/yyyy',\n minDate,\n maxDate,\n weekStartsOn = 1,\n disabled = false,\n required,\n variant = 'default',\n id,\n name,\n label = 'Choose date',\n prevLabel = 'Previous',\n nextLabel = 'Next',\n className,\n panelClassName,\n },\n ref,\n ) {\n const autoId = React.useId()\n const hiddenId = id ?? `date-picker-${autoId}`\n const [open, setOpen] = React.useState(false)\n const [viewMode, setViewMode] = React.useState<ViewMode>('days')\n const [currentDate, setCurrentDate] = React.useState<Date>(() => new Date())\n const [focusedDay, setFocusedDay] = React.useState<Date>(() => new Date())\n const [yearPage, setYearPage] = React.useState(() => new Date().getFullYear())\n const gridRef = React.useRef<HTMLDivElement>(null)\n\n const selectedDate = React.useMemo(() => {\n if (!value) return null\n const parsed = parseISO(value)\n return isValid(parsed) ? parsed : null\n }, [value])\n\n const isDisabled = React.useCallback(\n (date: Date) =>\n Boolean(minDate && date < startOfDay(minDate)) ||\n Boolean(maxDate && date > startOfDay(maxDate)),\n [minDate, maxDate],\n )\n\n const handleOpenChange = (next: boolean) => {\n setOpen(next)\n if (next) {\n const base = selectedDate ?? new Date()\n setCurrentDate(base)\n setFocusedDay(base)\n setYearPage(base.getFullYear())\n setViewMode('days')\n }\n }\n\n const handleSelect = (date: Date) => {\n if (isDisabled(date)) return\n onChange(format(date, 'yyyy-MM-dd'))\n setOpen(false)\n }\n\n const handleClear = (event: React.MouseEvent) => {\n event.stopPropagation()\n onChange('')\n onClear?.()\n setOpen(false)\n }\n\n const moveFocus = (next: Date) => {\n if (isDisabled(next)) return\n setFocusedDay(next)\n setCurrentDate((current) =>\n isSameMonth(current, next) ? current : startOfMonth(next),\n )\n }\n\n const handleGridKeyDown = (event: React.KeyboardEvent) => {\n const step =\n event.key === 'ArrowLeft'\n ? -1\n : event.key === 'ArrowRight'\n ? 1\n : event.key === 'ArrowUp'\n ? -7\n : event.key === 'ArrowDown'\n ? 7\n : 0\n if (step !== 0) {\n event.preventDefault()\n moveFocus(addDays(focusedDay, step))\n return\n }\n if (event.key === 'PageUp' || event.key === 'PageDown') {\n event.preventDefault()\n const direction = event.key === 'PageUp' ? -1 : 1\n moveFocus(addMonths(focusedDay, direction))\n return\n }\n if (event.key === 'Home') {\n event.preventDefault()\n moveFocus(startOfMonth(focusedDay))\n } else if (event.key === 'End') {\n event.preventDefault()\n moveFocus(endOfMonth(focusedDay))\n }\n }\n\n React.useEffect(() => {\n if (!open || viewMode !== 'days') return\n const target = gridRef.current?.querySelector<HTMLButtonElement>(\n `[data-day=\"${dayKey(focusedDay)}\"]`,\n )\n target?.focus()\n }, [open, viewMode, focusedDay])\n\n const monthStart = startOfMonth(currentDate)\n const monthEnd = endOfMonth(monthStart)\n const gridStart = startOfWeek(monthStart, { weekStartsOn })\n const gridEnd = endOfWeek(monthEnd, { weekStartsOn })\n\n const weeks: Date[][] = []\n let cursor = gridStart\n while (cursor <= gridEnd) {\n const week: Date[] = []\n for (let i = 0; i < 7; i++) {\n week.push(cursor)\n cursor = addDays(cursor, 1)\n }\n weeks.push(week)\n }\n\n const today = new Date()\n const weekdayStart = startOfWeek(new Date(), { weekStartsOn })\n\n const headerTitle =\n viewMode === 'days'\n ? format(currentDate, 'MMMM yyyy')\n : viewMode === 'months'\n ? format(currentDate, 'yyyy')\n : `${Math.floor(yearPage / 12) * 12} – ${Math.floor(yearPage / 12) * 12 + 11}`\n\n const handlePrev = () => {\n if (viewMode === 'days') setCurrentDate(subMonths(currentDate, 1))\n else if (viewMode === 'months') setCurrentDate(subYears(currentDate, 1))\n else setYearPage(yearPage - 12)\n }\n\n const handleNext = () => {\n if (viewMode === 'days') setCurrentDate(addMonths(currentDate, 1))\n else if (viewMode === 'months') setCurrentDate(addYears(currentDate, 1))\n else setYearPage(yearPage + 12)\n }\n\n const toggleViewMode = () => {\n if (viewMode !== 'years') setViewMode('years')\n }\n\n const navButtonClass =\n 'cursor-pointer rounded-[var(--as-radius-sm)] p-1.5 text-[var(--as-muted-fg)] transition-colors hover:bg-[var(--as-muted)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]'\n\n return (\n <div\n ref={ref}\n data-as=\"date-picker\"\n className={cn('relative w-full', className)}\n >\n <Popover open={open} onOpenChange={handleOpenChange}>\n <span className=\"relative inline-flex w-full\">\n <PopoverTrigger asChild disabled={disabled}>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n 'disabled:cursor-not-allowed disabled:opacity-50',\n variant === 'default'\n ? 'flex h-9 w-full items-center gap-2 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-left text-sm text-[var(--as-fg)] transition-colors hover:border-[var(--as-fg)]/30 focus-visible:border-[var(--as-focus-ring)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]'\n : 'flex items-center gap-1 text-left text-sm text-[var(--as-fg)] outline-none focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n variant === 'default' &&\n allowClear &&\n selectedDate &&\n !disabled &&\n 'pr-8',\n )}\n >\n {variant === 'default' ? (\n <CalendarIcon\n className=\"size-4 shrink-0 text-[var(--as-muted-fg)]\"\n aria-hidden\n />\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate text-left',\n !selectedDate &&\n (variant === 'default' ? 'text-[var(--as-muted-fg)]' : 'opacity-70'),\n )}\n >\n {selectedDate\n ? format(selectedDate, displayFormat)\n : placeholder}\n </span>\n </button>\n </PopoverTrigger>\n {allowClear && selectedDate && !disabled ? (\n <button\n type=\"button\"\n aria-label={clearLabel}\n onClick={handleClear}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer rounded-full p-0.5 text-[var(--as-muted-fg)] transition-colors hover:bg-[var(--as-muted)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <X className=\"size-3.5\" aria-hidden />\n </button>\n ) : null}\n </span>\n\n <input\n type=\"hidden\"\n id={hiddenId}\n name={name ?? hiddenId}\n value={value ?? ''}\n required={required}\n />\n\n <PopoverContent\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n aria-label={label}\n onOpenAutoFocus={(event) => {\n event.preventDefault()\n const panel = event.currentTarget as HTMLElement | null\n const target = panel?.querySelector<HTMLButtonElement>(\n '[data-day][tabindex=\"0\"]',\n )\n target?.focus()\n }}\n className={cn(\n 'as-anim-pop z-50 w-[280px] rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-2 text-[var(--as-fg)] shadow-[var(--as-shadow-3)] outline-none',\n panelClassName,\n )}\n >\n <div className=\"mb-2 flex items-center justify-between px-1 pt-1\">\n <button\n type=\"button\"\n aria-label={prevLabel}\n onClick={handlePrev}\n className={navButtonClass}\n >\n <ChevronLeft className=\"size-5\" aria-hidden />\n </button>\n <button\n type=\"button\"\n onClick={toggleViewMode}\n className=\"flex cursor-pointer items-center rounded-[var(--as-radius-sm)] px-3 py-1.5 text-sm font-semibold transition-colors hover:bg-[var(--as-muted)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <span>{headerTitle}</span>\n {viewMode !== 'years' ? (\n <ChevronDown className=\"ml-1 size-4\" aria-hidden />\n ) : null}\n </button>\n <button\n type=\"button\"\n aria-label={nextLabel}\n onClick={handleNext}\n className={navButtonClass}\n >\n <ChevronRight className=\"size-5\" aria-hidden />\n </button>\n </div>\n\n {viewMode === 'days' ? (\n <div className=\"px-2 pb-2\">\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={label}\n onKeyDown={handleGridKeyDown}\n >\n <div role=\"row\" className=\"mb-2 grid grid-cols-7 gap-1\">\n {Array.from({ length: 7 }, (_, i) => (\n <div\n key={i}\n role=\"columnheader\"\n className=\"py-1 text-center text-xs font-medium text-[var(--as-muted-fg)]\"\n >\n {format(addDays(weekdayStart, i), 'EEEEE')}\n </div>\n ))}\n </div>\n {weeks.map((week, weekIndex) => (\n <div key={weekIndex} role=\"row\" className=\"grid grid-cols-7 gap-1\">\n {week.map((day) => {\n const isSelected = selectedDate\n ? isSameDay(day, selectedDate)\n : false\n const isFocused = isSameDay(day, focusedDay)\n const outside = !isSameMonth(day, monthStart)\n const isToday = isSameDay(day, today)\n const dayDisabled = isDisabled(day)\n return (\n <div\n key={dayKey(day)}\n role=\"gridcell\"\n aria-selected={isSelected}\n className=\"p-0\"\n >\n <button\n type=\"button\"\n data-day={dayKey(day)}\n tabIndex={isFocused ? 0 : -1}\n disabled={dayDisabled}\n aria-current={isToday ? 'date' : undefined}\n onClick={() => handleSelect(day)}\n className={cn(\n 'flex size-8 cursor-pointer items-center justify-center rounded-full text-sm transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n outside\n ? 'text-[var(--as-muted-fg)] opacity-50'\n : 'text-[var(--as-fg)]',\n isSelected &&\n 'bg-[var(--as-primary)] font-medium text-[var(--as-primary-fg)] hover:brightness-110',\n !isSelected &&\n isToday &&\n 'bg-[color-mix(in_srgb,var(--as-primary)_12%,transparent)] font-medium text-[var(--as-primary)]',\n !isSelected && !dayDisabled && 'hover:bg-[var(--as-muted)]',\n dayDisabled &&\n 'cursor-not-allowed opacity-30 hover:bg-transparent',\n )}\n >\n {format(day, 'd')}\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {viewMode === 'months' ? (\n <div className=\"grid grid-cols-3 gap-2 p-2\">\n {Array.from({ length: 12 }, (_, i) => {\n const isSelected =\n selectedDate?.getMonth() === i &&\n selectedDate?.getFullYear() === currentDate.getFullYear()\n return (\n <button\n key={i}\n type=\"button\"\n onClick={() => {\n setCurrentDate(setMonth(currentDate, i))\n setViewMode('days')\n }}\n className={cn(\n 'cursor-pointer rounded-[var(--as-radius)] py-3 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n isSelected\n ? 'bg-[var(--as-primary)] text-[var(--as-primary-fg)]'\n : 'text-[var(--as-fg)] hover:bg-[var(--as-muted)]',\n )}\n >\n {format(setMonth(new Date(), i), 'MMM')}\n </button>\n )\n })}\n </div>\n ) : null}\n\n {viewMode === 'years' ? (\n <div className=\"grid grid-cols-3 gap-2 p-2\">\n {Array.from({ length: 12 }, (_, i) => {\n const year = Math.floor(yearPage / 12) * 12 + i\n const isSelected = selectedDate?.getFullYear() === year\n return (\n <button\n key={year}\n type=\"button\"\n onClick={() => {\n setCurrentDate(setYear(currentDate, year))\n setFocusedDay((current) => setYear(current, year))\n setViewMode('months')\n }}\n className={cn(\n 'cursor-pointer rounded-[var(--as-radius)] py-3 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]',\n isSelected\n ? 'bg-[var(--as-primary)] text-[var(--as-primary-fg)]'\n : 'text-[var(--as-fg)] hover:bg-[var(--as-muted)]',\n )}\n >\n {year}\n </button>\n )\n })}\n </div>\n ) : null}\n </PopoverContent>\n </Popover>\n </div>\n )\n },\n)\n"]}
@@ -0,0 +1,66 @@
1
+ import { cn } from './chunk-BLJWR4ZV.js';
2
+ import * as React from 'react';
3
+ import { House, ChevronRight } from 'lucide-react';
4
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
5
+
6
+ var linkClass = "text-[10px] font-bold uppercase tracking-wider text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-primary)]";
7
+ var Breadcrumbs = React.forwardRef(
8
+ function Breadcrumbs2({
9
+ items = [],
10
+ currentLabel,
11
+ homeHref,
12
+ homeLabel = "Home",
13
+ linkComponent: LinkComponent = "a",
14
+ className,
15
+ ...props
16
+ }, ref) {
17
+ if (items.length === 0 && !currentLabel && !homeHref) return null;
18
+ return /* @__PURE__ */ jsxs(
19
+ "nav",
20
+ {
21
+ ref,
22
+ "data-as": "breadcrumbs",
23
+ "aria-label": "Breadcrumb",
24
+ className: cn(
25
+ "flex flex-wrap items-center gap-x-1.5 gap-y-0.5 leading-tight",
26
+ className
27
+ ),
28
+ ...props,
29
+ children: [
30
+ homeHref ? /* @__PURE__ */ jsxs(Fragment, { children: [
31
+ /* @__PURE__ */ jsx(LinkComponent, { href: homeHref, className: "shrink-0 p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-primary)]", "aria-label": homeLabel, title: homeLabel, children: /* @__PURE__ */ jsx(House, { className: "size-3", "aria-hidden": true }) }),
32
+ items.length > 0 || currentLabel ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-2.5 shrink-0 text-[var(--as-muted-fg)] opacity-60", "aria-hidden": true }) : null
33
+ ] }) : null,
34
+ items.map((item, index) => {
35
+ const isLast = index === items.length - 1 && !currentLabel;
36
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
37
+ index > 0 || homeHref ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-2.5 shrink-0 text-[var(--as-muted-fg)] opacity-60", "aria-hidden": true }) : null,
38
+ item.href && !isLast ? /* @__PURE__ */ jsxs(LinkComponent, { href: item.href, className: linkClass, children: [
39
+ item.icon,
40
+ item.label
41
+ ] }) : /* @__PURE__ */ jsxs("span", { className: linkClass, children: [
42
+ item.icon,
43
+ item.label
44
+ ] })
45
+ ] }, `${item.label}-${index}`);
46
+ }),
47
+ currentLabel ? /* @__PURE__ */ jsxs(Fragment, { children: [
48
+ items.length > 0 || homeHref ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-2.5 shrink-0 text-[var(--as-muted-fg)] opacity-60", "aria-hidden": true }) : null,
49
+ /* @__PURE__ */ jsx(
50
+ "span",
51
+ {
52
+ "aria-current": "page",
53
+ className: "text-[10px] font-black uppercase tracking-wider text-[var(--as-fg)]",
54
+ children: currentLabel
55
+ }
56
+ )
57
+ ] }) : null
58
+ ]
59
+ }
60
+ );
61
+ }
62
+ );
63
+
64
+ export { Breadcrumbs };
65
+ //# sourceMappingURL=chunk-TFS2NUET.js.map
66
+ //# sourceMappingURL=chunk-TFS2NUET.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/breadcrumbs/Breadcrumbs.tsx"],"names":["Breadcrumbs","Fragment"],"mappings":";;;;;AA0BA,IAAM,SAAA,GACJ,2HAAA;AAEK,IAAM,WAAA,GAAoB,KAAA,CAAA,UAAA;AAAA,EAC/B,SAASA,YAAAA,CACP;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,YAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,GAAY,MAAA;AAAA,IACZ,eAAe,aAAA,GAAgB,GAAA;AAAA,IAC/B,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,EACA;AACA,IAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,CAAC,YAAA,IAAgB,CAAC,UAAU,OAAO,IAAA;AAE7D,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,aAAA;AAAA,QACR,YAAA,EAAW,YAAA;AAAA,QACX,SAAA,EAAW,EAAA;AAAA,UACT,+DAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA,mBACC,IAAA,CAAAC,UAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAM,QAAA,EAAU,SAAA,EAAU,6FAA4F,YAAA,EAAY,SAAA,EAAW,KAAA,EAAO,SAAA,EACjK,8BAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,aAAA,EAAW,MAAC,CAAA,EACxC,CAAA;AAAA,YACC,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,YAAA,mBACnB,GAAA,CAAC,gBAAa,SAAA,EAAU,wDAAA,EAAyD,aAAA,EAAW,IAAA,EAAC,CAAA,GAC3F;AAAA,WAAA,EACN,CAAA,GACE,IAAA;AAAA,UACH,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AAC1B,YAAA,MAAM,MAAA,GAAS,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,KAAK,CAAC,YAAA;AAC9C,YAAA,uBACE,IAAA,CAAO,gBAAN,EACE,QAAA,EAAA;AAAA,cAAA,KAAA,GAAQ,CAAA,IAAK,2BACZ,GAAA,CAAC,YAAA,EAAA,EAAa,WAAU,wDAAA,EAAyD,aAAA,EAAW,MAAC,CAAA,GAC3F,IAAA;AAAA,cACH,IAAA,CAAK,IAAA,IAAQ,CAAC,MAAA,mBACb,IAAA,CAAC,iBAAc,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAA,EACxC,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,IAAA;AAAA,gBACL,IAAA,CAAK;AAAA,eAAA,EACR,CAAA,mBAEA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,EACd,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,IAAA;AAAA,gBACL,IAAA,CAAK;AAAA,eAAA,EACR;AAAA,aAAA,EAAA,EAbiB,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAe3C,CAAA;AAAA,UAEJ,CAAC,CAAA;AAAA,UACA,YAAA,mBACC,IAAA,CAAAA,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,MAAA,GAAS,KAAK,QAAA,mBACnB,GAAA,CAAC,gBAAa,SAAA,EAAU,wDAAA,EAAyD,aAAA,EAAW,IAAA,EAAC,CAAA,GAC3F,IAAA;AAAA,4BACJ,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,cAAA,EAAa,MAAA;AAAA,gBACb,SAAA,EAAU,qEAAA;AAAA,gBAET,QAAA,EAAA;AAAA;AAAA;AACH,WAAA,EACF,CAAA,GACE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF","file":"chunk-TFS2NUET.js","sourcesContent":["import * as React from 'react'\nimport { ChevronRight, House } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface BreadcrumbItem {\n label: string\n href?: string\n icon?: React.ReactNode\n}\n\nexport interface BreadcrumbLinkProps {\n href: string\n className?: string\n title?: string\n 'aria-label'?: string\n children: React.ReactNode\n}\n\nexport interface BreadcrumbsProps extends React.ComponentProps<'nav'> {\n items?: BreadcrumbItem[]\n currentLabel?: string\n homeHref?: string\n homeLabel?: string\n linkComponent?: React.ComponentType<BreadcrumbLinkProps>\n}\n\nconst linkClass =\n 'text-[10px] font-bold uppercase tracking-wider text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-primary)]'\n\nexport const Breadcrumbs = React.forwardRef<HTMLElement, BreadcrumbsProps>(\n function Breadcrumbs(\n {\n items = [],\n currentLabel,\n homeHref,\n homeLabel = 'Home',\n linkComponent: LinkComponent = 'a',\n className,\n ...props\n },\n ref,\n ) {\n if (items.length === 0 && !currentLabel && !homeHref) return null\n\n return (\n <nav\n ref={ref}\n data-as=\"breadcrumbs\"\n aria-label=\"Breadcrumb\"\n className={cn(\n 'flex flex-wrap items-center gap-x-1.5 gap-y-0.5 leading-tight',\n className,\n )}\n {...props}\n >\n {homeHref ? (\n <>\n <LinkComponent href={homeHref} className=\"shrink-0 p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-primary)]\" aria-label={homeLabel} title={homeLabel}>\n <House className=\"size-3\" aria-hidden />\n </LinkComponent>\n {items.length > 0 || currentLabel ? (\n <ChevronRight className=\"size-2.5 shrink-0 text-[var(--as-muted-fg)] opacity-60\" aria-hidden />\n ) : null}\n </>\n ) : null}\n {items.map((item, index) => {\n const isLast = index === items.length - 1 && !currentLabel\n return (\n <React.Fragment key={`${item.label}-${index}`}>\n {index > 0 || homeHref ? (\n <ChevronRight className=\"size-2.5 shrink-0 text-[var(--as-muted-fg)] opacity-60\" aria-hidden />\n ) : null}\n {item.href && !isLast ? (\n <LinkComponent href={item.href} className={linkClass}>\n {item.icon}\n {item.label}\n </LinkComponent>\n ) : (\n <span className={linkClass}>\n {item.icon}\n {item.label}\n </span>\n )}\n </React.Fragment>\n )\n })}\n {currentLabel ? (\n <>\n {items.length > 0 || homeHref ? (\n <ChevronRight className=\"size-2.5 shrink-0 text-[var(--as-muted-fg)] opacity-60\" aria-hidden />\n ) : null}\n <span\n aria-current=\"page\"\n className=\"text-[10px] font-black uppercase tracking-wider text-[var(--as-fg)]\"\n >\n {currentLabel}\n </span>\n </>\n ) : null}\n </nav>\n )\n },\n)\n"]}
@@ -0,0 +1,124 @@
1
+ import { cn } from './chunk-BLJWR4ZV.js';
2
+ import * as React from 'react';
3
+ import { X } from 'lucide-react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ function escapeRegex(value) {
7
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
8
+ }
9
+ var ChipInput = React.forwardRef(
10
+ function ChipInput2({
11
+ value,
12
+ onChange,
13
+ placeholder,
14
+ separators = [","],
15
+ inputLabel = "Add",
16
+ removeLabel = "Remove",
17
+ disabled = false,
18
+ className,
19
+ ...props
20
+ }, ref) {
21
+ const [draft, setDraft] = React.useState("");
22
+ const inputRef = React.useRef(null);
23
+ const commit = (raw) => {
24
+ const separatorPattern = new RegExp(
25
+ `[${separators.map(escapeRegex).join("")}\\n\\r]`
26
+ );
27
+ const existing = new Set(value.map((chip) => chip.toLowerCase()));
28
+ const next = [...value];
29
+ for (const part of raw.split(separatorPattern)) {
30
+ const trimmed = part.trim();
31
+ if (trimmed && !existing.has(trimmed.toLowerCase())) {
32
+ next.push(trimmed);
33
+ existing.add(trimmed.toLowerCase());
34
+ }
35
+ }
36
+ if (next.length !== value.length) {
37
+ onChange(next);
38
+ }
39
+ setDraft("");
40
+ };
41
+ const handleKeyDown = (event) => {
42
+ if (event.key === "Enter" || separators.includes(event.key)) {
43
+ event.preventDefault();
44
+ commit(draft);
45
+ } else if (event.key === "Backspace" && draft === "" && value.length > 0) {
46
+ event.preventDefault();
47
+ onChange(value.slice(0, -1));
48
+ }
49
+ };
50
+ const handlePaste = (event) => {
51
+ event.preventDefault();
52
+ const text = event.clipboardData.getData("text");
53
+ commit(`${draft}${text}`);
54
+ };
55
+ const removeAt = (index) => {
56
+ onChange(value.filter((_, i) => i !== index));
57
+ };
58
+ return /* @__PURE__ */ jsxs(
59
+ "div",
60
+ {
61
+ ref,
62
+ "data-as": "chip-input",
63
+ role: "group",
64
+ onClick: () => {
65
+ if (!disabled) inputRef.current?.focus();
66
+ },
67
+ className: cn(
68
+ "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)]",
69
+ disabled && "cursor-not-allowed opacity-50",
70
+ className
71
+ ),
72
+ ...props,
73
+ children: [
74
+ value.map((chip, index) => /* @__PURE__ */ jsxs(
75
+ "span",
76
+ {
77
+ 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)]",
78
+ children: [
79
+ chip,
80
+ /* @__PURE__ */ jsx(
81
+ "button",
82
+ {
83
+ type: "button",
84
+ disabled,
85
+ "aria-label": `${removeLabel} ${chip}`,
86
+ onClick: (event) => {
87
+ event.stopPropagation();
88
+ removeAt(index);
89
+ },
90
+ 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",
91
+ children: /* @__PURE__ */ jsx(X, { className: "size-3", "aria-hidden": true })
92
+ }
93
+ )
94
+ ]
95
+ },
96
+ `${chip}-${index}`
97
+ )),
98
+ /* @__PURE__ */ jsx(
99
+ "input",
100
+ {
101
+ ref: inputRef,
102
+ type: "text",
103
+ "aria-label": inputLabel,
104
+ disabled,
105
+ value: draft,
106
+ onChange: (event) => setDraft(event.target.value),
107
+ onKeyDown: handleKeyDown,
108
+ onPaste: handlePaste,
109
+ onBlur: () => {
110
+ if (draft.trim()) commit(draft);
111
+ },
112
+ placeholder: value.length === 0 ? placeholder : "",
113
+ className: "min-w-24 flex-1 bg-transparent text-sm text-[var(--as-fg)] outline-none placeholder:text-[var(--as-muted-fg)]"
114
+ }
115
+ )
116
+ ]
117
+ }
118
+ );
119
+ }
120
+ );
121
+
122
+ export { ChipInput };
123
+ //# sourceMappingURL=chunk-TPLQL62V.js.map
124
+ //# sourceMappingURL=chunk-TPLQL62V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chip-input/ChipInput.tsx"],"names":["ChipInput"],"mappings":"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","file":"chunk-TPLQL62V.js","sourcesContent":["import * as React from 'react'\nimport { 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 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 disabled = false,\n className,\n ...props\n },\n ref,\n ) {\n const [draft, setDraft] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement>(null)\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 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 className=\"min-w-24 flex-1 bg-transparent text-sm text-[var(--as-fg)] outline-none placeholder:text-[var(--as-muted-fg)]\"\n />\n </div>\n )\n },\n)\n"]}