@snksergio/design-system 0.40.0 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist-lib/chunks/{avatar-DQYiVRlE.mjs → avatar-DFWEwBKu.mjs} +101 -51
  2. package/dist-lib/chunks/avatar-DFWEwBKu.mjs.map +1 -0
  3. package/dist-lib/chunks/{avatar-BiaG9OJS.cjs → avatar-eM5txRFZ.cjs} +53 -1
  4. package/dist-lib/chunks/avatar-eM5txRFZ.cjs.map +1 -0
  5. package/dist-lib/chunks/{input-CaC0B-_v.mjs → input-CfmzMYtd.mjs} +2 -2
  6. package/dist-lib/chunks/{input-CaC0B-_v.mjs.map → input-CfmzMYtd.mjs.map} +1 -1
  7. package/dist-lib/chunks/{input-DMH5rSP1.cjs → input-az2SuVXQ.cjs} +2 -2
  8. package/dist-lib/chunks/{input-DMH5rSP1.cjs.map → input-az2SuVXQ.cjs.map} +1 -1
  9. package/dist-lib/chunks/{kpi-delta-NnEu4oIs.cjs → kpi-delta-DAfakvFp.cjs} +3 -3
  10. package/dist-lib/chunks/{kpi-delta-NnEu4oIs.cjs.map → kpi-delta-DAfakvFp.cjs.map} +1 -1
  11. package/dist-lib/chunks/{kpi-delta-CjR0OsdC.mjs → kpi-delta-DaDwKOaP.mjs} +3 -3
  12. package/dist-lib/chunks/{kpi-delta-CjR0OsdC.mjs.map → kpi-delta-DaDwKOaP.mjs.map} +1 -1
  13. package/dist-lib/chunks/{page-header-DEGbgT4w.mjs → page-header--cPS_Z-a.mjs} +2 -2
  14. package/dist-lib/chunks/{page-header-DEGbgT4w.mjs.map → page-header--cPS_Z-a.mjs.map} +1 -1
  15. package/dist-lib/chunks/{page-header-Cp_9Wog4.cjs → page-header-DvAJoEfb.cjs} +2 -2
  16. package/dist-lib/chunks/{page-header-Cp_9Wog4.cjs.map → page-header-DvAJoEfb.cjs.map} +1 -1
  17. package/dist-lib/chunks/{panel-B1xKDbjB.mjs → panel-Bje0kUTh.mjs} +5 -5
  18. package/dist-lib/chunks/{panel-B1xKDbjB.mjs.map → panel-Bje0kUTh.mjs.map} +1 -1
  19. package/dist-lib/chunks/{panel-ma7e3s4C.cjs → panel-DtU3KlKY.cjs} +5 -5
  20. package/dist-lib/chunks/{panel-ma7e3s4C.cjs.map → panel-DtU3KlKY.cjs.map} +1 -1
  21. package/dist-lib/chunks/{textarea-DivoQmJw.mjs → textarea-BPRIHZVd.mjs} +2 -2
  22. package/dist-lib/chunks/{textarea-DivoQmJw.mjs.map → textarea-BPRIHZVd.mjs.map} +1 -1
  23. package/dist-lib/chunks/{textarea-c80RFmMP.cjs → textarea-K20CL_gF.cjs} +2 -2
  24. package/dist-lib/chunks/{textarea-c80RFmMP.cjs.map → textarea-K20CL_gF.cjs.map} +1 -1
  25. package/dist-lib/chunks/{tooltip-pvZ_X-Ub.cjs → toggle-group-BEPs3e0Y.cjs} +2 -54
  26. package/dist-lib/chunks/toggle-group-BEPs3e0Y.cjs.map +1 -0
  27. package/dist-lib/chunks/{tooltip-mMF4YHZg.mjs → toggle-group-XMO6ReVo.mjs} +77 -127
  28. package/dist-lib/chunks/toggle-group-XMO6ReVo.mjs.map +1 -0
  29. package/dist-lib/chunks/{useTheme-BD0nloAv.cjs → useTheme-3iZAognE.cjs} +876 -73
  30. package/dist-lib/chunks/useTheme-3iZAognE.cjs.map +1 -0
  31. package/dist-lib/chunks/{useTheme-D1QVzZDW.mjs → useTheme-B3ZakPqk.mjs} +886 -83
  32. package/dist-lib/chunks/useTheme-B3ZakPqk.mjs.map +1 -0
  33. package/dist-lib/index.cjs +40 -732
  34. package/dist-lib/index.cjs.map +1 -1
  35. package/dist-lib/index.mjs +94 -786
  36. package/dist-lib/index.mjs.map +1 -1
  37. package/dist-lib/preview/chat.cjs +3 -3
  38. package/dist-lib/preview/chat.mjs +3 -3
  39. package/dist-lib/preview/clientes.cjs +6 -6
  40. package/dist-lib/preview/clientes.mjs +6 -6
  41. package/dist-lib/preview/dashboard.cjs +4 -4
  42. package/dist-lib/preview/dashboard.mjs +4 -4
  43. package/dist-lib/shadcn.cjs +112 -112
  44. package/dist-lib/shadcn.mjs +136 -136
  45. package/dist-lib/src/components/ui/AppShell/app-shell.d.ts +1 -1
  46. package/dist-lib/src/components/ui/AppShell/app-shell.d.ts.map +1 -1
  47. package/dist-lib/src/components/ui/AppShell/app-shell.styles.d.ts +45 -1
  48. package/dist-lib/src/components/ui/AppShell/app-shell.styles.d.ts.map +1 -1
  49. package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts +106 -3
  50. package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts.map +1 -1
  51. package/dist-lib/src/components/ui/MenuSidebar/index.d.ts +2 -2
  52. package/dist-lib/src/components/ui/MenuSidebar/index.d.ts.map +1 -1
  53. package/dist-lib/src/components/ui/SingleMenuSidebar/category.d.ts +1 -1
  54. package/dist-lib/src/components/ui/SingleMenuSidebar/category.d.ts.map +1 -1
  55. package/dist-lib/src/components/ui/SingleMenuSidebar/menu-item.d.ts +25 -1
  56. package/dist-lib/src/components/ui/SingleMenuSidebar/menu-item.d.ts.map +1 -1
  57. package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.d.ts +1 -1
  58. package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.d.ts.map +1 -1
  59. package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.types.d.ts +57 -2
  60. package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.types.d.ts.map +1 -1
  61. package/dist-lib/src/utils/nav-link.d.ts.map +1 -0
  62. package/package.json +207 -207
  63. package/dist-lib/chunks/avatar-BiaG9OJS.cjs.map +0 -1
  64. package/dist-lib/chunks/avatar-DQYiVRlE.mjs.map +0 -1
  65. package/dist-lib/chunks/tooltip-mMF4YHZg.mjs.map +0 -1
  66. package/dist-lib/chunks/tooltip-pvZ_X-Ub.cjs.map +0 -1
  67. package/dist-lib/chunks/useTheme-BD0nloAv.cjs.map +0 -1
  68. package/dist-lib/chunks/useTheme-D1QVzZDW.mjs.map +0 -1
  69. package/dist-lib/src/components/ui/MenuSidebar/nav-link.d.ts.map +0 -1
  70. /package/dist-lib/src/{components/ui/MenuSidebar → utils}/nav-link.d.ts +0 -0
