@motor-hero/ui-kit 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -742,31 +742,109 @@ function Combobox({
742
742
  ] });
743
743
  }
744
744
 
745
- // src/components/stat-card.tsx
745
+ // src/components/color-picker.tsx
746
+ import * as PopoverPrimitive2 from "@radix-ui/react-popover";
747
+ import { ChevronsUpDown as ChevronsUpDown2 } from "lucide-react";
748
+ import * as React6 from "react";
749
+ import { HexColorInput, HexColorPicker } from "react-colorful";
746
750
  import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
751
+ function ColorPicker({
752
+ value,
753
+ onChange,
754
+ placeholder = "Selecionar cor",
755
+ disabled,
756
+ id,
757
+ className,
758
+ "aria-invalid": ariaInvalid,
759
+ "aria-describedby": ariaDescribedby
760
+ }) {
761
+ const [open, setOpen] = React6.useState(false);
762
+ const color = value || "";
763
+ return /* @__PURE__ */ jsxs15(PopoverPrimitive2.Root, { open, onOpenChange: setOpen, modal: true, children: [
764
+ /* @__PURE__ */ jsx17(PopoverPrimitive2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs15(
765
+ "button",
766
+ {
767
+ type: "button",
768
+ id,
769
+ "aria-invalid": ariaInvalid,
770
+ "aria-describedby": ariaDescribedby,
771
+ disabled,
772
+ className: cn(
773
+ "flex h-9 w-full cursor-pointer items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:focus-visible:ring-destructive",
774
+ className
775
+ ),
776
+ children: [
777
+ /* @__PURE__ */ jsxs15("span", { className: "flex items-center gap-2 truncate", children: [
778
+ /* @__PURE__ */ jsx17(
779
+ "span",
780
+ {
781
+ "aria-hidden": true,
782
+ className: cn(
783
+ "h-5 w-5 shrink-0 rounded border border-border",
784
+ !color && "bg-[length:8px_8px] bg-[position:0_0,4px_4px]"
785
+ ),
786
+ style: color ? { backgroundColor: color } : {
787
+ backgroundImage: "linear-gradient(45deg,var(--color-muted) 25%,transparent 25%,transparent 75%,var(--color-muted) 75%),linear-gradient(45deg,var(--color-muted) 25%,transparent 25%,transparent 75%,var(--color-muted) 75%)"
788
+ }
789
+ }
790
+ ),
791
+ /* @__PURE__ */ jsx17("span", { className: cn("truncate", !color && "text-muted-foreground"), children: color || placeholder })
792
+ ] }),
793
+ /* @__PURE__ */ jsx17(ChevronsUpDown2, { className: "h-4 w-4 shrink-0 opacity-50" })
794
+ ]
795
+ }
796
+ ) }),
797
+ /* @__PURE__ */ jsx17(PopoverPrimitive2.Portal, { children: /* @__PURE__ */ jsx17(
798
+ PopoverPrimitive2.Content,
799
+ {
800
+ align: "start",
801
+ sideOffset: 4,
802
+ className: "z-50 w-56 rounded-md border bg-popover p-3 text-popover-foreground shadow-md",
803
+ children: /* @__PURE__ */ jsxs15("div", { className: "mh-color-picker flex flex-col gap-3", children: [
804
+ /* @__PURE__ */ jsx17(HexColorPicker, { color, onChange }),
805
+ /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-2", children: [
806
+ /* @__PURE__ */ jsx17("span", { className: "text-sm text-muted-foreground", children: "#" }),
807
+ /* @__PURE__ */ jsx17(
808
+ HexColorInput,
809
+ {
810
+ color,
811
+ onChange,
812
+ prefixed: false,
813
+ className: "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm uppercase shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
814
+ }
815
+ )
816
+ ] })
817
+ ] })
818
+ }
819
+ ) })
820
+ ] });
821
+ }
822
+
823
+ // src/components/stat-card.tsx
824
+ import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
747
825
  function StatCard({ label, value, detail, icon, isLoading }) {
748
826
  if (isLoading) {
749
- return /* @__PURE__ */ jsxs15("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
750
- /* @__PURE__ */ jsxs15("div", { className: "flex items-center justify-between pb-2", children: [
751
- /* @__PURE__ */ jsx17("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
752
- /* @__PURE__ */ jsx17("div", { className: "h-4 w-4 animate-pulse rounded bg-muted" })
827
+ return /* @__PURE__ */ jsxs16("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
828
+ /* @__PURE__ */ jsxs16("div", { className: "flex items-center justify-between pb-2", children: [
829
+ /* @__PURE__ */ jsx18("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
830
+ /* @__PURE__ */ jsx18("div", { className: "h-4 w-4 animate-pulse rounded bg-muted" })
753
831
  ] }),
754
- /* @__PURE__ */ jsx17("div", { className: "mt-2 h-7 w-16 animate-pulse rounded bg-muted" }),
755
- /* @__PURE__ */ jsx17("div", { className: "mt-1 h-4 w-20 animate-pulse rounded bg-muted" })
832
+ /* @__PURE__ */ jsx18("div", { className: "mt-2 h-7 w-16 animate-pulse rounded bg-muted" }),
833
+ /* @__PURE__ */ jsx18("div", { className: "mt-1 h-4 w-20 animate-pulse rounded bg-muted" })
756
834
  ] });
757
835
  }
758
- return /* @__PURE__ */ jsxs15("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
759
- /* @__PURE__ */ jsxs15("div", { className: "flex items-center justify-between pb-2", children: [
760
- /* @__PURE__ */ jsx17("span", { className: "text-sm font-medium text-muted-foreground", children: label }),
761
- icon && /* @__PURE__ */ jsx17("span", { className: "text-muted-foreground", children: icon })
836
+ return /* @__PURE__ */ jsxs16("div", { className: "rounded-lg border bg-card p-6 shadow-sm", children: [
837
+ /* @__PURE__ */ jsxs16("div", { className: "flex items-center justify-between pb-2", children: [
838
+ /* @__PURE__ */ jsx18("span", { className: "text-sm font-medium text-muted-foreground", children: label }),
839
+ icon && /* @__PURE__ */ jsx18("span", { className: "text-muted-foreground", children: icon })
762
840
  ] }),
763
- /* @__PURE__ */ jsx17("div", { className: "text-2xl font-bold", children: value }),
764
- detail && /* @__PURE__ */ jsx17("p", { className: "text-xs text-muted-foreground", children: detail })
841
+ /* @__PURE__ */ jsx18("div", { className: "text-2xl font-bold", children: value }),
842
+ detail && /* @__PURE__ */ jsx18("p", { className: "text-xs text-muted-foreground", children: detail })
765
843
  ] });
766
844
  }
767
845
 
768
846
  // src/components/data-table-wrapper.tsx
769
- import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
847
+ import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
770
848
  function DataTableWrapper({
771
849
  children,
772
850
  isEmpty,
@@ -779,15 +857,15 @@ function DataTableWrapper({
779
857
  hasNextPage = false,
780
858
  hasPreviousPage = false
781
859
  }) {
782
- return /* @__PURE__ */ jsxs16("div", { className: "space-y-4", children: [
783
- /* @__PURE__ */ jsx18("div", { className: "overflow-x-auto rounded-md border", children }),
784
- !isLoading && isEmpty && /* @__PURE__ */ jsxs16("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
785
- emptyIcon && /* @__PURE__ */ jsx18("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
786
- /* @__PURE__ */ jsx18("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
787
- emptyDescription && /* @__PURE__ */ jsx18("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
860
+ return /* @__PURE__ */ jsxs17("div", { className: "space-y-4", children: [
861
+ /* @__PURE__ */ jsx19("div", { className: "overflow-x-auto rounded-md border", children }),
862
+ !isLoading && isEmpty && /* @__PURE__ */ jsxs17("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
863
+ emptyIcon && /* @__PURE__ */ jsx19("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
864
+ /* @__PURE__ */ jsx19("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
865
+ emptyDescription && /* @__PURE__ */ jsx19("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
788
866
  ] }),
789
- page !== void 0 && onPageChange && /* @__PURE__ */ jsxs16("div", { className: "flex items-center justify-end gap-4", children: [
790
- /* @__PURE__ */ jsx18(
867
+ page !== void 0 && onPageChange && /* @__PURE__ */ jsxs17("div", { className: "flex items-center justify-end gap-4", children: [
868
+ /* @__PURE__ */ jsx19(
791
869
  "button",
792
870
  {
793
871
  type: "button",
@@ -797,11 +875,11 @@ function DataTableWrapper({
797
875
  children: "Anterior"
798
876
  }
799
877
  ),
800
- /* @__PURE__ */ jsxs16("span", { className: "text-sm text-muted-foreground", children: [
878
+ /* @__PURE__ */ jsxs17("span", { className: "text-sm text-muted-foreground", children: [
801
879
  "P\xE1gina ",
802
880
  page
803
881
  ] }),
804
- /* @__PURE__ */ jsx18(
882
+ /* @__PURE__ */ jsx19(
805
883
  "button",
806
884
  {
807
885
  type: "button",
@@ -817,7 +895,7 @@ function DataTableWrapper({
817
895
 
818
896
  // src/components/mobile-card-list.tsx
819
897
  import { useRef } from "react";
820
- import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
898
+ import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
821
899
  var SCROLL_THRESHOLD = 8;
822
900
  function MobileCardList({
823
901
  data,
@@ -848,26 +926,26 @@ function MobileCardList({
848
926
  }
849
927
  };
850
928
  if (isLoading) {
851
- return /* @__PURE__ */ jsx19("div", { className: `space-y-3 ${className ?? ""}`, children: Array.from({ length: loadingCount }).map((_, i) => /* @__PURE__ */ jsx19("div", { className: "rounded-xl border p-4", children: /* @__PURE__ */ jsxs17("div", { className: "space-y-3", children: [
852
- /* @__PURE__ */ jsxs17("div", { className: "flex justify-between", children: [
853
- /* @__PURE__ */ jsx19("div", { className: "h-5 w-32 animate-pulse rounded bg-muted" }),
854
- /* @__PURE__ */ jsx19("div", { className: "h-5 w-16 animate-pulse rounded bg-muted" })
929
+ return /* @__PURE__ */ jsx20("div", { className: `space-y-3 ${className ?? ""}`, children: Array.from({ length: loadingCount }).map((_, i) => /* @__PURE__ */ jsx20("div", { className: "rounded-xl border p-4", children: /* @__PURE__ */ jsxs18("div", { className: "space-y-3", children: [
930
+ /* @__PURE__ */ jsxs18("div", { className: "flex justify-between", children: [
931
+ /* @__PURE__ */ jsx20("div", { className: "h-5 w-32 animate-pulse rounded bg-muted" }),
932
+ /* @__PURE__ */ jsx20("div", { className: "h-5 w-16 animate-pulse rounded bg-muted" })
855
933
  ] }),
856
- /* @__PURE__ */ jsx19("div", { className: "h-4 w-48 animate-pulse rounded bg-muted" }),
857
- /* @__PURE__ */ jsxs17("div", { className: "flex justify-between", children: [
858
- /* @__PURE__ */ jsx19("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
859
- /* @__PURE__ */ jsx19("div", { className: "h-4 w-20 animate-pulse rounded bg-muted" })
934
+ /* @__PURE__ */ jsx20("div", { className: "h-4 w-48 animate-pulse rounded bg-muted" }),
935
+ /* @__PURE__ */ jsxs18("div", { className: "flex justify-between", children: [
936
+ /* @__PURE__ */ jsx20("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }),
937
+ /* @__PURE__ */ jsx20("div", { className: "h-4 w-20 animate-pulse rounded bg-muted" })
860
938
  ] })
861
939
  ] }) }, i)) });
862
940
  }
863
- return /* @__PURE__ */ jsx19(
941
+ return /* @__PURE__ */ jsx20(
864
942
  "div",
865
943
  {
866
944
  className: `space-y-3 ${className ?? ""}`,
867
945
  onTouchStart,
868
946
  onTouchMove,
869
947
  onClickCapture,
870
- children: data.map((item, index) => /* @__PURE__ */ jsx19(
948
+ children: data.map((item, index) => /* @__PURE__ */ jsx20(
871
949
  "div",
872
950
  {
873
951
  className: "rounded-xl border p-4 transition-all duration-150 hover:border-foreground/20 active:scale-[0.99]",
@@ -880,7 +958,7 @@ function MobileCardList({
880
958
  }
881
959
 
882
960
  // src/components/responsive-data-view.tsx
883
- import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
961
+ import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
884
962
  function ResponsiveDataView({
885
963
  table,
886
964
  cards,
@@ -891,13 +969,13 @@ function ResponsiveDataView({
891
969
  emptyDescription,
892
970
  pagination
893
971
  }) {
894
- return /* @__PURE__ */ jsxs18("div", { className: "space-y-4", children: [
895
- /* @__PURE__ */ jsx20("div", { className: "hidden overflow-x-auto rounded-md border md:block", children: table }),
896
- /* @__PURE__ */ jsx20("div", { className: "md:hidden", children: cards }),
897
- !isLoading && isEmpty && /* @__PURE__ */ jsxs18("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
898
- emptyIcon && /* @__PURE__ */ jsx20("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
899
- /* @__PURE__ */ jsx20("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
900
- emptyDescription && /* @__PURE__ */ jsx20("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
972
+ return /* @__PURE__ */ jsxs19("div", { className: "space-y-4", children: [
973
+ /* @__PURE__ */ jsx21("div", { className: "hidden overflow-x-auto rounded-md border md:block", children: table }),
974
+ /* @__PURE__ */ jsx21("div", { className: "md:hidden", children: cards }),
975
+ !isLoading && isEmpty && /* @__PURE__ */ jsxs19("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [
976
+ emptyIcon && /* @__PURE__ */ jsx21("div", { className: "mb-4 text-muted-foreground", children: emptyIcon }),
977
+ /* @__PURE__ */ jsx21("h3", { className: "text-lg font-semibold tracking-tight", children: emptyTitle }),
978
+ emptyDescription && /* @__PURE__ */ jsx21("p", { className: "mt-1 max-w-sm text-sm text-muted-foreground", children: emptyDescription })
901
979
  ] }),
902
980
  pagination
903
981
  ] });
@@ -905,10 +983,10 @@ function ResponsiveDataView({
905
983
 
906
984
  // src/components/toaster.tsx
907
985
  import { Toaster as Sonner } from "sonner";
908
- import { jsx as jsx21 } from "react/jsx-runtime";
986
+ import { jsx as jsx22 } from "react/jsx-runtime";
909
987
  function Toaster(props) {
910
988
  const { theme = "system" } = useTheme();
911
- return /* @__PURE__ */ jsx21(
989
+ return /* @__PURE__ */ jsx22(
912
990
  Sonner,
913
991
  {
914
992
  theme,
@@ -930,17 +1008,17 @@ function Toaster(props) {
930
1008
 
931
1009
  // src/components/app-shell.tsx
932
1010
  import { ChevronLeft, ChevronRight, Menu } from "lucide-react";
933
- import { useState as useState7 } from "react";
1011
+ import { useState as useState8 } from "react";
934
1012
 
935
1013
  // src/components/sidebar-nav.tsx
936
1014
  import { Fragment as Fragment3 } from "react";
937
1015
 
938
1016
  // src/components/types.tsx
939
- import { jsx as jsx22 } from "react/jsx-runtime";
940
- var defaultRenderLink = ({ children, ...props }) => /* @__PURE__ */ jsx22("a", { ...props, children });
1017
+ import { jsx as jsx23 } from "react/jsx-runtime";
1018
+ var defaultRenderLink = ({ children, ...props }) => /* @__PURE__ */ jsx23("a", { ...props, children });
941
1019
 
942
1020
  // src/components/sidebar-nav.tsx
943
- import { Fragment as Fragment4, jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
1021
+ import { Fragment as Fragment4, jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
944
1022
  function defaultIsActive(item, activePath) {
945
1023
  if (item.href === "/") return activePath === "/";
946
1024
  return activePath === item.href || activePath.startsWith(item.href + "/");
@@ -955,7 +1033,7 @@ function SidebarNav({
955
1033
  onNavigate
956
1034
  }) {
957
1035
  const visible = items.filter((item) => !item.adminOnly || isAdmin);
958
- return /* @__PURE__ */ jsx23("nav", { className: "flex flex-col gap-1", children: visible.map((item) => {
1036
+ return /* @__PURE__ */ jsx24("nav", { className: "flex flex-col gap-1", children: visible.map((item) => {
959
1037
  const active = isActive(item, activePath);
960
1038
  const link = renderLink({
961
1039
  href: item.href,
@@ -967,21 +1045,21 @@ function SidebarNav({
967
1045
  active ? "bg-accent text-accent-foreground font-semibold" : "text-muted-foreground hover:bg-accent hover:text-accent-foreground",
968
1046
  isCollapsed && "justify-center px-2"
969
1047
  ),
970
- children: /* @__PURE__ */ jsxs19(Fragment4, { children: [
971
- item.icon && /* @__PURE__ */ jsx23("span", { className: "shrink-0", children: item.icon }),
972
- !isCollapsed && /* @__PURE__ */ jsx23("span", { className: "truncate", children: item.label })
1048
+ children: /* @__PURE__ */ jsxs20(Fragment4, { children: [
1049
+ item.icon && /* @__PURE__ */ jsx24("span", { className: "shrink-0", children: item.icon }),
1050
+ !isCollapsed && /* @__PURE__ */ jsx24("span", { className: "truncate", children: item.label })
973
1051
  ] })
974
1052
  });
975
- return /* @__PURE__ */ jsx23(Fragment3, { children: link }, item.href);
1053
+ return /* @__PURE__ */ jsx24(Fragment3, { children: link }, item.href);
976
1054
  }) });
977
1055
  }
978
1056
 
979
1057
  // src/components/user-menu.tsx
980
1058
  import * as DropdownMenu2 from "@radix-ui/react-dropdown-menu";
981
1059
  import { LogOut, User } from "lucide-react";
982
- import { useState as useState6 } from "react";
1060
+ import { useState as useState7 } from "react";
983
1061
  import { Drawer as DrawerPrimitive2 } from "vaul";
984
- import { Fragment as Fragment5, jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
1062
+ import { Fragment as Fragment5, jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
985
1063
  function initials(user) {
986
1064
  const source = user?.name?.trim() || user?.email?.trim();
987
1065
  if (!source) return "";
@@ -1000,52 +1078,52 @@ function UserMenu({
1000
1078
  align = "end"
1001
1079
  }) {
1002
1080
  const isDesktop = useIsDesktop();
1003
- const [open, setOpen] = useState6(false);
1081
+ const [open, setOpen] = useState7(false);
1004
1082
  const label = initials(user);
1005
- const trigger = /* @__PURE__ */ jsx24(
1083
+ const trigger = /* @__PURE__ */ jsx25(
1006
1084
  "button",
1007
1085
  {
1008
1086
  type: "button",
1009
1087
  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",
1010
1088
  "aria-label": "Menu do usu\xE1rio",
1011
1089
  "data-testid": "user-menu",
1012
- children: user?.avatarUrl ? /* @__PURE__ */ jsx24(
1090
+ children: user?.avatarUrl ? /* @__PURE__ */ jsx25(
1013
1091
  "img",
1014
1092
  {
1015
1093
  src: user.avatarUrl,
1016
1094
  alt: user.name ?? user.email ?? "Avatar",
1017
1095
  className: "h-full w-full object-cover"
1018
1096
  }
1019
- ) : label ? /* @__PURE__ */ jsx24("span", { children: label }) : /* @__PURE__ */ jsx24(User, { className: "h-4 w-4" })
1097
+ ) : label ? /* @__PURE__ */ jsx25("span", { children: label }) : /* @__PURE__ */ jsx25(User, { className: "h-4 w-4" })
1020
1098
  }
1021
1099
  );
1022
- const userInfo = (user?.name || user?.email) && /* @__PURE__ */ jsxs20("div", { className: "px-2 py-1.5", children: [
1023
- user.name && /* @__PURE__ */ jsx24("p", { className: "truncate text-sm font-medium", children: user.name }),
1024
- user.email && /* @__PURE__ */ jsx24("p", { className: "truncate text-xs text-muted-foreground", children: user.email })
1100
+ const userInfo = (user?.name || user?.email) && /* @__PURE__ */ jsxs21("div", { className: "px-2 py-1.5", children: [
1101
+ user.name && /* @__PURE__ */ jsx25("p", { className: "truncate text-sm font-medium", children: user.name }),
1102
+ user.email && /* @__PURE__ */ jsx25("p", { className: "truncate text-xs text-muted-foreground", children: user.email })
1025
1103
  ] });
1026
1104
  if (isDesktop) {
1027
- return /* @__PURE__ */ jsxs20(DropdownMenu2.Root, { open, onOpenChange: setOpen, children: [
1028
- /* @__PURE__ */ jsx24(DropdownMenu2.Trigger, { asChild: true, children: trigger }),
1029
- /* @__PURE__ */ jsx24(DropdownMenu2.Portal, { children: /* @__PURE__ */ jsxs20(
1105
+ return /* @__PURE__ */ jsxs21(DropdownMenu2.Root, { open, onOpenChange: setOpen, children: [
1106
+ /* @__PURE__ */ jsx25(DropdownMenu2.Trigger, { asChild: true, children: trigger }),
1107
+ /* @__PURE__ */ jsx25(DropdownMenu2.Portal, { children: /* @__PURE__ */ jsxs21(
1030
1108
  DropdownMenu2.Content,
1031
1109
  {
1032
1110
  align,
1033
1111
  sideOffset: 6,
1034
1112
  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",
1035
1113
  children: [
1036
- userInfo && /* @__PURE__ */ jsxs20(Fragment5, { children: [
1114
+ userInfo && /* @__PURE__ */ jsxs21(Fragment5, { children: [
1037
1115
  userInfo,
1038
- /* @__PURE__ */ jsx24(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" })
1116
+ /* @__PURE__ */ jsx25(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" })
1039
1117
  ] }),
1040
1118
  items.map(
1041
- (item) => item.href ? /* @__PURE__ */ jsx24(DropdownMenu2.Item, { asChild: true, children: renderLink({
1119
+ (item) => item.href ? /* @__PURE__ */ jsx25(DropdownMenu2.Item, { asChild: true, children: renderLink({
1042
1120
  href: item.href,
1043
1121
  className: itemClass,
1044
- children: /* @__PURE__ */ jsxs20(Fragment5, { children: [
1122
+ children: /* @__PURE__ */ jsxs21(Fragment5, { children: [
1045
1123
  item.icon,
1046
1124
  item.label
1047
1125
  ] })
1048
- }) }, item.label) : /* @__PURE__ */ jsxs20(
1126
+ }) }, item.label) : /* @__PURE__ */ jsxs21(
1049
1127
  DropdownMenu2.Item,
1050
1128
  {
1051
1129
  className: itemClass,
@@ -1058,9 +1136,9 @@ function UserMenu({
1058
1136
  item.label
1059
1137
  )
1060
1138
  ),
1061
- onLogout && /* @__PURE__ */ jsxs20(Fragment5, { children: [
1062
- items.length > 0 && /* @__PURE__ */ jsx24(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" }),
1063
- /* @__PURE__ */ jsxs20(
1139
+ onLogout && /* @__PURE__ */ jsxs21(Fragment5, { children: [
1140
+ items.length > 0 && /* @__PURE__ */ jsx25(DropdownMenu2.Separator, { className: "-mx-1 my-1 h-px bg-border" }),
1141
+ /* @__PURE__ */ jsxs21(
1064
1142
  DropdownMenu2.Item,
1065
1143
  {
1066
1144
  className: cn(
@@ -1069,7 +1147,7 @@ function UserMenu({
1069
1147
  ),
1070
1148
  onClick: onLogout,
1071
1149
  children: [
1072
- /* @__PURE__ */ jsx24(LogOut, { className: "h-4 w-4" }),
1150
+ /* @__PURE__ */ jsx25(LogOut, { className: "h-4 w-4" }),
1073
1151
  logoutLabel
1074
1152
  ]
1075
1153
  }
@@ -1080,19 +1158,19 @@ function UserMenu({
1080
1158
  ) })
1081
1159
  ] });
1082
1160
  }
1083
- return /* @__PURE__ */ jsxs20(DrawerPrimitive2.Root, { open, onOpenChange: setOpen, children: [
1084
- /* @__PURE__ */ jsx24(DrawerPrimitive2.Trigger, { asChild: true, children: trigger }),
1085
- /* @__PURE__ */ jsxs20(DrawerPrimitive2.Portal, { children: [
1086
- /* @__PURE__ */ jsx24(DrawerPrimitive2.Overlay, { className: "fixed inset-0 z-50 bg-black/80" }),
1087
- /* @__PURE__ */ jsxs20(DrawerPrimitive2.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: [
1088
- /* @__PURE__ */ jsx24(DrawerPrimitive2.Title, { className: "sr-only", children: "Menu do usu\xE1rio" }),
1089
- /* @__PURE__ */ jsx24("div", { className: "mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted" }),
1090
- userInfo && /* @__PURE__ */ jsxs20(Fragment5, { children: [
1161
+ return /* @__PURE__ */ jsxs21(DrawerPrimitive2.Root, { open, onOpenChange: setOpen, children: [
1162
+ /* @__PURE__ */ jsx25(DrawerPrimitive2.Trigger, { asChild: true, children: trigger }),
1163
+ /* @__PURE__ */ jsxs21(DrawerPrimitive2.Portal, { children: [
1164
+ /* @__PURE__ */ jsx25(DrawerPrimitive2.Overlay, { className: "fixed inset-0 z-50 bg-black/80" }),
1165
+ /* @__PURE__ */ jsxs21(DrawerPrimitive2.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: [
1166
+ /* @__PURE__ */ jsx25(DrawerPrimitive2.Title, { className: "sr-only", children: "Menu do usu\xE1rio" }),
1167
+ /* @__PURE__ */ jsx25("div", { className: "mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted" }),
1168
+ userInfo && /* @__PURE__ */ jsxs21(Fragment5, { children: [
1091
1169
  userInfo,
1092
- /* @__PURE__ */ jsx24("div", { className: "-mx-1 my-1 h-px bg-border" })
1170
+ /* @__PURE__ */ jsx25("div", { className: "-mx-1 my-1 h-px bg-border" })
1093
1171
  ] }),
1094
1172
  items.map(
1095
- (item) => item.href ? /* @__PURE__ */ jsx24(
1173
+ (item) => item.href ? /* @__PURE__ */ jsx25(
1096
1174
  "span",
1097
1175
  {
1098
1176
  onClick: () => setOpen(false),
@@ -1100,14 +1178,14 @@ function UserMenu({
1100
1178
  children: renderLink({
1101
1179
  href: item.href,
1102
1180
  className: sheetItemClass,
1103
- children: /* @__PURE__ */ jsxs20(Fragment5, { children: [
1181
+ children: /* @__PURE__ */ jsxs21(Fragment5, { children: [
1104
1182
  item.icon,
1105
1183
  item.label
1106
1184
  ] })
1107
1185
  })
1108
1186
  },
1109
1187
  item.label
1110
- ) : /* @__PURE__ */ jsxs20(
1188
+ ) : /* @__PURE__ */ jsxs21(
1111
1189
  "button",
1112
1190
  {
1113
1191
  type: "button",
@@ -1124,9 +1202,9 @@ function UserMenu({
1124
1202
  item.label
1125
1203
  )
1126
1204
  ),
1127
- onLogout && /* @__PURE__ */ jsxs20(Fragment5, { children: [
1128
- items.length > 0 && /* @__PURE__ */ jsx24("div", { className: "-mx-1 my-1 h-px bg-border" }),
1129
- /* @__PURE__ */ jsxs20(
1205
+ onLogout && /* @__PURE__ */ jsxs21(Fragment5, { children: [
1206
+ items.length > 0 && /* @__PURE__ */ jsx25("div", { className: "-mx-1 my-1 h-px bg-border" }),
1207
+ /* @__PURE__ */ jsxs21(
1130
1208
  "button",
1131
1209
  {
1132
1210
  type: "button",
@@ -1136,7 +1214,7 @@ function UserMenu({
1136
1214
  setOpen(false);
1137
1215
  },
1138
1216
  children: [
1139
- /* @__PURE__ */ jsx24(LogOut, { className: "h-4 w-4" }),
1217
+ /* @__PURE__ */ jsx25(LogOut, { className: "h-4 w-4" }),
1140
1218
  logoutLabel
1141
1219
  ]
1142
1220
  }
@@ -1148,7 +1226,7 @@ function UserMenu({
1148
1226
  }
1149
1227
 
1150
1228
  // src/components/app-shell.tsx
1151
- import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
1229
+ import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
1152
1230
  function AppShell({
1153
1231
  brand,
1154
1232
  brandCollapsed,
@@ -1165,9 +1243,9 @@ function AppShell({
1165
1243
  defaultCollapsed = false,
1166
1244
  children
1167
1245
  }) {
1168
- const [collapsed, setCollapsed] = useState7(defaultCollapsed);
1169
- const [mobileOpen, setMobileOpen] = useState7(false);
1170
- const nav = (isCollapsed, onNavigate) => /* @__PURE__ */ jsx25(
1246
+ const [collapsed, setCollapsed] = useState8(defaultCollapsed);
1247
+ const [mobileOpen, setMobileOpen] = useState8(false);
1248
+ const nav = (isCollapsed, onNavigate) => /* @__PURE__ */ jsx26(
1171
1249
  SidebarNav,
1172
1250
  {
1173
1251
  items: navItems,
@@ -1179,8 +1257,8 @@ function AppShell({
1179
1257
  onNavigate
1180
1258
  }
1181
1259
  );
1182
- return /* @__PURE__ */ jsxs21("div", { className: "flex h-screen overflow-hidden bg-background", children: [
1183
- /* @__PURE__ */ jsxs21(
1260
+ return /* @__PURE__ */ jsxs22("div", { className: "flex h-screen overflow-hidden bg-background", children: [
1261
+ /* @__PURE__ */ jsxs22(
1184
1262
  "aside",
1185
1263
  {
1186
1264
  className: cn(
@@ -1188,22 +1266,22 @@ function AppShell({
1188
1266
  collapsed ? "w-16" : "w-60"
1189
1267
  ),
1190
1268
  children: [
1191
- /* @__PURE__ */ jsx25("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: collapsed ? brandCollapsed ?? brand : brand }),
1192
- /* @__PURE__ */ jsx25("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(collapsed) }),
1193
- collapsible && /* @__PURE__ */ jsx25("div", { className: "border-t p-2", children: /* @__PURE__ */ jsx25(
1269
+ /* @__PURE__ */ jsx26("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: collapsed ? brandCollapsed ?? brand : brand }),
1270
+ /* @__PURE__ */ jsx26("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(collapsed) }),
1271
+ collapsible && /* @__PURE__ */ jsx26("div", { className: "border-t p-2", children: /* @__PURE__ */ jsx26(
1194
1272
  "button",
1195
1273
  {
1196
1274
  type: "button",
1197
1275
  onClick: () => setCollapsed((v) => !v),
1198
1276
  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",
1199
1277
  "aria-label": collapsed ? "Expandir menu" : "Recolher menu",
1200
- children: collapsed ? /* @__PURE__ */ jsx25(ChevronRight, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx25(ChevronLeft, { className: "h-4 w-4" })
1278
+ children: collapsed ? /* @__PURE__ */ jsx26(ChevronRight, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx26(ChevronLeft, { className: "h-4 w-4" })
1201
1279
  }
1202
1280
  ) })
1203
1281
  ]
1204
1282
  }
1205
1283
  ),
1206
- /* @__PURE__ */ jsxs21(
1284
+ /* @__PURE__ */ jsxs22(
1207
1285
  "div",
1208
1286
  {
1209
1287
  className: cn(
@@ -1212,8 +1290,8 @@ function AppShell({
1212
1290
  ),
1213
1291
  onClick: () => setMobileOpen(false),
1214
1292
  children: [
1215
- /* @__PURE__ */ jsx25("div", { className: "absolute inset-0 bg-black/50" }),
1216
- /* @__PURE__ */ jsxs21(
1293
+ /* @__PURE__ */ jsx26("div", { className: "absolute inset-0 bg-black/50" }),
1294
+ /* @__PURE__ */ jsxs22(
1217
1295
  "div",
1218
1296
  {
1219
1297
  className: cn(
@@ -1222,32 +1300,32 @@ function AppShell({
1222
1300
  ),
1223
1301
  onClick: (e) => e.stopPropagation(),
1224
1302
  children: [
1225
- /* @__PURE__ */ jsx25("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: brand }),
1226
- /* @__PURE__ */ jsx25("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(false, () => setMobileOpen(false)) })
1303
+ /* @__PURE__ */ jsx26("div", { className: "flex h-14 shrink-0 items-center border-b px-4", children: brand }),
1304
+ /* @__PURE__ */ jsx26("div", { className: "flex-1 overflow-y-auto px-2 py-4", children: nav(false, () => setMobileOpen(false)) })
1227
1305
  ]
1228
1306
  }
1229
1307
  )
1230
1308
  ]
1231
1309
  }
1232
1310
  ),
1233
- /* @__PURE__ */ jsxs21("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
1234
- /* @__PURE__ */ jsxs21("header", { className: "flex h-14 shrink-0 items-center gap-2 border-b bg-background px-4", children: [
1235
- /* @__PURE__ */ jsx25(
1311
+ /* @__PURE__ */ jsxs22("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
1312
+ /* @__PURE__ */ jsxs22("header", { className: "flex h-14 shrink-0 items-center gap-2 border-b bg-background px-4", children: [
1313
+ /* @__PURE__ */ jsx26(
1236
1314
  "button",
1237
1315
  {
1238
1316
  type: "button",
1239
1317
  onClick: () => setMobileOpen(true),
1240
1318
  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",
1241
1319
  "aria-label": "Abrir menu",
1242
- children: /* @__PURE__ */ jsx25(Menu, { className: "h-4 w-4" })
1320
+ children: /* @__PURE__ */ jsx26(Menu, { className: "h-4 w-4" })
1243
1321
  }
1244
1322
  ),
1245
- /* @__PURE__ */ jsxs21("div", { className: "ml-auto flex items-center gap-2", children: [
1323
+ /* @__PURE__ */ jsxs22("div", { className: "ml-auto flex items-center gap-2", children: [
1246
1324
  headerActions,
1247
- (user || onLogout) && /* @__PURE__ */ jsx25(UserMenu, { user, items: userMenuItems, onLogout, renderLink })
1325
+ (user || onLogout) && /* @__PURE__ */ jsx26(UserMenu, { user, items: userMenuItems, onLogout, renderLink })
1248
1326
  ] })
1249
1327
  ] }),
1250
- /* @__PURE__ */ jsx25("main", { className: "flex-1 overflow-y-auto", children })
1328
+ /* @__PURE__ */ jsx26("main", { className: "flex-1 overflow-y-auto", children })
1251
1329
  ] })
1252
1330
  ] });
1253
1331
  }
@@ -1255,9 +1333,9 @@ function AppShell({
1255
1333
  // src/components/row-actions-menu.tsx
1256
1334
  import * as DropdownMenu3 from "@radix-ui/react-dropdown-menu";
1257
1335
  import { MoreVertical } from "lucide-react";
1258
- import { useState as useState8 } from "react";
1336
+ import { useState as useState9 } from "react";
1259
1337
  import { Drawer as DrawerPrimitive3 } from "vaul";
1260
- import { Fragment as Fragment6, jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
1338
+ import { Fragment as Fragment6, jsx as jsx27, jsxs as jsxs23 } from "react/jsx-runtime";
1261
1339
  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";
1262
1340
  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";
1263
1341
  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";
@@ -1269,22 +1347,22 @@ function RowActionsMenu({
1269
1347
  renderLink = defaultRenderLink
1270
1348
  }) {
1271
1349
  const isDesktop = useIsDesktop();
1272
- const [open, setOpen] = useState8(false);
1350
+ const [open, setOpen] = useState9(false);
1273
1351
  if (actions.length === 0) return null;
1274
- const trigger = /* @__PURE__ */ jsx26(
1352
+ const trigger = /* @__PURE__ */ jsx27(
1275
1353
  "button",
1276
1354
  {
1277
1355
  type: "button",
1278
1356
  disabled,
1279
1357
  "aria-label": label,
1280
1358
  className: triggerClass,
1281
- children: /* @__PURE__ */ jsx26(MoreVertical, { className: "h-4 w-4" })
1359
+ children: /* @__PURE__ */ jsx27(MoreVertical, { className: "h-4 w-4" })
1282
1360
  }
1283
1361
  );
1284
1362
  if (isDesktop) {
1285
- return /* @__PURE__ */ jsxs22(DropdownMenu3.Root, { open, onOpenChange: setOpen, children: [
1286
- /* @__PURE__ */ jsx26(DropdownMenu3.Trigger, { asChild: true, children: trigger }),
1287
- /* @__PURE__ */ jsx26(DropdownMenu3.Portal, { children: /* @__PURE__ */ jsx26(
1363
+ return /* @__PURE__ */ jsxs23(DropdownMenu3.Root, { open, onOpenChange: setOpen, children: [
1364
+ /* @__PURE__ */ jsx27(DropdownMenu3.Trigger, { asChild: true, children: trigger }),
1365
+ /* @__PURE__ */ jsx27(DropdownMenu3.Portal, { children: /* @__PURE__ */ jsx27(
1288
1366
  DropdownMenu3.Content,
1289
1367
  {
1290
1368
  align,
@@ -1295,7 +1373,7 @@ function RowActionsMenu({
1295
1373
  itemClass2,
1296
1374
  action.destructive && "text-destructive focus:bg-destructive/10"
1297
1375
  );
1298
- return action.href ? /* @__PURE__ */ jsx26(
1376
+ return action.href ? /* @__PURE__ */ jsx27(
1299
1377
  DropdownMenu3.Item,
1300
1378
  {
1301
1379
  asChild: true,
@@ -1303,14 +1381,14 @@ function RowActionsMenu({
1303
1381
  children: renderLink({
1304
1382
  href: action.href,
1305
1383
  className: cls,
1306
- children: /* @__PURE__ */ jsxs22(Fragment6, { children: [
1384
+ children: /* @__PURE__ */ jsxs23(Fragment6, { children: [
1307
1385
  action.icon,
1308
1386
  action.label
1309
1387
  ] })
1310
1388
  })
1311
1389
  },
1312
1390
  action.label
1313
- ) : /* @__PURE__ */ jsxs22(
1391
+ ) : /* @__PURE__ */ jsxs23(
1314
1392
  DropdownMenu3.Item,
1315
1393
  {
1316
1394
  className: cls,
@@ -1328,23 +1406,23 @@ function RowActionsMenu({
1328
1406
  ) })
1329
1407
  ] });
1330
1408
  }
1331
- return /* @__PURE__ */ jsxs22(DrawerPrimitive3.Root, { open, onOpenChange: setOpen, children: [
1332
- /* @__PURE__ */ jsx26(DrawerPrimitive3.Trigger, { asChild: true, children: trigger }),
1333
- /* @__PURE__ */ jsxs22(DrawerPrimitive3.Portal, { children: [
1334
- /* @__PURE__ */ jsx26(DrawerPrimitive3.Overlay, { className: "fixed inset-0 z-50 bg-black/80" }),
1335
- /* @__PURE__ */ jsxs22(DrawerPrimitive3.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: [
1336
- /* @__PURE__ */ jsx26(DrawerPrimitive3.Title, { className: "sr-only", children: label }),
1337
- /* @__PURE__ */ jsx26("div", { className: "mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted" }),
1409
+ return /* @__PURE__ */ jsxs23(DrawerPrimitive3.Root, { open, onOpenChange: setOpen, children: [
1410
+ /* @__PURE__ */ jsx27(DrawerPrimitive3.Trigger, { asChild: true, children: trigger }),
1411
+ /* @__PURE__ */ jsxs23(DrawerPrimitive3.Portal, { children: [
1412
+ /* @__PURE__ */ jsx27(DrawerPrimitive3.Overlay, { className: "fixed inset-0 z-50 bg-black/80" }),
1413
+ /* @__PURE__ */ jsxs23(DrawerPrimitive3.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: [
1414
+ /* @__PURE__ */ jsx27(DrawerPrimitive3.Title, { className: "sr-only", children: label }),
1415
+ /* @__PURE__ */ jsx27("div", { className: "mx-auto my-3 h-1.5 w-12 shrink-0 rounded-full bg-muted" }),
1338
1416
  actions.map((action) => {
1339
1417
  const cls = cn(
1340
1418
  sheetItemClass2,
1341
1419
  action.destructive && "text-destructive"
1342
1420
  );
1343
- const inner = /* @__PURE__ */ jsxs22(Fragment6, { children: [
1421
+ const inner = /* @__PURE__ */ jsxs23(Fragment6, { children: [
1344
1422
  action.icon,
1345
1423
  action.label
1346
1424
  ] });
1347
- return action.href ? /* @__PURE__ */ jsx26(
1425
+ return action.href ? /* @__PURE__ */ jsx27(
1348
1426
  "span",
1349
1427
  {
1350
1428
  onClick: () => setOpen(false),
@@ -1356,7 +1434,7 @@ function RowActionsMenu({
1356
1434
  })
1357
1435
  },
1358
1436
  action.label
1359
- ) : /* @__PURE__ */ jsx26(
1437
+ ) : /* @__PURE__ */ jsx27(
1360
1438
  "button",
1361
1439
  {
1362
1440
  type: "button",
@@ -1386,9 +1464,9 @@ function extractApiError(err, fallbackMessage = "Ocorreu um erro inesperado.") {
1386
1464
  }
1387
1465
 
1388
1466
  // src/hooks/use-disclosure.ts
1389
- import { useCallback, useState as useState9 } from "react";
1467
+ import { useCallback, useState as useState10 } from "react";
1390
1468
  function useDisclosure(initial = false) {
1391
- const [open, setOpen] = useState9(initial);
1469
+ const [open, setOpen] = useState10(initial);
1392
1470
  const onOpen = useCallback(() => setOpen(true), []);
1393
1471
  const onClose = useCallback(() => setOpen(false), []);
1394
1472
  const onToggle = useCallback(() => setOpen((v) => !v), []);
@@ -1423,6 +1501,7 @@ function useCustomToast() {
1423
1501
  export {
1424
1502
  AppShell,
1425
1503
  AuthCard,
1504
+ ColorPicker,
1426
1505
  Combobox,
1427
1506
  ConfirmDialog,
1428
1507
  DataTableWrapper,