@cortexasystem/ui 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1326 -643
- package/dist/index.d.cts +171 -13
- package/dist/index.d.ts +171 -13
- package/dist/index.js +1307 -646
- package/package.json +2 -2
- package/src/styles.css +1 -1
package/dist/index.cjs
CHANGED
|
@@ -30,6 +30,23 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
|
+
AiChatAssistantMessage: () => AiChatAssistantMessage,
|
|
34
|
+
AiChatComposer: () => AiChatComposer,
|
|
35
|
+
AiChatEmptyState: () => AiChatEmptyState,
|
|
36
|
+
AiChatFloatingButton: () => AiChatFloatingButton,
|
|
37
|
+
AiChatFloatingSidebar: () => AiChatFloatingSidebar,
|
|
38
|
+
AiChatHeader: () => AiChatHeader,
|
|
39
|
+
AiChatLayout: () => AiChatLayout,
|
|
40
|
+
AiChatMessage: () => AiChatMessage,
|
|
41
|
+
AiChatMessageList: () => AiChatMessageList,
|
|
42
|
+
AiChatPanel: () => AiChatPanel,
|
|
43
|
+
AiChatSidebar: () => AiChatSidebar,
|
|
44
|
+
AiChatSidebarHeader: () => AiChatSidebarHeader,
|
|
45
|
+
AiChatSummaryAction: () => AiChatSummaryAction,
|
|
46
|
+
AiChatSummaryActions: () => AiChatSummaryActions,
|
|
47
|
+
AiChatThreadButton: () => AiChatThreadButton,
|
|
48
|
+
AiChatThreadList: () => AiChatThreadList,
|
|
49
|
+
AiChatUserMessage: () => AiChatUserMessage,
|
|
33
50
|
Alert: () => Alert,
|
|
34
51
|
AlertDescription: () => AlertDescription,
|
|
35
52
|
AlertTitle: () => AlertTitle,
|
|
@@ -94,14 +111,17 @@ __export(index_exports, {
|
|
|
94
111
|
DropdownMenuSubContent: () => DropdownMenuSubContent,
|
|
95
112
|
DropdownMenuSubTrigger: () => DropdownMenuSubTrigger,
|
|
96
113
|
DropdownMenuTrigger: () => DropdownMenuTrigger,
|
|
114
|
+
EmptyState: () => EmptyState,
|
|
97
115
|
FeatureIcon: () => FeatureIcon,
|
|
98
116
|
FormSection: () => FormSection,
|
|
117
|
+
HeaderUserMenu: () => HeaderUserMenu,
|
|
99
118
|
Input: () => Input,
|
|
100
119
|
Label: () => Label3,
|
|
101
120
|
LoadingCard: () => LoadingCard,
|
|
102
121
|
LoadingState: () => LoadingState,
|
|
103
122
|
LoadingTableRows: () => LoadingTableRows,
|
|
104
123
|
ModuleIconButton: () => ModuleIconButton,
|
|
124
|
+
ModuleSkeleton: () => ModuleSkeleton,
|
|
105
125
|
Navbar: () => Navbar,
|
|
106
126
|
NotificationAction: () => NotificationAction,
|
|
107
127
|
NotificationMessage: () => NotificationMessage,
|
|
@@ -141,6 +161,8 @@ __export(index_exports, {
|
|
|
141
161
|
Steps: () => Steps,
|
|
142
162
|
Switch: () => Switch,
|
|
143
163
|
SwitchField: () => SwitchField,
|
|
164
|
+
SyncStatusBadge: () => SyncStatusBadge,
|
|
165
|
+
SyncStatusBar: () => SyncStatusBar,
|
|
144
166
|
Table: () => Table,
|
|
145
167
|
TableBody: () => TableBody,
|
|
146
168
|
TableCaption: () => TableCaption,
|
|
@@ -227,6 +249,505 @@ function cn(...inputs) {
|
|
|
227
249
|
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
228
250
|
}
|
|
229
251
|
|
|
252
|
+
// src/components/ai/ai-chat.tsx
|
|
253
|
+
var React4 = __toESM(require("react"), 1);
|
|
254
|
+
var import_lucide_react2 = require("lucide-react");
|
|
255
|
+
|
|
256
|
+
// src/components/overlays/sheet.tsx
|
|
257
|
+
var React = __toESM(require("react"), 1);
|
|
258
|
+
var SheetPrimitive = __toESM(require("@radix-ui/react-dialog"), 1);
|
|
259
|
+
var import_class_variance_authority = require("class-variance-authority");
|
|
260
|
+
var import_lucide_react = require("lucide-react");
|
|
261
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
262
|
+
var Sheet = SheetPrimitive.Root;
|
|
263
|
+
var SheetTrigger = SheetPrimitive.Trigger;
|
|
264
|
+
var SheetClose = SheetPrimitive.Close;
|
|
265
|
+
var SheetPortal = SheetPrimitive.Portal;
|
|
266
|
+
var SheetOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
267
|
+
SheetPrimitive.Overlay,
|
|
268
|
+
{
|
|
269
|
+
className: cn(
|
|
270
|
+
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
271
|
+
className
|
|
272
|
+
),
|
|
273
|
+
...props,
|
|
274
|
+
ref
|
|
275
|
+
}
|
|
276
|
+
));
|
|
277
|
+
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
|
|
278
|
+
var sheetVariants = (0, import_class_variance_authority.cva)(
|
|
279
|
+
"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
|
|
280
|
+
{
|
|
281
|
+
variants: {
|
|
282
|
+
side: {
|
|
283
|
+
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
284
|
+
bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
285
|
+
left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
|
|
286
|
+
right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
defaultVariants: {
|
|
290
|
+
side: "right"
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
var SheetContent = React.forwardRef(
|
|
295
|
+
({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(SheetPortal, { children: [
|
|
296
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SheetOverlay, {}),
|
|
297
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(SheetPrimitive.Content, { ref, className: cn(sheetVariants({ side }), className), ...props, children: [
|
|
298
|
+
children,
|
|
299
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(SheetPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
|
|
300
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react.X, { className: "h-4 w-4" }),
|
|
301
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "sr-only", children: "Close" })
|
|
302
|
+
] })
|
|
303
|
+
] })
|
|
304
|
+
] })
|
|
305
|
+
);
|
|
306
|
+
SheetContent.displayName = SheetPrimitive.Content.displayName;
|
|
307
|
+
var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: cn("flex flex-col space-y-2 text-center sm:text-left", className), ...props });
|
|
308
|
+
SheetHeader.displayName = "SheetHeader";
|
|
309
|
+
var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props });
|
|
310
|
+
SheetFooter.displayName = "SheetFooter";
|
|
311
|
+
var SheetTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SheetPrimitive.Title, { ref, className: cn("text-lg font-semibold text-foreground", className), ...props }));
|
|
312
|
+
SheetTitle.displayName = SheetPrimitive.Title.displayName;
|
|
313
|
+
var SheetDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SheetPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
314
|
+
SheetDescription.displayName = SheetPrimitive.Description.displayName;
|
|
315
|
+
|
|
316
|
+
// src/components/primitives/badge.tsx
|
|
317
|
+
var import_class_variance_authority2 = require("class-variance-authority");
|
|
318
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
319
|
+
var badgeVariants = (0, import_class_variance_authority2.cva)("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", {
|
|
320
|
+
variants: {
|
|
321
|
+
variant: {
|
|
322
|
+
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
|
323
|
+
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
324
|
+
destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
|
|
325
|
+
outline: "text-foreground"
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
defaultVariants: {
|
|
329
|
+
variant: "default"
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
function Badge({ className, variant, ...props }) {
|
|
333
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: cn(badgeVariants({ variant }), className), ...props });
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// src/components/primitives/button.tsx
|
|
337
|
+
var React2 = __toESM(require("react"), 1);
|
|
338
|
+
var import_react_slot = require("@radix-ui/react-slot");
|
|
339
|
+
var import_class_variance_authority3 = require("class-variance-authority");
|
|
340
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
341
|
+
var buttonVariants = (0, import_class_variance_authority3.cva)(
|
|
342
|
+
"inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium shadow-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
343
|
+
{
|
|
344
|
+
variants: {
|
|
345
|
+
variant: {
|
|
346
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
347
|
+
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
348
|
+
outline: "border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground",
|
|
349
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
350
|
+
ghost: "text-foreground shadow-none hover:bg-accent hover:text-accent-foreground",
|
|
351
|
+
link: "h-auto px-0 py-0 text-primary underline-offset-4 shadow-none hover:underline"
|
|
352
|
+
},
|
|
353
|
+
size: {
|
|
354
|
+
default: "h-10 px-4 py-2",
|
|
355
|
+
sm: "h-9 rounded-md px-3",
|
|
356
|
+
lg: "h-11 rounded-md px-8",
|
|
357
|
+
icon: "h-10 w-10"
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
defaultVariants: {
|
|
361
|
+
variant: "default",
|
|
362
|
+
size: "default"
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
);
|
|
366
|
+
var Button = React2.forwardRef(
|
|
367
|
+
({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
368
|
+
const Comp = asChild ? import_react_slot.Slot : "button";
|
|
369
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Comp, { className: cn(buttonVariants({ variant, size, className })), ref, ...props });
|
|
370
|
+
}
|
|
371
|
+
);
|
|
372
|
+
Button.displayName = "Button";
|
|
373
|
+
|
|
374
|
+
// src/components/primitives/textarea.tsx
|
|
375
|
+
var React3 = __toESM(require("react"), 1);
|
|
376
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
377
|
+
var Textarea = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
378
|
+
"textarea",
|
|
379
|
+
{
|
|
380
|
+
ref,
|
|
381
|
+
className: cn(
|
|
382
|
+
"flex min-h-24 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
|
|
383
|
+
className
|
|
384
|
+
),
|
|
385
|
+
...props
|
|
386
|
+
}
|
|
387
|
+
));
|
|
388
|
+
Textarea.displayName = "Textarea";
|
|
389
|
+
|
|
390
|
+
// src/components/ai/ai-chat.tsx
|
|
391
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
392
|
+
function AiChatLayout({ className, variant = "screen", ...props }) {
|
|
393
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
394
|
+
"section",
|
|
395
|
+
{
|
|
396
|
+
className: cn(
|
|
397
|
+
"overflow-hidden rounded-2xl border bg-card text-card-foreground shadow-sm",
|
|
398
|
+
variant === "screen" ? "grid min-h-[720px] w-full lg:grid-cols-[320px_minmax(0,1fr)]" : "flex h-full min-h-0 w-full flex-col",
|
|
399
|
+
className
|
|
400
|
+
),
|
|
401
|
+
...props
|
|
402
|
+
}
|
|
403
|
+
);
|
|
404
|
+
}
|
|
405
|
+
var AiChatSidebar = React4.forwardRef(
|
|
406
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
407
|
+
"aside",
|
|
408
|
+
{
|
|
409
|
+
ref,
|
|
410
|
+
className: cn(
|
|
411
|
+
"flex min-h-0 flex-col border-b bg-muted/20 lg:border-b-0 lg:border-r",
|
|
412
|
+
className
|
|
413
|
+
),
|
|
414
|
+
...props
|
|
415
|
+
}
|
|
416
|
+
)
|
|
417
|
+
);
|
|
418
|
+
AiChatSidebar.displayName = "AiChatSidebar";
|
|
419
|
+
function AiChatSidebarHeader({ className, title, description, action, ...props }) {
|
|
420
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: cn("border-b px-4 py-4", className), ...props, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
|
|
421
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid gap-1", children: [
|
|
422
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm font-semibold text-foreground", children: title }),
|
|
423
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
424
|
+
] }),
|
|
425
|
+
action ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "shrink-0", children: action }) : null
|
|
426
|
+
] }) });
|
|
427
|
+
}
|
|
428
|
+
var AiChatThreadList = React4.forwardRef(
|
|
429
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { ref, className: cn("flex-1 space-y-2 overflow-y-auto p-3", className), ...props })
|
|
430
|
+
);
|
|
431
|
+
AiChatThreadList.displayName = "AiChatThreadList";
|
|
432
|
+
var AiChatThreadButton = React4.forwardRef(
|
|
433
|
+
({
|
|
434
|
+
className,
|
|
435
|
+
title,
|
|
436
|
+
preview,
|
|
437
|
+
timestamp,
|
|
438
|
+
active = false,
|
|
439
|
+
unreadCount,
|
|
440
|
+
icon: Icon2 = import_lucide_react2.MessageSquareText,
|
|
441
|
+
type = "button",
|
|
442
|
+
...props
|
|
443
|
+
}, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
444
|
+
"button",
|
|
445
|
+
{
|
|
446
|
+
ref,
|
|
447
|
+
type,
|
|
448
|
+
className: cn(
|
|
449
|
+
"flex w-full items-start gap-3 rounded-xl border px-3 py-3 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
450
|
+
active ? "border-[var(--color-accent-blue)]/40 bg-[var(--color-accent-blue)]/8" : "border-transparent bg-transparent hover:border-border hover:bg-accent/40",
|
|
451
|
+
className
|
|
452
|
+
),
|
|
453
|
+
...props,
|
|
454
|
+
children: [
|
|
455
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
456
|
+
"span",
|
|
457
|
+
{
|
|
458
|
+
className: cn(
|
|
459
|
+
"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border",
|
|
460
|
+
active ? "border-[var(--color-accent-blue)]/30 bg-[var(--color-accent-blue)]/12 text-[var(--color-accent-blue)]" : "border-border bg-background text-muted-foreground"
|
|
461
|
+
),
|
|
462
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Icon2, { className: "h-4 w-4" })
|
|
463
|
+
}
|
|
464
|
+
),
|
|
465
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "grid min-w-0 flex-1 gap-1", children: [
|
|
466
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "flex items-start justify-between gap-3", children: [
|
|
467
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "truncate text-sm font-medium text-foreground", children: title }),
|
|
468
|
+
timestamp ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "inline-flex shrink-0 items-center gap-1 text-[11px] text-muted-foreground", children: [
|
|
469
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.Clock3, { className: "h-3 w-3" }),
|
|
470
|
+
timestamp
|
|
471
|
+
] }) : null
|
|
472
|
+
] }),
|
|
473
|
+
preview ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "line-clamp-2 text-xs text-muted-foreground", children: preview }) : null
|
|
474
|
+
] }),
|
|
475
|
+
typeof unreadCount === "number" && unreadCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Badge, { className: "shrink-0 rounded-full px-2 py-0.5 text-[11px]", children: unreadCount > 9 ? "9+" : unreadCount }) : null
|
|
476
|
+
]
|
|
477
|
+
}
|
|
478
|
+
)
|
|
479
|
+
);
|
|
480
|
+
AiChatThreadButton.displayName = "AiChatThreadButton";
|
|
481
|
+
var AiChatPanel = React4.forwardRef(
|
|
482
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { ref, className: cn("flex min-h-0 flex-1 flex-col bg-background/40", className), ...props })
|
|
483
|
+
);
|
|
484
|
+
AiChatPanel.displayName = "AiChatPanel";
|
|
485
|
+
function AiChatHeader({ className, title, description, meta, actions, ...props }) {
|
|
486
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("header", { className: cn("border-b bg-card/95 px-5 py-4 backdrop-blur", className), ...props, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [
|
|
487
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid gap-1", children: [
|
|
488
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
489
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-base font-semibold text-foreground", children: title }),
|
|
490
|
+
meta ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: meta }) : null
|
|
491
|
+
] }),
|
|
492
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-muted-foreground", children: description }) : null
|
|
493
|
+
] }),
|
|
494
|
+
actions ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex flex-wrap items-center gap-2", children: actions }) : null
|
|
495
|
+
] }) });
|
|
496
|
+
}
|
|
497
|
+
var AiChatMessageList = React4.forwardRef(
|
|
498
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
499
|
+
"div",
|
|
500
|
+
{
|
|
501
|
+
ref,
|
|
502
|
+
role: "log",
|
|
503
|
+
"aria-live": "polite",
|
|
504
|
+
className: cn("flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto px-5 py-5", className),
|
|
505
|
+
...props
|
|
506
|
+
}
|
|
507
|
+
)
|
|
508
|
+
);
|
|
509
|
+
AiChatMessageList.displayName = "AiChatMessageList";
|
|
510
|
+
function getDefaultAvatar(role) {
|
|
511
|
+
if (role === "assistant") {
|
|
512
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "flex h-9 w-9 items-center justify-center rounded-full bg-[var(--color-brand)] text-white shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.Bot, { className: "h-4 w-4" }) });
|
|
513
|
+
}
|
|
514
|
+
if (role === "system") {
|
|
515
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "flex h-9 w-9 items-center justify-center rounded-full bg-secondary text-secondary-foreground shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.Sparkles, { className: "h-4 w-4" }) });
|
|
516
|
+
}
|
|
517
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "flex h-9 w-9 items-center justify-center rounded-full bg-foreground text-background shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-xs font-semibold", children: "TU" }) });
|
|
518
|
+
}
|
|
519
|
+
function AiChatMessage({
|
|
520
|
+
className,
|
|
521
|
+
role = "assistant",
|
|
522
|
+
author,
|
|
523
|
+
timestamp,
|
|
524
|
+
status = "complete",
|
|
525
|
+
avatar,
|
|
526
|
+
actions,
|
|
527
|
+
sources,
|
|
528
|
+
children,
|
|
529
|
+
...props
|
|
530
|
+
}) {
|
|
531
|
+
const isUser = role === "user";
|
|
532
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
533
|
+
"article",
|
|
534
|
+
{
|
|
535
|
+
className: cn("flex gap-3", isUser ? "justify-end" : "justify-start", className),
|
|
536
|
+
...props,
|
|
537
|
+
children: [
|
|
538
|
+
!isUser ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "shrink-0", children: avatar ?? getDefaultAvatar(role) }) : null,
|
|
539
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: cn("grid max-w-[90%] gap-2 md:max-w-[74%]", isUser && "justify-items-end"), children: [
|
|
540
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: cn("flex items-center gap-2", isUser && "justify-end"), children: [
|
|
541
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-xs font-medium text-foreground", children: author ?? (isUser ? "Tu" : "Cortexa AI") }),
|
|
542
|
+
timestamp ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-xs text-muted-foreground", children: timestamp }) : null,
|
|
543
|
+
status !== "complete" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Badge, { variant: status === "error" ? "destructive" : "secondary", children: status === "streaming" ? "Generando" : "Error" }) : null
|
|
544
|
+
] }),
|
|
545
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
546
|
+
"div",
|
|
547
|
+
{
|
|
548
|
+
className: cn(
|
|
549
|
+
"rounded-2xl border px-4 py-3 text-sm leading-6 shadow-sm",
|
|
550
|
+
isUser ? "border-primary bg-primary text-primary-foreground" : role === "system" ? "border-secondary bg-secondary text-secondary-foreground" : "bg-card text-foreground"
|
|
551
|
+
),
|
|
552
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "whitespace-pre-wrap", children })
|
|
553
|
+
}
|
|
554
|
+
),
|
|
555
|
+
sources?.length ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: cn("flex flex-wrap gap-2", isUser && "justify-end"), children: sources.map(
|
|
556
|
+
(source) => source.href ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
557
|
+
"a",
|
|
558
|
+
{
|
|
559
|
+
href: source.href,
|
|
560
|
+
className: "inline-flex items-center gap-1 rounded-full border px-2.5 py-1 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
561
|
+
children: [
|
|
562
|
+
source.label,
|
|
563
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.PanelRightOpen, { className: "h-3 w-3" })
|
|
564
|
+
]
|
|
565
|
+
},
|
|
566
|
+
`${source.label}-${source.href}`
|
|
567
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
568
|
+
"span",
|
|
569
|
+
{
|
|
570
|
+
className: "inline-flex items-center rounded-full border px-2.5 py-1 text-xs text-muted-foreground",
|
|
571
|
+
children: source.label
|
|
572
|
+
},
|
|
573
|
+
source.label
|
|
574
|
+
)
|
|
575
|
+
) }) : null,
|
|
576
|
+
actions ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: cn("flex flex-wrap gap-2", isUser && "justify-end"), children: actions }) : null
|
|
577
|
+
] }),
|
|
578
|
+
isUser ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "shrink-0", children: avatar ?? getDefaultAvatar(role) }) : null
|
|
579
|
+
]
|
|
580
|
+
}
|
|
581
|
+
);
|
|
582
|
+
}
|
|
583
|
+
function AiChatAssistantMessage(props) {
|
|
584
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AiChatMessage, { role: "assistant", ...props });
|
|
585
|
+
}
|
|
586
|
+
function AiChatUserMessage(props) {
|
|
587
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AiChatMessage, { role: "user", ...props });
|
|
588
|
+
}
|
|
589
|
+
function AiChatSummaryActions({
|
|
590
|
+
className,
|
|
591
|
+
title = "Quick actions",
|
|
592
|
+
description,
|
|
593
|
+
actionsClassName,
|
|
594
|
+
children,
|
|
595
|
+
...props
|
|
596
|
+
}) {
|
|
597
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: cn("grid gap-3 rounded-2xl border bg-card p-4 shadow-sm", className), ...props, children: [
|
|
598
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid gap-1", children: [
|
|
599
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm font-semibold text-foreground", children: title }),
|
|
600
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
601
|
+
] }),
|
|
602
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: cn("grid gap-3 md:grid-cols-3", actionsClassName), children })
|
|
603
|
+
] });
|
|
604
|
+
}
|
|
605
|
+
var AiChatSummaryAction = React4.forwardRef(
|
|
606
|
+
({
|
|
607
|
+
className,
|
|
608
|
+
title,
|
|
609
|
+
description,
|
|
610
|
+
icon: Icon2 = import_lucide_react2.Sparkles,
|
|
611
|
+
active = false,
|
|
612
|
+
badge,
|
|
613
|
+
type = "button",
|
|
614
|
+
...props
|
|
615
|
+
}, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
616
|
+
"button",
|
|
617
|
+
{
|
|
618
|
+
ref,
|
|
619
|
+
type,
|
|
620
|
+
className: cn(
|
|
621
|
+
"flex w-full items-start gap-3 rounded-xl border px-4 py-4 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
622
|
+
active ? "border-[var(--color-accent-blue)]/40 bg-[var(--color-accent-blue)]/10" : "hover:border-border hover:bg-accent/40",
|
|
623
|
+
className
|
|
624
|
+
),
|
|
625
|
+
...props,
|
|
626
|
+
children: [
|
|
627
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mt-0.5 flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-[var(--color-brand)]/10 text-[var(--color-brand)]", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Icon2, { className: "h-5 w-5" }) }),
|
|
628
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "grid flex-1 gap-1", children: [
|
|
629
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "flex flex-wrap items-center gap-2", children: [
|
|
630
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-sm font-medium text-foreground", children: title }),
|
|
631
|
+
badge ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Badge, { variant: "secondary", children: badge }) : null
|
|
632
|
+
] }),
|
|
633
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-xs leading-5 text-muted-foreground", children: description }) : null
|
|
634
|
+
] })
|
|
635
|
+
]
|
|
636
|
+
}
|
|
637
|
+
)
|
|
638
|
+
);
|
|
639
|
+
AiChatSummaryAction.displayName = "AiChatSummaryAction";
|
|
640
|
+
function AiChatComposer({
|
|
641
|
+
className,
|
|
642
|
+
textareaProps,
|
|
643
|
+
onSubmit,
|
|
644
|
+
submitLabel = "Send",
|
|
645
|
+
submitIcon = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.Send, { className: "h-4 w-4" }),
|
|
646
|
+
leadingActions,
|
|
647
|
+
trailingActions,
|
|
648
|
+
helperText,
|
|
649
|
+
disabled = false,
|
|
650
|
+
...props
|
|
651
|
+
}) {
|
|
652
|
+
const { className: textareaClassName, placeholder, disabled: textareaDisabled, ...restTextareaProps } = textareaProps ?? {};
|
|
653
|
+
const isDisabled = disabled || Boolean(textareaDisabled);
|
|
654
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("form", { className: cn("border-t bg-card px-4 py-4", className), onSubmit, ...props, children: [
|
|
655
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "rounded-2xl border bg-background p-3 shadow-sm", children: [
|
|
656
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
657
|
+
Textarea,
|
|
658
|
+
{
|
|
659
|
+
className: cn(
|
|
660
|
+
"min-h-24 resize-none border-0 bg-transparent p-0 text-sm shadow-none focus-visible:ring-0",
|
|
661
|
+
textareaClassName
|
|
662
|
+
),
|
|
663
|
+
placeholder: placeholder ?? "Describe what you need from the assistant...",
|
|
664
|
+
disabled: isDisabled,
|
|
665
|
+
...restTextareaProps
|
|
666
|
+
}
|
|
667
|
+
),
|
|
668
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mt-3 flex flex-wrap items-center justify-between gap-3", children: [
|
|
669
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex flex-wrap items-center gap-2", children: leadingActions }),
|
|
670
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
671
|
+
trailingActions,
|
|
672
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(Button, { type: "submit", disabled: isDisabled, children: [
|
|
673
|
+
submitIcon,
|
|
674
|
+
submitLabel
|
|
675
|
+
] })
|
|
676
|
+
] })
|
|
677
|
+
] })
|
|
678
|
+
] }),
|
|
679
|
+
helperText ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-2 text-xs text-muted-foreground", children: helperText }) : null
|
|
680
|
+
] });
|
|
681
|
+
}
|
|
682
|
+
function AiChatEmptyState({
|
|
683
|
+
className,
|
|
684
|
+
title,
|
|
685
|
+
description,
|
|
686
|
+
prompts,
|
|
687
|
+
onPromptSelect,
|
|
688
|
+
...props
|
|
689
|
+
}) {
|
|
690
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
691
|
+
"div",
|
|
692
|
+
{
|
|
693
|
+
className: cn(
|
|
694
|
+
"flex flex-1 flex-col items-center justify-center gap-5 rounded-2xl border border-dashed bg-card/70 px-6 py-10 text-center",
|
|
695
|
+
className
|
|
696
|
+
),
|
|
697
|
+
...props,
|
|
698
|
+
children: [
|
|
699
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "flex h-14 w-14 items-center justify-center rounded-2xl bg-[var(--color-brand)]/10 text-[var(--color-brand)]", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.Sparkles, { className: "h-6 w-6" }) }),
|
|
700
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid max-w-xl gap-2", children: [
|
|
701
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-lg font-semibold text-foreground", children: title }),
|
|
702
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm leading-6 text-muted-foreground", children: description })
|
|
703
|
+
] }),
|
|
704
|
+
prompts?.length ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex max-w-2xl flex-wrap items-center justify-center gap-2", children: prompts.map((prompt) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onPromptSelect?.(prompt), children: prompt }, prompt)) }) : null
|
|
705
|
+
]
|
|
706
|
+
}
|
|
707
|
+
);
|
|
708
|
+
}
|
|
709
|
+
function AiChatFloatingButton({
|
|
710
|
+
className,
|
|
711
|
+
label = "Asistente IA",
|
|
712
|
+
unreadCount,
|
|
713
|
+
icon: Icon2 = import_lucide_react2.Sparkles,
|
|
714
|
+
variant = "default",
|
|
715
|
+
size = "lg",
|
|
716
|
+
children,
|
|
717
|
+
...props
|
|
718
|
+
}) {
|
|
719
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
720
|
+
Button,
|
|
721
|
+
{
|
|
722
|
+
variant,
|
|
723
|
+
size,
|
|
724
|
+
className: cn("fixed bottom-6 right-6 h-14 rounded-full px-5 shadow-lg", className),
|
|
725
|
+
...props,
|
|
726
|
+
children: [
|
|
727
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Icon2, { className: "h-4 w-4" }),
|
|
728
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: children ?? label }),
|
|
729
|
+
typeof unreadCount === "number" && unreadCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "rounded-full bg-white/15 px-2 py-0.5 text-xs font-semibold text-inherit", children: unreadCount > 9 ? "9+" : unreadCount }) : null
|
|
730
|
+
]
|
|
731
|
+
}
|
|
732
|
+
);
|
|
733
|
+
}
|
|
734
|
+
function AiChatFloatingSidebar({
|
|
735
|
+
children,
|
|
736
|
+
trigger,
|
|
737
|
+
side = "right",
|
|
738
|
+
open,
|
|
739
|
+
defaultOpen,
|
|
740
|
+
onOpenChange,
|
|
741
|
+
contentClassName,
|
|
742
|
+
triggerAsChild = true
|
|
743
|
+
}) {
|
|
744
|
+
const resolvedTrigger = trigger ?? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AiChatFloatingButton, {});
|
|
745
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(Sheet, { open, defaultOpen, onOpenChange, children: [
|
|
746
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SheetTrigger, { asChild: triggerAsChild, children: resolvedTrigger }),
|
|
747
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SheetContent, { side, className: cn("w-full p-0 sm:max-w-[460px]", contentClassName), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AiChatLayout, { variant: "sidebar", className: "h-full rounded-none border-0 shadow-none", children }) })
|
|
748
|
+
] });
|
|
749
|
+
}
|
|
750
|
+
|
|
230
751
|
// src/assets/isotipo-cortexa-dark.png
|
|
231
752
|
var isotipo_cortexa_dark_default = "./isotipo-cortexa-dark-F2MDSEEV.png";
|
|
232
753
|
|
|
@@ -234,7 +755,7 @@ var isotipo_cortexa_dark_default = "./isotipo-cortexa-dark-F2MDSEEV.png";
|
|
|
234
755
|
var isotipo_cortexa_light_default = "./isotipo-cortexa-light-LV3O6ASR.png";
|
|
235
756
|
|
|
236
757
|
// src/components/branding/brand-logo.tsx
|
|
237
|
-
var
|
|
758
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
238
759
|
var sizeMap = {
|
|
239
760
|
sm: { icon: "h-6 w-6", text: "text-sm", gap: "gap-2" },
|
|
240
761
|
md: { icon: "h-7 w-7", text: "text-lg", gap: "gap-3" },
|
|
@@ -244,8 +765,8 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
244
765
|
const { resolvedTheme } = useTheme();
|
|
245
766
|
const isDark = resolvedTheme === "dark";
|
|
246
767
|
const s = sizeMap[size];
|
|
247
|
-
const content = /* @__PURE__ */ (0,
|
|
248
|
-
/* @__PURE__ */ (0,
|
|
768
|
+
const content = /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
|
|
769
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
249
770
|
"div",
|
|
250
771
|
{
|
|
251
772
|
className: cn(
|
|
@@ -253,7 +774,7 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
253
774
|
s.icon,
|
|
254
775
|
isDark ? "bg-[var(--color-brand)] p-1" : "bg-transparent"
|
|
255
776
|
),
|
|
256
|
-
children: /* @__PURE__ */ (0,
|
|
777
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
257
778
|
"img",
|
|
258
779
|
{
|
|
259
780
|
src: isDark ? isotipo_cortexa_dark_default : isotipo_cortexa_light_default,
|
|
@@ -263,8 +784,8 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
263
784
|
)
|
|
264
785
|
}
|
|
265
786
|
),
|
|
266
|
-
/* @__PURE__ */ (0,
|
|
267
|
-
/* @__PURE__ */ (0,
|
|
787
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-baseline", children: [
|
|
788
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
268
789
|
"span",
|
|
269
790
|
{
|
|
270
791
|
className: cn(
|
|
@@ -275,7 +796,7 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
275
796
|
children: "Cortexa"
|
|
276
797
|
}
|
|
277
798
|
),
|
|
278
|
-
/* @__PURE__ */ (0,
|
|
799
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
279
800
|
"span",
|
|
280
801
|
{
|
|
281
802
|
className: cn(
|
|
@@ -290,13 +811,13 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
290
811
|
] });
|
|
291
812
|
const wrapperClass = cn("flex items-center", s.gap, className);
|
|
292
813
|
if (href) {
|
|
293
|
-
return /* @__PURE__ */ (0,
|
|
814
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("a", { href, className: wrapperClass, "aria-label": "Cortexa Fiscal \u2014 Inicio", children: content });
|
|
294
815
|
}
|
|
295
|
-
return /* @__PURE__ */ (0,
|
|
816
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: wrapperClass, "aria-label": "Cortexa Fiscal", children: content });
|
|
296
817
|
}
|
|
297
818
|
|
|
298
819
|
// src/components/data-display/icons.tsx
|
|
299
|
-
var
|
|
820
|
+
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
300
821
|
var toneStyles = {
|
|
301
822
|
brand: "bg-[var(--color-brand)]/10 text-[var(--color-brand)]",
|
|
302
823
|
info: "bg-[var(--color-info-bg)] text-[var(--color-accent-blue)]",
|
|
@@ -312,7 +833,7 @@ var sizeStyles = {
|
|
|
312
833
|
};
|
|
313
834
|
function FeatureIcon({ className, icon: Icon2, tone = "brand", size = "md", iconClassName }) {
|
|
314
835
|
const classes = sizeStyles[size];
|
|
315
|
-
return /* @__PURE__ */ (0,
|
|
836
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: cn("inline-flex items-center justify-center", classes.wrapper, toneStyles[tone], className), children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Icon2, { className: cn(classes.icon, iconClassName) }) });
|
|
316
837
|
}
|
|
317
838
|
function ModuleIconButton({
|
|
318
839
|
className,
|
|
@@ -323,7 +844,7 @@ function ModuleIconButton({
|
|
|
323
844
|
tone = "brand",
|
|
324
845
|
...props
|
|
325
846
|
}) {
|
|
326
|
-
return /* @__PURE__ */ (0,
|
|
847
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
|
|
327
848
|
"button",
|
|
328
849
|
{
|
|
329
850
|
type,
|
|
@@ -333,7 +854,7 @@ function ModuleIconButton({
|
|
|
333
854
|
),
|
|
334
855
|
...props,
|
|
335
856
|
children: [
|
|
336
|
-
/* @__PURE__ */ (0,
|
|
857
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
337
858
|
FeatureIcon,
|
|
338
859
|
{
|
|
339
860
|
icon,
|
|
@@ -342,9 +863,9 @@ function ModuleIconButton({
|
|
|
342
863
|
className: "transition-colors group-hover:bg-[var(--color-brand)]/20"
|
|
343
864
|
}
|
|
344
865
|
),
|
|
345
|
-
/* @__PURE__ */ (0,
|
|
346
|
-
/* @__PURE__ */ (0,
|
|
347
|
-
description ? /* @__PURE__ */ (0,
|
|
866
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { className: "grid gap-1", children: [
|
|
867
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "text-sm font-medium text-foreground", children: label }),
|
|
868
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
348
869
|
] })
|
|
349
870
|
]
|
|
350
871
|
}
|
|
@@ -352,10 +873,10 @@ function ModuleIconButton({
|
|
|
352
873
|
}
|
|
353
874
|
|
|
354
875
|
// src/components/primitives/avatar.tsx
|
|
355
|
-
var
|
|
876
|
+
var React5 = __toESM(require("react"), 1);
|
|
356
877
|
var AvatarPrimitive = __toESM(require("@radix-ui/react-avatar"), 1);
|
|
357
|
-
var
|
|
358
|
-
var Avatar =
|
|
878
|
+
var import_jsx_runtime9 = require("react/jsx-runtime");
|
|
879
|
+
var Avatar = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
359
880
|
AvatarPrimitive.Root,
|
|
360
881
|
{
|
|
361
882
|
ref,
|
|
@@ -364,9 +885,9 @@ var Avatar = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
|
364
885
|
}
|
|
365
886
|
));
|
|
366
887
|
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
367
|
-
var AvatarImage =
|
|
888
|
+
var AvatarImage = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(AvatarPrimitive.Image, { ref, className: cn("aspect-square h-full w-full", className), ...props }));
|
|
368
889
|
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
369
|
-
var AvatarFallback =
|
|
890
|
+
var AvatarFallback = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
370
891
|
AvatarPrimitive.Fallback,
|
|
371
892
|
{
|
|
372
893
|
ref,
|
|
@@ -377,7 +898,7 @@ var AvatarFallback = React.forwardRef(({ className, ...props }, ref) => /* @__PU
|
|
|
377
898
|
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
378
899
|
|
|
379
900
|
// src/components/data-display/profile-avatar.tsx
|
|
380
|
-
var
|
|
901
|
+
var import_jsx_runtime10 = require("react/jsx-runtime");
|
|
381
902
|
var sizeMap2 = {
|
|
382
903
|
xs: { avatar: "h-8 w-8", text: "text-xs", dot: "h-2.5 w-2.5" },
|
|
383
904
|
sm: { avatar: "h-10 w-10", text: "text-sm", dot: "h-3 w-3" },
|
|
@@ -405,12 +926,12 @@ function ProfileAvatar({
|
|
|
405
926
|
status
|
|
406
927
|
}) {
|
|
407
928
|
const classes = sizeMap2[size];
|
|
408
|
-
return /* @__PURE__ */ (0,
|
|
409
|
-
/* @__PURE__ */ (0,
|
|
410
|
-
src ? /* @__PURE__ */ (0,
|
|
411
|
-
/* @__PURE__ */ (0,
|
|
929
|
+
return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("relative inline-flex", className), children: [
|
|
930
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Avatar, { className: cn(classes.avatar, avatarClassName), children: [
|
|
931
|
+
src ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(AvatarImage, { src, alt: alt ?? name }) : null,
|
|
932
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(AvatarFallback, { className: cn("bg-[var(--color-brand)] text-white font-medium", classes.text, fallbackClassName), children: initials ?? getInitials(name) })
|
|
412
933
|
] }),
|
|
413
|
-
status ? /* @__PURE__ */ (0,
|
|
934
|
+
status ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
414
935
|
"span",
|
|
415
936
|
{
|
|
416
937
|
"aria-hidden": "true",
|
|
@@ -423,9 +944,9 @@ function AvatarGroup({ className, users, size = "xs", limit = 4, extraLabel }) {
|
|
|
423
944
|
const visibleUsers = users.slice(0, limit);
|
|
424
945
|
const hiddenCount = Math.max(0, users.length - limit);
|
|
425
946
|
const classes = sizeMap2[size];
|
|
426
|
-
return /* @__PURE__ */ (0,
|
|
427
|
-
/* @__PURE__ */ (0,
|
|
428
|
-
visibleUsers.map((user) => /* @__PURE__ */ (0,
|
|
947
|
+
return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("flex items-center gap-3", className), children: [
|
|
948
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex -space-x-2", children: [
|
|
949
|
+
visibleUsers.map((user) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
429
950
|
ProfileAvatar,
|
|
430
951
|
{
|
|
431
952
|
name: user.name,
|
|
@@ -437,7 +958,7 @@ function AvatarGroup({ className, users, size = "xs", limit = 4, extraLabel }) {
|
|
|
437
958
|
},
|
|
438
959
|
user.id ?? user.name
|
|
439
960
|
)),
|
|
440
|
-
hiddenCount > 0 ? /* @__PURE__ */ (0,
|
|
961
|
+
hiddenCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
|
|
441
962
|
"div",
|
|
442
963
|
{
|
|
443
964
|
className: cn(
|
|
@@ -452,16 +973,16 @@ function AvatarGroup({ className, users, size = "xs", limit = 4, extraLabel }) {
|
|
|
452
973
|
}
|
|
453
974
|
) : null
|
|
454
975
|
] }),
|
|
455
|
-
extraLabel ? /* @__PURE__ */ (0,
|
|
976
|
+
extraLabel ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "text-sm text-muted-foreground", children: extraLabel }) : null
|
|
456
977
|
] });
|
|
457
978
|
}
|
|
458
979
|
function ProfileAvatarRow({ className, name, role, src, initials, status, size = "sm", aside }) {
|
|
459
|
-
return /* @__PURE__ */ (0,
|
|
460
|
-
/* @__PURE__ */ (0,
|
|
461
|
-
/* @__PURE__ */ (0,
|
|
462
|
-
/* @__PURE__ */ (0,
|
|
463
|
-
/* @__PURE__ */ (0,
|
|
464
|
-
role ? /* @__PURE__ */ (0,
|
|
980
|
+
return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("flex items-center justify-between gap-3", className), children: [
|
|
981
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
982
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ProfileAvatar, { name, src, initials, status, size }),
|
|
983
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "grid gap-0.5", children: [
|
|
984
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "text-sm font-medium text-foreground", children: name }),
|
|
985
|
+
role ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "text-xs text-muted-foreground", children: role }) : null
|
|
465
986
|
] })
|
|
466
987
|
] }),
|
|
467
988
|
aside
|
|
@@ -469,9 +990,9 @@ function ProfileAvatarRow({ className, name, role, src, initials, status, size =
|
|
|
469
990
|
}
|
|
470
991
|
|
|
471
992
|
// src/components/data-display/typography.tsx
|
|
472
|
-
var
|
|
473
|
-
var
|
|
474
|
-
var typographyVariants = (0,
|
|
993
|
+
var import_class_variance_authority4 = require("class-variance-authority");
|
|
994
|
+
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
995
|
+
var typographyVariants = (0, import_class_variance_authority4.cva)("text-foreground", {
|
|
475
996
|
variants: {
|
|
476
997
|
variant: {
|
|
477
998
|
h1: "font-display text-4xl font-bold tracking-tight",
|
|
@@ -497,17 +1018,63 @@ function Typography({
|
|
|
497
1018
|
...props
|
|
498
1019
|
}) {
|
|
499
1020
|
const Component = as ?? "p";
|
|
500
|
-
return /* @__PURE__ */ (0,
|
|
1021
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Component, { className: cn(typographyVariants({ variant }), className), ...props, children });
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
// src/components/feedback/empty-state.tsx
|
|
1025
|
+
var import_lucide_react3 = require("lucide-react");
|
|
1026
|
+
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
1027
|
+
function EmptyState({
|
|
1028
|
+
className,
|
|
1029
|
+
icon: Icon2 = import_lucide_react3.Inbox,
|
|
1030
|
+
title,
|
|
1031
|
+
description,
|
|
1032
|
+
action,
|
|
1033
|
+
secondaryAction,
|
|
1034
|
+
align = "center",
|
|
1035
|
+
compact = false
|
|
1036
|
+
}) {
|
|
1037
|
+
const isCentered = align === "center";
|
|
1038
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
1039
|
+
"section",
|
|
1040
|
+
{
|
|
1041
|
+
className: cn(
|
|
1042
|
+
"rounded-2xl border border-dashed bg-card text-card-foreground shadow-sm",
|
|
1043
|
+
compact ? "p-5" : "p-8 sm:p-10",
|
|
1044
|
+
className
|
|
1045
|
+
),
|
|
1046
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
1047
|
+
"div",
|
|
1048
|
+
{
|
|
1049
|
+
className: cn(
|
|
1050
|
+
"flex flex-col gap-5",
|
|
1051
|
+
isCentered ? "items-center text-center" : "items-start text-left"
|
|
1052
|
+
),
|
|
1053
|
+
children: [
|
|
1054
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "flex h-14 w-14 items-center justify-center rounded-2xl bg-[var(--color-brand)]/10 text-[var(--color-brand)]", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Icon2, { className: "h-6 w-6" }) }),
|
|
1055
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "grid max-w-xl gap-2", children: [
|
|
1056
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-lg font-semibold text-foreground", children: title }),
|
|
1057
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "text-sm leading-6 text-muted-foreground", children: description }) : null
|
|
1058
|
+
] }),
|
|
1059
|
+
action || secondaryAction ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: cn("flex flex-wrap gap-3", isCentered && "justify-center"), children: [
|
|
1060
|
+
action,
|
|
1061
|
+
secondaryAction
|
|
1062
|
+
] }) : null
|
|
1063
|
+
]
|
|
1064
|
+
}
|
|
1065
|
+
)
|
|
1066
|
+
}
|
|
1067
|
+
);
|
|
501
1068
|
}
|
|
502
1069
|
|
|
503
1070
|
// src/components/primitives/card.tsx
|
|
504
|
-
var
|
|
505
|
-
var
|
|
1071
|
+
var React6 = __toESM(require("react"), 1);
|
|
1072
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
506
1073
|
var cardBaseClassName = "rounded-lg border bg-card text-card-foreground shadow-sm";
|
|
507
|
-
var Card =
|
|
1074
|
+
var Card = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { ref, className: cn(cardBaseClassName, className), ...props }));
|
|
508
1075
|
Card.displayName = "Card";
|
|
509
|
-
var ClickableCard =
|
|
510
|
-
({ className, type = "button", ...props }, ref) => /* @__PURE__ */ (0,
|
|
1076
|
+
var ClickableCard = React6.forwardRef(
|
|
1077
|
+
({ className, type = "button", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
511
1078
|
"button",
|
|
512
1079
|
{
|
|
513
1080
|
ref,
|
|
@@ -522,8 +1089,8 @@ var ClickableCard = React2.forwardRef(
|
|
|
522
1089
|
)
|
|
523
1090
|
);
|
|
524
1091
|
ClickableCard.displayName = "ClickableCard";
|
|
525
|
-
var CenteredIconCard =
|
|
526
|
-
({ className, type = "button", icon: Icon2, title, iconClassName, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1092
|
+
var CenteredIconCard = React6.forwardRef(
|
|
1093
|
+
({ className, type = "button", icon: Icon2, title, iconClassName, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
527
1094
|
"button",
|
|
528
1095
|
{
|
|
529
1096
|
ref,
|
|
@@ -535,67 +1102,67 @@ var CenteredIconCard = React2.forwardRef(
|
|
|
535
1102
|
),
|
|
536
1103
|
...props,
|
|
537
1104
|
children: [
|
|
538
|
-
/* @__PURE__ */ (0,
|
|
539
|
-
/* @__PURE__ */ (0,
|
|
1105
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "flex h-12 w-12 items-center justify-center rounded-xl bg-[var(--color-brand)]/10 text-[var(--color-brand)]", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Icon2, { className: cn("h-6 w-6", iconClassName) }) }),
|
|
1106
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-sm font-semibold text-foreground", children: title })
|
|
540
1107
|
]
|
|
541
1108
|
}
|
|
542
1109
|
)
|
|
543
1110
|
);
|
|
544
1111
|
CenteredIconCard.displayName = "CenteredIconCard";
|
|
545
|
-
var CardHeader =
|
|
546
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1112
|
+
var CardHeader = React6.forwardRef(
|
|
1113
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { ref, className: cn("flex flex-col space-y-1.5 p-6", className), ...props })
|
|
547
1114
|
);
|
|
548
1115
|
CardHeader.displayName = "CardHeader";
|
|
549
|
-
var CardTitle =
|
|
550
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1116
|
+
var CardTitle = React6.forwardRef(
|
|
1117
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { ref, className: cn("text-2xl font-semibold leading-none tracking-tight", className), ...props })
|
|
551
1118
|
);
|
|
552
1119
|
CardTitle.displayName = "CardTitle";
|
|
553
|
-
var CardDescription =
|
|
554
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1120
|
+
var CardDescription = React6.forwardRef(
|
|
1121
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { ref, className: cn("text-sm text-muted-foreground", className), ...props })
|
|
555
1122
|
);
|
|
556
1123
|
CardDescription.displayName = "CardDescription";
|
|
557
|
-
var CardContent =
|
|
558
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1124
|
+
var CardContent = React6.forwardRef(
|
|
1125
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { ref, className: cn("p-6 pt-0", className), ...props })
|
|
559
1126
|
);
|
|
560
1127
|
CardContent.displayName = "CardContent";
|
|
561
|
-
var CardFooter =
|
|
562
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1128
|
+
var CardFooter = React6.forwardRef(
|
|
1129
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { ref, className: cn("flex items-center p-6 pt-0", className), ...props })
|
|
563
1130
|
);
|
|
564
1131
|
CardFooter.displayName = "CardFooter";
|
|
565
1132
|
|
|
566
1133
|
// src/components/feedback/skeleton.tsx
|
|
567
|
-
var
|
|
1134
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
568
1135
|
function Skeleton({ className, ...props }) {
|
|
569
|
-
return /* @__PURE__ */ (0,
|
|
1136
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: cn("animate-pulse rounded-md bg-muted", className), ...props });
|
|
570
1137
|
}
|
|
571
1138
|
|
|
572
1139
|
// src/components/feedback/spinner.tsx
|
|
573
|
-
var
|
|
574
|
-
var
|
|
1140
|
+
var import_lucide_react4 = require("lucide-react");
|
|
1141
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
575
1142
|
var sizeMap3 = {
|
|
576
1143
|
sm: "h-4 w-4",
|
|
577
1144
|
md: "h-5 w-5",
|
|
578
1145
|
lg: "h-7 w-7"
|
|
579
1146
|
};
|
|
580
1147
|
function Spinner({ className, size = "md" }) {
|
|
581
|
-
return /* @__PURE__ */ (0,
|
|
1148
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_lucide_react4.Loader2, { className: cn("animate-spin text-current", sizeMap3[size], className) });
|
|
582
1149
|
}
|
|
583
1150
|
|
|
584
|
-
// src/components/tables/table.tsx
|
|
585
|
-
var
|
|
586
|
-
var
|
|
587
|
-
var Table =
|
|
1151
|
+
// src/components/tables/table.tsx
|
|
1152
|
+
var React7 = __toESM(require("react"), 1);
|
|
1153
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
1154
|
+
var Table = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "relative w-full overflow-auto", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("table", { ref, className: cn("w-full caption-bottom text-sm", className), ...props }) }));
|
|
588
1155
|
Table.displayName = "Table";
|
|
589
|
-
var TableHeader =
|
|
590
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1156
|
+
var TableHeader = React7.forwardRef(
|
|
1157
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("thead", { ref, className: cn("[&_tr]:border-b", className), ...props })
|
|
591
1158
|
);
|
|
592
1159
|
TableHeader.displayName = "TableHeader";
|
|
593
|
-
var TableBody =
|
|
594
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1160
|
+
var TableBody = React7.forwardRef(
|
|
1161
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
|
|
595
1162
|
);
|
|
596
1163
|
TableBody.displayName = "TableBody";
|
|
597
|
-
var TableFooter =
|
|
598
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1164
|
+
var TableFooter = React7.forwardRef(
|
|
1165
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
599
1166
|
"tfoot",
|
|
600
1167
|
{
|
|
601
1168
|
ref,
|
|
@@ -605,8 +1172,8 @@ var TableFooter = React3.forwardRef(
|
|
|
605
1172
|
)
|
|
606
1173
|
);
|
|
607
1174
|
TableFooter.displayName = "TableFooter";
|
|
608
|
-
var TableRow =
|
|
609
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1175
|
+
var TableRow = React7.forwardRef(
|
|
1176
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
610
1177
|
"tr",
|
|
611
1178
|
{
|
|
612
1179
|
ref,
|
|
@@ -616,8 +1183,8 @@ var TableRow = React3.forwardRef(
|
|
|
616
1183
|
)
|
|
617
1184
|
);
|
|
618
1185
|
TableRow.displayName = "TableRow";
|
|
619
|
-
var TableHead =
|
|
620
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1186
|
+
var TableHead = React7.forwardRef(
|
|
1187
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
621
1188
|
"th",
|
|
622
1189
|
{
|
|
623
1190
|
ref,
|
|
@@ -627,17 +1194,17 @@ var TableHead = React3.forwardRef(
|
|
|
627
1194
|
)
|
|
628
1195
|
);
|
|
629
1196
|
TableHead.displayName = "TableHead";
|
|
630
|
-
var TableCell =
|
|
631
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1197
|
+
var TableCell = React7.forwardRef(
|
|
1198
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("td", { ref, className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })
|
|
632
1199
|
);
|
|
633
1200
|
TableCell.displayName = "TableCell";
|
|
634
|
-
var TableCaption =
|
|
635
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1201
|
+
var TableCaption = React7.forwardRef(
|
|
1202
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("caption", { ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })
|
|
636
1203
|
);
|
|
637
1204
|
TableCaption.displayName = "TableCaption";
|
|
638
1205
|
|
|
639
1206
|
// src/components/feedback/loading-state.tsx
|
|
640
|
-
var
|
|
1207
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
641
1208
|
function LoadingState({
|
|
642
1209
|
className,
|
|
643
1210
|
title = "Cargando datos",
|
|
@@ -645,93 +1212,99 @@ function LoadingState({
|
|
|
645
1212
|
size = "md",
|
|
646
1213
|
icon
|
|
647
1214
|
}) {
|
|
648
|
-
return /* @__PURE__ */ (0,
|
|
1215
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
649
1216
|
"div",
|
|
650
1217
|
{
|
|
651
1218
|
role: "status",
|
|
652
1219
|
"aria-live": "polite",
|
|
653
1220
|
className: cn("flex items-center gap-3 rounded-xl border border-border bg-card px-4 py-3 text-foreground", className),
|
|
654
1221
|
children: [
|
|
655
|
-
icon ?? /* @__PURE__ */ (0,
|
|
656
|
-
/* @__PURE__ */ (0,
|
|
657
|
-
/* @__PURE__ */ (0,
|
|
658
|
-
/* @__PURE__ */ (0,
|
|
1222
|
+
icon ?? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Spinner, { size, className: "text-primary" }),
|
|
1223
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "grid gap-0.5", children: [
|
|
1224
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-sm font-medium", children: title }),
|
|
1225
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-xs text-muted-foreground", children: description })
|
|
659
1226
|
] })
|
|
660
1227
|
]
|
|
661
1228
|
}
|
|
662
1229
|
);
|
|
663
1230
|
}
|
|
664
1231
|
function LoadingCard({ className, rows = 3 }) {
|
|
665
|
-
return /* @__PURE__ */ (0,
|
|
666
|
-
/* @__PURE__ */ (0,
|
|
667
|
-
Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ (0,
|
|
668
|
-
/* @__PURE__ */ (0,
|
|
1232
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Card, { className, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(CardContent, { className: "grid gap-3 p-5", children: [
|
|
1233
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Skeleton, { className: "h-6 w-40" }),
|
|
1234
|
+
Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Skeleton, { className: cn("h-4", index === rows - 1 ? "w-2/3" : "w-full") }, index)),
|
|
1235
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Skeleton, { className: "mt-1 h-10 w-full rounded-lg" })
|
|
669
1236
|
] }) });
|
|
670
1237
|
}
|
|
671
1238
|
function LoadingTableRows({ className, columns = 5, rows = 4 }) {
|
|
672
|
-
return /* @__PURE__ */ (0,
|
|
673
|
-
/* @__PURE__ */ (0,
|
|
674
|
-
/* @__PURE__ */ (0,
|
|
1239
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: cn("rounded-xl border", className), children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(Table, { children: [
|
|
1240
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TableHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TableRow, { children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TableHead, { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Skeleton, { className: "h-4 w-20" }) }, index)) }) }),
|
|
1241
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TableBody, { children: Array.from({ length: rows }).map((_, rowIndex) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TableRow, { children: Array.from({ length: columns }).map((_2, columnIndex) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Skeleton, { className: cn("h-4", columnIndex === 0 ? "w-24" : "w-full") }) }, columnIndex)) }, rowIndex)) })
|
|
675
1242
|
] }) });
|
|
676
1243
|
}
|
|
677
1244
|
|
|
678
|
-
// src/components/feedback/
|
|
679
|
-
var
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
)
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
)
|
|
718
|
-
|
|
1245
|
+
// src/components/feedback/module-skeleton.tsx
|
|
1246
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
1247
|
+
function ModuleSkeleton({
|
|
1248
|
+
className,
|
|
1249
|
+
variant = "cards",
|
|
1250
|
+
cardCount = 6,
|
|
1251
|
+
showHeaderAction = true
|
|
1252
|
+
}) {
|
|
1253
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { role: "status", "aria-label": "Cargando modulo", className: cn("grid gap-6 p-6", className), children: [
|
|
1254
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
|
|
1255
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "grid gap-2", children: [
|
|
1256
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-8 w-52" }),
|
|
1257
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-4 w-72 max-w-full" })
|
|
1258
|
+
] }),
|
|
1259
|
+
showHeaderAction ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-10 w-36" }) : null
|
|
1260
|
+
] }),
|
|
1261
|
+
variant === "cards" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-3", children: Array.from({ length: cardCount }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-32 w-full rounded-xl" }, index)) }) : null,
|
|
1262
|
+
variant === "table" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "rounded-xl border bg-card p-4", children: [
|
|
1263
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "mb-4 flex flex-wrap gap-3", children: [
|
|
1264
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-10 w-64 max-w-full" }),
|
|
1265
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-10 w-36" })
|
|
1266
|
+
] }),
|
|
1267
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "grid gap-3", children: [
|
|
1268
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-10 w-full rounded-lg" }),
|
|
1269
|
+
Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-14 w-full rounded-lg" }, index))
|
|
1270
|
+
] })
|
|
1271
|
+
] }) : null,
|
|
1272
|
+
variant === "form" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "rounded-xl border bg-card p-5", children: [
|
|
1273
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "grid gap-5 md:grid-cols-2", children: [
|
|
1274
|
+
Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "grid gap-2", children: [
|
|
1275
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-4 w-28" }),
|
|
1276
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-10 w-full" })
|
|
1277
|
+
] }, index)),
|
|
1278
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "grid gap-2 md:col-span-2", children: [
|
|
1279
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-4 w-32" }),
|
|
1280
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-28 w-full rounded-xl" })
|
|
1281
|
+
] })
|
|
1282
|
+
] }),
|
|
1283
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "mt-6 flex flex-wrap justify-end gap-3", children: [
|
|
1284
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-10 w-24" }),
|
|
1285
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Skeleton, { className: "h-10 w-36" })
|
|
1286
|
+
] })
|
|
1287
|
+
] }) : null
|
|
1288
|
+
] });
|
|
1289
|
+
}
|
|
719
1290
|
|
|
720
1291
|
// src/components/feedback/notification.tsx
|
|
721
|
-
var
|
|
1292
|
+
var import_lucide_react5 = require("lucide-react");
|
|
1293
|
+
var import_sonner = require("sonner");
|
|
1294
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
722
1295
|
var notificationStyles = {
|
|
723
|
-
info: "
|
|
724
|
-
success: "
|
|
725
|
-
warning: "
|
|
726
|
-
danger: "
|
|
727
|
-
loading: "
|
|
1296
|
+
info: "border-[var(--color-accent-blue)]/20 bg-[linear-gradient(135deg,rgba(59,130,246,0.14),rgba(239,246,255,0.96))] text-[var(--color-accent-blue)]",
|
|
1297
|
+
success: "border-[var(--color-success)]/20 bg-[linear-gradient(135deg,rgba(22,163,74,0.14),rgba(220,252,231,0.96))] text-[var(--color-success)]",
|
|
1298
|
+
warning: "border-[var(--color-warning)]/20 bg-[linear-gradient(135deg,rgba(217,119,6,0.16),rgba(255,251,235,0.96))] text-[var(--color-warning)]",
|
|
1299
|
+
danger: "border-destructive/20 bg-[linear-gradient(135deg,rgba(220,74,65,0.16),rgba(254,242,242,0.96))] text-destructive",
|
|
1300
|
+
loading: "border-[var(--color-accent-blue)]/20 bg-[linear-gradient(135deg,rgba(59,130,246,0.14),rgba(239,246,255,0.96))] text-[var(--color-accent-blue)]"
|
|
728
1301
|
};
|
|
729
1302
|
var notificationIcons = {
|
|
730
|
-
info:
|
|
731
|
-
success:
|
|
732
|
-
warning:
|
|
733
|
-
danger:
|
|
734
|
-
loading:
|
|
1303
|
+
info: import_lucide_react5.Info,
|
|
1304
|
+
success: import_lucide_react5.CheckCircle2,
|
|
1305
|
+
warning: import_lucide_react5.AlertTriangle,
|
|
1306
|
+
danger: import_lucide_react5.AlertCircle,
|
|
1307
|
+
loading: import_lucide_react5.Loader2
|
|
735
1308
|
};
|
|
736
1309
|
function NotificationMessage({
|
|
737
1310
|
className,
|
|
@@ -742,20 +1315,24 @@ function NotificationMessage({
|
|
|
742
1315
|
icon
|
|
743
1316
|
}) {
|
|
744
1317
|
const Icon2 = icon ?? notificationIcons[tone];
|
|
745
|
-
return /* @__PURE__ */ (0,
|
|
1318
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
746
1319
|
"div",
|
|
747
1320
|
{
|
|
748
1321
|
role: "status",
|
|
749
|
-
className: cn(
|
|
1322
|
+
className: cn(
|
|
1323
|
+
"flex items-start justify-between gap-3 rounded-xl border px-4 py-3 shadow-sm",
|
|
1324
|
+
notificationStyles[tone],
|
|
1325
|
+
className
|
|
1326
|
+
),
|
|
750
1327
|
children: [
|
|
751
|
-
/* @__PURE__ */ (0,
|
|
752
|
-
/* @__PURE__ */ (0,
|
|
753
|
-
/* @__PURE__ */ (0,
|
|
754
|
-
/* @__PURE__ */ (0,
|
|
755
|
-
description ? /* @__PURE__ */ (0,
|
|
1328
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex items-start gap-3", children: [
|
|
1329
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-white/70 shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Icon2, { className: cn("h-4 w-4", tone === "loading" && "animate-spin") }) }),
|
|
1330
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "grid gap-1", children: [
|
|
1331
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-sm font-semibold", children: title }),
|
|
1332
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "text-xs leading-5 opacity-90", children: description }) : null
|
|
756
1333
|
] })
|
|
757
1334
|
] }),
|
|
758
|
-
action ? /* @__PURE__ */ (0,
|
|
1335
|
+
action ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "shrink-0", children: action }) : null
|
|
759
1336
|
]
|
|
760
1337
|
}
|
|
761
1338
|
);
|
|
@@ -763,6 +1340,7 @@ function NotificationMessage({
|
|
|
763
1340
|
function buildToastOptions(payload) {
|
|
764
1341
|
return {
|
|
765
1342
|
description: payload.description,
|
|
1343
|
+
duration: payload.duration,
|
|
766
1344
|
action: payload.actionLabel ? {
|
|
767
1345
|
label: payload.actionLabel,
|
|
768
1346
|
onClick: payload.onAction ?? (() => void 0)
|
|
@@ -770,22 +1348,20 @@ function buildToastOptions(payload) {
|
|
|
770
1348
|
};
|
|
771
1349
|
}
|
|
772
1350
|
var notify = {
|
|
773
|
-
info: (payload) =>
|
|
1351
|
+
info: (payload) => import_sonner.toast.info(payload.title, buildToastOptions(payload)),
|
|
774
1352
|
success: (payload) => import_sonner.toast.success(payload.title, buildToastOptions(payload)),
|
|
775
|
-
warning: (payload) =>
|
|
776
|
-
...buildToastOptions(payload),
|
|
777
|
-
icon: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react2.AlertTriangle, { className: "h-4 w-4 text-[var(--color-warning)]" })
|
|
778
|
-
}),
|
|
1353
|
+
warning: (payload) => import_sonner.toast.warning(payload.title, buildToastOptions(payload)),
|
|
779
1354
|
danger: (payload) => import_sonner.toast.error(payload.title, buildToastOptions(payload)),
|
|
1355
|
+
error: (payload) => import_sonner.toast.error(payload.title, buildToastOptions(payload)),
|
|
780
1356
|
loading: (payload) => import_sonner.toast.loading(payload.title, buildToastOptions(payload))
|
|
781
1357
|
};
|
|
782
1358
|
function NotificationAction({ children, variant = "outline", size = "sm", ...props }) {
|
|
783
|
-
return /* @__PURE__ */ (0,
|
|
1359
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Button, { variant, size, ...props, children });
|
|
784
1360
|
}
|
|
785
1361
|
|
|
786
1362
|
// src/components/feedback/status-badge.tsx
|
|
787
|
-
var
|
|
788
|
-
var
|
|
1363
|
+
var import_lucide_react6 = require("lucide-react");
|
|
1364
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
789
1365
|
var toneStyles2 = {
|
|
790
1366
|
success: "border-transparent bg-[var(--color-success-bg)] text-[var(--color-success)]",
|
|
791
1367
|
warning: "border-transparent bg-[var(--color-warning-bg)] text-[var(--color-warning)]",
|
|
@@ -794,15 +1370,15 @@ var toneStyles2 = {
|
|
|
794
1370
|
loading: "border-transparent bg-muted text-muted-foreground"
|
|
795
1371
|
};
|
|
796
1372
|
var toneIcons = {
|
|
797
|
-
success:
|
|
798
|
-
warning:
|
|
799
|
-
danger:
|
|
800
|
-
info:
|
|
801
|
-
loading:
|
|
1373
|
+
success: import_lucide_react6.CheckCircle2,
|
|
1374
|
+
warning: import_lucide_react6.Clock3,
|
|
1375
|
+
danger: import_lucide_react6.AlertCircle,
|
|
1376
|
+
info: import_lucide_react6.CheckCircle2,
|
|
1377
|
+
loading: import_lucide_react6.Loader2
|
|
802
1378
|
};
|
|
803
1379
|
function StatusBadge({ children, tone = "info", className }) {
|
|
804
1380
|
const Icon2 = toneIcons[tone];
|
|
805
|
-
return /* @__PURE__ */ (0,
|
|
1381
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
806
1382
|
"span",
|
|
807
1383
|
{
|
|
808
1384
|
className: cn(
|
|
@@ -811,30 +1387,146 @@ function StatusBadge({ children, tone = "info", className }) {
|
|
|
811
1387
|
className
|
|
812
1388
|
),
|
|
813
1389
|
children: [
|
|
814
|
-
/* @__PURE__ */ (0,
|
|
1390
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon2, { className: cn("h-3.5 w-3.5", tone === "loading" && "animate-spin") }),
|
|
815
1391
|
children
|
|
816
1392
|
]
|
|
817
1393
|
}
|
|
818
1394
|
);
|
|
819
1395
|
}
|
|
820
1396
|
|
|
1397
|
+
// src/components/feedback/sync-status-badge.tsx
|
|
1398
|
+
var import_lucide_react7 = require("lucide-react");
|
|
1399
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
1400
|
+
var badgeStyles = {
|
|
1401
|
+
synced: "border-transparent bg-[var(--color-success-bg)] text-[var(--color-success)]",
|
|
1402
|
+
pending: "border-transparent bg-[var(--color-warning-bg)] text-[var(--color-warning)]",
|
|
1403
|
+
syncing: "border-transparent bg-[var(--color-info-bg)] text-[var(--color-accent-blue)]",
|
|
1404
|
+
conflict: "border-transparent bg-destructive/10 text-destructive",
|
|
1405
|
+
offline: "border-transparent bg-muted text-muted-foreground"
|
|
1406
|
+
};
|
|
1407
|
+
var badgeIcons = {
|
|
1408
|
+
synced: import_lucide_react7.CheckCircle2,
|
|
1409
|
+
pending: import_lucide_react7.Clock3,
|
|
1410
|
+
syncing: import_lucide_react7.Loader2,
|
|
1411
|
+
conflict: import_lucide_react7.AlertCircle,
|
|
1412
|
+
offline: import_lucide_react7.WifiOff
|
|
1413
|
+
};
|
|
1414
|
+
var badgeLabels = {
|
|
1415
|
+
synced: "Sincronizado",
|
|
1416
|
+
pending: "Pendiente",
|
|
1417
|
+
syncing: "Sincronizando",
|
|
1418
|
+
conflict: "Conflicto",
|
|
1419
|
+
offline: "Offline"
|
|
1420
|
+
};
|
|
1421
|
+
function SyncStatusBadge({ className, status, label }) {
|
|
1422
|
+
const Icon2 = badgeIcons[status];
|
|
1423
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
1424
|
+
"span",
|
|
1425
|
+
{
|
|
1426
|
+
className: cn(
|
|
1427
|
+
"inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium",
|
|
1428
|
+
badgeStyles[status],
|
|
1429
|
+
className
|
|
1430
|
+
),
|
|
1431
|
+
children: [
|
|
1432
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Icon2, { className: cn("h-3.5 w-3.5", status === "syncing" && "animate-spin") }),
|
|
1433
|
+
label ?? badgeLabels[status]
|
|
1434
|
+
]
|
|
1435
|
+
}
|
|
1436
|
+
);
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
// src/components/feedback/sync-status-bar.tsx
|
|
1440
|
+
var import_lucide_react8 = require("lucide-react");
|
|
1441
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
1442
|
+
function pluralize(count, singular, plural) {
|
|
1443
|
+
return `${count} ${count === 1 ? singular : plural}`;
|
|
1444
|
+
}
|
|
1445
|
+
function SyncStatusBar({
|
|
1446
|
+
className,
|
|
1447
|
+
state,
|
|
1448
|
+
pendingCount = 0,
|
|
1449
|
+
errorCount = 0,
|
|
1450
|
+
syncingCount = 0,
|
|
1451
|
+
onClick,
|
|
1452
|
+
label
|
|
1453
|
+
}) {
|
|
1454
|
+
const config = {
|
|
1455
|
+
conflict: {
|
|
1456
|
+
icon: import_lucide_react8.AlertTriangle,
|
|
1457
|
+
text: label ?? `${pluralize(errorCount || 1, "operacion", "operaciones")} con error`,
|
|
1458
|
+
className: "bg-destructive/15 text-destructive"
|
|
1459
|
+
},
|
|
1460
|
+
offline: {
|
|
1461
|
+
icon: import_lucide_react8.WifiOff,
|
|
1462
|
+
text: label ?? (pendingCount > 0 ? `Offline \xB7 ${pluralize(pendingCount, "pendiente", "pendientes")}` : "Offline \xB7 sin pendientes"),
|
|
1463
|
+
className: "bg-[var(--color-warning-bg)] text-[var(--color-warning)]"
|
|
1464
|
+
},
|
|
1465
|
+
syncing: {
|
|
1466
|
+
icon: import_lucide_react8.Loader2,
|
|
1467
|
+
text: label ?? `Sincronizando ${pluralize(syncingCount || 1, "operacion", "operaciones")}...`,
|
|
1468
|
+
className: "bg-[var(--color-info-bg)] text-[var(--color-accent-blue)]",
|
|
1469
|
+
spinning: true
|
|
1470
|
+
},
|
|
1471
|
+
pending: {
|
|
1472
|
+
icon: import_lucide_react8.RefreshCw,
|
|
1473
|
+
text: label ?? `${pluralize(pendingCount || 1, "pendiente", "pendientes")} por sincronizar`,
|
|
1474
|
+
className: "bg-[var(--color-warning-bg)] text-[var(--color-warning)]"
|
|
1475
|
+
},
|
|
1476
|
+
synced: {
|
|
1477
|
+
icon: import_lucide_react8.CheckCircle2,
|
|
1478
|
+
text: label ?? "Todo sincronizado",
|
|
1479
|
+
className: "bg-[var(--color-success-bg)] text-[var(--color-success)]"
|
|
1480
|
+
}
|
|
1481
|
+
};
|
|
1482
|
+
const current = config[state];
|
|
1483
|
+
const Icon2 = current.icon;
|
|
1484
|
+
const isClickable = typeof onClick === "function";
|
|
1485
|
+
const Component = isClickable ? "button" : "div";
|
|
1486
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
1487
|
+
Component,
|
|
1488
|
+
{
|
|
1489
|
+
...isClickable ? { type: "button", onClick } : {},
|
|
1490
|
+
className: cn(
|
|
1491
|
+
"flex h-8 w-full items-center justify-center gap-1.5 px-4 text-xs font-medium transition-opacity",
|
|
1492
|
+
current.className,
|
|
1493
|
+
isClickable ? "cursor-pointer hover:opacity-85 active:opacity-70" : "cursor-default",
|
|
1494
|
+
className
|
|
1495
|
+
),
|
|
1496
|
+
children: [
|
|
1497
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Icon2, { className: cn("h-3.5 w-3.5", current.spinning && "animate-spin") }),
|
|
1498
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: current.text }),
|
|
1499
|
+
isClickable ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "ml-1 text-[10px] opacity-60", children: "\u2192" }) : null
|
|
1500
|
+
]
|
|
1501
|
+
}
|
|
1502
|
+
);
|
|
1503
|
+
}
|
|
1504
|
+
|
|
821
1505
|
// src/components/feedback/toaster.tsx
|
|
1506
|
+
var import_lucide_react9 = require("lucide-react");
|
|
822
1507
|
var import_sonner2 = require("sonner");
|
|
823
|
-
var
|
|
1508
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
824
1509
|
function Toaster(props) {
|
|
825
1510
|
const { resolvedTheme } = useTheme();
|
|
826
|
-
return /* @__PURE__ */ (0,
|
|
1511
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
827
1512
|
import_sonner2.Toaster,
|
|
828
1513
|
{
|
|
829
1514
|
theme: resolvedTheme,
|
|
1515
|
+
position: "top-right",
|
|
1516
|
+
richColors: true,
|
|
830
1517
|
className: "toaster group",
|
|
1518
|
+
icons: {
|
|
1519
|
+
loading: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react9.LoaderCircle, { className: "h-4 w-4 animate-spin" })
|
|
1520
|
+
},
|
|
831
1521
|
closeButton: true,
|
|
832
1522
|
toastOptions: {
|
|
833
1523
|
classNames: {
|
|
834
|
-
toast: "group toast group-[.toaster]:
|
|
1524
|
+
toast: "group toast group-[.toaster]:rounded-xl group-[.toaster]:border group-[.toaster]:border-border group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:shadow-xl",
|
|
1525
|
+
title: "text-sm font-semibold",
|
|
835
1526
|
description: "group-[.toast]:text-muted-foreground",
|
|
836
|
-
actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
|
|
837
|
-
cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"
|
|
1527
|
+
actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground group-[.toast]:rounded-md",
|
|
1528
|
+
cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground group-[.toast]:rounded-md",
|
|
1529
|
+
closeButton: "pointer-events-auto cursor-pointer rounded-md border border-border bg-background text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground"
|
|
838
1530
|
}
|
|
839
1531
|
},
|
|
840
1532
|
...props
|
|
@@ -843,15 +1535,15 @@ function Toaster(props) {
|
|
|
843
1535
|
}
|
|
844
1536
|
|
|
845
1537
|
// src/components/forms/searchable-select.tsx
|
|
846
|
-
var
|
|
847
|
-
var
|
|
1538
|
+
var React9 = __toESM(require("react"), 1);
|
|
1539
|
+
var import_lucide_react10 = require("lucide-react");
|
|
848
1540
|
|
|
849
1541
|
// src/components/primitives/input.tsx
|
|
850
|
-
var
|
|
851
|
-
var
|
|
852
|
-
var Input =
|
|
1542
|
+
var React8 = __toESM(require("react"), 1);
|
|
1543
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
1544
|
+
var Input = React8.forwardRef(
|
|
853
1545
|
({ className, type, ...props }, ref) => {
|
|
854
|
-
return /* @__PURE__ */ (0,
|
|
1546
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
855
1547
|
"input",
|
|
856
1548
|
{
|
|
857
1549
|
type,
|
|
@@ -868,11 +1560,11 @@ var Input = React5.forwardRef(
|
|
|
868
1560
|
Input.displayName = "Input";
|
|
869
1561
|
|
|
870
1562
|
// src/components/forms/searchable-select.tsx
|
|
871
|
-
var
|
|
1563
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
872
1564
|
function normalize(str) {
|
|
873
1565
|
return str.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
|
|
874
1566
|
}
|
|
875
|
-
var SearchableSelect =
|
|
1567
|
+
var SearchableSelect = React9.forwardRef(
|
|
876
1568
|
({
|
|
877
1569
|
options: options2,
|
|
878
1570
|
value,
|
|
@@ -885,12 +1577,12 @@ var SearchableSelect = React6.forwardRef(
|
|
|
885
1577
|
id,
|
|
886
1578
|
className
|
|
887
1579
|
}, ref) => {
|
|
888
|
-
const [open, setOpen] =
|
|
889
|
-
const [search, setSearch] =
|
|
890
|
-
const wrapperRef =
|
|
891
|
-
const searchRef =
|
|
892
|
-
const selected =
|
|
893
|
-
const filtered =
|
|
1580
|
+
const [open, setOpen] = React9.useState(false);
|
|
1581
|
+
const [search, setSearch] = React9.useState("");
|
|
1582
|
+
const wrapperRef = React9.useRef(null);
|
|
1583
|
+
const searchRef = React9.useRef(null);
|
|
1584
|
+
const selected = React9.useMemo(() => options2.find((option) => option.value === value) ?? null, [options2, value]);
|
|
1585
|
+
const filtered = React9.useMemo(() => {
|
|
894
1586
|
if (!search.trim()) {
|
|
895
1587
|
return options2;
|
|
896
1588
|
}
|
|
@@ -916,7 +1608,7 @@ var SearchableSelect = React6.forwardRef(
|
|
|
916
1608
|
setSearch("");
|
|
917
1609
|
}
|
|
918
1610
|
}
|
|
919
|
-
|
|
1611
|
+
React9.useEffect(() => {
|
|
920
1612
|
if (!open) {
|
|
921
1613
|
return;
|
|
922
1614
|
}
|
|
@@ -929,15 +1621,15 @@ var SearchableSelect = React6.forwardRef(
|
|
|
929
1621
|
document.addEventListener("mousedown", handleMouseDown);
|
|
930
1622
|
return () => document.removeEventListener("mousedown", handleMouseDown);
|
|
931
1623
|
}, [open]);
|
|
932
|
-
|
|
1624
|
+
React9.useEffect(() => {
|
|
933
1625
|
if (!open) {
|
|
934
1626
|
return;
|
|
935
1627
|
}
|
|
936
1628
|
const timer = setTimeout(() => searchRef.current?.focus(), 50);
|
|
937
1629
|
return () => clearTimeout(timer);
|
|
938
1630
|
}, [open]);
|
|
939
|
-
return /* @__PURE__ */ (0,
|
|
940
|
-
/* @__PURE__ */ (0,
|
|
1631
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { ref: wrapperRef, className: cn("relative w-full", className), onKeyDown: handleKeyDown, children: [
|
|
1632
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
|
|
941
1633
|
"button",
|
|
942
1634
|
{
|
|
943
1635
|
ref,
|
|
@@ -952,26 +1644,26 @@ var SearchableSelect = React6.forwardRef(
|
|
|
952
1644
|
"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-left text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
|
|
953
1645
|
),
|
|
954
1646
|
children: [
|
|
955
|
-
loading ? /* @__PURE__ */ (0,
|
|
956
|
-
/* @__PURE__ */ (0,
|
|
1647
|
+
loading ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { className: "flex items-center gap-2 text-muted-foreground", children: [
|
|
1648
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react10.Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
957
1649
|
"Loading..."
|
|
958
|
-
] }) : selected ? /* @__PURE__ */ (0,
|
|
959
|
-
selected.sublabel ? /* @__PURE__ */ (0,
|
|
960
|
-
/* @__PURE__ */ (0,
|
|
961
|
-
] }) : /* @__PURE__ */ (0,
|
|
962
|
-
/* @__PURE__ */ (0,
|
|
1650
|
+
] }) : selected ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { className: "flex items-center gap-2 truncate", children: [
|
|
1651
|
+
selected.sublabel ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "shrink-0 font-mono text-xs text-muted-foreground", children: selected.sublabel }) : null,
|
|
1652
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "truncate", children: selected.label })
|
|
1653
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "text-muted-foreground", children: placeholder }),
|
|
1654
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ml-2 shrink-0 opacity-50", children: open ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react10.ChevronUp, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react10.ChevronDown, { className: "h-4 w-4" }) })
|
|
963
1655
|
]
|
|
964
1656
|
}
|
|
965
1657
|
),
|
|
966
|
-
open ? /* @__PURE__ */ (0,
|
|
1658
|
+
open ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
|
|
967
1659
|
"div",
|
|
968
1660
|
{
|
|
969
1661
|
role: "listbox",
|
|
970
1662
|
className: "animate-in fade-in-0 zoom-in-95 absolute z-50 mt-1 w-full rounded-md border border-border bg-popover text-popover-foreground shadow-md",
|
|
971
1663
|
children: [
|
|
972
|
-
/* @__PURE__ */ (0,
|
|
973
|
-
/* @__PURE__ */ (0,
|
|
974
|
-
/* @__PURE__ */ (0,
|
|
1664
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "sticky top-0 flex items-center gap-2 border-b border-border bg-popover px-3 py-2", children: [
|
|
1665
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react10.Search, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
|
|
1666
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
975
1667
|
Input,
|
|
976
1668
|
{
|
|
977
1669
|
ref: searchRef,
|
|
@@ -983,9 +1675,9 @@ var SearchableSelect = React6.forwardRef(
|
|
|
983
1675
|
}
|
|
984
1676
|
)
|
|
985
1677
|
] }),
|
|
986
|
-
/* @__PURE__ */ (0,
|
|
1678
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("ul", { className: "max-h-60 overflow-y-auto overscroll-contain p-1", children: filtered.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("li", { className: "px-4 py-3 text-center text-xs text-muted-foreground", children: emptyMessage }) : filtered.map((option) => {
|
|
987
1679
|
const isSelected = option.value === value;
|
|
988
|
-
return /* @__PURE__ */ (0,
|
|
1680
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
|
|
989
1681
|
"li",
|
|
990
1682
|
{
|
|
991
1683
|
role: "option",
|
|
@@ -996,10 +1688,10 @@ var SearchableSelect = React6.forwardRef(
|
|
|
996
1688
|
isSelected && "bg-accent/50 font-medium"
|
|
997
1689
|
),
|
|
998
1690
|
children: [
|
|
999
|
-
/* @__PURE__ */ (0,
|
|
1000
|
-
/* @__PURE__ */ (0,
|
|
1001
|
-
option.sublabel ? /* @__PURE__ */ (0,
|
|
1002
|
-
/* @__PURE__ */ (0,
|
|
1691
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: isSelected ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react10.Check, { className: "h-4 w-4" }) : null }),
|
|
1692
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { className: "flex items-center gap-2 truncate", children: [
|
|
1693
|
+
option.sublabel ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "shrink-0 font-mono text-xs text-muted-foreground", children: option.sublabel }) : null,
|
|
1694
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "truncate", children: option.label })
|
|
1003
1695
|
] })
|
|
1004
1696
|
]
|
|
1005
1697
|
},
|
|
@@ -1015,14 +1707,14 @@ var SearchableSelect = React6.forwardRef(
|
|
|
1015
1707
|
SearchableSelect.displayName = "SearchableSelect";
|
|
1016
1708
|
|
|
1017
1709
|
// src/components/forms/select.tsx
|
|
1018
|
-
var
|
|
1710
|
+
var React10 = __toESM(require("react"), 1);
|
|
1019
1711
|
var SelectPrimitive = __toESM(require("@radix-ui/react-select"), 1);
|
|
1020
|
-
var
|
|
1021
|
-
var
|
|
1712
|
+
var import_lucide_react11 = require("lucide-react");
|
|
1713
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
1022
1714
|
var Select = SelectPrimitive.Root;
|
|
1023
1715
|
var SelectGroup = SelectPrimitive.Group;
|
|
1024
1716
|
var SelectValue = SelectPrimitive.Value;
|
|
1025
|
-
var SelectTrigger =
|
|
1717
|
+
var SelectTrigger = React10.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
|
|
1026
1718
|
SelectPrimitive.Trigger,
|
|
1027
1719
|
{
|
|
1028
1720
|
ref,
|
|
@@ -1033,24 +1725,24 @@ var SelectTrigger = React7.forwardRef(({ className, children, ...props }, ref) =
|
|
|
1033
1725
|
...props,
|
|
1034
1726
|
children: [
|
|
1035
1727
|
children,
|
|
1036
|
-
/* @__PURE__ */ (0,
|
|
1728
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react11.ChevronDown, { className: "h-4 w-4 opacity-50" }) })
|
|
1037
1729
|
]
|
|
1038
1730
|
}
|
|
1039
1731
|
));
|
|
1040
1732
|
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
|
1041
|
-
var SelectScrollUpButton =
|
|
1733
|
+
var SelectScrollUpButton = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPrimitive.ScrollUpButton, { ref, className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react11.ChevronUp, { className: "h-4 w-4" }) }));
|
|
1042
1734
|
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
|
|
1043
|
-
var SelectScrollDownButton =
|
|
1735
|
+
var SelectScrollDownButton = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
1044
1736
|
SelectPrimitive.ScrollDownButton,
|
|
1045
1737
|
{
|
|
1046
1738
|
ref,
|
|
1047
1739
|
className: cn("flex cursor-default items-center justify-center py-1", className),
|
|
1048
1740
|
...props,
|
|
1049
|
-
children: /* @__PURE__ */ (0,
|
|
1741
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react11.ChevronDown, { className: "h-4 w-4" })
|
|
1050
1742
|
}
|
|
1051
1743
|
));
|
|
1052
1744
|
SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
|
|
1053
|
-
var SelectContent =
|
|
1745
|
+
var SelectContent = React10.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
|
|
1054
1746
|
SelectPrimitive.Content,
|
|
1055
1747
|
{
|
|
1056
1748
|
ref,
|
|
@@ -1062,8 +1754,8 @@ var SelectContent = React7.forwardRef(({ className, children, position = "popper
|
|
|
1062
1754
|
position,
|
|
1063
1755
|
...props,
|
|
1064
1756
|
children: [
|
|
1065
|
-
/* @__PURE__ */ (0,
|
|
1066
|
-
/* @__PURE__ */ (0,
|
|
1757
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectScrollUpButton, {}),
|
|
1758
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
1067
1759
|
SelectPrimitive.Viewport,
|
|
1068
1760
|
{
|
|
1069
1761
|
className: cn(
|
|
@@ -1073,14 +1765,14 @@ var SelectContent = React7.forwardRef(({ className, children, position = "popper
|
|
|
1073
1765
|
children
|
|
1074
1766
|
}
|
|
1075
1767
|
),
|
|
1076
|
-
/* @__PURE__ */ (0,
|
|
1768
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectScrollDownButton, {})
|
|
1077
1769
|
]
|
|
1078
1770
|
}
|
|
1079
1771
|
) }));
|
|
1080
1772
|
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
1081
|
-
var SelectLabel =
|
|
1773
|
+
var SelectLabel = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPrimitive.Label, { ref, className: cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className), ...props }));
|
|
1082
1774
|
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
|
1083
|
-
var SelectItem =
|
|
1775
|
+
var SelectItem = React10.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
|
|
1084
1776
|
SelectPrimitive.Item,
|
|
1085
1777
|
{
|
|
1086
1778
|
ref,
|
|
@@ -1090,80 +1782,80 @@ var SelectItem = React7.forwardRef(({ className, children, ...props }, ref) => /
|
|
|
1090
1782
|
),
|
|
1091
1783
|
...props,
|
|
1092
1784
|
children: [
|
|
1093
|
-
/* @__PURE__ */ (0,
|
|
1094
|
-
/* @__PURE__ */ (0,
|
|
1785
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react11.Check, { className: "h-4 w-4" }) }) }),
|
|
1786
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPrimitive.ItemText, { children })
|
|
1095
1787
|
]
|
|
1096
1788
|
}
|
|
1097
1789
|
));
|
|
1098
1790
|
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
|
1099
|
-
var SelectSeparator =
|
|
1791
|
+
var SelectSeparator = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SelectPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props }));
|
|
1100
1792
|
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
1101
1793
|
|
|
1102
1794
|
// src/components/layout/app-shell.tsx
|
|
1103
1795
|
var import_react2 = require("react");
|
|
1104
1796
|
|
|
1105
1797
|
// src/components/overlays/drawer.tsx
|
|
1106
|
-
var
|
|
1798
|
+
var React11 = __toESM(require("react"), 1);
|
|
1107
1799
|
var import_vaul = require("vaul");
|
|
1108
|
-
var
|
|
1109
|
-
var Drawer = ({ shouldScaleBackground = true, ...props }) => /* @__PURE__ */ (0,
|
|
1800
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
1801
|
+
var Drawer = ({ shouldScaleBackground = true, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_vaul.Drawer.Root, { shouldScaleBackground, ...props });
|
|
1110
1802
|
Drawer.displayName = "Drawer";
|
|
1111
1803
|
var DrawerTrigger = import_vaul.Drawer.Trigger;
|
|
1112
1804
|
var DrawerPortal = import_vaul.Drawer.Portal;
|
|
1113
1805
|
var DrawerClose = import_vaul.Drawer.Close;
|
|
1114
|
-
var DrawerOverlay =
|
|
1806
|
+
var DrawerOverlay = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_vaul.Drawer.Overlay, { ref, className: cn("fixed inset-0 z-50 bg-black/80", className), ...props }));
|
|
1115
1807
|
DrawerOverlay.displayName = import_vaul.Drawer.Overlay.displayName;
|
|
1116
|
-
var DrawerContent =
|
|
1117
|
-
/* @__PURE__ */ (0,
|
|
1118
|
-
/* @__PURE__ */ (0,
|
|
1808
|
+
var DrawerContent = React11.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(DrawerPortal, { children: [
|
|
1809
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(DrawerOverlay, {}),
|
|
1810
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
1119
1811
|
import_vaul.Drawer.Content,
|
|
1120
1812
|
{
|
|
1121
1813
|
ref,
|
|
1122
1814
|
className: cn("fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background", className),
|
|
1123
1815
|
...props,
|
|
1124
1816
|
children: [
|
|
1125
|
-
/* @__PURE__ */ (0,
|
|
1817
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" }),
|
|
1126
1818
|
children
|
|
1127
1819
|
]
|
|
1128
1820
|
}
|
|
1129
1821
|
)
|
|
1130
1822
|
] }));
|
|
1131
1823
|
DrawerContent.displayName = "DrawerContent";
|
|
1132
|
-
var DrawerHeader = ({ className, ...props }) => /* @__PURE__ */ (0,
|
|
1824
|
+
var DrawerHeader = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: cn("grid gap-1.5 p-4 text-center sm:text-left", className), ...props });
|
|
1133
1825
|
DrawerHeader.displayName = "DrawerHeader";
|
|
1134
|
-
var DrawerFooter = ({ className, ...props }) => /* @__PURE__ */ (0,
|
|
1826
|
+
var DrawerFooter = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: cn("mt-auto flex flex-col gap-2 p-4", className), ...props });
|
|
1135
1827
|
DrawerFooter.displayName = "DrawerFooter";
|
|
1136
|
-
var DrawerTitle =
|
|
1828
|
+
var DrawerTitle = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_vaul.Drawer.Title, { ref, className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props }));
|
|
1137
1829
|
DrawerTitle.displayName = import_vaul.Drawer.Title.displayName;
|
|
1138
|
-
var DrawerDescription =
|
|
1830
|
+
var DrawerDescription = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_vaul.Drawer.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
1139
1831
|
DrawerDescription.displayName = import_vaul.Drawer.Description.displayName;
|
|
1140
1832
|
|
|
1141
1833
|
// src/components/navigation/navbar.tsx
|
|
1142
|
-
var
|
|
1143
|
-
var
|
|
1834
|
+
var import_lucide_react12 = require("lucide-react");
|
|
1835
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
1144
1836
|
function Navbar({ brand, actions, onMenuClick, className }) {
|
|
1145
|
-
return /* @__PURE__ */ (0,
|
|
1146
|
-
/* @__PURE__ */ (0,
|
|
1147
|
-
onMenuClick ? /* @__PURE__ */ (0,
|
|
1837
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("header", { className: cn("h-14 shrink-0 border-b border-border bg-card/80 px-4 backdrop-blur-sm", className), children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "mx-auto flex h-full w-full max-w-7xl items-center justify-between gap-3", children: [
|
|
1838
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [
|
|
1839
|
+
onMenuClick ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Button, { type: "button", variant: "ghost", size: "icon", onClick: onMenuClick, "aria-label": "Open navigation", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react12.Menu, { size: 20 }) }) : null,
|
|
1148
1840
|
brand
|
|
1149
1841
|
] }),
|
|
1150
|
-
actions ? /* @__PURE__ */ (0,
|
|
1842
|
+
actions ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "flex shrink-0 items-center gap-3", children: actions }) : null
|
|
1151
1843
|
] }) });
|
|
1152
1844
|
}
|
|
1153
1845
|
|
|
1154
1846
|
// src/components/navigation/sidebar.tsx
|
|
1155
|
-
var
|
|
1847
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
1156
1848
|
function getInitials2(name) {
|
|
1157
1849
|
return name.trim().split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join("");
|
|
1158
1850
|
}
|
|
1159
1851
|
function Sidebar({ brand, groups, user, footerAction, className }) {
|
|
1160
|
-
return /* @__PURE__ */ (0,
|
|
1161
|
-
/* @__PURE__ */ (0,
|
|
1162
|
-
/* @__PURE__ */ (0,
|
|
1163
|
-
/* @__PURE__ */ (0,
|
|
1164
|
-
/* @__PURE__ */ (0,
|
|
1852
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("aside", { className: cn("flex h-full w-72 max-w-[85vw] flex-col border-r border-border bg-background", className), children: [
|
|
1853
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "border-b border-border px-5 py-4", children: brand }),
|
|
1854
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("nav", { className: "flex-1 space-y-6 overflow-y-auto px-3 py-4", children: groups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
|
|
1855
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "mb-2 px-2 text-xs font-semibold uppercase tracking-widest text-muted-foreground", children: group.label }),
|
|
1856
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("ul", { className: "space-y-0.5", children: group.items.map((item) => {
|
|
1165
1857
|
const Icon2 = item.icon;
|
|
1166
|
-
return /* @__PURE__ */ (0,
|
|
1858
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
1167
1859
|
"a",
|
|
1168
1860
|
{
|
|
1169
1861
|
href: item.href,
|
|
@@ -1173,26 +1865,26 @@ function Sidebar({ brand, groups, user, footerAction, className }) {
|
|
|
1173
1865
|
item.active ? "bg-primary text-primary-foreground" : "text-foreground hover:bg-accent hover:text-accent-foreground"
|
|
1174
1866
|
),
|
|
1175
1867
|
children: [
|
|
1176
|
-
Icon2 ? /* @__PURE__ */ (0,
|
|
1177
|
-
/* @__PURE__ */ (0,
|
|
1868
|
+
Icon2 ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Icon2, { size: 17, className: "shrink-0" }) : null,
|
|
1869
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "flex-1", children: item.label })
|
|
1178
1870
|
]
|
|
1179
1871
|
}
|
|
1180
1872
|
) }, `${group.label}-${item.label}`);
|
|
1181
1873
|
}) })
|
|
1182
1874
|
] }, group.label)) }),
|
|
1183
|
-
user ? /* @__PURE__ */ (0,
|
|
1184
|
-
/* @__PURE__ */ (0,
|
|
1185
|
-
/* @__PURE__ */ (0,
|
|
1186
|
-
/* @__PURE__ */ (0,
|
|
1187
|
-
user.role ? /* @__PURE__ */ (0,
|
|
1875
|
+
user ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "border-t border-border px-5 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
1876
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Avatar, { className: "h-9 w-9 shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(AvatarFallback, { className: "bg-primary text-xs font-semibold text-primary-foreground", children: user.initials ?? getInitials2(user.name) }) }),
|
|
1877
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "min-w-0 flex-1", children: [
|
|
1878
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "truncate text-sm font-medium text-foreground", children: user.name }),
|
|
1879
|
+
user.role ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "truncate text-xs text-muted-foreground", children: user.role }) : null
|
|
1188
1880
|
] }),
|
|
1189
|
-
footerAction ? /* @__PURE__ */ (0,
|
|
1881
|
+
footerAction ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Button, { type: "button", variant: "ghost", size: "sm", onClick: footerAction.onClick, children: footerAction.label }) : null
|
|
1190
1882
|
] }) }) : null
|
|
1191
1883
|
] });
|
|
1192
1884
|
}
|
|
1193
1885
|
|
|
1194
1886
|
// src/components/layout/app-shell.tsx
|
|
1195
|
-
var
|
|
1887
|
+
var import_jsx_runtime30 = require("react/jsx-runtime");
|
|
1196
1888
|
function AppShell({
|
|
1197
1889
|
brand,
|
|
1198
1890
|
actions,
|
|
@@ -1202,47 +1894,47 @@ function AppShell({
|
|
|
1202
1894
|
children
|
|
1203
1895
|
}) {
|
|
1204
1896
|
const [open, setOpen] = (0, import_react2.useState)(false);
|
|
1205
|
-
return /* @__PURE__ */ (0,
|
|
1206
|
-
/* @__PURE__ */ (0,
|
|
1207
|
-
/* @__PURE__ */ (0,
|
|
1208
|
-
/* @__PURE__ */ (0,
|
|
1897
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "min-h-screen bg-background", children: [
|
|
1898
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Navbar, { brand, actions, onMenuClick: () => setOpen(true) }),
|
|
1899
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Drawer, { open, onOpenChange: setOpen, direction: "left", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(DrawerContent, { className: "h-full w-72 rounded-none border-r border-border p-0", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Sidebar, { brand, groups: sidebarGroups, user: sidebarUser, footerAction: sidebarFooterAction }) }) }),
|
|
1900
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("main", { className: "mx-auto w-full max-w-7xl px-4 py-6 sm:px-6", children })
|
|
1209
1901
|
] });
|
|
1210
1902
|
}
|
|
1211
1903
|
|
|
1212
1904
|
// src/components/layout/form-section.tsx
|
|
1213
|
-
var
|
|
1905
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
1214
1906
|
function FormSection({ title, description, children }) {
|
|
1215
|
-
return /* @__PURE__ */ (0,
|
|
1216
|
-
/* @__PURE__ */ (0,
|
|
1217
|
-
/* @__PURE__ */ (0,
|
|
1218
|
-
description ? /* @__PURE__ */ (0,
|
|
1907
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(Card, { children: [
|
|
1908
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(CardHeader, { children: [
|
|
1909
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(CardTitle, { children: title }),
|
|
1910
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(CardDescription, { children: description }) : null
|
|
1219
1911
|
] }),
|
|
1220
|
-
/* @__PURE__ */ (0,
|
|
1912
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(CardContent, { children })
|
|
1221
1913
|
] });
|
|
1222
1914
|
}
|
|
1223
1915
|
|
|
1224
1916
|
// src/components/layout/page-header.tsx
|
|
1225
|
-
var
|
|
1917
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
1226
1918
|
function PageHeader({ title, description, action }) {
|
|
1227
|
-
return /* @__PURE__ */ (0,
|
|
1228
|
-
/* @__PURE__ */ (0,
|
|
1229
|
-
/* @__PURE__ */ (0,
|
|
1230
|
-
description ? /* @__PURE__ */ (0,
|
|
1919
|
+
return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex items-start justify-between gap-4 sm:flex-row sm:items-center", children: [
|
|
1920
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { children: [
|
|
1921
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)("h1", { className: "text-2xl font-semibold text-foreground", style: { fontFamily: "var(--font-display)" }, children: title }),
|
|
1922
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
|
|
1231
1923
|
] }),
|
|
1232
|
-
action ? /* @__PURE__ */ (0,
|
|
1924
|
+
action ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { children: action }) : null
|
|
1233
1925
|
] });
|
|
1234
1926
|
}
|
|
1235
1927
|
|
|
1236
1928
|
// src/components/layout/theme-toggle.tsx
|
|
1237
|
-
var
|
|
1238
|
-
var
|
|
1929
|
+
var import_lucide_react13 = require("lucide-react");
|
|
1930
|
+
var import_jsx_runtime33 = require("react/jsx-runtime");
|
|
1239
1931
|
var options = [
|
|
1240
|
-
{ value: "light", Icon:
|
|
1241
|
-
{ value: "dark", Icon:
|
|
1932
|
+
{ value: "light", Icon: import_lucide_react13.Sun, label: "Light" },
|
|
1933
|
+
{ value: "dark", Icon: import_lucide_react13.Moon, label: "Dark" }
|
|
1242
1934
|
];
|
|
1243
1935
|
function ThemeToggle({ className }) {
|
|
1244
1936
|
const { theme, setTheme } = useTheme();
|
|
1245
|
-
return /* @__PURE__ */ (0,
|
|
1937
|
+
return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: cn("flex items-center gap-1 rounded-lg border border-border bg-muted p-1", className), children: options.map(({ value, Icon: Icon2, label }) => /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
1246
1938
|
"button",
|
|
1247
1939
|
{
|
|
1248
1940
|
type: "button",
|
|
@@ -1253,8 +1945,8 @@ function ThemeToggle({ className }) {
|
|
|
1253
1945
|
theme === value ? "bg-card text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
|
|
1254
1946
|
),
|
|
1255
1947
|
children: [
|
|
1256
|
-
/* @__PURE__ */ (0,
|
|
1257
|
-
/* @__PURE__ */ (0,
|
|
1948
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Icon2, { size: 13 }),
|
|
1949
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { children: label })
|
|
1258
1950
|
]
|
|
1259
1951
|
},
|
|
1260
1952
|
value
|
|
@@ -1262,188 +1954,69 @@ function ThemeToggle({ className }) {
|
|
|
1262
1954
|
}
|
|
1263
1955
|
|
|
1264
1956
|
// src/components/navigation/breadcrumb.tsx
|
|
1265
|
-
var
|
|
1957
|
+
var React12 = __toESM(require("react"), 1);
|
|
1266
1958
|
var import_react_slot2 = require("@radix-ui/react-slot");
|
|
1267
|
-
var
|
|
1268
|
-
var
|
|
1269
|
-
var Breadcrumb =
|
|
1959
|
+
var import_lucide_react14 = require("lucide-react");
|
|
1960
|
+
var import_jsx_runtime34 = require("react/jsx-runtime");
|
|
1961
|
+
var Breadcrumb = React12.forwardRef(({ ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("nav", { ref, "aria-label": "breadcrumb", ...props }));
|
|
1270
1962
|
Breadcrumb.displayName = "Breadcrumb";
|
|
1271
|
-
var BreadcrumbList =
|
|
1272
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1963
|
+
var BreadcrumbList = React12.forwardRef(
|
|
1964
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
|
|
1273
1965
|
"ol",
|
|
1274
1966
|
{
|
|
1275
|
-
ref,
|
|
1276
|
-
className: cn("flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", className),
|
|
1277
|
-
...props
|
|
1278
|
-
}
|
|
1279
|
-
)
|
|
1280
|
-
);
|
|
1281
|
-
BreadcrumbList.displayName = "BreadcrumbList";
|
|
1282
|
-
var BreadcrumbItem =
|
|
1283
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1284
|
-
);
|
|
1285
|
-
BreadcrumbItem.displayName = "BreadcrumbItem";
|
|
1286
|
-
var BreadcrumbLink =
|
|
1287
|
-
const Comp = asChild ? import_react_slot2.Slot : "a";
|
|
1288
|
-
return /* @__PURE__ */ (0,
|
|
1289
|
-
});
|
|
1290
|
-
BreadcrumbLink.displayName = "BreadcrumbLink";
|
|
1291
|
-
var BreadcrumbPage =
|
|
1292
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1293
|
-
"span",
|
|
1294
|
-
{
|
|
1295
|
-
ref,
|
|
1296
|
-
role: "link",
|
|
1297
|
-
"aria-disabled": "true",
|
|
1298
|
-
"aria-current": "page",
|
|
1299
|
-
className: cn("font-normal text-foreground", className),
|
|
1300
|
-
...props
|
|
1301
|
-
}
|
|
1302
|
-
)
|
|
1303
|
-
);
|
|
1304
|
-
BreadcrumbPage.displayName = "BreadcrumbPage";
|
|
1305
|
-
var BreadcrumbSeparator = ({ children, className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("li", { role: "presentation", "aria-hidden": "true", className: cn("[&>svg]:h-3.5 [&>svg]:w-3.5", className), ...props, children: children ?? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react8.ChevronRight, {}) });
|
|
1306
|
-
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
|
|
1307
|
-
var BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("span", { role: "presentation", "aria-hidden": "true", className: cn("flex h-9 w-9 items-center justify-center", className), ...props, children: [
|
|
1308
|
-
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_lucide_react8.MoreHorizontal, { className: "h-4 w-4" }),
|
|
1309
|
-
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "sr-only", children: "More" })
|
|
1310
|
-
] });
|
|
1311
|
-
BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
|
|
1312
|
-
|
|
1313
|
-
// src/components/navigation/page-breadcrumb.tsx
|
|
1314
|
-
var import_react3 = require("react");
|
|
1315
|
-
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
1316
|
-
function PageBreadcrumb({ items }) {
|
|
1317
|
-
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Breadcrumb, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(BreadcrumbList, { children: items.map((item, index) => {
|
|
1318
|
-
const isLast = index === items.length - 1;
|
|
1319
|
-
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_react3.Fragment, { children: [
|
|
1320
|
-
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(BreadcrumbItem, { children: !isLast && item.href ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(BreadcrumbLink, { href: item.href, children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(BreadcrumbPage, { children: item.label }) }),
|
|
1321
|
-
!isLast ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(BreadcrumbSeparator, {}) : null
|
|
1322
|
-
] }, `${item.label}-${index}`);
|
|
1323
|
-
}) }) });
|
|
1324
|
-
}
|
|
1325
|
-
|
|
1326
|
-
// src/components/navigation/steps.tsx
|
|
1327
|
-
var import_lucide_react9 = require("lucide-react");
|
|
1328
|
-
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
1329
|
-
var indicatorStyles = {
|
|
1330
|
-
complete: "border-primary bg-primary text-primary-foreground",
|
|
1331
|
-
current: "border-primary bg-primary/10 text-primary",
|
|
1332
|
-
upcoming: "border-border bg-background text-muted-foreground",
|
|
1333
|
-
error: "border-destructive bg-destructive/10 text-destructive"
|
|
1334
|
-
};
|
|
1335
|
-
function Steps({ className, items, orientation = "horizontal" }) {
|
|
1336
|
-
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("ol", { className: cn("flex", orientation === "horizontal" ? "flex-col gap-4 md:flex-row" : "flex-col", className), children: items.map((item, index) => {
|
|
1337
|
-
const status = item.status ?? "upcoming";
|
|
1338
|
-
const isLast = index === items.length - 1;
|
|
1339
|
-
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
1340
|
-
"li",
|
|
1341
|
-
{
|
|
1342
|
-
className: cn("relative", orientation === "horizontal" ? "flex-1" : "pb-6 last:pb-0"),
|
|
1343
|
-
children: [
|
|
1344
|
-
!isLast ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1345
|
-
"span",
|
|
1346
|
-
{
|
|
1347
|
-
"aria-hidden": "true",
|
|
1348
|
-
className: cn(
|
|
1349
|
-
"absolute bg-border",
|
|
1350
|
-
orientation === "horizontal" ? "left-[calc(50%+1rem)] top-4 hidden h-px w-[calc(100%-1rem)] md:block" : "left-4 top-9 h-[calc(100%-1rem)] w-px"
|
|
1351
|
-
)
|
|
1352
|
-
}
|
|
1353
|
-
) : null,
|
|
1354
|
-
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: cn(
|
|
1355
|
-
orientation === "horizontal" ? "flex flex-col items-center gap-2 text-center" : "flex items-start gap-3"
|
|
1356
|
-
), children: [
|
|
1357
|
-
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
1358
|
-
"span",
|
|
1359
|
-
{
|
|
1360
|
-
className: cn(
|
|
1361
|
-
"relative z-10 inline-flex h-8 w-8 items-center justify-center rounded-full border text-sm font-semibold shadow-sm",
|
|
1362
|
-
indicatorStyles[status]
|
|
1363
|
-
),
|
|
1364
|
-
children: [
|
|
1365
|
-
status === "complete" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react9.Check, { className: "h-4 w-4" }) : null,
|
|
1366
|
-
status === "error" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react9.AlertCircle, { className: "h-4 w-4" }) : null,
|
|
1367
|
-
status === "current" || status === "upcoming" ? index + 1 : null
|
|
1368
|
-
]
|
|
1369
|
-
}
|
|
1370
|
-
),
|
|
1371
|
-
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: cn("grid gap-1", orientation === "vertical" && "pt-1"), children: [
|
|
1372
|
-
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: cn("text-sm font-medium", status === "upcoming" ? "text-muted-foreground" : "text-foreground"), children: item.title }),
|
|
1373
|
-
item.description ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "text-xs text-muted-foreground", children: item.description }) : null
|
|
1374
|
-
] })
|
|
1375
|
-
] })
|
|
1376
|
-
]
|
|
1377
|
-
},
|
|
1378
|
-
item.id ?? item.title
|
|
1379
|
-
);
|
|
1380
|
-
}) });
|
|
1381
|
-
}
|
|
1382
|
-
|
|
1383
|
-
// src/components/overlays/dialog.tsx
|
|
1384
|
-
var React10 = __toESM(require("react"), 1);
|
|
1385
|
-
var DialogPrimitive = __toESM(require("@radix-ui/react-dialog"), 1);
|
|
1386
|
-
var import_lucide_react10 = require("lucide-react");
|
|
1387
|
-
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
1388
|
-
var Dialog = DialogPrimitive.Root;
|
|
1389
|
-
var DialogTrigger = DialogPrimitive.Trigger;
|
|
1390
|
-
var DialogPortal = DialogPrimitive.Portal;
|
|
1391
|
-
var DialogClose = DialogPrimitive.Close;
|
|
1392
|
-
var DialogOverlay = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
1393
|
-
DialogPrimitive.Overlay,
|
|
1394
|
-
{
|
|
1395
|
-
ref,
|
|
1396
|
-
className: cn(
|
|
1397
|
-
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
1398
|
-
className
|
|
1399
|
-
),
|
|
1400
|
-
...props
|
|
1401
|
-
}
|
|
1402
|
-
));
|
|
1403
|
-
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
1404
|
-
var DialogContent = React10.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(DialogPortal, { children: [
|
|
1405
|
-
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogOverlay, {}),
|
|
1406
|
-
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
1407
|
-
DialogPrimitive.Content,
|
|
1967
|
+
ref,
|
|
1968
|
+
className: cn("flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", className),
|
|
1969
|
+
...props
|
|
1970
|
+
}
|
|
1971
|
+
)
|
|
1972
|
+
);
|
|
1973
|
+
BreadcrumbList.displayName = "BreadcrumbList";
|
|
1974
|
+
var BreadcrumbItem = React12.forwardRef(
|
|
1975
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("li", { ref, className: cn("inline-flex items-center gap-1.5", className), ...props })
|
|
1976
|
+
);
|
|
1977
|
+
BreadcrumbItem.displayName = "BreadcrumbItem";
|
|
1978
|
+
var BreadcrumbLink = React12.forwardRef(({ asChild, className, ...props }, ref) => {
|
|
1979
|
+
const Comp = asChild ? import_react_slot2.Slot : "a";
|
|
1980
|
+
return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Comp, { ref, className: cn("transition-colors hover:text-foreground", className), ...props });
|
|
1981
|
+
});
|
|
1982
|
+
BreadcrumbLink.displayName = "BreadcrumbLink";
|
|
1983
|
+
var BreadcrumbPage = React12.forwardRef(
|
|
1984
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
|
|
1985
|
+
"span",
|
|
1408
1986
|
{
|
|
1409
1987
|
ref,
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
),
|
|
1414
|
-
...props
|
|
1415
|
-
children: [
|
|
1416
|
-
children,
|
|
1417
|
-
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
|
|
1418
|
-
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react10.X, { className: "h-4 w-4" }),
|
|
1419
|
-
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "sr-only", children: "Close" })
|
|
1420
|
-
] })
|
|
1421
|
-
]
|
|
1988
|
+
role: "link",
|
|
1989
|
+
"aria-disabled": "true",
|
|
1990
|
+
"aria-current": "page",
|
|
1991
|
+
className: cn("font-normal text-foreground", className),
|
|
1992
|
+
...props
|
|
1422
1993
|
}
|
|
1423
1994
|
)
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
var
|
|
1427
|
-
|
|
1428
|
-
var
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1995
|
+
);
|
|
1996
|
+
BreadcrumbPage.displayName = "BreadcrumbPage";
|
|
1997
|
+
var BreadcrumbSeparator = ({ children, className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("li", { role: "presentation", "aria-hidden": "true", className: cn("[&>svg]:h-3.5 [&>svg]:w-3.5", className), ...props, children: children ?? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react14.ChevronRight, {}) });
|
|
1998
|
+
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
|
|
1999
|
+
var BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { role: "presentation", "aria-hidden": "true", className: cn("flex h-9 w-9 items-center justify-center", className), ...props, children: [
|
|
2000
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_lucide_react14.MoreHorizontal, { className: "h-4 w-4" }),
|
|
2001
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "sr-only", children: "More" })
|
|
2002
|
+
] });
|
|
2003
|
+
BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
|
|
2004
|
+
|
|
2005
|
+
// src/components/navigation/header-user-menu.tsx
|
|
2006
|
+
var import_lucide_react16 = require("lucide-react");
|
|
1434
2007
|
|
|
1435
2008
|
// src/components/overlays/dropdown-menu.tsx
|
|
1436
|
-
var
|
|
2009
|
+
var React13 = __toESM(require("react"), 1);
|
|
1437
2010
|
var DropdownMenuPrimitive = __toESM(require("@radix-ui/react-dropdown-menu"), 1);
|
|
1438
|
-
var
|
|
1439
|
-
var
|
|
2011
|
+
var import_lucide_react15 = require("lucide-react");
|
|
2012
|
+
var import_jsx_runtime35 = require("react/jsx-runtime");
|
|
1440
2013
|
var DropdownMenu = DropdownMenuPrimitive.Root;
|
|
1441
2014
|
var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
|
|
1442
2015
|
var DropdownMenuGroup = DropdownMenuPrimitive.Group;
|
|
1443
2016
|
var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
|
|
1444
2017
|
var DropdownMenuSub = DropdownMenuPrimitive.Sub;
|
|
1445
2018
|
var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
|
|
1446
|
-
var DropdownMenuSubTrigger =
|
|
2019
|
+
var DropdownMenuSubTrigger = React13.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
|
|
1447
2020
|
DropdownMenuPrimitive.SubTrigger,
|
|
1448
2021
|
{
|
|
1449
2022
|
ref,
|
|
@@ -1455,12 +2028,12 @@ var DropdownMenuSubTrigger = React11.forwardRef(({ className, inset, children, .
|
|
|
1455
2028
|
...props,
|
|
1456
2029
|
children: [
|
|
1457
2030
|
children,
|
|
1458
|
-
/* @__PURE__ */ (0,
|
|
2031
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_lucide_react15.ChevronRight, { className: "ml-auto" })
|
|
1459
2032
|
]
|
|
1460
2033
|
}
|
|
1461
2034
|
));
|
|
1462
2035
|
DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
|
|
1463
|
-
var DropdownMenuSubContent =
|
|
2036
|
+
var DropdownMenuSubContent = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
1464
2037
|
DropdownMenuPrimitive.SubContent,
|
|
1465
2038
|
{
|
|
1466
2039
|
ref,
|
|
@@ -1472,7 +2045,7 @@ var DropdownMenuSubContent = React11.forwardRef(({ className, ...props }, ref) =
|
|
|
1472
2045
|
}
|
|
1473
2046
|
));
|
|
1474
2047
|
DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
|
|
1475
|
-
var DropdownMenuContent =
|
|
2048
|
+
var DropdownMenuContent = React13.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
1476
2049
|
DropdownMenuPrimitive.Content,
|
|
1477
2050
|
{
|
|
1478
2051
|
ref,
|
|
@@ -1485,7 +2058,7 @@ var DropdownMenuContent = React11.forwardRef(({ className, sideOffset = 4, ...pr
|
|
|
1485
2058
|
}
|
|
1486
2059
|
) }));
|
|
1487
2060
|
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
|
|
1488
|
-
var DropdownMenuItem =
|
|
2061
|
+
var DropdownMenuItem = React13.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
1489
2062
|
DropdownMenuPrimitive.Item,
|
|
1490
2063
|
{
|
|
1491
2064
|
ref,
|
|
@@ -1498,7 +2071,7 @@ var DropdownMenuItem = React11.forwardRef(({ className, inset, ...props }, ref)
|
|
|
1498
2071
|
}
|
|
1499
2072
|
));
|
|
1500
2073
|
DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
|
|
1501
|
-
var DropdownMenuCheckboxItem =
|
|
2074
|
+
var DropdownMenuCheckboxItem = React13.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
|
|
1502
2075
|
DropdownMenuPrimitive.CheckboxItem,
|
|
1503
2076
|
{
|
|
1504
2077
|
ref,
|
|
@@ -1509,13 +2082,13 @@ var DropdownMenuCheckboxItem = React11.forwardRef(({ className, children, checke
|
|
|
1509
2082
|
...checked !== void 0 ? { checked } : {},
|
|
1510
2083
|
...props,
|
|
1511
2084
|
children: [
|
|
1512
|
-
/* @__PURE__ */ (0,
|
|
2085
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_lucide_react15.Check, { className: "h-4 w-4" }) }) }),
|
|
1513
2086
|
children
|
|
1514
2087
|
]
|
|
1515
2088
|
}
|
|
1516
2089
|
));
|
|
1517
2090
|
DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
|
|
1518
|
-
var DropdownMenuRadioItem =
|
|
2091
|
+
var DropdownMenuRadioItem = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
|
|
1519
2092
|
DropdownMenuPrimitive.RadioItem,
|
|
1520
2093
|
{
|
|
1521
2094
|
ref,
|
|
@@ -1525,84 +2098,208 @@ var DropdownMenuRadioItem = React11.forwardRef(({ className, children, ...props
|
|
|
1525
2098
|
),
|
|
1526
2099
|
...props,
|
|
1527
2100
|
children: [
|
|
1528
|
-
/* @__PURE__ */ (0,
|
|
2101
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_lucide_react15.Circle, { className: "h-2 w-2 fill-current" }) }) }),
|
|
1529
2102
|
children
|
|
1530
2103
|
]
|
|
1531
2104
|
}
|
|
1532
2105
|
));
|
|
1533
2106
|
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
|
|
1534
|
-
var DropdownMenuLabel =
|
|
2107
|
+
var DropdownMenuLabel = React13.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(DropdownMenuPrimitive.Label, { ref, className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className), ...props }));
|
|
1535
2108
|
DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
|
|
1536
|
-
var DropdownMenuSeparator =
|
|
2109
|
+
var DropdownMenuSeparator = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(DropdownMenuPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props }));
|
|
1537
2110
|
DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
|
|
1538
|
-
var DropdownMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ (0,
|
|
2111
|
+
var DropdownMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: cn("ml-auto text-xs tracking-widest opacity-60", className), ...props });
|
|
1539
2112
|
DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
|
|
1540
2113
|
|
|
1541
|
-
// src/components/
|
|
1542
|
-
var
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
2114
|
+
// src/components/navigation/header-user-menu.tsx
|
|
2115
|
+
var import_jsx_runtime36 = require("react/jsx-runtime");
|
|
2116
|
+
function getInitials3(name) {
|
|
2117
|
+
return name.trim().split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join("");
|
|
2118
|
+
}
|
|
2119
|
+
function HeaderUserMenu({
|
|
2120
|
+
className,
|
|
2121
|
+
name,
|
|
2122
|
+
email,
|
|
2123
|
+
role,
|
|
2124
|
+
initials,
|
|
2125
|
+
avatarSrc,
|
|
2126
|
+
logoutLabel = "Cerrar sesion",
|
|
2127
|
+
onLogout,
|
|
2128
|
+
extraItems
|
|
2129
|
+
}) {
|
|
2130
|
+
return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(DropdownMenu, { children: [
|
|
2131
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
2132
|
+
"button",
|
|
2133
|
+
{
|
|
2134
|
+
type: "button",
|
|
2135
|
+
"aria-label": "Menu de usuario",
|
|
2136
|
+
className: cn(
|
|
2137
|
+
"flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1.5 transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
2138
|
+
className
|
|
2139
|
+
),
|
|
2140
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(Avatar, { className: "h-8 w-8", children: [
|
|
2141
|
+
avatarSrc ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(AvatarImage, { src: avatarSrc, alt: name }) : null,
|
|
2142
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(AvatarFallback, { className: "bg-primary text-xs font-semibold text-primary-foreground", children: initials ?? getInitials3(name) })
|
|
2143
|
+
] })
|
|
2144
|
+
}
|
|
2145
|
+
) }),
|
|
2146
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(DropdownMenuContent, { align: "end", className: "w-60", children: [
|
|
2147
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(DropdownMenuLabel, { className: "font-normal", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "flex gap-2", children: [
|
|
2148
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "grid min-w-0 flex-1 gap-1", children: [
|
|
2149
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "truncate text-sm font-semibold text-foreground", children: name }),
|
|
2150
|
+
email ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "truncate text-xs text-muted-foreground", children: email }) : null
|
|
2151
|
+
] }),
|
|
2152
|
+
role ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Badge, { variant: "outline", className: "h-fit max-w-[110px] truncate", children: role }) : null
|
|
2153
|
+
] }) }),
|
|
2154
|
+
extraItems ? /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
|
|
2155
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(DropdownMenuSeparator, {}),
|
|
2156
|
+
extraItems
|
|
2157
|
+
] }) : null,
|
|
2158
|
+
onLogout ? /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
|
|
2159
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(DropdownMenuSeparator, {}),
|
|
2160
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
|
|
2161
|
+
DropdownMenuItem,
|
|
2162
|
+
{
|
|
2163
|
+
onClick: onLogout,
|
|
2164
|
+
className: "cursor-pointer gap-2 text-destructive focus:bg-destructive/10 focus:text-destructive",
|
|
2165
|
+
children: [
|
|
2166
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_lucide_react16.LogOut, { className: "h-4 w-4" }),
|
|
2167
|
+
logoutLabel
|
|
2168
|
+
]
|
|
2169
|
+
}
|
|
2170
|
+
)
|
|
2171
|
+
] }) : null
|
|
2172
|
+
] })
|
|
2173
|
+
] });
|
|
2174
|
+
}
|
|
2175
|
+
|
|
2176
|
+
// src/components/navigation/page-breadcrumb.tsx
|
|
2177
|
+
var import_react3 = require("react");
|
|
2178
|
+
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
2179
|
+
function PageBreadcrumb({ items }) {
|
|
2180
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Breadcrumb, { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(BreadcrumbList, { children: items.map((item, index) => {
|
|
2181
|
+
const isLast = index === items.length - 1;
|
|
2182
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_react3.Fragment, { children: [
|
|
2183
|
+
/* @__PURE__ */ (0, import_jsx_runtime37.jsx)(BreadcrumbItem, { children: !isLast && item.href ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(BreadcrumbLink, { href: item.href, children: item.label }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(BreadcrumbPage, { children: item.label }) }),
|
|
2184
|
+
!isLast ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(BreadcrumbSeparator, {}) : null
|
|
2185
|
+
] }, `${item.label}-${index}`);
|
|
2186
|
+
}) }) });
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
// src/components/navigation/steps.tsx
|
|
2190
|
+
var import_lucide_react17 = require("lucide-react");
|
|
2191
|
+
var import_jsx_runtime38 = require("react/jsx-runtime");
|
|
2192
|
+
var indicatorStyles = {
|
|
2193
|
+
complete: "border-primary bg-primary text-primary-foreground",
|
|
2194
|
+
current: "border-primary bg-primary/10 text-primary",
|
|
2195
|
+
upcoming: "border-border bg-background text-muted-foreground",
|
|
2196
|
+
error: "border-destructive bg-destructive/10 text-destructive"
|
|
2197
|
+
};
|
|
2198
|
+
function Steps({ className, items, orientation = "horizontal" }) {
|
|
2199
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("ol", { className: cn("flex", orientation === "horizontal" ? "flex-col gap-4 md:flex-row" : "flex-col", className), children: items.map((item, index) => {
|
|
2200
|
+
const status = item.status ?? "upcoming";
|
|
2201
|
+
const isLast = index === items.length - 1;
|
|
2202
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
|
|
2203
|
+
"li",
|
|
2204
|
+
{
|
|
2205
|
+
className: cn("relative", orientation === "horizontal" ? "flex-1" : "pb-6 last:pb-0"),
|
|
2206
|
+
children: [
|
|
2207
|
+
!isLast ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
2208
|
+
"span",
|
|
2209
|
+
{
|
|
2210
|
+
"aria-hidden": "true",
|
|
2211
|
+
className: cn(
|
|
2212
|
+
"absolute bg-border",
|
|
2213
|
+
orientation === "horizontal" ? "left-[calc(50%+1rem)] top-4 hidden h-px w-[calc(100%-1rem)] md:block" : "left-4 top-9 h-[calc(100%-1rem)] w-px"
|
|
2214
|
+
)
|
|
2215
|
+
}
|
|
2216
|
+
) : null,
|
|
2217
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: cn(
|
|
2218
|
+
orientation === "horizontal" ? "flex flex-col items-center gap-2 text-center" : "flex items-start gap-3"
|
|
2219
|
+
), children: [
|
|
2220
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
|
|
2221
|
+
"span",
|
|
2222
|
+
{
|
|
2223
|
+
className: cn(
|
|
2224
|
+
"relative z-10 inline-flex h-8 w-8 items-center justify-center rounded-full border text-sm font-semibold shadow-sm",
|
|
2225
|
+
indicatorStyles[status]
|
|
2226
|
+
),
|
|
2227
|
+
children: [
|
|
2228
|
+
status === "complete" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_lucide_react17.Check, { className: "h-4 w-4" }) : null,
|
|
2229
|
+
status === "error" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_lucide_react17.AlertCircle, { className: "h-4 w-4" }) : null,
|
|
2230
|
+
status === "current" || status === "upcoming" ? index + 1 : null
|
|
2231
|
+
]
|
|
2232
|
+
}
|
|
2233
|
+
),
|
|
2234
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: cn("grid gap-1", orientation === "vertical" && "pt-1"), children: [
|
|
2235
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("p", { className: cn("text-sm font-medium", status === "upcoming" ? "text-muted-foreground" : "text-foreground"), children: item.title }),
|
|
2236
|
+
item.description ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("p", { className: "text-xs text-muted-foreground", children: item.description }) : null
|
|
2237
|
+
] })
|
|
2238
|
+
] })
|
|
2239
|
+
]
|
|
2240
|
+
},
|
|
2241
|
+
item.id ?? item.title
|
|
2242
|
+
);
|
|
2243
|
+
}) });
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2246
|
+
// src/components/overlays/dialog.tsx
|
|
2247
|
+
var React14 = __toESM(require("react"), 1);
|
|
2248
|
+
var DialogPrimitive = __toESM(require("@radix-ui/react-dialog"), 1);
|
|
2249
|
+
var import_lucide_react18 = require("lucide-react");
|
|
2250
|
+
var import_jsx_runtime39 = require("react/jsx-runtime");
|
|
2251
|
+
var Dialog = DialogPrimitive.Root;
|
|
2252
|
+
var DialogTrigger = DialogPrimitive.Trigger;
|
|
2253
|
+
var DialogPortal = DialogPrimitive.Portal;
|
|
2254
|
+
var DialogClose = DialogPrimitive.Close;
|
|
2255
|
+
var DialogOverlay = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
|
|
2256
|
+
DialogPrimitive.Overlay,
|
|
1553
2257
|
{
|
|
2258
|
+
ref,
|
|
1554
2259
|
className: cn(
|
|
1555
2260
|
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
1556
2261
|
className
|
|
1557
2262
|
),
|
|
1558
|
-
...props
|
|
1559
|
-
ref
|
|
2263
|
+
...props
|
|
1560
2264
|
}
|
|
1561
2265
|
));
|
|
1562
|
-
|
|
1563
|
-
var
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
left
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
2266
|
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
2267
|
+
var DialogContent = React14.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(DialogPortal, { children: [
|
|
2268
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)(DialogOverlay, {}),
|
|
2269
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(
|
|
2270
|
+
DialogPrimitive.Content,
|
|
2271
|
+
{
|
|
2272
|
+
ref,
|
|
2273
|
+
className: cn(
|
|
2274
|
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
|
2275
|
+
className
|
|
2276
|
+
),
|
|
2277
|
+
...props,
|
|
2278
|
+
children: [
|
|
2279
|
+
children,
|
|
2280
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
|
|
2281
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_lucide_react18.X, { className: "h-4 w-4" }),
|
|
2282
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "sr-only", children: "Close" })
|
|
2283
|
+
] })
|
|
2284
|
+
]
|
|
1576
2285
|
}
|
|
1577
|
-
|
|
1578
|
-
);
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
] })
|
|
1589
|
-
] })
|
|
1590
|
-
);
|
|
1591
|
-
SheetContent.displayName = SheetPrimitive.Content.displayName;
|
|
1592
|
-
var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: cn("flex flex-col space-y-2 text-center sm:text-left", className), ...props });
|
|
1593
|
-
SheetHeader.displayName = "SheetHeader";
|
|
1594
|
-
var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props });
|
|
1595
|
-
SheetFooter.displayName = "SheetFooter";
|
|
1596
|
-
var SheetTitle = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SheetPrimitive.Title, { ref, className: cn("text-lg font-semibold text-foreground", className), ...props }));
|
|
1597
|
-
SheetTitle.displayName = SheetPrimitive.Title.displayName;
|
|
1598
|
-
var SheetDescription = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(SheetPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
1599
|
-
SheetDescription.displayName = SheetPrimitive.Description.displayName;
|
|
2286
|
+
)
|
|
2287
|
+
] }));
|
|
2288
|
+
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
2289
|
+
var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props });
|
|
2290
|
+
DialogHeader.displayName = "DialogHeader";
|
|
2291
|
+
var DialogFooter = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props });
|
|
2292
|
+
DialogFooter.displayName = "DialogFooter";
|
|
2293
|
+
var DialogTitle = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(DialogPrimitive.Title, { ref, className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props }));
|
|
2294
|
+
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
2295
|
+
var DialogDescription = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(DialogPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
2296
|
+
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
1600
2297
|
|
|
1601
2298
|
// src/components/primitives/alert.tsx
|
|
1602
|
-
var
|
|
1603
|
-
var
|
|
1604
|
-
var
|
|
1605
|
-
var alertVariants = (0,
|
|
2299
|
+
var React15 = __toESM(require("react"), 1);
|
|
2300
|
+
var import_class_variance_authority5 = require("class-variance-authority");
|
|
2301
|
+
var import_jsx_runtime40 = require("react/jsx-runtime");
|
|
2302
|
+
var alertVariants = (0, import_class_variance_authority5.cva)("relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground", {
|
|
1606
2303
|
variants: {
|
|
1607
2304
|
variant: {
|
|
1608
2305
|
default: "bg-background text-foreground",
|
|
@@ -1613,43 +2310,23 @@ var alertVariants = (0, import_class_variance_authority4.cva)("relative w-full r
|
|
|
1613
2310
|
variant: "default"
|
|
1614
2311
|
}
|
|
1615
2312
|
});
|
|
1616
|
-
var Alert =
|
|
2313
|
+
var Alert = React15.forwardRef(({ className, variant, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { ref, role: "alert", className: cn(alertVariants({ variant }), className), ...props }));
|
|
1617
2314
|
Alert.displayName = "Alert";
|
|
1618
|
-
var AlertTitle =
|
|
1619
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2315
|
+
var AlertTitle = React15.forwardRef(
|
|
2316
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("h5", { ref, className: cn("mb-1 font-medium leading-none tracking-tight", className), ...props })
|
|
1620
2317
|
);
|
|
1621
2318
|
AlertTitle.displayName = "AlertTitle";
|
|
1622
|
-
var AlertDescription =
|
|
1623
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2319
|
+
var AlertDescription = React15.forwardRef(
|
|
2320
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { ref, className: cn("text-sm [&_p]:leading-relaxed", className), ...props })
|
|
1624
2321
|
);
|
|
1625
2322
|
AlertDescription.displayName = "AlertDescription";
|
|
1626
2323
|
|
|
1627
|
-
// src/components/primitives/badge.tsx
|
|
1628
|
-
var import_class_variance_authority5 = require("class-variance-authority");
|
|
1629
|
-
var import_jsx_runtime33 = require("react/jsx-runtime");
|
|
1630
|
-
var badgeVariants = (0, import_class_variance_authority5.cva)("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", {
|
|
1631
|
-
variants: {
|
|
1632
|
-
variant: {
|
|
1633
|
-
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
|
1634
|
-
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
1635
|
-
destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
|
|
1636
|
-
outline: "text-foreground"
|
|
1637
|
-
}
|
|
1638
|
-
},
|
|
1639
|
-
defaultVariants: {
|
|
1640
|
-
variant: "default"
|
|
1641
|
-
}
|
|
1642
|
-
});
|
|
1643
|
-
function Badge({ className, variant, ...props }) {
|
|
1644
|
-
return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: cn(badgeVariants({ variant }), className), ...props });
|
|
1645
|
-
}
|
|
1646
|
-
|
|
1647
2324
|
// src/components/primitives/checkbox.tsx
|
|
1648
|
-
var
|
|
1649
|
-
var
|
|
1650
|
-
var
|
|
1651
|
-
var Checkbox =
|
|
1652
|
-
/* @__PURE__ */ (0,
|
|
2325
|
+
var React16 = __toESM(require("react"), 1);
|
|
2326
|
+
var import_lucide_react19 = require("lucide-react");
|
|
2327
|
+
var import_jsx_runtime41 = require("react/jsx-runtime");
|
|
2328
|
+
var Checkbox = React16.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("span", { className: "relative inline-flex h-4 w-4 shrink-0", children: [
|
|
2329
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
1653
2330
|
"input",
|
|
1654
2331
|
{
|
|
1655
2332
|
ref,
|
|
@@ -1661,8 +2338,8 @@ var Checkbox = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
1661
2338
|
...props
|
|
1662
2339
|
}
|
|
1663
2340
|
),
|
|
1664
|
-
/* @__PURE__ */ (0,
|
|
1665
|
-
|
|
2341
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
2342
|
+
import_lucide_react19.Check,
|
|
1666
2343
|
{
|
|
1667
2344
|
"aria-hidden": "true",
|
|
1668
2345
|
className: "pointer-events-none absolute left-1/2 top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 text-primary-foreground opacity-0 transition-opacity peer-checked:opacity-100"
|
|
@@ -1671,18 +2348,18 @@ var Checkbox = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
1671
2348
|
] }));
|
|
1672
2349
|
Checkbox.displayName = "Checkbox";
|
|
1673
2350
|
function CheckboxField({ id, label, description, containerClassName, className, ...props }) {
|
|
1674
|
-
const generatedId =
|
|
2351
|
+
const generatedId = React16.useId();
|
|
1675
2352
|
const inputId = id ?? generatedId;
|
|
1676
|
-
return /* @__PURE__ */ (0,
|
|
2353
|
+
return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
|
|
1677
2354
|
"label",
|
|
1678
2355
|
{
|
|
1679
2356
|
htmlFor: inputId,
|
|
1680
2357
|
className: cn("flex items-center gap-3 rounded-lg border border-border bg-card p-3 transition-colors hover:bg-accent/30", containerClassName),
|
|
1681
2358
|
children: [
|
|
1682
|
-
/* @__PURE__ */ (0,
|
|
1683
|
-
/* @__PURE__ */ (0,
|
|
1684
|
-
/* @__PURE__ */ (0,
|
|
1685
|
-
description ? /* @__PURE__ */ (0,
|
|
2359
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Checkbox, { id: inputId, className, ...props }),
|
|
2360
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("span", { className: "grid gap-1", children: [
|
|
2361
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "text-sm font-medium text-foreground", children: label }),
|
|
2362
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
1686
2363
|
] })
|
|
1687
2364
|
]
|
|
1688
2365
|
}
|
|
@@ -1690,21 +2367,21 @@ function CheckboxField({ id, label, description, containerClassName, className,
|
|
|
1690
2367
|
}
|
|
1691
2368
|
|
|
1692
2369
|
// src/components/primitives/label.tsx
|
|
1693
|
-
var
|
|
2370
|
+
var React17 = __toESM(require("react"), 1);
|
|
1694
2371
|
var LabelPrimitive = __toESM(require("@radix-ui/react-label"), 1);
|
|
1695
2372
|
var import_class_variance_authority6 = require("class-variance-authority");
|
|
1696
|
-
var
|
|
2373
|
+
var import_jsx_runtime42 = require("react/jsx-runtime");
|
|
1697
2374
|
var labelVariants = (0, import_class_variance_authority6.cva)("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70");
|
|
1698
|
-
var Label3 =
|
|
2375
|
+
var Label3 = React17.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(LabelPrimitive.Root, { ref, className: cn(labelVariants(), className), ...props }));
|
|
1699
2376
|
Label3.displayName = LabelPrimitive.Root.displayName;
|
|
1700
2377
|
|
|
1701
2378
|
// src/components/primitives/radio-group.tsx
|
|
1702
|
-
var
|
|
1703
|
-
var
|
|
1704
|
-
var RadioGroup2 =
|
|
2379
|
+
var React18 = __toESM(require("react"), 1);
|
|
2380
|
+
var import_jsx_runtime43 = require("react/jsx-runtime");
|
|
2381
|
+
var RadioGroup2 = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { ref, role: "radiogroup", className: cn("grid gap-3", className), ...props }));
|
|
1705
2382
|
RadioGroup2.displayName = "RadioGroup";
|
|
1706
|
-
var RadioGroupItem =
|
|
1707
|
-
/* @__PURE__ */ (0,
|
|
2383
|
+
var RadioGroupItem = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("span", { className: "relative inline-flex h-4 w-4 shrink-0", children: [
|
|
2384
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
|
|
1708
2385
|
"input",
|
|
1709
2386
|
{
|
|
1710
2387
|
ref,
|
|
@@ -1716,7 +2393,7 @@ var RadioGroupItem = React16.forwardRef(({ className, ...props }, ref) => /* @__
|
|
|
1716
2393
|
...props
|
|
1717
2394
|
}
|
|
1718
2395
|
),
|
|
1719
|
-
/* @__PURE__ */ (0,
|
|
2396
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
|
|
1720
2397
|
"span",
|
|
1721
2398
|
{
|
|
1722
2399
|
"aria-hidden": "true",
|
|
@@ -1726,18 +2403,18 @@ var RadioGroupItem = React16.forwardRef(({ className, ...props }, ref) => /* @__
|
|
|
1726
2403
|
] }));
|
|
1727
2404
|
RadioGroupItem.displayName = "RadioGroupItem";
|
|
1728
2405
|
function RadioField({ id, label, description, containerClassName, className, ...props }) {
|
|
1729
|
-
const generatedId =
|
|
2406
|
+
const generatedId = React18.useId();
|
|
1730
2407
|
const inputId = id ?? generatedId;
|
|
1731
|
-
return /* @__PURE__ */ (0,
|
|
2408
|
+
return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
|
|
1732
2409
|
"label",
|
|
1733
2410
|
{
|
|
1734
2411
|
htmlFor: inputId,
|
|
1735
2412
|
className: cn("flex items-center gap-3 rounded-lg border border-border bg-card p-3 transition-colors hover:bg-accent/30", containerClassName),
|
|
1736
2413
|
children: [
|
|
1737
|
-
/* @__PURE__ */ (0,
|
|
1738
|
-
/* @__PURE__ */ (0,
|
|
1739
|
-
/* @__PURE__ */ (0,
|
|
1740
|
-
description ? /* @__PURE__ */ (0,
|
|
2414
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)(RadioGroupItem, { id: inputId, className, ...props }),
|
|
2415
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("span", { className: "grid gap-1", children: [
|
|
2416
|
+
/* @__PURE__ */ (0, import_jsx_runtime43.jsx)("span", { className: "text-sm font-medium text-foreground", children: label }),
|
|
2417
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("span", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
1741
2418
|
] })
|
|
1742
2419
|
]
|
|
1743
2420
|
}
|
|
@@ -1745,10 +2422,10 @@ function RadioField({ id, label, description, containerClassName, className, ...
|
|
|
1745
2422
|
}
|
|
1746
2423
|
|
|
1747
2424
|
// src/components/primitives/separator.tsx
|
|
1748
|
-
var
|
|
2425
|
+
var React19 = __toESM(require("react"), 1);
|
|
1749
2426
|
var SeparatorPrimitive = __toESM(require("@radix-ui/react-separator"), 1);
|
|
1750
|
-
var
|
|
1751
|
-
var Separator3 =
|
|
2427
|
+
var import_jsx_runtime44 = require("react/jsx-runtime");
|
|
2428
|
+
var Separator3 = React19.forwardRef(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
1752
2429
|
SeparatorPrimitive.Root,
|
|
1753
2430
|
{
|
|
1754
2431
|
ref,
|
|
@@ -1761,11 +2438,11 @@ var Separator3 = React17.forwardRef(({ className, orientation = "horizontal", de
|
|
|
1761
2438
|
Separator3.displayName = SeparatorPrimitive.Root.displayName;
|
|
1762
2439
|
|
|
1763
2440
|
// src/components/primitives/switch.tsx
|
|
1764
|
-
var
|
|
1765
|
-
var
|
|
1766
|
-
var Switch =
|
|
2441
|
+
var React20 = __toESM(require("react"), 1);
|
|
2442
|
+
var import_jsx_runtime45 = require("react/jsx-runtime");
|
|
2443
|
+
var Switch = React20.forwardRef(({ className, size = "default", ...props }, ref) => {
|
|
1767
2444
|
const isSm = size === "sm";
|
|
1768
|
-
return /* @__PURE__ */ (0,
|
|
2445
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
1769
2446
|
"span",
|
|
1770
2447
|
{
|
|
1771
2448
|
className: cn(
|
|
@@ -1773,7 +2450,7 @@ var Switch = React18.forwardRef(({ className, size = "default", ...props }, ref)
|
|
|
1773
2450
|
isSm ? "h-4 w-7" : "h-6 w-10"
|
|
1774
2451
|
),
|
|
1775
2452
|
children: [
|
|
1776
|
-
/* @__PURE__ */ (0,
|
|
2453
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
1777
2454
|
"input",
|
|
1778
2455
|
{
|
|
1779
2456
|
ref,
|
|
@@ -1789,7 +2466,7 @@ var Switch = React18.forwardRef(({ className, size = "default", ...props }, ref)
|
|
|
1789
2466
|
...props
|
|
1790
2467
|
}
|
|
1791
2468
|
),
|
|
1792
|
-
/* @__PURE__ */ (0,
|
|
2469
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
1793
2470
|
"span",
|
|
1794
2471
|
{
|
|
1795
2472
|
"aria-hidden": "true",
|
|
@@ -1805,9 +2482,9 @@ var Switch = React18.forwardRef(({ className, size = "default", ...props }, ref)
|
|
|
1805
2482
|
});
|
|
1806
2483
|
Switch.displayName = "Switch";
|
|
1807
2484
|
function SwitchField({ id, label, description, containerClassName, size, className, ...props }) {
|
|
1808
|
-
const generatedId =
|
|
2485
|
+
const generatedId = React20.useId();
|
|
1809
2486
|
const inputId = id ?? generatedId;
|
|
1810
|
-
return /* @__PURE__ */ (0,
|
|
2487
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
1811
2488
|
"label",
|
|
1812
2489
|
{
|
|
1813
2490
|
htmlFor: inputId,
|
|
@@ -1817,43 +2494,27 @@ function SwitchField({ id, label, description, containerClassName, size, classNa
|
|
|
1817
2494
|
containerClassName
|
|
1818
2495
|
),
|
|
1819
2496
|
children: [
|
|
1820
|
-
/* @__PURE__ */ (0,
|
|
1821
|
-
/* @__PURE__ */ (0,
|
|
1822
|
-
description ? /* @__PURE__ */ (0,
|
|
2497
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("span", { className: "grid gap-0.5", children: [
|
|
2498
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "text-sm font-medium text-foreground", children: label }),
|
|
2499
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
1823
2500
|
] }),
|
|
1824
|
-
/* @__PURE__ */ (0,
|
|
2501
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Switch, { id: inputId, size, className, ...props })
|
|
1825
2502
|
]
|
|
1826
2503
|
}
|
|
1827
2504
|
);
|
|
1828
2505
|
}
|
|
1829
2506
|
|
|
1830
|
-
// src/components/primitives/textarea.tsx
|
|
1831
|
-
var React19 = __toESM(require("react"), 1);
|
|
1832
|
-
var import_jsx_runtime39 = require("react/jsx-runtime");
|
|
1833
|
-
var Textarea = React19.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
|
|
1834
|
-
"textarea",
|
|
1835
|
-
{
|
|
1836
|
-
ref,
|
|
1837
|
-
className: cn(
|
|
1838
|
-
"flex min-h-24 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
|
|
1839
|
-
className
|
|
1840
|
-
),
|
|
1841
|
-
...props
|
|
1842
|
-
}
|
|
1843
|
-
));
|
|
1844
|
-
Textarea.displayName = "Textarea";
|
|
1845
|
-
|
|
1846
2507
|
// src/components/tables/data-table.tsx
|
|
1847
2508
|
var import_react4 = require("react");
|
|
1848
|
-
var
|
|
1849
|
-
var
|
|
2509
|
+
var import_lucide_react20 = require("lucide-react");
|
|
2510
|
+
var import_jsx_runtime46 = require("react/jsx-runtime");
|
|
1850
2511
|
function getCellContent(row, column) {
|
|
1851
2512
|
if (column.render) {
|
|
1852
2513
|
return column.render(row);
|
|
1853
2514
|
}
|
|
1854
2515
|
const value = row[column.key];
|
|
1855
2516
|
if (value === null || value === void 0) {
|
|
1856
|
-
return /* @__PURE__ */ (0,
|
|
2517
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "text-muted-foreground/40", children: "-" });
|
|
1857
2518
|
}
|
|
1858
2519
|
if (typeof value === "boolean") {
|
|
1859
2520
|
return value ? "Yes" : "No";
|
|
@@ -1890,10 +2551,10 @@ function DataTable({
|
|
|
1890
2551
|
setSearch(value);
|
|
1891
2552
|
setPage(0);
|
|
1892
2553
|
}
|
|
1893
|
-
return /* @__PURE__ */ (0,
|
|
1894
|
-
/* @__PURE__ */ (0,
|
|
1895
|
-
/* @__PURE__ */ (0,
|
|
1896
|
-
/* @__PURE__ */ (0,
|
|
2554
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "space-y-4", children: [
|
|
2555
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "relative", children: [
|
|
2556
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_lucide_react20.Search, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
|
|
2557
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
1897
2558
|
Input,
|
|
1898
2559
|
{
|
|
1899
2560
|
placeholder: "Search...",
|
|
@@ -1903,25 +2564,25 @@ function DataTable({
|
|
|
1903
2564
|
}
|
|
1904
2565
|
)
|
|
1905
2566
|
] }),
|
|
1906
|
-
/* @__PURE__ */ (0,
|
|
1907
|
-
/* @__PURE__ */ (0,
|
|
1908
|
-
columns.map((column) => /* @__PURE__ */ (0,
|
|
1909
|
-
actions ? /* @__PURE__ */ (0,
|
|
2567
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "hidden rounded-lg border md:block", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(Table, { children: [
|
|
2568
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(TableRow, { children: [
|
|
2569
|
+
columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableHead, { children: column.label }, String(column.key))),
|
|
2570
|
+
actions ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableHead, { className: "w-[100px] text-right", children: "Actions" }) : null
|
|
1910
2571
|
] }) }),
|
|
1911
|
-
/* @__PURE__ */ (0,
|
|
1912
|
-
columns.map((column) => /* @__PURE__ */ (0,
|
|
1913
|
-
actions ? /* @__PURE__ */ (0,
|
|
1914
|
-
] }, index)) : paginated.length === 0 ? /* @__PURE__ */ (0,
|
|
1915
|
-
columns.map((column) => /* @__PURE__ */ (0,
|
|
1916
|
-
actions ? /* @__PURE__ */ (0,
|
|
2572
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableBody, { children: isLoading ? Array.from({ length: SKELETON_ROWS }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(TableRow, { children: [
|
|
2573
|
+
columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-4 w-full" }) }, String(column.key))),
|
|
2574
|
+
actions ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "ml-auto h-8 w-20" }) }) : null
|
|
2575
|
+
] }, index)) : paginated.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableCell, { colSpan: columns.length + (actions ? 1 : 0), className: "py-12 text-center text-muted-foreground", children: emptyMessage }) }) : paginated.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(TableRow, { children: [
|
|
2576
|
+
columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableCell, { children: getCellContent(row, column) }, String(column.key))),
|
|
2577
|
+
actions ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "flex justify-end gap-1.5", children: actions(row) }) }) : null
|
|
1917
2578
|
] }, index)) })
|
|
1918
2579
|
] }) }),
|
|
1919
|
-
/* @__PURE__ */ (0,
|
|
1920
|
-
/* @__PURE__ */ (0,
|
|
1921
|
-
/* @__PURE__ */ (0,
|
|
1922
|
-
/* @__PURE__ */ (0,
|
|
1923
|
-
] }) }, index)) : paginated.length === 0 ? /* @__PURE__ */ (0,
|
|
1924
|
-
/* @__PURE__ */ (0,
|
|
2580
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "space-y-3 md:hidden", children: isLoading ? Array.from({ length: SKELETON_ROWS }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Card, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(CardContent, { className: "space-y-2 p-4", children: [
|
|
2581
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-5 w-1/2" }),
|
|
2582
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-4 w-2/3" }),
|
|
2583
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Skeleton, { className: "h-4 w-1/3" })
|
|
2584
|
+
] }) }, index)) : paginated.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("p", { className: "py-10 text-center text-muted-foreground", children: emptyMessage }) : paginated.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Card, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(CardContent, { className: "space-y-3 p-4", children: [
|
|
2585
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "space-y-1.5", children: mobileColumns.map((column, mobileIndex) => /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
|
|
1925
2586
|
"div",
|
|
1926
2587
|
{
|
|
1927
2588
|
className: cn(
|
|
@@ -1929,27 +2590,27 @@ function DataTable({
|
|
|
1929
2590
|
mobileIndex === 0 ? "text-sm font-medium text-foreground" : "text-xs text-muted-foreground"
|
|
1930
2591
|
),
|
|
1931
2592
|
children: [
|
|
1932
|
-
mobileIndex > 0 ? /* @__PURE__ */ (0,
|
|
2593
|
+
mobileIndex > 0 ? /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "shrink-0 font-medium text-foreground/50", children: [
|
|
1933
2594
|
column.label,
|
|
1934
2595
|
":"
|
|
1935
2596
|
] }) : null,
|
|
1936
|
-
/* @__PURE__ */ (0,
|
|
2597
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "truncate", children: getCellContent(row, column) })
|
|
1937
2598
|
]
|
|
1938
2599
|
},
|
|
1939
2600
|
String(column.key)
|
|
1940
2601
|
)) }),
|
|
1941
|
-
actions ? /* @__PURE__ */ (0,
|
|
2602
|
+
actions ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "flex gap-2 border-t border-border pt-2", children: actions(row) }) : null
|
|
1942
2603
|
] }) }, index)) }),
|
|
1943
|
-
!isLoading && filtered.length > pageSize ? /* @__PURE__ */ (0,
|
|
1944
|
-
/* @__PURE__ */ (0,
|
|
2604
|
+
!isLoading && filtered.length > pageSize ? /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
2605
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "text-sm text-muted-foreground", children: [
|
|
1945
2606
|
filtered.length,
|
|
1946
2607
|
" records \xB7 Page ",
|
|
1947
2608
|
currentPage + 1,
|
|
1948
2609
|
" of ",
|
|
1949
2610
|
totalPages
|
|
1950
2611
|
] }),
|
|
1951
|
-
/* @__PURE__ */ (0,
|
|
1952
|
-
/* @__PURE__ */ (0,
|
|
2612
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex gap-1", children: [
|
|
2613
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
1953
2614
|
Button,
|
|
1954
2615
|
{
|
|
1955
2616
|
variant: "outline",
|
|
@@ -1957,10 +2618,10 @@ function DataTable({
|
|
|
1957
2618
|
className: "h-8 w-8",
|
|
1958
2619
|
onClick: () => setPage((previous) => Math.max(0, previous - 1)),
|
|
1959
2620
|
disabled: currentPage === 0,
|
|
1960
|
-
children: /* @__PURE__ */ (0,
|
|
2621
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_lucide_react20.ChevronLeft, { className: "h-4 w-4" })
|
|
1961
2622
|
}
|
|
1962
2623
|
),
|
|
1963
|
-
/* @__PURE__ */ (0,
|
|
2624
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
1964
2625
|
Button,
|
|
1965
2626
|
{
|
|
1966
2627
|
variant: "outline",
|
|
@@ -1968,7 +2629,7 @@ function DataTable({
|
|
|
1968
2629
|
className: "h-8 w-8",
|
|
1969
2630
|
onClick: () => setPage((previous) => Math.min(totalPages - 1, previous + 1)),
|
|
1970
2631
|
disabled: currentPage >= totalPages - 1,
|
|
1971
|
-
children: /* @__PURE__ */ (0,
|
|
2632
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_lucide_react20.ChevronRight, { className: "h-4 w-4" })
|
|
1972
2633
|
}
|
|
1973
2634
|
)
|
|
1974
2635
|
] })
|
|
@@ -1977,15 +2638,15 @@ function DataTable({
|
|
|
1977
2638
|
}
|
|
1978
2639
|
|
|
1979
2640
|
// src/components/tables/table-row-actions.tsx
|
|
1980
|
-
var
|
|
1981
|
-
var
|
|
2641
|
+
var import_lucide_react21 = require("lucide-react");
|
|
2642
|
+
var import_jsx_runtime47 = require("react/jsx-runtime");
|
|
1982
2643
|
function TableRowActions({ className, label = "Abrir acciones", menuLabel = "Acciones", items }) {
|
|
1983
|
-
return /* @__PURE__ */ (0,
|
|
1984
|
-
/* @__PURE__ */ (0,
|
|
1985
|
-
/* @__PURE__ */ (0,
|
|
1986
|
-
/* @__PURE__ */ (0,
|
|
1987
|
-
/* @__PURE__ */ (0,
|
|
1988
|
-
items.map((item) => /* @__PURE__ */ (0,
|
|
2644
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(DropdownMenu, { children: [
|
|
2645
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Button, { variant: "ghost", size: "icon", className: cn("h-8 w-8 shadow-none", className), "aria-label": label, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_lucide_react21.MoreHorizontal, { className: "h-4 w-4" }) }) }),
|
|
2646
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(DropdownMenuContent, { align: "end", className: "w-48", children: [
|
|
2647
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(DropdownMenuLabel, { children: menuLabel }),
|
|
2648
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(DropdownMenuSeparator, {}),
|
|
2649
|
+
items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(
|
|
1989
2650
|
DropdownMenuItem,
|
|
1990
2651
|
{
|
|
1991
2652
|
disabled: item.disabled,
|
|
@@ -1994,7 +2655,7 @@ function TableRowActions({ className, label = "Abrir acciones", menuLabel = "Acc
|
|
|
1994
2655
|
children: [
|
|
1995
2656
|
item.icon,
|
|
1996
2657
|
item.label,
|
|
1997
|
-
item.shortcut ? /* @__PURE__ */ (0,
|
|
2658
|
+
item.shortcut ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(DropdownMenuShortcut, { children: item.shortcut }) : null
|
|
1998
2659
|
]
|
|
1999
2660
|
},
|
|
2000
2661
|
item.label
|
|
@@ -2004,6 +2665,23 @@ function TableRowActions({ className, label = "Abrir acciones", menuLabel = "Acc
|
|
|
2004
2665
|
}
|
|
2005
2666
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2006
2667
|
0 && (module.exports = {
|
|
2668
|
+
AiChatAssistantMessage,
|
|
2669
|
+
AiChatComposer,
|
|
2670
|
+
AiChatEmptyState,
|
|
2671
|
+
AiChatFloatingButton,
|
|
2672
|
+
AiChatFloatingSidebar,
|
|
2673
|
+
AiChatHeader,
|
|
2674
|
+
AiChatLayout,
|
|
2675
|
+
AiChatMessage,
|
|
2676
|
+
AiChatMessageList,
|
|
2677
|
+
AiChatPanel,
|
|
2678
|
+
AiChatSidebar,
|
|
2679
|
+
AiChatSidebarHeader,
|
|
2680
|
+
AiChatSummaryAction,
|
|
2681
|
+
AiChatSummaryActions,
|
|
2682
|
+
AiChatThreadButton,
|
|
2683
|
+
AiChatThreadList,
|
|
2684
|
+
AiChatUserMessage,
|
|
2007
2685
|
Alert,
|
|
2008
2686
|
AlertDescription,
|
|
2009
2687
|
AlertTitle,
|
|
@@ -2068,14 +2746,17 @@ function TableRowActions({ className, label = "Abrir acciones", menuLabel = "Acc
|
|
|
2068
2746
|
DropdownMenuSubContent,
|
|
2069
2747
|
DropdownMenuSubTrigger,
|
|
2070
2748
|
DropdownMenuTrigger,
|
|
2749
|
+
EmptyState,
|
|
2071
2750
|
FeatureIcon,
|
|
2072
2751
|
FormSection,
|
|
2752
|
+
HeaderUserMenu,
|
|
2073
2753
|
Input,
|
|
2074
2754
|
Label,
|
|
2075
2755
|
LoadingCard,
|
|
2076
2756
|
LoadingState,
|
|
2077
2757
|
LoadingTableRows,
|
|
2078
2758
|
ModuleIconButton,
|
|
2759
|
+
ModuleSkeleton,
|
|
2079
2760
|
Navbar,
|
|
2080
2761
|
NotificationAction,
|
|
2081
2762
|
NotificationMessage,
|
|
@@ -2115,6 +2796,8 @@ function TableRowActions({ className, label = "Abrir acciones", menuLabel = "Acc
|
|
|
2115
2796
|
Steps,
|
|
2116
2797
|
Switch,
|
|
2117
2798
|
SwitchField,
|
|
2799
|
+
SyncStatusBadge,
|
|
2800
|
+
SyncStatusBar,
|
|
2118
2801
|
Table,
|
|
2119
2802
|
TableBody,
|
|
2120
2803
|
TableCaption,
|