@@ -1,20 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const panel = require("./chunks/panel-ma7e3s4C.cjs");
4
- const useTheme = require("./chunks/useTheme-BD0nloAv.cjs");
5
- const avatar = require("./chunks/avatar-BiaG9OJS.cjs");
3
+ const panel = require("./chunks/panel-DtU3KlKY.cjs");
4
+ const useTheme = require("./chunks/useTheme-3iZAognE.cjs");
5
+ const avatar = require("./chunks/avatar-eM5txRFZ.cjs");
6
6
  const jsxRuntime = require("react/jsx-runtime");
7
7
  const React = require("react");
8
- const textarea = require("./chunks/textarea-c80RFmMP.cjs");
8
+ const textarea = require("./chunks/textarea-K20CL_gF.cjs");
9
9
  const lucideReact = require("lucide-react");
10
- const tooltip = require("./chunks/tooltip-pvZ_X-Ub.cjs");
10
+ const toggleGroup = require("./chunks/toggle-group-BEPs3e0Y.cjs");
11
11
  require("@radix-ui/react-aspect-ratio");
12
12
  require("react-day-picker");
13
13
  require("@radix-ui/react-collapsible");
14
- const input = require("./chunks/input-DMH5rSP1.cjs");
14
+ const input = require("./chunks/input-az2SuVXQ.cjs");
15
15
  const sonner = require("sonner");
16
- const kpiDelta = require("./chunks/kpi-delta-NnEu4oIs.cjs");
17
- const pageHeader = require("./chunks/page-header-Cp_9Wog4.cjs");
16
+ const kpiDelta = require("./chunks/kpi-delta-DAfakvFp.cjs");
17
+ const pageHeader = require("./chunks/page-header-DvAJoEfb.cjs");
18
18
  const RechartsPrimitive = require("recharts");
19
19
  const reactVirtual = require("@tanstack/react-virtual");
20
20
  require("@hello-pangea/dnd");
@@ -342,7 +342,7 @@ const ColorPicker = React.forwardRef(
342
342
  }
343
343
  ),
344
344
  allowCustomHex && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
345
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.Separator, {}),
345
+ /* @__PURE__ */ jsxRuntime.jsx(toggleGroup.Separator, {}),
346
346
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles2.customRow(), children: [
347
347
  /* @__PURE__ */ jsxRuntime.jsx(panel.FormField, { label: "Cor personalizada", id: `${id}-custom`, children: ({ id: customId }) => /* @__PURE__ */ jsxRuntime.jsx(
348
348
  input.Input,
@@ -3661,9 +3661,9 @@ function DateSeparatorChip({
3661
3661
  label
3662
3662
  ] });
3663
3663
  return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "separator", "aria-label": label, className: avatar.cn(styles2.root(), className), children: isBoundary ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3664
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.Separator, { decorative: true, className: styles2.rule() }),
3664
+ /* @__PURE__ */ jsxRuntime.jsx(toggleGroup.Separator, { decorative: true, className: styles2.rule() }),
3665
3665
  chip,
3666
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.Separator, { decorative: true, className: styles2.rule() })
3666
+ /* @__PURE__ */ jsxRuntime.jsx(toggleGroup.Separator, { decorative: true, className: styles2.rule() })
3667
3667
  ] }) : chip });
3668
3668
  }
3669
3669
  const emptyStateStyles = avatar.tv({
@@ -4047,7 +4047,7 @@ const messageBubbleStyles = avatar.tv({
4047
4047
  tail: true
4048
4048
  }
4049
4049
  });
4050
- const styles$1 = messageBubbleStyles();
4050
+ const styles = messageBubbleStyles();
4051
4051
  function handleMediaKeyDown(event, onMediaClick) {
4052
4052
  if (!onMediaClick) return;
4053
4053
  if (event.key === "Enter" || event.key === " ") {
@@ -4082,12 +4082,12 @@ function MessageMediaRenderer({
4082
4082
  }) {
4083
4083
  switch (mediaType) {
4084
4084
  case "image":
4085
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles$1.media(), children: mediaUrl ? /* @__PURE__ */ jsxRuntime.jsx(
4085
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.media(), children: mediaUrl ? /* @__PURE__ */ jsxRuntime.jsx(
4086
4086
  "img",
4087
4087
  {
4088
4088
  src: mediaUrl,
4089
4089
  alt: body2 || "Imagem",
4090
- className: styles$1.mediaImage(),
4090
+ className: styles.mediaImage(),
4091
4091
  role: onMediaClick ? "button" : void 0,
4092
4092
  tabIndex: onMediaClick ? 0 : void 0,
4093
4093
  onClick: onMediaClick,
@@ -4095,19 +4095,19 @@ function MessageMediaRenderer({
4095
4095
  }
4096
4096
  ) : null });
4097
4097
  case "audio":
4098
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles$1.media(), children: mediaUrl ? (
4098
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.media(), children: mediaUrl ? (
4099
4099
  // eslint-disable-next-line jsx-a11y/media-has-caption
4100
- /* @__PURE__ */ jsxRuntime.jsx("audio", { controls: true, src: mediaUrl, className: styles$1.mediaAudio() })
4100
+ /* @__PURE__ */ jsxRuntime.jsx("audio", { controls: true, src: mediaUrl, className: styles.mediaAudio() })
4101
4101
  ) : null });
4102
4102
  case "video":
4103
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles$1.media(), children: mediaUrl ? (
4103
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.media(), children: mediaUrl ? (
4104
4104
  // eslint-disable-next-line jsx-a11y/media-has-caption
4105
4105
  /* @__PURE__ */ jsxRuntime.jsx(
4106
4106
  "video",
4107
4107
  {
4108
4108
  controls: true,
4109
4109
  src: mediaUrl,
4110
- className: styles$1.mediaVideo(),
4110
+ className: styles.mediaVideo(),
4111
4111
  role: onMediaClick ? "button" : void 0,
4112
4112
  tabIndex: onMediaClick ? 0 : void 0,
4113
4113
  onClick: onMediaClick,
@@ -4116,18 +4116,18 @@ function MessageMediaRenderer({
4116
4116
  )
4117
4117
  ) : null });
4118
4118
  case "document":
4119
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles$1.mediaDoc(), children: [
4119
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.mediaDoc(), children: [
4120
4120
  /* @__PURE__ */ jsxRuntime.jsx(
4121
4121
  Icon,
4122
4122
  {
4123
4123
  name: "line-file",
4124
4124
  size: "lg",
4125
- className: styles$1.mediaDocIcon()
4125
+ className: styles.mediaDocIcon()
4126
4126
  }
4127
4127
  ),
4128
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles$1.mediaDocInfo(), children: [
4129
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles$1.mediaDocName(), children: body2 || "Documento" }),
4130
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles$1.mediaDocHint(), children: "Toque para baixar" })
4128
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.mediaDocInfo(), children: [
4129
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles.mediaDocName(), children: body2 || "Documento" }),
4130
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles.mediaDocHint(), children: "Toque para baixar" })
4131
4131
  ] }),
