@motor-hero/ui-kit 0.10.1 → 0.12.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/components/app-shell.d.ts +1 -1
- package/dist/components/app-shell.d.ts.map +1 -1
- package/dist/components/auth-card.d.ts +1 -1
- package/dist/components/auth-card.d.ts.map +1 -1
- package/dist/components/confirm-dialog.d.ts +1 -1
- package/dist/components/confirm-dialog.d.ts.map +1 -1
- package/dist/components/data-table-wrapper.d.ts +1 -1
- package/dist/components/data-table-wrapper.d.ts.map +1 -1
- package/dist/components/empty-state.d.ts +1 -1
- package/dist/components/empty-state.d.ts.map +1 -1
- package/dist/components/form-dialog.d.ts +33 -1
- package/dist/components/form-dialog.d.ts.map +1 -1
- package/dist/components/form-field.d.ts +1 -1
- package/dist/components/form-field.d.ts.map +1 -1
- package/dist/components/mobile-card-list.d.ts +1 -1
- package/dist/components/mobile-card-list.d.ts.map +1 -1
- package/dist/components/mode-toggle.d.ts +1 -1
- package/dist/components/mode-toggle.d.ts.map +1 -1
- package/dist/components/page-header.d.ts +1 -1
- package/dist/components/page-header.d.ts.map +1 -1
- package/dist/components/pagination.d.ts +1 -1
- package/dist/components/pagination.d.ts.map +1 -1
- package/dist/components/progress-bar.d.ts +12 -0
- package/dist/components/progress-bar.d.ts.map +1 -0
- package/dist/components/responsive-data-view.d.ts +1 -1
- package/dist/components/responsive-data-view.d.ts.map +1 -1
- package/dist/components/row-actions-menu.d.ts +1 -1
- package/dist/components/row-actions-menu.d.ts.map +1 -1
- package/dist/components/sidebar-nav.d.ts +1 -1
- package/dist/components/sidebar-nav.d.ts.map +1 -1
- package/dist/components/stat-card.d.ts +1 -1
- package/dist/components/stat-card.d.ts.map +1 -1
- package/dist/components/status-badge.d.ts +11 -0
- package/dist/components/status-badge.d.ts.map +1 -0
- package/dist/components/status-dot.d.ts +1 -1
- package/dist/components/status-dot.d.ts.map +1 -1
- package/dist/components/table-skeleton.d.ts +1 -1
- package/dist/components/table-skeleton.d.ts.map +1 -1
- package/dist/components/theme-provider.d.ts +1 -1
- package/dist/components/theme-provider.d.ts.map +1 -1
- package/dist/components/toaster.d.ts +1 -1
- package/dist/components/toaster.d.ts.map +1 -1
- package/dist/components/user-menu.d.ts +1 -1
- package/dist/components/user-menu.d.ts.map +1 -1
- package/dist/index.cjs +321 -147
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +316 -145
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/src/components/form-dialog.tsx +121 -0
- package/src/components/page-header.tsx +8 -4
- package/src/components/progress-bar.tsx +49 -0
- package/src/components/status-badge.tsx +63 -0
- package/src/index.ts +5 -1
package/dist/index.js
CHANGED
|
@@ -157,13 +157,19 @@ function ConfirmDialog({
|
|
|
157
157
|
// src/components/page-header.tsx
|
|
158
158
|
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
159
159
|
function PageHeader({ title, description, action, className }) {
|
|
160
|
-
return /* @__PURE__ */ jsxs4(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
160
|
+
return /* @__PURE__ */ jsxs4(
|
|
161
|
+
"div",
|
|
162
|
+
{
|
|
163
|
+
className: `flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between ${className ?? ""}`,
|
|
164
|
+
children: [
|
|
165
|
+
/* @__PURE__ */ jsxs4("div", { className: "min-w-0", children: [
|
|
166
|
+
/* @__PURE__ */ jsx5("h1", { className: "truncate text-2xl font-semibold tracking-tight", children: title }),
|
|
167
|
+
description && /* @__PURE__ */ jsx5("p", { className: "text-sm text-muted-foreground", children: description })
|
|
168
|
+
] }),
|
|
169
|
+
action && /* @__PURE__ */ jsx5("div", { className: "shrink-0", children: action })
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
);
|
|
167
173
|
}
|
|
168
174
|
|
|
169
175
|
// src/components/status-dot.tsx
|
|
@@ -180,28 +186,124 @@ function StatusDot({ active, label, className }) {
|
|
|
180
186
|
] });
|
|
181
187
|
}
|
|
182
188
|
|
|
183
|
-
// src/components/
|
|
189
|
+
// src/components/status-badge.tsx
|
|
184
190
|
import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
191
|
+
var variantClasses = {
|
|
192
|
+
neutral: {
|
|
193
|
+
badge: "bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300",
|
|
194
|
+
dot: "bg-gray-400"
|
|
195
|
+
},
|
|
196
|
+
info: {
|
|
197
|
+
badge: "bg-blue-100 text-blue-700 dark:bg-blue-950 dark:text-blue-400",
|
|
198
|
+
dot: "bg-blue-500"
|
|
199
|
+
},
|
|
200
|
+
success: {
|
|
201
|
+
badge: "bg-green-100 text-green-700 dark:bg-green-950 dark:text-green-400",
|
|
202
|
+
dot: "bg-green-500"
|
|
203
|
+
},
|
|
204
|
+
danger: {
|
|
205
|
+
badge: "bg-red-100 text-red-700 dark:bg-red-950 dark:text-red-400",
|
|
206
|
+
dot: "bg-red-500"
|
|
207
|
+
},
|
|
208
|
+
warning: {
|
|
209
|
+
badge: "bg-amber-100 text-amber-700 dark:bg-amber-950 dark:text-amber-400",
|
|
210
|
+
dot: "bg-amber-500"
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
function StatusBadge({
|
|
214
|
+
variant = "neutral",
|
|
215
|
+
dot = true,
|
|
216
|
+
className,
|
|
217
|
+
children
|
|
218
|
+
}) {
|
|
219
|
+
const classes = variantClasses[variant];
|
|
220
|
+
return /* @__PURE__ */ jsxs6(
|
|
221
|
+
"span",
|
|
222
|
+
{
|
|
223
|
+
className: `inline-flex items-center gap-1.5 rounded-md px-2 py-0.5 text-xs font-medium ${classes.badge} ${className ?? ""}`,
|
|
224
|
+
children: [
|
|
225
|
+
dot && /* @__PURE__ */ jsx7(
|
|
226
|
+
"span",
|
|
227
|
+
{
|
|
228
|
+
className: `inline-block h-1.5 w-1.5 shrink-0 rounded-full ${classes.dot}`
|
|
229
|
+
}
|
|
230
|
+
),
|
|
231
|
+
children
|
|
232
|
+
]
|
|
233
|
+
}
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// src/components/progress-bar.tsx
|
|
238
|
+
import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
239
|
+
var sizeClasses = {
|
|
240
|
+
sm: "h-1.5",
|
|
241
|
+
md: "h-2"
|
|
242
|
+
};
|
|
243
|
+
function ProgressBar({
|
|
244
|
+
value,
|
|
245
|
+
size = "md",
|
|
246
|
+
label,
|
|
247
|
+
valueLabel,
|
|
248
|
+
className,
|
|
249
|
+
indicatorClassName
|
|
250
|
+
}) {
|
|
251
|
+
const clamped = Math.min(100, Math.max(0, value));
|
|
252
|
+
return /* @__PURE__ */ jsxs7("div", { className: `space-y-1.5 ${className ?? ""}`, children: [
|
|
253
|
+
(label || valueLabel) && /* @__PURE__ */ jsxs7("div", { className: "flex items-baseline justify-between gap-2", children: [
|
|
254
|
+
label && /* @__PURE__ */ jsx8("span", { className: "text-sm text-muted-foreground", children: label }),
|
|
255
|
+
valueLabel && /* @__PURE__ */ jsx8("span", { className: "text-sm font-semibold", children: valueLabel })
|
|
256
|
+
] }),
|
|
257
|
+
/* @__PURE__ */ jsx8(
|
|
258
|
+
"div",
|
|
259
|
+
{
|
|
260
|
+
className: `w-full overflow-hidden rounded-full bg-muted ${sizeClasses[size]}`,
|
|
261
|
+
children: /* @__PURE__ */ jsx8(
|
|
262
|
+
"div",
|
|
263
|
+
{
|
|
264
|
+
className: `h-full rounded-full transition-all duration-300 ${indicatorClassName ?? "bg-primary"}`,
|
|
265
|
+
style: { width: `${clamped}%` }
|
|
266
|
+
}
|
|
267
|
+
)
|
|
268
|
+
}
|
|
269
|
+
)
|
|
270
|
+
] });
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// src/components/form-field.tsx
|
|
274
|
+
import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
185
275
|
function FormField({ label, htmlFor, error, required, children, className }) {
|
|
186
|
-
return /* @__PURE__ */
|
|
187
|
-
/* @__PURE__ */
|
|
276
|
+
return /* @__PURE__ */ jsxs8("div", { className: `space-y-2 ${className ?? ""}`, children: [
|
|
277
|
+
/* @__PURE__ */ jsxs8(
|
|
188
278
|
"label",
|
|
189
279
|
{
|
|
190
280
|
htmlFor,
|
|
191
281
|
className: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
192
282
|
children: [
|
|
193
283
|
label,
|
|
194
|
-
required && /* @__PURE__ */
|
|
284
|
+
required && /* @__PURE__ */ jsx9("span", { className: "ml-1 text-destructive", children: "*" })
|
|
195
285
|
]
|
|
196
286
|
}
|
|
197
287
|
),
|
|
198
288
|
children,
|
|
199
|
-
error && /* @__PURE__ */
|
|
289
|
+
error && /* @__PURE__ */ jsx9("p", { className: "text-sm text-destructive", children: error })
|
|
200
290
|
] });
|
|
201
291
|
}
|
|
202
292
|
|
|
203
293
|
// src/components/form-dialog.tsx
|
|
204
|
-
import
|
|
294
|
+
import * as Dialog from "@radix-ui/react-dialog";
|
|
295
|
+
import { X } from "lucide-react";
|
|
296
|
+
import * as React from "react";
|
|
297
|
+
|
|
298
|
+
// src/lib/utils.ts
|
|
299
|
+
import { clsx } from "clsx";
|
|
300
|
+
import { twMerge } from "tailwind-merge";
|
|
301
|
+
function cn(...inputs) {
|
|
302
|
+
return twMerge(clsx(inputs));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// src/components/form-dialog.tsx
|
|
306
|
+
import { Fragment, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
205
307
|
function FormDialogLayout({
|
|
206
308
|
title,
|
|
207
309
|
children,
|
|
@@ -212,11 +314,11 @@ function FormDialogLayout({
|
|
|
212
314
|
isSubmitting = false,
|
|
213
315
|
isDisabled = false
|
|
214
316
|
}) {
|
|
215
|
-
return /* @__PURE__ */
|
|
216
|
-
/* @__PURE__ */
|
|
217
|
-
/* @__PURE__ */
|
|
218
|
-
/* @__PURE__ */
|
|
219
|
-
/* @__PURE__ */
|
|
317
|
+
return /* @__PURE__ */ jsxs9("form", { onSubmit, children: [
|
|
318
|
+
/* @__PURE__ */ jsx10("div", { className: "flex flex-col space-y-1.5 text-center sm:text-left", children: /* @__PURE__ */ jsx10("h2", { className: "text-lg font-semibold leading-none tracking-tight", children: title }) }),
|
|
319
|
+
/* @__PURE__ */ jsx10("div", { className: "space-y-4 py-4", children }),
|
|
320
|
+
/* @__PURE__ */ jsxs9("div", { className: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", children: [
|
|
321
|
+
/* @__PURE__ */ jsx10(
|
|
220
322
|
"button",
|
|
221
323
|
{
|
|
222
324
|
type: "button",
|
|
@@ -225,7 +327,7 @@ function FormDialogLayout({
|
|
|
225
327
|
children: cancelLabel
|
|
226
328
|
}
|
|
227
329
|
),
|
|
228
|
-
/* @__PURE__ */
|
|
330
|
+
/* @__PURE__ */ jsx10(
|
|
229
331
|
"button",
|
|
230
332
|
{
|
|
231
333
|
type: "submit",
|
|
@@ -237,25 +339,98 @@ function FormDialogLayout({
|
|
|
237
339
|
] })
|
|
238
340
|
] });
|
|
239
341
|
}
|
|
342
|
+
var sizeClasses2 = {
|
|
343
|
+
sm: "sm:max-w-sm",
|
|
344
|
+
md: "sm:max-w-md",
|
|
345
|
+
lg: "sm:max-w-lg",
|
|
346
|
+
xl: "sm:max-w-xl",
|
|
347
|
+
"2xl": "sm:max-w-2xl"
|
|
348
|
+
};
|
|
349
|
+
function FormDialog({
|
|
350
|
+
open,
|
|
351
|
+
onOpenChange,
|
|
352
|
+
title,
|
|
353
|
+
description,
|
|
354
|
+
children,
|
|
355
|
+
footer,
|
|
356
|
+
onSubmit,
|
|
357
|
+
size = "lg",
|
|
358
|
+
className
|
|
359
|
+
}) {
|
|
360
|
+
React.useEffect(() => {
|
|
361
|
+
if (open) return;
|
|
362
|
+
const id = window.setTimeout(() => {
|
|
363
|
+
if (document.body.style.pointerEvents === "none") {
|
|
364
|
+
document.body.style.pointerEvents = "";
|
|
365
|
+
}
|
|
366
|
+
}, 0);
|
|
367
|
+
return () => window.clearTimeout(id);
|
|
368
|
+
}, [open]);
|
|
369
|
+
const body = /* @__PURE__ */ jsxs9(Fragment, { children: [
|
|
370
|
+
/* @__PURE__ */ jsxs9("div", { className: "flex shrink-0 items-start justify-between gap-4 border-b px-6 py-4", children: [
|
|
371
|
+
/* @__PURE__ */ jsxs9("div", { className: "min-w-0 space-y-1", children: [
|
|
372
|
+
/* @__PURE__ */ jsx10(Dialog.Title, { className: "text-lg font-semibold leading-none tracking-tight", children: title }),
|
|
373
|
+
description && /* @__PURE__ */ jsx10(Dialog.Description, { className: "text-sm text-muted-foreground", children: description })
|
|
374
|
+
] }),
|
|
375
|
+
/* @__PURE__ */ jsx10(
|
|
376
|
+
Dialog.Close,
|
|
377
|
+
{
|
|
378
|
+
className: "-mr-1 shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
379
|
+
"aria-label": "Fechar",
|
|
380
|
+
children: /* @__PURE__ */ jsx10(X, { className: "h-5 w-5" })
|
|
381
|
+
}
|
|
382
|
+
)
|
|
383
|
+
] }),
|
|
384
|
+
/* @__PURE__ */ jsx10("div", { className: "min-h-0 flex-1 overflow-y-auto px-6 py-4", children }),
|
|
385
|
+
footer && /* @__PURE__ */ jsx10("div", { className: "flex shrink-0 flex-col-reverse gap-2 border-t px-6 py-4 sm:flex-row sm:justify-end", children: footer })
|
|
386
|
+
] });
|
|
387
|
+
return /* @__PURE__ */ jsx10(Dialog.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs9(Dialog.Portal, { children: [
|
|
388
|
+
/* @__PURE__ */ jsx10(Dialog.Overlay, { className: "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" }),
|
|
389
|
+
/* @__PURE__ */ jsx10(
|
|
390
|
+
Dialog.Content,
|
|
391
|
+
{
|
|
392
|
+
onCloseAutoFocus: () => {
|
|
393
|
+
document.body.style.pointerEvents = "";
|
|
394
|
+
},
|
|
395
|
+
className: cn(
|
|
396
|
+
"fixed z-50 flex max-h-[92vh] flex-col bg-background shadow-lg outline-none",
|
|
397
|
+
"inset-x-0 bottom-0 rounded-t-2xl",
|
|
398
|
+
"sm:inset-x-auto sm:bottom-auto sm:left-1/2 sm:top-1/2 sm:max-h-[90vh] sm:w-full sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-lg",
|
|
399
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
400
|
+
sizeClasses2[size],
|
|
401
|
+
className
|
|
402
|
+
),
|
|
403
|
+
children: onSubmit ? /* @__PURE__ */ jsx10(
|
|
404
|
+
"form",
|
|
405
|
+
{
|
|
406
|
+
onSubmit,
|
|
407
|
+
className: "flex min-h-0 flex-1 flex-col",
|
|
408
|
+
children: body
|
|
409
|
+
}
|
|
410
|
+
) : body
|
|
411
|
+
}
|
|
412
|
+
)
|
|
413
|
+
] }) });
|
|
414
|
+
}
|
|
240
415
|
|
|
241
416
|
// src/components/auth-card.tsx
|
|
242
|
-
import { jsx as
|
|
417
|
+
import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
243
418
|
function AuthCard({ title, description, children, footer }) {
|
|
244
|
-
return /* @__PURE__ */
|
|
245
|
-
/* @__PURE__ */
|
|
246
|
-
/* @__PURE__ */
|
|
247
|
-
description && /* @__PURE__ */
|
|
419
|
+
return /* @__PURE__ */ jsx11("div", { className: "flex min-h-screen items-center justify-center px-4", children: /* @__PURE__ */ jsxs10("div", { className: "w-full max-w-sm rounded-lg border bg-card p-6 shadow-sm", children: [
|
|
420
|
+
/* @__PURE__ */ jsxs10("div", { className: "mb-6 text-center", children: [
|
|
421
|
+
/* @__PURE__ */ jsx11("h1", { className: "text-2xl font-semibold tracking-tight", children: title }),
|
|
422
|
+
description && /* @__PURE__ */ jsx11("p", { className: "mt-1 text-sm text-muted-foreground", children: description })
|
|
248
423
|
] }),
|
|
249
|
-
/* @__PURE__ */
|
|
250
|
-
footer && /* @__PURE__ */
|
|
424
|
+
/* @__PURE__ */ jsx11("div", { className: "space-y-4", children }),
|
|
425
|
+
footer && /* @__PURE__ */ jsx11("div", { className: "mt-4", children: footer })
|
|
251
426
|
] }) });
|
|
252
427
|
}
|
|
253
428
|
|
|
254
429
|
// src/components/pagination.tsx
|
|
255
|
-
import { jsx as
|
|
430
|
+
import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
256
431
|
function Pagination({ page, onPageChange, hasNextPage, hasPreviousPage, className }) {
|
|
257
|
-
return /* @__PURE__ */
|
|
258
|
-
/* @__PURE__ */
|
|
432
|
+
return /* @__PURE__ */ jsxs11("div", { className: `flex items-center justify-end gap-4 ${className ?? ""}`, children: [
|
|
433
|
+
/* @__PURE__ */ jsx12(
|
|
259
434
|
"button",
|
|
260
435
|
{
|
|
261
436
|
type: "button",
|
|
@@ -265,11 +440,11 @@ function Pagination({ page, onPageChange, hasNextPage, hasPreviousPage, classNam
|
|
|
265
440
|
children: "Anterior"
|
|
266
441
|
}
|
|
267
442
|
),
|
|
268
|
-
/* @__PURE__ */
|
|
443
|
+
/* @__PURE__ */ jsxs11("span", { className: "text-sm text-muted-foreground", children: [
|
|
269
444
|
"P\xE1gina ",
|
|
270
445
|
page
|
|
271
446
|
] }),
|
|
272
|
-
/* @__PURE__ */
|
|
447
|
+
/* @__PURE__ */ jsx12(
|
|
273
448
|
"button",
|
|
274
449
|
{
|
|
275
450
|
type: "button",
|
|
@@ -283,18 +458,18 @@ function Pagination({ page, onPageChange, hasNextPage, hasPreviousPage, classNam
|
|
|
283
458
|
}
|
|
284
459
|
|
|
285
460
|
// src/components/table-skeleton.tsx
|
|
286
|
-
import { Fragment, jsx as
|
|
461
|
+
import { Fragment as Fragment2, jsx as jsx13 } from "react/jsx-runtime";
|
|
287
462
|
function TableSkeleton({ rows = 5, columns = 4 }) {
|
|
288
|
-
return /* @__PURE__ */
|
|
463
|
+
return /* @__PURE__ */ jsx13(Fragment2, { children: Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ jsx13("tr", { className: "border-b transition-colors", children: Array.from({ length: columns }).map((_2, j) => /* @__PURE__ */ jsx13("td", { className: "p-4 align-middle", children: /* @__PURE__ */ jsx13("div", { className: "h-5 w-full animate-pulse rounded bg-muted" }) }, j)) }, i)) });
|
|
289
464
|
}
|
|
290
465
|
|
|
291
466
|
// src/components/search-input.tsx
|
|
292
|
-
import * as
|
|
293
|
-
import { jsx as
|
|
294
|
-
var SearchInput =
|
|
467
|
+
import * as React2 from "react";
|
|
468
|
+
import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
469
|
+
var SearchInput = React2.forwardRef(
|
|
295
470
|
({ containerClassName, className, ...props }, ref) => {
|
|
296
|
-
return /* @__PURE__ */
|
|
297
|
-
/* @__PURE__ */
|
|
471
|
+
return /* @__PURE__ */ jsxs12("div", { className: `relative flex-1 ${containerClassName ?? ""}`, children: [
|
|
472
|
+
/* @__PURE__ */ jsxs12(
|
|
298
473
|
"svg",
|
|
299
474
|
{
|
|
300
475
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -308,12 +483,12 @@ var SearchInput = React.forwardRef(
|
|
|
308
483
|
strokeLinejoin: "round",
|
|
309
484
|
className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground",
|
|
310
485
|
children: [
|
|
311
|
-
/* @__PURE__ */
|
|
312
|
-
/* @__PURE__ */
|
|
486
|
+
/* @__PURE__ */ jsx14("circle", { cx: "11", cy: "11", r: "8" }),
|
|
487
|
+
/* @__PURE__ */ jsx14("path", { d: "m21 21-4.3-4.3" })
|
|
313
488
|
]
|
|
314
489
|
}
|
|
315
490
|
),
|
|
316
|
-
/* @__PURE__ */
|
|
491
|
+
/* @__PURE__ */ jsx14(
|
|
317
492
|
"input",
|
|
318
493
|
{
|
|
319
494
|
ref,
|
|
@@ -328,30 +503,30 @@ var SearchInput = React.forwardRef(
|
|
|
328
503
|
SearchInput.displayName = "SearchInput";
|
|
329
504
|
|
|
330
505
|
// src/components/stat-card.tsx
|
|
331
|
-
import { jsx as
|
|
506
|
+
import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
332
507
|
function StatCard({ label, value, detail, icon, isLoading }) {
|
|
333
508
|
if (isLoading) {
|
|
334
|
-
return /* @__PURE__ */
|
|
335
|
-
/* @__PURE__ */
|
|
336
|
-
/* @__PURE__ */
|
|
337
|
-
/* @__PURE__ */
|
|
509
|
+
return /* @__PURE__ */ jsxs13("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
|
|
510
|
+
/* @__PURE__ */ jsxs13("div", { className: "flex items-center justify-between pb-2", children: [
|
|
511
|
+
/* @__PURE__ */ jsx15("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
|
|
512
|
+
/* @__PURE__ */ jsx15("div", { className: "h-4 w-4 animate-pulse rounded bg-muted" })
|
|
338
513
|
] }),
|
|
339
|
-
/* @__PURE__ */
|
|
340
|
-
/* @__PURE__ */
|
|
514
|
+
/* @__PURE__ */ jsx15("div", { className: "mt-2 h-7 w-16 animate-pulse rounded bg-muted" }),
|
|
515
|
+
/* @__PURE__ */ jsx15("div", { className: "mt-1 h-4 w-20 animate-pulse rounded bg-muted" })
|
|
341
516
|
] });
|
|
342
517
|
}
|
|
343
|
-
return /* @__PURE__ */
|
|
344
|
-
/* @__PURE__ */
|
|
345
|
-
/* @__PURE__ */
|
|
346
|
-
icon && /* @__PURE__ */
|
|
518
|
+
return /* @__PURE__ */ jsxs13("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
|
|
519
|
+
/* @__PURE__ */ jsxs13("div", { className: "flex items-center justify-between pb-2", children: [
|
|
520
|
+
/* @__PURE__ */ jsx15("span", { className: "text-sm font-medium text-muted-foreground", children: label }),
|
|
521
|
+
icon && /* @__PURE__ */ jsx15("span", { className: "text-muted-foreground", children: icon })
|
|
347
522
|
] }),
|
|
348
|
-
/* @__PURE__ */
|
|
349
|
-
detail && /* @__PURE__ */
|
|
523
|
+
/* @__PURE__ */ jsx15("div", { className: "text-2xl font-bold", children: value }),
|
|
524
|
+
detail && /* @__PURE__ */ jsx15("p", { className: "text-xs text-muted-foreground", children: detail })
|
|
350
525
|
] });
|
|
351
526
|
}
|
|
352
527
|
|
|
353
528
|
// src/components/data-table-wrapper.tsx
|
|
354
|
-
import { jsx as
|
|
529
|
+
import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
355
530
|
function DataTableWrapper({
|
|
356
531
|
children,
|
|
357
532
|
isEmpty,
|
|
@@ -364,15 +539,15 @@ function DataTableWrapper({
|
|
|
364
539
|
hasNextPage = false,
|
|
365
540
|
hasPreviousPage = false
|
|
366
541
|
}) {
|
|
367
|
-
return /* @__PURE__ */
|
|
368
|
-
/* @__PURE__ */
|
|
369
|
-
!isLoading && isEmpty && /* @__PURE__ */
|
|
370
|
-
emptyIcon && /* @__PURE__ */
|
|
371
|
-
/* @__PURE__ */
|
|
372
|
-
emptyDescription && /* @__PURE__ */
|
|
542
|
+
return /* @__PURE__ */ jsxs14("div", { className: "space-y-4", children: [
|
|
543
|
+
/* @__PURE__ */ jsx16("div", { className: "overflow-x-auto rounded-md border", children }),
|
|
544
|
+
!isLoading && isEmpty && /* @__PURE__ */ jsxs14("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
|
|
545
|
+
emptyIcon && /* @__PURE__ */ jsx16("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
|
|
546
|
+
/* @__PURE__ */ jsx16("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
|
|
547
|
+
emptyDescription && /* @__PURE__ */ jsx16("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
|
|
373
548
|
] }),
|
|
374
|
-
page !== void 0 && onPageChange && /* @__PURE__ */
|
|
375
|
-
/* @__PURE__ */
|
|
549
|
+
page !== void 0 && onPageChange && /* @__PURE__ */ jsxs14("div", { className: "flex items-center justify-end gap-4", children: [
|
|
550
|
+
/* @__PURE__ */ jsx16(
|
|
376
551
|
"button",
|
|
377
552
|
{
|
|
378
553
|
type: "button",
|
|
@@ -382,11 +557,11 @@ function DataTableWrapper({
|
|
|
382
557
|
children: "Anterior"
|
|
383
558
|
}
|
|
384
559
|
),
|
|
385
|
-
/* @__PURE__ */
|
|
560
|
+
/* @__PURE__ */ jsxs14("span", { className: "text-sm text-muted-foreground", children: [
|
|
386
561
|
"P\xE1gina ",
|
|
387
562
|
page
|
|
388
563
|
] }),
|
|
389
|
-
/* @__PURE__ */
|
|
564
|
+
/* @__PURE__ */ jsx16(
|
|
390
565
|
"button",
|
|
391
566
|
{
|
|
392
567
|
type: "button",
|
|
@@ -401,7 +576,7 @@ function DataTableWrapper({
|
|
|
401
576
|
}
|
|
402
577
|
|
|
403
578
|
// src/components/mobile-card-list.tsx
|
|
404
|
-
import { jsx as
|
|
579
|
+
import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
405
580
|
function MobileCardList({
|
|
406
581
|
data,
|
|
407
582
|
renderCard,
|
|
@@ -411,19 +586,19 @@ function MobileCardList({
|
|
|
411
586
|
className
|
|
412
587
|
}) {
|
|
413
588
|
if (isLoading) {
|
|
414
|
-
return /* @__PURE__ */
|
|
415
|
-
/* @__PURE__ */
|
|
416
|
-
/* @__PURE__ */
|
|
417
|
-
/* @__PURE__ */
|
|
589
|
+
return /* @__PURE__ */ jsx17("div", { className: `space-y-3 ${className ?? ""}`, children: Array.from({ length: loadingCount }).map((_, i) => /* @__PURE__ */ jsx17("div", { className: "rounded-xl border p-4", children: /* @__PURE__ */ jsxs15("div", { className: "space-y-3", children: [
|
|
590
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
|
|
591
|
+
/* @__PURE__ */ jsx17("div", { className: "h-5 w-32 animate-pulse rounded bg-muted" }),
|
|
592
|
+
/* @__PURE__ */ jsx17("div", { className: "h-5 w-16 animate-pulse rounded bg-muted" })
|
|
418
593
|
] }),
|
|
419
|
-
/* @__PURE__ */
|
|
420
|
-
/* @__PURE__ */
|
|
421
|
-
/* @__PURE__ */
|
|
422
|
-
/* @__PURE__ */
|
|
594
|
+
/* @__PURE__ */ jsx17("div", { className: "h-4 w-48 animate-pulse rounded bg-muted" }),
|
|
595
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex justify-between", children: [
|
|
596
|
+
/* @__PURE__ */ jsx17("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
|
|
597
|
+
/* @__PURE__ */ jsx17("div", { className: "h-4 w-20 animate-pulse rounded bg-muted" })
|
|
423
598
|
] })
|
|
424
599
|
] }) }, i)) });
|
|
425
600
|
}
|
|
426
|
-
return /* @__PURE__ */
|
|
601
|
+
return /* @__PURE__ */ jsx17("div", { className: `space-y-3 ${className ?? ""}`, children: data.map((item, index) => /* @__PURE__ */ jsx17(
|
|
427
602
|
"div",
|
|
428
603
|
{
|
|
429
604
|
className: "rounded-xl border p-4 transition-all duration-150 hover:border-foreground/20 active:scale-[0.99]",
|
|
@@ -434,7 +609,7 @@ function MobileCardList({
|
|
|
434
609
|
}
|
|
435
610
|
|
|
436
611
|
// src/components/responsive-data-view.tsx
|
|
437
|
-
import { jsx as
|
|
612
|
+
import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
438
613
|
function ResponsiveDataView({
|
|
439
614
|
table,
|
|
440
615
|
cards,
|
|
@@ -445,13 +620,13 @@ function ResponsiveDataView({
|
|
|
445
620
|
emptyDescription,
|
|
446
621
|
pagination
|
|
447
622
|
}) {
|
|
448
|
-
return /* @__PURE__ */
|
|
449
|
-
/* @__PURE__ */
|
|
450
|
-
/* @__PURE__ */
|
|
451
|
-
!isLoading && isEmpty && /* @__PURE__ */
|
|
452
|
-
emptyIcon && /* @__PURE__ */
|
|
453
|
-
/* @__PURE__ */
|
|
454
|
-
emptyDescription && /* @__PURE__ */
|
|
623
|
+
return /* @__PURE__ */ jsxs16("div", { className: "space-y-4", children: [
|
|
624
|
+
/* @__PURE__ */ jsx18("div", { className: "hidden overflow-x-auto rounded-md border md:block", children: table }),
|
|
625
|
+
/* @__PURE__ */ jsx18("div", { className: "md:hidden", children: cards }),
|
|
626
|
+
!isLoading && isEmpty && /* @__PURE__ */ jsxs16("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
|
|
627
|
+
emptyIcon && /* @__PURE__ */ jsx18("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
|
|
628
|
+
/* @__PURE__ */ jsx18("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
|
|
629
|
+
emptyDescription && /* @__PURE__ */ jsx18("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
|
|
455
630
|
] }),
|
|
456
631
|
pagination
|
|
457
632
|
] });
|
|
@@ -459,10 +634,10 @@ function ResponsiveDataView({
|
|
|
459
634
|
|
|
460
635
|
// src/components/toaster.tsx
|
|
461
636
|
import { Toaster as Sonner } from "sonner";
|
|
462
|
-
import { jsx as
|
|
637
|
+
import { jsx as jsx19 } from "react/jsx-runtime";
|
|
463
638
|
function Toaster(props) {
|
|
464
639
|
const { theme = "system" } = useTheme();
|
|
465
|
-
return /* @__PURE__ */
|
|
640
|
+
return /* @__PURE__ */ jsx19(
|
|
466
641
|
Sonner,
|
|
467
642
|
{
|
|
468
643
|
theme,
|
|
@@ -486,22 +661,15 @@ function Toaster(props) {
|
|
|
486
661
|
import { ChevronLeft, ChevronRight, Menu } from "lucide-react";
|
|
487
662
|
import { useState as useState2 } from "react";
|
|
488
663
|
|
|
489
|
-
// src/lib/utils.ts
|
|
490
|
-
import { clsx } from "clsx";
|
|
491
|
-
import { twMerge } from "tailwind-merge";
|
|
492
|
-
function cn(...inputs) {
|
|
493
|
-
return twMerge(clsx(inputs));
|
|
494
|
-
}
|
|
495
|
-
|
|
496
664
|
// src/components/sidebar-nav.tsx
|
|
497
|
-
import { Fragment as
|
|
665
|
+
import { Fragment as Fragment3 } from "react";
|
|
498
666
|
|
|
499
667
|
// src/components/types.tsx
|
|
500
|
-
import { jsx as
|
|
501
|
-
var defaultRenderLink = ({ children, ...props }) => /* @__PURE__ */
|
|
668
|
+
import { jsx as jsx20 } from "react/jsx-runtime";
|
|
669
|
+
var defaultRenderLink = ({ children, ...props }) => /* @__PURE__ */ jsx20("a", { ...props, children });
|
|
502
670
|
|
|
503
671
|
// src/components/sidebar-nav.tsx
|
|
504
|
-
import { Fragment as
|
|
672
|
+
import { Fragment as Fragment4, jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
505
673
|
function defaultIsActive(item, activePath) {
|
|
506
674
|
if (item.href === "/") return activePath === "/";
|
|
507
675
|
return activePath === item.href || activePath.startsWith(item.href + "/");
|
|
@@ -516,7 +684,7 @@ function SidebarNav({
|
|
|
516
684
|
onNavigate
|
|
517
685
|
}) {
|
|
518
686
|
const visible = items.filter((item) => !item.adminOnly || isAdmin);
|
|
519
|
-
return /* @__PURE__ */
|
|
687
|
+
return /* @__PURE__ */ jsx21("nav", { className: "flex flex-col gap-1", children: visible.map((item) => {
|
|
520
688
|
const active = isActive(item, activePath);
|
|
521
689
|
const link = renderLink({
|
|
522
690
|
href: item.href,
|
|
@@ -528,19 +696,19 @@ function SidebarNav({
|
|
|
528
696
|
active ? "bg-accent text-accent-foreground font-semibold" : "text-muted-foreground hover:bg-accent hover:text-accent-foreground",
|
|
529
697
|
isCollapsed && "justify-center px-2"
|
|
530
698
|
),
|
|
531
|
-
children: /* @__PURE__ */
|
|
532
|
-
item.icon && /* @__PURE__ */
|
|
533
|
-
!isCollapsed && /* @__PURE__ */
|
|
699
|
+
children: /* @__PURE__ */ jsxs17(Fragment4, { children: [
|
|
700
|
+
item.icon && /* @__PURE__ */ jsx21("span", { className: "shrink-0", children: item.icon }),
|
|
701
|
+
!isCollapsed && /* @__PURE__ */ jsx21("span", { className: "truncate", children: item.label })
|
|
534
702
|
] })
|
|
535
703
|
});
|
|
536
|
-
return /* @__PURE__ */
|
|
704
|
+
return /* @__PURE__ */ jsx21(Fragment3, { children: link }, item.href);
|
|
537
705
|
}) });
|
|
538
706
|
}
|
|
539
707
|
|
|
540
708
|
// src/components/user-menu.tsx
|
|
541
709
|
import * as DropdownMenu2 from "@radix-ui/react-dropdown-menu";
|
|
542
710
|
import { LogOut, User } from "lucide-react";
|
|
543
|
-
import { Fragment as
|
|
711
|
+
import { Fragment as Fragment5, jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
544
712
|
function initials(user) {
|
|
545
713
|
const source = user?.name?.trim() || user?.email?.trim();
|
|
546
714
|
if (!source) return "";
|
|
@@ -558,44 +726,44 @@ function UserMenu({
|
|
|
558
726
|
align = "end"
|
|
559
727
|
}) {
|
|
560
728
|
const label = initials(user);
|
|
561
|
-
return /* @__PURE__ */
|
|
562
|
-
/* @__PURE__ */
|
|
729
|
+
return /* @__PURE__ */ jsxs18(DropdownMenu2.Root, { children: [
|
|
730
|
+
/* @__PURE__ */ jsx22(DropdownMenu2.Trigger, { asChild: true, children: /* @__PURE__ */ jsx22(
|
|
563
731
|
"button",
|
|
564
732
|
{
|
|
565
733
|
type: "button",
|
|
566
734
|
className: "inline-flex h-9 w-9 items-center justify-center overflow-hidden rounded-full border border-input bg-background text-xs font-semibold shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
567
735
|
"aria-label": "Menu do usu\xE1rio",
|
|
568
736
|
"data-testid": "user-menu",
|
|
569
|
-
children: user?.avatarUrl ? /* @__PURE__ */
|
|
737
|
+
children: user?.avatarUrl ? /* @__PURE__ */ jsx22("img", { src: user.avatarUrl, alt: user.name ?? user.email ?? "Avatar", className: "h-full w-full object-cover" }) : label ? /* @__PURE__ */ jsx22("span", { children: label }) : /* @__PURE__ */ jsx22(User, { className: "h-4 w-4" })
|
|
570
738
|
}
|
|
571
739
|
) }),
|
|
572
|
-
/* @__PURE__ */
|
|
740
|
+
/* @__PURE__ */ jsx22(DropdownMenu2.Portal, { children: /* @__PURE__ */ jsxs18(
|
|
573
741
|
DropdownMenu2.Content,
|
|
574
742
|
{
|
|
575
743
|
align,
|
|
576
744
|
sideOffset: 6,
|
|
577
745
|
className: "z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95",
|
|
578
746
|
children: [
|
|
579
|
-
(user?.name || user?.email) && /* @__PURE__ */
|
|
580
|
-
/* @__PURE__ */
|
|
581
|
-
user.name && /* @__PURE__ */
|
|
582
|
-
user.email && /* @__PURE__ */
|
|
747
|
+
(user?.name || user?.email) && /* @__PURE__ */ jsxs18(Fragment5, { children: [
|
|
748
|
+
/* @__PURE__ */ jsxs18("div", { className: "px-2 py-1.5", children: [
|
|
749
|
+
user.name && /* @__PURE__ */ jsx22("p", { className: "truncate text-sm font-medium", children: user.name }),
|
|
750
|
+
user.email && /* @__PURE__ */ jsx22("p", { className: "truncate text-xs text-muted-foreground", children: user.email })
|
|
583
751
|
] }),
|
|
584
|
-
/* @__PURE__ */
|
|
752
|
+
/* @__PURE__ */ jsx22(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" })
|
|
585
753
|
] }),
|
|
586
754
|
items.map(
|
|
587
|
-
(item) => item.href ? /* @__PURE__ */
|
|
755
|
+
(item) => item.href ? /* @__PURE__ */ jsx22(DropdownMenu2.Item, { asChild: true, children: renderLink({ href: item.href, className: itemClass, children: /* @__PURE__ */ jsxs18(Fragment5, { children: [
|
|
588
756
|
item.icon,
|
|
589
757
|
item.label
|
|
590
|
-
] }) }) }, item.label) : /* @__PURE__ */
|
|
758
|
+
] }) }) }, item.label) : /* @__PURE__ */ jsxs18(DropdownMenu2.Item, { className: itemClass, onClick: item.onClick, children: [
|
|
591
759
|
item.icon,
|
|
592
760
|
item.label
|
|
593
761
|
] }, item.label)
|
|
594
762
|
),
|
|
595
|
-
onLogout && /* @__PURE__ */
|
|
596
|
-
items.length > 0 && /* @__PURE__ */
|
|
597
|
-
/* @__PURE__ */
|
|
598
|
-
/* @__PURE__ */
|
|
763
|
+
onLogout && /* @__PURE__ */ jsxs18(Fragment5, { children: [
|
|
764
|
+
items.length > 0 && /* @__PURE__ */ jsx22(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" }),
|
|
765
|
+
/* @__PURE__ */ jsxs18(DropdownMenu2.Item, { className: cn(itemClass, "text-destructive focus:bg-destructive/10"), onClick: onLogout, children: [
|
|
766
|
+
/* @__PURE__ */ jsx22(LogOut, { className: "h-4 w-4" }),
|
|
599
767
|
logoutLabel
|
|
600
768
|
] })
|
|
601
769
|
] })
|
|
@@ -606,7 +774,7 @@ function UserMenu({
|
|
|
606
774
|
}
|
|
607
775
|
|
|
608
776
|
// src/components/app-shell.tsx
|
|
609
|
-
import { jsx as
|
|
777
|
+
import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
610
778
|
function AppShell({
|
|
611
779
|
brand,
|
|
612
780
|
brandCollapsed,
|
|
@@ -625,7 +793,7 @@ function AppShell({
|
|
|
625
793
|
}) {
|
|
626
794
|
const [collapsed, setCollapsed] = useState2(defaultCollapsed);
|
|
627
795
|
const [mobileOpen, setMobileOpen] = useState2(false);
|
|
628
|
-
const nav = (isCollapsed, onNavigate) => /* @__PURE__ */
|
|
796
|
+
const nav = (isCollapsed, onNavigate) => /* @__PURE__ */ jsx23(
|
|
629
797
|
SidebarNav,
|
|
630
798
|
{
|
|
631
799
|
items: navItems,
|
|
@@ -637,8 +805,8 @@ function AppShell({
|
|
|
637
805
|
onNavigate
|
|
638
806
|
}
|
|
639
807
|
);
|
|
640
|
-
return /* @__PURE__ */
|
|
641
|
-
/* @__PURE__ */
|
|
808
|
+
return /* @__PURE__ */ jsxs19("div", { className: "flex h-screen overflow-hidden bg-background", children: [
|
|
809
|
+
/* @__PURE__ */ jsxs19(
|
|
642
810
|
"aside",
|
|
643
811
|
{
|
|
644
812
|
className: cn(
|
|
@@ -646,22 +814,22 @@ function AppShell({
|
|
|
646
814
|
collapsed ? "w-16" : "w-60"
|
|
647
815
|
),
|
|
648
816
|
children: [
|
|
649
|
-
/* @__PURE__ */
|
|
650
|
-
/* @__PURE__ */
|
|
651
|
-
collapsible && /* @__PURE__ */
|
|
817
|
+
/* @__PURE__ */ jsx23("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: collapsed ? brandCollapsed ?? brand : brand }),
|
|
818
|
+
/* @__PURE__ */ jsx23("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(collapsed) }),
|
|
819
|
+
collapsible && /* @__PURE__ */ jsx23("div", { className: "border-t p-2", children: /* @__PURE__ */ jsx23(
|
|
652
820
|
"button",
|
|
653
821
|
{
|
|
654
822
|
type: "button",
|
|
655
823
|
onClick: () => setCollapsed((v) => !v),
|
|
656
824
|
className: "flex w-full items-center justify-center rounded-md px-2 py-2 text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
657
825
|
"aria-label": collapsed ? "Expandir menu" : "Recolher menu",
|
|
658
|
-
children: collapsed ? /* @__PURE__ */
|
|
826
|
+
children: collapsed ? /* @__PURE__ */ jsx23(ChevronRight, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx23(ChevronLeft, { className: "h-4 w-4" })
|
|
659
827
|
}
|
|
660
828
|
) })
|
|
661
829
|
]
|
|
662
830
|
}
|
|
663
831
|
),
|
|
664
|
-
/* @__PURE__ */
|
|
832
|
+
/* @__PURE__ */ jsxs19(
|
|
665
833
|
"div",
|
|
666
834
|
{
|
|
667
835
|
className: cn(
|
|
@@ -670,8 +838,8 @@ function AppShell({
|
|
|
670
838
|
),
|
|
671
839
|
onClick: () => setMobileOpen(false),
|
|
672
840
|
children: [
|
|
673
|
-
/* @__PURE__ */
|
|
674
|
-
/* @__PURE__ */
|
|
841
|
+
/* @__PURE__ */ jsx23("div", { className: "absolute inset-0 bg-black/50" }),
|
|
842
|
+
/* @__PURE__ */ jsxs19(
|
|
675
843
|
"div",
|
|
676
844
|
{
|
|
677
845
|
className: cn(
|
|
@@ -680,32 +848,32 @@ function AppShell({
|
|
|
680
848
|
),
|
|
681
849
|
onClick: (e) => e.stopPropagation(),
|
|
682
850
|
children: [
|
|
683
|
-
/* @__PURE__ */
|
|
684
|
-
/* @__PURE__ */
|
|
851
|
+
/* @__PURE__ */ jsx23("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: brand }),
|
|
852
|
+
/* @__PURE__ */ jsx23("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(false, () => setMobileOpen(false)) })
|
|
685
853
|
]
|
|
686
854
|
}
|
|
687
855
|
)
|
|
688
856
|
]
|
|
689
857
|
}
|
|
690
858
|
),
|
|
691
|
-
/* @__PURE__ */
|
|
692
|
-
/* @__PURE__ */
|
|
693
|
-
/* @__PURE__ */
|
|
859
|
+
/* @__PURE__ */ jsxs19("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
|
|
860
|
+
/* @__PURE__ */ jsxs19("header", { className: "flex h-14 shrink-0 items-center gap-2 border-b bg-background px-4", children: [
|
|
861
|
+
/* @__PURE__ */ jsx23(
|
|
694
862
|
"button",
|
|
695
863
|
{
|
|
696
864
|
type: "button",
|
|
697
865
|
onClick: () => setMobileOpen(true),
|
|
698
866
|
className: "inline-flex h-9 w-9 items-center justify-center rounded-md border border-input bg-background shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground md:hidden",
|
|
699
867
|
"aria-label": "Abrir menu",
|
|
700
|
-
children: /* @__PURE__ */
|
|
868
|
+
children: /* @__PURE__ */ jsx23(Menu, { className: "h-4 w-4" })
|
|
701
869
|
}
|
|
702
870
|
),
|
|
703
|
-
/* @__PURE__ */
|
|
871
|
+
/* @__PURE__ */ jsxs19("div", { className: "ml-auto flex items-center gap-2", children: [
|
|
704
872
|
headerActions,
|
|
705
|
-
(user || onLogout) && /* @__PURE__ */
|
|
873
|
+
(user || onLogout) && /* @__PURE__ */ jsx23(UserMenu, { user, items: userMenuItems, onLogout, renderLink })
|
|
706
874
|
] })
|
|
707
875
|
] }),
|
|
708
|
-
/* @__PURE__ */
|
|
876
|
+
/* @__PURE__ */ jsx23("main", { className: "flex-1 overflow-y-auto", children })
|
|
709
877
|
] })
|
|
710
878
|
] });
|
|
711
879
|
}
|
|
@@ -713,7 +881,7 @@ function AppShell({
|
|
|
713
881
|
// src/components/row-actions-menu.tsx
|
|
714
882
|
import * as DropdownMenu3 from "@radix-ui/react-dropdown-menu";
|
|
715
883
|
import { MoreVertical } from "lucide-react";
|
|
716
|
-
import { Fragment as
|
|
884
|
+
import { Fragment as Fragment6, jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
717
885
|
var itemClass2 = "flex w-full cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent focus:bg-accent data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
|
|
718
886
|
function RowActionsMenu({
|
|
719
887
|
actions,
|
|
@@ -723,18 +891,18 @@ function RowActionsMenu({
|
|
|
723
891
|
renderLink = defaultRenderLink
|
|
724
892
|
}) {
|
|
725
893
|
if (actions.length === 0) return null;
|
|
726
|
-
return /* @__PURE__ */
|
|
727
|
-
/* @__PURE__ */
|
|
894
|
+
return /* @__PURE__ */ jsxs20(DropdownMenu3.Root, { children: [
|
|
895
|
+
/* @__PURE__ */ jsx24(DropdownMenu3.Trigger, { asChild: true, children: /* @__PURE__ */ jsx24(
|
|
728
896
|
"button",
|
|
729
897
|
{
|
|
730
898
|
type: "button",
|
|
731
899
|
disabled,
|
|
732
900
|
"aria-label": label,
|
|
733
901
|
className: "inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
|
|
734
|
-
children: /* @__PURE__ */
|
|
902
|
+
children: /* @__PURE__ */ jsx24(MoreVertical, { className: "h-4 w-4" })
|
|
735
903
|
}
|
|
736
904
|
) }),
|
|
737
|
-
/* @__PURE__ */
|
|
905
|
+
/* @__PURE__ */ jsx24(DropdownMenu3.Portal, { children: /* @__PURE__ */ jsx24(
|
|
738
906
|
DropdownMenu3.Content,
|
|
739
907
|
{
|
|
740
908
|
align,
|
|
@@ -742,14 +910,14 @@ function RowActionsMenu({
|
|
|
742
910
|
className: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95",
|
|
743
911
|
children: actions.map((action) => {
|
|
744
912
|
const cls = cn(itemClass2, action.destructive && "text-destructive focus:bg-destructive/10");
|
|
745
|
-
return action.href ? /* @__PURE__ */
|
|
913
|
+
return action.href ? /* @__PURE__ */ jsx24(DropdownMenu3.Item, { asChild: true, disabled: action.disabled, children: renderLink({
|
|
746
914
|
href: action.href,
|
|
747
915
|
className: cls,
|
|
748
|
-
children: /* @__PURE__ */
|
|
916
|
+
children: /* @__PURE__ */ jsxs20(Fragment6, { children: [
|
|
749
917
|
action.icon,
|
|
750
918
|
action.label
|
|
751
919
|
] })
|
|
752
|
-
}) }, action.label) : /* @__PURE__ */
|
|
920
|
+
}) }, action.label) : /* @__PURE__ */ jsxs20(
|
|
753
921
|
DropdownMenu3.Item,
|
|
754
922
|
{
|
|
755
923
|
className: cls,
|
|
@@ -818,17 +986,20 @@ export {
|
|
|
818
986
|
ConfirmDialog,
|
|
819
987
|
DataTableWrapper,
|
|
820
988
|
EmptyState,
|
|
989
|
+
FormDialog,
|
|
821
990
|
FormDialogLayout,
|
|
822
991
|
FormField,
|
|
823
992
|
MobileCardList,
|
|
824
993
|
ModeToggle,
|
|
825
994
|
PageHeader,
|
|
826
995
|
Pagination,
|
|
996
|
+
ProgressBar,
|
|
827
997
|
ResponsiveDataView,
|
|
828
998
|
RowActionsMenu,
|
|
829
999
|
SearchInput,
|
|
830
1000
|
SidebarNav,
|
|
831
1001
|
StatCard,
|
|
1002
|
+
StatusBadge,
|
|
832
1003
|
StatusDot,
|
|
833
1004
|
TableSkeleton,
|
|
834
1005
|
ThemeProvider,
|