@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.
Files changed (56) hide show
  1. package/dist/components/app-shell.d.ts +1 -1
  2. package/dist/components/app-shell.d.ts.map +1 -1
  3. package/dist/components/auth-card.d.ts +1 -1
  4. package/dist/components/auth-card.d.ts.map +1 -1
  5. package/dist/components/confirm-dialog.d.ts +1 -1
  6. package/dist/components/confirm-dialog.d.ts.map +1 -1
  7. package/dist/components/data-table-wrapper.d.ts +1 -1
  8. package/dist/components/data-table-wrapper.d.ts.map +1 -1
  9. package/dist/components/empty-state.d.ts +1 -1
  10. package/dist/components/empty-state.d.ts.map +1 -1
  11. package/dist/components/form-dialog.d.ts +33 -1
  12. package/dist/components/form-dialog.d.ts.map +1 -1
  13. package/dist/components/form-field.d.ts +1 -1
  14. package/dist/components/form-field.d.ts.map +1 -1
  15. package/dist/components/mobile-card-list.d.ts +1 -1
  16. package/dist/components/mobile-card-list.d.ts.map +1 -1
  17. package/dist/components/mode-toggle.d.ts +1 -1
  18. package/dist/components/mode-toggle.d.ts.map +1 -1
  19. package/dist/components/page-header.d.ts +1 -1
  20. package/dist/components/page-header.d.ts.map +1 -1
  21. package/dist/components/pagination.d.ts +1 -1
  22. package/dist/components/pagination.d.ts.map +1 -1
  23. package/dist/components/progress-bar.d.ts +12 -0
  24. package/dist/components/progress-bar.d.ts.map +1 -0
  25. package/dist/components/responsive-data-view.d.ts +1 -1
  26. package/dist/components/responsive-data-view.d.ts.map +1 -1
  27. package/dist/components/row-actions-menu.d.ts +1 -1
  28. package/dist/components/row-actions-menu.d.ts.map +1 -1
  29. package/dist/components/sidebar-nav.d.ts +1 -1
  30. package/dist/components/sidebar-nav.d.ts.map +1 -1
  31. package/dist/components/stat-card.d.ts +1 -1
  32. package/dist/components/stat-card.d.ts.map +1 -1
  33. package/dist/components/status-badge.d.ts +11 -0
  34. package/dist/components/status-badge.d.ts.map +1 -0
  35. package/dist/components/status-dot.d.ts +1 -1
  36. package/dist/components/status-dot.d.ts.map +1 -1
  37. package/dist/components/table-skeleton.d.ts +1 -1
  38. package/dist/components/table-skeleton.d.ts.map +1 -1
  39. package/dist/components/theme-provider.d.ts +1 -1
  40. package/dist/components/theme-provider.d.ts.map +1 -1
  41. package/dist/components/toaster.d.ts +1 -1
  42. package/dist/components/toaster.d.ts.map +1 -1
  43. package/dist/components/user-menu.d.ts +1 -1
  44. package/dist/components/user-menu.d.ts.map +1 -1
  45. package/dist/index.cjs +321 -147
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.d.ts +5 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +316 -145
  50. package/dist/index.js.map +1 -1
  51. package/package.json +2 -1
  52. package/src/components/form-dialog.tsx +121 -0
  53. package/src/components/page-header.tsx +8 -4
  54. package/src/components/progress-bar.tsx +49 -0
  55. package/src/components/status-badge.tsx +63 -0
  56. 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("div", { className: `flex items-center justify-between ${className ?? ""}`, children: [
161
- /* @__PURE__ */ jsxs4("div", { children: [
162
- /* @__PURE__ */ jsx5("h1", { className: "text-2xl font-semibold tracking-tight", children: title }),
163
- description && /* @__PURE__ */ jsx5("p", { className: "text-sm text-muted-foreground", children: description })
164
- ] }),
165
- action && /* @__PURE__ */ jsx5("div", { children: action })
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/form-field.tsx
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__ */ jsxs6("div", { className: `space-y-2 ${className ?? ""}`, children: [
187
- /* @__PURE__ */ jsxs6(
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__ */ jsx7("span", { className: "ml-1 text-destructive", children: "*" })
284
+ required && /* @__PURE__ */ jsx9("span", { className: "ml-1 text-destructive", children: "*" })
195
285
  ]
196
286
  }
197
287
  ),
198
288
  children,
199
- error && /* @__PURE__ */ jsx7("p", { className: "text-sm text-destructive", children: error })
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 { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
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__ */ jsxs7("form", { onSubmit, children: [
216
- /* @__PURE__ */ jsx8("div", { className: "flex flex-col space-y-1.5 text-center sm:text-left", children: /* @__PURE__ */ jsx8("h2", { className: "text-lg font-semibold leading-none tracking-tight", children: title }) }),
217
- /* @__PURE__ */ jsx8("div", { className: "space-y-4 py-4", children }),
218
- /* @__PURE__ */ jsxs7("div", { className: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", children: [
219
- /* @__PURE__ */ jsx8(
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__ */ jsx8(
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 jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
417
+ import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
243
418
  function AuthCard({ title, description, children, footer }) {
244
- return /* @__PURE__ */ jsx9("div", { className: "flex min-h-screen items-center justify-center px-4", children: /* @__PURE__ */ jsxs8("div", { className: "w-full max-w-sm rounded-lg border bg-card p-6 shadow-sm", children: [
245
- /* @__PURE__ */ jsxs8("div", { className: "mb-6 text-center", children: [
246
- /* @__PURE__ */ jsx9("h1", { className: "text-2xl font-semibold tracking-tight", children: title }),
247
- description && /* @__PURE__ */ jsx9("p", { className: "mt-1 text-sm text-muted-foreground", children: description })
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__ */ jsx9("div", { className: "space-y-4", children }),
250
- footer && /* @__PURE__ */ jsx9("div", { className: "mt-4", children: footer })
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 jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
430
+ import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
256
431
  function Pagination({ page, onPageChange, hasNextPage, hasPreviousPage, className }) {
257
- return /* @__PURE__ */ jsxs9("div", { className: `flex items-center justify-end gap-4 ${className ?? ""}`, children: [
258
- /* @__PURE__ */ jsx10(
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__ */ jsxs9("span", { className: "text-sm text-muted-foreground", children: [
443
+ /* @__PURE__ */ jsxs11("span", { className: "text-sm text-muted-foreground", children: [
269
444
  "P\xE1gina ",
270
445
  page
271
446
  ] }),
272
- /* @__PURE__ */ jsx10(
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 jsx11 } from "react/jsx-runtime";
461
+ import { Fragment as Fragment2, jsx as jsx13 } from "react/jsx-runtime";
287
462
  function TableSkeleton({ rows = 5, columns = 4 }) {
288
- return /* @__PURE__ */ jsx11(Fragment, { children: Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ jsx11("tr", { className: "border-b transition-colors", children: Array.from({ length: columns }).map((_2, j) => /* @__PURE__ */ jsx11("td", { className: "p-4 align-middle", children: /* @__PURE__ */ jsx11("div", { className: "h-5 w-full animate-pulse rounded bg-muted" }) }, j)) }, i)) });
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 React from "react";
293
- import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
294
- var SearchInput = React.forwardRef(
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__ */ jsxs10("div", { className: `relative flex-1 ${containerClassName ?? ""}`, children: [
297
- /* @__PURE__ */ jsxs10(
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__ */ jsx12("circle", { cx: "11", cy: "11", r: "8" }),
312
- /* @__PURE__ */ jsx12("path", { d: "m21 21-4.3-4.3" })
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__ */ jsx12(
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 jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
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__ */ jsxs11("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
335
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center justify-between pb-2", children: [
336
- /* @__PURE__ */ jsx13("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
337
- /* @__PURE__ */ jsx13("div", { className: "h-4 w-4 animate-pulse rounded bg-muted" })
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__ */ jsx13("div", { className: "mt-2 h-7 w-16 animate-pulse rounded bg-muted" }),
340
- /* @__PURE__ */ jsx13("div", { className: "mt-1 h-4 w-20 animate-pulse rounded bg-muted" })
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__ */ jsxs11("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
344
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center justify-between pb-2", children: [
345
- /* @__PURE__ */ jsx13("span", { className: "text-sm font-medium text-muted-foreground", children: label }),
346
- icon && /* @__PURE__ */ jsx13("span", { className: "text-muted-foreground", children: icon })
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__ */ jsx13("div", { className: "text-2xl font-bold", children: value }),
349
- detail && /* @__PURE__ */ jsx13("p", { className: "text-xs text-muted-foreground", children: detail })
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 jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
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__ */ jsxs12("div", { className: "space-y-4", children: [
368
- /* @__PURE__ */ jsx14("div", { className: "overflow-x-auto rounded-md border", children }),
369
- !isLoading && isEmpty && /* @__PURE__ */ jsxs12("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
370
- emptyIcon && /* @__PURE__ */ jsx14("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
371
- /* @__PURE__ */ jsx14("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
372
- emptyDescription && /* @__PURE__ */ jsx14("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
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__ */ jsxs12("div", { className: "flex items-center justify-end gap-4", children: [
375
- /* @__PURE__ */ jsx14(
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__ */ jsxs12("span", { className: "text-sm text-muted-foreground", children: [
560
+ /* @__PURE__ */ jsxs14("span", { className: "text-sm text-muted-foreground", children: [
386
561
  "P\xE1gina ",
387
562
  page
388
563
  ] }),
389
- /* @__PURE__ */ jsx14(
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 jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
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__ */ jsx15("div", { className: `space-y-3 ${className ?? ""}`, children: Array.from({ length: loadingCount }).map((_, i) => /* @__PURE__ */ jsx15("div", { className: "rounded-xl border p-4", children: /* @__PURE__ */ jsxs13("div", { className: "space-y-3", children: [
415
- /* @__PURE__ */ jsxs13("div", { className: "flex justify-between", children: [
416
- /* @__PURE__ */ jsx15("div", { className: "h-5 w-32 animate-pulse rounded bg-muted" }),
417
- /* @__PURE__ */ jsx15("div", { className: "h-5 w-16 animate-pulse rounded bg-muted" })
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__ */ jsx15("div", { className: "h-4 w-48 animate-pulse rounded bg-muted" }),
420
- /* @__PURE__ */ jsxs13("div", { className: "flex justify-between", children: [
421
- /* @__PURE__ */ jsx15("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
422
- /* @__PURE__ */ jsx15("div", { className: "h-4 w-20 animate-pulse rounded bg-muted" })
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__ */ jsx15("div", { className: `space-y-3 ${className ?? ""}`, children: data.map((item, index) => /* @__PURE__ */ jsx15(
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 jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
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__ */ jsxs14("div", { className: "space-y-4", children: [
449
- /* @__PURE__ */ jsx16("div", { className: "hidden overflow-x-auto rounded-md border md:block", children: table }),
450
- /* @__PURE__ */ jsx16("div", { className: "md:hidden", children: cards }),
451
- !isLoading && isEmpty && /* @__PURE__ */ jsxs14("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
452
- emptyIcon && /* @__PURE__ */ jsx16("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
453
- /* @__PURE__ */ jsx16("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
454
- emptyDescription && /* @__PURE__ */ jsx16("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
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 jsx17 } from "react/jsx-runtime";
637
+ import { jsx as jsx19 } from "react/jsx-runtime";
463
638
  function Toaster(props) {
464
639
  const { theme = "system" } = useTheme();
465
- return /* @__PURE__ */ jsx17(
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 Fragment2 } from "react";
665
+ import { Fragment as Fragment3 } from "react";
498
666
 
499
667
  // src/components/types.tsx
500
- import { jsx as jsx18 } from "react/jsx-runtime";
501
- var defaultRenderLink = ({ children, ...props }) => /* @__PURE__ */ jsx18("a", { ...props, children });
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 Fragment3, jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
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__ */ jsx19("nav", { className: "flex flex-col gap-1", children: visible.map((item) => {
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__ */ jsxs15(Fragment3, { children: [
532
- item.icon && /* @__PURE__ */ jsx19("span", { className: "shrink-0", children: item.icon }),
533
- !isCollapsed && /* @__PURE__ */ jsx19("span", { className: "truncate", children: item.label })
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__ */ jsx19(Fragment2, { children: link }, item.href);
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 Fragment4, jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
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__ */ jsxs16(DropdownMenu2.Root, { children: [
562
- /* @__PURE__ */ jsx20(DropdownMenu2.Trigger, { asChild: true, children: /* @__PURE__ */ jsx20(
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__ */ jsx20("img", { src: user.avatarUrl, alt: user.name ?? user.email ?? "Avatar", className: "h-full w-full object-cover" }) : label ? /* @__PURE__ */ jsx20("span", { children: label }) : /* @__PURE__ */ jsx20(User, { className: "h-4 w-4" })
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__ */ jsx20(DropdownMenu2.Portal, { children: /* @__PURE__ */ jsxs16(
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__ */ jsxs16(Fragment4, { children: [
580
- /* @__PURE__ */ jsxs16("div", { className: "px-2 py-1.5", children: [
581
- user.name && /* @__PURE__ */ jsx20("p", { className: "truncate text-sm font-medium", children: user.name }),
582
- user.email && /* @__PURE__ */ jsx20("p", { className: "truncate text-xs text-muted-foreground", children: user.email })
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__ */ jsx20(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" })
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__ */ jsx20(DropdownMenu2.Item, { asChild: true, children: renderLink({ href: item.href, className: itemClass, children: /* @__PURE__ */ jsxs16(Fragment4, { children: [
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__ */ jsxs16(DropdownMenu2.Item, { className: itemClass, onClick: item.onClick, children: [
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__ */ jsxs16(Fragment4, { children: [
596
- items.length > 0 && /* @__PURE__ */ jsx20(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" }),
597
- /* @__PURE__ */ jsxs16(DropdownMenu2.Item, { className: cn(itemClass, "text-destructive focus:bg-destructive/10"), onClick: onLogout, children: [
598
- /* @__PURE__ */ jsx20(LogOut, { className: "h-4 w-4" }),
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 jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
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__ */ jsx21(
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__ */ jsxs17("div", { className: "flex h-screen overflow-hidden bg-background", children: [
641
- /* @__PURE__ */ jsxs17(
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__ */ jsx21("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: collapsed ? brandCollapsed ?? brand : brand }),
650
- /* @__PURE__ */ jsx21("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(collapsed) }),
651
- collapsible && /* @__PURE__ */ jsx21("div", { className: "border-t p-2", children: /* @__PURE__ */ jsx21(
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__ */ jsx21(ChevronRight, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx21(ChevronLeft, { className: "h-4 w-4" })
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__ */ jsxs17(
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__ */ jsx21("div", { className: "absolute inset-0 bg-black/50" }),
674
- /* @__PURE__ */ jsxs17(
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__ */ jsx21("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: brand }),
684
- /* @__PURE__ */ jsx21("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(false, () => setMobileOpen(false)) })
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__ */ jsxs17("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
692
- /* @__PURE__ */ jsxs17("header", { className: "flex h-14 shrink-0 items-center gap-2 border-b bg-background px-4", children: [
693
- /* @__PURE__ */ jsx21(
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__ */ jsx21(Menu, { className: "h-4 w-4" })
868
+ children: /* @__PURE__ */ jsx23(Menu, { className: "h-4 w-4" })
701
869
  }
702
870
  ),
703
- /* @__PURE__ */ jsxs17("div", { className: "ml-auto flex items-center gap-2", children: [
871
+ /* @__PURE__ */ jsxs19("div", { className: "ml-auto flex items-center gap-2", children: [
704
872
  headerActions,
705
- (user || onLogout) && /* @__PURE__ */ jsx21(UserMenu, { user, items: userMenuItems, onLogout, renderLink })
873
+ (user || onLogout) && /* @__PURE__ */ jsx23(UserMenu, { user, items: userMenuItems, onLogout, renderLink })
706
874
  ] })
707
875
  ] }),
708
- /* @__PURE__ */ jsx21("main", { className: "flex-1 overflow-y-auto", children })
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 Fragment5, jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
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__ */ jsxs18(DropdownMenu3.Root, { children: [
727
- /* @__PURE__ */ jsx22(DropdownMenu3.Trigger, { asChild: true, children: /* @__PURE__ */ jsx22(
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__ */ jsx22(MoreVertical, { className: "h-4 w-4" })
902
+ children: /* @__PURE__ */ jsx24(MoreVertical, { className: "h-4 w-4" })
735
903
  }
736
904
  ) }),
737
- /* @__PURE__ */ jsx22(DropdownMenu3.Portal, { children: /* @__PURE__ */ jsx22(
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__ */ jsx22(DropdownMenu3.Item, { asChild: true, disabled: action.disabled, children: renderLink({
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__ */ jsxs18(Fragment5, { children: [
916
+ children: /* @__PURE__ */ jsxs20(Fragment6, { children: [
749
917
  action.icon,
750
918
  action.label
751
919
  ] })
752
- }) }, action.label) : /* @__PURE__ */ jsxs18(
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,