4132
4132
  mediaUrl ? /* @__PURE__ */ jsxRuntime.jsx(
4133
4133
  avatar.Button,
@@ -4149,7 +4149,7 @@ function MessageMediaRenderer({
4149
4149
  href: mediaUrl,
4150
4150
  target: "_blank",
4151
4151
  rel: "noopener noreferrer",
4152
- className: styles$1.mediaLocation(),
4152
+ className: styles.mediaLocation(),
4153
4153
  onClick: onMediaClick,
4154
4154
  children: [
4155
4155
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -4157,37 +4157,37 @@ function MessageMediaRenderer({
4157
4157
  {
4158
4158
  name: "line-pin",
4159
4159
  size: "md",
4160
- className: styles$1.mediaLocationIcon()
4160
+ className: styles.mediaLocationIcon()
4161
4161
  }
4162
4162
  ),
4163
4163
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: body2 || "Ver localização" })
4164
4164
  ]
4165
4165
  }
4166
- ) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles$1.mediaLocation(), children: [
4166
+ ) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.mediaLocation(), children: [
4167
4167
  /* @__PURE__ */ jsxRuntime.jsx(
4168
4168
  Icon,
4169
4169
  {
4170
4170
  name: "line-pin",
4171
4171
  size: "md",
4172
- className: styles$1.mediaLocationIcon()
4172
+ className: styles.mediaLocationIcon()
4173
4173
  }
4174
4174
  ),
4175
4175
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: body2 || "Localização" })
4176
4176
  ] });
4177
4177
  case "vcard":
4178
4178
  case "contact":
4179
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles$1.mediaContact(), children: [
4179
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.mediaContact(), children: [
4180
4180
  /* @__PURE__ */ jsxRuntime.jsx(
4181
4181
  Icon,
4182
4182
  {
4183
4183
  name: "line-user",
4184
4184
  size: "lg",
4185
- className: styles$1.mediaDocIcon()
4185
+ className: styles.mediaDocIcon()
4186
4186
  }
4187
4187
  ),
4188
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles$1.mediaContactInfo(), children: [
4189
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles$1.mediaContactName(), children: body2 || "Contato" }),
4190
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles$1.mediaContactHint(), children: "Cartão de contato" })
4188
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.mediaContactInfo(), children: [
4189
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles.mediaContactName(), children: body2 || "Contato" }),
4190
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles.mediaContactHint(), children: "Cartão de contato" })
4191
4191
  ] })
4192
4192
  ] });
4193
4193
  case "text":
@@ -4402,7 +4402,7 @@ const MessageComposer = React.forwardRef(function MessageComposer2({
4402
4402
  replyPreview ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles2.replyPreview(), children: replyPreview }) : null,
4403
4403
  banner ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles2.banner(), children: banner }) : null,
4404
4404
  !isReadOnly && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4405
- (replyPreview || banner) && /* @__PURE__ */ jsxRuntime.jsx(tooltip.Separator, {}),
4405
+ (replyPreview || banner) && /* @__PURE__ */ jsxRuntime.jsx(toggleGroup.Separator, {}),
4406
4406
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles2.field(), children: [
4407
4407
  toolbarStart ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles2.toolbarStart(), children: toolbarStart }) : null,
4408
4408
  recording ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles2.recording(), children: recording }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles2.inputArea(), children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -4523,7 +4523,7 @@ function MessageVariablesPicker({
4523
4523
  /* @__PURE__ */ jsxRuntime.jsx(avatar.PopoverContent, { align: "start", sideOffset: 6, mobileSheet: true, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles2.content(), children: [
4524
4524
  variables.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4525
4525
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles2.header(), children: "Variáveis disponíveis" }),
4526
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.Separator, {})
4526
+ /* @__PURE__ */ jsxRuntime.jsx(toggleGroup.Separator, {})
4527
4527
  ] }),
4528
4528
  variables.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles2.empty(), children: "Nenhuma variável disponível" }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles2.list(), children: variables.map((variable) => /* @__PURE__ */ jsxRuntime.jsx(
4529
4529
  useTheme.Chip,
@@ -4983,698 +4983,6 @@ const MonthYearPicker = React.forwardRef(function MonthYearPicker2({
4983
4983
  ] });
4984
4984
  });
4985
4985
  MonthYearPicker.displayName = "MonthYearPicker";
