@motor-hero/ui-kit 0.25.0 → 0.26.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/base-dialog.d.ts +38 -0
- package/dist/components/base-dialog.d.ts.map +1 -0
- package/dist/components/form-dialog.d.ts +8 -26
- package/dist/components/form-dialog.d.ts.map +1 -1
- package/dist/index.cjs +277 -270
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +276 -270
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/base-dialog.tsx +116 -0
- package/src/components/color-picker.tsx +4 -4
- package/src/components/form-dialog.tsx +20 -108
- package/src/index.ts +3 -1
package/dist/index.cjs
CHANGED
|
@@ -32,6 +32,7 @@ var index_exports = {};
|
|
|
32
32
|
__export(index_exports, {
|
|
33
33
|
AppShell: () => AppShell,
|
|
34
34
|
AuthCard: () => AuthCard,
|
|
35
|
+
BaseDialog: () => BaseDialog,
|
|
35
36
|
ColorPicker: () => ColorPicker,
|
|
36
37
|
Combobox: () => Combobox,
|
|
37
38
|
ConfirmDialog: () => ConfirmDialog,
|
|
@@ -443,7 +444,7 @@ function FormField({ label, htmlFor, error, required, children, className }) {
|
|
|
443
444
|
] });
|
|
444
445
|
}
|
|
445
446
|
|
|
446
|
-
// src/components/
|
|
447
|
+
// src/components/base-dialog.tsx
|
|
447
448
|
var Dialog = __toESM(require("@radix-ui/react-dialog"), 1);
|
|
448
449
|
var import_lucide_react2 = require("lucide-react");
|
|
449
450
|
var React = __toESM(require("react"), 1);
|
|
@@ -455,43 +456,8 @@ function cn(...inputs) {
|
|
|
455
456
|
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
456
457
|
}
|
|
457
458
|
|
|
458
|
-
// src/components/
|
|
459
|
+
// src/components/base-dialog.tsx
|
|
459
460
|
var import_jsx_runtime10 = require("react/jsx-runtime");
|
|
460
|
-
function FormDialogLayout({
|
|
461
|
-
title,
|
|
462
|
-
children,
|
|
463
|
-
onSubmit,
|
|
464
|
-
submitLabel = "Salvar",
|
|
465
|
-
cancelLabel = "Cancelar",
|
|
466
|
-
onCancel,
|
|
467
|
-
isSubmitting = false,
|
|
468
|
-
isDisabled = false
|
|
469
|
-
}) {
|
|
470
|
-
return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("form", { onSubmit, children: [
|
|
471
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex flex-col space-y-1.5 text-center sm:text-left", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h2", { className: "text-lg font-semibold leading-none tracking-tight", children: title }) }),
|
|
472
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "space-y-4 py-4", children }),
|
|
473
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", children: [
|
|
474
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
475
|
-
"button",
|
|
476
|
-
{
|
|
477
|
-
type: "button",
|
|
478
|
-
onClick: onCancel,
|
|
479
|
-
className: "inline-flex h-9 items-center justify-center rounded-md border border-input bg-background px-4 text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50",
|
|
480
|
-
children: cancelLabel
|
|
481
|
-
}
|
|
482
|
-
),
|
|
483
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
484
|
-
"button",
|
|
485
|
-
{
|
|
486
|
-
type: "submit",
|
|
487
|
-
disabled: isSubmitting || isDisabled,
|
|
488
|
-
className: "inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow transition-colors hover:bg-primary/90 cursor-pointer disabled:pointer-events-none disabled:opacity-50",
|
|
489
|
-
children: isSubmitting ? "Salvando..." : submitLabel
|
|
490
|
-
}
|
|
491
|
-
)
|
|
492
|
-
] })
|
|
493
|
-
] });
|
|
494
|
-
}
|
|
495
461
|
var sizeClasses2 = {
|
|
496
462
|
sm: "sm:max-w-sm",
|
|
497
463
|
md: "sm:max-w-md",
|
|
@@ -499,16 +465,16 @@ var sizeClasses2 = {
|
|
|
499
465
|
xl: "sm:max-w-xl",
|
|
500
466
|
"2xl": "sm:max-w-2xl"
|
|
501
467
|
};
|
|
502
|
-
function
|
|
468
|
+
function BaseDialog({
|
|
503
469
|
open,
|
|
504
470
|
onOpenChange,
|
|
505
471
|
title,
|
|
506
472
|
description,
|
|
507
473
|
children,
|
|
508
474
|
footer,
|
|
509
|
-
onSubmit,
|
|
510
475
|
size = "lg",
|
|
511
|
-
className
|
|
476
|
+
className,
|
|
477
|
+
contentWrapper = (content) => content
|
|
512
478
|
}) {
|
|
513
479
|
React.useEffect(() => {
|
|
514
480
|
if (open) return;
|
|
@@ -553,37 +519,77 @@ function FormDialog({
|
|
|
553
519
|
sizeClasses2[size],
|
|
554
520
|
className
|
|
555
521
|
),
|
|
556
|
-
children:
|
|
557
|
-
"form",
|
|
558
|
-
{
|
|
559
|
-
onSubmit,
|
|
560
|
-
className: "flex min-h-0 flex-1 flex-col",
|
|
561
|
-
children: body
|
|
562
|
-
}
|
|
563
|
-
) : body
|
|
522
|
+
children: contentWrapper(body)
|
|
564
523
|
}
|
|
565
524
|
)
|
|
566
525
|
] }) });
|
|
567
526
|
}
|
|
568
527
|
|
|
569
|
-
// src/components/
|
|
528
|
+
// src/components/form-dialog.tsx
|
|
570
529
|
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
530
|
+
function FormDialogLayout({
|
|
531
|
+
title,
|
|
532
|
+
children,
|
|
533
|
+
onSubmit,
|
|
534
|
+
submitLabel = "Salvar",
|
|
535
|
+
cancelLabel = "Cancelar",
|
|
536
|
+
onCancel,
|
|
537
|
+
isSubmitting = false,
|
|
538
|
+
isDisabled = false
|
|
539
|
+
}) {
|
|
540
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("form", { onSubmit, children: [
|
|
541
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "flex flex-col space-y-1.5 text-center sm:text-left", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("h2", { className: "text-lg font-semibold leading-none tracking-tight", children: title }) }),
|
|
542
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "space-y-4 py-4", children }),
|
|
543
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", children: [
|
|
544
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
545
|
+
"button",
|
|
546
|
+
{
|
|
547
|
+
type: "button",
|
|
548
|
+
onClick: onCancel,
|
|
549
|
+
className: "inline-flex h-9 items-center justify-center rounded-md border border-input bg-background px-4 text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50",
|
|
550
|
+
children: cancelLabel
|
|
551
|
+
}
|
|
552
|
+
),
|
|
553
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
554
|
+
"button",
|
|
555
|
+
{
|
|
556
|
+
type: "submit",
|
|
557
|
+
disabled: isSubmitting || isDisabled,
|
|
558
|
+
className: "inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow transition-colors hover:bg-primary/90 cursor-pointer disabled:pointer-events-none disabled:opacity-50",
|
|
559
|
+
children: isSubmitting ? "Salvando..." : submitLabel
|
|
560
|
+
}
|
|
561
|
+
)
|
|
562
|
+
] })
|
|
563
|
+
] });
|
|
564
|
+
}
|
|
565
|
+
function FormDialog({ onSubmit, ...rest }) {
|
|
566
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
567
|
+
BaseDialog,
|
|
568
|
+
{
|
|
569
|
+
...rest,
|
|
570
|
+
contentWrapper: onSubmit ? (content) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("form", { onSubmit, className: "flex min-h-0 flex-1 flex-col", children: content }) : void 0
|
|
571
|
+
}
|
|
572
|
+
);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// src/components/auth-card.tsx
|
|
576
|
+
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
571
577
|
function AuthCard({ title, description, children, footer }) {
|
|
572
|
-
return /* @__PURE__ */ (0,
|
|
573
|
-
/* @__PURE__ */ (0,
|
|
574
|
-
/* @__PURE__ */ (0,
|
|
575
|
-
description && /* @__PURE__ */ (0,
|
|
578
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "flex min-h-screen items-center justify-center px-4", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "w-full max-w-sm rounded-lg border bg-card p-6 shadow-sm", children: [
|
|
579
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "mb-6 text-center", children: [
|
|
580
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("h1", { className: "text-2xl font-semibold tracking-tight", children: title }),
|
|
581
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "mt-1 text-sm text-muted-foreground", children: description })
|
|
576
582
|
] }),
|
|
577
|
-
/* @__PURE__ */ (0,
|
|
578
|
-
footer && /* @__PURE__ */ (0,
|
|
583
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "space-y-4", children }),
|
|
584
|
+
footer && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "mt-4", children: footer })
|
|
579
585
|
] }) });
|
|
580
586
|
}
|
|
581
587
|
|
|
582
588
|
// src/components/pagination.tsx
|
|
583
|
-
var
|
|
589
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
584
590
|
function Pagination({ page, onPageChange, hasNextPage, hasPreviousPage, className }) {
|
|
585
|
-
return /* @__PURE__ */ (0,
|
|
586
|
-
/* @__PURE__ */ (0,
|
|
591
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: `flex items-center justify-end gap-4 ${className ?? ""}`, children: [
|
|
592
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
587
593
|
"button",
|
|
588
594
|
{
|
|
589
595
|
type: "button",
|
|
@@ -593,11 +599,11 @@ function Pagination({ page, onPageChange, hasNextPage, hasPreviousPage, classNam
|
|
|
593
599
|
children: "Anterior"
|
|
594
600
|
}
|
|
595
601
|
),
|
|
596
|
-
/* @__PURE__ */ (0,
|
|
602
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "text-sm text-muted-foreground", children: [
|
|
597
603
|
"P\xE1gina ",
|
|
598
604
|
page
|
|
599
605
|
] }),
|
|
600
|
-
/* @__PURE__ */ (0,
|
|
606
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
601
607
|
"button",
|
|
602
608
|
{
|
|
603
609
|
type: "button",
|
|
@@ -611,18 +617,18 @@ function Pagination({ page, onPageChange, hasNextPage, hasPreviousPage, classNam
|
|
|
611
617
|
}
|
|
612
618
|
|
|
613
619
|
// src/components/table-skeleton.tsx
|
|
614
|
-
var
|
|
620
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
615
621
|
function TableSkeleton({ rows = 5, columns = 4 }) {
|
|
616
|
-
return /* @__PURE__ */ (0,
|
|
622
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_jsx_runtime14.Fragment, { children: Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("tr", { className: "border-b transition-colors", children: Array.from({ length: columns }).map((_2, j) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("td", { className: "p-4 align-middle", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "h-5 w-full animate-pulse rounded bg-muted" }) }, j)) }, i)) });
|
|
617
623
|
}
|
|
618
624
|
|
|
619
625
|
// src/components/search-input.tsx
|
|
620
626
|
var React2 = __toESM(require("react"), 1);
|
|
621
|
-
var
|
|
627
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
622
628
|
var SearchInput = React2.forwardRef(
|
|
623
629
|
({ containerClassName, className, ...props }, ref) => {
|
|
624
|
-
return /* @__PURE__ */ (0,
|
|
625
|
-
/* @__PURE__ */ (0,
|
|
630
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: `relative flex-1 ${containerClassName ?? ""}`, children: [
|
|
631
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
626
632
|
"svg",
|
|
627
633
|
{
|
|
628
634
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -636,12 +642,12 @@ var SearchInput = React2.forwardRef(
|
|
|
636
642
|
strokeLinejoin: "round",
|
|
637
643
|
className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground",
|
|
638
644
|
children: [
|
|
639
|
-
/* @__PURE__ */ (0,
|
|
640
|
-
/* @__PURE__ */ (0,
|
|
645
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("circle", { cx: "11", cy: "11", r: "8" }),
|
|
646
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("path", { d: "m21 21-4.3-4.3" })
|
|
641
647
|
]
|
|
642
648
|
}
|
|
643
649
|
),
|
|
644
|
-
/* @__PURE__ */ (0,
|
|
650
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
645
651
|
"input",
|
|
646
652
|
{
|
|
647
653
|
ref,
|
|
@@ -658,11 +664,11 @@ SearchInput.displayName = "SearchInput";
|
|
|
658
664
|
// src/components/password-input.tsx
|
|
659
665
|
var import_lucide_react3 = require("lucide-react");
|
|
660
666
|
var React3 = __toESM(require("react"), 1);
|
|
661
|
-
var
|
|
667
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
662
668
|
var PasswordInput = React3.forwardRef(({ containerClassName, className, ...props }, ref) => {
|
|
663
669
|
const [visible, setVisible] = React3.useState(false);
|
|
664
|
-
return /* @__PURE__ */ (0,
|
|
665
|
-
/* @__PURE__ */ (0,
|
|
670
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: `relative ${containerClassName ?? ""}`, children: [
|
|
671
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
666
672
|
"input",
|
|
667
673
|
{
|
|
668
674
|
ref,
|
|
@@ -671,7 +677,7 @@ var PasswordInput = React3.forwardRef(({ containerClassName, className, ...props
|
|
|
671
677
|
...props
|
|
672
678
|
}
|
|
673
679
|
),
|
|
674
|
-
/* @__PURE__ */ (0,
|
|
680
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
675
681
|
"button",
|
|
676
682
|
{
|
|
677
683
|
type: "button",
|
|
@@ -679,7 +685,7 @@ var PasswordInput = React3.forwardRef(({ containerClassName, className, ...props
|
|
|
679
685
|
"aria-label": visible ? "Ocultar senha" : "Mostrar senha",
|
|
680
686
|
tabIndex: -1,
|
|
681
687
|
className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground transition-colors hover:text-foreground",
|
|
682
|
-
children: visible ? /* @__PURE__ */ (0,
|
|
688
|
+
children: visible ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_lucide_react3.EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_lucide_react3.Eye, { className: "h-4 w-4" })
|
|
683
689
|
}
|
|
684
690
|
)
|
|
685
691
|
] });
|
|
@@ -745,7 +751,7 @@ function useIsDesktop() {
|
|
|
745
751
|
}
|
|
746
752
|
|
|
747
753
|
// src/components/combobox.tsx
|
|
748
|
-
var
|
|
754
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
749
755
|
function Combobox({
|
|
750
756
|
options,
|
|
751
757
|
value,
|
|
@@ -792,7 +798,7 @@ function Combobox({
|
|
|
792
798
|
loading,
|
|
793
799
|
onLoadMore
|
|
794
800
|
});
|
|
795
|
-
const trigger = /* @__PURE__ */ (0,
|
|
801
|
+
const trigger = /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
796
802
|
"button",
|
|
797
803
|
{
|
|
798
804
|
type: "button",
|
|
@@ -807,20 +813,20 @@ function Combobox({
|
|
|
807
813
|
className
|
|
808
814
|
),
|
|
809
815
|
children: [
|
|
810
|
-
/* @__PURE__ */ (0,
|
|
811
|
-
/* @__PURE__ */ (0,
|
|
816
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: cn("truncate", !selected && "text-muted-foreground"), children: selected ? selected.label : placeholder }),
|
|
817
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react4.ChevronsUpDown, { className: "h-4 w-4 shrink-0 opacity-50" })
|
|
812
818
|
]
|
|
813
819
|
}
|
|
814
820
|
);
|
|
815
|
-
const command = /* @__PURE__ */ (0,
|
|
821
|
+
const command = /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
816
822
|
import_cmdk.Command,
|
|
817
823
|
{
|
|
818
824
|
shouldFilter: !isServer,
|
|
819
825
|
className: "flex h-full w-full flex-col overflow-hidden",
|
|
820
826
|
children: [
|
|
821
|
-
/* @__PURE__ */ (0,
|
|
822
|
-
/* @__PURE__ */ (0,
|
|
823
|
-
/* @__PURE__ */ (0,
|
|
827
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex items-center border-b px-3", children: [
|
|
828
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react4.Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
|
|
829
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
824
830
|
import_cmdk.Command.Input,
|
|
825
831
|
{
|
|
826
832
|
placeholder: searchPlaceholder,
|
|
@@ -829,28 +835,28 @@ function Combobox({
|
|
|
829
835
|
}
|
|
830
836
|
)
|
|
831
837
|
] }),
|
|
832
|
-
/* @__PURE__ */ (0,
|
|
838
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
833
839
|
import_cmdk.Command.List,
|
|
834
840
|
{
|
|
835
841
|
ref: listRef,
|
|
836
842
|
className: "max-h-[50vh] overflow-y-auto overflow-x-hidden p-1 sm:max-h-60",
|
|
837
843
|
children: [
|
|
838
|
-
!isServer && !showCreate && /* @__PURE__ */ (0,
|
|
839
|
-
showCreate && /* @__PURE__ */ (0,
|
|
844
|
+
!isServer && !showCreate && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_cmdk.Command.Empty, { className: "py-6 text-center text-sm text-muted-foreground", children: emptyMessage }),
|
|
845
|
+
showCreate && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
840
846
|
import_cmdk.Command.Item,
|
|
841
847
|
{
|
|
842
848
|
value: trimmedSearch,
|
|
843
849
|
onSelect: () => handleSelect(trimmedSearch),
|
|
844
850
|
className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground sm:py-1.5",
|
|
845
851
|
children: [
|
|
846
|
-
/* @__PURE__ */ (0,
|
|
847
|
-
/* @__PURE__ */ (0,
|
|
852
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react4.Plus, { className: "h-4 w-4 shrink-0" }),
|
|
853
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "truncate", children: (formatCreateLabel ?? ((text) => `Usar "${text}"`))(
|
|
848
854
|
trimmedSearch
|
|
849
855
|
) })
|
|
850
856
|
]
|
|
851
857
|
}
|
|
852
858
|
),
|
|
853
|
-
options.map((option) => /* @__PURE__ */ (0,
|
|
859
|
+
options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
854
860
|
import_cmdk.Command.Item,
|
|
855
861
|
{
|
|
856
862
|
value: isServer ? option.value : option.label,
|
|
@@ -858,7 +864,7 @@ function Combobox({
|
|
|
858
864
|
onSelect: () => handleSelect(option.value),
|
|
859
865
|
className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 sm:py-1.5",
|
|
860
866
|
children: [
|
|
861
|
-
/* @__PURE__ */ (0,
|
|
867
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
862
868
|
import_lucide_react4.Check,
|
|
863
869
|
{
|
|
864
870
|
className: cn(
|
|
@@ -867,14 +873,14 @@ function Combobox({
|
|
|
867
873
|
)
|
|
868
874
|
}
|
|
869
875
|
),
|
|
870
|
-
/* @__PURE__ */ (0,
|
|
876
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "truncate", children: option.label })
|
|
871
877
|
]
|
|
872
878
|
},
|
|
873
879
|
option.value
|
|
874
880
|
)),
|
|
875
|
-
isServer && !loading && options.length === 0 && /* @__PURE__ */ (0,
|
|
876
|
-
isServer && loading && /* @__PURE__ */ (0,
|
|
877
|
-
isServer && hasMore && /* @__PURE__ */ (0,
|
|
881
|
+
isServer && !loading && options.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "py-6 text-center text-sm text-muted-foreground", children: emptyMessage }),
|
|
882
|
+
isServer && loading && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "flex items-center justify-center py-6", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react4.Loader2, { className: "h-4 w-4 animate-spin text-muted-foreground" }) }),
|
|
883
|
+
isServer && hasMore && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { ref: sentinelRef, "aria-hidden": true, className: "h-1" })
|
|
878
884
|
]
|
|
879
885
|
}
|
|
880
886
|
)
|
|
@@ -882,9 +888,9 @@ function Combobox({
|
|
|
882
888
|
}
|
|
883
889
|
);
|
|
884
890
|
if (isDesktop) {
|
|
885
|
-
return /* @__PURE__ */ (0,
|
|
886
|
-
/* @__PURE__ */ (0,
|
|
887
|
-
/* @__PURE__ */ (0,
|
|
891
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(PopoverPrimitive.Root, { open, onOpenChange: handleOpenChange, children: [
|
|
892
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(PopoverPrimitive.Trigger, { asChild: true, children: trigger }),
|
|
893
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(PopoverPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
888
894
|
PopoverPrimitive.Content,
|
|
889
895
|
{
|
|
890
896
|
align: "start",
|
|
@@ -896,13 +902,13 @@ function Combobox({
|
|
|
896
902
|
) })
|
|
897
903
|
] });
|
|
898
904
|
}
|
|
899
|
-
return /* @__PURE__ */ (0,
|
|
900
|
-
/* @__PURE__ */ (0,
|
|
901
|
-
/* @__PURE__ */ (0,
|
|
902
|
-
/* @__PURE__ */ (0,
|
|
903
|
-
/* @__PURE__ */ (0,
|
|
904
|
-
/* @__PURE__ */ (0,
|
|
905
|
-
/* @__PURE__ */ (0,
|
|
905
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_vaul.Drawer.Root, { open, onOpenChange: handleOpenChange, children: [
|
|
906
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_vaul.Drawer.Trigger, { asChild: true, children: trigger }),
|
|
907
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_vaul.Drawer.Portal, { children: [
|
|
908
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_vaul.Drawer.Overlay, { className: "fixed inset-0 z-50 bg-black/80" }),
|
|
909
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_vaul.Drawer.Content, { className: "fixed inset-x-0 bottom-0 z-50 mt-24 flex max-h-[85vh] flex-col rounded-t-2xl border bg-popover text-popover-foreground outline-none", children: [
|
|
910
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_vaul.Drawer.Title, { className: "sr-only", children: placeholder }),
|
|
911
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted" }),
|
|
906
912
|
command
|
|
907
913
|
] })
|
|
908
914
|
] })
|
|
@@ -915,7 +921,7 @@ var import_cmdk2 = require("cmdk");
|
|
|
915
921
|
var import_lucide_react5 = require("lucide-react");
|
|
916
922
|
var React7 = __toESM(require("react"), 1);
|
|
917
923
|
var import_vaul2 = require("vaul");
|
|
918
|
-
var
|
|
924
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
919
925
|
function MultiCombobox({
|
|
920
926
|
options,
|
|
921
927
|
value,
|
|
@@ -956,7 +962,7 @@ function MultiCombobox({
|
|
|
956
962
|
const removeValue = (optionValue) => {
|
|
957
963
|
onChange(value.filter((v) => v !== optionValue));
|
|
958
964
|
};
|
|
959
|
-
const trigger = /* @__PURE__ */ (0,
|
|
965
|
+
const trigger = /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
960
966
|
"div",
|
|
961
967
|
{
|
|
962
968
|
id,
|
|
@@ -978,13 +984,13 @@ function MultiCombobox({
|
|
|
978
984
|
className
|
|
979
985
|
),
|
|
980
986
|
children: [
|
|
981
|
-
selected.length === 0 ? /* @__PURE__ */ (0,
|
|
987
|
+
selected.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "text-muted-foreground", children: placeholder }) : selected.map((option) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
982
988
|
"span",
|
|
983
989
|
{
|
|
984
990
|
className: "inline-flex items-center gap-1 rounded bg-secondary px-1.5 py-0.5 text-xs text-secondary-foreground",
|
|
985
991
|
children: [
|
|
986
992
|
option.label,
|
|
987
|
-
/* @__PURE__ */ (0,
|
|
993
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
988
994
|
"button",
|
|
989
995
|
{
|
|
990
996
|
type: "button",
|
|
@@ -996,26 +1002,26 @@ function MultiCombobox({
|
|
|
996
1002
|
},
|
|
997
1003
|
onPointerDown: (event) => event.stopPropagation(),
|
|
998
1004
|
className: "rounded-sm opacity-60 transition-opacity hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
999
|
-
children: /* @__PURE__ */ (0,
|
|
1005
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react5.X, { className: "h-3 w-3" })
|
|
1000
1006
|
}
|
|
1001
1007
|
)
|
|
1002
1008
|
]
|
|
1003
1009
|
},
|
|
1004
1010
|
option.value
|
|
1005
1011
|
)),
|
|
1006
|
-
/* @__PURE__ */ (0,
|
|
1012
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react5.ChevronsUpDown, { className: "ml-auto h-4 w-4 shrink-0 opacity-50" })
|
|
1007
1013
|
]
|
|
1008
1014
|
}
|
|
1009
1015
|
);
|
|
1010
|
-
const command = /* @__PURE__ */ (0,
|
|
1016
|
+
const command = /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
1011
1017
|
import_cmdk2.Command,
|
|
1012
1018
|
{
|
|
1013
1019
|
shouldFilter: !isServer,
|
|
1014
1020
|
className: "flex h-full w-full flex-col overflow-hidden",
|
|
1015
1021
|
children: [
|
|
1016
|
-
/* @__PURE__ */ (0,
|
|
1017
|
-
/* @__PURE__ */ (0,
|
|
1018
|
-
/* @__PURE__ */ (0,
|
|
1022
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex items-center border-b px-3", children: [
|
|
1023
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react5.Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
|
|
1024
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
1019
1025
|
import_cmdk2.Command.Input,
|
|
1020
1026
|
{
|
|
1021
1027
|
placeholder: searchPlaceholder,
|
|
@@ -1024,14 +1030,14 @@ function MultiCombobox({
|
|
|
1024
1030
|
}
|
|
1025
1031
|
)
|
|
1026
1032
|
] }),
|
|
1027
|
-
/* @__PURE__ */ (0,
|
|
1033
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
1028
1034
|
import_cmdk2.Command.List,
|
|
1029
1035
|
{
|
|
1030
1036
|
ref: listRef,
|
|
1031
1037
|
className: "max-h-[50vh] overflow-y-auto overflow-x-hidden p-1 sm:max-h-60",
|
|
1032
1038
|
children: [
|
|
1033
|
-
!isServer && /* @__PURE__ */ (0,
|
|
1034
|
-
options.map((option) => /* @__PURE__ */ (0,
|
|
1039
|
+
!isServer && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_cmdk2.Command.Empty, { className: "py-6 text-center text-sm text-muted-foreground", children: emptyMessage }),
|
|
1040
|
+
options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
1035
1041
|
import_cmdk2.Command.Item,
|
|
1036
1042
|
{
|
|
1037
1043
|
value: isServer ? option.value : option.label,
|
|
@@ -1039,7 +1045,7 @@ function MultiCombobox({
|
|
|
1039
1045
|
onSelect: () => toggleValue(option.value),
|
|
1040
1046
|
className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 sm:py-1.5",
|
|
1041
1047
|
children: [
|
|
1042
|
-
/* @__PURE__ */ (0,
|
|
1048
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
1043
1049
|
import_lucide_react5.Check,
|
|
1044
1050
|
{
|
|
1045
1051
|
className: cn(
|
|
@@ -1048,14 +1054,14 @@ function MultiCombobox({
|
|
|
1048
1054
|
)
|
|
1049
1055
|
}
|
|
1050
1056
|
),
|
|
1051
|
-
/* @__PURE__ */ (0,
|
|
1057
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "truncate", children: option.label })
|
|
1052
1058
|
]
|
|
1053
1059
|
},
|
|
1054
1060
|
option.value
|
|
1055
1061
|
)),
|
|
1056
|
-
isServer && !loading && options.length === 0 && /* @__PURE__ */ (0,
|
|
1057
|
-
isServer && loading && /* @__PURE__ */ (0,
|
|
1058
|
-
isServer && hasMore && /* @__PURE__ */ (0,
|
|
1062
|
+
isServer && !loading && options.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "py-6 text-center text-sm text-muted-foreground", children: emptyMessage }),
|
|
1063
|
+
isServer && loading && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "flex items-center justify-center py-6", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_lucide_react5.Loader2, { className: "h-4 w-4 animate-spin text-muted-foreground" }) }),
|
|
1064
|
+
isServer && hasMore && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { ref: sentinelRef, "aria-hidden": true, className: "h-1" })
|
|
1059
1065
|
]
|
|
1060
1066
|
}
|
|
1061
1067
|
)
|
|
@@ -1063,9 +1069,9 @@ function MultiCombobox({
|
|
|
1063
1069
|
}
|
|
1064
1070
|
);
|
|
1065
1071
|
if (isDesktop) {
|
|
1066
|
-
return /* @__PURE__ */ (0,
|
|
1067
|
-
/* @__PURE__ */ (0,
|
|
1068
|
-
/* @__PURE__ */ (0,
|
|
1072
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(PopoverPrimitive2.Root, { open, onOpenChange: setOpen, children: [
|
|
1073
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(PopoverPrimitive2.Trigger, { asChild: true, disabled, children: trigger }),
|
|
1074
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(PopoverPrimitive2.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
1069
1075
|
PopoverPrimitive2.Content,
|
|
1070
1076
|
{
|
|
1071
1077
|
align: "start",
|
|
@@ -1077,13 +1083,13 @@ function MultiCombobox({
|
|
|
1077
1083
|
) })
|
|
1078
1084
|
] });
|
|
1079
1085
|
}
|
|
1080
|
-
return /* @__PURE__ */ (0,
|
|
1081
|
-
/* @__PURE__ */ (0,
|
|
1082
|
-
/* @__PURE__ */ (0,
|
|
1083
|
-
/* @__PURE__ */ (0,
|
|
1084
|
-
/* @__PURE__ */ (0,
|
|
1085
|
-
/* @__PURE__ */ (0,
|
|
1086
|
-
/* @__PURE__ */ (0,
|
|
1086
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_vaul2.Drawer.Root, { open, onOpenChange: setOpen, children: [
|
|
1087
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_vaul2.Drawer.Trigger, { asChild: true, disabled, children: trigger }),
|
|
1088
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_vaul2.Drawer.Portal, { children: [
|
|
1089
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_vaul2.Drawer.Overlay, { className: "fixed inset-0 z-50 bg-black/80" }),
|
|
1090
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_vaul2.Drawer.Content, { className: "fixed inset-x-0 bottom-0 z-50 mt-24 flex max-h-[85vh] flex-col rounded-t-2xl border bg-popover text-popover-foreground outline-none", children: [
|
|
1091
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_vaul2.Drawer.Title, { className: "sr-only", children: placeholder }),
|
|
1092
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted" }),
|
|
1087
1093
|
command
|
|
1088
1094
|
] })
|
|
1089
1095
|
] })
|
|
@@ -1095,7 +1101,7 @@ var PopoverPrimitive3 = __toESM(require("@radix-ui/react-popover"), 1);
|
|
|
1095
1101
|
var import_lucide_react6 = require("lucide-react");
|
|
1096
1102
|
var React8 = __toESM(require("react"), 1);
|
|
1097
1103
|
var import_react_colorful = require("react-colorful");
|
|
1098
|
-
var
|
|
1104
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
1099
1105
|
function ColorPicker({
|
|
1100
1106
|
value,
|
|
1101
1107
|
onChange,
|
|
@@ -1108,8 +1114,8 @@ function ColorPicker({
|
|
|
1108
1114
|
}) {
|
|
1109
1115
|
const [open, setOpen] = React8.useState(false);
|
|
1110
1116
|
const color = value || "";
|
|
1111
|
-
return /* @__PURE__ */ (0,
|
|
1112
|
-
/* @__PURE__ */ (0,
|
|
1117
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(PopoverPrimitive3.Root, { open, onOpenChange: setOpen, children: [
|
|
1118
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(PopoverPrimitive3.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
|
|
1113
1119
|
"button",
|
|
1114
1120
|
{
|
|
1115
1121
|
type: "button",
|
|
@@ -1122,8 +1128,8 @@ function ColorPicker({
|
|
|
1122
1128
|
className
|
|
1123
1129
|
),
|
|
1124
1130
|
children: [
|
|
1125
|
-
/* @__PURE__ */ (0,
|
|
1126
|
-
/* @__PURE__ */ (0,
|
|
1131
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "flex items-center gap-2 truncate", children: [
|
|
1132
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
1127
1133
|
"span",
|
|
1128
1134
|
{
|
|
1129
1135
|
"aria-hidden": true,
|
|
@@ -1136,23 +1142,23 @@ function ColorPicker({
|
|
|
1136
1142
|
}
|
|
1137
1143
|
}
|
|
1138
1144
|
),
|
|
1139
|
-
/* @__PURE__ */ (0,
|
|
1145
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: cn("truncate", !color && "text-muted-foreground"), children: color || placeholder })
|
|
1140
1146
|
] }),
|
|
1141
|
-
/* @__PURE__ */ (0,
|
|
1147
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react6.ChevronsUpDown, { className: "h-4 w-4 shrink-0 opacity-50" })
|
|
1142
1148
|
]
|
|
1143
1149
|
}
|
|
1144
1150
|
) }),
|
|
1145
|
-
/* @__PURE__ */ (0,
|
|
1151
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(PopoverPrimitive3.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
1146
1152
|
PopoverPrimitive3.Content,
|
|
1147
1153
|
{
|
|
1148
1154
|
align: "start",
|
|
1149
1155
|
sideOffset: 4,
|
|
1150
1156
|
className: "z-50 w-56 rounded-md border bg-popover p-3 text-popover-foreground shadow-md",
|
|
1151
|
-
children: /* @__PURE__ */ (0,
|
|
1152
|
-
/* @__PURE__ */ (0,
|
|
1153
|
-
/* @__PURE__ */ (0,
|
|
1154
|
-
/* @__PURE__ */ (0,
|
|
1155
|
-
/* @__PURE__ */ (0,
|
|
1157
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "mh-color-picker flex flex-col gap-3", children: [
|
|
1158
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_colorful.HexColorPicker, { color, onChange }),
|
|
1159
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
1160
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "text-sm text-muted-foreground", children: "#" }),
|
|
1161
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
|
|
1156
1162
|
import_react_colorful.HexColorInput,
|
|
1157
1163
|
{
|
|
1158
1164
|
color,
|
|
@@ -1169,30 +1175,30 @@ function ColorPicker({
|
|
|
1169
1175
|
}
|
|
1170
1176
|
|
|
1171
1177
|
// src/components/stat-card.tsx
|
|
1172
|
-
var
|
|
1178
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
1173
1179
|
function StatCard({ label, value, detail, icon, isLoading }) {
|
|
1174
1180
|
if (isLoading) {
|
|
1175
|
-
return /* @__PURE__ */ (0,
|
|
1176
|
-
/* @__PURE__ */ (0,
|
|
1177
|
-
/* @__PURE__ */ (0,
|
|
1178
|
-
/* @__PURE__ */ (0,
|
|
1181
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
|
|
1182
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "flex items-center justify-between pb-2", children: [
|
|
1183
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
|
|
1184
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "h-4 w-4 animate-pulse rounded bg-muted" })
|
|
1179
1185
|
] }),
|
|
1180
|
-
/* @__PURE__ */ (0,
|
|
1181
|
-
/* @__PURE__ */ (0,
|
|
1186
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "mt-2 h-7 w-16 animate-pulse rounded bg-muted" }),
|
|
1187
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "mt-1 h-4 w-20 animate-pulse rounded bg-muted" })
|
|
1182
1188
|
] });
|
|
1183
1189
|
}
|
|
1184
|
-
return /* @__PURE__ */ (0,
|
|
1185
|
-
/* @__PURE__ */ (0,
|
|
1186
|
-
/* @__PURE__ */ (0,
|
|
1187
|
-
icon && /* @__PURE__ */ (0,
|
|
1190
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
|
|
1191
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "flex items-center justify-between pb-2", children: [
|
|
1192
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "text-sm font-medium text-muted-foreground", children: label }),
|
|
1193
|
+
icon && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "text-muted-foreground", children: icon })
|
|
1188
1194
|
] }),
|
|
1189
|
-
/* @__PURE__ */ (0,
|
|
1190
|
-
detail && /* @__PURE__ */ (0,
|
|
1195
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "text-2xl font-bold", children: value }),
|
|
1196
|
+
detail && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-xs text-muted-foreground", children: detail })
|
|
1191
1197
|
] });
|
|
1192
1198
|
}
|
|
1193
1199
|
|
|
1194
1200
|
// src/components/data-table-wrapper.tsx
|
|
1195
|
-
var
|
|
1201
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
1196
1202
|
function DataTableWrapper({
|
|
1197
1203
|
children,
|
|
1198
1204
|
isEmpty,
|
|
@@ -1205,15 +1211,15 @@ function DataTableWrapper({
|
|
|
1205
1211
|
hasNextPage = false,
|
|
1206
1212
|
hasPreviousPage = false
|
|
1207
1213
|
}) {
|
|
1208
|
-
return /* @__PURE__ */ (0,
|
|
1209
|
-
/* @__PURE__ */ (0,
|
|
1210
|
-
!isLoading && isEmpty && /* @__PURE__ */ (0,
|
|
1211
|
-
emptyIcon && /* @__PURE__ */ (0,
|
|
1212
|
-
/* @__PURE__ */ (0,
|
|
1213
|
-
emptyDescription && /* @__PURE__ */ (0,
|
|
1214
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-4", children: [
|
|
1215
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "overflow-x-auto rounded-md border", children }),
|
|
1216
|
+
!isLoading && isEmpty && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
|
|
1217
|
+
emptyIcon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
|
|
1218
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
|
|
1219
|
+
emptyDescription && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
|
|
1214
1220
|
] }),
|
|
1215
|
-
page !== void 0 && onPageChange && /* @__PURE__ */ (0,
|
|
1216
|
-
/* @__PURE__ */ (0,
|
|
1221
|
+
page !== void 0 && onPageChange && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex items-center justify-end gap-4", children: [
|
|
1222
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
1217
1223
|
"button",
|
|
1218
1224
|
{
|
|
1219
1225
|
type: "button",
|
|
@@ -1223,11 +1229,11 @@ function DataTableWrapper({
|
|
|
1223
1229
|
children: "Anterior"
|
|
1224
1230
|
}
|
|
1225
1231
|
),
|
|
1226
|
-
/* @__PURE__ */ (0,
|
|
1232
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("span", { className: "text-sm text-muted-foreground", children: [
|
|
1227
1233
|
"P\xE1gina ",
|
|
1228
1234
|
page
|
|
1229
1235
|
] }),
|
|
1230
|
-
/* @__PURE__ */ (0,
|
|
1236
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
1231
1237
|
"button",
|
|
1232
1238
|
{
|
|
1233
1239
|
type: "button",
|
|
@@ -1243,7 +1249,7 @@ function DataTableWrapper({
|
|
|
1243
1249
|
|
|
1244
1250
|
// src/components/mobile-card-list.tsx
|
|
1245
1251
|
var import_react4 = require("react");
|
|
1246
|
-
var
|
|
1252
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
1247
1253
|
var SCROLL_THRESHOLD = 8;
|
|
1248
1254
|
function MobileCardList({
|
|
1249
1255
|
data,
|
|
@@ -1274,26 +1280,26 @@ function MobileCardList({
|
|
|
1274
1280
|
}
|
|
1275
1281
|
};
|
|
1276
1282
|
if (isLoading) {
|
|
1277
|
-
return /* @__PURE__ */ (0,
|
|
1278
|
-
/* @__PURE__ */ (0,
|
|
1279
|
-
/* @__PURE__ */ (0,
|
|
1280
|
-
/* @__PURE__ */ (0,
|
|
1283
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: `space-y-3 ${className ?? ""}`, children: Array.from({ length: loadingCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "rounded-xl border p-4", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "space-y-3", children: [
|
|
1284
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between", children: [
|
|
1285
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "h-5 w-32 animate-pulse rounded bg-muted" }),
|
|
1286
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "h-5 w-16 animate-pulse rounded bg-muted" })
|
|
1281
1287
|
] }),
|
|
1282
|
-
/* @__PURE__ */ (0,
|
|
1283
|
-
/* @__PURE__ */ (0,
|
|
1284
|
-
/* @__PURE__ */ (0,
|
|
1285
|
-
/* @__PURE__ */ (0,
|
|
1288
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "h-4 w-48 animate-pulse rounded bg-muted" }),
|
|
1289
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between", children: [
|
|
1290
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
|
|
1291
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "h-4 w-20 animate-pulse rounded bg-muted" })
|
|
1286
1292
|
] })
|
|
1287
1293
|
] }) }, i)) });
|
|
1288
1294
|
}
|
|
1289
|
-
return /* @__PURE__ */ (0,
|
|
1295
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1290
1296
|
"div",
|
|
1291
1297
|
{
|
|
1292
1298
|
className: `space-y-3 ${className ?? ""}`,
|
|
1293
1299
|
onTouchStart,
|
|
1294
1300
|
onTouchMove,
|
|
1295
1301
|
onClickCapture,
|
|
1296
|
-
children: data.map((item, index) => /* @__PURE__ */ (0,
|
|
1302
|
+
children: data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1297
1303
|
"div",
|
|
1298
1304
|
{
|
|
1299
1305
|
className: "rounded-xl border p-4 transition-all duration-150 hover:border-foreground/20 active:scale-[0.99]",
|
|
@@ -1306,7 +1312,7 @@ function MobileCardList({
|
|
|
1306
1312
|
}
|
|
1307
1313
|
|
|
1308
1314
|
// src/components/responsive-data-view.tsx
|
|
1309
|
-
var
|
|
1315
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
1310
1316
|
function ResponsiveDataView({
|
|
1311
1317
|
table,
|
|
1312
1318
|
cards,
|
|
@@ -1317,13 +1323,13 @@ function ResponsiveDataView({
|
|
|
1317
1323
|
emptyDescription,
|
|
1318
1324
|
pagination
|
|
1319
1325
|
}) {
|
|
1320
|
-
return /* @__PURE__ */ (0,
|
|
1321
|
-
/* @__PURE__ */ (0,
|
|
1322
|
-
/* @__PURE__ */ (0,
|
|
1323
|
-
!isLoading && isEmpty && /* @__PURE__ */ (0,
|
|
1324
|
-
emptyIcon && /* @__PURE__ */ (0,
|
|
1325
|
-
/* @__PURE__ */ (0,
|
|
1326
|
-
emptyDescription && /* @__PURE__ */ (0,
|
|
1326
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-4", children: [
|
|
1327
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "hidden overflow-x-auto rounded-md border md:block", children: table }),
|
|
1328
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "md:hidden", children: cards }),
|
|
1329
|
+
!isLoading && isEmpty && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
|
|
1330
|
+
emptyIcon && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
|
|
1331
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
|
|
1332
|
+
emptyDescription && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
|
|
1327
1333
|
] }),
|
|
1328
1334
|
pagination
|
|
1329
1335
|
] });
|
|
@@ -1331,10 +1337,10 @@ function ResponsiveDataView({
|
|
|
1331
1337
|
|
|
1332
1338
|
// src/components/toaster.tsx
|
|
1333
1339
|
var import_sonner = require("sonner");
|
|
1334
|
-
var
|
|
1340
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
1335
1341
|
function Toaster(props) {
|
|
1336
1342
|
const { theme = "system" } = useTheme();
|
|
1337
|
-
return /* @__PURE__ */ (0,
|
|
1343
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
1338
1344
|
import_sonner.Toaster,
|
|
1339
1345
|
{
|
|
1340
1346
|
theme,
|
|
@@ -1362,11 +1368,11 @@ var import_react7 = require("react");
|
|
|
1362
1368
|
var import_react5 = require("react");
|
|
1363
1369
|
|
|
1364
1370
|
// src/components/types.tsx
|
|
1365
|
-
var
|
|
1366
|
-
var defaultRenderLink = ({ children, ...props }) => /* @__PURE__ */ (0,
|
|
1371
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
1372
|
+
var defaultRenderLink = ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("a", { ...props, children });
|
|
1367
1373
|
|
|
1368
1374
|
// src/components/sidebar-nav.tsx
|
|
1369
|
-
var
|
|
1375
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
1370
1376
|
function defaultIsActive(item, activePath) {
|
|
1371
1377
|
if (item.href === "/") return activePath === "/";
|
|
1372
1378
|
return activePath === item.href || activePath.startsWith(item.href + "/");
|
|
@@ -1381,7 +1387,7 @@ function SidebarNav({
|
|
|
1381
1387
|
onNavigate
|
|
1382
1388
|
}) {
|
|
1383
1389
|
const visible = items.filter((item) => !item.adminOnly || isAdmin);
|
|
1384
|
-
return /* @__PURE__ */ (0,
|
|
1390
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("nav", { className: "flex flex-col gap-1", children: visible.map((item) => {
|
|
1385
1391
|
const active = isActive(item, activePath);
|
|
1386
1392
|
const link = renderLink({
|
|
1387
1393
|
href: item.href,
|
|
@@ -1393,12 +1399,12 @@ function SidebarNav({
|
|
|
1393
1399
|
active ? "bg-accent text-accent-foreground font-semibold" : "text-muted-foreground hover:bg-accent hover:text-accent-foreground",
|
|
1394
1400
|
isCollapsed && "justify-center px-2"
|
|
1395
1401
|
),
|
|
1396
|
-
children: /* @__PURE__ */ (0,
|
|
1397
|
-
item.icon && /* @__PURE__ */ (0,
|
|
1398
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
1402
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
|
|
1403
|
+
item.icon && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "shrink-0", children: item.icon }),
|
|
1404
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "truncate", children: item.label })
|
|
1399
1405
|
] })
|
|
1400
1406
|
});
|
|
1401
|
-
return /* @__PURE__ */ (0,
|
|
1407
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react5.Fragment, { children: link }, item.href);
|
|
1402
1408
|
}) });
|
|
1403
1409
|
}
|
|
1404
1410
|
|
|
@@ -1407,7 +1413,7 @@ var DropdownMenu2 = __toESM(require("@radix-ui/react-dropdown-menu"), 1);
|
|
|
1407
1413
|
var import_lucide_react7 = require("lucide-react");
|
|
1408
1414
|
var import_react6 = require("react");
|
|
1409
1415
|
var import_vaul3 = require("vaul");
|
|
1410
|
-
var
|
|
1416
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
1411
1417
|
function initials(user) {
|
|
1412
1418
|
const source = user?.name?.trim() || user?.email?.trim();
|
|
1413
1419
|
if (!source) return "";
|
|
@@ -1428,50 +1434,50 @@ function UserMenu({
|
|
|
1428
1434
|
const isDesktop = useIsDesktop();
|
|
1429
1435
|
const [open, setOpen] = (0, import_react6.useState)(false);
|
|
1430
1436
|
const label = initials(user);
|
|
1431
|
-
const trigger = /* @__PURE__ */ (0,
|
|
1437
|
+
const trigger = /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
1432
1438
|
"button",
|
|
1433
1439
|
{
|
|
1434
1440
|
type: "button",
|
|
1435
1441
|
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-2 focus-visible:ring-ring",
|
|
1436
1442
|
"aria-label": "Menu do usu\xE1rio",
|
|
1437
1443
|
"data-testid": "user-menu",
|
|
1438
|
-
children: user?.avatarUrl ? /* @__PURE__ */ (0,
|
|
1444
|
+
children: user?.avatarUrl ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
1439
1445
|
"img",
|
|
1440
1446
|
{
|
|
1441
1447
|
src: user.avatarUrl,
|
|
1442
1448
|
alt: user.name ?? user.email ?? "Avatar",
|
|
1443
1449
|
className: "h-full w-full object-cover"
|
|
1444
1450
|
}
|
|
1445
|
-
) : label ? /* @__PURE__ */ (0,
|
|
1451
|
+
) : label ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: label }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react7.User, { className: "h-4 w-4" })
|
|
1446
1452
|
}
|
|
1447
1453
|
);
|
|
1448
|
-
const userInfo = (user?.name || user?.email) && /* @__PURE__ */ (0,
|
|
1449
|
-
user.name && /* @__PURE__ */ (0,
|
|
1450
|
-
user.email && /* @__PURE__ */ (0,
|
|
1454
|
+
const userInfo = (user?.name || user?.email) && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "px-2 py-1.5", children: [
|
|
1455
|
+
user.name && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { className: "truncate text-sm font-medium", children: user.name }),
|
|
1456
|
+
user.email && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { className: "truncate text-xs text-muted-foreground", children: user.email })
|
|
1451
1457
|
] });
|
|
1452
1458
|
if (isDesktop) {
|
|
1453
|
-
return /* @__PURE__ */ (0,
|
|
1454
|
-
/* @__PURE__ */ (0,
|
|
1455
|
-
/* @__PURE__ */ (0,
|
|
1459
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(DropdownMenu2.Root, { open, onOpenChange: setOpen, children: [
|
|
1460
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(DropdownMenu2.Trigger, { asChild: true, children: trigger }),
|
|
1461
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(DropdownMenu2.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
1456
1462
|
DropdownMenu2.Content,
|
|
1457
1463
|
{
|
|
1458
1464
|
align,
|
|
1459
1465
|
sideOffset: 6,
|
|
1460
1466
|
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",
|
|
1461
1467
|
children: [
|
|
1462
|
-
userInfo && /* @__PURE__ */ (0,
|
|
1468
|
+
userInfo && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
|
|
1463
1469
|
userInfo,
|
|
1464
|
-
/* @__PURE__ */ (0,
|
|
1470
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" })
|
|
1465
1471
|
] }),
|
|
1466
1472
|
items.map(
|
|
1467
|
-
(item) => item.href ? /* @__PURE__ */ (0,
|
|
1473
|
+
(item) => item.href ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(DropdownMenu2.Item, { asChild: true, children: renderLink({
|
|
1468
1474
|
href: item.href,
|
|
1469
1475
|
className: itemClass,
|
|
1470
|
-
children: /* @__PURE__ */ (0,
|
|
1476
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
|
|
1471
1477
|
item.icon,
|
|
1472
1478
|
item.label
|
|
1473
1479
|
] })
|
|
1474
|
-
}) }, item.label) : /* @__PURE__ */ (0,
|
|
1480
|
+
}) }, item.label) : /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
1475
1481
|
DropdownMenu2.Item,
|
|
1476
1482
|
{
|
|
1477
1483
|
className: itemClass,
|
|
@@ -1484,9 +1490,9 @@ function UserMenu({
|
|
|
1484
1490
|
item.label
|
|
1485
1491
|
)
|
|
1486
1492
|
),
|
|
1487
|
-
onLogout && /* @__PURE__ */ (0,
|
|
1488
|
-
items.length > 0 && /* @__PURE__ */ (0,
|
|
1489
|
-
/* @__PURE__ */ (0,
|
|
1493
|
+
onLogout && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
|
|
1494
|
+
items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" }),
|
|
1495
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
1490
1496
|
DropdownMenu2.Item,
|
|
1491
1497
|
{
|
|
1492
1498
|
className: cn(
|
|
@@ -1495,7 +1501,7 @@ function UserMenu({
|
|
|
1495
1501
|
),
|
|
1496
1502
|
onClick: onLogout,
|
|
1497
1503
|
children: [
|
|
1498
|
-
/* @__PURE__ */ (0,
|
|
1504
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react7.LogOut, { className: "h-4 w-4" }),
|
|
1499
1505
|
logoutLabel
|
|
1500
1506
|
]
|
|
1501
1507
|
}
|
|
@@ -1506,19 +1512,19 @@ function UserMenu({
|
|
|
1506
1512
|
) })
|
|
1507
1513
|
] });
|
|
1508
1514
|
}
|
|
1509
|
-
return /* @__PURE__ */ (0,
|
|
1510
|
-
/* @__PURE__ */ (0,
|
|
1511
|
-
/* @__PURE__ */ (0,
|
|
1512
|
-
/* @__PURE__ */ (0,
|
|
1513
|
-
/* @__PURE__ */ (0,
|
|
1514
|
-
/* @__PURE__ */ (0,
|
|
1515
|
-
/* @__PURE__ */ (0,
|
|
1516
|
-
userInfo && /* @__PURE__ */ (0,
|
|
1515
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_vaul3.Drawer.Root, { open, onOpenChange: setOpen, children: [
|
|
1516
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_vaul3.Drawer.Trigger, { asChild: true, children: trigger }),
|
|
1517
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_vaul3.Drawer.Portal, { children: [
|
|
1518
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_vaul3.Drawer.Overlay, { className: "fixed inset-0 z-50 bg-black/80" }),
|
|
1519
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_vaul3.Drawer.Content, { className: "fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border bg-popover p-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] text-popover-foreground outline-none", children: [
|
|
1520
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_vaul3.Drawer.Title, { className: "sr-only", children: "Menu do usu\xE1rio" }),
|
|
1521
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted" }),
|
|
1522
|
+
userInfo && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
|
|
1517
1523
|
userInfo,
|
|
1518
|
-
/* @__PURE__ */ (0,
|
|
1524
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "-mx-1 my-1 h-px bg-border" })
|
|
1519
1525
|
] }),
|
|
1520
1526
|
items.map(
|
|
1521
|
-
(item) => item.href ? /* @__PURE__ */ (0,
|
|
1527
|
+
(item) => item.href ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
1522
1528
|
"span",
|
|
1523
1529
|
{
|
|
1524
1530
|
onClick: () => setOpen(false),
|
|
@@ -1526,14 +1532,14 @@ function UserMenu({
|
|
|
1526
1532
|
children: renderLink({
|
|
1527
1533
|
href: item.href,
|
|
1528
1534
|
className: sheetItemClass,
|
|
1529
|
-
children: /* @__PURE__ */ (0,
|
|
1535
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
|
|
1530
1536
|
item.icon,
|
|
1531
1537
|
item.label
|
|
1532
1538
|
] })
|
|
1533
1539
|
})
|
|
1534
1540
|
},
|
|
1535
1541
|
item.label
|
|
1536
|
-
) : /* @__PURE__ */ (0,
|
|
1542
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
1537
1543
|
"button",
|
|
1538
1544
|
{
|
|
1539
1545
|
type: "button",
|
|
@@ -1550,9 +1556,9 @@ function UserMenu({
|
|
|
1550
1556
|
item.label
|
|
1551
1557
|
)
|
|
1552
1558
|
),
|
|
1553
|
-
onLogout && /* @__PURE__ */ (0,
|
|
1554
|
-
items.length > 0 && /* @__PURE__ */ (0,
|
|
1555
|
-
/* @__PURE__ */ (0,
|
|
1559
|
+
onLogout && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
|
|
1560
|
+
items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "-mx-1 my-1 h-px bg-border" }),
|
|
1561
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
1556
1562
|
"button",
|
|
1557
1563
|
{
|
|
1558
1564
|
type: "button",
|
|
@@ -1562,7 +1568,7 @@ function UserMenu({
|
|
|
1562
1568
|
setOpen(false);
|
|
1563
1569
|
},
|
|
1564
1570
|
children: [
|
|
1565
|
-
/* @__PURE__ */ (0,
|
|
1571
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_lucide_react7.LogOut, { className: "h-4 w-4" }),
|
|
1566
1572
|
logoutLabel
|
|
1567
1573
|
]
|
|
1568
1574
|
}
|
|
@@ -1574,7 +1580,7 @@ function UserMenu({
|
|
|
1574
1580
|
}
|
|
1575
1581
|
|
|
1576
1582
|
// src/components/app-shell.tsx
|
|
1577
|
-
var
|
|
1583
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
1578
1584
|
function AppShell({
|
|
1579
1585
|
brand,
|
|
1580
1586
|
brandCollapsed,
|
|
@@ -1593,7 +1599,7 @@ function AppShell({
|
|
|
1593
1599
|
}) {
|
|
1594
1600
|
const [collapsed, setCollapsed] = (0, import_react7.useState)(defaultCollapsed);
|
|
1595
1601
|
const [mobileOpen, setMobileOpen] = (0, import_react7.useState)(false);
|
|
1596
|
-
const nav = (isCollapsed, onNavigate) => /* @__PURE__ */ (0,
|
|
1602
|
+
const nav = (isCollapsed, onNavigate) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1597
1603
|
SidebarNav,
|
|
1598
1604
|
{
|
|
1599
1605
|
items: navItems,
|
|
@@ -1605,8 +1611,8 @@ function AppShell({
|
|
|
1605
1611
|
onNavigate
|
|
1606
1612
|
}
|
|
1607
1613
|
);
|
|
1608
|
-
return /* @__PURE__ */ (0,
|
|
1609
|
-
/* @__PURE__ */ (0,
|
|
1614
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex h-screen overflow-hidden bg-background", children: [
|
|
1615
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
1610
1616
|
"aside",
|
|
1611
1617
|
{
|
|
1612
1618
|
className: cn(
|
|
@@ -1614,22 +1620,22 @@ function AppShell({
|
|
|
1614
1620
|
collapsed ? "w-16" : "w-60"
|
|
1615
1621
|
),
|
|
1616
1622
|
children: [
|
|
1617
|
-
/* @__PURE__ */ (0,
|
|
1618
|
-
/* @__PURE__ */ (0,
|
|
1619
|
-
collapsible && /* @__PURE__ */ (0,
|
|
1623
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: collapsed ? brandCollapsed ?? brand : brand }),
|
|
1624
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(collapsed) }),
|
|
1625
|
+
collapsible && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "border-t p-2", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1620
1626
|
"button",
|
|
1621
1627
|
{
|
|
1622
1628
|
type: "button",
|
|
1623
1629
|
onClick: () => setCollapsed((v) => !v),
|
|
1624
1630
|
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",
|
|
1625
1631
|
"aria-label": collapsed ? "Expandir menu" : "Recolher menu",
|
|
1626
|
-
children: collapsed ? /* @__PURE__ */ (0,
|
|
1632
|
+
children: collapsed ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react8.ChevronRight, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react8.ChevronLeft, { className: "h-4 w-4" })
|
|
1627
1633
|
}
|
|
1628
1634
|
) })
|
|
1629
1635
|
]
|
|
1630
1636
|
}
|
|
1631
1637
|
),
|
|
1632
|
-
/* @__PURE__ */ (0,
|
|
1638
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
1633
1639
|
"div",
|
|
1634
1640
|
{
|
|
1635
1641
|
className: cn(
|
|
@@ -1638,8 +1644,8 @@ function AppShell({
|
|
|
1638
1644
|
),
|
|
1639
1645
|
onClick: () => setMobileOpen(false),
|
|
1640
1646
|
children: [
|
|
1641
|
-
/* @__PURE__ */ (0,
|
|
1642
|
-
/* @__PURE__ */ (0,
|
|
1647
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "absolute inset-0 bg-black/50" }),
|
|
1648
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
1643
1649
|
"div",
|
|
1644
1650
|
{
|
|
1645
1651
|
className: cn(
|
|
@@ -1648,32 +1654,32 @@ function AppShell({
|
|
|
1648
1654
|
),
|
|
1649
1655
|
onClick: (e) => e.stopPropagation(),
|
|
1650
1656
|
children: [
|
|
1651
|
-
/* @__PURE__ */ (0,
|
|
1652
|
-
/* @__PURE__ */ (0,
|
|
1657
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: brand }),
|
|
1658
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(false, () => setMobileOpen(false)) })
|
|
1653
1659
|
]
|
|
1654
1660
|
}
|
|
1655
1661
|
)
|
|
1656
1662
|
]
|
|
1657
1663
|
}
|
|
1658
1664
|
),
|
|
1659
|
-
/* @__PURE__ */ (0,
|
|
1660
|
-
/* @__PURE__ */ (0,
|
|
1661
|
-
/* @__PURE__ */ (0,
|
|
1665
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
|
|
1666
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("header", { className: "flex h-14 shrink-0 items-center gap-2 border-b bg-background px-4", children: [
|
|
1667
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1662
1668
|
"button",
|
|
1663
1669
|
{
|
|
1664
1670
|
type: "button",
|
|
1665
1671
|
onClick: () => setMobileOpen(true),
|
|
1666
1672
|
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",
|
|
1667
1673
|
"aria-label": "Abrir menu",
|
|
1668
|
-
children: /* @__PURE__ */ (0,
|
|
1674
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react8.Menu, { className: "h-4 w-4" })
|
|
1669
1675
|
}
|
|
1670
1676
|
),
|
|
1671
|
-
/* @__PURE__ */ (0,
|
|
1677
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "ml-auto flex items-center gap-2", children: [
|
|
1672
1678
|
headerActions,
|
|
1673
|
-
(user || onLogout) && /* @__PURE__ */ (0,
|
|
1679
|
+
(user || onLogout) && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(UserMenu, { user, items: userMenuItems, onLogout, renderLink })
|
|
1674
1680
|
] })
|
|
1675
1681
|
] }),
|
|
1676
|
-
/* @__PURE__ */ (0,
|
|
1682
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)("main", { className: "flex-1 overflow-y-auto", children })
|
|
1677
1683
|
] })
|
|
1678
1684
|
] });
|
|
1679
1685
|
}
|
|
@@ -1683,7 +1689,7 @@ var DropdownMenu3 = __toESM(require("@radix-ui/react-dropdown-menu"), 1);
|
|
|
1683
1689
|
var import_lucide_react9 = require("lucide-react");
|
|
1684
1690
|
var import_react8 = require("react");
|
|
1685
1691
|
var import_vaul4 = require("vaul");
|
|
1686
|
-
var
|
|
1692
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
1687
1693
|
var triggerClass = "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-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50";
|
|
1688
1694
|
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";
|
|
1689
1695
|
var sheetItemClass2 = "flex w-full cursor-pointer select-none items-center gap-3 rounded-md px-3 py-3 text-base outline-none transition-colors hover:bg-accent active:bg-accent disabled:pointer-events-none disabled:opacity-50";
|
|
@@ -1697,20 +1703,20 @@ function RowActionsMenu({
|
|
|
1697
1703
|
const isDesktop = useIsDesktop();
|
|
1698
1704
|
const [open, setOpen] = (0, import_react8.useState)(false);
|
|
1699
1705
|
if (actions.length === 0) return null;
|
|
1700
|
-
const trigger = /* @__PURE__ */ (0,
|
|
1706
|
+
const trigger = /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
1701
1707
|
"button",
|
|
1702
1708
|
{
|
|
1703
1709
|
type: "button",
|
|
1704
1710
|
disabled,
|
|
1705
1711
|
"aria-label": label,
|
|
1706
1712
|
className: triggerClass,
|
|
1707
|
-
children: /* @__PURE__ */ (0,
|
|
1713
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react9.MoreVertical, { className: "h-4 w-4" })
|
|
1708
1714
|
}
|
|
1709
1715
|
);
|
|
1710
1716
|
if (isDesktop) {
|
|
1711
|
-
return /* @__PURE__ */ (0,
|
|
1712
|
-
/* @__PURE__ */ (0,
|
|
1713
|
-
/* @__PURE__ */ (0,
|
|
1717
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(DropdownMenu3.Root, { open, onOpenChange: setOpen, modal: false, children: [
|
|
1718
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DropdownMenu3.Trigger, { asChild: true, children: trigger }),
|
|
1719
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DropdownMenu3.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
1714
1720
|
DropdownMenu3.Content,
|
|
1715
1721
|
{
|
|
1716
1722
|
align,
|
|
@@ -1721,7 +1727,7 @@ function RowActionsMenu({
|
|
|
1721
1727
|
itemClass2,
|
|
1722
1728
|
action.destructive && "text-destructive focus:bg-destructive/10"
|
|
1723
1729
|
);
|
|
1724
|
-
return action.href ? /* @__PURE__ */ (0,
|
|
1730
|
+
return action.href ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
1725
1731
|
DropdownMenu3.Item,
|
|
1726
1732
|
{
|
|
1727
1733
|
asChild: true,
|
|
@@ -1729,14 +1735,14 @@ function RowActionsMenu({
|
|
|
1729
1735
|
children: renderLink({
|
|
1730
1736
|
href: action.href,
|
|
1731
1737
|
className: cls,
|
|
1732
|
-
children: /* @__PURE__ */ (0,
|
|
1738
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, { children: [
|
|
1733
1739
|
action.icon,
|
|
1734
1740
|
action.label
|
|
1735
1741
|
] })
|
|
1736
1742
|
})
|
|
1737
1743
|
},
|
|
1738
1744
|
action.label
|
|
1739
|
-
) : /* @__PURE__ */ (0,
|
|
1745
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
1740
1746
|
DropdownMenu3.Item,
|
|
1741
1747
|
{
|
|
1742
1748
|
className: cls,
|
|
@@ -1754,23 +1760,23 @@ function RowActionsMenu({
|
|
|
1754
1760
|
) })
|
|
1755
1761
|
] });
|
|
1756
1762
|
}
|
|
1757
|
-
return /* @__PURE__ */ (0,
|
|
1758
|
-
/* @__PURE__ */ (0,
|
|
1759
|
-
/* @__PURE__ */ (0,
|
|
1760
|
-
/* @__PURE__ */ (0,
|
|
1761
|
-
/* @__PURE__ */ (0,
|
|
1762
|
-
/* @__PURE__ */ (0,
|
|
1763
|
-
/* @__PURE__ */ (0,
|
|
1763
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_vaul4.Drawer.Root, { open, onOpenChange: setOpen, children: [
|
|
1764
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_vaul4.Drawer.Trigger, { asChild: true, children: trigger }),
|
|
1765
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_vaul4.Drawer.Portal, { children: [
|
|
1766
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_vaul4.Drawer.Overlay, { className: "fixed inset-0 z-50 bg-black/80" }),
|
|
1767
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_vaul4.Drawer.Content, { className: "fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-2xl border bg-popover p-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] text-popover-foreground outline-none", children: [
|
|
1768
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_vaul4.Drawer.Title, { className: "sr-only", children: label }),
|
|
1769
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted" }),
|
|
1764
1770
|
actions.map((action) => {
|
|
1765
1771
|
const cls = cn(
|
|
1766
1772
|
sheetItemClass2,
|
|
1767
1773
|
action.destructive && "text-destructive"
|
|
1768
1774
|
);
|
|
1769
|
-
const inner = /* @__PURE__ */ (0,
|
|
1775
|
+
const inner = /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, { children: [
|
|
1770
1776
|
action.icon,
|
|
1771
1777
|
action.label
|
|
1772
1778
|
] });
|
|
1773
|
-
return action.href ? /* @__PURE__ */ (0,
|
|
1779
|
+
return action.href ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
1774
1780
|
"span",
|
|
1775
1781
|
{
|
|
1776
1782
|
onClick: () => setOpen(false),
|
|
@@ -1782,7 +1788,7 @@ function RowActionsMenu({
|
|
|
1782
1788
|
})
|
|
1783
1789
|
},
|
|
1784
1790
|
action.label
|
|
1785
|
-
) : /* @__PURE__ */ (0,
|
|
1791
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
1786
1792
|
"button",
|
|
1787
1793
|
{
|
|
1788
1794
|
type: "button",
|
|
@@ -1850,6 +1856,7 @@ function useCustomToast() {
|
|
|
1850
1856
|
0 && (module.exports = {
|
|
1851
1857
|
AppShell,
|
|
1852
1858
|
AuthCard,
|
|
1859
|
+
BaseDialog,
|
|
1853
1860
|
ColorPicker,
|
|
1854
1861
|
Combobox,
|
|
1855
1862
|
ConfirmDialog,
|