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/AGENTS.md +46 -0
- package/LICENSE +21 -0
- package/README.md +30 -0
- package/context/COMPONENTS.md +90 -0
- package/context/DESIGN.md +242 -0
- package/dist/index.d.ts +834 -0
- package/dist/index.js +3975 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +2 -0
- package/package.json +85 -0
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
|