4986
- const SingleMenuSidebarContext = React.createContext({
4987
- expanded: true,
4988
- isHoverExpand: false,
4989
- toggle: () => {
4990
- },
4991
- openCategoryId: null,
4992
- setOpenCategoryId: () => {
4993
- }
4994
- });
4995
- function useSingleMenuSidebar() {
4996
- return React.useContext(SingleMenuSidebarContext);
4997
- }
4998
- function useSingleMenuSidebarState(defaultExpanded, controlledExpanded, onExpandedChange) {
4999
- const [internal, setInternal] = React.useState(defaultExpanded);
5000
- const isControlled = controlledExpanded !== void 0;
5001
- const expanded = isControlled ? controlledExpanded : internal;
5002
- const [lockedOpen, setLockedOpen] = React.useState(defaultExpanded);
5003
- const [hoverOpen, setHoverOpen] = React.useState(false);
5004
- const hoverTimeoutRef = React.useRef(null);
5005
- const suppressHoverRef = React.useRef(false);
5006
- const suppressTimerRef = React.useRef(null);
5007
- const setExpanded = React.useCallback(
5008
- (v) => {
5009
- if (!isControlled) setInternal(v);
5010
- onExpandedChange?.(v);
5011
- },
5012
- [isControlled, onExpandedChange]
5013
- );
5014
- const toggle = React.useCallback(() => {
5015
- const next = !lockedOpen;
5016
- setLockedOpen(next);
5017
- setHoverOpen(false);
5018
- if (!next) {
5019
- suppressHoverRef.current = true;
5020
- if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);
5021
- suppressTimerRef.current = setTimeout(() => {
5022
- suppressHoverRef.current = false;
5023
- }, 500);
5024
- }
5025
- setExpanded(next);
5026
- }, [lockedOpen, setExpanded]);
5027
- const onMouseEnter = React.useCallback(() => {
5028
- if (lockedOpen) return;
5029
- if (suppressHoverRef.current) return;
5030
- if (hoverTimeoutRef.current) {
5031
- clearTimeout(hoverTimeoutRef.current);
5032
- hoverTimeoutRef.current = null;
5033
- }
5034
- setHoverOpen(true);
5035
- setExpanded(true);
5036
- }, [lockedOpen, setExpanded]);
5037
- const onMouseLeave = React.useCallback(() => {
5038
- if (lockedOpen) return;
5039
- hoverTimeoutRef.current = setTimeout(() => {
5040
- setHoverOpen(false);
5041
- setExpanded(false);
5042
- }, 200);
5043
- }, [lockedOpen, setExpanded]);
5044
- React.useEffect(() => {
5045
- return () => {
5046
- if (hoverTimeoutRef.current) clearTimeout(hoverTimeoutRef.current);
5047
- if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);
5048
- };
5049
- }, []);
5050
- const isHoverExpand = hoverOpen && !lockedOpen;
5051
- const [openCategoryId, setOpenCategoryId] = React.useState(null);
5052
- return {
5053
- expanded,
5054
- isHoverExpand,
5055
- toggle,
5056
- onMouseEnter,
5057
- onMouseLeave,
5058
- openCategoryId,
5059
- setOpenCategoryId
5060
- };
5061
- }
5062
- const sidebarRoot = avatar.tv({
5063
- base: [
5064
- "relative flex h-full flex-col overflow-x-hidden",
5065
- "border-r border-border-sidebar bg-bg-sidebar",
5066
- "transition-[width] duration-300 ease-in-out"
5067
- ],
5068
- variants: {
5069
- // Mobile (< md): expandida = 100% da largura; recolhida = SOME (hidden).
5070
- // Desktop (md+): largura fixa, expandida (280px) ou recolhida (rail 80px).
5071
- expanded: {
5072
- true: "w-full md:w-[280px]",
5073
- false: "hidden md:flex md:w-20"
5074
- }
5075
- },
5076
- defaultVariants: {
5077
- expanded: true
5078
- }
5079
- });
5080
- const category = avatar.tv({
5081
- slots: {
5082
- root: "flex items-center rounded-radius-lg cursor-pointer transition-all",
5083
- text: "flex-1 text-left text-body-sm whitespace-nowrap overflow-hidden text-ellipsis",
5084
- // SVG do consumidor (ícone bare do lucide vem 24px) dimensionado no slot → 18px
5085
- icon: "grid size-[18px] shrink-0 place-items-center [&>svg]:size-[18px]",
5086
- chevron: "size-icon-sm shrink-0 transition-transform"
5087
- },
5088
- variants: {
5089
- // selected = folha ativa OU pai que contém o item ativo → card cheio
5090
- // default = nada marcado (inclui pai apenas aberto, sem filho ativo)
5091
- state: {
5092
- selected: {
5093
- root: "bg-bg-sidebar-accent shadow-sh-sm",
5094
- text: "font-bold text-fg-brand",
5095
- icon: "text-fg-brand",
5096
- chevron: "text-fg-brand"
5097
- },
5098
- default: {
5099
- root: "hover:bg-bg-sidebar-accent",
5100
- text: "font-medium text-fg-default",
5101
- icon: "text-fg-muted",
5102
- chevron: "text-fg-subtle"
5103
- }
5104
- },
5105
- collapsed: {
5106
- true: { root: "justify-center px-0 size-form-xl" },
5107
- false: { root: "w-full gap-gp-lg px-pad-2xl py-pad-xl" }
5108
- }
5109
- },
5110
- defaultVariants: {
5111
- state: "default",
5112
- collapsed: false
5113
- }
5114
- });
5115
- const menuItem = avatar.tv({
5116
- slots: {
5117
- root: "flex h-[38px] items-center gap-[18px] pl-[18px] pr-pad-2xl cursor-pointer transition-colors hover:bg-bg-sidebar-accent",
5118
- border: "h-full w-0 shrink-0",
5119
- text: "text-body-sm text-left"
5120
- },
5121
- variants: {
5122
- selected: {
5123
- true: {
5124
- border: "border-l-[3px] border-border-brand",
5125
- text: "font-semibold text-fg-default"
5126
- },
5127
- false: {
5128
- border: "border-l border-border-subtle",
5129
- text: "font-medium text-fg-muted"
5130
- }
5131
- }
5132
- },
5133
- defaultVariants: {
5134
- selected: false
5135
- }
5136
- });
5137
- const styles = {
5138
- // Header
5139
- header: {
5140
- wrapper: "flex h-layout-navbar items-center overflow-hidden px-pad-4xl py-pad-md shrink-0",
5141
- wrapperCollapsed: "justify-center px-0",
5142
- inner: "flex items-center gap-gp-md",
5143
- logo: "shrink-0",
5144
- title: "text-title-sm font-bold text-fg-default whitespace-nowrap",
5145
- collapseBtn: "ml-auto shrink-0 cursor-pointer rounded-radius-md p-pad-xs text-fg-subtle hover:bg-bg-sidebar-accent hover:text-fg-muted transition-colors",
5146
- expandBtn: "absolute right-0 top-16 translate-x-1/2 z-10 cursor-pointer rounded-radius-full bg-bg-surface border border-border-default p-pad-xs shadow-sh-sm text-fg-subtle hover:text-fg-muted transition-colors",
5147
- expandBtnIcon: "size-icon-sm"
5148
- },
5149
- // Module selector
5150
- module: {
5151
- trigger: "flex w-full cursor-pointer items-center gap-gp-lg rounded-radius-md bg-bg-sidebar-accent py-pad-md pl-pad-md pr-pad-2xl shadow-sh-sm transition-colors hover:bg-bg-sidebar-accent-hover focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-brand",
5152
- iconContainer: "flex size-icon-xl shrink-0 items-center justify-center rounded-radius-md bg-bg-brand text-fg-on-brand",
5153
- textContainer: "flex flex-col items-start gap-gp-xs overflow-hidden",
5154
- title: "text-body-md font-bold leading-4 text-fg-default truncate text-left",
5155
- subtitle: "text-caption-sm font-semibold text-fg-subtle text-left",
5156
- chevron: "ml-auto shrink-0 size-icon-sm text-fg-subtle",
5157
- dropdownItem: "flex items-center gap-gp-lg cursor-pointer",
5158
- // selecionado: realça a linha (bg-brand-subtle) + label/check em fg-brand
5159
- dropdownItemSelected: "bg-bg-brand-subtle text-fg-brand",
5160
- // [&>svg]:!text-fg-on-brand: o DropdownMenuItem força [&_svg]:text-fg-muted
5161
- // (+ fg-default no hover) em TODOS os svgs descendentes — o ! garante que o
5162
- // ícone do chip siga fg-on-brand igual ao trigger (branco light / preto dark).
5163
- dropdownItemIcon: "flex size-icon-lg shrink-0 items-center justify-center rounded-radius-sm bg-bg-brand [&>svg]:size-icon-sm [&>svg]:!text-fg-on-brand",
5164
- dropdownItemLabel: "flex-1 text-body-md font-medium",
5165
- dropdownItemCheck: "ml-auto shrink-0 size-icon-sm !text-fg-brand"
5166
- },
5167
- // Search
5168
- search: {
5169
- wrapper: "flex w-full items-center justify-between rounded-radius-lg bg-bg-muted py-pad-sm pl-pad-lg pr-pad-sm transition-all focus-within:bg-bg-surface focus-within:ring-4 focus-within:ring-ring-brand",
5170
- inner: "flex flex-1 items-center gap-gp-md opacity-60 focus-within:opacity-100",
5171
- icon: "shrink-0 size-icon-sm text-fg-muted",
5172
- text: "text-body-sm font-medium text-fg-default placeholder:text-fg-subtle",
5173
- shortcutBadge: "shrink-0 flex items-center justify-center rounded-radius-md bg-bg-surface px-pad-md py-pad-xs shadow-sh-sm",
5174
- shortcutText: "text-body-sm font-medium text-fg-muted"
5175
- },
5176
- // Footer
5177
- footer: {
5178
- wrapper: "px-pad-lg py-pad-xl",
5179
- button: "flex w-full cursor-pointer items-center gap-gp-lg rounded-radius-lg bg-bg-sidebar-accent px-pad-2xl py-pad-xl transition-colors hover:bg-bg-sidebar-accent-hover focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-brand",
5180
- avatar: "flex size-form-sm shrink-0 items-center justify-center rounded-radius-full bg-bg-muted overflow-hidden",
5181
- avatarIcon: "shrink-0 size-icon-sm text-fg-muted",
5182
- textContainer: "flex flex-col items-start gap-gp-2xs overflow-hidden",
5183
- name: "text-body-sm font-semibold text-fg-default truncate w-full text-left",
5184
- email: "text-caption-sm font-medium text-fg-muted truncate w-full text-left",
5185
- chevron: "ml-auto shrink-0 size-icon-sm text-fg-subtle",
5186
- dropdownLabel: "flex flex-col gap-gp-2xs px-pad-sm py-pad-xs normal-case tracking-normal",
5187
- dropdownLabelName: "text-body-md font-semibold",
5188
- dropdownLabelEmail: "text-caption-md font-normal text-fg-muted",
5189
- dropdownItem: "flex items-center gap-gp-md cursor-pointer",
5190
- dropdownItemIcon: "size-icon-sm shrink-0"
5191
- },
5192
- // Layout
5193
- // Fade do conteúdo textual durante a transição de largura (evita wrap visível)
5194
- textFadeIn: "animate-in fade-in-0 duration-200",
5195
- divider: "mx-pad-3xl h-px bg-border-sidebar",
5196
- sectionPadding: "flex flex-col gap-gp-2xl px-pad-3xl py-pad-4xl shrink-0 overflow-hidden",
5197
- navContainer: "scrollbar-thin flex flex-1 flex-col overflow-y-auto overflow-x-hidden py-pad-4xl",
5198
- navContainerExpanded: "px-pad-3xl",
5199
- navContainerCollapsed: "items-center",
5200
- navList: "flex flex-col",
5201
- subItemList: "flex flex-col py-pad-lg"
5202
- };
5203
- function SingleMenuHeader({
5204
- logo,
5205
- title: title2,
5206
- showToggleIndicator = false
5207
- }) {
5208
- const { expanded, isHoverExpand, toggle } = useSingleMenuSidebar();
5209
- const isFlipped = isHoverExpand || !expanded;
5210
- return /* @__PURE__ */ jsxRuntime.jsxs(
5211
- "div",
5212
- {
5213
- className: avatar.cn(
5214
- styles.header.wrapper,
5215
- !expanded && styles.header.wrapperCollapsed
5216
- ),
5217
- children: [
5218
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.header.inner, children: [
5219
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.header.logo, children: logo }),
5220
- expanded && /* @__PURE__ */ jsxRuntime.jsx("span", { className: avatar.cn(styles.header.title, styles.textFadeIn), children: title2 })
5221
- ] }),
5222
- expanded ? /* @__PURE__ */ jsxRuntime.jsx(
5223
- "button",
5224
- {
5225
- type: "button",
5226
- onClick: toggle,
5227
- className: styles.header.collapseBtn,
5228
- "aria-label": isFlipped ? "Expandir sidebar" : "Recolher sidebar",
5229
- children: /* @__PURE__ */ jsxRuntime.jsx(
5230
- lucideReact.PanelLeftClose,
5231
- {
5232
- className: avatar.cn(
5233
- "size-icon-sm transition-transform duration-300",
5234
- isFlipped && "rotate-180"
5235
- )
5236
- }
5237
- )
5238
- }
5239
- ) : showToggleIndicator ? /* @__PURE__ */ jsxRuntime.jsx(
5240
- "button",
5241
- {
5242
- type: "button",
5243
- onClick: toggle,
5244
- className: styles.header.expandBtn,
5245
- "aria-label": "Expandir sidebar",
5246
- children: /* @__PURE__ */ jsxRuntime.jsx(
5247
- lucideReact.PanelLeftClose,
5248
- {
5249
- className: avatar.cn(
5250
- styles.header.expandBtnIcon,
5251
- "transition-transform duration-300 rotate-180"
5252
- )
5253
- }
5254
- )
5255
- }
5256
- ) : null
5257
- ]
5258
- }
5259
- );
5260
- }
5261
- SingleMenuHeader.displayName = "SingleMenuHeader";
5262
- function SingleMenuModuleSelector({
5263
- icon,
5264
- title: title2,
5265
- subtitle,
5266
- options,
5267
- onModuleChange
5268
- }) {
5269
- const s = styles.module;
5270
- const triggerContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5271
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.iconContainer, children: icon }),
5272
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.textContainer, children: [
5273
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.title, children: title2 }),
5274
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.subtitle, children: subtitle })
5275
- ] }),
5276
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: s.chevron })
5277
- ] });
5278
- if (!options || options.length === 0) {
5279
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.trigger, children: triggerContent });
5280
- }
5281
- return /* @__PURE__ */ jsxRuntime.jsxs(avatar.DropdownMenu, { children: [
5282
- /* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuTrigger, { className: s.trigger, children: triggerContent }),
5283
- /* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuContent, { side: "bottom", sideOffset: 4, align: "start", children: options.map((option) => {
5284
- const isSelected = option.label === title2;
5285
- return /* @__PURE__ */ jsxRuntime.jsxs(
5286
- avatar.DropdownMenuItem,
5287
- {
5288
- className: avatar.cn(
5289
- s.dropdownItem,
5290
- isSelected && s.dropdownItemSelected
5291
- ),
5292
- onClick: () => onModuleChange?.(option.id),
5293
- children: [
5294
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.dropdownItemIcon, children: option.icon }),
5295
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownItemLabel, children: option.label }),
5296
- isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: s.dropdownItemCheck })
5297
- ]
5298
- },
5299
- option.id
5300
- );
5301
- }) })
5302
- ] });
5303
- }
5304
- SingleMenuModuleSelector.displayName = "SingleMenuModuleSelector";
5305
- function SingleMenuSearch({
5306
- placeholder = "Buscar",
5307
- onOpen
5308
- }) {
5309
- const s = styles.search;
5310
- return /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", onClick: onOpen, className: s.wrapper, children: [
5311
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.inner, children: [
5312
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: s.icon }),
5313
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.text, children: placeholder })
5314
- ] }),
5315
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.shortcutBadge, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.shortcutText, children: "⌘K" }) })
5316
- ] });
5317
- }
5318
- SingleMenuSearch.displayName = "SingleMenuSearch";
5319
- function SingleMenuCommand({
5320
- open,
5321
- onOpenChange,
5322
- categories,
5323
- placeholder = "Buscar no menu…",
5324
- onSelect,
5325
- custom
5326
- }) {
5327
- const leaves = categories.filter((c) => !c.items?.length);
5328
- const groups = categories.filter((c) => c.items?.length);
5329
- const handle = (id, parentId) => {
5330
- onSelect(id, parentId);
5331
- onOpenChange(false);
5332
- };
5333
- return /* @__PURE__ */ jsxRuntime.jsxs(avatar.CommandDialog, { open, onOpenChange, children: [
5334
- /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandInput, { placeholder }),
5335
- /* @__PURE__ */ jsxRuntime.jsxs(avatar.CommandList, { children: [
5336
- /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandEmpty, { children: "Nenhum resultado." }),
5337
- custom ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5338
- leaves.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandGroup, { heading: "Menu", children: leaves.map((c) => /* @__PURE__ */ jsxRuntime.jsxs(
5339
- avatar.CommandItem,
5340
- {
5341
- value: c.label,
5342
- onSelect: () => handle(c.id),
5343
- children: [
5344
- c.icon,
5345
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: c.label })
5346
- ]
5347
- },
5348
- c.id
5349
- )) }),
5350
- groups.map((cat) => /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandGroup, { heading: cat.label, children: cat.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
5351
- avatar.CommandItem,
5352
- {
5353
- value: `${cat.label} ${item.label}`,
5354
- onSelect: () => handle(item.id, cat.id),
5355
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: item.label })
5356
- },
5357
- item.id
5358
- )) }, cat.id))
5359
- ] })
5360
- ] })
5361
- ] });
5362
- }
5363
- SingleMenuCommand.displayName = "SingleMenuCommand";
5364
- function SingleMenuItem({
5365
- label,
5366
- selected = false,
5367
- onClick
5368
- }) {
5369
- const s = menuItem({ selected });
5370
- return /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", onClick, className: s.root(), children: [
5371
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.border() }),
5372
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.text(), children: label })
5373
- ] });
5374
- }
5375
- SingleMenuItem.displayName = "SingleMenuItem";
5376
- function SingleMenuCategory({
5377
- id,
5378
- icon,
5379
- label,
5380
- active = false,
5381
- items,
5382
- activeItemId,
5383
- onItemClick,
5384
- onCategoryClick
5385
- }) {
5386
- const { expanded, openCategoryId, setOpenCategoryId } = useSingleMenuSidebar();
5387
- const hasItems = !!items && items.length > 0;
5388
- const isOpen = hasItems ? openCategoryId === id : false;
5389
- const isLeafActive = !hasItems && (activeItemId !== void 0 ? activeItemId === id : !!active);
5390
- const containsActive = hasItems && items.some((item) => item.id === activeItemId);
5391
- const selected = !expanded ? hasItems ? isOpen || containsActive : isLeafActive : hasItems ? isOpen : isLeafActive && openCategoryId == null;
5392
- const state = selected ? "selected" : "default";
5393
- const s = category({ state, collapsed: !expanded });
5394
- const handleToggle = () => {
5395
- if (hasItems) {
5396
- setOpenCategoryId(isOpen ? null : id);
5397
- onCategoryClick?.();
5398
- } else {
5399
- onItemClick?.(id);
5400
- setOpenCategoryId(null);
5401
- onCategoryClick?.();
5402
- }
5403
- };
5404
- if (!expanded) {
5405
- return /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { children: [
5406
- /* @__PURE__ */ jsxRuntime.jsx(
5407
- tooltip.TooltipTrigger,
5408
- {
5409
- role: "button",
5410
- tabIndex: 0,
5411
- onClick: handleToggle,
5412
- onKeyDown: (e) => {
5413
- if (e.key === "Enter" || e.key === " ") {
5414
- e.preventDefault();
5415
- handleToggle();
5416
- }
5417
- },
5418
- className: s.root(),
5419
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.icon(), children: icon })
5420
- }
5421
- ),
5422
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { side: "right", sideOffset: 8, children: label })
5423
- ] });
5424
- }
5425
- if (!hasItems) {
5426
- return /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", onClick: handleToggle, className: s.root(), children: [
5427
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.icon(), children: icon }),
5428
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: avatar.cn(s.text(), styles.textFadeIn), children: label })
5429
- ] });
5430
- }
5431
- return /* @__PURE__ */ jsxRuntime.jsxs(
5432
- tooltip.Collapsible,
5433
- {
5434
- open: isOpen,
5435
- onOpenChange: (open) => {
5436
- setOpenCategoryId(open ? id : null);
5437
- onCategoryClick?.();
5438
- },
5439
- children: [
5440
- /* @__PURE__ */ jsxRuntime.jsxs(tooltip.CollapsibleTrigger, { className: s.root(), children: [
5441
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.icon(), children: icon }),
5442
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: avatar.cn(s.text(), styles.textFadeIn), children: label }),
5443
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: avatar.cn(s.chevron(), isOpen && "rotate-180") })
5444
- ] }),
5445
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.CollapsibleContent, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.subItemList, children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
5446
- SingleMenuItem,
5447
- {
5448
- label: item.label,
5449
- selected: item.id === activeItemId,
5450
- onClick: () => onItemClick?.(item.id)
5451
- },
5452
- item.id
5453
- )) }) })
5454
- ]
5455
- }
5456
- );
5457
- }
5458
- SingleMenuCategory.displayName = "SingleMenuCategory";
5459
- function SingleMenuFooter({
5460
- name,
5461
- email,
5462
- avatar: avatar$1,
5463
- actions,
5464
- onAction
5465
- }) {
5466
- const { expanded } = useSingleMenuSidebar();
5467
- const s = styles.footer;
5468
- const triggerContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5469
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.avatar, children: avatar$1 ?? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { className: s.avatarIcon }) }),
5470
- expanded && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5471
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.textContainer, children: [
5472
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.name, children: name }),
5473
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.email, children: email })
5474
- ] }),
5475
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: s.chevron })
5476
- ] })
5477
- ] });
5478
- if (!actions || actions.length === 0) {
5479
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.wrapper, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: avatar.cn(s.button, !expanded && "justify-center px-0"), children: triggerContent }) });
5480
- }
5481
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.wrapper, children: /* @__PURE__ */ jsxRuntime.jsxs(avatar.DropdownMenu, { children: [
5482
- /* @__PURE__ */ jsxRuntime.jsx(
5483
- avatar.DropdownMenuTrigger,
5484
- {
5485
- className: avatar.cn(s.button, !expanded && "justify-center px-0"),
5486
- children: triggerContent
5487
- }
5488
- ),
5489
- /* @__PURE__ */ jsxRuntime.jsxs(
5490
- avatar.DropdownMenuContent,
5491
- {
5492
- side: expanded ? "top" : "right",
5493
- sideOffset: 8,
5494
- align: expanded ? "end" : "start",
5495
- children: [
5496
- /* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs(avatar.DropdownMenuLabel, { className: s.dropdownLabel, children: [
5497
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownLabelName, children: name }),
5498
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownLabelEmail, children: email })
5499
- ] }) }),
5500
- /* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuSeparator, {}),
5501
- actions.map((action) => /* @__PURE__ */ jsxRuntime.jsxs(
5502
- avatar.DropdownMenuItem,
5503
- {
5504
- variant: action.variant === "destructive" ? "destructive" : "default",
5505
- onClick: () => onAction?.(action.id),
5506
- className: s.dropdownItem,
5507
- children: [
5508
- action.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownItemIcon, children: action.icon }),
5509
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: action.label })
5510
- ]
5511
- },
5512
- action.id
5513
- ))
5514
- ]
5515
- }
5516
- )
5517
- ] }) });
5518
- }
5519
- SingleMenuFooter.displayName = "SingleMenuFooter";
5520
- function SingleMenuSidebar({
5521
- logo,
5522
- title: title2,
5523
- module: module2,
5524
- modules,
5525
- activeModuleId,
5526
- defaultModuleId,
5527
- onModuleChange,
5528
- showSearch = true,
5529
- searchPlaceholder,
5530
- searchCommand,
5531
- categories,
5532
- activeItemId,
5533
- onItemClick,
5534
- user,
5535
- defaultExpanded = true,
5536
- expanded: controlledExpanded,
5537
- onExpandedChange,
5538
- showToggleIndicator = false,
5539
- className,
5540
- ...props
5541
- }) {
5542
- const {
5543
- expanded,
5544
- isHoverExpand,
5545
- toggle,
5546
- onMouseEnter,
5547
- onMouseLeave,
5548
- openCategoryId,
5549
- setOpenCategoryId
5550
- } = useSingleMenuSidebarState(
5551
- defaultExpanded,
5552
- controlledExpanded,
5553
- onExpandedChange
5554
- );
5555
- const hasModules = !!modules && modules.length > 0;
5556
- const [internalModuleId, setInternalModuleId] = React.useState(
5557
- defaultModuleId ?? modules?.[0]?.id
5558
- );
5559
- const currentModuleId = activeModuleId ?? internalModuleId;
5560
- const activeModule = hasModules ? modules.find((m) => m.id === currentModuleId) ?? modules[0] : void 0;
5561
- const handleModuleChange = (id) => {
5562
- if (activeModuleId === void 0) setInternalModuleId(id);
5563
- onModuleChange?.(id);
5564
- };
5565
- const moduleDisplay = hasModules ? {
5566
- icon: activeModule.icon,
5567
- title: activeModule.title,
5568
- subtitle: activeModule.subtitle ?? "",
5569
- options: modules.map((m) => ({
5570
- id: m.id,
5571
- label: m.title,
5572
- icon: m.icon
5573
- })),
5574
- onModuleChange: handleModuleChange
5575
- } : module2;
5576
- const effectiveCategories = hasModules ? activeModule.categories : categories ?? [];
5577
- const [commandOpen, setCommandOpen] = React.useState(false);
5578
- React.useEffect(() => {
5579
- if (!showSearch) return;
5580
- const onKey = (e) => {
5581
- if (e.key.toLowerCase() === "k" && (e.metaKey || e.ctrlKey)) {
5582
- e.preventDefault();
5583
- setCommandOpen((o) => !o);
5584
- }
5585
- };
5586
- document.addEventListener("keydown", onKey);
5587
- return () => document.removeEventListener("keydown", onKey);
5588
- }, [showSearch]);
5589
- const selectFromSearch = (id, parentId) => {
5590
- onItemClick?.(id);
5591
- setOpenCategoryId(parentId ?? null);
5592
- };
5593
- const resolvedOpenCategoryId = openCategoryId ?? effectiveCategories.find(
5594
- (cat) => cat.items?.some((item) => item.id === activeItemId)
5595
- )?.id ?? null;
5596
- const contextValue = React.useMemo(
5597
- () => ({
5598
- expanded,
5599
- isHoverExpand,
5600
- toggle,
5601
- openCategoryId: resolvedOpenCategoryId,
5602
- setOpenCategoryId
5603
- }),
5604
- [
5605
- expanded,
5606
- isHoverExpand,
5607
- toggle,
5608
- resolvedOpenCategoryId,
5609
- setOpenCategoryId
5610
- ]
5611
- );
5612
- return /* @__PURE__ */ jsxRuntime.jsxs(SingleMenuSidebarContext.Provider, { value: contextValue, children: [
5613
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsxRuntime.jsxs(
5614
- "aside",
5615
- {
5616
- "aria-label": "Navegação lateral",
5617
- className: avatar.cn(sidebarRoot({ expanded }), className),
5618
- onMouseEnter,
5619
- onMouseLeave,
5620
- ...props,
5621
- children: [
5622
- /* @__PURE__ */ jsxRuntime.jsx(
5623
- SingleMenuHeader,
5624
- {
5625
- logo,
5626
- title: title2,
5627
- showToggleIndicator
5628
- }
5629
- ),
5630
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.divider }),
5631
- expanded && (moduleDisplay || showSearch) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: avatar.cn(styles.sectionPadding, styles.textFadeIn), children: [
5632
- moduleDisplay && /* @__PURE__ */ jsxRuntime.jsx(SingleMenuModuleSelector, { ...moduleDisplay }),
5633
- showSearch && /* @__PURE__ */ jsxRuntime.jsx(
5634
- SingleMenuSearch,
5635
- {
5636
- placeholder: searchPlaceholder,
5637
- onOpen: () => setCommandOpen(true)
5638
- }
5639
- )
5640
- ] }),
5641
- expanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.divider }),
5642
- /* @__PURE__ */ jsxRuntime.jsx(
5643
- "nav",
5644
- {
5645
- className: avatar.cn(
5646
- styles.navContainer,
5647
- expanded ? styles.navContainerExpanded : styles.navContainerCollapsed
5648
- ),
5649
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.navList, children: effectiveCategories.map((cat) => /* @__PURE__ */ jsxRuntime.jsx(
5650
- SingleMenuCategory,
5651
- {
5652
- ...cat,
5653
- activeItemId,
5654
- onItemClick
5655
- },
5656
- cat.id
5657
- )) })
5658
- }
5659
- ),
5660
- /* @__PURE__ */ jsxRuntime.jsx(SingleMenuFooter, { ...user })
5661
- ]
5662
- }
5663
- ) }),
5664
- showSearch && /* @__PURE__ */ jsxRuntime.jsx(
5665
- SingleMenuCommand,
5666
- {
5667
- open: commandOpen,
5668
- onOpenChange: setCommandOpen,
5669
- categories: effectiveCategories,
5670
- placeholder: searchPlaceholder,
5671
- onSelect: selectFromSearch,
5672
- custom: searchCommand
5673
- }
5674
- )
5675
- ] });
5676
- }
5677
- SingleMenuSidebar.displayName = "SingleMenuSidebar";
5678
4986
  const spinnerStyles = avatar.tv({
5679
4987
  base: ["inline-block shrink-0", "animate-spin motion-reduce:animate-none"],
5680
4988
  variants: {
@@ -7386,9 +6694,9 @@ const ChoroplethMap = React.forwardRef(
7386
6694
  })
7387
6695
  }
7388
6696
  ),
