artefact-design-system 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,3975 @@
1
+ // src/foundation/tokens.ts
2
+ var color = {
3
+ // --- page / surface ---
4
+ background: "var(--background)",
5
+ // cream
6
+ foreground: "var(--foreground)",
7
+ // ink
8
+ card: "var(--card)",
9
+ // 60% glass island
10
+ cardForeground: "var(--card-foreground)",
11
+ popover: "var(--popover)",
12
+ // paper-warm — stays opaque for readability
13
+ popoverForeground: "var(--popover-foreground)",
14
+ ink3: "var(--brand-ink-3)",
15
+ // #a3a094 — tertiary ink, one step past mutedForeground. A neutral text tone (no-data states), not a status color — lives here, not with the semantic roles below.
16
+ // --- controls ---
17
+ primary: "var(--primary)",
18
+ // ink — default filled CTA (dark, not orange)
19
+ primaryForeground: "var(--primary-foreground)",
20
+ secondary: "var(--secondary)",
21
+ // paper (white) — quiet button, chips
22
+ secondaryForeground: "var(--secondary-foreground)",
23
+ muted: "var(--muted)",
24
+ // cream-2 — hover fill, tag pills (== shadcn's own --accent slot)
25
+ mutedForeground: "var(--muted-foreground)",
26
+ // ink-2
27
+ border: "var(--border)",
28
+ // transparent BY RULE (see DESIGN.md) — do not use for a visible line, use `input`
29
+ input: "var(--input)",
30
+ // line-2 — the one hairline that's meant to be seen (inputs, dividers)
31
+ ring: "var(--ring)",
32
+ // == accent — focus ring is brand orange
33
+ destructive: "var(--destructive)",
34
+ // shadcn's own contract slot — wired to `danger` below (a real red, not accent)
35
+ // --- brand + semantic (komanda's own palette, no shadcn-contract slot) ---
36
+ // Each role: base / foreground / hover / soft / softForeground. foreground
37
+ // is picked by measured WCAG contrast (see index.css), not assumed white;
38
+ // hover is color-mix() off base (recomputes automatically, never drifts);
39
+ // soft is the pale badge fill, softForeground is base-on-soft (the pattern
40
+ // Avatar's ToneGreen/ToneWarn already use).
41
+ accent: "var(--brand-accent)",
42
+ // #f75506 — THE brand color. One per screen, rare.
43
+ accentForeground: "var(--brand-accent-foreground)",
44
+ accentHover: "var(--brand-accent-hover)",
45
+ accentSoft: "var(--brand-accent-soft)",
46
+ // #fdeee5
47
+ accentSoftForeground: "var(--brand-accent-soft-foreground)",
48
+ accentGradient: "var(--brand-accent-gradient)",
49
+ // komanda's ONE gradient — .primary.askbtn on the assistant dock
50
+ green: "var(--brand-green)",
51
+ // #1f7a54 — score-band "good" (komanda's own band(): score ≥7)
52
+ greenForeground: "var(--brand-green-foreground)",
53
+ greenHover: "var(--brand-green-hover)",
54
+ greenSoft: "var(--brand-green-soft)",
55
+ greenSoftForeground: "var(--brand-green-soft-foreground)",
56
+ warn: "var(--brand-warn)",
57
+ // #b8862f — score-band "caution" (band(): 5 ≤ score < 7)
58
+ warnForeground: "var(--brand-warn-foreground)",
59
+ warnHover: "var(--brand-warn-hover)",
60
+ warnSoft: "var(--brand-warn-soft)",
61
+ warnSoftForeground: "var(--brand-warn-soft-foreground)",
62
+ plum: "var(--brand-plum)",
63
+ // #7a4d7d — role tint: network manager (not a score band)
64
+ plumForeground: "var(--brand-plum-foreground)",
65
+ plumHover: "var(--brand-plum-hover)",
66
+ plumSoft: "var(--brand-plum-soft)",
67
+ plumSoftForeground: "var(--brand-plum-soft-foreground)",
68
+ danger: "var(--brand-danger)",
69
+ // #b23a2e — real destructive red. NOT accent — neither source page has a red, this is a deliberate addition (see index.css)
70
+ dangerForeground: "var(--brand-danger-foreground)",
71
+ dangerHover: "var(--brand-danger-hover)",
72
+ dangerSoft: "var(--brand-danger-soft)",
73
+ dangerSoftForeground: "var(--brand-danger-soft-foreground)",
74
+ // --- charts ---
75
+ chart1: "var(--chart-1)",
76
+ chart2: "var(--chart-2)",
77
+ chart3: "var(--chart-3)",
78
+ chart4: "var(--chart-4)",
79
+ chart5: "var(--chart-5)",
80
+ chartSurface: "var(--brand-chart-surface)",
81
+ // #fbfaf7 — quiet backdrop for data-viz surfaces (dashboard-prototype.html only)
82
+ scrim: "var(--brand-scrim)"
83
+ // rgba(0,0,0,.1) — dark low-opacity backdrop behind a heavily blurred overlay (assistant dock)
84
+ };
85
+ var semanticRoles = Object.keys(color).filter((key) => {
86
+ if (key.endsWith("Foreground") || key.endsWith("Hover") || key.endsWith("Soft") || key.endsWith("SoftForeground")) return false;
87
+ return `${key}Foreground` in color && `${key}Hover` in color && `${key}Soft` in color && `${key}SoftForeground` in color;
88
+ });
89
+ var chartKeys = Object.keys(color).filter((key) => /^chart\d+$/.test(key)).sort((a, b) => Number(a.slice(5)) - Number(b.slice(5)));
90
+ var radius = {
91
+ sm: "var(--radius-sm)",
92
+ md: "var(--radius-md)",
93
+ lg: "var(--radius-lg)",
94
+ xl: "var(--radius-xl)",
95
+ "2xl": "var(--radius-2xl)",
96
+ pill: 999
97
+ };
98
+ var spacing = {
99
+ none: 0,
100
+ xs: 4,
101
+ sm: 8,
102
+ md: 12,
103
+ base: 16,
104
+ lg: 20,
105
+ xl: 24,
106
+ "2xl": 32,
107
+ "3xl": 40,
108
+ "4xl": 56
109
+ };
110
+ var type = {
111
+ footnote: { size: 12, lineHeight: 1.45 },
112
+ // var(--text-footnote)
113
+ caption: { size: 14, lineHeight: 1.45 },
114
+ // var(--text-caption)
115
+ body: { size: 16, lineHeight: 1.55 },
116
+ // var(--text-body)
117
+ subhead: { size: 18, lineHeight: 1.35 },
118
+ title: { size: 20, lineHeight: 1.3 },
119
+ headline: { size: 24, lineHeight: 1.25 },
120
+ display: { size: 32, lineHeight: 1.15 }
121
+ };
122
+ var font = {
123
+ sans: "var(--font-sans)"
124
+ };
125
+
126
+ // src/foundation/layout.tsx
127
+ import { jsx } from "react/jsx-runtime";
128
+ var isSpacingKey = (v) => typeof v === "string" && v in spacing;
129
+ var space = (v) => {
130
+ if (v == null) return void 0;
131
+ if (isSpacingKey(v)) return `${spacing[v]}px`;
132
+ return typeof v === "number" ? `${v}px` : v;
133
+ };
134
+ var isRadiusKey = (v) => typeof v === "string" && v in radius;
135
+ var rad = (v) => {
136
+ if (v == null) return void 0;
137
+ if (isRadiusKey(v)) return radius[v];
138
+ return typeof v === "number" ? `${v}px` : v;
139
+ };
140
+ function Box({
141
+ as: As = "div",
142
+ p,
143
+ px,
144
+ py,
145
+ radius: radius2,
146
+ width,
147
+ maxWidth,
148
+ minWidth,
149
+ grow,
150
+ className,
151
+ style,
152
+ children,
153
+ ...rest
154
+ }) {
155
+ return /* @__PURE__ */ jsx(
156
+ As,
157
+ {
158
+ ...rest,
159
+ className,
160
+ style: {
161
+ padding: space(p),
162
+ paddingInline: space(px),
163
+ paddingBlock: space(py),
164
+ borderRadius: rad(radius2),
165
+ width: space(width),
166
+ maxWidth: space(maxWidth),
167
+ minWidth: minWidth != null ? space(minWidth) : 0,
168
+ flexGrow: grow ? 1 : void 0,
169
+ ...style
170
+ },
171
+ children
172
+ }
173
+ );
174
+ }
175
+ function Flex({
176
+ direction = "row",
177
+ gap = "md",
178
+ align,
179
+ justify,
180
+ wrap = true,
181
+ style,
182
+ children,
183
+ ...box
184
+ }) {
185
+ return /* @__PURE__ */ jsx(
186
+ Box,
187
+ {
188
+ ...box,
189
+ style: {
190
+ display: "flex",
191
+ flexDirection: direction,
192
+ gap: space(gap),
193
+ alignItems: align,
194
+ justifyContent: justify,
195
+ flexWrap: wrap ? "wrap" : "nowrap",
196
+ ...style
197
+ },
198
+ children
199
+ }
200
+ );
201
+ }
202
+ function Stack({ gap = "base", ...props }) {
203
+ return /* @__PURE__ */ jsx(Flex, { direction: "column", gap, ...props });
204
+ }
205
+ function Grid({
206
+ minColWidth = 280,
207
+ columns,
208
+ gap = "base",
209
+ align = "stretch",
210
+ style,
211
+ children,
212
+ ...box
213
+ }) {
214
+ return /* @__PURE__ */ jsx(
215
+ Box,
216
+ {
217
+ ...box,
218
+ style: {
219
+ display: "grid",
220
+ gridTemplateColumns: columns ? `repeat(${columns}, minmax(0, 1fr))` : `repeat(auto-fit, minmax(min(${space(minColWidth)}, 100%), 1fr))`,
221
+ gap: space(gap),
222
+ alignItems: align,
223
+ ...style
224
+ },
225
+ children
226
+ }
227
+ );
228
+ }
229
+ function Container({ size = 1280, style, children, ...box }) {
230
+ return /* @__PURE__ */ jsx(Box, { ...box, style: { width: "100%", maxWidth: space(size), marginInline: "auto", ...style }, children });
231
+ }
232
+
233
+ // src/foundation/surface.tsx
234
+ import { jsx as jsx2 } from "react/jsx-runtime";
235
+ var VARIANTS = {
236
+ glass: {
237
+ style: { background: color.card, backdropFilter: "blur(10px)" },
238
+ description: "60% + blur \u2014 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438-\u043E\u0441\u0442\u0440\u043E\u0432\u0430"
239
+ },
240
+ paper: {
241
+ style: { background: color.secondary },
242
+ description: "\u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u0439 \u0431\u0435\u043B\u044B\u0439 \u2014 \u0447\u0438\u043F\u044B, \u043F\u043E\u043F\u0430\u043F\u044B"
243
+ },
244
+ muted: {
245
+ style: { background: color.muted },
246
+ description: "hover / \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435"
247
+ },
248
+ plain: {
249
+ style: { background: "transparent" },
250
+ description: "\u0431\u0435\u0437 \u0444\u043E\u043D\u0430 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u043D\u0442\u0443\u0440"
251
+ },
252
+ scrim: {
253
+ style: { background: color.scrim, backdropFilter: "blur(40px) saturate(1.4)" },
254
+ description: "\u0442\u0451\u043C\u043D\u0430\u044F \u043F\u043E\u0434\u043B\u043E\u0436\u043A\u0430 + \u0441\u0438\u043B\u044C\u043D\u044B\u0439 \u0431\u043B\u044E\u0440 \u2014 \u0444\u043E\u043D \u043F\u043E\u0437\u0430\u0434\u0438 \u043E\u0432\u0435\u0440\u043B\u0435\u0439-\u043F\u0430\u043D\u0435\u043B\u0438"
255
+ }
256
+ };
257
+ var SURFACE_VARIANTS = VARIANTS;
258
+ function Surface({ variant = "glass", radius: radius2 = "xl", style, ...box }) {
259
+ const { backdropFilter, ...rest } = VARIANTS[variant].style;
260
+ return /* @__PURE__ */ jsx2(
261
+ Box,
262
+ {
263
+ radius: radius2,
264
+ style: {
265
+ ...rest,
266
+ WebkitBackdropFilter: backdropFilter,
267
+ backdropFilter,
268
+ ...style
269
+ },
270
+ ...box
271
+ }
272
+ );
273
+ }
274
+
275
+ // src/foundation/row.tsx
276
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
277
+ function TitledRow({ title, side, rail = 180, gap = 20, children }) {
278
+ return /* @__PURE__ */ jsxs(
279
+ "section",
280
+ {
281
+ className: `foundation-row${side ? "" : " foundation-row--no-side"}`,
282
+ style: { "--foundation-row-rail": `${rail}px`, "--foundation-row-gap": `${gap}px` },
283
+ children: [
284
+ title && /* @__PURE__ */ jsx3("div", { className: "foundation-row-title", children: title }),
285
+ /* @__PURE__ */ jsx3("div", { className: "foundation-row-main", children }),
286
+ side && /* @__PURE__ */ jsx3("div", { className: "foundation-row-side", children: side })
287
+ ]
288
+ }
289
+ );
290
+ }
291
+
292
+ // src/foundation/AppShell.tsx
293
+ import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
294
+ function AppShell({ sidebar, children }) {
295
+ return /* @__PURE__ */ jsxs2("div", { style: { display: "flex", minHeight: "100vh" }, children: [
296
+ sidebar,
297
+ /* @__PURE__ */ jsx4("div", { style: { flex: 1, minWidth: 0, maxWidth: 1280, marginInline: "auto", padding: "26px 24px 90px" }, children })
298
+ ] });
299
+ }
300
+
301
+ // src/primitives/Icon.tsx
302
+ import {
303
+ House,
304
+ UsersThree,
305
+ ShoppingCartSimple,
306
+ BookOpen,
307
+ Gear,
308
+ MagnifyingGlass,
309
+ Plus,
310
+ Minus,
311
+ CaretDown,
312
+ CaretRight,
313
+ CaretUp,
314
+ ArrowUp,
315
+ ArrowDown,
316
+ ArrowRight,
317
+ Star,
318
+ Warning,
319
+ Check,
320
+ X,
321
+ Bell,
322
+ DotsThree,
323
+ TrendUp,
324
+ TrendDown,
325
+ Sparkle,
326
+ Lock,
327
+ LockOpen,
328
+ Microphone,
329
+ Info,
330
+ Lightbulb,
331
+ ChartLineUp,
332
+ SquaresFour,
333
+ PaperPlaneRight
334
+ } from "@phosphor-icons/react";
335
+ import { jsx as jsx5 } from "react/jsx-runtime";
336
+ var REGISTRY = {
337
+ // app navigation
338
+ home: House,
339
+ team: UsersThree,
340
+ orders: ShoppingCartSimple,
341
+ knowledge: BookOpen,
342
+ settings: Gear,
343
+ // common actions / affordances
344
+ search: MagnifyingGlass,
345
+ add: Plus,
346
+ remove: Minus,
347
+ close: X,
348
+ check: Check,
349
+ more: DotsThree,
350
+ bell: Bell,
351
+ // carets / arrows
352
+ "caret-down": CaretDown,
353
+ "caret-right": CaretRight,
354
+ "caret-up": CaretUp,
355
+ "arrow-up": ArrowUp,
356
+ "arrow-down": ArrowDown,
357
+ "arrow-right": ArrowRight,
358
+ // status / semantics
359
+ star: Star,
360
+ warning: Warning,
361
+ "trend-up": TrendUp,
362
+ "trend-down": TrendDown,
363
+ spark: Sparkle,
364
+ lock: Lock,
365
+ "lock-open": LockOpen,
366
+ voice: Microphone,
367
+ info: Info,
368
+ lightbulb: Lightbulb,
369
+ "chart-line-up": ChartLineUp,
370
+ dashboard: SquaresFour,
371
+ send: PaperPlaneRight
372
+ };
373
+ var ICON_NAMES = Object.keys(REGISTRY);
374
+ function Icon({
375
+ name,
376
+ size = 20,
377
+ weight = "regular",
378
+ color: color2 = "currentColor",
379
+ className,
380
+ label
381
+ }) {
382
+ const Glyph = REGISTRY[name];
383
+ return /* @__PURE__ */ jsx5(
384
+ Glyph,
385
+ {
386
+ size,
387
+ weight,
388
+ color: color2,
389
+ className,
390
+ "aria-hidden": label ? void 0 : true,
391
+ "aria-label": label,
392
+ role: label ? "img" : void 0
393
+ }
394
+ );
395
+ }
396
+
397
+ // src/primitives/Image.tsx
398
+ import { jsx as jsx6 } from "react/jsx-runtime";
399
+ function Image({
400
+ src,
401
+ alt,
402
+ width,
403
+ height,
404
+ fit = "cover",
405
+ radius: radius2,
406
+ loading = "lazy",
407
+ className,
408
+ style
409
+ }) {
410
+ const resolvedRadius = radius2 == null ? void 0 : typeof radius2 === "number" ? `${radius2}px` : radius2 in radius ? radius[radius2] : radius2;
411
+ return /* @__PURE__ */ jsx6(
412
+ "img",
413
+ {
414
+ src,
415
+ alt,
416
+ loading,
417
+ className,
418
+ width: typeof width === "number" ? width : void 0,
419
+ height: typeof height === "number" ? height : void 0,
420
+ style: {
421
+ display: "block",
422
+ width,
423
+ height,
424
+ objectFit: fit,
425
+ borderRadius: resolvedRadius,
426
+ ...style
427
+ }
428
+ }
429
+ );
430
+ }
431
+
432
+ // src/primitives/Text.tsx
433
+ import { jsx as jsx7 } from "react/jsx-runtime";
434
+ function Text({
435
+ as: As = "span",
436
+ size = "body",
437
+ weight,
438
+ color: textColor = color.foreground,
439
+ align,
440
+ truncate,
441
+ className,
442
+ style,
443
+ children
444
+ }) {
445
+ const step = type[size];
446
+ return /* @__PURE__ */ jsx7(
447
+ As,
448
+ {
449
+ className,
450
+ style: {
451
+ fontSize: step.size,
452
+ lineHeight: step.lineHeight,
453
+ fontWeight: weight,
454
+ color: textColor,
455
+ textAlign: align,
456
+ ...truncate ? { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" } : null,
457
+ ...style
458
+ },
459
+ children
460
+ }
461
+ );
462
+ }
463
+
464
+ // src/lib/utils.ts
465
+ import { clsx } from "clsx";
466
+ import { twMerge } from "tailwind-merge";
467
+ function cn(...inputs) {
468
+ return twMerge(clsx(inputs));
469
+ }
470
+
471
+ // src/components/ui/alert.tsx
472
+ import "react";
473
+ import { cva } from "class-variance-authority";
474
+ import { jsx as jsx8 } from "react/jsx-runtime";
475
+ var alertVariants = cva(
476
+ "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",
477
+ {
478
+ variants: {
479
+ variant: {
480
+ default: "bg-card text-card-foreground",
481
+ destructive: "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"
482
+ }
483
+ },
484
+ defaultVariants: {
485
+ variant: "default"
486
+ }
487
+ }
488
+ );
489
+ function Alert({
490
+ className,
491
+ variant,
492
+ ...props
493
+ }) {
494
+ return /* @__PURE__ */ jsx8(
495
+ "div",
496
+ {
497
+ "data-slot": "alert",
498
+ role: "alert",
499
+ className: cn(alertVariants({ variant }), className),
500
+ ...props
501
+ }
502
+ );
503
+ }
504
+ function AlertTitle({ className, ...props }) {
505
+ return /* @__PURE__ */ jsx8(
506
+ "div",
507
+ {
508
+ "data-slot": "alert-title",
509
+ className: cn(
510
+ "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
511
+ className
512
+ ),
513
+ ...props
514
+ }
515
+ );
516
+ }
517
+ function AlertDescription({
518
+ className,
519
+ ...props
520
+ }) {
521
+ return /* @__PURE__ */ jsx8(
522
+ "div",
523
+ {
524
+ "data-slot": "alert-description",
525
+ className: cn(
526
+ "text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
527
+ className
528
+ ),
529
+ ...props
530
+ }
531
+ );
532
+ }
533
+ function AlertAction({ className, ...props }) {
534
+ return /* @__PURE__ */ jsx8(
535
+ "div",
536
+ {
537
+ "data-slot": "alert-action",
538
+ className: cn("absolute top-2 right-2", className),
539
+ ...props
540
+ }
541
+ );
542
+ }
543
+
544
+ // src/components/ui/avatar.tsx
545
+ import "react";
546
+ import { Avatar as AvatarPrimitive } from "radix-ui";
547
+ import { jsx as jsx9 } from "react/jsx-runtime";
548
+ function Avatar({
549
+ className,
550
+ size = "default",
551
+ ...props
552
+ }) {
553
+ return /* @__PURE__ */ jsx9(
554
+ AvatarPrimitive.Root,
555
+ {
556
+ "data-slot": "avatar",
557
+ "data-size": size,
558
+ className: cn(
559
+ "group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
560
+ className
561
+ ),
562
+ ...props
563
+ }
564
+ );
565
+ }
566
+ function AvatarImage({
567
+ className,
568
+ ...props
569
+ }) {
570
+ return /* @__PURE__ */ jsx9(
571
+ AvatarPrimitive.Image,
572
+ {
573
+ "data-slot": "avatar-image",
574
+ className: cn(
575
+ "aspect-square size-full rounded-full object-cover",
576
+ className
577
+ ),
578
+ ...props
579
+ }
580
+ );
581
+ }
582
+ function AvatarFallback({
583
+ className,
584
+ ...props
585
+ }) {
586
+ return /* @__PURE__ */ jsx9(
587
+ AvatarPrimitive.Fallback,
588
+ {
589
+ "data-slot": "avatar-fallback",
590
+ className: cn(
591
+ "flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs",
592
+ className
593
+ ),
594
+ ...props
595
+ }
596
+ );
597
+ }
598
+ function AvatarBadge({ className, ...props }) {
599
+ return /* @__PURE__ */ jsx9(
600
+ "span",
601
+ {
602
+ "data-slot": "avatar-badge",
603
+ className: cn(
604
+ "absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none",
605
+ "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
606
+ "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
607
+ "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
608
+ className
609
+ ),
610
+ ...props
611
+ }
612
+ );
613
+ }
614
+ function AvatarGroup({ className, ...props }) {
615
+ return /* @__PURE__ */ jsx9(
616
+ "div",
617
+ {
618
+ "data-slot": "avatar-group",
619
+ className: cn(
620
+ "group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background",
621
+ className
622
+ ),
623
+ ...props
624
+ }
625
+ );
626
+ }
627
+ function AvatarGroupCount({
628
+ className,
629
+ ...props
630
+ }) {
631
+ return /* @__PURE__ */ jsx9(
632
+ "div",
633
+ {
634
+ "data-slot": "avatar-group-count",
635
+ className: cn(
636
+ "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
637
+ className
638
+ ),
639
+ ...props
640
+ }
641
+ );
642
+ }
643
+
644
+ // src/components/ui/badge.tsx
645
+ import "react";
646
+ import { cva as cva2 } from "class-variance-authority";
647
+ import { Slot } from "radix-ui";
648
+ import { jsx as jsx10 } from "react/jsx-runtime";
649
+ var badgeVariants = cva2(
650
+ "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
651
+ {
652
+ variants: {
653
+ variant: {
654
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
655
+ secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
656
+ destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
657
+ outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
658
+ ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
659
+ link: "text-primary underline-offset-4 hover:underline"
660
+ }
661
+ },
662
+ defaultVariants: {
663
+ variant: "default"
664
+ }
665
+ }
666
+ );
667
+ function Badge({
668
+ className,
669
+ variant = "default",
670
+ asChild = false,
671
+ ...props
672
+ }) {
673
+ const Comp = asChild ? Slot.Root : "span";
674
+ return /* @__PURE__ */ jsx10(
675
+ Comp,
676
+ {
677
+ "data-slot": "badge",
678
+ "data-variant": variant,
679
+ className: cn(badgeVariants({ variant }), className),
680
+ ...props
681
+ }
682
+ );
683
+ }
684
+
685
+ // src/components/ui/button.tsx
686
+ import "react";
687
+ import { cva as cva3 } from "class-variance-authority";
688
+ import { Slot as Slot2 } from "radix-ui";
689
+ import { jsx as jsx11 } from "react/jsx-runtime";
690
+ var buttonVariants = cva3(
691
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
692
+ {
693
+ variants: {
694
+ variant: {
695
+ default: "bg-primary text-primary-foreground hover:bg-primary/80",
696
+ outline: "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
697
+ secondary: "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
698
+ ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
699
+ destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
700
+ link: "text-primary underline-offset-4 hover:underline"
701
+ },
702
+ size: {
703
+ default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
704
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
705
+ sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
706
+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
707
+ icon: "size-8",
708
+ "icon-xs": "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
709
+ "icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
710
+ "icon-lg": "size-9"
711
+ }
712
+ },
713
+ defaultVariants: {
714
+ variant: "default",
715
+ size: "default"
716
+ }
717
+ }
718
+ );
719
+ function Button({
720
+ className,
721
+ variant = "default",
722
+ size = "default",
723
+ asChild = false,
724
+ ...props
725
+ }) {
726
+ const Comp = asChild ? Slot2.Root : "button";
727
+ return /* @__PURE__ */ jsx11(
728
+ Comp,
729
+ {
730
+ "data-slot": "button",
731
+ "data-variant": variant,
732
+ "data-size": size,
733
+ className: cn(buttonVariants({ variant, size, className })),
734
+ ...props
735
+ }
736
+ );
737
+ }
738
+
739
+ // src/components/ui/button-group.tsx
740
+ import { cva as cva4 } from "class-variance-authority";
741
+ import { Slot as Slot3 } from "radix-ui";
742
+
743
+ // src/components/ui/separator.tsx
744
+ import "react";
745
+ import { Separator as SeparatorPrimitive } from "radix-ui";
746
+ import { jsx as jsx12 } from "react/jsx-runtime";
747
+ function Separator({
748
+ className,
749
+ orientation = "horizontal",
750
+ decorative = true,
751
+ ...props
752
+ }) {
753
+ return /* @__PURE__ */ jsx12(
754
+ SeparatorPrimitive.Root,
755
+ {
756
+ "data-slot": "separator",
757
+ decorative,
758
+ orientation,
759
+ className: cn(
760
+ "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
761
+ className
762
+ ),
763
+ ...props
764
+ }
765
+ );
766
+ }
767
+
768
+ // src/components/ui/button-group.tsx
769
+ import { jsx as jsx13 } from "react/jsx-runtime";
770
+ var buttonGroupVariants = cva4(
771
+ "group/button-group flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-lg [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",
772
+ {
773
+ variants: {
774
+ orientation: {
775
+ horizontal: "[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-lg!",
776
+ vertical: "flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-lg!"
777
+ }
778
+ },
779
+ defaultVariants: {
780
+ orientation: "horizontal"
781
+ }
782
+ }
783
+ );
784
+ function ButtonGroup({
785
+ className,
786
+ orientation,
787
+ ...props
788
+ }) {
789
+ return /* @__PURE__ */ jsx13(
790
+ "div",
791
+ {
792
+ role: "group",
793
+ "data-slot": "button-group",
794
+ "data-orientation": orientation,
795
+ className: cn(buttonGroupVariants({ orientation }), className),
796
+ ...props
797
+ }
798
+ );
799
+ }
800
+ function ButtonGroupText({
801
+ className,
802
+ asChild = false,
803
+ ...props
804
+ }) {
805
+ const Comp = asChild ? Slot3.Root : "div";
806
+ return /* @__PURE__ */ jsx13(
807
+ Comp,
808
+ {
809
+ className: cn(
810
+ "flex items-center gap-2 rounded-lg border bg-muted px-2.5 text-sm font-medium [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
811
+ className
812
+ ),
813
+ ...props
814
+ }
815
+ );
816
+ }
817
+ function ButtonGroupSeparator({
818
+ className,
819
+ orientation = "vertical",
820
+ ...props
821
+ }) {
822
+ return /* @__PURE__ */ jsx13(
823
+ Separator,
824
+ {
825
+ "data-slot": "button-group-separator",
826
+ orientation,
827
+ className: cn(
828
+ "relative self-stretch bg-input data-horizontal:mx-px data-horizontal:w-auto data-vertical:my-px data-vertical:h-auto",
829
+ className
830
+ ),
831
+ ...props
832
+ }
833
+ );
834
+ }
835
+
836
+ // src/components/ui/card.tsx
837
+ import "react";
838
+ import { jsx as jsx14 } from "react/jsx-runtime";
839
+ function Card({
840
+ className,
841
+ size = "default",
842
+ ...props
843
+ }) {
844
+ return /* @__PURE__ */ jsx14(
845
+ "div",
846
+ {
847
+ "data-slot": "card",
848
+ "data-size": size,
849
+ className: cn(
850
+ "group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
851
+ className
852
+ ),
853
+ ...props
854
+ }
855
+ );
856
+ }
857
+ function CardHeader({ className, ...props }) {
858
+ return /* @__PURE__ */ jsx14(
859
+ "div",
860
+ {
861
+ "data-slot": "card-header",
862
+ className: cn(
863
+ "group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",
864
+ className
865
+ ),
866
+ ...props
867
+ }
868
+ );
869
+ }
870
+ function CardTitle({ className, ...props }) {
871
+ return /* @__PURE__ */ jsx14(
872
+ "div",
873
+ {
874
+ "data-slot": "card-title",
875
+ className: cn(
876
+ "font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",
877
+ className
878
+ ),
879
+ ...props
880
+ }
881
+ );
882
+ }
883
+ function CardDescription({ className, ...props }) {
884
+ return /* @__PURE__ */ jsx14(
885
+ "div",
886
+ {
887
+ "data-slot": "card-description",
888
+ className: cn("text-sm text-muted-foreground", className),
889
+ ...props
890
+ }
891
+ );
892
+ }
893
+ function CardAction({ className, ...props }) {
894
+ return /* @__PURE__ */ jsx14(
895
+ "div",
896
+ {
897
+ "data-slot": "card-action",
898
+ className: cn(
899
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
900
+ className
901
+ ),
902
+ ...props
903
+ }
904
+ );
905
+ }
906
+ function CardContent({ className, ...props }) {
907
+ return /* @__PURE__ */ jsx14(
908
+ "div",
909
+ {
910
+ "data-slot": "card-content",
911
+ className: cn("px-(--card-spacing)", className),
912
+ ...props
913
+ }
914
+ );
915
+ }
916
+ function CardFooter({ className, ...props }) {
917
+ return /* @__PURE__ */ jsx14(
918
+ "div",
919
+ {
920
+ "data-slot": "card-footer",
921
+ className: cn(
922
+ "flex items-center rounded-b-xl border-t bg-muted/50 p-(--card-spacing)",
923
+ className
924
+ ),
925
+ ...props
926
+ }
927
+ );
928
+ }
929
+
930
+ // src/components/ui/chart.tsx
931
+ import * as React7 from "react";
932
+ import * as RechartsPrimitive from "recharts";
933
+ import { Fragment, jsx as jsx15, jsxs as jsxs3 } from "react/jsx-runtime";
934
+ var THEMES = { light: "", dark: ".dark" };
935
+ var INITIAL_DIMENSION = { width: 320, height: 200 };
936
+ var ChartContext = React7.createContext(null);
937
+ function useChart() {
938
+ const context = React7.useContext(ChartContext);
939
+ if (!context) {
940
+ throw new Error("useChart must be used within a <ChartContainer />");
941
+ }
942
+ return context;
943
+ }
944
+ function ChartContainer({
945
+ id,
946
+ className,
947
+ children,
948
+ config,
949
+ initialDimension = INITIAL_DIMENSION,
950
+ ...props
951
+ }) {
952
+ const uniqueId = React7.useId();
953
+ const chartId = `chart-${id ?? uniqueId.replace(/:/g, "")}`;
954
+ return /* @__PURE__ */ jsx15(ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ jsxs3(
955
+ "div",
956
+ {
957
+ "data-slot": "chart",
958
+ "data-chart": chartId,
959
+ className: cn(
960
+ "flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden",
961
+ className
962
+ ),
963
+ ...props,
964
+ children: [
965
+ /* @__PURE__ */ jsx15(ChartStyle, { id: chartId, config }),
966
+ /* @__PURE__ */ jsx15(
967
+ RechartsPrimitive.ResponsiveContainer,
968
+ {
969
+ initialDimension,
970
+ children
971
+ }
972
+ )
973
+ ]
974
+ }
975
+ ) });
976
+ }
977
+ var ChartStyle = ({ id, config }) => {
978
+ const colorConfig = Object.entries(config).filter(
979
+ ([, config2]) => config2.theme ?? config2.color
980
+ );
981
+ if (!colorConfig.length) {
982
+ return null;
983
+ }
984
+ return /* @__PURE__ */ jsx15(
985
+ "style",
986
+ {
987
+ dangerouslySetInnerHTML: {
988
+ __html: Object.entries(THEMES).map(
989
+ ([theme, prefix]) => `
990
+ ${prefix} [data-chart=${id}] {
991
+ ${colorConfig.map(([key, itemConfig]) => {
992
+ const color2 = itemConfig.theme?.[theme] ?? itemConfig.color;
993
+ return color2 ? ` --color-${key}: ${color2};` : null;
994
+ }).join("\n")}
995
+ }
996
+ `
997
+ ).join("\n")
998
+ }
999
+ }
1000
+ );
1001
+ };
1002
+ var ChartTooltip = RechartsPrimitive.Tooltip;
1003
+ function ChartTooltipContent({
1004
+ active,
1005
+ payload,
1006
+ className,
1007
+ indicator = "dot",
1008
+ hideLabel = false,
1009
+ hideIndicator = false,
1010
+ label,
1011
+ labelFormatter,
1012
+ labelClassName,
1013
+ formatter,
1014
+ color: color2,
1015
+ nameKey,
1016
+ labelKey
1017
+ }) {
1018
+ const { config } = useChart();
1019
+ const tooltipLabel = React7.useMemo(() => {
1020
+ if (hideLabel || !payload?.length) {
1021
+ return null;
1022
+ }
1023
+ const [item] = payload;
1024
+ const key = `${labelKey ?? item?.dataKey ?? item?.name ?? "value"}`;
1025
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
1026
+ const value = !labelKey && typeof label === "string" ? config[label]?.label ?? label : itemConfig?.label;
1027
+ if (labelFormatter) {
1028
+ return /* @__PURE__ */ jsx15("div", { className: cn("font-medium", labelClassName), children: labelFormatter(value, payload) });
1029
+ }
1030
+ if (!value) {
1031
+ return null;
1032
+ }
1033
+ return /* @__PURE__ */ jsx15("div", { className: cn("font-medium", labelClassName), children: value });
1034
+ }, [
1035
+ label,
1036
+ labelFormatter,
1037
+ payload,
1038
+ hideLabel,
1039
+ labelClassName,
1040
+ config,
1041
+ labelKey
1042
+ ]);
1043
+ if (!active || !payload?.length) {
1044
+ return null;
1045
+ }
1046
+ const nestLabel = payload.length === 1 && indicator !== "dot";
1047
+ return /* @__PURE__ */ jsxs3(
1048
+ "div",
1049
+ {
1050
+ className: cn(
1051
+ "grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",
1052
+ className
1053
+ ),
1054
+ children: [
1055
+ !nestLabel ? tooltipLabel : null,
1056
+ /* @__PURE__ */ jsx15("div", { className: "grid gap-1.5", children: payload.filter((item) => item.type !== "none").map((item, index) => {
1057
+ const key = `${nameKey ?? item.name ?? item.dataKey ?? "value"}`;
1058
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
1059
+ const indicatorColor = color2 ?? item.payload?.fill ?? item.color;
1060
+ return /* @__PURE__ */ jsx15(
1061
+ "div",
1062
+ {
1063
+ className: cn(
1064
+ "flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground",
1065
+ indicator === "dot" && "items-center"
1066
+ ),
1067
+ children: formatter && item?.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, item.payload) : /* @__PURE__ */ jsxs3(Fragment, { children: [
1068
+ itemConfig?.icon ? /* @__PURE__ */ jsx15(itemConfig.icon, {}) : !hideIndicator && /* @__PURE__ */ jsx15(
1069
+ "div",
1070
+ {
1071
+ className: cn(
1072
+ "shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)",
1073
+ {
1074
+ "h-2.5 w-2.5": indicator === "dot",
1075
+ "w-1": indicator === "line",
1076
+ "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
1077
+ "my-0.5": nestLabel && indicator === "dashed"
1078
+ }
1079
+ ),
1080
+ style: {
1081
+ "--color-bg": indicatorColor,
1082
+ "--color-border": indicatorColor
1083
+ }
1084
+ }
1085
+ ),
1086
+ /* @__PURE__ */ jsxs3(
1087
+ "div",
1088
+ {
1089
+ className: cn(
1090
+ "flex flex-1 justify-between leading-none",
1091
+ nestLabel ? "items-end" : "items-center"
1092
+ ),
1093
+ children: [
1094
+ /* @__PURE__ */ jsxs3("div", { className: "grid gap-1.5", children: [
1095
+ nestLabel ? tooltipLabel : null,
1096
+ /* @__PURE__ */ jsx15("span", { className: "text-muted-foreground", children: itemConfig?.label ?? item.name })
1097
+ ] }),
1098
+ item.value != null && /* @__PURE__ */ jsx15("span", { className: "font-mono font-medium text-foreground tabular-nums", children: typeof item.value === "number" ? item.value.toLocaleString() : String(item.value) })
1099
+ ]
1100
+ }
1101
+ )
1102
+ ] })
1103
+ },
1104
+ index
1105
+ );
1106
+ }) })
1107
+ ]
1108
+ }
1109
+ );
1110
+ }
1111
+ var ChartLegend = RechartsPrimitive.Legend;
1112
+ function ChartLegendContent({
1113
+ className,
1114
+ hideIcon = false,
1115
+ payload,
1116
+ verticalAlign = "bottom",
1117
+ nameKey
1118
+ }) {
1119
+ const { config } = useChart();
1120
+ if (!payload?.length) {
1121
+ return null;
1122
+ }
1123
+ return /* @__PURE__ */ jsx15(
1124
+ "div",
1125
+ {
1126
+ className: cn(
1127
+ "flex items-center justify-center gap-4",
1128
+ verticalAlign === "top" ? "pb-3" : "pt-3",
1129
+ className
1130
+ ),
1131
+ children: payload.filter((item) => item.type !== "none").map((item, index) => {
1132
+ const key = `${nameKey ?? item.dataKey ?? "value"}`;
1133
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
1134
+ return /* @__PURE__ */ jsxs3(
1135
+ "div",
1136
+ {
1137
+ className: cn(
1138
+ "flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground"
1139
+ ),
1140
+ children: [
1141
+ itemConfig?.icon && !hideIcon ? /* @__PURE__ */ jsx15(itemConfig.icon, {}) : /* @__PURE__ */ jsx15(
1142
+ "div",
1143
+ {
1144
+ className: "h-2 w-2 shrink-0 rounded-[2px]",
1145
+ style: {
1146
+ backgroundColor: item.color
1147
+ }
1148
+ }
1149
+ ),
1150
+ itemConfig?.label
1151
+ ]
1152
+ },
1153
+ index
1154
+ );
1155
+ })
1156
+ }
1157
+ );
1158
+ }
1159
+ function getPayloadConfigFromPayload(config, payload, key) {
1160
+ if (typeof payload !== "object" || payload === null) {
1161
+ return void 0;
1162
+ }
1163
+ const payloadPayload = "payload" in payload && typeof payload.payload === "object" && payload.payload !== null ? payload.payload : void 0;
1164
+ let configLabelKey = key;
1165
+ if (key in payload && typeof payload[key] === "string") {
1166
+ configLabelKey = payload[key];
1167
+ } else if (payloadPayload && key in payloadPayload && typeof payloadPayload[key] === "string") {
1168
+ configLabelKey = payloadPayload[key];
1169
+ }
1170
+ return configLabelKey in config ? config[configLabelKey] : config[key];
1171
+ }
1172
+
1173
+ // src/components/ui/checkbox.tsx
1174
+ import "react";
1175
+ import { Checkbox as CheckboxPrimitive } from "radix-ui";
1176
+ import { CheckIcon } from "lucide-react";
1177
+ import { jsx as jsx16 } from "react/jsx-runtime";
1178
+ function Checkbox({
1179
+ className,
1180
+ ...props
1181
+ }) {
1182
+ return /* @__PURE__ */ jsx16(
1183
+ CheckboxPrimitive.Root,
1184
+ {
1185
+ "data-slot": "checkbox",
1186
+ className: cn(
1187
+ "peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-colors outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
1188
+ className
1189
+ ),
1190
+ ...props,
1191
+ children: /* @__PURE__ */ jsx16(
1192
+ CheckboxPrimitive.Indicator,
1193
+ {
1194
+ "data-slot": "checkbox-indicator",
1195
+ className: "grid place-content-center text-current transition-none [&>svg]:size-3.5",
1196
+ children: /* @__PURE__ */ jsx16(
1197
+ CheckIcon,
1198
+ {}
1199
+ )
1200
+ }
1201
+ )
1202
+ }
1203
+ );
1204
+ }
1205
+
1206
+ // src/components/ui/dialog.tsx
1207
+ import "react";
1208
+ import { Dialog as DialogPrimitive } from "radix-ui";
1209
+ import { XIcon } from "lucide-react";
1210
+ import { jsx as jsx17, jsxs as jsxs4 } from "react/jsx-runtime";
1211
+ function Dialog({
1212
+ ...props
1213
+ }) {
1214
+ return /* @__PURE__ */ jsx17(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
1215
+ }
1216
+ function DialogTrigger({
1217
+ ...props
1218
+ }) {
1219
+ return /* @__PURE__ */ jsx17(DialogPrimitive.Trigger, { "data-slot": "dialog-trigger", ...props });
1220
+ }
1221
+ function DialogPortal({
1222
+ ...props
1223
+ }) {
1224
+ return /* @__PURE__ */ jsx17(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
1225
+ }
1226
+ function DialogClose({
1227
+ ...props
1228
+ }) {
1229
+ return /* @__PURE__ */ jsx17(DialogPrimitive.Close, { "data-slot": "dialog-close", ...props });
1230
+ }
1231
+ function DialogOverlay({
1232
+ className,
1233
+ ...props
1234
+ }) {
1235
+ return /* @__PURE__ */ jsx17(
1236
+ DialogPrimitive.Overlay,
1237
+ {
1238
+ "data-slot": "dialog-overlay",
1239
+ className: cn(
1240
+ "fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
1241
+ className
1242
+ ),
1243
+ ...props
1244
+ }
1245
+ );
1246
+ }
1247
+ function DialogContent({
1248
+ className,
1249
+ children,
1250
+ showCloseButton = true,
1251
+ ...props
1252
+ }) {
1253
+ return /* @__PURE__ */ jsxs4(DialogPortal, { children: [
1254
+ /* @__PURE__ */ jsx17(DialogOverlay, {}),
1255
+ /* @__PURE__ */ jsxs4(
1256
+ DialogPrimitive.Content,
1257
+ {
1258
+ "data-slot": "dialog-content",
1259
+ className: cn(
1260
+ "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
1261
+ className
1262
+ ),
1263
+ ...props,
1264
+ children: [
1265
+ children,
1266
+ showCloseButton && /* @__PURE__ */ jsx17(DialogPrimitive.Close, { "data-slot": "dialog-close", asChild: true, children: /* @__PURE__ */ jsxs4(
1267
+ Button,
1268
+ {
1269
+ variant: "ghost",
1270
+ className: "absolute top-2 right-2",
1271
+ size: "icon-sm",
1272
+ children: [
1273
+ /* @__PURE__ */ jsx17(
1274
+ XIcon,
1275
+ {}
1276
+ ),
1277
+ /* @__PURE__ */ jsx17("span", { className: "sr-only", children: "Close" })
1278
+ ]
1279
+ }
1280
+ ) })
1281
+ ]
1282
+ }
1283
+ )
1284
+ ] });
1285
+ }
1286
+ function DialogHeader({ className, ...props }) {
1287
+ return /* @__PURE__ */ jsx17(
1288
+ "div",
1289
+ {
1290
+ "data-slot": "dialog-header",
1291
+ className: cn("flex flex-col gap-2", className),
1292
+ ...props
1293
+ }
1294
+ );
1295
+ }
1296
+ function DialogFooter({
1297
+ className,
1298
+ showCloseButton = false,
1299
+ children,
1300
+ ...props
1301
+ }) {
1302
+ return /* @__PURE__ */ jsxs4(
1303
+ "div",
1304
+ {
1305
+ "data-slot": "dialog-footer",
1306
+ className: cn(
1307
+ "-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",
1308
+ className
1309
+ ),
1310
+ ...props,
1311
+ children: [
1312
+ children,
1313
+ showCloseButton && /* @__PURE__ */ jsx17(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx17(Button, { variant: "outline", children: "Close" }) })
1314
+ ]
1315
+ }
1316
+ );
1317
+ }
1318
+ function DialogTitle({
1319
+ className,
1320
+ ...props
1321
+ }) {
1322
+ return /* @__PURE__ */ jsx17(
1323
+ DialogPrimitive.Title,
1324
+ {
1325
+ "data-slot": "dialog-title",
1326
+ className: cn(
1327
+ "font-heading text-base leading-none font-medium",
1328
+ className
1329
+ ),
1330
+ ...props
1331
+ }
1332
+ );
1333
+ }
1334
+ function DialogDescription({
1335
+ className,
1336
+ ...props
1337
+ }) {
1338
+ return /* @__PURE__ */ jsx17(
1339
+ DialogPrimitive.Description,
1340
+ {
1341
+ "data-slot": "dialog-description",
1342
+ className: cn(
1343
+ "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
1344
+ className
1345
+ ),
1346
+ ...props
1347
+ }
1348
+ );
1349
+ }
1350
+
1351
+ // src/components/ui/dropdown-menu.tsx
1352
+ import "react";
1353
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
1354
+ import { CheckIcon as CheckIcon2, ChevronRightIcon } from "lucide-react";
1355
+ import { jsx as jsx18, jsxs as jsxs5 } from "react/jsx-runtime";
1356
+ function DropdownMenu({
1357
+ ...props
1358
+ }) {
1359
+ return /* @__PURE__ */ jsx18(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
1360
+ }
1361
+ function DropdownMenuPortal({
1362
+ ...props
1363
+ }) {
1364
+ return /* @__PURE__ */ jsx18(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
1365
+ }
1366
+ function DropdownMenuTrigger({
1367
+ ...props
1368
+ }) {
1369
+ return /* @__PURE__ */ jsx18(
1370
+ DropdownMenuPrimitive.Trigger,
1371
+ {
1372
+ "data-slot": "dropdown-menu-trigger",
1373
+ ...props
1374
+ }
1375
+ );
1376
+ }
1377
+ function DropdownMenuContent({
1378
+ className,
1379
+ align = "start",
1380
+ sideOffset = 4,
1381
+ ...props
1382
+ }) {
1383
+ return /* @__PURE__ */ jsx18(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx18(
1384
+ DropdownMenuPrimitive.Content,
1385
+ {
1386
+ "data-slot": "dropdown-menu-content",
1387
+ sideOffset,
1388
+ align,
1389
+ className: cn("z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
1390
+ ...props
1391
+ }
1392
+ ) });
1393
+ }
1394
+ function DropdownMenuGroup({
1395
+ ...props
1396
+ }) {
1397
+ return /* @__PURE__ */ jsx18(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
1398
+ }
1399
+ function DropdownMenuItem({
1400
+ className,
1401
+ inset,
1402
+ variant = "default",
1403
+ ...props
1404
+ }) {
1405
+ return /* @__PURE__ */ jsx18(
1406
+ DropdownMenuPrimitive.Item,
1407
+ {
1408
+ "data-slot": "dropdown-menu-item",
1409
+ "data-inset": inset,
1410
+ "data-variant": variant,
1411
+ className: cn(
1412
+ "group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",
1413
+ className
1414
+ ),
1415
+ ...props
1416
+ }
1417
+ );
1418
+ }
1419
+ function DropdownMenuCheckboxItem({
1420
+ className,
1421
+ children,
1422
+ checked,
1423
+ inset,
1424
+ ...props
1425
+ }) {
1426
+ return /* @__PURE__ */ jsxs5(
1427
+ DropdownMenuPrimitive.CheckboxItem,
1428
+ {
1429
+ "data-slot": "dropdown-menu-checkbox-item",
1430
+ "data-inset": inset,
1431
+ className: cn(
1432
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1433
+ className
1434
+ ),
1435
+ checked,
1436
+ ...props,
1437
+ children: [
1438
+ /* @__PURE__ */ jsx18(
1439
+ "span",
1440
+ {
1441
+ className: "pointer-events-none absolute right-2 flex items-center justify-center",
1442
+ "data-slot": "dropdown-menu-checkbox-item-indicator",
1443
+ children: /* @__PURE__ */ jsx18(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx18(
1444
+ CheckIcon2,
1445
+ {}
1446
+ ) })
1447
+ }
1448
+ ),
1449
+ children
1450
+ ]
1451
+ }
1452
+ );
1453
+ }
1454
+ function DropdownMenuRadioGroup({
1455
+ ...props
1456
+ }) {
1457
+ return /* @__PURE__ */ jsx18(
1458
+ DropdownMenuPrimitive.RadioGroup,
1459
+ {
1460
+ "data-slot": "dropdown-menu-radio-group",
1461
+ ...props
1462
+ }
1463
+ );
1464
+ }
1465
+ function DropdownMenuRadioItem({
1466
+ className,
1467
+ children,
1468
+ inset,
1469
+ ...props
1470
+ }) {
1471
+ return /* @__PURE__ */ jsxs5(
1472
+ DropdownMenuPrimitive.RadioItem,
1473
+ {
1474
+ "data-slot": "dropdown-menu-radio-item",
1475
+ "data-inset": inset,
1476
+ className: cn(
1477
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1478
+ className
1479
+ ),
1480
+ ...props,
1481
+ children: [
1482
+ /* @__PURE__ */ jsx18(
1483
+ "span",
1484
+ {
1485
+ className: "pointer-events-none absolute right-2 flex items-center justify-center",
1486
+ "data-slot": "dropdown-menu-radio-item-indicator",
1487
+ children: /* @__PURE__ */ jsx18(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx18(
1488
+ CheckIcon2,
1489
+ {}
1490
+ ) })
1491
+ }
1492
+ ),
1493
+ children
1494
+ ]
1495
+ }
1496
+ );
1497
+ }
1498
+ function DropdownMenuLabel({
1499
+ className,
1500
+ inset,
1501
+ ...props
1502
+ }) {
1503
+ return /* @__PURE__ */ jsx18(
1504
+ DropdownMenuPrimitive.Label,
1505
+ {
1506
+ "data-slot": "dropdown-menu-label",
1507
+ "data-inset": inset,
1508
+ className: cn(
1509
+ "px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7",
1510
+ className
1511
+ ),
1512
+ ...props
1513
+ }
1514
+ );
1515
+ }
1516
+ function DropdownMenuSeparator({
1517
+ className,
1518
+ ...props
1519
+ }) {
1520
+ return /* @__PURE__ */ jsx18(
1521
+ DropdownMenuPrimitive.Separator,
1522
+ {
1523
+ "data-slot": "dropdown-menu-separator",
1524
+ className: cn("-mx-1 my-1 h-px bg-border", className),
1525
+ ...props
1526
+ }
1527
+ );
1528
+ }
1529
+ function DropdownMenuShortcut({
1530
+ className,
1531
+ ...props
1532
+ }) {
1533
+ return /* @__PURE__ */ jsx18(
1534
+ "span",
1535
+ {
1536
+ "data-slot": "dropdown-menu-shortcut",
1537
+ className: cn(
1538
+ "ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground",
1539
+ className
1540
+ ),
1541
+ ...props
1542
+ }
1543
+ );
1544
+ }
1545
+ function DropdownMenuSub({
1546
+ ...props
1547
+ }) {
1548
+ return /* @__PURE__ */ jsx18(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
1549
+ }
1550
+ function DropdownMenuSubTrigger({
1551
+ className,
1552
+ inset,
1553
+ children,
1554
+ ...props
1555
+ }) {
1556
+ return /* @__PURE__ */ jsxs5(
1557
+ DropdownMenuPrimitive.SubTrigger,
1558
+ {
1559
+ "data-slot": "dropdown-menu-sub-trigger",
1560
+ "data-inset": inset,
1561
+ className: cn(
1562
+ "flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1563
+ className
1564
+ ),
1565
+ ...props,
1566
+ children: [
1567
+ children,
1568
+ /* @__PURE__ */ jsx18(ChevronRightIcon, { className: "ml-auto" })
1569
+ ]
1570
+ }
1571
+ );
1572
+ }
1573
+ function DropdownMenuSubContent({
1574
+ className,
1575
+ ...props
1576
+ }) {
1577
+ return /* @__PURE__ */ jsx18(
1578
+ DropdownMenuPrimitive.SubContent,
1579
+ {
1580
+ "data-slot": "dropdown-menu-sub-content",
1581
+ className: cn("z-50 min-w-[96px] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
1582
+ ...props
1583
+ }
1584
+ );
1585
+ }
1586
+
1587
+ // src/components/ui/empty.tsx
1588
+ import { cva as cva5 } from "class-variance-authority";
1589
+ import { jsx as jsx19 } from "react/jsx-runtime";
1590
+ function Empty({ className, ...props }) {
1591
+ return /* @__PURE__ */ jsx19(
1592
+ "div",
1593
+ {
1594
+ "data-slot": "empty",
1595
+ className: cn(
1596
+ "flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance",
1597
+ className
1598
+ ),
1599
+ ...props
1600
+ }
1601
+ );
1602
+ }
1603
+ function EmptyHeader({ className, ...props }) {
1604
+ return /* @__PURE__ */ jsx19(
1605
+ "div",
1606
+ {
1607
+ "data-slot": "empty-header",
1608
+ className: cn("flex max-w-sm flex-col items-center gap-2", className),
1609
+ ...props
1610
+ }
1611
+ );
1612
+ }
1613
+ var emptyMediaVariants = cva5(
1614
+ "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
1615
+ {
1616
+ variants: {
1617
+ variant: {
1618
+ default: "bg-transparent",
1619
+ icon: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4"
1620
+ }
1621
+ },
1622
+ defaultVariants: {
1623
+ variant: "default"
1624
+ }
1625
+ }
1626
+ );
1627
+ function EmptyMedia({
1628
+ className,
1629
+ variant = "default",
1630
+ ...props
1631
+ }) {
1632
+ return /* @__PURE__ */ jsx19(
1633
+ "div",
1634
+ {
1635
+ "data-slot": "empty-icon",
1636
+ "data-variant": variant,
1637
+ className: cn(emptyMediaVariants({ variant, className })),
1638
+ ...props
1639
+ }
1640
+ );
1641
+ }
1642
+ function EmptyTitle({ className, ...props }) {
1643
+ return /* @__PURE__ */ jsx19(
1644
+ "div",
1645
+ {
1646
+ "data-slot": "empty-title",
1647
+ className: cn(
1648
+ "font-heading text-sm font-medium tracking-tight",
1649
+ className
1650
+ ),
1651
+ ...props
1652
+ }
1653
+ );
1654
+ }
1655
+ function EmptyDescription({ className, ...props }) {
1656
+ return /* @__PURE__ */ jsx19(
1657
+ "div",
1658
+ {
1659
+ "data-slot": "empty-description",
1660
+ className: cn(
1661
+ "text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
1662
+ className
1663
+ ),
1664
+ ...props
1665
+ }
1666
+ );
1667
+ }
1668
+ function EmptyContent({ className, ...props }) {
1669
+ return /* @__PURE__ */ jsx19(
1670
+ "div",
1671
+ {
1672
+ "data-slot": "empty-content",
1673
+ className: cn(
1674
+ "flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance",
1675
+ className
1676
+ ),
1677
+ ...props
1678
+ }
1679
+ );
1680
+ }
1681
+
1682
+ // src/components/ui/field.tsx
1683
+ import { useMemo as useMemo2 } from "react";
1684
+ import { cva as cva6 } from "class-variance-authority";
1685
+
1686
+ // src/components/ui/label.tsx
1687
+ import "react";
1688
+ import { Label as LabelPrimitive } from "radix-ui";
1689
+ import { jsx as jsx20 } from "react/jsx-runtime";
1690
+ function Label({
1691
+ className,
1692
+ ...props
1693
+ }) {
1694
+ return /* @__PURE__ */ jsx20(
1695
+ LabelPrimitive.Root,
1696
+ {
1697
+ "data-slot": "label",
1698
+ className: cn(
1699
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
1700
+ className
1701
+ ),
1702
+ ...props
1703
+ }
1704
+ );
1705
+ }
1706
+
1707
+ // src/components/ui/field.tsx
1708
+ import { jsx as jsx21, jsxs as jsxs6 } from "react/jsx-runtime";
1709
+ function FieldSet({ className, ...props }) {
1710
+ return /* @__PURE__ */ jsx21(
1711
+ "fieldset",
1712
+ {
1713
+ "data-slot": "field-set",
1714
+ className: cn(
1715
+ "flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3",
1716
+ className
1717
+ ),
1718
+ ...props
1719
+ }
1720
+ );
1721
+ }
1722
+ function FieldLegend({
1723
+ className,
1724
+ variant = "legend",
1725
+ ...props
1726
+ }) {
1727
+ return /* @__PURE__ */ jsx21(
1728
+ "legend",
1729
+ {
1730
+ "data-slot": "field-legend",
1731
+ "data-variant": variant,
1732
+ className: cn(
1733
+ "mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base",
1734
+ className
1735
+ ),
1736
+ ...props
1737
+ }
1738
+ );
1739
+ }
1740
+ function FieldGroup({ className, ...props }) {
1741
+ return /* @__PURE__ */ jsx21(
1742
+ "div",
1743
+ {
1744
+ "data-slot": "field-group",
1745
+ className: cn(
1746
+ "group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4",
1747
+ className
1748
+ ),
1749
+ ...props
1750
+ }
1751
+ );
1752
+ }
1753
+ var fieldVariants = cva6(
1754
+ "group/field flex w-full gap-2 data-[invalid=true]:text-destructive",
1755
+ {
1756
+ variants: {
1757
+ orientation: {
1758
+ vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
1759
+ horizontal: "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
1760
+ responsive: "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"
1761
+ }
1762
+ },
1763
+ defaultVariants: {
1764
+ orientation: "vertical"
1765
+ }
1766
+ }
1767
+ );
1768
+ function Field({
1769
+ className,
1770
+ orientation = "vertical",
1771
+ ...props
1772
+ }) {
1773
+ return /* @__PURE__ */ jsx21(
1774
+ "div",
1775
+ {
1776
+ role: "group",
1777
+ "data-slot": "field",
1778
+ "data-orientation": orientation,
1779
+ className: cn(fieldVariants({ orientation }), className),
1780
+ ...props
1781
+ }
1782
+ );
1783
+ }
1784
+ function FieldContent({ className, ...props }) {
1785
+ return /* @__PURE__ */ jsx21(
1786
+ "div",
1787
+ {
1788
+ "data-slot": "field-content",
1789
+ className: cn(
1790
+ "group/field-content flex flex-1 flex-col gap-0.5 leading-snug",
1791
+ className
1792
+ ),
1793
+ ...props
1794
+ }
1795
+ );
1796
+ }
1797
+ function FieldLabel({
1798
+ className,
1799
+ ...props
1800
+ }) {
1801
+ return /* @__PURE__ */ jsx21(
1802
+ Label,
1803
+ {
1804
+ "data-slot": "field-label",
1805
+ className: cn(
1806
+ "group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10",
1807
+ "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col",
1808
+ className
1809
+ ),
1810
+ ...props
1811
+ }
1812
+ );
1813
+ }
1814
+ function FieldTitle({ className, ...props }) {
1815
+ return /* @__PURE__ */ jsx21(
1816
+ "div",
1817
+ {
1818
+ "data-slot": "field-label",
1819
+ className: cn(
1820
+ "flex w-fit items-center gap-2 text-sm font-medium group-data-[disabled=true]/field:opacity-50",
1821
+ className
1822
+ ),
1823
+ ...props
1824
+ }
1825
+ );
1826
+ }
1827
+ function FieldDescription({ className, ...props }) {
1828
+ return /* @__PURE__ */ jsx21(
1829
+ "p",
1830
+ {
1831
+ "data-slot": "field-description",
1832
+ className: cn(
1833
+ "text-left text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5",
1834
+ "last:mt-0 nth-last-2:-mt-1",
1835
+ "[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
1836
+ className
1837
+ ),
1838
+ ...props
1839
+ }
1840
+ );
1841
+ }
1842
+ function FieldSeparator({
1843
+ children,
1844
+ className,
1845
+ ...props
1846
+ }) {
1847
+ return /* @__PURE__ */ jsxs6(
1848
+ "div",
1849
+ {
1850
+ "data-slot": "field-separator",
1851
+ "data-content": !!children,
1852
+ className: cn(
1853
+ "relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2",
1854
+ className
1855
+ ),
1856
+ ...props,
1857
+ children: [
1858
+ /* @__PURE__ */ jsx21(Separator, { className: "absolute inset-0 top-1/2" }),
1859
+ children && /* @__PURE__ */ jsx21(
1860
+ "span",
1861
+ {
1862
+ className: "relative mx-auto block w-fit bg-background px-2 text-muted-foreground",
1863
+ "data-slot": "field-separator-content",
1864
+ children
1865
+ }
1866
+ )
1867
+ ]
1868
+ }
1869
+ );
1870
+ }
1871
+ function FieldError({
1872
+ className,
1873
+ children,
1874
+ errors,
1875
+ ...props
1876
+ }) {
1877
+ const content = useMemo2(() => {
1878
+ if (children) {
1879
+ return children;
1880
+ }
1881
+ if (!errors?.length) {
1882
+ return null;
1883
+ }
1884
+ const uniqueErrors = [
1885
+ ...new Map(errors.map((error) => [error?.message, error])).values()
1886
+ ];
1887
+ if (uniqueErrors?.length == 1) {
1888
+ return uniqueErrors[0]?.message;
1889
+ }
1890
+ return /* @__PURE__ */ jsx21("ul", { className: "ml-4 flex list-disc flex-col gap-1", children: uniqueErrors.map(
1891
+ (error, index) => error?.message && /* @__PURE__ */ jsx21("li", { children: error.message }, index)
1892
+ ) });
1893
+ }, [children, errors]);
1894
+ if (!content) {
1895
+ return null;
1896
+ }
1897
+ return /* @__PURE__ */ jsx21(
1898
+ "div",
1899
+ {
1900
+ role: "alert",
1901
+ "data-slot": "field-error",
1902
+ className: cn("text-sm font-normal text-destructive", className),
1903
+ ...props,
1904
+ children: content
1905
+ }
1906
+ );
1907
+ }
1908
+
1909
+ // src/components/ui/input.tsx
1910
+ import "react";
1911
+ import { jsx as jsx22 } from "react/jsx-runtime";
1912
+ function Input({ className, type: type2, ...props }) {
1913
+ return /* @__PURE__ */ jsx22(
1914
+ "input",
1915
+ {
1916
+ type: type2,
1917
+ "data-slot": "input",
1918
+ className: cn(
1919
+ "h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
1920
+ className
1921
+ ),
1922
+ ...props
1923
+ }
1924
+ );
1925
+ }
1926
+
1927
+ // src/components/ui/input-group.tsx
1928
+ import "react";
1929
+ import { cva as cva7 } from "class-variance-authority";
1930
+
1931
+ // src/components/ui/textarea.tsx
1932
+ import "react";
1933
+ import { jsx as jsx23 } from "react/jsx-runtime";
1934
+ function Textarea({ className, ...props }) {
1935
+ return /* @__PURE__ */ jsx23(
1936
+ "textarea",
1937
+ {
1938
+ "data-slot": "textarea",
1939
+ className: cn(
1940
+ "flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
1941
+ className
1942
+ ),
1943
+ ...props
1944
+ }
1945
+ );
1946
+ }
1947
+
1948
+ // src/components/ui/input-group.tsx
1949
+ import { jsx as jsx24 } from "react/jsx-runtime";
1950
+ function InputGroup({ className, ...props }) {
1951
+ return /* @__PURE__ */ jsx24(
1952
+ "div",
1953
+ {
1954
+ "data-slot": "input-group",
1955
+ role: "group",
1956
+ className: cn(
1957
+ "group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",
1958
+ className
1959
+ ),
1960
+ ...props
1961
+ }
1962
+ );
1963
+ }
1964
+ var inputGroupAddonVariants = cva7(
1965
+ "flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",
1966
+ {
1967
+ variants: {
1968
+ align: {
1969
+ "inline-start": "order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]",
1970
+ "inline-end": "order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]",
1971
+ "block-start": "order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2",
1972
+ "block-end": "order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"
1973
+ }
1974
+ },
1975
+ defaultVariants: {
1976
+ align: "inline-start"
1977
+ }
1978
+ }
1979
+ );
1980
+ function InputGroupAddon({
1981
+ className,
1982
+ align = "inline-start",
1983
+ ...props
1984
+ }) {
1985
+ return /* @__PURE__ */ jsx24(
1986
+ "div",
1987
+ {
1988
+ role: "group",
1989
+ "data-slot": "input-group-addon",
1990
+ "data-align": align,
1991
+ className: cn(inputGroupAddonVariants({ align }), className),
1992
+ onClick: (e) => {
1993
+ if (e.target.closest("button")) {
1994
+ return;
1995
+ }
1996
+ e.currentTarget.parentElement?.querySelector("input")?.focus();
1997
+ },
1998
+ ...props
1999
+ }
2000
+ );
2001
+ }
2002
+ var inputGroupButtonVariants = cva7(
2003
+ "flex items-center gap-2 text-sm shadow-none",
2004
+ {
2005
+ variants: {
2006
+ size: {
2007
+ xs: "h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",
2008
+ sm: "",
2009
+ "icon-xs": "size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0",
2010
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0"
2011
+ }
2012
+ },
2013
+ defaultVariants: {
2014
+ size: "xs"
2015
+ }
2016
+ }
2017
+ );
2018
+ function InputGroupButton({
2019
+ className,
2020
+ type: type2 = "button",
2021
+ variant = "ghost",
2022
+ size = "xs",
2023
+ ...props
2024
+ }) {
2025
+ return /* @__PURE__ */ jsx24(
2026
+ Button,
2027
+ {
2028
+ type: type2,
2029
+ "data-size": size,
2030
+ variant,
2031
+ className: cn(inputGroupButtonVariants({ size }), className),
2032
+ ...props
2033
+ }
2034
+ );
2035
+ }
2036
+ function InputGroupText({ className, ...props }) {
2037
+ return /* @__PURE__ */ jsx24(
2038
+ "span",
2039
+ {
2040
+ className: cn(
2041
+ "flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
2042
+ className
2043
+ ),
2044
+ ...props
2045
+ }
2046
+ );
2047
+ }
2048
+ function InputGroupInput({
2049
+ className,
2050
+ ...props
2051
+ }) {
2052
+ return /* @__PURE__ */ jsx24(
2053
+ Input,
2054
+ {
2055
+ "data-slot": "input-group-control",
2056
+ className: cn(
2057
+ "flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent",
2058
+ className
2059
+ ),
2060
+ ...props
2061
+ }
2062
+ );
2063
+ }
2064
+ function InputGroupTextarea({
2065
+ className,
2066
+ ...props
2067
+ }) {
2068
+ return /* @__PURE__ */ jsx24(
2069
+ Textarea,
2070
+ {
2071
+ "data-slot": "input-group-control",
2072
+ className: cn(
2073
+ "flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent",
2074
+ className
2075
+ ),
2076
+ ...props
2077
+ }
2078
+ );
2079
+ }
2080
+
2081
+ // src/components/ui/item.tsx
2082
+ import "react";
2083
+ import { cva as cva8 } from "class-variance-authority";
2084
+ import { Slot as Slot4 } from "radix-ui";
2085
+ import { jsx as jsx25 } from "react/jsx-runtime";
2086
+ function ItemGroup({ className, ...props }) {
2087
+ return /* @__PURE__ */ jsx25(
2088
+ "div",
2089
+ {
2090
+ role: "list",
2091
+ "data-slot": "item-group",
2092
+ className: cn(
2093
+ "group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2",
2094
+ className
2095
+ ),
2096
+ ...props
2097
+ }
2098
+ );
2099
+ }
2100
+ function ItemSeparator({
2101
+ className,
2102
+ ...props
2103
+ }) {
2104
+ return /* @__PURE__ */ jsx25(
2105
+ Separator,
2106
+ {
2107
+ "data-slot": "item-separator",
2108
+ orientation: "horizontal",
2109
+ className: cn("my-2", className),
2110
+ ...props
2111
+ }
2112
+ );
2113
+ }
2114
+ var itemVariants = cva8(
2115
+ "group/item flex w-full flex-wrap items-center rounded-lg border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted",
2116
+ {
2117
+ variants: {
2118
+ variant: {
2119
+ default: "border-transparent",
2120
+ outline: "border-border",
2121
+ muted: "border-transparent bg-muted/50"
2122
+ },
2123
+ size: {
2124
+ default: "gap-2.5 px-3 py-2.5",
2125
+ sm: "gap-2.5 px-3 py-2.5",
2126
+ xs: "gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0"
2127
+ }
2128
+ },
2129
+ defaultVariants: {
2130
+ variant: "default",
2131
+ size: "default"
2132
+ }
2133
+ }
2134
+ );
2135
+ function Item({
2136
+ className,
2137
+ variant = "default",
2138
+ size = "default",
2139
+ asChild = false,
2140
+ ...props
2141
+ }) {
2142
+ const Comp = asChild ? Slot4.Root : "div";
2143
+ return /* @__PURE__ */ jsx25(
2144
+ Comp,
2145
+ {
2146
+ "data-slot": "item",
2147
+ "data-variant": variant,
2148
+ "data-size": size,
2149
+ className: cn(itemVariants({ variant, size, className })),
2150
+ ...props
2151
+ }
2152
+ );
2153
+ }
2154
+ var itemMediaVariants = cva8(
2155
+ "flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none",
2156
+ {
2157
+ variants: {
2158
+ variant: {
2159
+ default: "bg-transparent",
2160
+ icon: "[&_svg:not([class*='size-'])]:size-4",
2161
+ image: "size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover"
2162
+ }
2163
+ },
2164
+ defaultVariants: {
2165
+ variant: "default"
2166
+ }
2167
+ }
2168
+ );
2169
+ function ItemMedia({
2170
+ className,
2171
+ variant = "default",
2172
+ ...props
2173
+ }) {
2174
+ return /* @__PURE__ */ jsx25(
2175
+ "div",
2176
+ {
2177
+ "data-slot": "item-media",
2178
+ "data-variant": variant,
2179
+ className: cn(itemMediaVariants({ variant, className })),
2180
+ ...props
2181
+ }
2182
+ );
2183
+ }
2184
+ function ItemContent({ className, ...props }) {
2185
+ return /* @__PURE__ */ jsx25(
2186
+ "div",
2187
+ {
2188
+ "data-slot": "item-content",
2189
+ className: cn(
2190
+ "flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none",
2191
+ className
2192
+ ),
2193
+ ...props
2194
+ }
2195
+ );
2196
+ }
2197
+ function ItemTitle({ className, ...props }) {
2198
+ return /* @__PURE__ */ jsx25(
2199
+ "div",
2200
+ {
2201
+ "data-slot": "item-title",
2202
+ className: cn(
2203
+ "line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4",
2204
+ className
2205
+ ),
2206
+ ...props
2207
+ }
2208
+ );
2209
+ }
2210
+ function ItemDescription({ className, ...props }) {
2211
+ return /* @__PURE__ */ jsx25(
2212
+ "p",
2213
+ {
2214
+ "data-slot": "item-description",
2215
+ className: cn(
2216
+ "line-clamp-2 text-left text-sm leading-normal font-normal text-muted-foreground group-data-[size=xs]/item:text-xs [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
2217
+ className
2218
+ ),
2219
+ ...props
2220
+ }
2221
+ );
2222
+ }
2223
+ function ItemActions({ className, ...props }) {
2224
+ return /* @__PURE__ */ jsx25(
2225
+ "div",
2226
+ {
2227
+ "data-slot": "item-actions",
2228
+ className: cn("flex items-center gap-2", className),
2229
+ ...props
2230
+ }
2231
+ );
2232
+ }
2233
+ function ItemHeader({ className, ...props }) {
2234
+ return /* @__PURE__ */ jsx25(
2235
+ "div",
2236
+ {
2237
+ "data-slot": "item-header",
2238
+ className: cn(
2239
+ "flex basis-full items-center justify-between gap-2",
2240
+ className
2241
+ ),
2242
+ ...props
2243
+ }
2244
+ );
2245
+ }
2246
+ function ItemFooter({ className, ...props }) {
2247
+ return /* @__PURE__ */ jsx25(
2248
+ "div",
2249
+ {
2250
+ "data-slot": "item-footer",
2251
+ className: cn(
2252
+ "flex basis-full items-center justify-between gap-2",
2253
+ className
2254
+ ),
2255
+ ...props
2256
+ }
2257
+ );
2258
+ }
2259
+
2260
+ // src/components/ui/navigation-menu.tsx
2261
+ import "react";
2262
+ import { cva as cva9 } from "class-variance-authority";
2263
+ import { NavigationMenu as NavigationMenuPrimitive } from "radix-ui";
2264
+ import { ChevronDownIcon } from "lucide-react";
2265
+ import { jsx as jsx26, jsxs as jsxs7 } from "react/jsx-runtime";
2266
+ function NavigationMenu({
2267
+ className,
2268
+ children,
2269
+ viewport = true,
2270
+ ...props
2271
+ }) {
2272
+ return /* @__PURE__ */ jsxs7(
2273
+ NavigationMenuPrimitive.Root,
2274
+ {
2275
+ "data-slot": "navigation-menu",
2276
+ "data-viewport": viewport,
2277
+ className: cn(
2278
+ "group/navigation-menu relative flex max-w-max flex-1 items-center justify-center",
2279
+ className
2280
+ ),
2281
+ ...props,
2282
+ children: [
2283
+ children,
2284
+ viewport && /* @__PURE__ */ jsx26(NavigationMenuViewport, {})
2285
+ ]
2286
+ }
2287
+ );
2288
+ }
2289
+ function NavigationMenuList({
2290
+ className,
2291
+ ...props
2292
+ }) {
2293
+ return /* @__PURE__ */ jsx26(
2294
+ NavigationMenuPrimitive.List,
2295
+ {
2296
+ "data-slot": "navigation-menu-list",
2297
+ className: cn(
2298
+ "group flex flex-1 list-none items-center justify-center gap-0",
2299
+ className
2300
+ ),
2301
+ ...props
2302
+ }
2303
+ );
2304
+ }
2305
+ function NavigationMenuItem({
2306
+ className,
2307
+ ...props
2308
+ }) {
2309
+ return /* @__PURE__ */ jsx26(
2310
+ NavigationMenuPrimitive.Item,
2311
+ {
2312
+ "data-slot": "navigation-menu-item",
2313
+ className: cn("relative", className),
2314
+ ...props
2315
+ }
2316
+ );
2317
+ }
2318
+ var navigationMenuTriggerStyle = cva9(
2319
+ "group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted"
2320
+ );
2321
+ function NavigationMenuTrigger({
2322
+ className,
2323
+ children,
2324
+ ...props
2325
+ }) {
2326
+ return /* @__PURE__ */ jsxs7(
2327
+ NavigationMenuPrimitive.Trigger,
2328
+ {
2329
+ "data-slot": "navigation-menu-trigger",
2330
+ className: cn(navigationMenuTriggerStyle(), "group", className),
2331
+ ...props,
2332
+ children: [
2333
+ children,
2334
+ " ",
2335
+ /* @__PURE__ */ jsx26(ChevronDownIcon, { className: "relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180", "aria-hidden": "true" })
2336
+ ]
2337
+ }
2338
+ );
2339
+ }
2340
+ function NavigationMenuContent({
2341
+ className,
2342
+ ...props
2343
+ }) {
2344
+ return /* @__PURE__ */ jsx26(
2345
+ NavigationMenuPrimitive.Content,
2346
+ {
2347
+ "data-slot": "navigation-menu-content",
2348
+ className: cn(
2349
+ "top-0 left-0 w-full p-1 ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:duration-300 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none md:absolute md:w-auto group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95",
2350
+ className
2351
+ ),
2352
+ ...props
2353
+ }
2354
+ );
2355
+ }
2356
+ function NavigationMenuViewport({
2357
+ className,
2358
+ ...props
2359
+ }) {
2360
+ return /* @__PURE__ */ jsx26(
2361
+ "div",
2362
+ {
2363
+ className: cn(
2364
+ "absolute top-full left-0 isolate z-50 flex justify-center"
2365
+ ),
2366
+ children: /* @__PURE__ */ jsx26(
2367
+ NavigationMenuPrimitive.Viewport,
2368
+ {
2369
+ "data-slot": "navigation-menu-viewport",
2370
+ className: cn(
2371
+ "origin-top-center relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-full overflow-hidden rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 duration-100 md:w-(--radix-navigation-menu-viewport-width) data-open:animate-in data-open:zoom-in-90 data-closed:animate-out data-closed:zoom-out-90",
2372
+ className
2373
+ ),
2374
+ ...props
2375
+ }
2376
+ )
2377
+ }
2378
+ );
2379
+ }
2380
+ function NavigationMenuLink({
2381
+ className,
2382
+ ...props
2383
+ }) {
2384
+ return /* @__PURE__ */ jsx26(
2385
+ NavigationMenuPrimitive.Link,
2386
+ {
2387
+ "data-slot": "navigation-menu-link",
2388
+ className: cn(
2389
+ "flex items-center gap-2 rounded-lg p-2 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4",
2390
+ className
2391
+ ),
2392
+ ...props
2393
+ }
2394
+ );
2395
+ }
2396
+ function NavigationMenuIndicator({
2397
+ className,
2398
+ ...props
2399
+ }) {
2400
+ return /* @__PURE__ */ jsx26(
2401
+ NavigationMenuPrimitive.Indicator,
2402
+ {
2403
+ "data-slot": "navigation-menu-indicator",
2404
+ className: cn(
2405
+ "top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in",
2406
+ className
2407
+ ),
2408
+ ...props,
2409
+ children: /* @__PURE__ */ jsx26("div", { className: "relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" })
2410
+ }
2411
+ );
2412
+ }
2413
+
2414
+ // src/components/ui/pagination.tsx
2415
+ import "react";
2416
+ import { ChevronLeftIcon, ChevronRightIcon as ChevronRightIcon2, MoreHorizontalIcon } from "lucide-react";
2417
+ import { jsx as jsx27, jsxs as jsxs8 } from "react/jsx-runtime";
2418
+ function Pagination({ className, ...props }) {
2419
+ return /* @__PURE__ */ jsx27(
2420
+ "nav",
2421
+ {
2422
+ role: "navigation",
2423
+ "aria-label": "pagination",
2424
+ "data-slot": "pagination",
2425
+ className: cn("mx-auto flex w-full justify-center", className),
2426
+ ...props
2427
+ }
2428
+ );
2429
+ }
2430
+ function PaginationContent({
2431
+ className,
2432
+ ...props
2433
+ }) {
2434
+ return /* @__PURE__ */ jsx27(
2435
+ "ul",
2436
+ {
2437
+ "data-slot": "pagination-content",
2438
+ className: cn("flex items-center gap-0.5", className),
2439
+ ...props
2440
+ }
2441
+ );
2442
+ }
2443
+ function PaginationItem({ ...props }) {
2444
+ return /* @__PURE__ */ jsx27("li", { "data-slot": "pagination-item", ...props });
2445
+ }
2446
+ function PaginationLink({
2447
+ className,
2448
+ isActive,
2449
+ size = "icon",
2450
+ ...props
2451
+ }) {
2452
+ return /* @__PURE__ */ jsx27(
2453
+ Button,
2454
+ {
2455
+ asChild: true,
2456
+ variant: isActive ? "outline" : "ghost",
2457
+ size,
2458
+ className: cn(className),
2459
+ children: /* @__PURE__ */ jsx27(
2460
+ "a",
2461
+ {
2462
+ "aria-current": isActive ? "page" : void 0,
2463
+ "data-slot": "pagination-link",
2464
+ "data-active": isActive,
2465
+ ...props
2466
+ }
2467
+ )
2468
+ }
2469
+ );
2470
+ }
2471
+ function PaginationPrevious({
2472
+ className,
2473
+ text = "Previous",
2474
+ ...props
2475
+ }) {
2476
+ return /* @__PURE__ */ jsxs8(
2477
+ PaginationLink,
2478
+ {
2479
+ "aria-label": "Go to previous page",
2480
+ size: "default",
2481
+ className: cn("pl-1.5!", className),
2482
+ ...props,
2483
+ children: [
2484
+ /* @__PURE__ */ jsx27(ChevronLeftIcon, { "data-icon": "inline-start" }),
2485
+ /* @__PURE__ */ jsx27("span", { className: "hidden sm:block", children: text })
2486
+ ]
2487
+ }
2488
+ );
2489
+ }
2490
+ function PaginationNext({
2491
+ className,
2492
+ text = "Next",
2493
+ ...props
2494
+ }) {
2495
+ return /* @__PURE__ */ jsxs8(
2496
+ PaginationLink,
2497
+ {
2498
+ "aria-label": "Go to next page",
2499
+ size: "default",
2500
+ className: cn("pr-1.5!", className),
2501
+ ...props,
2502
+ children: [
2503
+ /* @__PURE__ */ jsx27("span", { className: "hidden sm:block", children: text }),
2504
+ /* @__PURE__ */ jsx27(ChevronRightIcon2, { "data-icon": "inline-end" })
2505
+ ]
2506
+ }
2507
+ );
2508
+ }
2509
+ function PaginationEllipsis({
2510
+ className,
2511
+ ...props
2512
+ }) {
2513
+ return /* @__PURE__ */ jsxs8(
2514
+ "span",
2515
+ {
2516
+ "aria-hidden": true,
2517
+ "data-slot": "pagination-ellipsis",
2518
+ className: cn(
2519
+ "flex size-8 items-center justify-center [&_svg:not([class*='size-'])]:size-4",
2520
+ className
2521
+ ),
2522
+ ...props,
2523
+ children: [
2524
+ /* @__PURE__ */ jsx27(
2525
+ MoreHorizontalIcon,
2526
+ {}
2527
+ ),
2528
+ /* @__PURE__ */ jsx27("span", { className: "sr-only", children: "More pages" })
2529
+ ]
2530
+ }
2531
+ );
2532
+ }
2533
+
2534
+ // src/components/ui/progress.tsx
2535
+ import "react";
2536
+ import { Progress as ProgressPrimitive } from "radix-ui";
2537
+ import { jsx as jsx28 } from "react/jsx-runtime";
2538
+ function Progress({
2539
+ className,
2540
+ value,
2541
+ ...props
2542
+ }) {
2543
+ return /* @__PURE__ */ jsx28(
2544
+ ProgressPrimitive.Root,
2545
+ {
2546
+ "data-slot": "progress",
2547
+ className: cn(
2548
+ "relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted",
2549
+ className
2550
+ ),
2551
+ ...props,
2552
+ children: /* @__PURE__ */ jsx28(
2553
+ ProgressPrimitive.Indicator,
2554
+ {
2555
+ "data-slot": "progress-indicator",
2556
+ className: "size-full flex-1 bg-primary transition-all",
2557
+ style: { transform: `translateX(-${100 - (value || 0)}%)` }
2558
+ }
2559
+ )
2560
+ }
2561
+ );
2562
+ }
2563
+
2564
+ // src/components/ui/radio-group.tsx
2565
+ import "react";
2566
+ import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
2567
+ import { jsx as jsx29 } from "react/jsx-runtime";
2568
+ function RadioGroup({
2569
+ className,
2570
+ ...props
2571
+ }) {
2572
+ return /* @__PURE__ */ jsx29(
2573
+ RadioGroupPrimitive.Root,
2574
+ {
2575
+ "data-slot": "radio-group",
2576
+ className: cn("grid w-full gap-2", className),
2577
+ ...props
2578
+ }
2579
+ );
2580
+ }
2581
+ function RadioGroupItem({
2582
+ className,
2583
+ ...props
2584
+ }) {
2585
+ return /* @__PURE__ */ jsx29(
2586
+ RadioGroupPrimitive.Item,
2587
+ {
2588
+ "data-slot": "radio-group-item",
2589
+ className: cn(
2590
+ "group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary",
2591
+ className
2592
+ ),
2593
+ ...props,
2594
+ children: /* @__PURE__ */ jsx29(
2595
+ RadioGroupPrimitive.Indicator,
2596
+ {
2597
+ "data-slot": "radio-group-indicator",
2598
+ className: "flex size-4 items-center justify-center",
2599
+ children: /* @__PURE__ */ jsx29("span", { className: "absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground" })
2600
+ }
2601
+ )
2602
+ }
2603
+ );
2604
+ }
2605
+
2606
+ // src/components/ui/select.tsx
2607
+ import "react";
2608
+ import { Select as SelectPrimitive } from "radix-ui";
2609
+ import { ChevronDownIcon as ChevronDownIcon2, CheckIcon as CheckIcon3, ChevronUpIcon } from "lucide-react";
2610
+ import { jsx as jsx30, jsxs as jsxs9 } from "react/jsx-runtime";
2611
+ function Select({
2612
+ ...props
2613
+ }) {
2614
+ return /* @__PURE__ */ jsx30(SelectPrimitive.Root, { "data-slot": "select", ...props });
2615
+ }
2616
+ function SelectGroup({
2617
+ className,
2618
+ ...props
2619
+ }) {
2620
+ return /* @__PURE__ */ jsx30(
2621
+ SelectPrimitive.Group,
2622
+ {
2623
+ "data-slot": "select-group",
2624
+ className: cn("scroll-my-1 p-1", className),
2625
+ ...props
2626
+ }
2627
+ );
2628
+ }
2629
+ function SelectValue({
2630
+ ...props
2631
+ }) {
2632
+ return /* @__PURE__ */ jsx30(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
2633
+ }
2634
+ function SelectTrigger({
2635
+ className,
2636
+ size = "default",
2637
+ children,
2638
+ ...props
2639
+ }) {
2640
+ return /* @__PURE__ */ jsxs9(
2641
+ SelectPrimitive.Trigger,
2642
+ {
2643
+ "data-slot": "select-trigger",
2644
+ "data-size": size,
2645
+ className: cn(
2646
+ "flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
2647
+ className
2648
+ ),
2649
+ ...props,
2650
+ children: [
2651
+ children,
2652
+ /* @__PURE__ */ jsx30(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx30(ChevronDownIcon2, { className: "pointer-events-none size-4 text-muted-foreground" }) })
2653
+ ]
2654
+ }
2655
+ );
2656
+ }
2657
+ function SelectContent({
2658
+ className,
2659
+ children,
2660
+ position = "item-aligned",
2661
+ align = "center",
2662
+ ...props
2663
+ }) {
2664
+ return /* @__PURE__ */ jsx30(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs9(
2665
+ SelectPrimitive.Content,
2666
+ {
2667
+ "data-slot": "select-content",
2668
+ "data-align-trigger": position === "item-aligned",
2669
+ className: cn("relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className),
2670
+ position,
2671
+ align,
2672
+ ...props,
2673
+ children: [
2674
+ /* @__PURE__ */ jsx30(SelectScrollUpButton, {}),
2675
+ /* @__PURE__ */ jsx30(
2676
+ SelectPrimitive.Viewport,
2677
+ {
2678
+ "data-position": position,
2679
+ className: cn(
2680
+ "data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)",
2681
+ position === "popper" && ""
2682
+ ),
2683
+ children
2684
+ }
2685
+ ),
2686
+ /* @__PURE__ */ jsx30(SelectScrollDownButton, {})
2687
+ ]
2688
+ }
2689
+ ) });
2690
+ }
2691
+ function SelectLabel({
2692
+ className,
2693
+ ...props
2694
+ }) {
2695
+ return /* @__PURE__ */ jsx30(
2696
+ SelectPrimitive.Label,
2697
+ {
2698
+ "data-slot": "select-label",
2699
+ className: cn("px-1.5 py-1 text-xs text-muted-foreground", className),
2700
+ ...props
2701
+ }
2702
+ );
2703
+ }
2704
+ function SelectItem({
2705
+ className,
2706
+ children,
2707
+ ...props
2708
+ }) {
2709
+ return /* @__PURE__ */ jsxs9(
2710
+ SelectPrimitive.Item,
2711
+ {
2712
+ "data-slot": "select-item",
2713
+ className: cn(
2714
+ "relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
2715
+ className
2716
+ ),
2717
+ ...props,
2718
+ children: [
2719
+ /* @__PURE__ */ jsx30("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx30(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx30(CheckIcon3, { className: "pointer-events-none" }) }) }),
2720
+ /* @__PURE__ */ jsx30(SelectPrimitive.ItemText, { children })
2721
+ ]
2722
+ }
2723
+ );
2724
+ }
2725
+ function SelectSeparator({
2726
+ className,
2727
+ ...props
2728
+ }) {
2729
+ return /* @__PURE__ */ jsx30(
2730
+ SelectPrimitive.Separator,
2731
+ {
2732
+ "data-slot": "select-separator",
2733
+ className: cn("pointer-events-none -mx-1 my-1 h-px bg-border", className),
2734
+ ...props
2735
+ }
2736
+ );
2737
+ }
2738
+ function SelectScrollUpButton({
2739
+ className,
2740
+ ...props
2741
+ }) {
2742
+ return /* @__PURE__ */ jsx30(
2743
+ SelectPrimitive.ScrollUpButton,
2744
+ {
2745
+ "data-slot": "select-scroll-up-button",
2746
+ className: cn(
2747
+ "z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",
2748
+ className
2749
+ ),
2750
+ ...props,
2751
+ children: /* @__PURE__ */ jsx30(
2752
+ ChevronUpIcon,
2753
+ {}
2754
+ )
2755
+ }
2756
+ );
2757
+ }
2758
+ function SelectScrollDownButton({
2759
+ className,
2760
+ ...props
2761
+ }) {
2762
+ return /* @__PURE__ */ jsx30(
2763
+ SelectPrimitive.ScrollDownButton,
2764
+ {
2765
+ "data-slot": "select-scroll-down-button",
2766
+ className: cn(
2767
+ "z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4",
2768
+ className
2769
+ ),
2770
+ ...props,
2771
+ children: /* @__PURE__ */ jsx30(
2772
+ ChevronDownIcon2,
2773
+ {}
2774
+ )
2775
+ }
2776
+ );
2777
+ }
2778
+
2779
+ // src/components/ui/sonner.tsx
2780
+ import { useTheme } from "next-themes";
2781
+ import { Toaster as Sonner } from "sonner";
2782
+ import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from "lucide-react";
2783
+ import { jsx as jsx31 } from "react/jsx-runtime";
2784
+ var Toaster = ({ ...props }) => {
2785
+ const { theme = "system" } = useTheme();
2786
+ return /* @__PURE__ */ jsx31(
2787
+ Sonner,
2788
+ {
2789
+ theme,
2790
+ className: "toaster group",
2791
+ icons: {
2792
+ success: /* @__PURE__ */ jsx31(CircleCheckIcon, { className: "size-4" }),
2793
+ info: /* @__PURE__ */ jsx31(InfoIcon, { className: "size-4" }),
2794
+ warning: /* @__PURE__ */ jsx31(TriangleAlertIcon, { className: "size-4" }),
2795
+ error: /* @__PURE__ */ jsx31(OctagonXIcon, { className: "size-4" }),
2796
+ loading: /* @__PURE__ */ jsx31(Loader2Icon, { className: "size-4 animate-spin" })
2797
+ },
2798
+ style: {
2799
+ "--normal-bg": "var(--popover)",
2800
+ "--normal-text": "var(--popover-foreground)",
2801
+ "--normal-border": "var(--border)",
2802
+ "--border-radius": "var(--radius)"
2803
+ },
2804
+ toastOptions: {
2805
+ classNames: {
2806
+ toast: "cn-toast"
2807
+ }
2808
+ },
2809
+ ...props
2810
+ }
2811
+ );
2812
+ };
2813
+
2814
+ // src/components/ui/spinner.tsx
2815
+ import { Loader2Icon as Loader2Icon2 } from "lucide-react";
2816
+ import { jsx as jsx32 } from "react/jsx-runtime";
2817
+ function Spinner({ className, ...props }) {
2818
+ return /* @__PURE__ */ jsx32(Loader2Icon2, { "data-slot": "spinner", role: "status", "aria-label": "Loading", className: cn("size-4 animate-spin", className), ...props });
2819
+ }
2820
+
2821
+ // src/components/ui/switch.tsx
2822
+ import "react";
2823
+ import { Switch as SwitchPrimitive } from "radix-ui";
2824
+ import { jsx as jsx33 } from "react/jsx-runtime";
2825
+ function Switch({
2826
+ className,
2827
+ size = "default",
2828
+ ...props
2829
+ }) {
2830
+ return /* @__PURE__ */ jsx33(
2831
+ SwitchPrimitive.Root,
2832
+ {
2833
+ "data-slot": "switch",
2834
+ "data-size": size,
2835
+ className: cn(
2836
+ "peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",
2837
+ className
2838
+ ),
2839
+ ...props,
2840
+ children: /* @__PURE__ */ jsx33(
2841
+ SwitchPrimitive.Thumb,
2842
+ {
2843
+ "data-slot": "switch-thumb",
2844
+ className: "pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground"
2845
+ }
2846
+ )
2847
+ }
2848
+ );
2849
+ }
2850
+
2851
+ // src/components/ui/table.tsx
2852
+ import "react";
2853
+ import { jsx as jsx34 } from "react/jsx-runtime";
2854
+ function Table({ className, ...props }) {
2855
+ return /* @__PURE__ */ jsx34(
2856
+ "div",
2857
+ {
2858
+ "data-slot": "table-container",
2859
+ className: "relative w-full overflow-x-auto",
2860
+ children: /* @__PURE__ */ jsx34(
2861
+ "table",
2862
+ {
2863
+ "data-slot": "table",
2864
+ className: cn("w-full caption-bottom text-sm", className),
2865
+ ...props
2866
+ }
2867
+ )
2868
+ }
2869
+ );
2870
+ }
2871
+ function TableHeader({ className, ...props }) {
2872
+ return /* @__PURE__ */ jsx34(
2873
+ "thead",
2874
+ {
2875
+ "data-slot": "table-header",
2876
+ className: cn("[&_tr]:border-b", className),
2877
+ ...props
2878
+ }
2879
+ );
2880
+ }
2881
+ function TableBody({ className, ...props }) {
2882
+ return /* @__PURE__ */ jsx34(
2883
+ "tbody",
2884
+ {
2885
+ "data-slot": "table-body",
2886
+ className: cn("[&_tr:last-child]:border-0", className),
2887
+ ...props
2888
+ }
2889
+ );
2890
+ }
2891
+ function TableFooter({ className, ...props }) {
2892
+ return /* @__PURE__ */ jsx34(
2893
+ "tfoot",
2894
+ {
2895
+ "data-slot": "table-footer",
2896
+ className: cn(
2897
+ "border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
2898
+ className
2899
+ ),
2900
+ ...props
2901
+ }
2902
+ );
2903
+ }
2904
+ function TableRow({ className, ...props }) {
2905
+ return /* @__PURE__ */ jsx34(
2906
+ "tr",
2907
+ {
2908
+ "data-slot": "table-row",
2909
+ className: cn(
2910
+ "border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",
2911
+ className
2912
+ ),
2913
+ ...props
2914
+ }
2915
+ );
2916
+ }
2917
+ function TableHead({ className, ...props }) {
2918
+ return /* @__PURE__ */ jsx34(
2919
+ "th",
2920
+ {
2921
+ "data-slot": "table-head",
2922
+ className: cn(
2923
+ "h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0",
2924
+ className
2925
+ ),
2926
+ ...props
2927
+ }
2928
+ );
2929
+ }
2930
+ function TableCell({ className, ...props }) {
2931
+ return /* @__PURE__ */ jsx34(
2932
+ "td",
2933
+ {
2934
+ "data-slot": "table-cell",
2935
+ className: cn(
2936
+ "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0",
2937
+ className
2938
+ ),
2939
+ ...props
2940
+ }
2941
+ );
2942
+ }
2943
+ function TableCaption({
2944
+ className,
2945
+ ...props
2946
+ }) {
2947
+ return /* @__PURE__ */ jsx34(
2948
+ "caption",
2949
+ {
2950
+ "data-slot": "table-caption",
2951
+ className: cn("mt-4 text-sm text-muted-foreground", className),
2952
+ ...props
2953
+ }
2954
+ );
2955
+ }
2956
+
2957
+ // src/components/ui/tabs.tsx
2958
+ import "react";
2959
+ import { cva as cva10 } from "class-variance-authority";
2960
+ import { Tabs as TabsPrimitive } from "radix-ui";
2961
+ import { jsx as jsx35 } from "react/jsx-runtime";
2962
+ function Tabs({
2963
+ className,
2964
+ orientation = "horizontal",
2965
+ ...props
2966
+ }) {
2967
+ return /* @__PURE__ */ jsx35(
2968
+ TabsPrimitive.Root,
2969
+ {
2970
+ "data-slot": "tabs",
2971
+ "data-orientation": orientation,
2972
+ className: cn(
2973
+ "group/tabs flex gap-2 data-horizontal:flex-col",
2974
+ className
2975
+ ),
2976
+ ...props
2977
+ }
2978
+ );
2979
+ }
2980
+ var tabsListVariants = cva10(
2981
+ "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none",
2982
+ {
2983
+ variants: {
2984
+ variant: {
2985
+ default: "bg-muted",
2986
+ line: "gap-1 bg-transparent"
2987
+ }
2988
+ },
2989
+ defaultVariants: {
2990
+ variant: "default"
2991
+ }
2992
+ }
2993
+ );
2994
+ function TabsList({
2995
+ className,
2996
+ variant = "default",
2997
+ ...props
2998
+ }) {
2999
+ return /* @__PURE__ */ jsx35(
3000
+ TabsPrimitive.List,
3001
+ {
3002
+ "data-slot": "tabs-list",
3003
+ "data-variant": variant,
3004
+ className: cn(tabsListVariants({ variant }), className),
3005
+ ...props
3006
+ }
3007
+ );
3008
+ }
3009
+ function TabsTrigger({
3010
+ className,
3011
+ ...props
3012
+ }) {
3013
+ return /* @__PURE__ */ jsx35(
3014
+ TabsPrimitive.Trigger,
3015
+ {
3016
+ "data-slot": "tabs-trigger",
3017
+ className: cn(
3018
+ "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
3019
+ "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent",
3020
+ "data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground",
3021
+ "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",
3022
+ className
3023
+ ),
3024
+ ...props
3025
+ }
3026
+ );
3027
+ }
3028
+ function TabsContent({
3029
+ className,
3030
+ ...props
3031
+ }) {
3032
+ return /* @__PURE__ */ jsx35(
3033
+ TabsPrimitive.Content,
3034
+ {
3035
+ "data-slot": "tabs-content",
3036
+ className: cn("flex-1 text-sm outline-none", className),
3037
+ ...props
3038
+ }
3039
+ );
3040
+ }
3041
+
3042
+ // src/components/ui/toggle.tsx
3043
+ import "react";
3044
+ import { cva as cva11 } from "class-variance-authority";
3045
+ import { Toggle as TogglePrimitive } from "radix-ui";
3046
+ import { jsx as jsx36 } from "react/jsx-runtime";
3047
+ var toggleVariants = cva11(
3048
+ "group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
3049
+ {
3050
+ variants: {
3051
+ variant: {
3052
+ default: "bg-transparent",
3053
+ outline: "border border-input bg-transparent hover:bg-muted"
3054
+ },
3055
+ size: {
3056
+ default: "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
3057
+ sm: "h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
3058
+ lg: "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2"
3059
+ }
3060
+ },
3061
+ defaultVariants: {
3062
+ variant: "default",
3063
+ size: "default"
3064
+ }
3065
+ }
3066
+ );
3067
+ function Toggle({
3068
+ className,
3069
+ variant = "default",
3070
+ size = "default",
3071
+ ...props
3072
+ }) {
3073
+ return /* @__PURE__ */ jsx36(
3074
+ TogglePrimitive.Root,
3075
+ {
3076
+ "data-slot": "toggle",
3077
+ className: cn(toggleVariants({ variant, size, className })),
3078
+ ...props
3079
+ }
3080
+ );
3081
+ }
3082
+
3083
+ // src/components/ui/toggle-group.tsx
3084
+ import * as React25 from "react";
3085
+ import "class-variance-authority";
3086
+ import { ToggleGroup as ToggleGroupPrimitive } from "radix-ui";
3087
+ import { jsx as jsx37 } from "react/jsx-runtime";
3088
+ var ToggleGroupContext = React25.createContext({
3089
+ size: "default",
3090
+ variant: "default",
3091
+ spacing: 2,
3092
+ orientation: "horizontal"
3093
+ });
3094
+ function ToggleGroup({
3095
+ className,
3096
+ variant,
3097
+ size,
3098
+ spacing: spacing2 = 2,
3099
+ orientation = "horizontal",
3100
+ children,
3101
+ ...props
3102
+ }) {
3103
+ return /* @__PURE__ */ jsx37(
3104
+ ToggleGroupPrimitive.Root,
3105
+ {
3106
+ "data-slot": "toggle-group",
3107
+ "data-variant": variant,
3108
+ "data-size": size,
3109
+ "data-spacing": spacing2,
3110
+ "data-orientation": orientation,
3111
+ style: { "--gap": spacing2 },
3112
+ className: cn(
3113
+ "group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch",
3114
+ className
3115
+ ),
3116
+ ...props,
3117
+ children: /* @__PURE__ */ jsx37(
3118
+ ToggleGroupContext.Provider,
3119
+ {
3120
+ value: { variant, size, spacing: spacing2, orientation },
3121
+ children
3122
+ }
3123
+ )
3124
+ }
3125
+ );
3126
+ }
3127
+ function ToggleGroupItem({
3128
+ className,
3129
+ children,
3130
+ variant = "default",
3131
+ size = "default",
3132
+ ...props
3133
+ }) {
3134
+ const context = React25.useContext(ToggleGroupContext);
3135
+ return /* @__PURE__ */ jsx37(
3136
+ ToggleGroupPrimitive.Item,
3137
+ {
3138
+ "data-slot": "toggle-group-item",
3139
+ "data-variant": context.variant || variant,
3140
+ "data-size": context.size || size,
3141
+ "data-spacing": context.spacing,
3142
+ className: cn(
3143
+ "shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t",
3144
+ toggleVariants({
3145
+ variant: context.variant || variant,
3146
+ size: context.size || size
3147
+ }),
3148
+ className
3149
+ ),
3150
+ ...props,
3151
+ children
3152
+ }
3153
+ );
3154
+ }
3155
+
3156
+ // src/components/ui/tooltip.tsx
3157
+ import "react";
3158
+ import { Tooltip as TooltipPrimitive } from "radix-ui";
3159
+ import { jsx as jsx38, jsxs as jsxs10 } from "react/jsx-runtime";
3160
+ function TooltipProvider({
3161
+ delayDuration = 0,
3162
+ ...props
3163
+ }) {
3164
+ return /* @__PURE__ */ jsx38(
3165
+ TooltipPrimitive.Provider,
3166
+ {
3167
+ "data-slot": "tooltip-provider",
3168
+ delayDuration,
3169
+ ...props
3170
+ }
3171
+ );
3172
+ }
3173
+ function Tooltip2({
3174
+ ...props
3175
+ }) {
3176
+ return /* @__PURE__ */ jsx38(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
3177
+ }
3178
+ function TooltipTrigger({
3179
+ ...props
3180
+ }) {
3181
+ return /* @__PURE__ */ jsx38(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
3182
+ }
3183
+ function TooltipContent({
3184
+ className,
3185
+ sideOffset = 0,
3186
+ children,
3187
+ ...props
3188
+ }) {
3189
+ return /* @__PURE__ */ jsx38(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs10(
3190
+ TooltipPrimitive.Content,
3191
+ {
3192
+ "data-slot": "tooltip-content",
3193
+ sideOffset,
3194
+ className: cn(
3195
+ "z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
3196
+ className
3197
+ ),
3198
+ ...props,
3199
+ children: [
3200
+ children,
3201
+ /* @__PURE__ */ jsx38(TooltipPrimitive.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" })
3202
+ ]
3203
+ }
3204
+ ) });
3205
+ }
3206
+
3207
+ // src/components/composed/AdviceCard.tsx
3208
+ import { jsx as jsx39, jsxs as jsxs11 } from "react/jsx-runtime";
3209
+ function AdviceCard({ icon, tone = "ink", value, text, note }) {
3210
+ const iconColor = tone === "accent" ? color.accent : color.foreground;
3211
+ return /* @__PURE__ */ jsxs11(Stack, { gap: "xs", style: { maxWidth: 168 }, children: [
3212
+ /* @__PURE__ */ jsx39(Icon, { name: icon, size: 40, color: iconColor }),
3213
+ /* @__PURE__ */ jsx39(Text, { as: "span", size: "display", weight: 400, children: value }),
3214
+ /* @__PURE__ */ jsx39(Text, { as: "span", size: "caption", style: { opacity: 0.72 }, children: text }),
3215
+ note && /* @__PURE__ */ jsx39(Text, { as: "span", size: "footnote", style: { opacity: 0.68, marginTop: 2 }, children: note })
3216
+ ] });
3217
+ }
3218
+
3219
+ // src/components/composed/Chip.tsx
3220
+ import { jsx as jsx40 } from "react/jsx-runtime";
3221
+ function Chip({ children, style, ...props }) {
3222
+ return /* @__PURE__ */ jsx40(
3223
+ Surface,
3224
+ {
3225
+ as: "button",
3226
+ type: "button",
3227
+ variant: "glass",
3228
+ radius: "pill",
3229
+ style: {
3230
+ border: "none",
3231
+ cursor: "pointer",
3232
+ fontSize: 16,
3233
+ fontWeight: 500,
3234
+ color: color.foreground,
3235
+ padding: "8px 14px",
3236
+ ...style
3237
+ },
3238
+ ...props,
3239
+ children
3240
+ }
3241
+ );
3242
+ }
3243
+
3244
+ // src/components/composed/Field.tsx
3245
+ import { jsx as jsx41, jsxs as jsxs12 } from "react/jsx-runtime";
3246
+ function FormField({ label, htmlFor, description, error, children }) {
3247
+ return /* @__PURE__ */ jsxs12(Field, { "data-invalid": error ? true : void 0, children: [
3248
+ /* @__PURE__ */ jsx41(FieldLabel, { htmlFor, children: label }),
3249
+ children,
3250
+ description && !error && /* @__PURE__ */ jsx41(FieldDescription, { children: description }),
3251
+ error && /* @__PURE__ */ jsx41(FieldError, { children: error })
3252
+ ] });
3253
+ }
3254
+
3255
+ // src/components/composed/FilterSelect.tsx
3256
+ import { Fragment as Fragment2, jsx as jsx42, jsxs as jsxs13 } from "react/jsx-runtime";
3257
+ function FilterSelect({ label, placeholder, value, onValueChange, onClear, options }) {
3258
+ return /* @__PURE__ */ jsxs13(
3259
+ Surface,
3260
+ {
3261
+ variant: "paper",
3262
+ radius: "pill",
3263
+ style: { display: "inline-flex", alignItems: "stretch", overflow: "hidden", width: "max-content" },
3264
+ children: [
3265
+ /* @__PURE__ */ jsxs13(Select, { value, onValueChange, children: [
3266
+ /* @__PURE__ */ jsx42(
3267
+ SelectTrigger,
3268
+ {
3269
+ "aria-label": label,
3270
+ style: { border: "none", background: "transparent", borderRadius: 0 },
3271
+ children: /* @__PURE__ */ jsx42(SelectValue, { placeholder })
3272
+ }
3273
+ ),
3274
+ /* @__PURE__ */ jsx42(SelectContent, { children: options.map((o) => /* @__PURE__ */ jsx42(SelectItem, { value: o.value, children: o.label }, o.value)) })
3275
+ ] }),
3276
+ value && /* @__PURE__ */ jsxs13(Fragment2, { children: [
3277
+ /* @__PURE__ */ jsx42(Separator, { orientation: "vertical" }),
3278
+ /* @__PURE__ */ jsx42(
3279
+ "button",
3280
+ {
3281
+ type: "button",
3282
+ onClick: onClear,
3283
+ "aria-label": `\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C ${label.toLowerCase()}`,
3284
+ style: {
3285
+ width: 36,
3286
+ display: "flex",
3287
+ alignItems: "center",
3288
+ justifyContent: "center",
3289
+ border: "none",
3290
+ background: "transparent",
3291
+ color: color.ink3,
3292
+ cursor: "pointer",
3293
+ padding: 0
3294
+ },
3295
+ onMouseEnter: (e) => {
3296
+ e.currentTarget.style.background = color.muted;
3297
+ e.currentTarget.style.color = color.accent;
3298
+ },
3299
+ onMouseLeave: (e) => {
3300
+ e.currentTarget.style.background = "transparent";
3301
+ e.currentTarget.style.color = color.ink3;
3302
+ },
3303
+ children: /* @__PURE__ */ jsx42(Icon, { name: "close", size: 14 })
3304
+ }
3305
+ )
3306
+ ] })
3307
+ ]
3308
+ }
3309
+ );
3310
+ }
3311
+
3312
+ // src/components/composed/MessageBubble.tsx
3313
+ import { jsx as jsx43 } from "react/jsx-runtime";
3314
+ function MessageBubble({ from, children }) {
3315
+ const isUser = from === "user";
3316
+ return /* @__PURE__ */ jsx43(
3317
+ Box,
3318
+ {
3319
+ p: "base",
3320
+ radius: "xl",
3321
+ style: {
3322
+ maxWidth: "90%",
3323
+ alignSelf: isUser ? "flex-end" : "flex-start",
3324
+ background: isUser ? color.foreground : color.secondary,
3325
+ color: isUser ? color.background : color.foreground,
3326
+ fontSize: 16,
3327
+ lineHeight: 1.55,
3328
+ borderBottomRightRadius: isUser ? 5 : void 0,
3329
+ borderBottomLeftRadius: isUser ? void 0 : 5
3330
+ },
3331
+ children
3332
+ }
3333
+ );
3334
+ }
3335
+
3336
+ // src/components/composed/Search.tsx
3337
+ import { jsx as jsx44, jsxs as jsxs14 } from "react/jsx-runtime";
3338
+ function Search({ placeholder = "\u041F\u043E\u0438\u0441\u043A", value, onChange, className }) {
3339
+ return /* @__PURE__ */ jsxs14(InputGroup, { className, children: [
3340
+ /* @__PURE__ */ jsx44(InputGroupAddon, { children: /* @__PURE__ */ jsx44(Icon, { name: "search", size: 16 }) }),
3341
+ /* @__PURE__ */ jsx44(
3342
+ InputGroupInput,
3343
+ {
3344
+ placeholder,
3345
+ value,
3346
+ onChange: onChange ? (e) => onChange(e.target.value) : void 0
3347
+ }
3348
+ )
3349
+ ] });
3350
+ }
3351
+
3352
+ // src/components/composed/Toolbar.tsx
3353
+ import { Toolbar as RadixToolbar } from "radix-ui";
3354
+ import { jsx as jsx45 } from "react/jsx-runtime";
3355
+ function Toolbar({
3356
+ children,
3357
+ orientation = "horizontal",
3358
+ bare = false
3359
+ }) {
3360
+ if (bare) {
3361
+ return /* @__PURE__ */ jsx45(RadixToolbar.Root, { asChild: true, orientation, children: /* @__PURE__ */ jsx45(Flex, { align: "center", gap: "md", children }) });
3362
+ }
3363
+ return /* @__PURE__ */ jsx45(RadixToolbar.Root, { asChild: true, orientation, children: /* @__PURE__ */ jsx45(
3364
+ Flex,
3365
+ {
3366
+ align: "center",
3367
+ justify: "between",
3368
+ gap: "md",
3369
+ p: "sm",
3370
+ radius: "lg",
3371
+ style: { background: color.muted },
3372
+ children
3373
+ }
3374
+ ) });
3375
+ }
3376
+ function ToolbarGroup({ children }) {
3377
+ return /* @__PURE__ */ jsx45(Flex, { align: "center", gap: "xs", children });
3378
+ }
3379
+ function ToolbarToggleGroup({
3380
+ value,
3381
+ onValueChange,
3382
+ children
3383
+ }) {
3384
+ return /* @__PURE__ */ jsx45(
3385
+ RadixToolbar.ToggleGroup,
3386
+ {
3387
+ type: "single",
3388
+ value,
3389
+ onValueChange: (v) => v && onValueChange?.(v),
3390
+ asChild: true,
3391
+ children: /* @__PURE__ */ jsx45(Flex, { gap: "xs", style: { background: color.background, borderRadius: radius.pill, padding: spacing.xs }, children })
3392
+ }
3393
+ );
3394
+ }
3395
+ function ToolbarToggleItem({
3396
+ value,
3397
+ children
3398
+ }) {
3399
+ return /* @__PURE__ */ jsx45(
3400
+ RadixToolbar.ToggleItem,
3401
+ {
3402
+ value,
3403
+ className: "toolbar-toggle-item",
3404
+ style: {
3405
+ // background/color are NOT set here — inline style always wins over
3406
+ // an external CSS rule regardless of specificity, which would make
3407
+ // Toolbar.css's `[data-state="on"]` selector permanently dead (this
3408
+ // is exactly the bug that shipped: the active tab never highlighted
3409
+ // even though Radix's data-state was switching correctly). Both
3410
+ // states live in Toolbar.css instead.
3411
+ border: "none",
3412
+ borderRadius: radius.pill,
3413
+ padding: `${spacing.xs}px ${spacing.md}px`,
3414
+ fontSize: 14,
3415
+ cursor: "pointer"
3416
+ },
3417
+ children
3418
+ }
3419
+ );
3420
+ }
3421
+ function ToolbarSeparator() {
3422
+ return /* @__PURE__ */ jsx45(RadixToolbar.Separator, { style: { width: 1, height: 24, background: color.input } });
3423
+ }
3424
+ function ToolbarButton({ children }) {
3425
+ return /* @__PURE__ */ jsx45(RadixToolbar.Button, { asChild: true, children });
3426
+ }
3427
+
3428
+ // src/components/composed/TypingIndicator.tsx
3429
+ import { jsx as jsx46, jsxs as jsxs15 } from "react/jsx-runtime";
3430
+ function TypingIndicator() {
3431
+ return /* @__PURE__ */ jsxs15(
3432
+ Box,
3433
+ {
3434
+ radius: "xl",
3435
+ style: {
3436
+ display: "inline-flex",
3437
+ gap: 4,
3438
+ alignSelf: "flex-start",
3439
+ background: color.secondary,
3440
+ padding: "13px 15px",
3441
+ borderBottomLeftRadius: 5
3442
+ },
3443
+ children: [
3444
+ /* @__PURE__ */ jsx46("span", { className: "typing-dot" }),
3445
+ /* @__PURE__ */ jsx46("span", { className: "typing-dot", style: { animationDelay: ".2s" } }),
3446
+ /* @__PURE__ */ jsx46("span", { className: "typing-dot", style: { animationDelay: ".4s" } })
3447
+ ]
3448
+ }
3449
+ );
3450
+ }
3451
+
3452
+ // src/components/composed/charts/AreaChart.tsx
3453
+ import { AreaChart as RAreaChart, Area, XAxis, YAxis, CartesianGrid } from "recharts";
3454
+ import { jsx as jsx47, jsxs as jsxs16 } from "react/jsx-runtime";
3455
+ function AreaChart({ data, xKey, series, height = 260, showLegend = series.length > 1, stacked = true }) {
3456
+ const config = Object.fromEntries(series.map((s) => [s.key, { label: s.label, color: s.color }]));
3457
+ return /* @__PURE__ */ jsx47(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs16(RAreaChart, { data, children: [
3458
+ /* @__PURE__ */ jsx47(CartesianGrid, { vertical: false, stroke: color.input }),
3459
+ /* @__PURE__ */ jsx47(XAxis, { dataKey: xKey, tickLine: false, axisLine: false, fontSize: 12 }),
3460
+ /* @__PURE__ */ jsx47(YAxis, { tickLine: false, axisLine: false, fontSize: 12, width: 32 }),
3461
+ /* @__PURE__ */ jsx47(ChartTooltip, { content: /* @__PURE__ */ jsx47(ChartTooltipContent, {}) }),
3462
+ showLegend && /* @__PURE__ */ jsx47(ChartLegend, { content: /* @__PURE__ */ jsx47(ChartLegendContent, {}) }),
3463
+ series.map((s) => /* @__PURE__ */ jsx47(
3464
+ Area,
3465
+ {
3466
+ dataKey: s.key,
3467
+ type: "monotone",
3468
+ stackId: stacked ? "a" : void 0,
3469
+ stroke: `var(--color-${s.key})`,
3470
+ fill: `var(--color-${s.key})`,
3471
+ fillOpacity: 0.2,
3472
+ strokeWidth: 2,
3473
+ isAnimationActive: false
3474
+ },
3475
+ s.key
3476
+ ))
3477
+ ] }) });
3478
+ }
3479
+
3480
+ // src/components/composed/charts/BarChart.tsx
3481
+ import { BarChart as RBarChart, Bar, XAxis as XAxis2, YAxis as YAxis2, CartesianGrid as CartesianGrid2 } from "recharts";
3482
+ import { jsx as jsx48, jsxs as jsxs17 } from "react/jsx-runtime";
3483
+ function BarChart({ data, xKey, series, height = 260, showLegend = series.length > 1 }) {
3484
+ const config = Object.fromEntries(series.map((s) => [s.key, { label: s.label, color: s.color }]));
3485
+ return /* @__PURE__ */ jsx48(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs17(RBarChart, { data, children: [
3486
+ /* @__PURE__ */ jsx48(CartesianGrid2, { vertical: false, stroke: color.input }),
3487
+ /* @__PURE__ */ jsx48(XAxis2, { dataKey: xKey, tickLine: false, axisLine: false, fontSize: 12 }),
3488
+ /* @__PURE__ */ jsx48(YAxis2, { tickLine: false, axisLine: false, fontSize: 12, width: 32 }),
3489
+ /* @__PURE__ */ jsx48(ChartTooltip, { content: /* @__PURE__ */ jsx48(ChartTooltipContent, {}) }),
3490
+ showLegend && /* @__PURE__ */ jsx48(ChartLegend, { content: /* @__PURE__ */ jsx48(ChartLegendContent, {}) }),
3491
+ series.map((s) => /* @__PURE__ */ jsx48(Bar, { dataKey: s.key, fill: `var(--color-${s.key})`, radius: 4, isAnimationActive: false }, s.key))
3492
+ ] }) });
3493
+ }
3494
+
3495
+ // src/components/composed/charts/DistributionChart.tsx
3496
+ import {
3497
+ BarChart as BarChart2,
3498
+ Bar as Bar2,
3499
+ XAxis as XAxis3,
3500
+ YAxis as YAxis3,
3501
+ CartesianGrid as CartesianGrid3
3502
+ } from "recharts";
3503
+ import { jsx as jsx49, jsxs as jsxs18 } from "react/jsx-runtime";
3504
+ var SEGMENT_COLORS = [color.accent, color.chart2, color.chart3, color.chart4, color.chart5];
3505
+ var MAX_SEGMENTS = 5;
3506
+ function DistributionChart({ groups, rowHeight = 40 }) {
3507
+ const config = {};
3508
+ for (let i = 0; i < MAX_SEGMENTS; i++) {
3509
+ config[`seg${i}`] = { label: `\u041F\u043E\u0437\u0438\u0446\u0438\u044F ${i + 1}`, color: SEGMENT_COLORS[i] };
3510
+ }
3511
+ config.rest = { label: "\u041E\u0441\u0442\u0430\u043B\u044C\u043D\u043E\u0435", color: color.muted };
3512
+ const data = groups.map((g) => {
3513
+ const row = { name: g.name, total: g.total };
3514
+ let sum = 0;
3515
+ g.segments.slice(0, MAX_SEGMENTS).forEach((seg, i) => {
3516
+ row[`seg${i}`] = seg.widthPct;
3517
+ row[`seg${i}_label`] = `${seg.label} \u2014 ${seg.count}`;
3518
+ sum += seg.widthPct;
3519
+ });
3520
+ row.rest = Math.max(0, 100 - sum);
3521
+ return row;
3522
+ });
3523
+ return /* @__PURE__ */ jsx49(ChartContainer, { config, style: { height: groups.length * rowHeight + 24 }, className: "w-full", children: /* @__PURE__ */ jsxs18(BarChart2, { data, layout: "vertical", margin: { left: 0, right: 12, top: 4, bottom: 4 }, children: [
3524
+ /* @__PURE__ */ jsx49(CartesianGrid3, { horizontal: false, stroke: color.input }),
3525
+ /* @__PURE__ */ jsx49(XAxis3, { type: "number", domain: [0, 100], hide: true }),
3526
+ /* @__PURE__ */ jsx49(YAxis3, { type: "category", dataKey: "name", tickLine: false, axisLine: false, width: 130, fontSize: 12 }),
3527
+ /* @__PURE__ */ jsx49(
3528
+ ChartTooltip,
3529
+ {
3530
+ content: /* @__PURE__ */ jsx49(
3531
+ ChartTooltipContent,
3532
+ {
3533
+ hideLabel: true,
3534
+ formatter: (_value, name, item) => {
3535
+ if (name === "rest") return null;
3536
+ const label = item?.payload?.[`${name}_label`];
3537
+ return label ?? null;
3538
+ }
3539
+ }
3540
+ )
3541
+ }
3542
+ ),
3543
+ Array.from({ length: MAX_SEGMENTS }, (_, i) => /* @__PURE__ */ jsx49(Bar2, { dataKey: `seg${i}`, stackId: "dist", fill: `var(--color-seg${i})`, isAnimationActive: false }, i)),
3544
+ /* @__PURE__ */ jsx49(Bar2, { dataKey: "rest", stackId: "dist", fill: "var(--color-rest)", isAnimationActive: false })
3545
+ ] }) });
3546
+ }
3547
+
3548
+ // src/components/composed/charts/DonutChart.tsx
3549
+ import { PieChart, Pie, Cell } from "recharts";
3550
+ import { jsx as jsx50, jsxs as jsxs19 } from "react/jsx-runtime";
3551
+ function DonutChart({ data, height = 260, showLegend = true }) {
3552
+ const config = Object.fromEntries(data.map((d) => [d.key, { label: d.label, color: d.color }]));
3553
+ return /* @__PURE__ */ jsx50(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs19(PieChart, { children: [
3554
+ /* @__PURE__ */ jsx50(ChartTooltip, { content: /* @__PURE__ */ jsx50(ChartTooltipContent, { nameKey: "key" }) }),
3555
+ showLegend && /* @__PURE__ */ jsx50(ChartLegend, { content: /* @__PURE__ */ jsx50(ChartLegendContent, { nameKey: "key" }) }),
3556
+ /* @__PURE__ */ jsx50(Pie, { data, dataKey: "value", nameKey: "key", innerRadius: "60%", outerRadius: "90%", strokeWidth: 2, isAnimationActive: false, children: data.map((d) => /* @__PURE__ */ jsx50(Cell, { fill: `var(--color-${d.key})` }, d.key)) })
3557
+ ] }) });
3558
+ }
3559
+
3560
+ // src/components/composed/charts/LineChart.tsx
3561
+ import { LineChart as RLineChart, Line, XAxis as XAxis4, YAxis as YAxis4, CartesianGrid as CartesianGrid4 } from "recharts";
3562
+ import { jsx as jsx51, jsxs as jsxs20 } from "react/jsx-runtime";
3563
+ function LineChart({ data, xKey, series, height = 260, showLegend = series.length > 1 }) {
3564
+ const config = Object.fromEntries(series.map((s) => [s.key, { label: s.label, color: s.color }]));
3565
+ return /* @__PURE__ */ jsx51(ChartContainer, { config, style: { height }, className: "w-full", children: /* @__PURE__ */ jsxs20(RLineChart, { data, children: [
3566
+ /* @__PURE__ */ jsx51(CartesianGrid4, { vertical: false, stroke: color.input }),
3567
+ /* @__PURE__ */ jsx51(XAxis4, { dataKey: xKey, tickLine: false, axisLine: false, fontSize: 12 }),
3568
+ /* @__PURE__ */ jsx51(YAxis4, { tickLine: false, axisLine: false, fontSize: 12, width: 32 }),
3569
+ /* @__PURE__ */ jsx51(ChartTooltip, { content: /* @__PURE__ */ jsx51(ChartTooltipContent, {}) }),
3570
+ showLegend && /* @__PURE__ */ jsx51(ChartLegend, { content: /* @__PURE__ */ jsx51(ChartLegendContent, {}) }),
3571
+ series.map((s) => /* @__PURE__ */ jsx51(Line, { dataKey: s.key, type: "monotone", stroke: `var(--color-${s.key})`, strokeWidth: 2, dot: false, isAnimationActive: false }, s.key))
3572
+ ] }) });
3573
+ }
3574
+
3575
+ // src/sections/AssistantDock.tsx
3576
+ import { useEffect, useRef, useState } from "react";
3577
+ import { Fragment as Fragment3, jsx as jsx52, jsxs as jsxs21 } from "react/jsx-runtime";
3578
+ var msgId = 0;
3579
+ function AssistantDock({
3580
+ title = "\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442",
3581
+ intro = "\u0421\u043F\u0440\u043E\u0441\u0438\u0442\u0435 \u0447\u0442\u043E \u0443\u0433\u043E\u0434\u043D\u043E \u0438\u043B\u0438 \u043D\u0430\u0447\u043D\u0438\u0442\u0435 \u0441 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438:",
3582
+ chips = [],
3583
+ fallbackAnswer = "\u0423\u0442\u043E\u0447\u043D\u0438\u0442\u0435 \u0432\u043E\u043F\u0440\u043E\u0441 \u2014 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043C \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435.",
3584
+ placeholder = "\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u0432\u043E\u043F\u0440\u043E\u0441\u2026"
3585
+ }) {
3586
+ const [mode, setMode] = useState("idle");
3587
+ const [messages, setMessages] = useState([]);
3588
+ const [typing, setTyping] = useState(false);
3589
+ const [value, setValue] = useState("");
3590
+ const fieldRef = useRef(null);
3591
+ const msgsRef = useRef(null);
3592
+ const close = () => {
3593
+ setMode(window.scrollY > 120 ? "orb" : "idle");
3594
+ fieldRef.current?.blur();
3595
+ document.body.style.overflow = "";
3596
+ };
3597
+ const open = () => {
3598
+ setMode("open");
3599
+ document.body.style.overflow = "hidden";
3600
+ requestAnimationFrame(() => fieldRef.current?.focus());
3601
+ };
3602
+ useEffect(() => {
3603
+ if (mode !== "open") return;
3604
+ const onKey = (e) => {
3605
+ if (e.key === "Escape") close();
3606
+ };
3607
+ document.addEventListener("keydown", onKey);
3608
+ return () => document.removeEventListener("keydown", onKey);
3609
+ }, [mode]);
3610
+ useEffect(() => {
3611
+ msgsRef.current?.scrollTo({ top: msgsRef.current.scrollHeight });
3612
+ }, [messages, typing]);
3613
+ const ask = (question, answer) => {
3614
+ setMode("open");
3615
+ document.body.style.overflow = "hidden";
3616
+ setMessages((m) => [...m, { id: ++msgId, from: "user", content: question }]);
3617
+ setTyping(true);
3618
+ setTimeout(() => {
3619
+ setTyping(false);
3620
+ setMessages((m) => [...m, { id: ++msgId, from: "bot", content: answer ?? fallbackAnswer }]);
3621
+ }, 650);
3622
+ };
3623
+ const send = () => {
3624
+ const v = value.trim();
3625
+ if (!v) {
3626
+ fieldRef.current?.focus();
3627
+ return;
3628
+ }
3629
+ ask(v, null);
3630
+ setValue("");
3631
+ fieldRef.current?.focus();
3632
+ };
3633
+ const handleBtnClick = () => {
3634
+ if (mode === "open") send();
3635
+ else open();
3636
+ };
3637
+ const handleKey = (e) => {
3638
+ if (e.key === "Enter") send();
3639
+ else if (e.key === "Escape") {
3640
+ setValue("");
3641
+ close();
3642
+ }
3643
+ };
3644
+ return /* @__PURE__ */ jsxs21("div", { className: `assistant-dock assistant-dock--${mode === "open" ? "open" : mode === "orb" ? "orb" : "idle"}`, children: [
3645
+ /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-panel", children: [
3646
+ /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-glow", "aria-hidden": "true", children: [
3647
+ /* @__PURE__ */ jsx52("span", { className: "blob blob1" }),
3648
+ /* @__PURE__ */ jsx52("span", { className: "blob blob2" }),
3649
+ /* @__PURE__ */ jsx52("span", { className: "blob blob3" })
3650
+ ] }),
3651
+ /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-inner", children: [
3652
+ /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-head", children: [
3653
+ /* @__PURE__ */ jsx52("span", { className: "assistant-dock-title", children: title }),
3654
+ /* @__PURE__ */ jsx52(
3655
+ "button",
3656
+ {
3657
+ type: "button",
3658
+ className: "assistant-dock-close",
3659
+ "aria-label": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
3660
+ onMouseDown: (e) => e.preventDefault(),
3661
+ onClick: close,
3662
+ children: /* @__PURE__ */ jsx52(Icon, { name: "close", size: 16 })
3663
+ }
3664
+ )
3665
+ ] }),
3666
+ /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-msgs", ref: msgsRef, children: [
3667
+ messages.length === 0 && /* @__PURE__ */ jsxs21(Fragment3, { children: [
3668
+ /* @__PURE__ */ jsx52("div", { className: "assistant-dock-sub", children: intro }),
3669
+ /* @__PURE__ */ jsx52("div", { className: "assistant-dock-chips", children: chips.map((c) => /* @__PURE__ */ jsx52(
3670
+ Chip,
3671
+ {
3672
+ onMouseDown: (e) => e.preventDefault(),
3673
+ onClick: () => {
3674
+ ask(c.question, c.answer);
3675
+ fieldRef.current?.focus();
3676
+ },
3677
+ children: c.question
3678
+ },
3679
+ c.question
3680
+ )) })
3681
+ ] }),
3682
+ messages.map((m) => /* @__PURE__ */ jsx52(MessageBubble, { from: m.from, children: m.content }, m.id)),
3683
+ typing && /* @__PURE__ */ jsx52(TypingIndicator, {})
3684
+ ] })
3685
+ ] })
3686
+ ] }),
3687
+ /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-input", children: [
3688
+ /* @__PURE__ */ jsx52(
3689
+ "input",
3690
+ {
3691
+ ref: fieldRef,
3692
+ className: "assistant-dock-field",
3693
+ placeholder,
3694
+ autoComplete: "off",
3695
+ value,
3696
+ onChange: (e) => setValue(e.target.value),
3697
+ onKeyDown: handleKey
3698
+ }
3699
+ ),
3700
+ /* @__PURE__ */ jsxs21("div", { className: "assistant-dock-blob", "aria-hidden": "true", children: [
3701
+ /* @__PURE__ */ jsx52("i", {}),
3702
+ /* @__PURE__ */ jsx52("i", {}),
3703
+ /* @__PURE__ */ jsx52("i", {}),
3704
+ /* @__PURE__ */ jsx52("i", {})
3705
+ ] }),
3706
+ /* @__PURE__ */ jsxs21(
3707
+ "button",
3708
+ {
3709
+ type: "button",
3710
+ className: "assistant-dock-btn",
3711
+ "aria-label": "\u0421\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430",
3712
+ onMouseDown: (e) => e.preventDefault(),
3713
+ onClick: handleBtnClick,
3714
+ children: [
3715
+ /* @__PURE__ */ jsxs21("span", { className: "assistant-dock-btn-label", children: [
3716
+ /* @__PURE__ */ jsx52(Icon, { name: "spark", size: 16 }),
3717
+ " \u0421\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430"
3718
+ ] }),
3719
+ /* @__PURE__ */ jsx52("span", { className: "assistant-dock-miniico", children: /* @__PURE__ */ jsx52(Icon, { name: "spark", size: 16 }) }),
3720
+ /* @__PURE__ */ jsx52(Icon, { name: "send", size: 22, className: "assistant-dock-send" })
3721
+ ]
3722
+ }
3723
+ )
3724
+ ] })
3725
+ ] });
3726
+ }
3727
+
3728
+ // src/sections/SidebarNav.tsx
3729
+ import { jsx as jsx53, jsxs as jsxs22 } from "react/jsx-runtime";
3730
+ var BRAND_LOGO_PATH = "M450.313 0C769.313 0 944.528 245.166 864.813 542.666C852.313 581.666 848.967 591.728 838.813 623.165L872.813 664.166C962.596 778.457 980.313 929.666 937.814 1104.77H624.813C746.313 944.666 814.313 782.166 825.313 711.666L814.313 696.165C714.974 976.165 548.411 1115.92 359.862 1115.92C151.313 1115.92 0 972.665 0 794.466C0 582.558 193.313 444.512 450.313 444.512C625.327 444.512 730.313 526.666 783.813 571.665L796.313 532.666C781.813 463.166 613.813 360.364 436.813 360.364C329.862 360.364 239.313 386.166 144.313 437.165L20 114.335C134.313 49.6655 286.313 0 450.313 0ZM543.813 547.665C425.012 547.665 349.862 633.349 349.862 720.165C349.862 791.982 413.313 872.992 493.663 872.992C605.327 872.992 712.813 785.665 764.813 639.665C704.313 582.666 621.859 547.665 543.813 547.665Z";
3731
+ var EXAMPLE_NAV_ITEMS = [
3732
+ { key: "home", label: "\u0413\u043B\u0430\u0432\u043D\u0430\u044F", icon: "home" },
3733
+ { key: "team", label: "\u041A\u043E\u043C\u0430\u043D\u0434\u0430", icon: "team" },
3734
+ { key: "orders", label: "\u0417\u0430\u043A\u0430\u0437\u044B", icon: "orders" },
3735
+ { key: "knowledge", label: "\u0417\u043D\u0430\u043D\u0438\u044F", icon: "knowledge" }
3736
+ ];
3737
+ var NI = 22;
3738
+ function SidebarNav({
3739
+ active,
3740
+ items,
3741
+ avatarInitials = "",
3742
+ avatarTitle,
3743
+ showSettings = true,
3744
+ clientLabel,
3745
+ clientInitial
3746
+ }) {
3747
+ return /* @__PURE__ */ jsxs22("aside", { className: "sidebar", children: [
3748
+ /* @__PURE__ */ jsx53("div", { className: "brand", title: "\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442", children: /* @__PURE__ */ jsx53(
3749
+ "svg",
3750
+ {
3751
+ className: "brand-logo",
3752
+ viewBox: "0 0 960 1116",
3753
+ fill: "currentColor",
3754
+ "aria-hidden": "true",
3755
+ children: /* @__PURE__ */ jsx53("path", { fillRule: "evenodd", clipRule: "evenodd", d: BRAND_LOGO_PATH })
3756
+ }
3757
+ ) }),
3758
+ clientLabel && /* @__PURE__ */ jsxs22("div", { className: "client", "aria-label": clientLabel, children: [
3759
+ /* @__PURE__ */ jsx53("span", { className: "bd", children: (clientInitial ?? clientLabel.charAt(0)).toUpperCase() }),
3760
+ /* @__PURE__ */ jsx53("span", { className: "tip", children: clientLabel })
3761
+ ] }),
3762
+ /* @__PURE__ */ jsx53("nav", { className: "nav", "aria-label": "\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F", children: items.map((item) => /* @__PURE__ */ jsxs22(
3763
+ "a",
3764
+ {
3765
+ href: "#",
3766
+ className: item.key === active ? "active" : void 0,
3767
+ "aria-label": item.label,
3768
+ "aria-current": item.key === active ? "page" : void 0,
3769
+ children: [
3770
+ /* @__PURE__ */ jsx53(Icon, { name: item.icon, size: NI }),
3771
+ /* @__PURE__ */ jsx53("span", { className: "tip", children: item.label })
3772
+ ]
3773
+ },
3774
+ item.key
3775
+ )) }),
3776
+ /* @__PURE__ */ jsxs22("div", { className: "side-foot", children: [
3777
+ /* @__PURE__ */ jsx53("span", { className: "avatar", title: avatarTitle, children: avatarInitials }),
3778
+ showSettings && /* @__PURE__ */ jsxs22("span", { className: "ico-btn", "aria-label": "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", children: [
3779
+ /* @__PURE__ */ jsx53(Icon, { name: "settings", size: NI }),
3780
+ /* @__PURE__ */ jsx53("span", { className: "tip", children: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438" })
3781
+ ] })
3782
+ ] })
3783
+ ] });
3784
+ }
3785
+ export {
3786
+ AdviceCard,
3787
+ Alert,
3788
+ AlertAction,
3789
+ AlertDescription,
3790
+ AlertTitle,
3791
+ AppShell,
3792
+ AreaChart,
3793
+ AssistantDock,
3794
+ Avatar,
3795
+ AvatarBadge,
3796
+ AvatarFallback,
3797
+ AvatarGroup,
3798
+ AvatarGroupCount,
3799
+ AvatarImage,
3800
+ Badge,
3801
+ BarChart,
3802
+ Box,
3803
+ Button,
3804
+ ButtonGroup,
3805
+ ButtonGroupSeparator,
3806
+ ButtonGroupText,
3807
+ Card,
3808
+ CardAction,
3809
+ CardContent,
3810
+ CardDescription,
3811
+ CardFooter,
3812
+ CardHeader,
3813
+ CardTitle,
3814
+ ChartContainer,
3815
+ ChartLegend,
3816
+ ChartLegendContent,
3817
+ ChartStyle,
3818
+ ChartTooltip,
3819
+ ChartTooltipContent,
3820
+ Checkbox,
3821
+ Chip,
3822
+ Container,
3823
+ Dialog,
3824
+ DialogClose,
3825
+ DialogContent,
3826
+ DialogDescription,
3827
+ DialogFooter,
3828
+ DialogHeader,
3829
+ DialogOverlay,
3830
+ DialogPortal,
3831
+ DialogTitle,
3832
+ DialogTrigger,
3833
+ DistributionChart,
3834
+ DonutChart,
3835
+ DropdownMenu,
3836
+ DropdownMenuCheckboxItem,
3837
+ DropdownMenuContent,
3838
+ DropdownMenuGroup,
3839
+ DropdownMenuItem,
3840
+ DropdownMenuLabel,
3841
+ DropdownMenuPortal,
3842
+ DropdownMenuRadioGroup,
3843
+ DropdownMenuRadioItem,
3844
+ DropdownMenuSeparator,
3845
+ DropdownMenuShortcut,
3846
+ DropdownMenuSub,
3847
+ DropdownMenuSubContent,
3848
+ DropdownMenuSubTrigger,
3849
+ DropdownMenuTrigger,
3850
+ EXAMPLE_NAV_ITEMS,
3851
+ Empty,
3852
+ EmptyContent,
3853
+ EmptyDescription,
3854
+ EmptyHeader,
3855
+ EmptyMedia,
3856
+ EmptyTitle,
3857
+ Field,
3858
+ FieldContent,
3859
+ FieldDescription,
3860
+ FieldError,
3861
+ FieldGroup,
3862
+ FieldLabel,
3863
+ FieldLegend,
3864
+ FieldSeparator,
3865
+ FieldSet,
3866
+ FieldTitle,
3867
+ FilterSelect,
3868
+ Flex,
3869
+ FormField,
3870
+ Grid,
3871
+ ICON_NAMES,
3872
+ Icon,
3873
+ Image,
3874
+ Input,
3875
+ InputGroup,
3876
+ InputGroupAddon,
3877
+ InputGroupButton,
3878
+ InputGroupInput,
3879
+ InputGroupText,
3880
+ InputGroupTextarea,
3881
+ Item,
3882
+ ItemActions,
3883
+ ItemContent,
3884
+ ItemDescription,
3885
+ ItemFooter,
3886
+ ItemGroup,
3887
+ ItemHeader,
3888
+ ItemMedia,
3889
+ ItemSeparator,
3890
+ ItemTitle,
3891
+ Label,
3892
+ LineChart,
3893
+ MessageBubble,
3894
+ NavigationMenu,
3895
+ NavigationMenuContent,
3896
+ NavigationMenuIndicator,
3897
+ NavigationMenuItem,
3898
+ NavigationMenuLink,
3899
+ NavigationMenuList,
3900
+ NavigationMenuTrigger,
3901
+ NavigationMenuViewport,
3902
+ Pagination,
3903
+ PaginationContent,
3904
+ PaginationEllipsis,
3905
+ PaginationItem,
3906
+ PaginationLink,
3907
+ PaginationNext,
3908
+ PaginationPrevious,
3909
+ Progress,
3910
+ RadioGroup,
3911
+ RadioGroupItem,
3912
+ SURFACE_VARIANTS,
3913
+ Search,
3914
+ Select,
3915
+ SelectContent,
3916
+ SelectGroup,
3917
+ SelectItem,
3918
+ SelectLabel,
3919
+ SelectScrollDownButton,
3920
+ SelectScrollUpButton,
3921
+ SelectSeparator,
3922
+ SelectTrigger,
3923
+ SelectValue,
3924
+ Separator,
3925
+ SidebarNav,
3926
+ Spinner,
3927
+ Stack,
3928
+ Surface,
3929
+ Switch,
3930
+ Table,
3931
+ TableBody,
3932
+ TableCaption,
3933
+ TableCell,
3934
+ TableFooter,
3935
+ TableHead,
3936
+ TableHeader,
3937
+ TableRow,
3938
+ Tabs,
3939
+ TabsContent,
3940
+ TabsList,
3941
+ TabsTrigger,
3942
+ Text,
3943
+ Textarea,
3944
+ TitledRow,
3945
+ Toaster,
3946
+ Toggle,
3947
+ ToggleGroup,
3948
+ ToggleGroupItem,
3949
+ Toolbar,
3950
+ ToolbarButton,
3951
+ ToolbarGroup,
3952
+ ToolbarSeparator,
3953
+ ToolbarToggleGroup,
3954
+ ToolbarToggleItem,
3955
+ Tooltip2 as Tooltip,
3956
+ TooltipContent,
3957
+ TooltipProvider,
3958
+ TooltipTrigger,
3959
+ TypingIndicator,
3960
+ badgeVariants,
3961
+ buttonGroupVariants,
3962
+ buttonVariants,
3963
+ chartKeys,
3964
+ cn,
3965
+ color,
3966
+ font,
3967
+ navigationMenuTriggerStyle,
3968
+ radius,
3969
+ semanticRoles,
3970
+ spacing,
3971
+ tabsListVariants,
3972
+ toggleVariants,
3973
+ type
3974
+ };
3975
+ //# sourceMappingURL=index.js.map