@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.js
CHANGED
|
@@ -68,6 +68,505 @@ function cn(...inputs) {
|
|
|
68
68
|
return twMerge(clsx(inputs));
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
// src/components/ai/ai-chat.tsx
|
|
72
|
+
import * as React4 from "react";
|
|
73
|
+
import { Bot, Clock3, MessageSquareText, PanelRightOpen, Send, Sparkles } from "lucide-react";
|
|
74
|
+
|
|
75
|
+
// src/components/overlays/sheet.tsx
|
|
76
|
+
import * as React from "react";
|
|
77
|
+
import * as SheetPrimitive from "@radix-ui/react-dialog";
|
|
78
|
+
import { cva } from "class-variance-authority";
|
|
79
|
+
import { X } from "lucide-react";
|
|
80
|
+
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
81
|
+
var Sheet = SheetPrimitive.Root;
|
|
82
|
+
var SheetTrigger = SheetPrimitive.Trigger;
|
|
83
|
+
var SheetClose = SheetPrimitive.Close;
|
|
84
|
+
var SheetPortal = SheetPrimitive.Portal;
|
|
85
|
+
var SheetOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
86
|
+
SheetPrimitive.Overlay,
|
|
87
|
+
{
|
|
88
|
+
className: cn(
|
|
89
|
+
"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",
|
|
90
|
+
className
|
|
91
|
+
),
|
|
92
|
+
...props,
|
|
93
|
+
ref
|
|
94
|
+
}
|
|
95
|
+
));
|
|
96
|
+
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
|
|
97
|
+
var sheetVariants = cva(
|
|
98
|
+
"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",
|
|
99
|
+
{
|
|
100
|
+
variants: {
|
|
101
|
+
side: {
|
|
102
|
+
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
103
|
+
bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
104
|
+
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",
|
|
105
|
+
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"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
defaultVariants: {
|
|
109
|
+
side: "right"
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
var SheetContent = React.forwardRef(
|
|
114
|
+
({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ jsxs(SheetPortal, { children: [
|
|
115
|
+
/* @__PURE__ */ jsx2(SheetOverlay, {}),
|
|
116
|
+
/* @__PURE__ */ jsxs(SheetPrimitive.Content, { ref, className: cn(sheetVariants({ side }), className), ...props, children: [
|
|
117
|
+
children,
|
|
118
|
+
/* @__PURE__ */ 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: [
|
|
119
|
+
/* @__PURE__ */ jsx2(X, { className: "h-4 w-4" }),
|
|
120
|
+
/* @__PURE__ */ jsx2("span", { className: "sr-only", children: "Close" })
|
|
121
|
+
] })
|
|
122
|
+
] })
|
|
123
|
+
] })
|
|
124
|
+
);
|
|
125
|
+
SheetContent.displayName = SheetPrimitive.Content.displayName;
|
|
126
|
+
var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx2("div", { className: cn("flex flex-col space-y-2 text-center sm:text-left", className), ...props });
|
|
127
|
+
SheetHeader.displayName = "SheetHeader";
|
|
128
|
+
var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ jsx2("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props });
|
|
129
|
+
SheetFooter.displayName = "SheetFooter";
|
|
130
|
+
var SheetTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(SheetPrimitive.Title, { ref, className: cn("text-lg font-semibold text-foreground", className), ...props }));
|
|
131
|
+
SheetTitle.displayName = SheetPrimitive.Title.displayName;
|
|
132
|
+
var SheetDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(SheetPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
133
|
+
SheetDescription.displayName = SheetPrimitive.Description.displayName;
|
|
134
|
+
|
|
135
|
+
// src/components/primitives/badge.tsx
|
|
136
|
+
import { cva as cva2 } from "class-variance-authority";
|
|
137
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
138
|
+
var badgeVariants = cva2("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", {
|
|
139
|
+
variants: {
|
|
140
|
+
variant: {
|
|
141
|
+
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
|
142
|
+
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
143
|
+
destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
|
|
144
|
+
outline: "text-foreground"
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
defaultVariants: {
|
|
148
|
+
variant: "default"
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
function Badge({ className, variant, ...props }) {
|
|
152
|
+
return /* @__PURE__ */ jsx3("div", { className: cn(badgeVariants({ variant }), className), ...props });
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// src/components/primitives/button.tsx
|
|
156
|
+
import * as React2 from "react";
|
|
157
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
158
|
+
import { cva as cva3 } from "class-variance-authority";
|
|
159
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
160
|
+
var buttonVariants = cva3(
|
|
161
|
+
"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",
|
|
162
|
+
{
|
|
163
|
+
variants: {
|
|
164
|
+
variant: {
|
|
165
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
166
|
+
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
167
|
+
outline: "border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground",
|
|
168
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
169
|
+
ghost: "text-foreground shadow-none hover:bg-accent hover:text-accent-foreground",
|
|
170
|
+
link: "h-auto px-0 py-0 text-primary underline-offset-4 shadow-none hover:underline"
|
|
171
|
+
},
|
|
172
|
+
size: {
|
|
173
|
+
default: "h-10 px-4 py-2",
|
|
174
|
+
sm: "h-9 rounded-md px-3",
|
|
175
|
+
lg: "h-11 rounded-md px-8",
|
|
176
|
+
icon: "h-10 w-10"
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
defaultVariants: {
|
|
180
|
+
variant: "default",
|
|
181
|
+
size: "default"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
var Button = React2.forwardRef(
|
|
186
|
+
({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
187
|
+
const Comp = asChild ? Slot : "button";
|
|
188
|
+
return /* @__PURE__ */ jsx4(Comp, { className: cn(buttonVariants({ variant, size, className })), ref, ...props });
|
|
189
|
+
}
|
|
190
|
+
);
|
|
191
|
+
Button.displayName = "Button";
|
|
192
|
+
|
|
193
|
+
// src/components/primitives/textarea.tsx
|
|
194
|
+
import * as React3 from "react";
|
|
195
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
196
|
+
var Textarea = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx5(
|
|
197
|
+
"textarea",
|
|
198
|
+
{
|
|
199
|
+
ref,
|
|
200
|
+
className: cn(
|
|
201
|
+
"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",
|
|
202
|
+
className
|
|
203
|
+
),
|
|
204
|
+
...props
|
|
205
|
+
}
|
|
206
|
+
));
|
|
207
|
+
Textarea.displayName = "Textarea";
|
|
208
|
+
|
|
209
|
+
// src/components/ai/ai-chat.tsx
|
|
210
|
+
import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
211
|
+
function AiChatLayout({ className, variant = "screen", ...props }) {
|
|
212
|
+
return /* @__PURE__ */ jsx6(
|
|
213
|
+
"section",
|
|
214
|
+
{
|
|
215
|
+
className: cn(
|
|
216
|
+
"overflow-hidden rounded-2xl border bg-card text-card-foreground shadow-sm",
|
|
217
|
+
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",
|
|
218
|
+
className
|
|
219
|
+
),
|
|
220
|
+
...props
|
|
221
|
+
}
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
var AiChatSidebar = React4.forwardRef(
|
|
225
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
226
|
+
"aside",
|
|
227
|
+
{
|
|
228
|
+
ref,
|
|
229
|
+
className: cn(
|
|
230
|
+
"flex min-h-0 flex-col border-b bg-muted/20 lg:border-b-0 lg:border-r",
|
|
231
|
+
className
|
|
232
|
+
),
|
|
233
|
+
...props
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
);
|
|
237
|
+
AiChatSidebar.displayName = "AiChatSidebar";
|
|
238
|
+
function AiChatSidebarHeader({ className, title, description, action, ...props }) {
|
|
239
|
+
return /* @__PURE__ */ jsx6("div", { className: cn("border-b px-4 py-4", className), ...props, children: /* @__PURE__ */ jsxs2("div", { className: "flex items-start justify-between gap-3", children: [
|
|
240
|
+
/* @__PURE__ */ jsxs2("div", { className: "grid gap-1", children: [
|
|
241
|
+
/* @__PURE__ */ jsx6("p", { className: "text-sm font-semibold text-foreground", children: title }),
|
|
242
|
+
description ? /* @__PURE__ */ jsx6("p", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
243
|
+
] }),
|
|
244
|
+
action ? /* @__PURE__ */ jsx6("div", { className: "shrink-0", children: action }) : null
|
|
245
|
+
] }) });
|
|
246
|
+
}
|
|
247
|
+
var AiChatThreadList = React4.forwardRef(
|
|
248
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx6("div", { ref, className: cn("flex-1 space-y-2 overflow-y-auto p-3", className), ...props })
|
|
249
|
+
);
|
|
250
|
+
AiChatThreadList.displayName = "AiChatThreadList";
|
|
251
|
+
var AiChatThreadButton = React4.forwardRef(
|
|
252
|
+
({
|
|
253
|
+
className,
|
|
254
|
+
title,
|
|
255
|
+
preview,
|
|
256
|
+
timestamp,
|
|
257
|
+
active = false,
|
|
258
|
+
unreadCount,
|
|
259
|
+
icon: Icon2 = MessageSquareText,
|
|
260
|
+
type = "button",
|
|
261
|
+
...props
|
|
262
|
+
}, ref) => /* @__PURE__ */ jsxs2(
|
|
263
|
+
"button",
|
|
264
|
+
{
|
|
265
|
+
ref,
|
|
266
|
+
type,
|
|
267
|
+
className: cn(
|
|
268
|
+
"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",
|
|
269
|
+
active ? "border-[var(--color-accent-blue)]/40 bg-[var(--color-accent-blue)]/8" : "border-transparent bg-transparent hover:border-border hover:bg-accent/40",
|
|
270
|
+
className
|
|
271
|
+
),
|
|
272
|
+
...props,
|
|
273
|
+
children: [
|
|
274
|
+
/* @__PURE__ */ jsx6(
|
|
275
|
+
"span",
|
|
276
|
+
{
|
|
277
|
+
className: cn(
|
|
278
|
+
"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border",
|
|
279
|
+
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"
|
|
280
|
+
),
|
|
281
|
+
children: /* @__PURE__ */ jsx6(Icon2, { className: "h-4 w-4" })
|
|
282
|
+
}
|
|
283
|
+
),
|
|
284
|
+
/* @__PURE__ */ jsxs2("span", { className: "grid min-w-0 flex-1 gap-1", children: [
|
|
285
|
+
/* @__PURE__ */ jsxs2("span", { className: "flex items-start justify-between gap-3", children: [
|
|
286
|
+
/* @__PURE__ */ jsx6("span", { className: "truncate text-sm font-medium text-foreground", children: title }),
|
|
287
|
+
timestamp ? /* @__PURE__ */ jsxs2("span", { className: "inline-flex shrink-0 items-center gap-1 text-[11px] text-muted-foreground", children: [
|
|
288
|
+
/* @__PURE__ */ jsx6(Clock3, { className: "h-3 w-3" }),
|
|
289
|
+
timestamp
|
|
290
|
+
] }) : null
|
|
291
|
+
] }),
|
|
292
|
+
preview ? /* @__PURE__ */ jsx6("span", { className: "line-clamp-2 text-xs text-muted-foreground", children: preview }) : null
|
|
293
|
+
] }),
|
|
294
|
+
typeof unreadCount === "number" && unreadCount > 0 ? /* @__PURE__ */ jsx6(Badge, { className: "shrink-0 rounded-full px-2 py-0.5 text-[11px]", children: unreadCount > 9 ? "9+" : unreadCount }) : null
|
|
295
|
+
]
|
|
296
|
+
}
|
|
297
|
+
)
|
|
298
|
+
);
|
|
299
|
+
AiChatThreadButton.displayName = "AiChatThreadButton";
|
|
300
|
+
var AiChatPanel = React4.forwardRef(
|
|
301
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx6("div", { ref, className: cn("flex min-h-0 flex-1 flex-col bg-background/40", className), ...props })
|
|
302
|
+
);
|
|
303
|
+
AiChatPanel.displayName = "AiChatPanel";
|
|
304
|
+
function AiChatHeader({ className, title, description, meta, actions, ...props }) {
|
|
305
|
+
return /* @__PURE__ */ jsx6("header", { className: cn("border-b bg-card/95 px-5 py-4 backdrop-blur", className), ...props, children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [
|
|
306
|
+
/* @__PURE__ */ jsxs2("div", { className: "grid gap-1", children: [
|
|
307
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
308
|
+
/* @__PURE__ */ jsx6("p", { className: "text-base font-semibold text-foreground", children: title }),
|
|
309
|
+
meta ? /* @__PURE__ */ jsx6("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: meta }) : null
|
|
310
|
+
] }),
|
|
311
|
+
description ? /* @__PURE__ */ jsx6("p", { className: "text-sm text-muted-foreground", children: description }) : null
|
|
312
|
+
] }),
|
|
313
|
+
actions ? /* @__PURE__ */ jsx6("div", { className: "flex flex-wrap items-center gap-2", children: actions }) : null
|
|
314
|
+
] }) });
|
|
315
|
+
}
|
|
316
|
+
var AiChatMessageList = React4.forwardRef(
|
|
317
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
318
|
+
"div",
|
|
319
|
+
{
|
|
320
|
+
ref,
|
|
321
|
+
role: "log",
|
|
322
|
+
"aria-live": "polite",
|
|
323
|
+
className: cn("flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto px-5 py-5", className),
|
|
324
|
+
...props
|
|
325
|
+
}
|
|
326
|
+
)
|
|
327
|
+
);
|
|
328
|
+
AiChatMessageList.displayName = "AiChatMessageList";
|
|
329
|
+
function getDefaultAvatar(role) {
|
|
330
|
+
if (role === "assistant") {
|
|
331
|
+
return /* @__PURE__ */ jsx6("span", { className: "flex h-9 w-9 items-center justify-center rounded-full bg-[var(--color-brand)] text-white shadow-sm", children: /* @__PURE__ */ jsx6(Bot, { className: "h-4 w-4" }) });
|
|
332
|
+
}
|
|
333
|
+
if (role === "system") {
|
|
334
|
+
return /* @__PURE__ */ jsx6("span", { className: "flex h-9 w-9 items-center justify-center rounded-full bg-secondary text-secondary-foreground shadow-sm", children: /* @__PURE__ */ jsx6(Sparkles, { className: "h-4 w-4" }) });
|
|
335
|
+
}
|
|
336
|
+
return /* @__PURE__ */ jsx6("span", { className: "flex h-9 w-9 items-center justify-center rounded-full bg-foreground text-background shadow-sm", children: /* @__PURE__ */ jsx6("span", { className: "text-xs font-semibold", children: "TU" }) });
|
|
337
|
+
}
|
|
338
|
+
function AiChatMessage({
|
|
339
|
+
className,
|
|
340
|
+
role = "assistant",
|
|
341
|
+
author,
|
|
342
|
+
timestamp,
|
|
343
|
+
status = "complete",
|
|
344
|
+
avatar,
|
|
345
|
+
actions,
|
|
346
|
+
sources,
|
|
347
|
+
children,
|
|
348
|
+
...props
|
|
349
|
+
}) {
|
|
350
|
+
const isUser = role === "user";
|
|
351
|
+
return /* @__PURE__ */ jsxs2(
|
|
352
|
+
"article",
|
|
353
|
+
{
|
|
354
|
+
className: cn("flex gap-3", isUser ? "justify-end" : "justify-start", className),
|
|
355
|
+
...props,
|
|
356
|
+
children: [
|
|
357
|
+
!isUser ? /* @__PURE__ */ jsx6("div", { className: "shrink-0", children: avatar ?? getDefaultAvatar(role) }) : null,
|
|
358
|
+
/* @__PURE__ */ jsxs2("div", { className: cn("grid max-w-[90%] gap-2 md:max-w-[74%]", isUser && "justify-items-end"), children: [
|
|
359
|
+
/* @__PURE__ */ jsxs2("div", { className: cn("flex items-center gap-2", isUser && "justify-end"), children: [
|
|
360
|
+
/* @__PURE__ */ jsx6("span", { className: "text-xs font-medium text-foreground", children: author ?? (isUser ? "Tu" : "Cortexa AI") }),
|
|
361
|
+
timestamp ? /* @__PURE__ */ jsx6("span", { className: "text-xs text-muted-foreground", children: timestamp }) : null,
|
|
362
|
+
status !== "complete" ? /* @__PURE__ */ jsx6(Badge, { variant: status === "error" ? "destructive" : "secondary", children: status === "streaming" ? "Generando" : "Error" }) : null
|
|
363
|
+
] }),
|
|
364
|
+
/* @__PURE__ */ jsx6(
|
|
365
|
+
"div",
|
|
366
|
+
{
|
|
367
|
+
className: cn(
|
|
368
|
+
"rounded-2xl border px-4 py-3 text-sm leading-6 shadow-sm",
|
|
369
|
+
isUser ? "border-primary bg-primary text-primary-foreground" : role === "system" ? "border-secondary bg-secondary text-secondary-foreground" : "bg-card text-foreground"
|
|
370
|
+
),
|
|
371
|
+
children: /* @__PURE__ */ jsx6("div", { className: "whitespace-pre-wrap", children })
|
|
372
|
+
}
|
|
373
|
+
),
|
|
374
|
+
sources?.length ? /* @__PURE__ */ jsx6("div", { className: cn("flex flex-wrap gap-2", isUser && "justify-end"), children: sources.map(
|
|
375
|
+
(source) => source.href ? /* @__PURE__ */ jsxs2(
|
|
376
|
+
"a",
|
|
377
|
+
{
|
|
378
|
+
href: source.href,
|
|
379
|
+
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",
|
|
380
|
+
children: [
|
|
381
|
+
source.label,
|
|
382
|
+
/* @__PURE__ */ jsx6(PanelRightOpen, { className: "h-3 w-3" })
|
|
383
|
+
]
|
|
384
|
+
},
|
|
385
|
+
`${source.label}-${source.href}`
|
|
386
|
+
) : /* @__PURE__ */ jsx6(
|
|
387
|
+
"span",
|
|
388
|
+
{
|
|
389
|
+
className: "inline-flex items-center rounded-full border px-2.5 py-1 text-xs text-muted-foreground",
|
|
390
|
+
children: source.label
|
|
391
|
+
},
|
|
392
|
+
source.label
|
|
393
|
+
)
|
|
394
|
+
) }) : null,
|
|
395
|
+
actions ? /* @__PURE__ */ jsx6("div", { className: cn("flex flex-wrap gap-2", isUser && "justify-end"), children: actions }) : null
|
|
396
|
+
] }),
|
|
397
|
+
isUser ? /* @__PURE__ */ jsx6("div", { className: "shrink-0", children: avatar ?? getDefaultAvatar(role) }) : null
|
|
398
|
+
]
|
|
399
|
+
}
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
function AiChatAssistantMessage(props) {
|
|
403
|
+
return /* @__PURE__ */ jsx6(AiChatMessage, { role: "assistant", ...props });
|
|
404
|
+
}
|
|
405
|
+
function AiChatUserMessage(props) {
|
|
406
|
+
return /* @__PURE__ */ jsx6(AiChatMessage, { role: "user", ...props });
|
|
407
|
+
}
|
|
408
|
+
function AiChatSummaryActions({
|
|
409
|
+
className,
|
|
410
|
+
title = "Quick actions",
|
|
411
|
+
description,
|
|
412
|
+
actionsClassName,
|
|
413
|
+
children,
|
|
414
|
+
...props
|
|
415
|
+
}) {
|
|
416
|
+
return /* @__PURE__ */ jsxs2("section", { className: cn("grid gap-3 rounded-2xl border bg-card p-4 shadow-sm", className), ...props, children: [
|
|
417
|
+
/* @__PURE__ */ jsxs2("div", { className: "grid gap-1", children: [
|
|
418
|
+
/* @__PURE__ */ jsx6("p", { className: "text-sm font-semibold text-foreground", children: title }),
|
|
419
|
+
description ? /* @__PURE__ */ jsx6("p", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
420
|
+
] }),
|
|
421
|
+
/* @__PURE__ */ jsx6("div", { className: cn("grid gap-3 md:grid-cols-3", actionsClassName), children })
|
|
422
|
+
] });
|
|
423
|
+
}
|
|
424
|
+
var AiChatSummaryAction = React4.forwardRef(
|
|
425
|
+
({
|
|
426
|
+
className,
|
|
427
|
+
title,
|
|
428
|
+
description,
|
|
429
|
+
icon: Icon2 = Sparkles,
|
|
430
|
+
active = false,
|
|
431
|
+
badge,
|
|
432
|
+
type = "button",
|
|
433
|
+
...props
|
|
434
|
+
}, ref) => /* @__PURE__ */ jsxs2(
|
|
435
|
+
"button",
|
|
436
|
+
{
|
|
437
|
+
ref,
|
|
438
|
+
type,
|
|
439
|
+
className: cn(
|
|
440
|
+
"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",
|
|
441
|
+
active ? "border-[var(--color-accent-blue)]/40 bg-[var(--color-accent-blue)]/10" : "hover:border-border hover:bg-accent/40",
|
|
442
|
+
className
|
|
443
|
+
),
|
|
444
|
+
...props,
|
|
445
|
+
children: [
|
|
446
|
+
/* @__PURE__ */ jsx6("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__ */ jsx6(Icon2, { className: "h-5 w-5" }) }),
|
|
447
|
+
/* @__PURE__ */ jsxs2("span", { className: "grid flex-1 gap-1", children: [
|
|
448
|
+
/* @__PURE__ */ jsxs2("span", { className: "flex flex-wrap items-center gap-2", children: [
|
|
449
|
+
/* @__PURE__ */ jsx6("span", { className: "text-sm font-medium text-foreground", children: title }),
|
|
450
|
+
badge ? /* @__PURE__ */ jsx6(Badge, { variant: "secondary", children: badge }) : null
|
|
451
|
+
] }),
|
|
452
|
+
description ? /* @__PURE__ */ jsx6("span", { className: "text-xs leading-5 text-muted-foreground", children: description }) : null
|
|
453
|
+
] })
|
|
454
|
+
]
|
|
455
|
+
}
|
|
456
|
+
)
|
|
457
|
+
);
|
|
458
|
+
AiChatSummaryAction.displayName = "AiChatSummaryAction";
|
|
459
|
+
function AiChatComposer({
|
|
460
|
+
className,
|
|
461
|
+
textareaProps,
|
|
462
|
+
onSubmit,
|
|
463
|
+
submitLabel = "Send",
|
|
464
|
+
submitIcon = /* @__PURE__ */ jsx6(Send, { className: "h-4 w-4" }),
|
|
465
|
+
leadingActions,
|
|
466
|
+
trailingActions,
|
|
467
|
+
helperText,
|
|
468
|
+
disabled = false,
|
|
469
|
+
...props
|
|
470
|
+
}) {
|
|
471
|
+
const { className: textareaClassName, placeholder, disabled: textareaDisabled, ...restTextareaProps } = textareaProps ?? {};
|
|
472
|
+
const isDisabled = disabled || Boolean(textareaDisabled);
|
|
473
|
+
return /* @__PURE__ */ jsxs2("form", { className: cn("border-t bg-card px-4 py-4", className), onSubmit, ...props, children: [
|
|
474
|
+
/* @__PURE__ */ jsxs2("div", { className: "rounded-2xl border bg-background p-3 shadow-sm", children: [
|
|
475
|
+
/* @__PURE__ */ jsx6(
|
|
476
|
+
Textarea,
|
|
477
|
+
{
|
|
478
|
+
className: cn(
|
|
479
|
+
"min-h-24 resize-none border-0 bg-transparent p-0 text-sm shadow-none focus-visible:ring-0",
|
|
480
|
+
textareaClassName
|
|
481
|
+
),
|
|
482
|
+
placeholder: placeholder ?? "Describe what you need from the assistant...",
|
|
483
|
+
disabled: isDisabled,
|
|
484
|
+
...restTextareaProps
|
|
485
|
+
}
|
|
486
|
+
),
|
|
487
|
+
/* @__PURE__ */ jsxs2("div", { className: "mt-3 flex flex-wrap items-center justify-between gap-3", children: [
|
|
488
|
+
/* @__PURE__ */ jsx6("div", { className: "flex flex-wrap items-center gap-2", children: leadingActions }),
|
|
489
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
490
|
+
trailingActions,
|
|
491
|
+
/* @__PURE__ */ jsxs2(Button, { type: "submit", disabled: isDisabled, children: [
|
|
492
|
+
submitIcon,
|
|
493
|
+
submitLabel
|
|
494
|
+
] })
|
|
495
|
+
] })
|
|
496
|
+
] })
|
|
497
|
+
] }),
|
|
498
|
+
helperText ? /* @__PURE__ */ jsx6("p", { className: "mt-2 text-xs text-muted-foreground", children: helperText }) : null
|
|
499
|
+
] });
|
|
500
|
+
}
|
|
501
|
+
function AiChatEmptyState({
|
|
502
|
+
className,
|
|
503
|
+
title,
|
|
504
|
+
description,
|
|
505
|
+
prompts,
|
|
506
|
+
onPromptSelect,
|
|
507
|
+
...props
|
|
508
|
+
}) {
|
|
509
|
+
return /* @__PURE__ */ jsxs2(
|
|
510
|
+
"div",
|
|
511
|
+
{
|
|
512
|
+
className: cn(
|
|
513
|
+
"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",
|
|
514
|
+
className
|
|
515
|
+
),
|
|
516
|
+
...props,
|
|
517
|
+
children: [
|
|
518
|
+
/* @__PURE__ */ jsx6("span", { className: "flex h-14 w-14 items-center justify-center rounded-2xl bg-[var(--color-brand)]/10 text-[var(--color-brand)]", children: /* @__PURE__ */ jsx6(Sparkles, { className: "h-6 w-6" }) }),
|
|
519
|
+
/* @__PURE__ */ jsxs2("div", { className: "grid max-w-xl gap-2", children: [
|
|
520
|
+
/* @__PURE__ */ jsx6("p", { className: "text-lg font-semibold text-foreground", children: title }),
|
|
521
|
+
/* @__PURE__ */ jsx6("p", { className: "text-sm leading-6 text-muted-foreground", children: description })
|
|
522
|
+
] }),
|
|
523
|
+
prompts?.length ? /* @__PURE__ */ jsx6("div", { className: "flex max-w-2xl flex-wrap items-center justify-center gap-2", children: prompts.map((prompt) => /* @__PURE__ */ jsx6(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onPromptSelect?.(prompt), children: prompt }, prompt)) }) : null
|
|
524
|
+
]
|
|
525
|
+
}
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
function AiChatFloatingButton({
|
|
529
|
+
className,
|
|
530
|
+
label = "Asistente IA",
|
|
531
|
+
unreadCount,
|
|
532
|
+
icon: Icon2 = Sparkles,
|
|
533
|
+
variant = "default",
|
|
534
|
+
size = "lg",
|
|
535
|
+
children,
|
|
536
|
+
...props
|
|
537
|
+
}) {
|
|
538
|
+
return /* @__PURE__ */ jsxs2(
|
|
539
|
+
Button,
|
|
540
|
+
{
|
|
541
|
+
variant,
|
|
542
|
+
size,
|
|
543
|
+
className: cn("fixed bottom-6 right-6 h-14 rounded-full px-5 shadow-lg", className),
|
|
544
|
+
...props,
|
|
545
|
+
children: [
|
|
546
|
+
/* @__PURE__ */ jsx6(Icon2, { className: "h-4 w-4" }),
|
|
547
|
+
/* @__PURE__ */ jsx6("span", { children: children ?? label }),
|
|
548
|
+
typeof unreadCount === "number" && unreadCount > 0 ? /* @__PURE__ */ jsx6("span", { className: "rounded-full bg-white/15 px-2 py-0.5 text-xs font-semibold text-inherit", children: unreadCount > 9 ? "9+" : unreadCount }) : null
|
|
549
|
+
]
|
|
550
|
+
}
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
function AiChatFloatingSidebar({
|
|
554
|
+
children,
|
|
555
|
+
trigger,
|
|
556
|
+
side = "right",
|
|
557
|
+
open,
|
|
558
|
+
defaultOpen,
|
|
559
|
+
onOpenChange,
|
|
560
|
+
contentClassName,
|
|
561
|
+
triggerAsChild = true
|
|
562
|
+
}) {
|
|
563
|
+
const resolvedTrigger = trigger ?? /* @__PURE__ */ jsx6(AiChatFloatingButton, {});
|
|
564
|
+
return /* @__PURE__ */ jsxs2(Sheet, { open, defaultOpen, onOpenChange, children: [
|
|
565
|
+
/* @__PURE__ */ jsx6(SheetTrigger, { asChild: triggerAsChild, children: resolvedTrigger }),
|
|
566
|
+
/* @__PURE__ */ jsx6(SheetContent, { side, className: cn("w-full p-0 sm:max-w-[460px]", contentClassName), children: /* @__PURE__ */ jsx6(AiChatLayout, { variant: "sidebar", className: "h-full rounded-none border-0 shadow-none", children }) })
|
|
567
|
+
] });
|
|
568
|
+
}
|
|
569
|
+
|
|
71
570
|
// src/assets/isotipo-cortexa-dark.png
|
|
72
571
|
var isotipo_cortexa_dark_default = "./isotipo-cortexa-dark-F2MDSEEV.png";
|
|
73
572
|
|
|
@@ -75,7 +574,7 @@ var isotipo_cortexa_dark_default = "./isotipo-cortexa-dark-F2MDSEEV.png";
|
|
|
75
574
|
var isotipo_cortexa_light_default = "./isotipo-cortexa-light-LV3O6ASR.png";
|
|
76
575
|
|
|
77
576
|
// src/components/branding/brand-logo.tsx
|
|
78
|
-
import { Fragment, jsx as
|
|
577
|
+
import { Fragment, jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
79
578
|
var sizeMap = {
|
|
80
579
|
sm: { icon: "h-6 w-6", text: "text-sm", gap: "gap-2" },
|
|
81
580
|
md: { icon: "h-7 w-7", text: "text-lg", gap: "gap-3" },
|
|
@@ -85,8 +584,8 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
85
584
|
const { resolvedTheme } = useTheme();
|
|
86
585
|
const isDark = resolvedTheme === "dark";
|
|
87
586
|
const s = sizeMap[size];
|
|
88
|
-
const content = /* @__PURE__ */
|
|
89
|
-
/* @__PURE__ */
|
|
587
|
+
const content = /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
588
|
+
/* @__PURE__ */ jsx7(
|
|
90
589
|
"div",
|
|
91
590
|
{
|
|
92
591
|
className: cn(
|
|
@@ -94,7 +593,7 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
94
593
|
s.icon,
|
|
95
594
|
isDark ? "bg-[var(--color-brand)] p-1" : "bg-transparent"
|
|
96
595
|
),
|
|
97
|
-
children: /* @__PURE__ */
|
|
596
|
+
children: /* @__PURE__ */ jsx7(
|
|
98
597
|
"img",
|
|
99
598
|
{
|
|
100
599
|
src: isDark ? isotipo_cortexa_dark_default : isotipo_cortexa_light_default,
|
|
@@ -104,8 +603,8 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
104
603
|
)
|
|
105
604
|
}
|
|
106
605
|
),
|
|
107
|
-
/* @__PURE__ */
|
|
108
|
-
/* @__PURE__ */
|
|
606
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex items-baseline", children: [
|
|
607
|
+
/* @__PURE__ */ jsx7(
|
|
109
608
|
"span",
|
|
110
609
|
{
|
|
111
610
|
className: cn(
|
|
@@ -116,7 +615,7 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
116
615
|
children: "Cortexa"
|
|
117
616
|
}
|
|
118
617
|
),
|
|
119
|
-
/* @__PURE__ */
|
|
618
|
+
/* @__PURE__ */ jsx7(
|
|
120
619
|
"span",
|
|
121
620
|
{
|
|
122
621
|
className: cn(
|
|
@@ -131,13 +630,13 @@ function BrandLogo({ className, size = "md", href }) {
|
|
|
131
630
|
] });
|
|
132
631
|
const wrapperClass = cn("flex items-center", s.gap, className);
|
|
133
632
|
if (href) {
|
|
134
|
-
return /* @__PURE__ */
|
|
633
|
+
return /* @__PURE__ */ jsx7("a", { href, className: wrapperClass, "aria-label": "Cortexa Fiscal \u2014 Inicio", children: content });
|
|
135
634
|
}
|
|
136
|
-
return /* @__PURE__ */
|
|
635
|
+
return /* @__PURE__ */ jsx7("div", { className: wrapperClass, "aria-label": "Cortexa Fiscal", children: content });
|
|
137
636
|
}
|
|
138
637
|
|
|
139
638
|
// src/components/data-display/icons.tsx
|
|
140
|
-
import { jsx as
|
|
639
|
+
import { jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
141
640
|
var toneStyles = {
|
|
142
641
|
brand: "bg-[var(--color-brand)]/10 text-[var(--color-brand)]",
|
|
143
642
|
info: "bg-[var(--color-info-bg)] text-[var(--color-accent-blue)]",
|
|
@@ -153,7 +652,7 @@ var sizeStyles = {
|
|
|
153
652
|
};
|
|
154
653
|
function FeatureIcon({ className, icon: Icon2, tone = "brand", size = "md", iconClassName }) {
|
|
155
654
|
const classes = sizeStyles[size];
|
|
156
|
-
return /* @__PURE__ */
|
|
655
|
+
return /* @__PURE__ */ jsx8("span", { className: cn("inline-flex items-center justify-center", classes.wrapper, toneStyles[tone], className), children: /* @__PURE__ */ jsx8(Icon2, { className: cn(classes.icon, iconClassName) }) });
|
|
157
656
|
}
|
|
158
657
|
function ModuleIconButton({
|
|
159
658
|
className,
|
|
@@ -164,7 +663,7 @@ function ModuleIconButton({
|
|
|
164
663
|
tone = "brand",
|
|
165
664
|
...props
|
|
166
665
|
}) {
|
|
167
|
-
return /* @__PURE__ */
|
|
666
|
+
return /* @__PURE__ */ jsxs4(
|
|
168
667
|
"button",
|
|
169
668
|
{
|
|
170
669
|
type,
|
|
@@ -174,7 +673,7 @@ function ModuleIconButton({
|
|
|
174
673
|
),
|
|
175
674
|
...props,
|
|
176
675
|
children: [
|
|
177
|
-
/* @__PURE__ */
|
|
676
|
+
/* @__PURE__ */ jsx8(
|
|
178
677
|
FeatureIcon,
|
|
179
678
|
{
|
|
180
679
|
icon,
|
|
@@ -183,9 +682,9 @@ function ModuleIconButton({
|
|
|
183
682
|
className: "transition-colors group-hover:bg-[var(--color-brand)]/20"
|
|
184
683
|
}
|
|
185
684
|
),
|
|
186
|
-
/* @__PURE__ */
|
|
187
|
-
/* @__PURE__ */
|
|
188
|
-
description ? /* @__PURE__ */
|
|
685
|
+
/* @__PURE__ */ jsxs4("span", { className: "grid gap-1", children: [
|
|
686
|
+
/* @__PURE__ */ jsx8("span", { className: "text-sm font-medium text-foreground", children: label }),
|
|
687
|
+
description ? /* @__PURE__ */ jsx8("span", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
189
688
|
] })
|
|
190
689
|
]
|
|
191
690
|
}
|
|
@@ -193,10 +692,10 @@ function ModuleIconButton({
|
|
|
193
692
|
}
|
|
194
693
|
|
|
195
694
|
// src/components/primitives/avatar.tsx
|
|
196
|
-
import * as
|
|
695
|
+
import * as React5 from "react";
|
|
197
696
|
import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
198
|
-
import { jsx as
|
|
199
|
-
var Avatar =
|
|
697
|
+
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
698
|
+
var Avatar = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
200
699
|
AvatarPrimitive.Root,
|
|
201
700
|
{
|
|
202
701
|
ref,
|
|
@@ -205,9 +704,9 @@ var Avatar = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
|
205
704
|
}
|
|
206
705
|
));
|
|
207
706
|
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
208
|
-
var AvatarImage =
|
|
707
|
+
var AvatarImage = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(AvatarPrimitive.Image, { ref, className: cn("aspect-square h-full w-full", className), ...props }));
|
|
209
708
|
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
210
|
-
var AvatarFallback =
|
|
709
|
+
var AvatarFallback = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
211
710
|
AvatarPrimitive.Fallback,
|
|
212
711
|
{
|
|
213
712
|
ref,
|
|
@@ -218,7 +717,7 @@ var AvatarFallback = React.forwardRef(({ className, ...props }, ref) => /* @__PU
|
|
|
218
717
|
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
219
718
|
|
|
220
719
|
// src/components/data-display/profile-avatar.tsx
|
|
221
|
-
import { jsx as
|
|
720
|
+
import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
222
721
|
var sizeMap2 = {
|
|
223
722
|
xs: { avatar: "h-8 w-8", text: "text-xs", dot: "h-2.5 w-2.5" },
|
|
224
723
|
sm: { avatar: "h-10 w-10", text: "text-sm", dot: "h-3 w-3" },
|
|
@@ -246,12 +745,12 @@ function ProfileAvatar({
|
|
|
246
745
|
status
|
|
247
746
|
}) {
|
|
248
747
|
const classes = sizeMap2[size];
|
|
249
|
-
return /* @__PURE__ */
|
|
250
|
-
/* @__PURE__ */
|
|
251
|
-
src ? /* @__PURE__ */
|
|
252
|
-
/* @__PURE__ */
|
|
748
|
+
return /* @__PURE__ */ jsxs5("div", { className: cn("relative inline-flex", className), children: [
|
|
749
|
+
/* @__PURE__ */ jsxs5(Avatar, { className: cn(classes.avatar, avatarClassName), children: [
|
|
750
|
+
src ? /* @__PURE__ */ jsx10(AvatarImage, { src, alt: alt ?? name }) : null,
|
|
751
|
+
/* @__PURE__ */ jsx10(AvatarFallback, { className: cn("bg-[var(--color-brand)] text-white font-medium", classes.text, fallbackClassName), children: initials ?? getInitials(name) })
|
|
253
752
|
] }),
|
|
254
|
-
status ? /* @__PURE__ */
|
|
753
|
+
status ? /* @__PURE__ */ jsx10(
|
|
255
754
|
"span",
|
|
256
755
|
{
|
|
257
756
|
"aria-hidden": "true",
|
|
@@ -264,9 +763,9 @@ function AvatarGroup({ className, users, size = "xs", limit = 4, extraLabel }) {
|
|
|
264
763
|
const visibleUsers = users.slice(0, limit);
|
|
265
764
|
const hiddenCount = Math.max(0, users.length - limit);
|
|
266
765
|
const classes = sizeMap2[size];
|
|
267
|
-
return /* @__PURE__ */
|
|
268
|
-
/* @__PURE__ */
|
|
269
|
-
visibleUsers.map((user) => /* @__PURE__ */
|
|
766
|
+
return /* @__PURE__ */ jsxs5("div", { className: cn("flex items-center gap-3", className), children: [
|
|
767
|
+
/* @__PURE__ */ jsxs5("div", { className: "flex -space-x-2", children: [
|
|
768
|
+
visibleUsers.map((user) => /* @__PURE__ */ jsx10(
|
|
270
769
|
ProfileAvatar,
|
|
271
770
|
{
|
|
272
771
|
name: user.name,
|
|
@@ -278,7 +777,7 @@ function AvatarGroup({ className, users, size = "xs", limit = 4, extraLabel }) {
|
|
|
278
777
|
},
|
|
279
778
|
user.id ?? user.name
|
|
280
779
|
)),
|
|
281
|
-
hiddenCount > 0 ? /* @__PURE__ */
|
|
780
|
+
hiddenCount > 0 ? /* @__PURE__ */ jsxs5(
|
|
282
781
|
"div",
|
|
283
782
|
{
|
|
284
783
|
className: cn(
|
|
@@ -293,16 +792,16 @@ function AvatarGroup({ className, users, size = "xs", limit = 4, extraLabel }) {
|
|
|
293
792
|
}
|
|
294
793
|
) : null
|
|
295
794
|
] }),
|
|
296
|
-
extraLabel ? /* @__PURE__ */
|
|
795
|
+
extraLabel ? /* @__PURE__ */ jsx10("div", { className: "text-sm text-muted-foreground", children: extraLabel }) : null
|
|
297
796
|
] });
|
|
298
797
|
}
|
|
299
798
|
function ProfileAvatarRow({ className, name, role, src, initials, status, size = "sm", aside }) {
|
|
300
|
-
return /* @__PURE__ */
|
|
301
|
-
/* @__PURE__ */
|
|
302
|
-
/* @__PURE__ */
|
|
303
|
-
/* @__PURE__ */
|
|
304
|
-
/* @__PURE__ */
|
|
305
|
-
role ? /* @__PURE__ */
|
|
799
|
+
return /* @__PURE__ */ jsxs5("div", { className: cn("flex items-center justify-between gap-3", className), children: [
|
|
800
|
+
/* @__PURE__ */ jsxs5("div", { className: "flex items-center gap-3", children: [
|
|
801
|
+
/* @__PURE__ */ jsx10(ProfileAvatar, { name, src, initials, status, size }),
|
|
802
|
+
/* @__PURE__ */ jsxs5("div", { className: "grid gap-0.5", children: [
|
|
803
|
+
/* @__PURE__ */ jsx10("p", { className: "text-sm font-medium text-foreground", children: name }),
|
|
804
|
+
role ? /* @__PURE__ */ jsx10("p", { className: "text-xs text-muted-foreground", children: role }) : null
|
|
306
805
|
] })
|
|
307
806
|
] }),
|
|
308
807
|
aside
|
|
@@ -310,9 +809,9 @@ function ProfileAvatarRow({ className, name, role, src, initials, status, size =
|
|
|
310
809
|
}
|
|
311
810
|
|
|
312
811
|
// src/components/data-display/typography.tsx
|
|
313
|
-
import { cva } from "class-variance-authority";
|
|
314
|
-
import { jsx as
|
|
315
|
-
var typographyVariants =
|
|
812
|
+
import { cva as cva4 } from "class-variance-authority";
|
|
813
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
814
|
+
var typographyVariants = cva4("text-foreground", {
|
|
316
815
|
variants: {
|
|
317
816
|
variant: {
|
|
318
817
|
h1: "font-display text-4xl font-bold tracking-tight",
|
|
@@ -338,17 +837,63 @@ function Typography({
|
|
|
338
837
|
...props
|
|
339
838
|
}) {
|
|
340
839
|
const Component = as ?? "p";
|
|
341
|
-
return /* @__PURE__ */
|
|
840
|
+
return /* @__PURE__ */ jsx11(Component, { className: cn(typographyVariants({ variant }), className), ...props, children });
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
// src/components/feedback/empty-state.tsx
|
|
844
|
+
import { Inbox } from "lucide-react";
|
|
845
|
+
import { jsx as jsx12, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
846
|
+
function EmptyState({
|
|
847
|
+
className,
|
|
848
|
+
icon: Icon2 = Inbox,
|
|
849
|
+
title,
|
|
850
|
+
description,
|
|
851
|
+
action,
|
|
852
|
+
secondaryAction,
|
|
853
|
+
align = "center",
|
|
854
|
+
compact = false
|
|
855
|
+
}) {
|
|
856
|
+
const isCentered = align === "center";
|
|
857
|
+
return /* @__PURE__ */ jsx12(
|
|
858
|
+
"section",
|
|
859
|
+
{
|
|
860
|
+
className: cn(
|
|
861
|
+
"rounded-2xl border border-dashed bg-card text-card-foreground shadow-sm",
|
|
862
|
+
compact ? "p-5" : "p-8 sm:p-10",
|
|
863
|
+
className
|
|
864
|
+
),
|
|
865
|
+
children: /* @__PURE__ */ jsxs6(
|
|
866
|
+
"div",
|
|
867
|
+
{
|
|
868
|
+
className: cn(
|
|
869
|
+
"flex flex-col gap-5",
|
|
870
|
+
isCentered ? "items-center text-center" : "items-start text-left"
|
|
871
|
+
),
|
|
872
|
+
children: [
|
|
873
|
+
/* @__PURE__ */ jsx12("div", { className: "flex h-14 w-14 items-center justify-center rounded-2xl bg-[var(--color-brand)]/10 text-[var(--color-brand)]", children: /* @__PURE__ */ jsx12(Icon2, { className: "h-6 w-6" }) }),
|
|
874
|
+
/* @__PURE__ */ jsxs6("div", { className: "grid max-w-xl gap-2", children: [
|
|
875
|
+
/* @__PURE__ */ jsx12("p", { className: "text-lg font-semibold text-foreground", children: title }),
|
|
876
|
+
description ? /* @__PURE__ */ jsx12("div", { className: "text-sm leading-6 text-muted-foreground", children: description }) : null
|
|
877
|
+
] }),
|
|
878
|
+
action || secondaryAction ? /* @__PURE__ */ jsxs6("div", { className: cn("flex flex-wrap gap-3", isCentered && "justify-center"), children: [
|
|
879
|
+
action,
|
|
880
|
+
secondaryAction
|
|
881
|
+
] }) : null
|
|
882
|
+
]
|
|
883
|
+
}
|
|
884
|
+
)
|
|
885
|
+
}
|
|
886
|
+
);
|
|
342
887
|
}
|
|
343
888
|
|
|
344
889
|
// src/components/primitives/card.tsx
|
|
345
|
-
import * as
|
|
346
|
-
import { jsx as
|
|
890
|
+
import * as React6 from "react";
|
|
891
|
+
import { jsx as jsx13, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
347
892
|
var cardBaseClassName = "rounded-lg border bg-card text-card-foreground shadow-sm";
|
|
348
|
-
var Card =
|
|
893
|
+
var Card = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx13("div", { ref, className: cn(cardBaseClassName, className), ...props }));
|
|
349
894
|
Card.displayName = "Card";
|
|
350
|
-
var ClickableCard =
|
|
351
|
-
({ className, type = "button", ...props }, ref) => /* @__PURE__ */
|
|
895
|
+
var ClickableCard = React6.forwardRef(
|
|
896
|
+
({ className, type = "button", ...props }, ref) => /* @__PURE__ */ jsx13(
|
|
352
897
|
"button",
|
|
353
898
|
{
|
|
354
899
|
ref,
|
|
@@ -363,8 +908,8 @@ var ClickableCard = React2.forwardRef(
|
|
|
363
908
|
)
|
|
364
909
|
);
|
|
365
910
|
ClickableCard.displayName = "ClickableCard";
|
|
366
|
-
var CenteredIconCard =
|
|
367
|
-
({ className, type = "button", icon: Icon2, title, iconClassName, ...props }, ref) => /* @__PURE__ */
|
|
911
|
+
var CenteredIconCard = React6.forwardRef(
|
|
912
|
+
({ className, type = "button", icon: Icon2, title, iconClassName, ...props }, ref) => /* @__PURE__ */ jsxs7(
|
|
368
913
|
"button",
|
|
369
914
|
{
|
|
370
915
|
ref,
|
|
@@ -376,67 +921,67 @@ var CenteredIconCard = React2.forwardRef(
|
|
|
376
921
|
),
|
|
377
922
|
...props,
|
|
378
923
|
children: [
|
|
379
|
-
/* @__PURE__ */
|
|
380
|
-
/* @__PURE__ */
|
|
924
|
+
/* @__PURE__ */ jsx13("span", { className: "flex h-12 w-12 items-center justify-center rounded-xl bg-[var(--color-brand)]/10 text-[var(--color-brand)]", children: /* @__PURE__ */ jsx13(Icon2, { className: cn("h-6 w-6", iconClassName) }) }),
|
|
925
|
+
/* @__PURE__ */ jsx13("span", { className: "text-sm font-semibold text-foreground", children: title })
|
|
381
926
|
]
|
|
382
927
|
}
|
|
383
928
|
)
|
|
384
929
|
);
|
|
385
930
|
CenteredIconCard.displayName = "CenteredIconCard";
|
|
386
|
-
var CardHeader =
|
|
387
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
931
|
+
var CardHeader = React6.forwardRef(
|
|
932
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx13("div", { ref, className: cn("flex flex-col space-y-1.5 p-6", className), ...props })
|
|
388
933
|
);
|
|
389
934
|
CardHeader.displayName = "CardHeader";
|
|
390
|
-
var CardTitle =
|
|
391
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
935
|
+
var CardTitle = React6.forwardRef(
|
|
936
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx13("div", { ref, className: cn("text-2xl font-semibold leading-none tracking-tight", className), ...props })
|
|
392
937
|
);
|
|
393
938
|
CardTitle.displayName = "CardTitle";
|
|
394
|
-
var CardDescription =
|
|
395
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
939
|
+
var CardDescription = React6.forwardRef(
|
|
940
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx13("div", { ref, className: cn("text-sm text-muted-foreground", className), ...props })
|
|
396
941
|
);
|
|
397
942
|
CardDescription.displayName = "CardDescription";
|
|
398
|
-
var CardContent =
|
|
399
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
943
|
+
var CardContent = React6.forwardRef(
|
|
944
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx13("div", { ref, className: cn("p-6 pt-0", className), ...props })
|
|
400
945
|
);
|
|
401
946
|
CardContent.displayName = "CardContent";
|
|
402
|
-
var CardFooter =
|
|
403
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
947
|
+
var CardFooter = React6.forwardRef(
|
|
948
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx13("div", { ref, className: cn("flex items-center p-6 pt-0", className), ...props })
|
|
404
949
|
);
|
|
405
950
|
CardFooter.displayName = "CardFooter";
|
|
406
951
|
|
|
407
952
|
// src/components/feedback/skeleton.tsx
|
|
408
|
-
import { jsx as
|
|
953
|
+
import { jsx as jsx14 } from "react/jsx-runtime";
|
|
409
954
|
function Skeleton({ className, ...props }) {
|
|
410
|
-
return /* @__PURE__ */
|
|
955
|
+
return /* @__PURE__ */ jsx14("div", { className: cn("animate-pulse rounded-md bg-muted", className), ...props });
|
|
411
956
|
}
|
|
412
957
|
|
|
413
958
|
// src/components/feedback/spinner.tsx
|
|
414
959
|
import { Loader2 } from "lucide-react";
|
|
415
|
-
import { jsx as
|
|
960
|
+
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
416
961
|
var sizeMap3 = {
|
|
417
962
|
sm: "h-4 w-4",
|
|
418
963
|
md: "h-5 w-5",
|
|
419
964
|
lg: "h-7 w-7"
|
|
420
965
|
};
|
|
421
966
|
function Spinner({ className, size = "md" }) {
|
|
422
|
-
return /* @__PURE__ */
|
|
967
|
+
return /* @__PURE__ */ jsx15(Loader2, { className: cn("animate-spin text-current", sizeMap3[size], className) });
|
|
423
968
|
}
|
|
424
969
|
|
|
425
970
|
// src/components/tables/table.tsx
|
|
426
|
-
import * as
|
|
427
|
-
import { jsx as
|
|
428
|
-
var Table =
|
|
971
|
+
import * as React7 from "react";
|
|
972
|
+
import { jsx as jsx16 } from "react/jsx-runtime";
|
|
973
|
+
var Table = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx16("div", { className: "relative w-full overflow-auto", children: /* @__PURE__ */ jsx16("table", { ref, className: cn("w-full caption-bottom text-sm", className), ...props }) }));
|
|
429
974
|
Table.displayName = "Table";
|
|
430
|
-
var TableHeader =
|
|
431
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
975
|
+
var TableHeader = React7.forwardRef(
|
|
976
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx16("thead", { ref, className: cn("[&_tr]:border-b", className), ...props })
|
|
432
977
|
);
|
|
433
978
|
TableHeader.displayName = "TableHeader";
|
|
434
|
-
var TableBody =
|
|
435
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
979
|
+
var TableBody = React7.forwardRef(
|
|
980
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx16("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
|
|
436
981
|
);
|
|
437
982
|
TableBody.displayName = "TableBody";
|
|
438
|
-
var TableFooter =
|
|
439
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
983
|
+
var TableFooter = React7.forwardRef(
|
|
984
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx16(
|
|
440
985
|
"tfoot",
|
|
441
986
|
{
|
|
442
987
|
ref,
|
|
@@ -446,8 +991,8 @@ var TableFooter = React3.forwardRef(
|
|
|
446
991
|
)
|
|
447
992
|
);
|
|
448
993
|
TableFooter.displayName = "TableFooter";
|
|
449
|
-
var TableRow =
|
|
450
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
994
|
+
var TableRow = React7.forwardRef(
|
|
995
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx16(
|
|
451
996
|
"tr",
|
|
452
997
|
{
|
|
453
998
|
ref,
|
|
@@ -457,8 +1002,8 @@ var TableRow = React3.forwardRef(
|
|
|
457
1002
|
)
|
|
458
1003
|
);
|
|
459
1004
|
TableRow.displayName = "TableRow";
|
|
460
|
-
var TableHead =
|
|
461
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
1005
|
+
var TableHead = React7.forwardRef(
|
|
1006
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx16(
|
|
462
1007
|
"th",
|
|
463
1008
|
{
|
|
464
1009
|
ref,
|
|
@@ -468,17 +1013,17 @@ var TableHead = React3.forwardRef(
|
|
|
468
1013
|
)
|
|
469
1014
|
);
|
|
470
1015
|
TableHead.displayName = "TableHead";
|
|
471
|
-
var TableCell =
|
|
472
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
1016
|
+
var TableCell = React7.forwardRef(
|
|
1017
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx16("td", { ref, className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })
|
|
473
1018
|
);
|
|
474
1019
|
TableCell.displayName = "TableCell";
|
|
475
|
-
var TableCaption =
|
|
476
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
1020
|
+
var TableCaption = React7.forwardRef(
|
|
1021
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx16("caption", { ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })
|
|
477
1022
|
);
|
|
478
1023
|
TableCaption.displayName = "TableCaption";
|
|
479
1024
|
|
|
480
1025
|
// src/components/feedback/loading-state.tsx
|
|
481
|
-
import { jsx as
|
|
1026
|
+
import { jsx as jsx17, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
482
1027
|
function LoadingState({
|
|
483
1028
|
className,
|
|
484
1029
|
title = "Cargando datos",
|
|
@@ -486,86 +1031,92 @@ function LoadingState({
|
|
|
486
1031
|
size = "md",
|
|
487
1032
|
icon
|
|
488
1033
|
}) {
|
|
489
|
-
return /* @__PURE__ */
|
|
1034
|
+
return /* @__PURE__ */ jsxs8(
|
|
490
1035
|
"div",
|
|
491
1036
|
{
|
|
492
1037
|
role: "status",
|
|
493
1038
|
"aria-live": "polite",
|
|
494
1039
|
className: cn("flex items-center gap-3 rounded-xl border border-border bg-card px-4 py-3 text-foreground", className),
|
|
495
1040
|
children: [
|
|
496
|
-
icon ?? /* @__PURE__ */
|
|
497
|
-
/* @__PURE__ */
|
|
498
|
-
/* @__PURE__ */
|
|
499
|
-
/* @__PURE__ */
|
|
1041
|
+
icon ?? /* @__PURE__ */ jsx17(Spinner, { size, className: "text-primary" }),
|
|
1042
|
+
/* @__PURE__ */ jsxs8("div", { className: "grid gap-0.5", children: [
|
|
1043
|
+
/* @__PURE__ */ jsx17("p", { className: "text-sm font-medium", children: title }),
|
|
1044
|
+
/* @__PURE__ */ jsx17("p", { className: "text-xs text-muted-foreground", children: description })
|
|
500
1045
|
] })
|
|
501
1046
|
]
|
|
502
1047
|
}
|
|
503
1048
|
);
|
|
504
1049
|
}
|
|
505
1050
|
function LoadingCard({ className, rows = 3 }) {
|
|
506
|
-
return /* @__PURE__ */
|
|
507
|
-
/* @__PURE__ */
|
|
508
|
-
Array.from({ length: rows }).map((_, index) => /* @__PURE__ */
|
|
509
|
-
/* @__PURE__ */
|
|
1051
|
+
return /* @__PURE__ */ jsx17(Card, { className, children: /* @__PURE__ */ jsxs8(CardContent, { className: "grid gap-3 p-5", children: [
|
|
1052
|
+
/* @__PURE__ */ jsx17(Skeleton, { className: "h-6 w-40" }),
|
|
1053
|
+
Array.from({ length: rows }).map((_, index) => /* @__PURE__ */ jsx17(Skeleton, { className: cn("h-4", index === rows - 1 ? "w-2/3" : "w-full") }, index)),
|
|
1054
|
+
/* @__PURE__ */ jsx17(Skeleton, { className: "mt-1 h-10 w-full rounded-lg" })
|
|
510
1055
|
] }) });
|
|
511
1056
|
}
|
|
512
1057
|
function LoadingTableRows({ className, columns = 5, rows = 4 }) {
|
|
513
|
-
return /* @__PURE__ */
|
|
514
|
-
/* @__PURE__ */
|
|
515
|
-
/* @__PURE__ */
|
|
1058
|
+
return /* @__PURE__ */ jsx17("div", { className: cn("rounded-xl border", className), children: /* @__PURE__ */ jsxs8(Table, { children: [
|
|
1059
|
+
/* @__PURE__ */ jsx17(TableHeader, { children: /* @__PURE__ */ jsx17(TableRow, { children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ jsx17(TableHead, { children: /* @__PURE__ */ jsx17(Skeleton, { className: "h-4 w-20" }) }, index)) }) }),
|
|
1060
|
+
/* @__PURE__ */ jsx17(TableBody, { children: Array.from({ length: rows }).map((_, rowIndex) => /* @__PURE__ */ jsx17(TableRow, { children: Array.from({ length: columns }).map((_2, columnIndex) => /* @__PURE__ */ jsx17(TableCell, { children: /* @__PURE__ */ jsx17(Skeleton, { className: cn("h-4", columnIndex === 0 ? "w-24" : "w-full") }) }, columnIndex)) }, rowIndex)) })
|
|
516
1061
|
] }) });
|
|
517
1062
|
}
|
|
518
1063
|
|
|
1064
|
+
// src/components/feedback/module-skeleton.tsx
|
|
1065
|
+
import { jsx as jsx18, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1066
|
+
function ModuleSkeleton({
|
|
1067
|
+
className,
|
|
1068
|
+
variant = "cards",
|
|
1069
|
+
cardCount = 6,
|
|
1070
|
+
showHeaderAction = true
|
|
1071
|
+
}) {
|
|
1072
|
+
return /* @__PURE__ */ jsxs9("div", { role: "status", "aria-label": "Cargando modulo", className: cn("grid gap-6 p-6", className), children: [
|
|
1073
|
+
/* @__PURE__ */ jsxs9("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [
|
|
1074
|
+
/* @__PURE__ */ jsxs9("div", { className: "grid gap-2", children: [
|
|
1075
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-8 w-52" }),
|
|
1076
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-4 w-72 max-w-full" })
|
|
1077
|
+
] }),
|
|
1078
|
+
showHeaderAction ? /* @__PURE__ */ jsx18(Skeleton, { className: "h-10 w-36" }) : null
|
|
1079
|
+
] }),
|
|
1080
|
+
variant === "cards" ? /* @__PURE__ */ jsx18("div", { className: "grid gap-4 md:grid-cols-2 xl:grid-cols-3", children: Array.from({ length: cardCount }).map((_, index) => /* @__PURE__ */ jsx18(Skeleton, { className: "h-32 w-full rounded-xl" }, index)) }) : null,
|
|
1081
|
+
variant === "table" ? /* @__PURE__ */ jsxs9("div", { className: "rounded-xl border bg-card p-4", children: [
|
|
1082
|
+
/* @__PURE__ */ jsxs9("div", { className: "mb-4 flex flex-wrap gap-3", children: [
|
|
1083
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-10 w-64 max-w-full" }),
|
|
1084
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-10 w-36" })
|
|
1085
|
+
] }),
|
|
1086
|
+
/* @__PURE__ */ jsxs9("div", { className: "grid gap-3", children: [
|
|
1087
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-10 w-full rounded-lg" }),
|
|
1088
|
+
Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ jsx18(Skeleton, { className: "h-14 w-full rounded-lg" }, index))
|
|
1089
|
+
] })
|
|
1090
|
+
] }) : null,
|
|
1091
|
+
variant === "form" ? /* @__PURE__ */ jsxs9("div", { className: "rounded-xl border bg-card p-5", children: [
|
|
1092
|
+
/* @__PURE__ */ jsxs9("div", { className: "grid gap-5 md:grid-cols-2", children: [
|
|
1093
|
+
Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ jsxs9("div", { className: "grid gap-2", children: [
|
|
1094
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-4 w-28" }),
|
|
1095
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-10 w-full" })
|
|
1096
|
+
] }, index)),
|
|
1097
|
+
/* @__PURE__ */ jsxs9("div", { className: "grid gap-2 md:col-span-2", children: [
|
|
1098
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-4 w-32" }),
|
|
1099
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-28 w-full rounded-xl" })
|
|
1100
|
+
] })
|
|
1101
|
+
] }),
|
|
1102
|
+
/* @__PURE__ */ jsxs9("div", { className: "mt-6 flex flex-wrap justify-end gap-3", children: [
|
|
1103
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-10 w-24" }),
|
|
1104
|
+
/* @__PURE__ */ jsx18(Skeleton, { className: "h-10 w-36" })
|
|
1105
|
+
] })
|
|
1106
|
+
] }) : null
|
|
1107
|
+
] });
|
|
1108
|
+
}
|
|
1109
|
+
|
|
519
1110
|
// src/components/feedback/notification.tsx
|
|
520
1111
|
import { AlertCircle, AlertTriangle, CheckCircle2, Info, Loader2 as Loader22 } from "lucide-react";
|
|
521
1112
|
import { toast } from "sonner";
|
|
522
|
-
|
|
523
|
-
// src/components/primitives/button.tsx
|
|
524
|
-
import * as React4 from "react";
|
|
525
|
-
import { Slot } from "@radix-ui/react-slot";
|
|
526
|
-
import { cva as cva2 } from "class-variance-authority";
|
|
527
|
-
import { jsx as jsx12 } from "react/jsx-runtime";
|
|
528
|
-
var buttonVariants = cva2(
|
|
529
|
-
"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",
|
|
530
|
-
{
|
|
531
|
-
variants: {
|
|
532
|
-
variant: {
|
|
533
|
-
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
534
|
-
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
535
|
-
outline: "border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground",
|
|
536
|
-
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
537
|
-
ghost: "text-foreground shadow-none hover:bg-accent hover:text-accent-foreground",
|
|
538
|
-
link: "h-auto px-0 py-0 text-primary underline-offset-4 shadow-none hover:underline"
|
|
539
|
-
},
|
|
540
|
-
size: {
|
|
541
|
-
default: "h-10 px-4 py-2",
|
|
542
|
-
sm: "h-9 rounded-md px-3",
|
|
543
|
-
lg: "h-11 rounded-md px-8",
|
|
544
|
-
icon: "h-10 w-10"
|
|
545
|
-
}
|
|
546
|
-
},
|
|
547
|
-
defaultVariants: {
|
|
548
|
-
variant: "default",
|
|
549
|
-
size: "default"
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
);
|
|
553
|
-
var Button = React4.forwardRef(
|
|
554
|
-
({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
555
|
-
const Comp = asChild ? Slot : "button";
|
|
556
|
-
return /* @__PURE__ */ jsx12(Comp, { className: cn(buttonVariants({ variant, size, className })), ref, ...props });
|
|
557
|
-
}
|
|
558
|
-
);
|
|
559
|
-
Button.displayName = "Button";
|
|
560
|
-
|
|
561
|
-
// src/components/feedback/notification.tsx
|
|
562
|
-
import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1113
|
+
import { jsx as jsx19, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
563
1114
|
var notificationStyles = {
|
|
564
|
-
info: "
|
|
565
|
-
success: "
|
|
566
|
-
warning: "
|
|
567
|
-
danger: "
|
|
568
|
-
loading: "
|
|
1115
|
+
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)]",
|
|
1116
|
+
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)]",
|
|
1117
|
+
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)]",
|
|
1118
|
+
danger: "border-destructive/20 bg-[linear-gradient(135deg,rgba(220,74,65,0.16),rgba(254,242,242,0.96))] text-destructive",
|
|
1119
|
+
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)]"
|
|
569
1120
|
};
|
|
570
1121
|
var notificationIcons = {
|
|
571
1122
|
info: Info,
|
|
@@ -583,20 +1134,24 @@ function NotificationMessage({
|
|
|
583
1134
|
icon
|
|
584
1135
|
}) {
|
|
585
1136
|
const Icon2 = icon ?? notificationIcons[tone];
|
|
586
|
-
return /* @__PURE__ */
|
|
1137
|
+
return /* @__PURE__ */ jsxs10(
|
|
587
1138
|
"div",
|
|
588
1139
|
{
|
|
589
1140
|
role: "status",
|
|
590
|
-
className: cn(
|
|
1141
|
+
className: cn(
|
|
1142
|
+
"flex items-start justify-between gap-3 rounded-xl border px-4 py-3 shadow-sm",
|
|
1143
|
+
notificationStyles[tone],
|
|
1144
|
+
className
|
|
1145
|
+
),
|
|
591
1146
|
children: [
|
|
592
|
-
/* @__PURE__ */
|
|
593
|
-
/* @__PURE__ */
|
|
594
|
-
/* @__PURE__ */
|
|
595
|
-
/* @__PURE__ */
|
|
596
|
-
description ? /* @__PURE__ */
|
|
1147
|
+
/* @__PURE__ */ jsxs10("div", { className: "flex items-start gap-3", children: [
|
|
1148
|
+
/* @__PURE__ */ jsx19("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__ */ jsx19(Icon2, { className: cn("h-4 w-4", tone === "loading" && "animate-spin") }) }),
|
|
1149
|
+
/* @__PURE__ */ jsxs10("div", { className: "grid gap-1", children: [
|
|
1150
|
+
/* @__PURE__ */ jsx19("p", { className: "text-sm font-semibold", children: title }),
|
|
1151
|
+
description ? /* @__PURE__ */ jsx19("div", { className: "text-xs leading-5 opacity-90", children: description }) : null
|
|
597
1152
|
] })
|
|
598
1153
|
] }),
|
|
599
|
-
action ? /* @__PURE__ */
|
|
1154
|
+
action ? /* @__PURE__ */ jsx19("div", { className: "shrink-0", children: action }) : null
|
|
600
1155
|
]
|
|
601
1156
|
}
|
|
602
1157
|
);
|
|
@@ -604,6 +1159,7 @@ function NotificationMessage({
|
|
|
604
1159
|
function buildToastOptions(payload) {
|
|
605
1160
|
return {
|
|
606
1161
|
description: payload.description,
|
|
1162
|
+
duration: payload.duration,
|
|
607
1163
|
action: payload.actionLabel ? {
|
|
608
1164
|
label: payload.actionLabel,
|
|
609
1165
|
onClick: payload.onAction ?? (() => void 0)
|
|
@@ -611,22 +1167,20 @@ function buildToastOptions(payload) {
|
|
|
611
1167
|
};
|
|
612
1168
|
}
|
|
613
1169
|
var notify = {
|
|
614
|
-
info: (payload) => toast(payload.title, buildToastOptions(payload)),
|
|
1170
|
+
info: (payload) => toast.info(payload.title, buildToastOptions(payload)),
|
|
615
1171
|
success: (payload) => toast.success(payload.title, buildToastOptions(payload)),
|
|
616
|
-
warning: (payload) => toast(payload.title,
|
|
617
|
-
...buildToastOptions(payload),
|
|
618
|
-
icon: /* @__PURE__ */ jsx13(AlertTriangle, { className: "h-4 w-4 text-[var(--color-warning)]" })
|
|
619
|
-
}),
|
|
1172
|
+
warning: (payload) => toast.warning(payload.title, buildToastOptions(payload)),
|
|
620
1173
|
danger: (payload) => toast.error(payload.title, buildToastOptions(payload)),
|
|
1174
|
+
error: (payload) => toast.error(payload.title, buildToastOptions(payload)),
|
|
621
1175
|
loading: (payload) => toast.loading(payload.title, buildToastOptions(payload))
|
|
622
1176
|
};
|
|
623
1177
|
function NotificationAction({ children, variant = "outline", size = "sm", ...props }) {
|
|
624
|
-
return /* @__PURE__ */
|
|
1178
|
+
return /* @__PURE__ */ jsx19(Button, { variant, size, ...props, children });
|
|
625
1179
|
}
|
|
626
1180
|
|
|
627
1181
|
// src/components/feedback/status-badge.tsx
|
|
628
|
-
import { AlertCircle as AlertCircle2, CheckCircle2 as CheckCircle22, Clock3, Loader2 as Loader23 } from "lucide-react";
|
|
629
|
-
import { jsx as
|
|
1182
|
+
import { AlertCircle as AlertCircle2, CheckCircle2 as CheckCircle22, Clock3 as Clock32, Loader2 as Loader23 } from "lucide-react";
|
|
1183
|
+
import { jsx as jsx20, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
630
1184
|
var toneStyles2 = {
|
|
631
1185
|
success: "border-transparent bg-[var(--color-success-bg)] text-[var(--color-success)]",
|
|
632
1186
|
warning: "border-transparent bg-[var(--color-warning-bg)] text-[var(--color-warning)]",
|
|
@@ -636,14 +1190,14 @@ var toneStyles2 = {
|
|
|
636
1190
|
};
|
|
637
1191
|
var toneIcons = {
|
|
638
1192
|
success: CheckCircle22,
|
|
639
|
-
warning:
|
|
1193
|
+
warning: Clock32,
|
|
640
1194
|
danger: AlertCircle2,
|
|
641
1195
|
info: CheckCircle22,
|
|
642
1196
|
loading: Loader23
|
|
643
1197
|
};
|
|
644
1198
|
function StatusBadge({ children, tone = "info", className }) {
|
|
645
1199
|
const Icon2 = toneIcons[tone];
|
|
646
|
-
return /* @__PURE__ */
|
|
1200
|
+
return /* @__PURE__ */ jsxs11(
|
|
647
1201
|
"span",
|
|
648
1202
|
{
|
|
649
1203
|
className: cn(
|
|
@@ -652,30 +1206,146 @@ function StatusBadge({ children, tone = "info", className }) {
|
|
|
652
1206
|
className
|
|
653
1207
|
),
|
|
654
1208
|
children: [
|
|
655
|
-
/* @__PURE__ */
|
|
1209
|
+
/* @__PURE__ */ jsx20(Icon2, { className: cn("h-3.5 w-3.5", tone === "loading" && "animate-spin") }),
|
|
656
1210
|
children
|
|
657
1211
|
]
|
|
658
1212
|
}
|
|
659
1213
|
);
|
|
660
1214
|
}
|
|
661
1215
|
|
|
1216
|
+
// src/components/feedback/sync-status-badge.tsx
|
|
1217
|
+
import { AlertCircle as AlertCircle3, CheckCircle2 as CheckCircle23, Clock3 as Clock33, Loader2 as Loader24, WifiOff } from "lucide-react";
|
|
1218
|
+
import { jsx as jsx21, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1219
|
+
var badgeStyles = {
|
|
1220
|
+
synced: "border-transparent bg-[var(--color-success-bg)] text-[var(--color-success)]",
|
|
1221
|
+
pending: "border-transparent bg-[var(--color-warning-bg)] text-[var(--color-warning)]",
|
|
1222
|
+
syncing: "border-transparent bg-[var(--color-info-bg)] text-[var(--color-accent-blue)]",
|
|
1223
|
+
conflict: "border-transparent bg-destructive/10 text-destructive",
|
|
1224
|
+
offline: "border-transparent bg-muted text-muted-foreground"
|
|
1225
|
+
};
|
|
1226
|
+
var badgeIcons = {
|
|
1227
|
+
synced: CheckCircle23,
|
|
1228
|
+
pending: Clock33,
|
|
1229
|
+
syncing: Loader24,
|
|
1230
|
+
conflict: AlertCircle3,
|
|
1231
|
+
offline: WifiOff
|
|
1232
|
+
};
|
|
1233
|
+
var badgeLabels = {
|
|
1234
|
+
synced: "Sincronizado",
|
|
1235
|
+
pending: "Pendiente",
|
|
1236
|
+
syncing: "Sincronizando",
|
|
1237
|
+
conflict: "Conflicto",
|
|
1238
|
+
offline: "Offline"
|
|
1239
|
+
};
|
|
1240
|
+
function SyncStatusBadge({ className, status, label }) {
|
|
1241
|
+
const Icon2 = badgeIcons[status];
|
|
1242
|
+
return /* @__PURE__ */ jsxs12(
|
|
1243
|
+
"span",
|
|
1244
|
+
{
|
|
1245
|
+
className: cn(
|
|
1246
|
+
"inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium",
|
|
1247
|
+
badgeStyles[status],
|
|
1248
|
+
className
|
|
1249
|
+
),
|
|
1250
|
+
children: [
|
|
1251
|
+
/* @__PURE__ */ jsx21(Icon2, { className: cn("h-3.5 w-3.5", status === "syncing" && "animate-spin") }),
|
|
1252
|
+
label ?? badgeLabels[status]
|
|
1253
|
+
]
|
|
1254
|
+
}
|
|
1255
|
+
);
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
// src/components/feedback/sync-status-bar.tsx
|
|
1259
|
+
import { AlertTriangle as AlertTriangle2, CheckCircle2 as CheckCircle24, Loader2 as Loader25, RefreshCw, WifiOff as WifiOff2 } from "lucide-react";
|
|
1260
|
+
import { jsx as jsx22, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
1261
|
+
function pluralize(count, singular, plural) {
|
|
1262
|
+
return `${count} ${count === 1 ? singular : plural}`;
|
|
1263
|
+
}
|
|
1264
|
+
function SyncStatusBar({
|
|
1265
|
+
className,
|
|
1266
|
+
state,
|
|
1267
|
+
pendingCount = 0,
|
|
1268
|
+
errorCount = 0,
|
|
1269
|
+
syncingCount = 0,
|
|
1270
|
+
onClick,
|
|
1271
|
+
label
|
|
1272
|
+
}) {
|
|
1273
|
+
const config = {
|
|
1274
|
+
conflict: {
|
|
1275
|
+
icon: AlertTriangle2,
|
|
1276
|
+
text: label ?? `${pluralize(errorCount || 1, "operacion", "operaciones")} con error`,
|
|
1277
|
+
className: "bg-destructive/15 text-destructive"
|
|
1278
|
+
},
|
|
1279
|
+
offline: {
|
|
1280
|
+
icon: WifiOff2,
|
|
1281
|
+
text: label ?? (pendingCount > 0 ? `Offline \xB7 ${pluralize(pendingCount, "pendiente", "pendientes")}` : "Offline \xB7 sin pendientes"),
|
|
1282
|
+
className: "bg-[var(--color-warning-bg)] text-[var(--color-warning)]"
|
|
1283
|
+
},
|
|
1284
|
+
syncing: {
|
|
1285
|
+
icon: Loader25,
|
|
1286
|
+
text: label ?? `Sincronizando ${pluralize(syncingCount || 1, "operacion", "operaciones")}...`,
|
|
1287
|
+
className: "bg-[var(--color-info-bg)] text-[var(--color-accent-blue)]",
|
|
1288
|
+
spinning: true
|
|
1289
|
+
},
|
|
1290
|
+
pending: {
|
|
1291
|
+
icon: RefreshCw,
|
|
1292
|
+
text: label ?? `${pluralize(pendingCount || 1, "pendiente", "pendientes")} por sincronizar`,
|
|
1293
|
+
className: "bg-[var(--color-warning-bg)] text-[var(--color-warning)]"
|
|
1294
|
+
},
|
|
1295
|
+
synced: {
|
|
1296
|
+
icon: CheckCircle24,
|
|
1297
|
+
text: label ?? "Todo sincronizado",
|
|
1298
|
+
className: "bg-[var(--color-success-bg)] text-[var(--color-success)]"
|
|
1299
|
+
}
|
|
1300
|
+
};
|
|
1301
|
+
const current = config[state];
|
|
1302
|
+
const Icon2 = current.icon;
|
|
1303
|
+
const isClickable = typeof onClick === "function";
|
|
1304
|
+
const Component = isClickable ? "button" : "div";
|
|
1305
|
+
return /* @__PURE__ */ jsxs13(
|
|
1306
|
+
Component,
|
|
1307
|
+
{
|
|
1308
|
+
...isClickable ? { type: "button", onClick } : {},
|
|
1309
|
+
className: cn(
|
|
1310
|
+
"flex h-8 w-full items-center justify-center gap-1.5 px-4 text-xs font-medium transition-opacity",
|
|
1311
|
+
current.className,
|
|
1312
|
+
isClickable ? "cursor-pointer hover:opacity-85 active:opacity-70" : "cursor-default",
|
|
1313
|
+
className
|
|
1314
|
+
),
|
|
1315
|
+
children: [
|
|
1316
|
+
/* @__PURE__ */ jsx22(Icon2, { className: cn("h-3.5 w-3.5", current.spinning && "animate-spin") }),
|
|
1317
|
+
/* @__PURE__ */ jsx22("span", { children: current.text }),
|
|
1318
|
+
isClickable ? /* @__PURE__ */ jsx22("span", { className: "ml-1 text-[10px] opacity-60", children: "\u2192" }) : null
|
|
1319
|
+
]
|
|
1320
|
+
}
|
|
1321
|
+
);
|
|
1322
|
+
}
|
|
1323
|
+
|
|
662
1324
|
// src/components/feedback/toaster.tsx
|
|
1325
|
+
import { LoaderCircle } from "lucide-react";
|
|
663
1326
|
import { Toaster as Sonner } from "sonner";
|
|
664
|
-
import { jsx as
|
|
1327
|
+
import { jsx as jsx23 } from "react/jsx-runtime";
|
|
665
1328
|
function Toaster(props) {
|
|
666
1329
|
const { resolvedTheme } = useTheme();
|
|
667
|
-
return /* @__PURE__ */
|
|
1330
|
+
return /* @__PURE__ */ jsx23(
|
|
668
1331
|
Sonner,
|
|
669
1332
|
{
|
|
670
1333
|
theme: resolvedTheme,
|
|
1334
|
+
position: "top-right",
|
|
1335
|
+
richColors: true,
|
|
671
1336
|
className: "toaster group",
|
|
1337
|
+
icons: {
|
|
1338
|
+
loading: /* @__PURE__ */ jsx23(LoaderCircle, { className: "h-4 w-4 animate-spin" })
|
|
1339
|
+
},
|
|
672
1340
|
closeButton: true,
|
|
673
1341
|
toastOptions: {
|
|
674
1342
|
classNames: {
|
|
675
|
-
toast: "group toast group-[.toaster]:
|
|
1343
|
+
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",
|
|
1344
|
+
title: "text-sm font-semibold",
|
|
676
1345
|
description: "group-[.toast]:text-muted-foreground",
|
|
677
|
-
actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
|
|
678
|
-
cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"
|
|
1346
|
+
actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground group-[.toast]:rounded-md",
|
|
1347
|
+
cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground group-[.toast]:rounded-md",
|
|
1348
|
+
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"
|
|
679
1349
|
}
|
|
680
1350
|
},
|
|
681
1351
|
...props
|
|
@@ -684,15 +1354,15 @@ function Toaster(props) {
|
|
|
684
1354
|
}
|
|
685
1355
|
|
|
686
1356
|
// src/components/forms/searchable-select.tsx
|
|
687
|
-
import * as
|
|
688
|
-
import { Check, ChevronDown, ChevronUp, Loader2 as
|
|
1357
|
+
import * as React9 from "react";
|
|
1358
|
+
import { Check, ChevronDown, ChevronUp, Loader2 as Loader26, Search } from "lucide-react";
|
|
689
1359
|
|
|
690
1360
|
// src/components/primitives/input.tsx
|
|
691
|
-
import * as
|
|
692
|
-
import { jsx as
|
|
693
|
-
var Input =
|
|
1361
|
+
import * as React8 from "react";
|
|
1362
|
+
import { jsx as jsx24 } from "react/jsx-runtime";
|
|
1363
|
+
var Input = React8.forwardRef(
|
|
694
1364
|
({ className, type, ...props }, ref) => {
|
|
695
|
-
return /* @__PURE__ */
|
|
1365
|
+
return /* @__PURE__ */ jsx24(
|
|
696
1366
|
"input",
|
|
697
1367
|
{
|
|
698
1368
|
type,
|
|
@@ -709,11 +1379,11 @@ var Input = React5.forwardRef(
|
|
|
709
1379
|
Input.displayName = "Input";
|
|
710
1380
|
|
|
711
1381
|
// src/components/forms/searchable-select.tsx
|
|
712
|
-
import { jsx as
|
|
1382
|
+
import { jsx as jsx25, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
713
1383
|
function normalize(str) {
|
|
714
1384
|
return str.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
|
|
715
1385
|
}
|
|
716
|
-
var SearchableSelect =
|
|
1386
|
+
var SearchableSelect = React9.forwardRef(
|
|
717
1387
|
({
|
|
718
1388
|
options: options2,
|
|
719
1389
|
value,
|
|
@@ -726,12 +1396,12 @@ var SearchableSelect = React6.forwardRef(
|
|
|
726
1396
|
id,
|
|
727
1397
|
className
|
|
728
1398
|
}, ref) => {
|
|
729
|
-
const [open, setOpen] =
|
|
730
|
-
const [search, setSearch] =
|
|
731
|
-
const wrapperRef =
|
|
732
|
-
const searchRef =
|
|
733
|
-
const selected =
|
|
734
|
-
const filtered =
|
|
1399
|
+
const [open, setOpen] = React9.useState(false);
|
|
1400
|
+
const [search, setSearch] = React9.useState("");
|
|
1401
|
+
const wrapperRef = React9.useRef(null);
|
|
1402
|
+
const searchRef = React9.useRef(null);
|
|
1403
|
+
const selected = React9.useMemo(() => options2.find((option) => option.value === value) ?? null, [options2, value]);
|
|
1404
|
+
const filtered = React9.useMemo(() => {
|
|
735
1405
|
if (!search.trim()) {
|
|
736
1406
|
return options2;
|
|
737
1407
|
}
|
|
@@ -757,7 +1427,7 @@ var SearchableSelect = React6.forwardRef(
|
|
|
757
1427
|
setSearch("");
|
|
758
1428
|
}
|
|
759
1429
|
}
|
|
760
|
-
|
|
1430
|
+
React9.useEffect(() => {
|
|
761
1431
|
if (!open) {
|
|
762
1432
|
return;
|
|
763
1433
|
}
|
|
@@ -770,15 +1440,15 @@ var SearchableSelect = React6.forwardRef(
|
|
|
770
1440
|
document.addEventListener("mousedown", handleMouseDown);
|
|
771
1441
|
return () => document.removeEventListener("mousedown", handleMouseDown);
|
|
772
1442
|
}, [open]);
|
|
773
|
-
|
|
1443
|
+
React9.useEffect(() => {
|
|
774
1444
|
if (!open) {
|
|
775
1445
|
return;
|
|
776
1446
|
}
|
|
777
1447
|
const timer = setTimeout(() => searchRef.current?.focus(), 50);
|
|
778
1448
|
return () => clearTimeout(timer);
|
|
779
1449
|
}, [open]);
|
|
780
|
-
return /* @__PURE__ */
|
|
781
|
-
/* @__PURE__ */
|
|
1450
|
+
return /* @__PURE__ */ jsxs14("div", { ref: wrapperRef, className: cn("relative w-full", className), onKeyDown: handleKeyDown, children: [
|
|
1451
|
+
/* @__PURE__ */ jsxs14(
|
|
782
1452
|
"button",
|
|
783
1453
|
{
|
|
784
1454
|
ref,
|
|
@@ -793,26 +1463,26 @@ var SearchableSelect = React6.forwardRef(
|
|
|
793
1463
|
"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"
|
|
794
1464
|
),
|
|
795
1465
|
children: [
|
|
796
|
-
loading ? /* @__PURE__ */
|
|
797
|
-
/* @__PURE__ */
|
|
1466
|
+
loading ? /* @__PURE__ */ jsxs14("span", { className: "flex items-center gap-2 text-muted-foreground", children: [
|
|
1467
|
+
/* @__PURE__ */ jsx25(Loader26, { className: "h-4 w-4 animate-spin" }),
|
|
798
1468
|
"Loading..."
|
|
799
|
-
] }) : selected ? /* @__PURE__ */
|
|
800
|
-
selected.sublabel ? /* @__PURE__ */
|
|
801
|
-
/* @__PURE__ */
|
|
802
|
-
] }) : /* @__PURE__ */
|
|
803
|
-
/* @__PURE__ */
|
|
1469
|
+
] }) : selected ? /* @__PURE__ */ jsxs14("span", { className: "flex items-center gap-2 truncate", children: [
|
|
1470
|
+
selected.sublabel ? /* @__PURE__ */ jsx25("span", { className: "shrink-0 font-mono text-xs text-muted-foreground", children: selected.sublabel }) : null,
|
|
1471
|
+
/* @__PURE__ */ jsx25("span", { className: "truncate", children: selected.label })
|
|
1472
|
+
] }) : /* @__PURE__ */ jsx25("span", { className: "text-muted-foreground", children: placeholder }),
|
|
1473
|
+
/* @__PURE__ */ jsx25("span", { className: "ml-2 shrink-0 opacity-50", children: open ? /* @__PURE__ */ jsx25(ChevronUp, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx25(ChevronDown, { className: "h-4 w-4" }) })
|
|
804
1474
|
]
|
|
805
1475
|
}
|
|
806
1476
|
),
|
|
807
|
-
open ? /* @__PURE__ */
|
|
1477
|
+
open ? /* @__PURE__ */ jsxs14(
|
|
808
1478
|
"div",
|
|
809
1479
|
{
|
|
810
1480
|
role: "listbox",
|
|
811
1481
|
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",
|
|
812
1482
|
children: [
|
|
813
|
-
/* @__PURE__ */
|
|
814
|
-
/* @__PURE__ */
|
|
815
|
-
/* @__PURE__ */
|
|
1483
|
+
/* @__PURE__ */ jsxs14("div", { className: "sticky top-0 flex items-center gap-2 border-b border-border bg-popover px-3 py-2", children: [
|
|
1484
|
+
/* @__PURE__ */ jsx25(Search, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
|
|
1485
|
+
/* @__PURE__ */ jsx25(
|
|
816
1486
|
Input,
|
|
817
1487
|
{
|
|
818
1488
|
ref: searchRef,
|
|
@@ -824,9 +1494,9 @@ var SearchableSelect = React6.forwardRef(
|
|
|
824
1494
|
}
|
|
825
1495
|
)
|
|
826
1496
|
] }),
|
|
827
|
-
/* @__PURE__ */
|
|
1497
|
+
/* @__PURE__ */ jsx25("ul", { className: "max-h-60 overflow-y-auto overscroll-contain p-1", children: filtered.length === 0 ? /* @__PURE__ */ jsx25("li", { className: "px-4 py-3 text-center text-xs text-muted-foreground", children: emptyMessage }) : filtered.map((option) => {
|
|
828
1498
|
const isSelected = option.value === value;
|
|
829
|
-
return /* @__PURE__ */
|
|
1499
|
+
return /* @__PURE__ */ jsxs14(
|
|
830
1500
|
"li",
|
|
831
1501
|
{
|
|
832
1502
|
role: "option",
|
|
@@ -837,10 +1507,10 @@ var SearchableSelect = React6.forwardRef(
|
|
|
837
1507
|
isSelected && "bg-accent/50 font-medium"
|
|
838
1508
|
),
|
|
839
1509
|
children: [
|
|
840
|
-
/* @__PURE__ */
|
|
841
|
-
/* @__PURE__ */
|
|
842
|
-
option.sublabel ? /* @__PURE__ */
|
|
843
|
-
/* @__PURE__ */
|
|
1510
|
+
/* @__PURE__ */ jsx25("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: isSelected ? /* @__PURE__ */ jsx25(Check, { className: "h-4 w-4" }) : null }),
|
|
1511
|
+
/* @__PURE__ */ jsxs14("span", { className: "flex items-center gap-2 truncate", children: [
|
|
1512
|
+
option.sublabel ? /* @__PURE__ */ jsx25("span", { className: "shrink-0 font-mono text-xs text-muted-foreground", children: option.sublabel }) : null,
|
|
1513
|
+
/* @__PURE__ */ jsx25("span", { className: "truncate", children: option.label })
|
|
844
1514
|
] })
|
|
845
1515
|
]
|
|
846
1516
|
},
|
|
@@ -856,14 +1526,14 @@ var SearchableSelect = React6.forwardRef(
|
|
|
856
1526
|
SearchableSelect.displayName = "SearchableSelect";
|
|
857
1527
|
|
|
858
1528
|
// src/components/forms/select.tsx
|
|
859
|
-
import * as
|
|
1529
|
+
import * as React10 from "react";
|
|
860
1530
|
import * as SelectPrimitive from "@radix-ui/react-select";
|
|
861
1531
|
import { Check as Check2, ChevronDown as ChevronDown2, ChevronUp as ChevronUp2 } from "lucide-react";
|
|
862
|
-
import { jsx as
|
|
1532
|
+
import { jsx as jsx26, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
863
1533
|
var Select = SelectPrimitive.Root;
|
|
864
1534
|
var SelectGroup = SelectPrimitive.Group;
|
|
865
1535
|
var SelectValue = SelectPrimitive.Value;
|
|
866
|
-
var SelectTrigger =
|
|
1536
|
+
var SelectTrigger = React10.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs15(
|
|
867
1537
|
SelectPrimitive.Trigger,
|
|
868
1538
|
{
|
|
869
1539
|
ref,
|
|
@@ -874,24 +1544,24 @@ var SelectTrigger = React7.forwardRef(({ className, children, ...props }, ref) =
|
|
|
874
1544
|
...props,
|
|
875
1545
|
children: [
|
|
876
1546
|
children,
|
|
877
|
-
/* @__PURE__ */
|
|
1547
|
+
/* @__PURE__ */ jsx26(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx26(ChevronDown2, { className: "h-4 w-4 opacity-50" }) })
|
|
878
1548
|
]
|
|
879
1549
|
}
|
|
880
1550
|
));
|
|
881
1551
|
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
|
882
|
-
var SelectScrollUpButton =
|
|
1552
|
+
var SelectScrollUpButton = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(SelectPrimitive.ScrollUpButton, { ref, className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: /* @__PURE__ */ jsx26(ChevronUp2, { className: "h-4 w-4" }) }));
|
|
883
1553
|
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
|
|
884
|
-
var SelectScrollDownButton =
|
|
1554
|
+
var SelectScrollDownButton = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(
|
|
885
1555
|
SelectPrimitive.ScrollDownButton,
|
|
886
1556
|
{
|
|
887
1557
|
ref,
|
|
888
1558
|
className: cn("flex cursor-default items-center justify-center py-1", className),
|
|
889
1559
|
...props,
|
|
890
|
-
children: /* @__PURE__ */
|
|
1560
|
+
children: /* @__PURE__ */ jsx26(ChevronDown2, { className: "h-4 w-4" })
|
|
891
1561
|
}
|
|
892
1562
|
));
|
|
893
1563
|
SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
|
|
894
|
-
var SelectContent =
|
|
1564
|
+
var SelectContent = React10.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx26(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs15(
|
|
895
1565
|
SelectPrimitive.Content,
|
|
896
1566
|
{
|
|
897
1567
|
ref,
|
|
@@ -903,8 +1573,8 @@ var SelectContent = React7.forwardRef(({ className, children, position = "popper
|
|
|
903
1573
|
position,
|
|
904
1574
|
...props,
|
|
905
1575
|
children: [
|
|
906
|
-
/* @__PURE__ */
|
|
907
|
-
/* @__PURE__ */
|
|
1576
|
+
/* @__PURE__ */ jsx26(SelectScrollUpButton, {}),
|
|
1577
|
+
/* @__PURE__ */ jsx26(
|
|
908
1578
|
SelectPrimitive.Viewport,
|
|
909
1579
|
{
|
|
910
1580
|
className: cn(
|
|
@@ -914,14 +1584,14 @@ var SelectContent = React7.forwardRef(({ className, children, position = "popper
|
|
|
914
1584
|
children
|
|
915
1585
|
}
|
|
916
1586
|
),
|
|
917
|
-
/* @__PURE__ */
|
|
1587
|
+
/* @__PURE__ */ jsx26(SelectScrollDownButton, {})
|
|
918
1588
|
]
|
|
919
1589
|
}
|
|
920
1590
|
) }));
|
|
921
1591
|
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
922
|
-
var SelectLabel =
|
|
1592
|
+
var SelectLabel = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(SelectPrimitive.Label, { ref, className: cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className), ...props }));
|
|
923
1593
|
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
|
924
|
-
var SelectItem =
|
|
1594
|
+
var SelectItem = React10.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs15(
|
|
925
1595
|
SelectPrimitive.Item,
|
|
926
1596
|
{
|
|
927
1597
|
ref,
|
|
@@ -931,80 +1601,80 @@ var SelectItem = React7.forwardRef(({ className, children, ...props }, ref) => /
|
|
|
931
1601
|
),
|
|
932
1602
|
...props,
|
|
933
1603
|
children: [
|
|
934
|
-
/* @__PURE__ */
|
|
935
|
-
/* @__PURE__ */
|
|
1604
|
+
/* @__PURE__ */ jsx26("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx26(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx26(Check2, { className: "h-4 w-4" }) }) }),
|
|
1605
|
+
/* @__PURE__ */ jsx26(SelectPrimitive.ItemText, { children })
|
|
936
1606
|
]
|
|
937
1607
|
}
|
|
938
1608
|
));
|
|
939
1609
|
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
|
940
|
-
var SelectSeparator =
|
|
1610
|
+
var SelectSeparator = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(SelectPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props }));
|
|
941
1611
|
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
942
1612
|
|
|
943
1613
|
// src/components/layout/app-shell.tsx
|
|
944
1614
|
import { useState as useState3 } from "react";
|
|
945
1615
|
|
|
946
1616
|
// src/components/overlays/drawer.tsx
|
|
947
|
-
import * as
|
|
1617
|
+
import * as React11 from "react";
|
|
948
1618
|
import { Drawer as DrawerPrimitive } from "vaul";
|
|
949
|
-
import { jsx as
|
|
950
|
-
var Drawer = ({ shouldScaleBackground = true, ...props }) => /* @__PURE__ */
|
|
1619
|
+
import { jsx as jsx27, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
1620
|
+
var Drawer = ({ shouldScaleBackground = true, ...props }) => /* @__PURE__ */ jsx27(DrawerPrimitive.Root, { shouldScaleBackground, ...props });
|
|
951
1621
|
Drawer.displayName = "Drawer";
|
|
952
1622
|
var DrawerTrigger = DrawerPrimitive.Trigger;
|
|
953
1623
|
var DrawerPortal = DrawerPrimitive.Portal;
|
|
954
1624
|
var DrawerClose = DrawerPrimitive.Close;
|
|
955
|
-
var DrawerOverlay =
|
|
1625
|
+
var DrawerOverlay = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(DrawerPrimitive.Overlay, { ref, className: cn("fixed inset-0 z-50 bg-black/80", className), ...props }));
|
|
956
1626
|
DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
|
|
957
|
-
var DrawerContent =
|
|
958
|
-
/* @__PURE__ */
|
|
959
|
-
/* @__PURE__ */
|
|
1627
|
+
var DrawerContent = React11.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs16(DrawerPortal, { children: [
|
|
1628
|
+
/* @__PURE__ */ jsx27(DrawerOverlay, {}),
|
|
1629
|
+
/* @__PURE__ */ jsxs16(
|
|
960
1630
|
DrawerPrimitive.Content,
|
|
961
1631
|
{
|
|
962
1632
|
ref,
|
|
963
1633
|
className: cn("fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background", className),
|
|
964
1634
|
...props,
|
|
965
1635
|
children: [
|
|
966
|
-
/* @__PURE__ */
|
|
1636
|
+
/* @__PURE__ */ jsx27("div", { className: "mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" }),
|
|
967
1637
|
children
|
|
968
1638
|
]
|
|
969
1639
|
}
|
|
970
1640
|
)
|
|
971
1641
|
] }));
|
|
972
1642
|
DrawerContent.displayName = "DrawerContent";
|
|
973
|
-
var DrawerHeader = ({ className, ...props }) => /* @__PURE__ */
|
|
1643
|
+
var DrawerHeader = ({ className, ...props }) => /* @__PURE__ */ jsx27("div", { className: cn("grid gap-1.5 p-4 text-center sm:text-left", className), ...props });
|
|
974
1644
|
DrawerHeader.displayName = "DrawerHeader";
|
|
975
|
-
var DrawerFooter = ({ className, ...props }) => /* @__PURE__ */
|
|
1645
|
+
var DrawerFooter = ({ className, ...props }) => /* @__PURE__ */ jsx27("div", { className: cn("mt-auto flex flex-col gap-2 p-4", className), ...props });
|
|
976
1646
|
DrawerFooter.displayName = "DrawerFooter";
|
|
977
|
-
var DrawerTitle =
|
|
1647
|
+
var DrawerTitle = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(DrawerPrimitive.Title, { ref, className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props }));
|
|
978
1648
|
DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
|
|
979
|
-
var DrawerDescription =
|
|
1649
|
+
var DrawerDescription = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(DrawerPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
980
1650
|
DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
|
|
981
1651
|
|
|
982
1652
|
// src/components/navigation/navbar.tsx
|
|
983
1653
|
import { Menu } from "lucide-react";
|
|
984
|
-
import { jsx as
|
|
1654
|
+
import { jsx as jsx28, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
985
1655
|
function Navbar({ brand, actions, onMenuClick, className }) {
|
|
986
|
-
return /* @__PURE__ */
|
|
987
|
-
/* @__PURE__ */
|
|
988
|
-
onMenuClick ? /* @__PURE__ */
|
|
1656
|
+
return /* @__PURE__ */ jsx28("header", { className: cn("h-14 shrink-0 border-b border-border bg-card/80 px-4 backdrop-blur-sm", className), children: /* @__PURE__ */ jsxs17("div", { className: "mx-auto flex h-full w-full max-w-7xl items-center justify-between gap-3", children: [
|
|
1657
|
+
/* @__PURE__ */ jsxs17("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [
|
|
1658
|
+
onMenuClick ? /* @__PURE__ */ jsx28(Button, { type: "button", variant: "ghost", size: "icon", onClick: onMenuClick, "aria-label": "Open navigation", children: /* @__PURE__ */ jsx28(Menu, { size: 20 }) }) : null,
|
|
989
1659
|
brand
|
|
990
1660
|
] }),
|
|
991
|
-
actions ? /* @__PURE__ */
|
|
1661
|
+
actions ? /* @__PURE__ */ jsx28("div", { className: "flex shrink-0 items-center gap-3", children: actions }) : null
|
|
992
1662
|
] }) });
|
|
993
1663
|
}
|
|
994
1664
|
|
|
995
1665
|
// src/components/navigation/sidebar.tsx
|
|
996
|
-
import { jsx as
|
|
1666
|
+
import { jsx as jsx29, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
997
1667
|
function getInitials2(name) {
|
|
998
1668
|
return name.trim().split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join("");
|
|
999
1669
|
}
|
|
1000
1670
|
function Sidebar({ brand, groups, user, footerAction, className }) {
|
|
1001
|
-
return /* @__PURE__ */
|
|
1002
|
-
/* @__PURE__ */
|
|
1003
|
-
/* @__PURE__ */
|
|
1004
|
-
/* @__PURE__ */
|
|
1005
|
-
/* @__PURE__ */
|
|
1671
|
+
return /* @__PURE__ */ jsxs18("aside", { className: cn("flex h-full w-72 max-w-[85vw] flex-col border-r border-border bg-background", className), children: [
|
|
1672
|
+
/* @__PURE__ */ jsx29("div", { className: "border-b border-border px-5 py-4", children: brand }),
|
|
1673
|
+
/* @__PURE__ */ jsx29("nav", { className: "flex-1 space-y-6 overflow-y-auto px-3 py-4", children: groups.map((group) => /* @__PURE__ */ jsxs18("div", { children: [
|
|
1674
|
+
/* @__PURE__ */ jsx29("p", { className: "mb-2 px-2 text-xs font-semibold uppercase tracking-widest text-muted-foreground", children: group.label }),
|
|
1675
|
+
/* @__PURE__ */ jsx29("ul", { className: "space-y-0.5", children: group.items.map((item) => {
|
|
1006
1676
|
const Icon2 = item.icon;
|
|
1007
|
-
return /* @__PURE__ */
|
|
1677
|
+
return /* @__PURE__ */ jsx29("li", { children: /* @__PURE__ */ jsxs18(
|
|
1008
1678
|
"a",
|
|
1009
1679
|
{
|
|
1010
1680
|
href: item.href,
|
|
@@ -1014,26 +1684,26 @@ function Sidebar({ brand, groups, user, footerAction, className }) {
|
|
|
1014
1684
|
item.active ? "bg-primary text-primary-foreground" : "text-foreground hover:bg-accent hover:text-accent-foreground"
|
|
1015
1685
|
),
|
|
1016
1686
|
children: [
|
|
1017
|
-
Icon2 ? /* @__PURE__ */
|
|
1018
|
-
/* @__PURE__ */
|
|
1687
|
+
Icon2 ? /* @__PURE__ */ jsx29(Icon2, { size: 17, className: "shrink-0" }) : null,
|
|
1688
|
+
/* @__PURE__ */ jsx29("span", { className: "flex-1", children: item.label })
|
|
1019
1689
|
]
|
|
1020
1690
|
}
|
|
1021
1691
|
) }, `${group.label}-${item.label}`);
|
|
1022
1692
|
}) })
|
|
1023
1693
|
] }, group.label)) }),
|
|
1024
|
-
user ? /* @__PURE__ */
|
|
1025
|
-
/* @__PURE__ */
|
|
1026
|
-
/* @__PURE__ */
|
|
1027
|
-
/* @__PURE__ */
|
|
1028
|
-
user.role ? /* @__PURE__ */
|
|
1694
|
+
user ? /* @__PURE__ */ jsx29("div", { className: "border-t border-border px-5 py-4", children: /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-3", children: [
|
|
1695
|
+
/* @__PURE__ */ jsx29(Avatar, { className: "h-9 w-9 shrink-0", children: /* @__PURE__ */ jsx29(AvatarFallback, { className: "bg-primary text-xs font-semibold text-primary-foreground", children: user.initials ?? getInitials2(user.name) }) }),
|
|
1696
|
+
/* @__PURE__ */ jsxs18("div", { className: "min-w-0 flex-1", children: [
|
|
1697
|
+
/* @__PURE__ */ jsx29("p", { className: "truncate text-sm font-medium text-foreground", children: user.name }),
|
|
1698
|
+
user.role ? /* @__PURE__ */ jsx29("p", { className: "truncate text-xs text-muted-foreground", children: user.role }) : null
|
|
1029
1699
|
] }),
|
|
1030
|
-
footerAction ? /* @__PURE__ */
|
|
1700
|
+
footerAction ? /* @__PURE__ */ jsx29(Button, { type: "button", variant: "ghost", size: "sm", onClick: footerAction.onClick, children: footerAction.label }) : null
|
|
1031
1701
|
] }) }) : null
|
|
1032
1702
|
] });
|
|
1033
1703
|
}
|
|
1034
1704
|
|
|
1035
1705
|
// src/components/layout/app-shell.tsx
|
|
1036
|
-
import { jsx as
|
|
1706
|
+
import { jsx as jsx30, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1037
1707
|
function AppShell({
|
|
1038
1708
|
brand,
|
|
1039
1709
|
actions,
|
|
@@ -1043,248 +1713,129 @@ function AppShell({
|
|
|
1043
1713
|
children
|
|
1044
1714
|
}) {
|
|
1045
1715
|
const [open, setOpen] = useState3(false);
|
|
1046
|
-
return /* @__PURE__ */
|
|
1047
|
-
/* @__PURE__ */
|
|
1048
|
-
/* @__PURE__ */
|
|
1049
|
-
/* @__PURE__ */
|
|
1716
|
+
return /* @__PURE__ */ jsxs19("div", { className: "min-h-screen bg-background", children: [
|
|
1717
|
+
/* @__PURE__ */ jsx30(Navbar, { brand, actions, onMenuClick: () => setOpen(true) }),
|
|
1718
|
+
/* @__PURE__ */ jsx30(Drawer, { open, onOpenChange: setOpen, direction: "left", children: /* @__PURE__ */ jsx30(DrawerContent, { className: "h-full w-72 rounded-none border-r border-border p-0", children: /* @__PURE__ */ jsx30(Sidebar, { brand, groups: sidebarGroups, user: sidebarUser, footerAction: sidebarFooterAction }) }) }),
|
|
1719
|
+
/* @__PURE__ */ jsx30("main", { className: "mx-auto w-full max-w-7xl px-4 py-6 sm:px-6", children })
|
|
1050
1720
|
] });
|
|
1051
1721
|
}
|
|
1052
1722
|
|
|
1053
1723
|
// src/components/layout/form-section.tsx
|
|
1054
|
-
import { jsx as
|
|
1724
|
+
import { jsx as jsx31, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1055
1725
|
function FormSection({ title, description, children }) {
|
|
1056
|
-
return /* @__PURE__ */
|
|
1057
|
-
/* @__PURE__ */
|
|
1058
|
-
/* @__PURE__ */
|
|
1059
|
-
description ? /* @__PURE__ */
|
|
1726
|
+
return /* @__PURE__ */ jsxs20(Card, { children: [
|
|
1727
|
+
/* @__PURE__ */ jsxs20(CardHeader, { children: [
|
|
1728
|
+
/* @__PURE__ */ jsx31(CardTitle, { children: title }),
|
|
1729
|
+
description ? /* @__PURE__ */ jsx31(CardDescription, { children: description }) : null
|
|
1060
1730
|
] }),
|
|
1061
|
-
/* @__PURE__ */
|
|
1731
|
+
/* @__PURE__ */ jsx31(CardContent, { children })
|
|
1062
1732
|
] });
|
|
1063
1733
|
}
|
|
1064
1734
|
|
|
1065
1735
|
// src/components/layout/page-header.tsx
|
|
1066
|
-
import { jsx as
|
|
1736
|
+
import { jsx as jsx32, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
1067
1737
|
function PageHeader({ title, description, action }) {
|
|
1068
|
-
return /* @__PURE__ */
|
|
1069
|
-
/* @__PURE__ */
|
|
1070
|
-
/* @__PURE__ */
|
|
1071
|
-
description ? /* @__PURE__ */
|
|
1738
|
+
return /* @__PURE__ */ jsxs21("div", { className: "flex items-start justify-between gap-4 sm:flex-row sm:items-center", children: [
|
|
1739
|
+
/* @__PURE__ */ jsxs21("div", { children: [
|
|
1740
|
+
/* @__PURE__ */ jsx32("h1", { className: "text-2xl font-semibold text-foreground", style: { fontFamily: "var(--font-display)" }, children: title }),
|
|
1741
|
+
description ? /* @__PURE__ */ jsx32("p", { className: "mt-0.5 text-sm text-muted-foreground", children: description }) : null
|
|
1072
1742
|
] }),
|
|
1073
|
-
action ? /* @__PURE__ */
|
|
1743
|
+
action ? /* @__PURE__ */ jsx32("div", { children: action }) : null
|
|
1074
1744
|
] });
|
|
1075
1745
|
}
|
|
1076
1746
|
|
|
1077
1747
|
// src/components/layout/theme-toggle.tsx
|
|
1078
|
-
import { Moon, Sun } from "lucide-react";
|
|
1079
|
-
import { jsx as
|
|
1080
|
-
var options = [
|
|
1081
|
-
{ value: "light", Icon: Sun, label: "Light" },
|
|
1082
|
-
{ value: "dark", Icon: Moon, label: "Dark" }
|
|
1083
|
-
];
|
|
1084
|
-
function ThemeToggle({ className }) {
|
|
1085
|
-
const { theme, setTheme } = useTheme();
|
|
1086
|
-
return /* @__PURE__ */
|
|
1087
|
-
"button",
|
|
1088
|
-
{
|
|
1089
|
-
type: "button",
|
|
1090
|
-
onClick: () => setTheme(value),
|
|
1091
|
-
"aria-label": label,
|
|
1092
|
-
className: cn(
|
|
1093
|
-
"flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-all",
|
|
1094
|
-
theme === value ? "bg-card text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
|
|
1095
|
-
),
|
|
1096
|
-
children: [
|
|
1097
|
-
/* @__PURE__ */ jsx25(Icon2, { size: 13 }),
|
|
1098
|
-
/* @__PURE__ */ jsx25("span", { children: label })
|
|
1099
|
-
]
|
|
1100
|
-
},
|
|
1101
|
-
value
|
|
1102
|
-
)) });
|
|
1103
|
-
}
|
|
1104
|
-
|
|
1105
|
-
// src/components/navigation/breadcrumb.tsx
|
|
1106
|
-
import * as React9 from "react";
|
|
1107
|
-
import { Slot as Slot2 } from "@radix-ui/react-slot";
|
|
1108
|
-
import { ChevronRight, MoreHorizontal } from "lucide-react";
|
|
1109
|
-
import { jsx as jsx26, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
1110
|
-
var Breadcrumb = React9.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx26("nav", { ref, "aria-label": "breadcrumb", ...props }));
|
|
1111
|
-
Breadcrumb.displayName = "Breadcrumb";
|
|
1112
|
-
var BreadcrumbList = React9.forwardRef(
|
|
1113
|
-
({ className, ...props }, ref) => /* @__PURE__ */ jsx26(
|
|
1114
|
-
"ol",
|
|
1115
|
-
{
|
|
1116
|
-
ref,
|
|
1117
|
-
className: cn("flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", className),
|
|
1118
|
-
...props
|
|
1119
|
-
}
|
|
1120
|
-
)
|
|
1121
|
-
);
|
|
1122
|
-
BreadcrumbList.displayName = "BreadcrumbList";
|
|
1123
|
-
var BreadcrumbItem = React9.forwardRef(
|
|
1124
|
-
({ className, ...props }, ref) => /* @__PURE__ */ jsx26("li", { ref, className: cn("inline-flex items-center gap-1.5", className), ...props })
|
|
1125
|
-
);
|
|
1126
|
-
BreadcrumbItem.displayName = "BreadcrumbItem";
|
|
1127
|
-
var BreadcrumbLink = React9.forwardRef(({ asChild, className, ...props }, ref) => {
|
|
1128
|
-
const Comp = asChild ? Slot2 : "a";
|
|
1129
|
-
return /* @__PURE__ */ jsx26(Comp, { ref, className: cn("transition-colors hover:text-foreground", className), ...props });
|
|
1130
|
-
});
|
|
1131
|
-
BreadcrumbLink.displayName = "BreadcrumbLink";
|
|
1132
|
-
var BreadcrumbPage = React9.forwardRef(
|
|
1133
|
-
({ className, ...props }, ref) => /* @__PURE__ */ jsx26(
|
|
1134
|
-
"span",
|
|
1135
|
-
{
|
|
1136
|
-
ref,
|
|
1137
|
-
role: "link",
|
|
1138
|
-
"aria-disabled": "true",
|
|
1139
|
-
"aria-current": "page",
|
|
1140
|
-
className: cn("font-normal text-foreground", className),
|
|
1141
|
-
...props
|
|
1142
|
-
}
|
|
1143
|
-
)
|
|
1144
|
-
);
|
|
1145
|
-
BreadcrumbPage.displayName = "BreadcrumbPage";
|
|
1146
|
-
var BreadcrumbSeparator = ({ children, className, ...props }) => /* @__PURE__ */ jsx26("li", { role: "presentation", "aria-hidden": "true", className: cn("[&>svg]:h-3.5 [&>svg]:w-3.5", className), ...props, children: children ?? /* @__PURE__ */ jsx26(ChevronRight, {}) });
|
|
1147
|
-
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
|
|
1148
|
-
var BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs17("span", { role: "presentation", "aria-hidden": "true", className: cn("flex h-9 w-9 items-center justify-center", className), ...props, children: [
|
|
1149
|
-
/* @__PURE__ */ jsx26(MoreHorizontal, { className: "h-4 w-4" }),
|
|
1150
|
-
/* @__PURE__ */ jsx26("span", { className: "sr-only", children: "More" })
|
|
1151
|
-
] });
|
|
1152
|
-
BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
|
|
1153
|
-
|
|
1154
|
-
// src/components/navigation/page-breadcrumb.tsx
|
|
1155
|
-
import { Fragment as Fragment2 } from "react";
|
|
1156
|
-
import { jsx as jsx27, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
1157
|
-
function PageBreadcrumb({ items }) {
|
|
1158
|
-
return /* @__PURE__ */ jsx27(Breadcrumb, { children: /* @__PURE__ */ jsx27(BreadcrumbList, { children: items.map((item, index) => {
|
|
1159
|
-
const isLast = index === items.length - 1;
|
|
1160
|
-
return /* @__PURE__ */ jsxs18(Fragment2, { children: [
|
|
1161
|
-
/* @__PURE__ */ jsx27(BreadcrumbItem, { children: !isLast && item.href ? /* @__PURE__ */ jsx27(BreadcrumbLink, { href: item.href, children: item.label }) : /* @__PURE__ */ jsx27(BreadcrumbPage, { children: item.label }) }),
|
|
1162
|
-
!isLast ? /* @__PURE__ */ jsx27(BreadcrumbSeparator, {}) : null
|
|
1163
|
-
] }, `${item.label}-${index}`);
|
|
1164
|
-
}) }) });
|
|
1165
|
-
}
|
|
1166
|
-
|
|
1167
|
-
// src/components/navigation/steps.tsx
|
|
1168
|
-
import { AlertCircle as AlertCircle3, Check as Check3 } from "lucide-react";
|
|
1169
|
-
import { jsx as jsx28, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1170
|
-
var indicatorStyles = {
|
|
1171
|
-
complete: "border-primary bg-primary text-primary-foreground",
|
|
1172
|
-
current: "border-primary bg-primary/10 text-primary",
|
|
1173
|
-
upcoming: "border-border bg-background text-muted-foreground",
|
|
1174
|
-
error: "border-destructive bg-destructive/10 text-destructive"
|
|
1175
|
-
};
|
|
1176
|
-
function Steps({ className, items, orientation = "horizontal" }) {
|
|
1177
|
-
return /* @__PURE__ */ jsx28("ol", { className: cn("flex", orientation === "horizontal" ? "flex-col gap-4 md:flex-row" : "flex-col", className), children: items.map((item, index) => {
|
|
1178
|
-
const status = item.status ?? "upcoming";
|
|
1179
|
-
const isLast = index === items.length - 1;
|
|
1180
|
-
return /* @__PURE__ */ jsxs19(
|
|
1181
|
-
"li",
|
|
1182
|
-
{
|
|
1183
|
-
className: cn("relative", orientation === "horizontal" ? "flex-1" : "pb-6 last:pb-0"),
|
|
1184
|
-
children: [
|
|
1185
|
-
!isLast ? /* @__PURE__ */ jsx28(
|
|
1186
|
-
"span",
|
|
1187
|
-
{
|
|
1188
|
-
"aria-hidden": "true",
|
|
1189
|
-
className: cn(
|
|
1190
|
-
"absolute bg-border",
|
|
1191
|
-
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"
|
|
1192
|
-
)
|
|
1193
|
-
}
|
|
1194
|
-
) : null,
|
|
1195
|
-
/* @__PURE__ */ jsxs19("div", { className: cn(
|
|
1196
|
-
orientation === "horizontal" ? "flex flex-col items-center gap-2 text-center" : "flex items-start gap-3"
|
|
1197
|
-
), children: [
|
|
1198
|
-
/* @__PURE__ */ jsxs19(
|
|
1199
|
-
"span",
|
|
1200
|
-
{
|
|
1201
|
-
className: cn(
|
|
1202
|
-
"relative z-10 inline-flex h-8 w-8 items-center justify-center rounded-full border text-sm font-semibold shadow-sm",
|
|
1203
|
-
indicatorStyles[status]
|
|
1204
|
-
),
|
|
1205
|
-
children: [
|
|
1206
|
-
status === "complete" ? /* @__PURE__ */ jsx28(Check3, { className: "h-4 w-4" }) : null,
|
|
1207
|
-
status === "error" ? /* @__PURE__ */ jsx28(AlertCircle3, { className: "h-4 w-4" }) : null,
|
|
1208
|
-
status === "current" || status === "upcoming" ? index + 1 : null
|
|
1209
|
-
]
|
|
1210
|
-
}
|
|
1211
|
-
),
|
|
1212
|
-
/* @__PURE__ */ jsxs19("div", { className: cn("grid gap-1", orientation === "vertical" && "pt-1"), children: [
|
|
1213
|
-
/* @__PURE__ */ jsx28("p", { className: cn("text-sm font-medium", status === "upcoming" ? "text-muted-foreground" : "text-foreground"), children: item.title }),
|
|
1214
|
-
item.description ? /* @__PURE__ */ jsx28("p", { className: "text-xs text-muted-foreground", children: item.description }) : null
|
|
1215
|
-
] })
|
|
1216
|
-
] })
|
|
1217
|
-
]
|
|
1218
|
-
},
|
|
1219
|
-
item.id ?? item.title
|
|
1220
|
-
);
|
|
1221
|
-
}) });
|
|
1222
|
-
}
|
|
1223
|
-
|
|
1224
|
-
// src/components/overlays/dialog.tsx
|
|
1225
|
-
import * as React10 from "react";
|
|
1226
|
-
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
1227
|
-
import { X } from "lucide-react";
|
|
1228
|
-
import { jsx as jsx29, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1229
|
-
var Dialog = DialogPrimitive.Root;
|
|
1230
|
-
var DialogTrigger = DialogPrimitive.Trigger;
|
|
1231
|
-
var DialogPortal = DialogPrimitive.Portal;
|
|
1232
|
-
var DialogClose = DialogPrimitive.Close;
|
|
1233
|
-
var DialogOverlay = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx29(
|
|
1234
|
-
DialogPrimitive.Overlay,
|
|
1235
|
-
{
|
|
1236
|
-
ref,
|
|
1237
|
-
className: cn(
|
|
1238
|
-
"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",
|
|
1239
|
-
className
|
|
1240
|
-
),
|
|
1241
|
-
...props
|
|
1242
|
-
}
|
|
1243
|
-
));
|
|
1244
|
-
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
1245
|
-
var DialogContent = React10.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs20(DialogPortal, { children: [
|
|
1246
|
-
/* @__PURE__ */ jsx29(DialogOverlay, {}),
|
|
1247
|
-
/* @__PURE__ */ jsxs20(
|
|
1248
|
-
DialogPrimitive.Content,
|
|
1748
|
+
import { Moon, Sun } from "lucide-react";
|
|
1749
|
+
import { jsx as jsx33, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
1750
|
+
var options = [
|
|
1751
|
+
{ value: "light", Icon: Sun, label: "Light" },
|
|
1752
|
+
{ value: "dark", Icon: Moon, label: "Dark" }
|
|
1753
|
+
];
|
|
1754
|
+
function ThemeToggle({ className }) {
|
|
1755
|
+
const { theme, setTheme } = useTheme();
|
|
1756
|
+
return /* @__PURE__ */ jsx33("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__ */ jsxs22(
|
|
1757
|
+
"button",
|
|
1249
1758
|
{
|
|
1250
|
-
|
|
1759
|
+
type: "button",
|
|
1760
|
+
onClick: () => setTheme(value),
|
|
1761
|
+
"aria-label": label,
|
|
1251
1762
|
className: cn(
|
|
1252
|
-
"
|
|
1253
|
-
|
|
1763
|
+
"flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-all",
|
|
1764
|
+
theme === value ? "bg-card text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
|
|
1254
1765
|
),
|
|
1255
|
-
...props,
|
|
1256
1766
|
children: [
|
|
1257
|
-
|
|
1258
|
-
/* @__PURE__ */
|
|
1259
|
-
/* @__PURE__ */ jsx29(X, { className: "h-4 w-4" }),
|
|
1260
|
-
/* @__PURE__ */ jsx29("span", { className: "sr-only", children: "Close" })
|
|
1261
|
-
] })
|
|
1767
|
+
/* @__PURE__ */ jsx33(Icon2, { size: 13 }),
|
|
1768
|
+
/* @__PURE__ */ jsx33("span", { children: label })
|
|
1262
1769
|
]
|
|
1770
|
+
},
|
|
1771
|
+
value
|
|
1772
|
+
)) });
|
|
1773
|
+
}
|
|
1774
|
+
|
|
1775
|
+
// src/components/navigation/breadcrumb.tsx
|
|
1776
|
+
import * as React12 from "react";
|
|
1777
|
+
import { Slot as Slot2 } from "@radix-ui/react-slot";
|
|
1778
|
+
import { ChevronRight, MoreHorizontal } from "lucide-react";
|
|
1779
|
+
import { jsx as jsx34, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
1780
|
+
var Breadcrumb = React12.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx34("nav", { ref, "aria-label": "breadcrumb", ...props }));
|
|
1781
|
+
Breadcrumb.displayName = "Breadcrumb";
|
|
1782
|
+
var BreadcrumbList = React12.forwardRef(
|
|
1783
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx34(
|
|
1784
|
+
"ol",
|
|
1785
|
+
{
|
|
1786
|
+
ref,
|
|
1787
|
+
className: cn("flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", className),
|
|
1788
|
+
...props
|
|
1263
1789
|
}
|
|
1264
1790
|
)
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
var
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
var
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1791
|
+
);
|
|
1792
|
+
BreadcrumbList.displayName = "BreadcrumbList";
|
|
1793
|
+
var BreadcrumbItem = React12.forwardRef(
|
|
1794
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx34("li", { ref, className: cn("inline-flex items-center gap-1.5", className), ...props })
|
|
1795
|
+
);
|
|
1796
|
+
BreadcrumbItem.displayName = "BreadcrumbItem";
|
|
1797
|
+
var BreadcrumbLink = React12.forwardRef(({ asChild, className, ...props }, ref) => {
|
|
1798
|
+
const Comp = asChild ? Slot2 : "a";
|
|
1799
|
+
return /* @__PURE__ */ jsx34(Comp, { ref, className: cn("transition-colors hover:text-foreground", className), ...props });
|
|
1800
|
+
});
|
|
1801
|
+
BreadcrumbLink.displayName = "BreadcrumbLink";
|
|
1802
|
+
var BreadcrumbPage = React12.forwardRef(
|
|
1803
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx34(
|
|
1804
|
+
"span",
|
|
1805
|
+
{
|
|
1806
|
+
ref,
|
|
1807
|
+
role: "link",
|
|
1808
|
+
"aria-disabled": "true",
|
|
1809
|
+
"aria-current": "page",
|
|
1810
|
+
className: cn("font-normal text-foreground", className),
|
|
1811
|
+
...props
|
|
1812
|
+
}
|
|
1813
|
+
)
|
|
1814
|
+
);
|
|
1815
|
+
BreadcrumbPage.displayName = "BreadcrumbPage";
|
|
1816
|
+
var BreadcrumbSeparator = ({ children, className, ...props }) => /* @__PURE__ */ jsx34("li", { role: "presentation", "aria-hidden": "true", className: cn("[&>svg]:h-3.5 [&>svg]:w-3.5", className), ...props, children: children ?? /* @__PURE__ */ jsx34(ChevronRight, {}) });
|
|
1817
|
+
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
|
|
1818
|
+
var BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs23("span", { role: "presentation", "aria-hidden": "true", className: cn("flex h-9 w-9 items-center justify-center", className), ...props, children: [
|
|
1819
|
+
/* @__PURE__ */ jsx34(MoreHorizontal, { className: "h-4 w-4" }),
|
|
1820
|
+
/* @__PURE__ */ jsx34("span", { className: "sr-only", children: "More" })
|
|
1821
|
+
] });
|
|
1822
|
+
BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
|
|
1823
|
+
|
|
1824
|
+
// src/components/navigation/header-user-menu.tsx
|
|
1825
|
+
import { LogOut } from "lucide-react";
|
|
1275
1826
|
|
|
1276
1827
|
// src/components/overlays/dropdown-menu.tsx
|
|
1277
|
-
import * as
|
|
1828
|
+
import * as React13 from "react";
|
|
1278
1829
|
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
|
|
1279
|
-
import { Check as
|
|
1280
|
-
import { jsx as
|
|
1830
|
+
import { Check as Check3, ChevronRight as ChevronRight2, Circle } from "lucide-react";
|
|
1831
|
+
import { jsx as jsx35, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
1281
1832
|
var DropdownMenu = DropdownMenuPrimitive.Root;
|
|
1282
1833
|
var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
|
|
1283
1834
|
var DropdownMenuGroup = DropdownMenuPrimitive.Group;
|
|
1284
1835
|
var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
|
|
1285
1836
|
var DropdownMenuSub = DropdownMenuPrimitive.Sub;
|
|
1286
1837
|
var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
|
|
1287
|
-
var DropdownMenuSubTrigger =
|
|
1838
|
+
var DropdownMenuSubTrigger = React13.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs24(
|
|
1288
1839
|
DropdownMenuPrimitive.SubTrigger,
|
|
1289
1840
|
{
|
|
1290
1841
|
ref,
|
|
@@ -1296,12 +1847,12 @@ var DropdownMenuSubTrigger = React11.forwardRef(({ className, inset, children, .
|
|
|
1296
1847
|
...props,
|
|
1297
1848
|
children: [
|
|
1298
1849
|
children,
|
|
1299
|
-
/* @__PURE__ */
|
|
1850
|
+
/* @__PURE__ */ jsx35(ChevronRight2, { className: "ml-auto" })
|
|
1300
1851
|
]
|
|
1301
1852
|
}
|
|
1302
1853
|
));
|
|
1303
1854
|
DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
|
|
1304
|
-
var DropdownMenuSubContent =
|
|
1855
|
+
var DropdownMenuSubContent = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx35(
|
|
1305
1856
|
DropdownMenuPrimitive.SubContent,
|
|
1306
1857
|
{
|
|
1307
1858
|
ref,
|
|
@@ -1313,7 +1864,7 @@ var DropdownMenuSubContent = React11.forwardRef(({ className, ...props }, ref) =
|
|
|
1313
1864
|
}
|
|
1314
1865
|
));
|
|
1315
1866
|
DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
|
|
1316
|
-
var DropdownMenuContent =
|
|
1867
|
+
var DropdownMenuContent = React13.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx35(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx35(
|
|
1317
1868
|
DropdownMenuPrimitive.Content,
|
|
1318
1869
|
{
|
|
1319
1870
|
ref,
|
|
@@ -1326,7 +1877,7 @@ var DropdownMenuContent = React11.forwardRef(({ className, sideOffset = 4, ...pr
|
|
|
1326
1877
|
}
|
|
1327
1878
|
) }));
|
|
1328
1879
|
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
|
|
1329
|
-
var DropdownMenuItem =
|
|
1880
|
+
var DropdownMenuItem = React13.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx35(
|
|
1330
1881
|
DropdownMenuPrimitive.Item,
|
|
1331
1882
|
{
|
|
1332
1883
|
ref,
|
|
@@ -1339,7 +1890,7 @@ var DropdownMenuItem = React11.forwardRef(({ className, inset, ...props }, ref)
|
|
|
1339
1890
|
}
|
|
1340
1891
|
));
|
|
1341
1892
|
DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
|
|
1342
|
-
var DropdownMenuCheckboxItem =
|
|
1893
|
+
var DropdownMenuCheckboxItem = React13.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs24(
|
|
1343
1894
|
DropdownMenuPrimitive.CheckboxItem,
|
|
1344
1895
|
{
|
|
1345
1896
|
ref,
|
|
@@ -1350,13 +1901,13 @@ var DropdownMenuCheckboxItem = React11.forwardRef(({ className, children, checke
|
|
|
1350
1901
|
...checked !== void 0 ? { checked } : {},
|
|
1351
1902
|
...props,
|
|
1352
1903
|
children: [
|
|
1353
|
-
/* @__PURE__ */
|
|
1904
|
+
/* @__PURE__ */ jsx35("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx35(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx35(Check3, { className: "h-4 w-4" }) }) }),
|
|
1354
1905
|
children
|
|
1355
1906
|
]
|
|
1356
1907
|
}
|
|
1357
1908
|
));
|
|
1358
1909
|
DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
|
|
1359
|
-
var DropdownMenuRadioItem =
|
|
1910
|
+
var DropdownMenuRadioItem = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs24(
|
|
1360
1911
|
DropdownMenuPrimitive.RadioItem,
|
|
1361
1912
|
{
|
|
1362
1913
|
ref,
|
|
@@ -1366,84 +1917,208 @@ var DropdownMenuRadioItem = React11.forwardRef(({ className, children, ...props
|
|
|
1366
1917
|
),
|
|
1367
1918
|
...props,
|
|
1368
1919
|
children: [
|
|
1369
|
-
/* @__PURE__ */
|
|
1920
|
+
/* @__PURE__ */ jsx35("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx35(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx35(Circle, { className: "h-2 w-2 fill-current" }) }) }),
|
|
1370
1921
|
children
|
|
1371
1922
|
]
|
|
1372
1923
|
}
|
|
1373
1924
|
));
|
|
1374
1925
|
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
|
|
1375
|
-
var DropdownMenuLabel =
|
|
1926
|
+
var DropdownMenuLabel = React13.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx35(DropdownMenuPrimitive.Label, { ref, className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className), ...props }));
|
|
1376
1927
|
DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
|
|
1377
|
-
var DropdownMenuSeparator =
|
|
1928
|
+
var DropdownMenuSeparator = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx35(DropdownMenuPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props }));
|
|
1378
1929
|
DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
|
|
1379
|
-
var DropdownMenuShortcut = ({ className, ...props }) => /* @__PURE__ */
|
|
1930
|
+
var DropdownMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx35("span", { className: cn("ml-auto text-xs tracking-widest opacity-60", className), ...props });
|
|
1380
1931
|
DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
|
|
1381
1932
|
|
|
1382
|
-
// src/components/
|
|
1383
|
-
import
|
|
1384
|
-
|
|
1385
|
-
|
|
1933
|
+
// src/components/navigation/header-user-menu.tsx
|
|
1934
|
+
import { Fragment as Fragment2, jsx as jsx36, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
1935
|
+
function getInitials3(name) {
|
|
1936
|
+
return name.trim().split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join("");
|
|
1937
|
+
}
|
|
1938
|
+
function HeaderUserMenu({
|
|
1939
|
+
className,
|
|
1940
|
+
name,
|
|
1941
|
+
email,
|
|
1942
|
+
role,
|
|
1943
|
+
initials,
|
|
1944
|
+
avatarSrc,
|
|
1945
|
+
logoutLabel = "Cerrar sesion",
|
|
1946
|
+
onLogout,
|
|
1947
|
+
extraItems
|
|
1948
|
+
}) {
|
|
1949
|
+
return /* @__PURE__ */ jsxs25(DropdownMenu, { children: [
|
|
1950
|
+
/* @__PURE__ */ jsx36(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx36(
|
|
1951
|
+
"button",
|
|
1952
|
+
{
|
|
1953
|
+
type: "button",
|
|
1954
|
+
"aria-label": "Menu de usuario",
|
|
1955
|
+
className: cn(
|
|
1956
|
+
"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",
|
|
1957
|
+
className
|
|
1958
|
+
),
|
|
1959
|
+
children: /* @__PURE__ */ jsxs25(Avatar, { className: "h-8 w-8", children: [
|
|
1960
|
+
avatarSrc ? /* @__PURE__ */ jsx36(AvatarImage, { src: avatarSrc, alt: name }) : null,
|
|
1961
|
+
/* @__PURE__ */ jsx36(AvatarFallback, { className: "bg-primary text-xs font-semibold text-primary-foreground", children: initials ?? getInitials3(name) })
|
|
1962
|
+
] })
|
|
1963
|
+
}
|
|
1964
|
+
) }),
|
|
1965
|
+
/* @__PURE__ */ jsxs25(DropdownMenuContent, { align: "end", className: "w-60", children: [
|
|
1966
|
+
/* @__PURE__ */ jsx36(DropdownMenuLabel, { className: "font-normal", children: /* @__PURE__ */ jsxs25("div", { className: "flex gap-2", children: [
|
|
1967
|
+
/* @__PURE__ */ jsxs25("div", { className: "grid min-w-0 flex-1 gap-1", children: [
|
|
1968
|
+
/* @__PURE__ */ jsx36("p", { className: "truncate text-sm font-semibold text-foreground", children: name }),
|
|
1969
|
+
email ? /* @__PURE__ */ jsx36("p", { className: "truncate text-xs text-muted-foreground", children: email }) : null
|
|
1970
|
+
] }),
|
|
1971
|
+
role ? /* @__PURE__ */ jsx36(Badge, { variant: "outline", className: "h-fit max-w-[110px] truncate", children: role }) : null
|
|
1972
|
+
] }) }),
|
|
1973
|
+
extraItems ? /* @__PURE__ */ jsxs25(Fragment2, { children: [
|
|
1974
|
+
/* @__PURE__ */ jsx36(DropdownMenuSeparator, {}),
|
|
1975
|
+
extraItems
|
|
1976
|
+
] }) : null,
|
|
1977
|
+
onLogout ? /* @__PURE__ */ jsxs25(Fragment2, { children: [
|
|
1978
|
+
/* @__PURE__ */ jsx36(DropdownMenuSeparator, {}),
|
|
1979
|
+
/* @__PURE__ */ jsxs25(
|
|
1980
|
+
DropdownMenuItem,
|
|
1981
|
+
{
|
|
1982
|
+
onClick: onLogout,
|
|
1983
|
+
className: "cursor-pointer gap-2 text-destructive focus:bg-destructive/10 focus:text-destructive",
|
|
1984
|
+
children: [
|
|
1985
|
+
/* @__PURE__ */ jsx36(LogOut, { className: "h-4 w-4" }),
|
|
1986
|
+
logoutLabel
|
|
1987
|
+
]
|
|
1988
|
+
}
|
|
1989
|
+
)
|
|
1990
|
+
] }) : null
|
|
1991
|
+
] })
|
|
1992
|
+
] });
|
|
1993
|
+
}
|
|
1994
|
+
|
|
1995
|
+
// src/components/navigation/page-breadcrumb.tsx
|
|
1996
|
+
import { Fragment as Fragment3 } from "react";
|
|
1997
|
+
import { jsx as jsx37, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
1998
|
+
function PageBreadcrumb({ items }) {
|
|
1999
|
+
return /* @__PURE__ */ jsx37(Breadcrumb, { children: /* @__PURE__ */ jsx37(BreadcrumbList, { children: items.map((item, index) => {
|
|
2000
|
+
const isLast = index === items.length - 1;
|
|
2001
|
+
return /* @__PURE__ */ jsxs26(Fragment3, { children: [
|
|
2002
|
+
/* @__PURE__ */ jsx37(BreadcrumbItem, { children: !isLast && item.href ? /* @__PURE__ */ jsx37(BreadcrumbLink, { href: item.href, children: item.label }) : /* @__PURE__ */ jsx37(BreadcrumbPage, { children: item.label }) }),
|
|
2003
|
+
!isLast ? /* @__PURE__ */ jsx37(BreadcrumbSeparator, {}) : null
|
|
2004
|
+
] }, `${item.label}-${index}`);
|
|
2005
|
+
}) }) });
|
|
2006
|
+
}
|
|
2007
|
+
|
|
2008
|
+
// src/components/navigation/steps.tsx
|
|
2009
|
+
import { AlertCircle as AlertCircle4, Check as Check4 } from "lucide-react";
|
|
2010
|
+
import { jsx as jsx38, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
2011
|
+
var indicatorStyles = {
|
|
2012
|
+
complete: "border-primary bg-primary text-primary-foreground",
|
|
2013
|
+
current: "border-primary bg-primary/10 text-primary",
|
|
2014
|
+
upcoming: "border-border bg-background text-muted-foreground",
|
|
2015
|
+
error: "border-destructive bg-destructive/10 text-destructive"
|
|
2016
|
+
};
|
|
2017
|
+
function Steps({ className, items, orientation = "horizontal" }) {
|
|
2018
|
+
return /* @__PURE__ */ jsx38("ol", { className: cn("flex", orientation === "horizontal" ? "flex-col gap-4 md:flex-row" : "flex-col", className), children: items.map((item, index) => {
|
|
2019
|
+
const status = item.status ?? "upcoming";
|
|
2020
|
+
const isLast = index === items.length - 1;
|
|
2021
|
+
return /* @__PURE__ */ jsxs27(
|
|
2022
|
+
"li",
|
|
2023
|
+
{
|
|
2024
|
+
className: cn("relative", orientation === "horizontal" ? "flex-1" : "pb-6 last:pb-0"),
|
|
2025
|
+
children: [
|
|
2026
|
+
!isLast ? /* @__PURE__ */ jsx38(
|
|
2027
|
+
"span",
|
|
2028
|
+
{
|
|
2029
|
+
"aria-hidden": "true",
|
|
2030
|
+
className: cn(
|
|
2031
|
+
"absolute bg-border",
|
|
2032
|
+
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"
|
|
2033
|
+
)
|
|
2034
|
+
}
|
|
2035
|
+
) : null,
|
|
2036
|
+
/* @__PURE__ */ jsxs27("div", { className: cn(
|
|
2037
|
+
orientation === "horizontal" ? "flex flex-col items-center gap-2 text-center" : "flex items-start gap-3"
|
|
2038
|
+
), children: [
|
|
2039
|
+
/* @__PURE__ */ jsxs27(
|
|
2040
|
+
"span",
|
|
2041
|
+
{
|
|
2042
|
+
className: cn(
|
|
2043
|
+
"relative z-10 inline-flex h-8 w-8 items-center justify-center rounded-full border text-sm font-semibold shadow-sm",
|
|
2044
|
+
indicatorStyles[status]
|
|
2045
|
+
),
|
|
2046
|
+
children: [
|
|
2047
|
+
status === "complete" ? /* @__PURE__ */ jsx38(Check4, { className: "h-4 w-4" }) : null,
|
|
2048
|
+
status === "error" ? /* @__PURE__ */ jsx38(AlertCircle4, { className: "h-4 w-4" }) : null,
|
|
2049
|
+
status === "current" || status === "upcoming" ? index + 1 : null
|
|
2050
|
+
]
|
|
2051
|
+
}
|
|
2052
|
+
),
|
|
2053
|
+
/* @__PURE__ */ jsxs27("div", { className: cn("grid gap-1", orientation === "vertical" && "pt-1"), children: [
|
|
2054
|
+
/* @__PURE__ */ jsx38("p", { className: cn("text-sm font-medium", status === "upcoming" ? "text-muted-foreground" : "text-foreground"), children: item.title }),
|
|
2055
|
+
item.description ? /* @__PURE__ */ jsx38("p", { className: "text-xs text-muted-foreground", children: item.description }) : null
|
|
2056
|
+
] })
|
|
2057
|
+
] })
|
|
2058
|
+
]
|
|
2059
|
+
},
|
|
2060
|
+
item.id ?? item.title
|
|
2061
|
+
);
|
|
2062
|
+
}) });
|
|
2063
|
+
}
|
|
2064
|
+
|
|
2065
|
+
// src/components/overlays/dialog.tsx
|
|
2066
|
+
import * as React14 from "react";
|
|
2067
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
1386
2068
|
import { X as X2 } from "lucide-react";
|
|
1387
|
-
import { jsx as
|
|
1388
|
-
var
|
|
1389
|
-
var
|
|
1390
|
-
var
|
|
1391
|
-
var
|
|
1392
|
-
var
|
|
1393
|
-
|
|
2069
|
+
import { jsx as jsx39, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
2070
|
+
var Dialog = DialogPrimitive.Root;
|
|
2071
|
+
var DialogTrigger = DialogPrimitive.Trigger;
|
|
2072
|
+
var DialogPortal = DialogPrimitive.Portal;
|
|
2073
|
+
var DialogClose = DialogPrimitive.Close;
|
|
2074
|
+
var DialogOverlay = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(
|
|
2075
|
+
DialogPrimitive.Overlay,
|
|
1394
2076
|
{
|
|
2077
|
+
ref,
|
|
1395
2078
|
className: cn(
|
|
1396
2079
|
"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",
|
|
1397
2080
|
className
|
|
1398
2081
|
),
|
|
1399
|
-
...props
|
|
1400
|
-
ref
|
|
2082
|
+
...props
|
|
1401
2083
|
}
|
|
1402
2084
|
));
|
|
1403
|
-
|
|
1404
|
-
var
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
left
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
2085
|
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
2086
|
+
var DialogContent = React14.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs28(DialogPortal, { children: [
|
|
2087
|
+
/* @__PURE__ */ jsx39(DialogOverlay, {}),
|
|
2088
|
+
/* @__PURE__ */ jsxs28(
|
|
2089
|
+
DialogPrimitive.Content,
|
|
2090
|
+
{
|
|
2091
|
+
ref,
|
|
2092
|
+
className: cn(
|
|
2093
|
+
"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",
|
|
2094
|
+
className
|
|
2095
|
+
),
|
|
2096
|
+
...props,
|
|
2097
|
+
children: [
|
|
2098
|
+
children,
|
|
2099
|
+
/* @__PURE__ */ jsxs28(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: [
|
|
2100
|
+
/* @__PURE__ */ jsx39(X2, { className: "h-4 w-4" }),
|
|
2101
|
+
/* @__PURE__ */ jsx39("span", { className: "sr-only", children: "Close" })
|
|
2102
|
+
] })
|
|
2103
|
+
]
|
|
1417
2104
|
}
|
|
1418
|
-
|
|
1419
|
-
);
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
] })
|
|
1430
|
-
] })
|
|
1431
|
-
);
|
|
1432
|
-
SheetContent.displayName = SheetPrimitive.Content.displayName;
|
|
1433
|
-
var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx31("div", { className: cn("flex flex-col space-y-2 text-center sm:text-left", className), ...props });
|
|
1434
|
-
SheetHeader.displayName = "SheetHeader";
|
|
1435
|
-
var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ jsx31("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props });
|
|
1436
|
-
SheetFooter.displayName = "SheetFooter";
|
|
1437
|
-
var SheetTitle = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(SheetPrimitive.Title, { ref, className: cn("text-lg font-semibold text-foreground", className), ...props }));
|
|
1438
|
-
SheetTitle.displayName = SheetPrimitive.Title.displayName;
|
|
1439
|
-
var SheetDescription = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(SheetPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
1440
|
-
SheetDescription.displayName = SheetPrimitive.Description.displayName;
|
|
2105
|
+
)
|
|
2106
|
+
] }));
|
|
2107
|
+
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
2108
|
+
var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx39("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props });
|
|
2109
|
+
DialogHeader.displayName = "DialogHeader";
|
|
2110
|
+
var DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx39("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props });
|
|
2111
|
+
DialogFooter.displayName = "DialogFooter";
|
|
2112
|
+
var DialogTitle = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(DialogPrimitive.Title, { ref, className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props }));
|
|
2113
|
+
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
2114
|
+
var DialogDescription = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(DialogPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
2115
|
+
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
1441
2116
|
|
|
1442
2117
|
// src/components/primitives/alert.tsx
|
|
1443
|
-
import * as
|
|
1444
|
-
import { cva as
|
|
1445
|
-
import { jsx as
|
|
1446
|
-
var alertVariants =
|
|
2118
|
+
import * as React15 from "react";
|
|
2119
|
+
import { cva as cva5 } from "class-variance-authority";
|
|
2120
|
+
import { jsx as jsx40 } from "react/jsx-runtime";
|
|
2121
|
+
var alertVariants = cva5("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", {
|
|
1447
2122
|
variants: {
|
|
1448
2123
|
variant: {
|
|
1449
2124
|
default: "bg-background text-foreground",
|
|
@@ -1454,43 +2129,23 @@ var alertVariants = cva4("relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [
|
|
|
1454
2129
|
variant: "default"
|
|
1455
2130
|
}
|
|
1456
2131
|
});
|
|
1457
|
-
var Alert =
|
|
2132
|
+
var Alert = React15.forwardRef(({ className, variant, ...props }, ref) => /* @__PURE__ */ jsx40("div", { ref, role: "alert", className: cn(alertVariants({ variant }), className), ...props }));
|
|
1458
2133
|
Alert.displayName = "Alert";
|
|
1459
|
-
var AlertTitle =
|
|
1460
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
2134
|
+
var AlertTitle = React15.forwardRef(
|
|
2135
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx40("h5", { ref, className: cn("mb-1 font-medium leading-none tracking-tight", className), ...props })
|
|
1461
2136
|
);
|
|
1462
2137
|
AlertTitle.displayName = "AlertTitle";
|
|
1463
|
-
var AlertDescription =
|
|
1464
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
2138
|
+
var AlertDescription = React15.forwardRef(
|
|
2139
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx40("div", { ref, className: cn("text-sm [&_p]:leading-relaxed", className), ...props })
|
|
1465
2140
|
);
|
|
1466
2141
|
AlertDescription.displayName = "AlertDescription";
|
|
1467
2142
|
|
|
1468
|
-
// src/components/primitives/badge.tsx
|
|
1469
|
-
import { cva as cva5 } from "class-variance-authority";
|
|
1470
|
-
import { jsx as jsx33 } from "react/jsx-runtime";
|
|
1471
|
-
var badgeVariants = cva5("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", {
|
|
1472
|
-
variants: {
|
|
1473
|
-
variant: {
|
|
1474
|
-
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
|
1475
|
-
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
1476
|
-
destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
|
|
1477
|
-
outline: "text-foreground"
|
|
1478
|
-
}
|
|
1479
|
-
},
|
|
1480
|
-
defaultVariants: {
|
|
1481
|
-
variant: "default"
|
|
1482
|
-
}
|
|
1483
|
-
});
|
|
1484
|
-
function Badge({ className, variant, ...props }) {
|
|
1485
|
-
return /* @__PURE__ */ jsx33("div", { className: cn(badgeVariants({ variant }), className), ...props });
|
|
1486
|
-
}
|
|
1487
|
-
|
|
1488
2143
|
// src/components/primitives/checkbox.tsx
|
|
1489
|
-
import * as
|
|
2144
|
+
import * as React16 from "react";
|
|
1490
2145
|
import { Check as Check5 } from "lucide-react";
|
|
1491
|
-
import { jsx as
|
|
1492
|
-
var Checkbox =
|
|
1493
|
-
/* @__PURE__ */
|
|
2146
|
+
import { jsx as jsx41, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
2147
|
+
var Checkbox = React16.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs29("span", { className: "relative inline-flex h-4 w-4 shrink-0", children: [
|
|
2148
|
+
/* @__PURE__ */ jsx41(
|
|
1494
2149
|
"input",
|
|
1495
2150
|
{
|
|
1496
2151
|
ref,
|
|
@@ -1502,7 +2157,7 @@ var Checkbox = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
1502
2157
|
...props
|
|
1503
2158
|
}
|
|
1504
2159
|
),
|
|
1505
|
-
/* @__PURE__ */
|
|
2160
|
+
/* @__PURE__ */ jsx41(
|
|
1506
2161
|
Check5,
|
|
1507
2162
|
{
|
|
1508
2163
|
"aria-hidden": "true",
|
|
@@ -1512,18 +2167,18 @@ var Checkbox = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
1512
2167
|
] }));
|
|
1513
2168
|
Checkbox.displayName = "Checkbox";
|
|
1514
2169
|
function CheckboxField({ id, label, description, containerClassName, className, ...props }) {
|
|
1515
|
-
const generatedId =
|
|
2170
|
+
const generatedId = React16.useId();
|
|
1516
2171
|
const inputId = id ?? generatedId;
|
|
1517
|
-
return /* @__PURE__ */
|
|
2172
|
+
return /* @__PURE__ */ jsxs29(
|
|
1518
2173
|
"label",
|
|
1519
2174
|
{
|
|
1520
2175
|
htmlFor: inputId,
|
|
1521
2176
|
className: cn("flex items-center gap-3 rounded-lg border border-border bg-card p-3 transition-colors hover:bg-accent/30", containerClassName),
|
|
1522
2177
|
children: [
|
|
1523
|
-
/* @__PURE__ */
|
|
1524
|
-
/* @__PURE__ */
|
|
1525
|
-
/* @__PURE__ */
|
|
1526
|
-
description ? /* @__PURE__ */
|
|
2178
|
+
/* @__PURE__ */ jsx41(Checkbox, { id: inputId, className, ...props }),
|
|
2179
|
+
/* @__PURE__ */ jsxs29("span", { className: "grid gap-1", children: [
|
|
2180
|
+
/* @__PURE__ */ jsx41("span", { className: "text-sm font-medium text-foreground", children: label }),
|
|
2181
|
+
description ? /* @__PURE__ */ jsx41("span", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
1527
2182
|
] })
|
|
1528
2183
|
]
|
|
1529
2184
|
}
|
|
@@ -1531,21 +2186,21 @@ function CheckboxField({ id, label, description, containerClassName, className,
|
|
|
1531
2186
|
}
|
|
1532
2187
|
|
|
1533
2188
|
// src/components/primitives/label.tsx
|
|
1534
|
-
import * as
|
|
2189
|
+
import * as React17 from "react";
|
|
1535
2190
|
import * as LabelPrimitive from "@radix-ui/react-label";
|
|
1536
2191
|
import { cva as cva6 } from "class-variance-authority";
|
|
1537
|
-
import { jsx as
|
|
2192
|
+
import { jsx as jsx42 } from "react/jsx-runtime";
|
|
1538
2193
|
var labelVariants = cva6("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70");
|
|
1539
|
-
var Label3 =
|
|
2194
|
+
var Label3 = React17.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx42(LabelPrimitive.Root, { ref, className: cn(labelVariants(), className), ...props }));
|
|
1540
2195
|
Label3.displayName = LabelPrimitive.Root.displayName;
|
|
1541
2196
|
|
|
1542
2197
|
// src/components/primitives/radio-group.tsx
|
|
1543
|
-
import * as
|
|
1544
|
-
import { jsx as
|
|
1545
|
-
var RadioGroup2 =
|
|
2198
|
+
import * as React18 from "react";
|
|
2199
|
+
import { jsx as jsx43, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2200
|
+
var RadioGroup2 = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx43("div", { ref, role: "radiogroup", className: cn("grid gap-3", className), ...props }));
|
|
1546
2201
|
RadioGroup2.displayName = "RadioGroup";
|
|
1547
|
-
var RadioGroupItem =
|
|
1548
|
-
/* @__PURE__ */
|
|
2202
|
+
var RadioGroupItem = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs30("span", { className: "relative inline-flex h-4 w-4 shrink-0", children: [
|
|
2203
|
+
/* @__PURE__ */ jsx43(
|
|
1549
2204
|
"input",
|
|
1550
2205
|
{
|
|
1551
2206
|
ref,
|
|
@@ -1557,7 +2212,7 @@ var RadioGroupItem = React16.forwardRef(({ className, ...props }, ref) => /* @__
|
|
|
1557
2212
|
...props
|
|
1558
2213
|
}
|
|
1559
2214
|
),
|
|
1560
|
-
/* @__PURE__ */
|
|
2215
|
+
/* @__PURE__ */ jsx43(
|
|
1561
2216
|
"span",
|
|
1562
2217
|
{
|
|
1563
2218
|
"aria-hidden": "true",
|
|
@@ -1567,18 +2222,18 @@ var RadioGroupItem = React16.forwardRef(({ className, ...props }, ref) => /* @__
|
|
|
1567
2222
|
] }));
|
|
1568
2223
|
RadioGroupItem.displayName = "RadioGroupItem";
|
|
1569
2224
|
function RadioField({ id, label, description, containerClassName, className, ...props }) {
|
|
1570
|
-
const generatedId =
|
|
2225
|
+
const generatedId = React18.useId();
|
|
1571
2226
|
const inputId = id ?? generatedId;
|
|
1572
|
-
return /* @__PURE__ */
|
|
2227
|
+
return /* @__PURE__ */ jsxs30(
|
|
1573
2228
|
"label",
|
|
1574
2229
|
{
|
|
1575
2230
|
htmlFor: inputId,
|
|
1576
2231
|
className: cn("flex items-center gap-3 rounded-lg border border-border bg-card p-3 transition-colors hover:bg-accent/30", containerClassName),
|
|
1577
2232
|
children: [
|
|
1578
|
-
/* @__PURE__ */
|
|
1579
|
-
/* @__PURE__ */
|
|
1580
|
-
/* @__PURE__ */
|
|
1581
|
-
description ? /* @__PURE__ */
|
|
2233
|
+
/* @__PURE__ */ jsx43(RadioGroupItem, { id: inputId, className, ...props }),
|
|
2234
|
+
/* @__PURE__ */ jsxs30("span", { className: "grid gap-1", children: [
|
|
2235
|
+
/* @__PURE__ */ jsx43("span", { className: "text-sm font-medium text-foreground", children: label }),
|
|
2236
|
+
description ? /* @__PURE__ */ jsx43("span", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
1582
2237
|
] })
|
|
1583
2238
|
]
|
|
1584
2239
|
}
|
|
@@ -1586,10 +2241,10 @@ function RadioField({ id, label, description, containerClassName, className, ...
|
|
|
1586
2241
|
}
|
|
1587
2242
|
|
|
1588
2243
|
// src/components/primitives/separator.tsx
|
|
1589
|
-
import * as
|
|
2244
|
+
import * as React19 from "react";
|
|
1590
2245
|
import * as SeparatorPrimitive from "@radix-ui/react-separator";
|
|
1591
|
-
import { jsx as
|
|
1592
|
-
var Separator3 =
|
|
2246
|
+
import { jsx as jsx44 } from "react/jsx-runtime";
|
|
2247
|
+
var Separator3 = React19.forwardRef(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx44(
|
|
1593
2248
|
SeparatorPrimitive.Root,
|
|
1594
2249
|
{
|
|
1595
2250
|
ref,
|
|
@@ -1602,11 +2257,11 @@ var Separator3 = React17.forwardRef(({ className, orientation = "horizontal", de
|
|
|
1602
2257
|
Separator3.displayName = SeparatorPrimitive.Root.displayName;
|
|
1603
2258
|
|
|
1604
2259
|
// src/components/primitives/switch.tsx
|
|
1605
|
-
import * as
|
|
1606
|
-
import { jsx as
|
|
1607
|
-
var Switch =
|
|
2260
|
+
import * as React20 from "react";
|
|
2261
|
+
import { jsx as jsx45, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2262
|
+
var Switch = React20.forwardRef(({ className, size = "default", ...props }, ref) => {
|
|
1608
2263
|
const isSm = size === "sm";
|
|
1609
|
-
return /* @__PURE__ */
|
|
2264
|
+
return /* @__PURE__ */ jsxs31(
|
|
1610
2265
|
"span",
|
|
1611
2266
|
{
|
|
1612
2267
|
className: cn(
|
|
@@ -1614,7 +2269,7 @@ var Switch = React18.forwardRef(({ className, size = "default", ...props }, ref)
|
|
|
1614
2269
|
isSm ? "h-4 w-7" : "h-6 w-10"
|
|
1615
2270
|
),
|
|
1616
2271
|
children: [
|
|
1617
|
-
/* @__PURE__ */
|
|
2272
|
+
/* @__PURE__ */ jsx45(
|
|
1618
2273
|
"input",
|
|
1619
2274
|
{
|
|
1620
2275
|
ref,
|
|
@@ -1630,7 +2285,7 @@ var Switch = React18.forwardRef(({ className, size = "default", ...props }, ref)
|
|
|
1630
2285
|
...props
|
|
1631
2286
|
}
|
|
1632
2287
|
),
|
|
1633
|
-
/* @__PURE__ */
|
|
2288
|
+
/* @__PURE__ */ jsx45(
|
|
1634
2289
|
"span",
|
|
1635
2290
|
{
|
|
1636
2291
|
"aria-hidden": "true",
|
|
@@ -1646,9 +2301,9 @@ var Switch = React18.forwardRef(({ className, size = "default", ...props }, ref)
|
|
|
1646
2301
|
});
|
|
1647
2302
|
Switch.displayName = "Switch";
|
|
1648
2303
|
function SwitchField({ id, label, description, containerClassName, size, className, ...props }) {
|
|
1649
|
-
const generatedId =
|
|
2304
|
+
const generatedId = React20.useId();
|
|
1650
2305
|
const inputId = id ?? generatedId;
|
|
1651
|
-
return /* @__PURE__ */
|
|
2306
|
+
return /* @__PURE__ */ jsxs31(
|
|
1652
2307
|
"label",
|
|
1653
2308
|
{
|
|
1654
2309
|
htmlFor: inputId,
|
|
@@ -1658,43 +2313,27 @@ function SwitchField({ id, label, description, containerClassName, size, classNa
|
|
|
1658
2313
|
containerClassName
|
|
1659
2314
|
),
|
|
1660
2315
|
children: [
|
|
1661
|
-
/* @__PURE__ */
|
|
1662
|
-
/* @__PURE__ */
|
|
1663
|
-
description ? /* @__PURE__ */
|
|
2316
|
+
/* @__PURE__ */ jsxs31("span", { className: "grid gap-0.5", children: [
|
|
2317
|
+
/* @__PURE__ */ jsx45("span", { className: "text-sm font-medium text-foreground", children: label }),
|
|
2318
|
+
description ? /* @__PURE__ */ jsx45("span", { className: "text-xs text-muted-foreground", children: description }) : null
|
|
1664
2319
|
] }),
|
|
1665
|
-
/* @__PURE__ */
|
|
2320
|
+
/* @__PURE__ */ jsx45(Switch, { id: inputId, size, className, ...props })
|
|
1666
2321
|
]
|
|
1667
2322
|
}
|
|
1668
2323
|
);
|
|
1669
2324
|
}
|
|
1670
2325
|
|
|
1671
|
-
// src/components/primitives/textarea.tsx
|
|
1672
|
-
import * as React19 from "react";
|
|
1673
|
-
import { jsx as jsx39 } from "react/jsx-runtime";
|
|
1674
|
-
var Textarea = React19.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(
|
|
1675
|
-
"textarea",
|
|
1676
|
-
{
|
|
1677
|
-
ref,
|
|
1678
|
-
className: cn(
|
|
1679
|
-
"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",
|
|
1680
|
-
className
|
|
1681
|
-
),
|
|
1682
|
-
...props
|
|
1683
|
-
}
|
|
1684
|
-
));
|
|
1685
|
-
Textarea.displayName = "Textarea";
|
|
1686
|
-
|
|
1687
2326
|
// src/components/tables/data-table.tsx
|
|
1688
2327
|
import { useMemo as useMemo3, useState as useState4 } from "react";
|
|
1689
2328
|
import { ChevronLeft, ChevronRight as ChevronRight3, Search as Search2 } from "lucide-react";
|
|
1690
|
-
import { jsx as
|
|
2329
|
+
import { jsx as jsx46, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
1691
2330
|
function getCellContent(row, column) {
|
|
1692
2331
|
if (column.render) {
|
|
1693
2332
|
return column.render(row);
|
|
1694
2333
|
}
|
|
1695
2334
|
const value = row[column.key];
|
|
1696
2335
|
if (value === null || value === void 0) {
|
|
1697
|
-
return /* @__PURE__ */
|
|
2336
|
+
return /* @__PURE__ */ jsx46("span", { className: "text-muted-foreground/40", children: "-" });
|
|
1698
2337
|
}
|
|
1699
2338
|
if (typeof value === "boolean") {
|
|
1700
2339
|
return value ? "Yes" : "No";
|
|
@@ -1731,10 +2370,10 @@ function DataTable({
|
|
|
1731
2370
|
setSearch(value);
|
|
1732
2371
|
setPage(0);
|
|
1733
2372
|
}
|
|
1734
|
-
return /* @__PURE__ */
|
|
1735
|
-
/* @__PURE__ */
|
|
1736
|
-
/* @__PURE__ */
|
|
1737
|
-
/* @__PURE__ */
|
|
2373
|
+
return /* @__PURE__ */ jsxs32("div", { className: "space-y-4", children: [
|
|
2374
|
+
/* @__PURE__ */ jsxs32("div", { className: "relative", children: [
|
|
2375
|
+
/* @__PURE__ */ jsx46(Search2, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
|
|
2376
|
+
/* @__PURE__ */ jsx46(
|
|
1738
2377
|
Input,
|
|
1739
2378
|
{
|
|
1740
2379
|
placeholder: "Search...",
|
|
@@ -1744,25 +2383,25 @@ function DataTable({
|
|
|
1744
2383
|
}
|
|
1745
2384
|
)
|
|
1746
2385
|
] }),
|
|
1747
|
-
/* @__PURE__ */
|
|
1748
|
-
/* @__PURE__ */
|
|
1749
|
-
columns.map((column) => /* @__PURE__ */
|
|
1750
|
-
actions ? /* @__PURE__ */
|
|
2386
|
+
/* @__PURE__ */ jsx46("div", { className: "hidden rounded-lg border md:block", children: /* @__PURE__ */ jsxs32(Table, { children: [
|
|
2387
|
+
/* @__PURE__ */ jsx46(TableHeader, { children: /* @__PURE__ */ jsxs32(TableRow, { children: [
|
|
2388
|
+
columns.map((column) => /* @__PURE__ */ jsx46(TableHead, { children: column.label }, String(column.key))),
|
|
2389
|
+
actions ? /* @__PURE__ */ jsx46(TableHead, { className: "w-[100px] text-right", children: "Actions" }) : null
|
|
1751
2390
|
] }) }),
|
|
1752
|
-
/* @__PURE__ */
|
|
1753
|
-
columns.map((column) => /* @__PURE__ */
|
|
1754
|
-
actions ? /* @__PURE__ */
|
|
1755
|
-
] }, index)) : paginated.length === 0 ? /* @__PURE__ */
|
|
1756
|
-
columns.map((column) => /* @__PURE__ */
|
|
1757
|
-
actions ? /* @__PURE__ */
|
|
2391
|
+
/* @__PURE__ */ jsx46(TableBody, { children: isLoading ? Array.from({ length: SKELETON_ROWS }).map((_, index) => /* @__PURE__ */ jsxs32(TableRow, { children: [
|
|
2392
|
+
columns.map((column) => /* @__PURE__ */ jsx46(TableCell, { children: /* @__PURE__ */ jsx46(Skeleton, { className: "h-4 w-full" }) }, String(column.key))),
|
|
2393
|
+
actions ? /* @__PURE__ */ jsx46(TableCell, { children: /* @__PURE__ */ jsx46(Skeleton, { className: "ml-auto h-8 w-20" }) }) : null
|
|
2394
|
+
] }, index)) : paginated.length === 0 ? /* @__PURE__ */ jsx46(TableRow, { children: /* @__PURE__ */ jsx46(TableCell, { colSpan: columns.length + (actions ? 1 : 0), className: "py-12 text-center text-muted-foreground", children: emptyMessage }) }) : paginated.map((row, index) => /* @__PURE__ */ jsxs32(TableRow, { children: [
|
|
2395
|
+
columns.map((column) => /* @__PURE__ */ jsx46(TableCell, { children: getCellContent(row, column) }, String(column.key))),
|
|
2396
|
+
actions ? /* @__PURE__ */ jsx46(TableCell, { children: /* @__PURE__ */ jsx46("div", { className: "flex justify-end gap-1.5", children: actions(row) }) }) : null
|
|
1758
2397
|
] }, index)) })
|
|
1759
2398
|
] }) }),
|
|
1760
|
-
/* @__PURE__ */
|
|
1761
|
-
/* @__PURE__ */
|
|
1762
|
-
/* @__PURE__ */
|
|
1763
|
-
/* @__PURE__ */
|
|
1764
|
-
] }) }, index)) : paginated.length === 0 ? /* @__PURE__ */
|
|
1765
|
-
/* @__PURE__ */
|
|
2399
|
+
/* @__PURE__ */ jsx46("div", { className: "space-y-3 md:hidden", children: isLoading ? Array.from({ length: SKELETON_ROWS }).map((_, index) => /* @__PURE__ */ jsx46(Card, { children: /* @__PURE__ */ jsxs32(CardContent, { className: "space-y-2 p-4", children: [
|
|
2400
|
+
/* @__PURE__ */ jsx46(Skeleton, { className: "h-5 w-1/2" }),
|
|
2401
|
+
/* @__PURE__ */ jsx46(Skeleton, { className: "h-4 w-2/3" }),
|
|
2402
|
+
/* @__PURE__ */ jsx46(Skeleton, { className: "h-4 w-1/3" })
|
|
2403
|
+
] }) }, index)) : paginated.length === 0 ? /* @__PURE__ */ jsx46("p", { className: "py-10 text-center text-muted-foreground", children: emptyMessage }) : paginated.map((row, index) => /* @__PURE__ */ jsx46(Card, { children: /* @__PURE__ */ jsxs32(CardContent, { className: "space-y-3 p-4", children: [
|
|
2404
|
+
/* @__PURE__ */ jsx46("div", { className: "space-y-1.5", children: mobileColumns.map((column, mobileIndex) => /* @__PURE__ */ jsxs32(
|
|
1766
2405
|
"div",
|
|
1767
2406
|
{
|
|
1768
2407
|
className: cn(
|
|
@@ -1770,27 +2409,27 @@ function DataTable({
|
|
|
1770
2409
|
mobileIndex === 0 ? "text-sm font-medium text-foreground" : "text-xs text-muted-foreground"
|
|
1771
2410
|
),
|
|
1772
2411
|
children: [
|
|
1773
|
-
mobileIndex > 0 ? /* @__PURE__ */
|
|
2412
|
+
mobileIndex > 0 ? /* @__PURE__ */ jsxs32("span", { className: "shrink-0 font-medium text-foreground/50", children: [
|
|
1774
2413
|
column.label,
|
|
1775
2414
|
":"
|
|
1776
2415
|
] }) : null,
|
|
1777
|
-
/* @__PURE__ */
|
|
2416
|
+
/* @__PURE__ */ jsx46("span", { className: "truncate", children: getCellContent(row, column) })
|
|
1778
2417
|
]
|
|
1779
2418
|
},
|
|
1780
2419
|
String(column.key)
|
|
1781
2420
|
)) }),
|
|
1782
|
-
actions ? /* @__PURE__ */
|
|
2421
|
+
actions ? /* @__PURE__ */ jsx46("div", { className: "flex gap-2 border-t border-border pt-2", children: actions(row) }) : null
|
|
1783
2422
|
] }) }, index)) }),
|
|
1784
|
-
!isLoading && filtered.length > pageSize ? /* @__PURE__ */
|
|
1785
|
-
/* @__PURE__ */
|
|
2423
|
+
!isLoading && filtered.length > pageSize ? /* @__PURE__ */ jsxs32("div", { className: "flex items-center justify-between", children: [
|
|
2424
|
+
/* @__PURE__ */ jsxs32("span", { className: "text-sm text-muted-foreground", children: [
|
|
1786
2425
|
filtered.length,
|
|
1787
2426
|
" records \xB7 Page ",
|
|
1788
2427
|
currentPage + 1,
|
|
1789
2428
|
" of ",
|
|
1790
2429
|
totalPages
|
|
1791
2430
|
] }),
|
|
1792
|
-
/* @__PURE__ */
|
|
1793
|
-
/* @__PURE__ */
|
|
2431
|
+
/* @__PURE__ */ jsxs32("div", { className: "flex gap-1", children: [
|
|
2432
|
+
/* @__PURE__ */ jsx46(
|
|
1794
2433
|
Button,
|
|
1795
2434
|
{
|
|
1796
2435
|
variant: "outline",
|
|
@@ -1798,10 +2437,10 @@ function DataTable({
|
|
|
1798
2437
|
className: "h-8 w-8",
|
|
1799
2438
|
onClick: () => setPage((previous) => Math.max(0, previous - 1)),
|
|
1800
2439
|
disabled: currentPage === 0,
|
|
1801
|
-
children: /* @__PURE__ */
|
|
2440
|
+
children: /* @__PURE__ */ jsx46(ChevronLeft, { className: "h-4 w-4" })
|
|
1802
2441
|
}
|
|
1803
2442
|
),
|
|
1804
|
-
/* @__PURE__ */
|
|
2443
|
+
/* @__PURE__ */ jsx46(
|
|
1805
2444
|
Button,
|
|
1806
2445
|
{
|
|
1807
2446
|
variant: "outline",
|
|
@@ -1809,7 +2448,7 @@ function DataTable({
|
|
|
1809
2448
|
className: "h-8 w-8",
|
|
1810
2449
|
onClick: () => setPage((previous) => Math.min(totalPages - 1, previous + 1)),
|
|
1811
2450
|
disabled: currentPage >= totalPages - 1,
|
|
1812
|
-
children: /* @__PURE__ */
|
|
2451
|
+
children: /* @__PURE__ */ jsx46(ChevronRight3, { className: "h-4 w-4" })
|
|
1813
2452
|
}
|
|
1814
2453
|
)
|
|
1815
2454
|
] })
|
|
@@ -1819,14 +2458,14 @@ function DataTable({
|
|
|
1819
2458
|
|
|
1820
2459
|
// src/components/tables/table-row-actions.tsx
|
|
1821
2460
|
import { MoreHorizontal as MoreHorizontal2 } from "lucide-react";
|
|
1822
|
-
import { jsx as
|
|
2461
|
+
import { jsx as jsx47, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
1823
2462
|
function TableRowActions({ className, label = "Abrir acciones", menuLabel = "Acciones", items }) {
|
|
1824
|
-
return /* @__PURE__ */
|
|
1825
|
-
/* @__PURE__ */
|
|
1826
|
-
/* @__PURE__ */
|
|
1827
|
-
/* @__PURE__ */
|
|
1828
|
-
/* @__PURE__ */
|
|
1829
|
-
items.map((item) => /* @__PURE__ */
|
|
2463
|
+
return /* @__PURE__ */ jsxs33(DropdownMenu, { children: [
|
|
2464
|
+
/* @__PURE__ */ jsx47(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx47(Button, { variant: "ghost", size: "icon", className: cn("h-8 w-8 shadow-none", className), "aria-label": label, children: /* @__PURE__ */ jsx47(MoreHorizontal2, { className: "h-4 w-4" }) }) }),
|
|
2465
|
+
/* @__PURE__ */ jsxs33(DropdownMenuContent, { align: "end", className: "w-48", children: [
|
|
2466
|
+
/* @__PURE__ */ jsx47(DropdownMenuLabel, { children: menuLabel }),
|
|
2467
|
+
/* @__PURE__ */ jsx47(DropdownMenuSeparator, {}),
|
|
2468
|
+
items.map((item) => /* @__PURE__ */ jsxs33(
|
|
1830
2469
|
DropdownMenuItem,
|
|
1831
2470
|
{
|
|
1832
2471
|
disabled: item.disabled,
|
|
@@ -1835,7 +2474,7 @@ function TableRowActions({ className, label = "Abrir acciones", menuLabel = "Acc
|
|
|
1835
2474
|
children: [
|
|
1836
2475
|
item.icon,
|
|
1837
2476
|
item.label,
|
|
1838
|
-
item.shortcut ? /* @__PURE__ */
|
|
2477
|
+
item.shortcut ? /* @__PURE__ */ jsx47(DropdownMenuShortcut, { children: item.shortcut }) : null
|
|
1839
2478
|
]
|
|
1840
2479
|
},
|
|
1841
2480
|
item.label
|
|
@@ -1844,6 +2483,23 @@ function TableRowActions({ className, label = "Abrir acciones", menuLabel = "Acc
|
|
|
1844
2483
|
] });
|
|
1845
2484
|
}
|
|
1846
2485
|
export {
|
|
2486
|
+
AiChatAssistantMessage,
|
|
2487
|
+
AiChatComposer,
|
|
2488
|
+
AiChatEmptyState,
|
|
2489
|
+
AiChatFloatingButton,
|
|
2490
|
+
AiChatFloatingSidebar,
|
|
2491
|
+
AiChatHeader,
|
|
2492
|
+
AiChatLayout,
|
|
2493
|
+
AiChatMessage,
|
|
2494
|
+
AiChatMessageList,
|
|
2495
|
+
AiChatPanel,
|
|
2496
|
+
AiChatSidebar,
|
|
2497
|
+
AiChatSidebarHeader,
|
|
2498
|
+
AiChatSummaryAction,
|
|
2499
|
+
AiChatSummaryActions,
|
|
2500
|
+
AiChatThreadButton,
|
|
2501
|
+
AiChatThreadList,
|
|
2502
|
+
AiChatUserMessage,
|
|
1847
2503
|
Alert,
|
|
1848
2504
|
AlertDescription,
|
|
1849
2505
|
AlertTitle,
|
|
@@ -1908,14 +2564,17 @@ export {
|
|
|
1908
2564
|
DropdownMenuSubContent,
|
|
1909
2565
|
DropdownMenuSubTrigger,
|
|
1910
2566
|
DropdownMenuTrigger,
|
|
2567
|
+
EmptyState,
|
|
1911
2568
|
FeatureIcon,
|
|
1912
2569
|
FormSection,
|
|
2570
|
+
HeaderUserMenu,
|
|
1913
2571
|
Input,
|
|
1914
2572
|
Label3 as Label,
|
|
1915
2573
|
LoadingCard,
|
|
1916
2574
|
LoadingState,
|
|
1917
2575
|
LoadingTableRows,
|
|
1918
2576
|
ModuleIconButton,
|
|
2577
|
+
ModuleSkeleton,
|
|
1919
2578
|
Navbar,
|
|
1920
2579
|
NotificationAction,
|
|
1921
2580
|
NotificationMessage,
|
|
@@ -1955,6 +2614,8 @@ export {
|
|
|
1955
2614
|
Steps,
|
|
1956
2615
|
Switch,
|
|
1957
2616
|
SwitchField,
|
|
2617
|
+
SyncStatusBadge,
|
|
2618
|
+
SyncStatusBar,
|
|
1958
2619
|
Table,
|
|
1959
2620
|
TableBody,
|
|
1960
2621
|
TableCaption,
|