@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,7 +1,7 @@
1
1
  "use strict";
2
2
  const jsxRuntime = require("react/jsx-runtime");
3
3
  const React = require("react");
4
- const avatar = require("./avatar-BiaG9OJS.cjs");
4
+ const avatar = require("./avatar-eM5txRFZ.cjs");
5
5
  const lucideReact = require("lucide-react");
6
6
  const ToggleGroupPrimitive = require("@radix-ui/react-toggle-group");
7
7
  function _interopNamespaceDefault(e) {
@@ -1204,7 +1204,7 @@ function Header({
1204
1204
  ] })
1205
1205
  ] });
1206
1206
  }
1207
- const sidebarRoot = avatar.tv({
1207
+ const sidebarRoot$1 = avatar.tv({
1208
1208
  base: "relative flex h-screen w-fit bg-bg-sidebar text-fg-default font-sans",
1209
1209
  variants: {
1210
1210
  mobile: {
@@ -2187,7 +2187,7 @@ function MenuSidebar({
2187
2187
  "div",
2188
2188
  {
2189
2189
  className: avatar.cn(
2190
- sidebarRoot({ mobile: isMobile, mobileOpen: isMobile && openMobile }),
2190
+ sidebarRoot$1({ mobile: isMobile, mobileOpen: isMobile && openMobile }),
2191
2191
  className
2192
2192
  ),
2193
2193
  onMouseEnter: () => {
@@ -2258,6 +2258,752 @@ function MenuSidebar({
2258
2258
  )
2259
2259
  ] });
2260
2260
  }
2261
+ const SingleMenuSidebarContext = React.createContext({
2262
+ expanded: true,
2263
+ isHoverExpand: false,
2264
+ toggle: () => {
2265
+ },
2266
+ openCategoryId: null,
2267
+ setOpenCategoryId: () => {
2268
+ }
2269
+ });
2270
+ function useSingleMenuSidebar() {
2271
+ return React.useContext(SingleMenuSidebarContext);
2272
+ }
2273
+ function useSingleMenuSidebarState(defaultExpanded, controlledExpanded, onExpandedChange) {
2274
+ const [internal, setInternal] = React.useState(defaultExpanded);
2275
+ const isControlled = controlledExpanded !== void 0;
2276
+ const expanded = isControlled ? controlledExpanded : internal;
2277
+ const [lockedOpen, setLockedOpen] = React.useState(defaultExpanded);
2278
+ const [hoverOpen, setHoverOpen] = React.useState(false);
2279
+ const hoverTimeoutRef = React.useRef(null);
2280
+ const suppressHoverRef = React.useRef(false);
2281
+ const suppressTimerRef = React.useRef(null);
2282
+ const setExpanded = React.useCallback(
2283
+ (v) => {
2284
+ if (!isControlled) setInternal(v);
2285
+ onExpandedChange?.(v);
2286
+ },
2287
+ [isControlled, onExpandedChange]
2288
+ );
2289
+ const toggle = React.useCallback(() => {
2290
+ const next = !lockedOpen;
2291
+ setLockedOpen(next);
2292
+ setHoverOpen(false);
2293
+ if (!next) {
2294
+ suppressHoverRef.current = true;
2295
+ if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);
2296
+ suppressTimerRef.current = setTimeout(() => {
2297
+ suppressHoverRef.current = false;
2298
+ }, 500);
2299
+ }
2300
+ setExpanded(next);
2301
+ }, [lockedOpen, setExpanded]);
2302
+ const onMouseEnter = React.useCallback(() => {
2303
+ if (lockedOpen) return;
2304
+ if (suppressHoverRef.current) return;
2305
+ if (hoverTimeoutRef.current) {
2306
+ clearTimeout(hoverTimeoutRef.current);
2307
+ hoverTimeoutRef.current = null;
2308
+ }
2309
+ setHoverOpen(true);
2310
+ setExpanded(true);
2311
+ }, [lockedOpen, setExpanded]);
2312
+ const onMouseLeave = React.useCallback(() => {
2313
+ if (lockedOpen) return;
2314
+ hoverTimeoutRef.current = setTimeout(() => {
2315
+ setHoverOpen(false);
2316
+ setExpanded(false);
2317
+ }, 200);
2318
+ }, [lockedOpen, setExpanded]);
2319
+ React.useEffect(() => {
2320
+ return () => {
2321
+ if (hoverTimeoutRef.current) clearTimeout(hoverTimeoutRef.current);
2322
+ if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);
2323
+ };
2324
+ }, []);
2325
+ const isHoverExpand = hoverOpen && !lockedOpen;
2326
+ const [openCategoryId, setOpenCategoryId] = React.useState(null);
2327
+ return {
2328
+ expanded,
2329
+ isHoverExpand,
2330
+ toggle,
2331
+ onMouseEnter,
2332
+ onMouseLeave,
2333
+ openCategoryId,
2334
+ setOpenCategoryId
2335
+ };
2336
+ }
2337
+ const sidebarRoot = avatar.tv({
2338
+ base: [
2339
+ "relative flex h-full flex-col overflow-x-hidden",
2340
+ "border-r border-border-sidebar bg-bg-sidebar",
2341
+ "transition-[width] duration-300 ease-in-out"
2342
+ ],
2343
+ variants: {
2344
+ // Mobile (< md): expandida = 100% da largura; recolhida = SOME (hidden).
2345
+ // Desktop (md+): largura fixa, expandida (280px) ou recolhida (rail 80px).
2346
+ expanded: {
2347
+ true: "w-full md:w-[280px]",
2348
+ false: "hidden md:flex md:w-20"
2349
+ }
2350
+ },
2351
+ defaultVariants: {
2352
+ expanded: true
2353
+ }
2354
+ });
2355
+ const category = avatar.tv({
2356
+ slots: {
2357
+ root: "flex items-center rounded-radius-lg cursor-pointer transition-all",
2358
+ text: "flex-1 text-left text-body-sm whitespace-nowrap overflow-hidden text-ellipsis",
2359
+ // SVG do consumidor (ícone bare do lucide vem 24px) dimensionado no slot → 18px
2360
+ icon: "grid size-[18px] shrink-0 place-items-center [&>svg]:size-[18px]",
2361
+ chevron: "size-icon-sm shrink-0 transition-transform"
2362
+ },
2363
+ variants: {
2364
+ // selected = folha ativa OU pai que contém o item ativo → card cheio
2365
+ // default = nada marcado (inclui pai apenas aberto, sem filho ativo)
2366
+ state: {
2367
+ selected: {
2368
+ root: "bg-bg-sidebar-accent shadow-sh-sm",
2369
+ text: "font-bold text-fg-brand",
2370
+ icon: "text-fg-brand",
2371
+ chevron: "text-fg-brand"
2372
+ },
2373
+ default: {
2374
+ root: "hover:bg-bg-sidebar-accent",
2375
+ text: "font-medium text-fg-default",
2376
+ icon: "text-fg-muted",
2377
+ chevron: "text-fg-subtle"
2378
+ }
2379
+ },
2380
+ collapsed: {
2381
+ true: { root: "justify-center px-0 size-form-xl" },
2382
+ false: { root: "w-full gap-gp-lg px-pad-2xl py-pad-xl" }
2383
+ }
2384
+ },
2385
+ defaultVariants: {
2386
+ state: "default",
2387
+ collapsed: false
2388
+ }
2389
+ });
2390
+ const menuItem = avatar.tv({
2391
+ slots: {
2392
+ root: "flex h-[38px] items-center gap-[18px] pl-[18px] pr-pad-2xl cursor-pointer transition-colors hover:bg-bg-sidebar-accent",
2393
+ border: "h-full w-0 shrink-0",
2394
+ text: "text-body-sm text-left"
2395
+ },
2396
+ variants: {
2397
+ selected: {
2398
+ true: {
2399
+ border: "border-l-[3px] border-border-brand",
2400
+ text: "font-semibold text-fg-default"
2401
+ },
2402
+ false: {
2403
+ border: "border-l border-border-subtle",
2404
+ text: "font-medium text-fg-muted"
2405
+ }
2406
+ }
2407
+ },
2408
+ defaultVariants: {
2409
+ selected: false
2410
+ }
2411
+ });
2412
+ const styles = {
2413
+ // Header
2414
+ header: {
2415
+ wrapper: "flex h-layout-navbar items-center overflow-hidden px-pad-4xl py-pad-md shrink-0",
2416
+ wrapperCollapsed: "justify-center px-0",
2417
+ inner: "flex items-center gap-gp-md",
2418
+ logo: "shrink-0",
2419
+ title: "text-title-sm font-bold text-fg-default whitespace-nowrap",
2420
+ 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",
2421
+ 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",
2422
+ expandBtnIcon: "size-icon-sm"
2423
+ },
2424
+ // Module selector
2425
+ module: {
2426
+ 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",
2427
+ iconContainer: "flex size-icon-xl shrink-0 items-center justify-center rounded-radius-md bg-bg-brand text-fg-on-brand",
2428
+ textContainer: "flex flex-col items-start gap-gp-xs overflow-hidden",
2429
+ title: "text-body-md font-bold leading-4 text-fg-default truncate text-left",
2430
+ subtitle: "text-caption-sm font-semibold text-fg-subtle text-left",
2431
+ chevron: "ml-auto shrink-0 size-icon-sm text-fg-subtle",
2432
+ dropdownItem: "flex items-center gap-gp-lg cursor-pointer",
2433
+ // selecionado: realça a linha (bg-brand-subtle) + label/check em fg-brand
2434
+ dropdownItemSelected: "bg-bg-brand-subtle text-fg-brand",
2435
+ // [&>svg]:!text-fg-on-brand: o DropdownMenuItem força [&_svg]:text-fg-muted
2436
+ // (+ fg-default no hover) em TODOS os svgs descendentes — o ! garante que o
2437
+ // ícone do chip siga fg-on-brand igual ao trigger (branco light / preto dark).
2438
+ 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",
2439
+ dropdownItemLabel: "flex-1 text-body-md font-medium",
2440
+ dropdownItemCheck: "ml-auto shrink-0 size-icon-sm !text-fg-brand"
2441
+ },
2442
+ // Search
2443
+ search: {
2444
+ 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",
2445
+ inner: "flex flex-1 items-center gap-gp-md opacity-60 focus-within:opacity-100",
2446
+ icon: "shrink-0 size-icon-sm text-fg-muted",
2447
+ text: "text-body-sm font-medium text-fg-default placeholder:text-fg-subtle",
2448
+ shortcutBadge: "shrink-0 flex items-center justify-center rounded-radius-md bg-bg-surface px-pad-md py-pad-xs shadow-sh-sm",
2449
+ shortcutText: "text-body-sm font-medium text-fg-muted"
2450
+ },
2451
+ // Footer
2452
+ footer: {
2453
+ wrapper: "px-pad-lg py-pad-xl",
2454
+ 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",
2455
+ avatar: "flex size-form-sm shrink-0 items-center justify-center rounded-radius-full bg-bg-muted overflow-hidden",
2456
+ avatarIcon: "shrink-0 size-icon-sm text-fg-muted",
2457
+ textContainer: "flex flex-col items-start gap-gp-2xs overflow-hidden",
2458
+ name: "text-body-sm font-semibold text-fg-default truncate w-full text-left",
2459
+ email: "text-caption-sm font-medium text-fg-muted truncate w-full text-left",
2460
+ chevron: "ml-auto shrink-0 size-icon-sm text-fg-subtle",
2461
+ dropdownLabel: "flex flex-col gap-gp-2xs px-pad-sm py-pad-xs normal-case tracking-normal",
2462
+ dropdownLabelName: "text-body-md font-semibold",
2463
+ dropdownLabelEmail: "text-caption-md font-normal text-fg-muted",
2464
+ dropdownItem: "flex items-center gap-gp-md cursor-pointer",
2465
+ dropdownItemIcon: "size-icon-sm shrink-0"
2466
+ },
2467
+ // Layout
2468
+ // Fade do conteúdo textual durante a transição de largura (evita wrap visível)
2469
+ textFadeIn: "animate-in fade-in-0 duration-200",
2470
+ divider: "mx-pad-3xl h-px bg-border-sidebar",
2471
+ sectionPadding: "flex flex-col gap-gp-2xl px-pad-3xl py-pad-4xl shrink-0 overflow-hidden",
2472
+ navContainer: "scrollbar-thin flex flex-1 flex-col overflow-y-auto overflow-x-hidden py-pad-4xl",
2473
+ navContainerExpanded: "px-pad-3xl",
2474
+ navContainerCollapsed: "items-center",
2475
+ navList: "flex flex-col",
2476
+ subItemList: "flex flex-col py-pad-lg"
2477
+ };
2478
+ function SingleMenuHeader({
2479
+ logo,
2480
+ title,
2481
+ showToggleIndicator = false
2482
+ }) {
2483
+ const { expanded, isHoverExpand, toggle } = useSingleMenuSidebar();
2484
+ const isFlipped = isHoverExpand || !expanded;
2485
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2486
+ "div",
2487
+ {
2488
+ className: avatar.cn(
2489
+ styles.header.wrapper,
2490
+ !expanded && styles.header.wrapperCollapsed
2491
+ ),
2492
+ children: [
2493
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.header.inner, children: [
2494
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.header.logo, children: logo }),
2495
+ expanded && /* @__PURE__ */ jsxRuntime.jsx("span", { className: avatar.cn(styles.header.title, styles.textFadeIn), children: title })
2496
+ ] }),
2497
+ expanded ? /* @__PURE__ */ jsxRuntime.jsx(
2498
+ "button",
2499
+ {
2500
+ type: "button",
2501
+ onClick: toggle,
2502
+ className: styles.header.collapseBtn,
2503
+ "aria-label": isFlipped ? "Expandir sidebar" : "Recolher sidebar",
2504
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2505
+ lucideReact.PanelLeftClose,
2506
+ {
2507
+ className: avatar.cn(
2508
+ "size-icon-sm transition-transform duration-300",
2509
+ isFlipped && "rotate-180"
2510
+ )
2511
+ }
2512
+ )
2513
+ }
2514
+ ) : showToggleIndicator ? /* @__PURE__ */ jsxRuntime.jsx(
2515
+ "button",
2516
+ {
2517
+ type: "button",
2518
+ onClick: toggle,
2519
+ className: styles.header.expandBtn,
2520
+ "aria-label": "Expandir sidebar",
2521
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2522
+ lucideReact.PanelLeftClose,
2523
+ {
2524
+ className: avatar.cn(
2525
+ styles.header.expandBtnIcon,
2526
+ "transition-transform duration-300 rotate-180"
2527
+ )
2528
+ }
2529
+ )
2530
+ }
2531
+ ) : null
2532
+ ]
2533
+ }
2534
+ );
2535
+ }
2536
+ SingleMenuHeader.displayName = "SingleMenuHeader";
2537
+ function SingleMenuModuleSelector({
2538
+ icon,
2539
+ title,
2540
+ subtitle,
2541
+ options,
2542
+ onModuleChange
2543
+ }) {
2544
+ const s = styles.module;
2545
+ const triggerContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2546
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.iconContainer, children: icon }),
2547
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.textContainer, children: [
2548
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.title, children: title }),
2549
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.subtitle, children: subtitle })
2550
+ ] }),
2551
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: s.chevron })
2552
+ ] });
2553
+ if (!options || options.length === 0) {
2554
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.trigger, children: triggerContent });
2555
+ }
2556
+ return /* @__PURE__ */ jsxRuntime.jsxs(avatar.DropdownMenu, { children: [
2557
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuTrigger, { className: s.trigger, children: triggerContent }),
2558
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuContent, { side: "bottom", sideOffset: 4, align: "start", children: options.map((option) => {
2559
+ const isSelected = option.label === title;
2560
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2561
+ avatar.DropdownMenuItem,
2562
+ {
2563
+ className: avatar.cn(
2564
+ s.dropdownItem,
2565
+ isSelected && s.dropdownItemSelected
2566
+ ),
2567
+ onClick: () => onModuleChange?.(option.id),
2568
+ children: [
2569
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.dropdownItemIcon, children: option.icon }),
2570
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownItemLabel, children: option.label }),
2571
+ isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: s.dropdownItemCheck })
2572
+ ]
2573
+ },
2574
+ option.id
2575
+ );
2576
+ }) })
2577
+ ] });
2578
+ }
2579
+ SingleMenuModuleSelector.displayName = "SingleMenuModuleSelector";
2580
+ function SingleMenuSearch({
2581
+ placeholder = "Buscar",
2582
+ onOpen
2583
+ }) {
2584
+ const s = styles.search;
2585
+ return /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", onClick: onOpen, className: s.wrapper, children: [
2586
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.inner, children: [
2587
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: s.icon }),
2588
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.text, children: placeholder })
2589
+ ] }),
2590
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.shortcutBadge, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.shortcutText, children: "⌘K" }) })
2591
+ ] });
2592
+ }
2593
+ SingleMenuSearch.displayName = "SingleMenuSearch";
2594
+ function SingleMenuCommand({
2595
+ open,
2596
+ onOpenChange,
2597
+ categories,
2598
+ placeholder = "Buscar no menu…",
2599
+ onSelect,
2600
+ custom
2601
+ }) {
2602
+ const leaves = categories.filter((c) => !c.items?.length);
2603
+ const groups = categories.filter((c) => c.items?.length);
2604
+ const handle = (id, parentId) => {
2605
+ onSelect(id, parentId);
2606
+ onOpenChange(false);
2607
+ };
2608
+ return /* @__PURE__ */ jsxRuntime.jsxs(avatar.CommandDialog, { open, onOpenChange, children: [
2609
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandInput, { placeholder }),
2610
+ /* @__PURE__ */ jsxRuntime.jsxs(avatar.CommandList, { children: [
2611
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandEmpty, { children: "Nenhum resultado." }),
2612
+ custom ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2613
+ leaves.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandGroup, { heading: "Menu", children: leaves.map((c) => /* @__PURE__ */ jsxRuntime.jsxs(
2614
+ avatar.CommandItem,
2615
+ {
2616
+ value: c.label,
2617
+ onSelect: () => handle(c.id),
2618
+ children: [
2619
+ c.icon,
2620
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: c.label })
2621
+ ]
2622
+ },
2623
+ c.id
2624
+ )) }),
2625
+ groups.map((cat) => /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandGroup, { heading: cat.label, children: cat.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
2626
+ avatar.CommandItem,
2627
+ {
2628
+ value: `${cat.label} ${item.label}`,
2629
+ onSelect: () => handle(item.id, cat.id),
2630
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: item.label })
2631
+ },
2632
+ item.id
2633
+ )) }, cat.id))
2634
+ ] })
2635
+ ] })
2636
+ ] });
2637
+ }
2638
+ SingleMenuCommand.displayName = "SingleMenuCommand";
2639
+ function SingleMenuItem({
2640
+ label,
2641
+ selected = false,
2642
+ href,
2643
+ target,
2644
+ onClick,
2645
+ renderLink,
2646
+ interceptNavigation
2647
+ }) {
2648
+ const s = menuItem({ selected });
2649
+ const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2650
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.border() }),
2651
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.text(), children: label })
2652
+ ] });
2653
+ const handleClick = (e) => {
2654
+ if (!renderLink) {
2655
+ const prevent = shouldPreventNavigation({
2656
+ href,
2657
+ hasHandler: interceptNavigation ?? !!onClick,
2658
+ target,
2659
+ event: e
2660
+ });
2661
+ if (prevent) e.preventDefault();
2662
+ }
2663
+ onClick?.(e);
2664
+ };
2665
+ if (href) {
2666
+ const linkProps = {
2667
+ href,
2668
+ target,
2669
+ className: s.root(),
2670
+ onClick: handleClick,
2671
+ "aria-current": selected ? "page" : void 0,
2672
+ children: content
2673
+ };
2674
+ if (renderLink) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderLink(linkProps) });
2675
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { ...linkProps });
2676
+ }
2677
+ return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: handleClick, className: s.root(), children: content });
2678
+ }
2679
+ SingleMenuItem.displayName = "SingleMenuItem";
2680
+ function SingleMenuCategory({
2681
+ id,
2682
+ icon,
2683
+ label,
2684
+ active = false,
2685
+ items,
2686
+ activeItemId,
2687
+ onItemClick,
2688
+ onCategoryClick,
2689
+ href,
2690
+ renderLink
2691
+ }) {
2692
+ const { expanded, openCategoryId, setOpenCategoryId } = useSingleMenuSidebar();
2693
+ const hasItems = !!items && items.length > 0;
2694
+ const isOpen = hasItems ? openCategoryId === id : false;
2695
+ const isLeafActive = !hasItems && (activeItemId !== void 0 ? activeItemId === id : !!active);
2696
+ const containsActive = hasItems && items.some((item) => item.id === activeItemId);
2697
+ const selected = !expanded ? hasItems ? isOpen || containsActive : isLeafActive : hasItems ? isOpen : isLeafActive && openCategoryId == null;
2698
+ const state = selected ? "selected" : "default";
2699
+ const s = category({ state, collapsed: !expanded });
2700
+ const handleToggle = () => {
2701
+ if (hasItems) {
2702
+ setOpenCategoryId(isOpen ? null : id);
2703
+ onCategoryClick?.();
2704
+ } else {
2705
+ onItemClick?.(id);
2706
+ setOpenCategoryId(null);
2707
+ onCategoryClick?.();
2708
+ }
2709
+ };
2710
+ if (!expanded) {
2711
+ return /* @__PURE__ */ jsxRuntime.jsxs(avatar.Tooltip, { children: [
2712
+ /* @__PURE__ */ jsxRuntime.jsx(
2713
+ avatar.TooltipTrigger,
2714
+ {
2715
+ role: "button",
2716
+ tabIndex: 0,
2717
+ onClick: handleToggle,
2718
+ onKeyDown: (e) => {
2719
+ if (e.key === "Enter" || e.key === " ") {
2720
+ e.preventDefault();
2721
+ handleToggle();
2722
+ }
2723
+ },
2724
+ className: s.root(),
2725
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.icon(), children: icon })
2726
+ }
2727
+ ),
2728
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.TooltipContent, { side: "right", sideOffset: 8, children: label })
2729
+ ] });
2730
+ }
2731
+ if (!hasItems) {
2732
+ const conteudo = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2733
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.icon(), children: icon }),
2734
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: avatar.cn(s.text(), styles.textFadeIn), children: label })
2735
+ ] });
2736
+ if (href) {
2737
+ const linkProps = {
2738
+ href,
2739
+ className: s.root(),
2740
+ onClick: (e) => {
2741
+ if (!renderLink) {
2742
+ const prevent = shouldPreventNavigation({ href, hasHandler: true, event: e });
2743
+ if (prevent) e.preventDefault();
2744
+ }
2745
+ handleToggle();
2746
+ },
2747
+ "aria-current": selected ? "page" : void 0,
2748
+ children: conteudo
2749
+ };
2750
+ if (renderLink) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderLink(linkProps) });
2751
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { ...linkProps });
2752
+ }
2753
+ return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: handleToggle, className: s.root(), children: conteudo });
2754
+ }
2755
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2756
+ avatar.Collapsible,
2757
+ {
2758
+ open: isOpen,
2759
+ onOpenChange: (open) => {
2760
+ setOpenCategoryId(open ? id : null);
2761
+ onCategoryClick?.();
2762
+ },
2763
+ children: [
2764
+ /* @__PURE__ */ jsxRuntime.jsxs(avatar.CollapsibleTrigger, { className: s.root(), children: [
2765
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.icon(), children: icon }),
2766
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: avatar.cn(s.text(), styles.textFadeIn), children: label }),
2767
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: avatar.cn(s.chevron(), isOpen && "rotate-180") })
2768
+ ] }),
2769
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.CollapsibleContent, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.subItemList, children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
2770
+ SingleMenuItem,
2771
+ {
2772
+ label: item.label,
2773
+ selected: item.id === activeItemId,
2774
+ href: item.href,
2775
+ renderLink,
2776
+ interceptNavigation: !!onItemClick,
2777
+ onClick: () => onItemClick?.(item.id)
2778
+ },
2779
+ item.id
2780
+ )) }) })
2781
+ ]
2782
+ }
2783
+ );
2784
+ }
2785
+ SingleMenuCategory.displayName = "SingleMenuCategory";
2786
+ function SingleMenuFooter({
2787
+ name,
2788
+ email,
2789
+ avatar: avatar$1,
2790
+ actions,
2791
+ onAction
2792
+ }) {
2793
+ const { expanded } = useSingleMenuSidebar();
2794
+ const s = styles.footer;
2795
+ const triggerContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2796
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.avatar, children: avatar$1 ?? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { className: s.avatarIcon }) }),
2797
+ expanded && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2798
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.textContainer, children: [
2799
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.name, children: name }),
2800
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.email, children: email })
2801
+ ] }),
2802
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: s.chevron })
2803
+ ] })
2804
+ ] });
2805
+ if (!actions || actions.length === 0) {
2806
+ 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 }) });
2807
+ }
2808
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.wrapper, children: /* @__PURE__ */ jsxRuntime.jsxs(avatar.DropdownMenu, { children: [
2809
+ /* @__PURE__ */ jsxRuntime.jsx(
2810
+ avatar.DropdownMenuTrigger,
2811
+ {
2812
+ className: avatar.cn(s.button, !expanded && "justify-center px-0"),
2813
+ children: triggerContent
2814
+ }
2815
+ ),
2816
+ /* @__PURE__ */ jsxRuntime.jsxs(
2817
+ avatar.DropdownMenuContent,
2818
+ {
2819
+ side: expanded ? "top" : "right",
2820
+ sideOffset: 8,
2821
+ align: expanded ? "end" : "start",
2822
+ children: [
2823
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs(avatar.DropdownMenuLabel, { className: s.dropdownLabel, children: [
2824
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownLabelName, children: name }),
2825
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownLabelEmail, children: email })
2826
+ ] }) }),
2827
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuSeparator, {}),
2828
+ actions.map((action) => /* @__PURE__ */ jsxRuntime.jsxs(
2829
+ avatar.DropdownMenuItem,
2830
+ {
2831
+ variant: action.variant === "destructive" ? "destructive" : "default",
2832
+ onClick: () => onAction?.(action.id),
2833
+ className: s.dropdownItem,
2834
+ children: [
2835
+ action.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownItemIcon, children: action.icon }),
2836
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: action.label })
2837
+ ]
2838
+ },
2839
+ action.id
2840
+ ))
2841
+ ]
2842
+ }
2843
+ )
2844
+ ] }) });
2845
+ }
2846
+ SingleMenuFooter.displayName = "SingleMenuFooter";
2847
+ function SingleMenuSidebar({
2848
+ logo,
2849
+ title,
2850
+ module: module2,
2851
+ modules,
2852
+ activeModuleId,
2853
+ defaultModuleId,
2854
+ onModuleChange,
2855
+ showSearch = true,
2856
+ searchPlaceholder,
2857
+ searchCommand,
2858
+ categories,
2859
+ activeItemId,
2860
+ onItemClick,
2861
+ renderLink,
2862
+ user,
2863
+ defaultExpanded = true,
2864
+ expanded: controlledExpanded,
2865
+ onExpandedChange,
2866
+ showToggleIndicator = false,
2867
+ className,
2868
+ ...props
2869
+ }) {
2870
+ const {
2871
+ expanded,
2872
+ isHoverExpand,
2873
+ toggle,
2874
+ onMouseEnter,
2875
+ onMouseLeave,
2876
+ openCategoryId,
2877
+ setOpenCategoryId
2878
+ } = useSingleMenuSidebarState(
2879
+ defaultExpanded,
2880
+ controlledExpanded,
2881
+ onExpandedChange
2882
+ );
2883
+ const hasModules = !!modules && modules.length > 0;
2884
+ const [internalModuleId, setInternalModuleId] = React.useState(
2885
+ defaultModuleId ?? modules?.[0]?.id
2886
+ );
2887
+ const currentModuleId = activeModuleId ?? internalModuleId;
2888
+ const activeModule = hasModules ? modules.find((m) => m.id === currentModuleId) ?? modules[0] : void 0;
2889
+ const handleModuleChange = (id) => {
2890
+ if (activeModuleId === void 0) setInternalModuleId(id);
2891
+ onModuleChange?.(id);
2892
+ };
2893
+ const moduleDisplay = hasModules ? {
2894
+ icon: activeModule.icon,
2895
+ title: activeModule.title,
2896
+ subtitle: activeModule.subtitle ?? "",
2897
+ options: modules.map((m) => ({
2898
+ id: m.id,
2899
+ label: m.title,
2900
+ icon: m.icon
2901
+ })),
2902
+ onModuleChange: handleModuleChange
2903
+ } : module2;
2904
+ const effectiveCategories = hasModules ? activeModule.categories : categories ?? [];
2905
+ const [commandOpen, setCommandOpen] = React.useState(false);
2906
+ React.useEffect(() => {
2907
+ if (!showSearch) return;
2908
+ const onKey = (e) => {
2909
+ if (e.key.toLowerCase() === "k" && (e.metaKey || e.ctrlKey)) {
2910
+ e.preventDefault();
2911
+ setCommandOpen((o) => !o);
2912
+ }
2913
+ };
2914
+ document.addEventListener("keydown", onKey);
2915
+ return () => document.removeEventListener("keydown", onKey);
2916
+ }, [showSearch]);
2917
+ const selectFromSearch = (id, parentId) => {
2918
+ onItemClick?.(id);
2919
+ setOpenCategoryId(parentId ?? null);
2920
+ };
2921
+ const resolvedOpenCategoryId = openCategoryId ?? effectiveCategories.find(
2922
+ (cat) => cat.items?.some((item) => item.id === activeItemId)
2923
+ )?.id ?? null;
2924
+ const contextValue = React.useMemo(
2925
+ () => ({
2926
+ expanded,
2927
+ isHoverExpand,
2928
+ toggle,
2929
+ openCategoryId: resolvedOpenCategoryId,
2930
+ setOpenCategoryId
2931
+ }),
2932
+ [
2933
+ expanded,
2934
+ isHoverExpand,
2935
+ toggle,
2936
+ resolvedOpenCategoryId,
2937
+ setOpenCategoryId
2938
+ ]
2939
+ );
2940
+ return /* @__PURE__ */ jsxRuntime.jsxs(SingleMenuSidebarContext.Provider, { value: contextValue, children: [
2941
+ /* @__PURE__ */ jsxRuntime.jsx(avatar.TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsxRuntime.jsxs(
2942
+ "aside",
2943
+ {
2944
+ "aria-label": "Navegação lateral",
2945
+ className: avatar.cn(sidebarRoot({ expanded }), className),
2946
+ onMouseEnter,
2947
+ onMouseLeave,
2948
+ ...props,
2949
+ children: [
2950
+ /* @__PURE__ */ jsxRuntime.jsx(
2951
+ SingleMenuHeader,
2952
+ {
2953
+ logo,
2954
+ title,
2955
+ showToggleIndicator
2956
+ }
2957
+ ),
2958
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.divider }),
2959
+ expanded && (moduleDisplay || showSearch) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: avatar.cn(styles.sectionPadding, styles.textFadeIn), children: [
2960
+ moduleDisplay && /* @__PURE__ */ jsxRuntime.jsx(SingleMenuModuleSelector, { ...moduleDisplay }),
2961
+ showSearch && /* @__PURE__ */ jsxRuntime.jsx(
2962
+ SingleMenuSearch,
2963
+ {
2964
+ placeholder: searchPlaceholder,
2965
+ onOpen: () => setCommandOpen(true)
2966
+ }
2967
+ )
2968
+ ] }),
2969
+ expanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.divider }),
2970
+ /* @__PURE__ */ jsxRuntime.jsx(
2971
+ "nav",
2972
+ {
2973
+ className: avatar.cn(
2974
+ styles.navContainer,
2975
+ expanded ? styles.navContainerExpanded : styles.navContainerCollapsed
2976
+ ),
2977
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.navList, children: effectiveCategories.map((cat) => /* @__PURE__ */ jsxRuntime.jsx(
2978
+ SingleMenuCategory,
2979
+ {
2980
+ ...cat,
2981
+ activeItemId,
2982
+ onItemClick,
2983
+ renderLink
2984
+ },
2985
+ cat.id
2986
+ )) })
2987
+ }
2988
+ ),
2989
+ /* @__PURE__ */ jsxRuntime.jsx(SingleMenuFooter, { ...user })
2990
+ ]
2991
+ }
2992
+ ) }),
2993
+ showSearch && /* @__PURE__ */ jsxRuntime.jsx(
2994
+ SingleMenuCommand,
2995
+ {
2996
+ open: commandOpen,
2997
+ onOpenChange: setCommandOpen,
2998
+ categories: effectiveCategories,
2999
+ placeholder: searchPlaceholder,
3000
+ onSelect: selectFromSearch,
3001
+ custom: searchCommand
3002
+ }
3003
+ )
3004
+ ] });
3005
+ }
3006
+ SingleMenuSidebar.displayName = "SingleMenuSidebar";
2261
3007
  function deriveInitials(name) {
2262
3008
  return name.split(" ").filter(Boolean).map((p) => p[0]).join("").slice(0, 2).toUpperCase();
2263
3009
  }