7389
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles2.tooltipLayer(), children: /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { open: hover != null, onOpenChange: () => {
6697
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles2.tooltipLayer(), children: /* @__PURE__ */ jsxRuntime.jsxs(avatar.Tooltip, { open: hover != null, onOpenChange: () => {
7390
6698
  }, disableHoverableContent: true, children: [
7391
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
6699
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
7392
6700
  "span",
7393
6701
  {
7394
6702
  "aria-hidden": "true",
@@ -7397,7 +6705,7 @@ const ChoroplethMap = React.forwardRef(
7397
6705
  }
7398
6706
  ) }),
7399
6707
  /* @__PURE__ */ jsxRuntime.jsx(
7400
- tooltip.TooltipContent,
6708
+ avatar.TooltipContent,
7401
6709
  {
7402
6710
  showArrow: false,
7403
6711
  className: "border border-border-default bg-bg-surface-elevated shadow-sh-lg",
@@ -8663,6 +7971,7 @@ exports.SidebarPill = useTheme.SidebarPill;
8663
7971
  exports.SidebarRail = useTheme.SidebarRail;
8664
7972
  exports.SidebarSection = useTheme.SidebarSection;
8665
7973
  exports.SidebarSubgroup = useTheme.SidebarSubgroup;
7974
+ exports.SingleMenuSidebar = useTheme.SingleMenuSidebar;
8666
7975
  exports.UserMenu = useTheme.UserMenu;
8667
7976
  exports.chipCount = useTheme.chipCount;
8668
7977
  exports.chipVariants = useTheme.chipVariants;
@@ -8696,8 +8005,8 @@ Object.defineProperty(exports, "MessageReplyIcon", {
8696
8005
  enumerable: true,
8697
8006
  get: () => lucideReact.Reply
8698
8007
  });
8699
- exports.Badge = tooltip.Badge;
8700
- exports.badgeVariants = tooltip.badgeVariants;
8008
+ exports.Badge = toggleGroup.Badge;
8009
+ exports.badgeVariants = toggleGroup.badgeVariants;
8701
8010
  exports.Input = input.Input;
8702
8011
  exports.inputVariants = input.inputVariants;
8703
8012
  exports.Kpi = kpiDelta.Kpi;
@@ -8731,7 +8040,6 @@ exports.MessageComposer = MessageComposer;
8731
8040
  exports.MessageVariablesPicker = MessageVariablesPicker;
8732
8041
  exports.Modal = Modal;
8733
8042
  exports.MonthYearPicker = MonthYearPicker;
8734
- exports.SingleMenuSidebar = SingleMenuSidebar;
8735
8043
  exports.Spinner = Spinner;
8736
8044
  exports.ToastCard = ToastCard;
8737
8045
  exports.ToolbarFilterControl = ToolbarFilterControl;