@@ -2392,10 +3138,17 @@ function UserMenu({
2392
3138
  }
2393
3139
  const root = avatar.tv({
2394
3140
  base: [
2395
- "flex h-screen w-full bg-bg-canvas",
3141
+ "flex w-full bg-bg-canvas",
2396
3142
  "overflow-hidden"
2397
- // garante que sidebar + main não vazem viewport
2398
- ]
3143
+ // garante que sidebar + main não vazem o container
3144
+ ],
3145
+ variants: {
3146
+ fillHeight: {
3147
+ false: "h-screen",
3148
+ true: "h-full"
3149
+ }
3150
+ },
3151
+ defaultVariants: { fillHeight: false }
2399
3152
  });
2400
3153
  const main = avatar.tv({
2401
3154
  base: [
@@ -2437,47 +3190,60 @@ const bodyInner = avatar.tv({
2437
3190
  mobileEdgeToEdge: false
2438
3191
  }
2439
3192
  });
2440
- function AppShell({
2441
- // Sidebar
2442
- contexts,
2443
- defaultActiveContextId,
2444
- activeContextId,
2445
- onContextChange,
2446
- defaultActiveItemHref,
2447
- activeItemHref,
2448
- onItemClick,
2449
- renderLink,
2450
- brandHref,
2451
- onBrandClick,
2452
- // Header
2453
- breadcrumb,
2454
- commandGroups,
2455
- commandPlaceholder,
2456
- commandEmptyMessage,
2457
- searchPlaceholder,
2458
- notifications,
2459
- messages,
2460
- theme,
2461
- onThemeChange,
2462
- themeOptions,
2463
- headerRightSlot,
2464
- // User menu
2465
- user,
2466
- layout,
2467
- onLayoutChange,
2468
- layoutOptions,
2469
- onSettings,
2470
- onLogout,
2471
- // Menu collapse (controlled/uncontrolled)
2472
- menuCollapsed: controlledCollapsed,
2473
- defaultMenuCollapsed,
2474
- onMenuCollapseChange,
2475
- // Body
2476
- children,
2477
- bodyClassName,
2478
- mobileEdgeToEdge,
2479
- className
2480
- }) {
3193
+ function AppShell(props) {
3194
+ const {
3195
+ // Sidebar
3196
+ contexts,
3197
+ defaultActiveContextId,
3198
+ activeContextId,
3199
+ onContextChange,
3200
+ defaultActiveItemHref,
3201
+ activeItemHref,
3202
+ onItemClick,
3203
+ renderLink,
3204
+ brandHref,
3205
+ onBrandClick,
3206
+ // Header
3207
+ breadcrumb,
3208
+ commandGroups,
3209
+ commandPlaceholder,
3210
+ commandEmptyMessage,
3211
+ searchPlaceholder,
3212
+ notifications,
3213
+ messages,
3214
+ theme,
3215
+ onThemeChange,
3216
+ themeOptions,
3217
+ headerRightSlot,
3218
+ // User menu
3219
+ user,
3220
+ layout,
3221
+ onLayoutChange,
3222
+ layoutOptions,
3223
+ onSettings,
3224
+ onLogout,
3225
+ // Menu collapse (controlled/uncontrolled)
3226
+ menuCollapsed: controlledCollapsed,
3227
+ defaultMenuCollapsed,
3228
+ onMenuCollapseChange,
3229
+ // Body
3230
+ children,
3231
+ bodyClassName,
3232
+ mobileEdgeToEdge,
3233
+ fillHeight,
3234
+ // Escolha da sidebar. SEM default aqui: um default literal estreitaria o tipo pra
3235
+ // "menu" e o TS marcaria a comparação com "single" como morta (TS2367).
3236
+ sidebar,
3237
+ categories,
3238
+ sidebarLogo,
3239
+ sidebarTitle,
3240
+ activeItemId,
3241
+ onSidebarItemClick,
3242
+ sidebarModules,
3243
+ sidebarShowSearch,
3244
+ sidebarSearchPlaceholder,
3245
+ className
3246
+ } = props;
2481
3247
  const [internalCollapsed, setInternalCollapsed] = React.useState(() => {
2482
3248
  if (defaultMenuCollapsed !== void 0) return defaultMenuCollapsed;
2483
3249
  if (typeof window === "undefined") return false;
@@ -2509,37 +3275,73 @@ function AppShell({
2509
3275
  onLogout
2510
3276
  }
2511
3277
  ) : void 0;
2512
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: avatar.cn(root(), className), children: [
2513
- /* @__PURE__ */ jsxRuntime.jsx(
2514
- MenuSidebar,
2515
- {
2516
- contexts,
2517
- activeContextId,
2518
- defaultActiveContextId,
2519
- onContextChange,
2520
- activeItemHref,
2521
- defaultActiveItemHref,
2522
- onItemClick,
2523
- renderLink,
2524
- brandHref,
2525
- onBrandClick,
2526
- user: userNode,
2527
- panelCollapsed: menuCollapsed,
2528
- onPanelCollapseChange: (next) => {
2529
- if (controlledCollapsed === void 0) setInternalCollapsed(next);
2530
- onMenuCollapseChange?.(next);
2531
- },
2532
- mobileOpen: mobileMenuOpen,
2533
- onMobileOpenChange: setMobileMenuOpen
3278
+ const sidebarNode = sidebar === "single" ? /* @__PURE__ */ jsxRuntime.jsx(
3279
+ SingleMenuSidebar,
3280
+ {
3281
+ logo: sidebarLogo,
3282
+ title: sidebarTitle ?? "",
3283
+ categories,
3284
+ modules: sidebarModules,
3285
+ activeItemId,
3286
+ onItemClick: onSidebarItemClick,
3287
+ renderLink,
3288
+ showSearch: sidebarShowSearch ?? false,
3289
+ searchPlaceholder: sidebarSearchPlaceholder,
3290
+ expanded: isMobile ? mobileMenuOpen : !menuCollapsed,
3291
+ onExpandedChange: (next) => {
3292
+ if (isMobile) {
3293
+ setMobileMenuOpen(next);
3294
+ return;
3295
+ }
3296
+ const nextCollapsed = !next;
3297
+ if (controlledCollapsed === void 0) setInternalCollapsed(nextCollapsed);
3298
+ onMenuCollapseChange?.(nextCollapsed);
3299
+ },
3300
+ user: {
3301
+ name: user?.name ?? "",
3302
+ email: user?.email ?? "",
3303
+ actions: [
3304
+ ...onSettings ? [{ id: "settings", label: "Configurações" }] : [],
3305
+ ...onLogout ? [{ id: "logout", label: "Sair", variant: "destructive" }] : []
3306
+ ],
3307
+ onAction: (id) => {
3308
+ if (id === "settings") onSettings?.();
3309
+ if (id === "logout") onLogout?.();
3310
+ }
2534
3311
  }
2535
- ),
3312
+ }
3313
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
3314
+ MenuSidebar,
3315
+ {
3316
+ contexts,
3317
+ activeContextId,
3318
+ defaultActiveContextId,
3319
+ onContextChange,
3320
+ activeItemHref,
3321
+ defaultActiveItemHref,
3322
+ onItemClick,
3323
+ renderLink,
3324
+ brandHref,
3325
+ onBrandClick,
3326
+ user: userNode,
3327
+ panelCollapsed: menuCollapsed,
3328
+ onPanelCollapseChange: (next) => {
3329
+ if (controlledCollapsed === void 0) setInternalCollapsed(next);
3330
+ onMenuCollapseChange?.(next);
3331
+ },
3332
+ mobileOpen: mobileMenuOpen,
3333
+ onMobileOpenChange: setMobileMenuOpen
3334
+ }
3335
+ );
3336
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: avatar.cn(root({ fillHeight: fillHeight ?? false }), className), children: [
3337
+ sidebarNode,
2536
3338
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: main(), children: [
2537
3339
  /* @__PURE__ */ jsxRuntime.jsx(
2538
3340
  Header,
2539
3341
  {
2540
3342
  breadcrumb,
2541
- onCollapseMenu: handleToggleMenu,
2542
- menuCollapsed,
3343
+ onCollapseMenu: sidebar === "single" && !isMobile ? void 0 : handleToggleMenu,
3344
+ menuCollapsed: isMobile ? !mobileMenuOpen : menuCollapsed,
2543
3345
  commandGroups,
2544
3346
  commandPlaceholder,
2545
3347
  commandEmptyMessage,
@@ -2645,6 +3447,7 @@ exports.SidebarPill = SidebarPill;
2645
3447
  exports.SidebarRail = SidebarRail;
2646
3448
  exports.SidebarSection = SidebarSection;
2647
3449
  exports.SidebarSubgroup = SidebarSubgroup;
3450
+ exports.SingleMenuSidebar = SingleMenuSidebar;
2648
3451
  exports.UserMenu = UserMenu;
2649
3452
  exports.chipCount = chipCount;
2650
3453
  exports.chipVariants = chipVariants;
@@ -2655,4 +3458,4 @@ exports.shouldPreventNavigation = shouldPreventNavigation;
2655
3458
  exports.useControllable = useControllable;
2656
3459
  exports.useMediaQuery = useMediaQuery;
2657
3460
  exports.useTheme = useTheme;
2658
- //# sourceMappingURL=useTheme-BD0nloAv.cjs.map
3461
+ //# sourceMappingURL=useTheme-3iZAognE.cjs.map