@snksergio/design-system 0.45.0 → 0.47.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/README.md +1 -1
- package/dist-lib/chunks/app-shell-mocks-kWIVSzLs.mjs.map +1 -1
- package/dist-lib/chunks/app-shell-mocks-oO_IV3Gw.cjs.map +1 -1
- package/dist-lib/chunks/{avatar-DFWEwBKu.mjs → avatar-Cj_m-wJy.mjs} +42 -42
- package/dist-lib/chunks/avatar-Cj_m-wJy.mjs.map +1 -0
- package/dist-lib/chunks/avatar-eM5txRFZ.cjs.map +1 -1
- package/dist-lib/chunks/chat-v2-mocks-BV9Wha_Z.cjs.map +1 -1
- package/dist-lib/chunks/chat-v2-mocks-DvZRkhmz.mjs.map +1 -1
- package/dist-lib/chunks/{input-CfmzMYtd.mjs → input-CwRzwVPt.mjs} +2 -2
- package/dist-lib/chunks/{input-CfmzMYtd.mjs.map → input-CwRzwVPt.mjs.map} +1 -1
- package/dist-lib/chunks/{kpi-delta-B_1xjDu_.mjs → kpi-delta-D9p1xD4T.mjs} +3 -3
- package/dist-lib/chunks/{kpi-delta-B_1xjDu_.mjs.map → kpi-delta-D9p1xD4T.mjs.map} +1 -1
- package/dist-lib/chunks/{kpi-delta-CXGg2nBx.cjs → kpi-delta-DwQWNM-F.cjs} +2 -2
- package/dist-lib/chunks/{kpi-delta-CXGg2nBx.cjs.map → kpi-delta-DwQWNM-F.cjs.map} +1 -1
- package/dist-lib/chunks/{page-header--cPS_Z-a.mjs → page-header-DUxZjGdR.mjs} +2 -2
- package/dist-lib/chunks/page-header-DUxZjGdR.mjs.map +1 -0
- package/dist-lib/chunks/page-header-DvAJoEfb.cjs.map +1 -1
- package/dist-lib/chunks/{panel-DtQi10ps.mjs → panel-BlMiCA9Z.mjs} +17 -7
- package/dist-lib/chunks/panel-BlMiCA9Z.mjs.map +1 -0
- package/dist-lib/chunks/{panel-4aMDou7z.cjs → panel-DTVjD2gJ.cjs} +14 -4
- package/dist-lib/chunks/panel-DTVjD2gJ.cjs.map +1 -0
- package/dist-lib/chunks/{sheet-D1vQth7X.mjs → sheet-Bc-LMBDF.mjs} +2 -2
- package/dist-lib/chunks/sheet-Bc-LMBDF.mjs.map +1 -0
- package/dist-lib/chunks/sheet-j-d_UX7R.cjs.map +1 -1
- package/dist-lib/chunks/{toggle-group-CFiAGdm7.mjs → toggle-group-Bol3G73g.mjs} +55 -19
- package/dist-lib/chunks/toggle-group-Bol3G73g.mjs.map +1 -0
- package/dist-lib/chunks/{toggle-group-BC4eS3Gt.cjs → toggle-group-sXg1B2wN.cjs} +42 -6
- package/dist-lib/chunks/toggle-group-sXg1B2wN.cjs.map +1 -0
- package/dist-lib/chunks/{useTheme-C9Y6vxTf.cjs → useTheme-BB3QhUpu.cjs} +5 -2
- package/dist-lib/chunks/useTheme-BB3QhUpu.cjs.map +1 -0
- package/dist-lib/chunks/{useTheme-DCmzLBUR.mjs → useTheme-DNqHuA6o.mjs} +6 -3
- package/dist-lib/chunks/useTheme-DNqHuA6o.mjs.map +1 -0
- package/dist-lib/index.cjs +93 -5
- package/dist-lib/index.cjs.map +1 -1
- package/dist-lib/index.mjs +235 -147
- package/dist-lib/index.mjs.map +1 -1
- package/dist-lib/preview/chat.cjs +1 -1
- package/dist-lib/preview/chat.cjs.map +1 -1
- package/dist-lib/preview/chat.mjs +3 -3
- package/dist-lib/preview/chat.mjs.map +1 -1
- package/dist-lib/preview/clientes.cjs +2 -2
- package/dist-lib/preview/clientes.mjs +6 -6
- package/dist-lib/preview/dashboard.cjs +2 -2
- package/dist-lib/preview/dashboard.mjs +4 -4
- package/dist-lib/shadcn.cjs +2 -14
- package/dist-lib/shadcn.cjs.map +1 -1
- package/dist-lib/shadcn.mjs +56 -69
- package/dist-lib/shadcn.mjs.map +1 -1
- package/dist-lib/src/components/index.d.ts +1 -0
- package/dist-lib/src/components/index.d.ts.map +1 -1
- package/dist-lib/src/components/shadcn/tabs.d.ts +40 -8
- package/dist-lib/src/components/shadcn/tabs.d.ts.map +1 -1
- package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts +10 -3
- package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts.map +1 -1
- package/dist-lib/src/components/ui/DataTable/hooks/use-grab-to-scroll.d.ts.map +1 -1
- package/dist-lib/src/components/ui/MenuSidebar/sidebar-brand.d.ts +15 -0
- package/dist-lib/src/components/ui/MenuSidebar/sidebar-brand.d.ts.map +1 -1
- package/dist-lib/src/components/ui/ScreenLoader/index.d.ts +3 -0
- package/dist-lib/src/components/ui/ScreenLoader/index.d.ts.map +1 -0
- package/dist-lib/src/components/ui/ScreenLoader/screen-loader.d.ts +21 -0
- package/dist-lib/src/components/ui/ScreenLoader/screen-loader.d.ts.map +1 -0
- package/dist-lib/src/components/ui/ScreenLoader/screen-loader.styles.d.ts +111 -0
- package/dist-lib/src/components/ui/ScreenLoader/screen-loader.styles.d.ts.map +1 -0
- package/dist-lib/src/components/ui/ScreenLoader/screen-loader.types.d.ts +26 -0
- package/dist-lib/src/components/ui/ScreenLoader/screen-loader.types.d.ts.map +1 -0
- package/dist-lib/src/components/ui/SingleMenuSidebar/header.d.ts.map +1 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.types.d.ts +8 -4
- package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.types.d.ts.map +1 -1
- package/dist-lib/src/components/ui/Spinner/spinner.styles.d.ts +9 -0
- package/dist-lib/src/components/ui/Spinner/spinner.styles.d.ts.map +1 -1
- package/dist-lib/theme/brand-blue.css +110 -110
- package/dist-lib/theme/brand-green.css +110 -110
- package/dist-lib/theme/brand-pay.css +189 -189
- package/dist-lib/theme/brand-vibrant.css +148 -148
- package/dist-lib/tokens.cjs.map +1 -1
- package/dist-lib/tokens.mjs.map +1 -1
- package/package.json +1 -1
- package/dist-lib/chunks/avatar-DFWEwBKu.mjs.map +0 -1
- package/dist-lib/chunks/page-header--cPS_Z-a.mjs.map +0 -1
- package/dist-lib/chunks/panel-4aMDou7z.cjs.map +0 -1
- package/dist-lib/chunks/panel-DtQi10ps.mjs.map +0 -1
- package/dist-lib/chunks/sheet-D1vQth7X.mjs.map +0 -1
- package/dist-lib/chunks/toggle-group-BC4eS3Gt.cjs.map +0 -1
- package/dist-lib/chunks/toggle-group-CFiAGdm7.mjs.map +0 -1
- package/dist-lib/chunks/useTheme-C9Y6vxTf.cjs.map +0 -1
- package/dist-lib/chunks/useTheme-DCmzLBUR.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTheme-BB3QhUpu.cjs","sources":["../../src/components/ui/Header/header.styles.ts","../../src/components/ui/Header/header-breadcrumb.tsx","../../src/components/ui/Header/header-search.tsx","../../src/components/ui/Chip/chip.styles.ts","../../src/components/ui/Chip/chip.tsx","../../src/components/ui/Chip/chip-group.tsx","../../src/components/ui/Header/header-notifications.tsx","../../src/components/ui/Header/header-messages.tsx","../../src/components/ui/Header/header-theme-switcher.tsx","../../src/components/ui/Header/header.tsx","../../src/components/ui/MenuSidebar/sidebar.styles.ts","../../src/components/ui/MenuSidebar/sidebar-brand.tsx","../../src/utils/nav-link.ts","../../src/components/ui/MenuSidebar/sidebar-rail.tsx","../../src/components/ui/MenuSidebar/sidebar-item.tsx","../../src/components/ui/MenuSidebar/sidebar-subgroup.tsx","../../src/components/ui/MenuSidebar/sidebar-section.tsx","../../src/components/ui/MenuSidebar/sidebar-panel.tsx","../../src/components/ui/MenuSidebar/use-sidebar-state.ts","../../src/components/ui/MenuSidebar/use-media-query.ts","../../src/components/ui/MenuSidebar/menu-sidebar.tsx","../../src/components/ui/SingleMenuSidebar/use-single-menu-sidebar.ts","../../src/components/ui/SingleMenuSidebar/single-menu-sidebar.styles.ts","../../src/components/ui/SingleMenuSidebar/header.tsx","../../src/components/ui/SingleMenuSidebar/module-selector.tsx","../../src/components/ui/SingleMenuSidebar/search.tsx","../../src/components/ui/SingleMenuSidebar/command.tsx","../../src/components/ui/SingleMenuSidebar/menu-item.tsx","../../src/components/ui/SingleMenuSidebar/category.tsx","../../src/components/ui/SingleMenuSidebar/footer.tsx","../../src/components/ui/SingleMenuSidebar/single-menu-sidebar.tsx","../../src/components/ui/AppShell/user-menu.tsx","../../src/components/ui/AppShell/app-shell.styles.ts","../../src/components/ui/AppShell/app-shell.tsx","../../src/hooks/useTheme.ts"],"sourcesContent":["import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Header styles — alinhado com `.header` do design-and-table-v2.\r\n *\r\n * Layout:\r\n * - height 60px, padding-x 16px, border-bottom subtle\r\n * - left: collapse btn + divider + breadcrumb\r\n * - right: search + theme + messages + notifications (gap 4)\r\n *\r\n * Position é responsabilidade do consumer (template). Componente só define\r\n * altura/layout/cores.\r\n */\r\n\r\n/* ── Root ─────────────────────────────────────────────────────────────────── */\r\nexport const headerRoot = tv({\r\n base: [\r\n \"flex items-center justify-between gap-gp-lg\",\r\n \"h-[60px] flex-none px-pad-2xl\",\r\n \"bg-bg-canvas border-b border-border-subtle\",\r\n \"text-fg-default font-sans\",\r\n ],\r\n});\r\n\r\nexport const headerLeft = tv({\r\n base: \"flex items-center gap-gp-md min-w-0 flex-1\",\r\n});\r\n\r\nexport const headerRight = tv({\r\n base: \"flex items-center gap-gp-sm shrink-0\",\r\n});\r\n\r\nexport const headerDivider = tv({\r\n base: \"h-[24px] w-px bg-border-default shrink-0 mx-pad-xs\",\r\n});\r\n\r\n/* ── Icon button (header-level) ───────────────────────────────────────────── */\r\n/**\r\n * Os icon-buttons \"trigger\" do header (theme/notifications/messages) agora usam\r\n * `<Button>` do DS. Este `headerIconBtn` é mantido APENAS pro botão de collapse\r\n * do menu — que tem visual ghost específico do header (radius menor, hover sutil).\r\n */\r\nexport const headerIconBtn = tv({\r\n base: [\r\n \"relative inline-flex items-center justify-center\",\r\n \"w-form-md h-form-md rounded-radius-md\",\r\n \"cursor-pointer text-fg-default\",\r\n \"transition-colors duration-150\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\r\n ],\r\n variants: {\r\n variant: {\r\n ghost: \"bg-transparent border-0 hover:bg-bg-muted\",\r\n },\r\n },\r\n defaultVariants: { variant: \"ghost\" },\r\n});\r\n\r\n/**\r\n * Badge dot (indicador de unread) no canto do icon-button do header.\r\n * Variantes seguem o sandbox: brand (mensagens) / danger (notificações alerta).\r\n */\r\nexport const headerIconBtnBadge = tv({\r\n base: \"absolute top-[4px] right-[4px] w-[8px] h-[8px] rounded-full ring-2 ring-bg-canvas\",\r\n variants: {\r\n kind: {\r\n brand: \"bg-bg-brand\",\r\n danger: \"bg-bg-danger\",\r\n },\r\n },\r\n defaultVariants: { kind: \"brand\" },\r\n});\r\n\r\n/* ── Breadcrumb ───────────────────────────────────────────────────────────── */\r\nexport const breadcrumbRoot = tv({\r\n base: \"flex items-center gap-gp-sm min-w-0\",\r\n});\r\n\r\nexport const breadcrumbItem = tv({\r\n base: \"font-medium truncate transition-colors leading-none\",\r\n variants: {\r\n current: {\r\n true: \"text-fg-default font-semibold\",\r\n false: \"text-fg-muted hover:text-fg-default cursor-pointer\",\r\n },\r\n /** Quando único item no breadcrumb (= título da página), font-size sobe pra 16px */\r\n standalone: {\r\n true: \"text-body-lg\",\r\n false: \"text-body-sm font-normal\",\r\n },\r\n },\r\n defaultVariants: { current: false, standalone: false },\r\n});\r\n\r\nexport const breadcrumbSeparator = tv({\r\n base: \"text-fg-subtle shrink-0\",\r\n});\r\n\r\n/* ── Search (fake input) ──────────────────────────────────────────────────── */\r\nexport const searchFakeInput = tv({\r\n base: [\r\n \"inline-flex items-center gap-gp-md h-form-md w-[180px]\",\r\n \"px-pad-xl rounded-radius-md\",\r\n \"bg-bg-subtle border border-border-subtle cursor-pointer\",\r\n \"text-fg-subtle text-body-sm font-normal\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-muted hover:border-border-default\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\r\n ],\r\n});\r\n\r\nexport const searchFakeInputIcon = tv({\r\n base: \"size-[14px] text-fg-subtle shrink-0\",\r\n});\r\n\r\nexport const searchFakeInputText = tv({\r\n base: \"flex-1 text-left truncate\",\r\n});\r\n\r\nexport const searchFakeInputKbd = tv({\r\n base: [\r\n \"ml-auto inline-flex items-center justify-center\",\r\n \"h-[20px] px-pad-xs rounded-radius-xs\",\r\n \"bg-bg-canvas border border-border-subtle dark:bg-bg-muted\",\r\n \"text-caption-xs font-semibold text-fg-muted tabular-nums shrink-0\",\r\n ],\r\n});\r\n\r\n/* ── Dropdown chrome (notifications, messages) ────────────────────────────── */\r\n/**\r\n * Pattern compartilhado: bell/msg → click → dropdown ancorado abaixo direita.\r\n * Reusa o token bg-dropdown (frosted-glass) e os mesmos padrões do DropdownMenu.\r\n */\r\nexport const hdWrap = tv({\r\n base: \"relative inline-flex\",\r\n});\r\n\r\nexport const hdDropdown = tv({\r\n base: [\r\n \"absolute top-[calc(100%+8px)] right-0 z-50\",\r\n \"w-[380px] max-w-[calc(100vw-32px)] max-h-[520px] flex flex-col\",\r\n \"rounded-[12px] bg-bg-dropdown\",\r\n \"border border-border-default shadow-sh-lg outline-float\",\r\n \"before:pointer-events-none before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150\",\r\n \"overflow-hidden\",\r\n // Animation\r\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\r\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\r\n ],\r\n});\r\n\r\nexport const hdTop = tv({\r\n base: \"flex flex-col gap-gp-md p-pad-xl border-b border-border-subtle bg-bg-canvas/40\",\r\n});\r\n\r\nexport const hdHeader = tv({\r\n base: \"flex items-center justify-between\",\r\n});\r\n\r\nexport const hdTitle = tv({\r\n base: \"flex items-center gap-gp-sm text-body-lg font-semibold text-fg-default\",\r\n});\r\n\r\nexport const hdTitleCount = tv({\r\n base: [\r\n \"inline-flex items-center justify-center min-w-[20px] h-[20px] px-pad-xs\",\r\n \"rounded-radius-xs bg-bg-brand text-fg-on-brand\",\r\n \"text-caption-sm font-bold tabular-nums\",\r\n ],\r\n});\r\n\r\nexport const hdHeaderActions = tv({\r\n base: \"flex items-center gap-gp-xs\",\r\n});\r\n\r\n/* ── Search interno (msgs) ────────────────────────────────────────────────── */\r\nexport const hdSearch = tv({\r\n base: [\r\n \"inline-flex items-center gap-gp-sm h-form-sm w-full\",\r\n \"px-pad-lg rounded-radius-md\",\r\n \"bg-bg-input border border-border-input\",\r\n \"transition-colors duration-150\",\r\n \"focus-within:border-border-brand focus-within:ring-4 focus-within:ring-ring-brand\",\r\n ],\r\n});\r\n\r\nexport const hdSearchIcon = tv({\r\n base: \"size-[14px] text-fg-muted shrink-0\",\r\n});\r\n\r\nexport const hdSearchInput = tv({\r\n base: \"flex-1 min-w-0 bg-transparent border-0 outline-none text-body-sm font-normal text-fg-default placeholder:text-fg-subtle\",\r\n});\r\n\r\n/* ── Tabs (filtros internos) ──────────────────────────────────────────────── */\r\nexport const hdTabs = tv({\r\n base: \"flex items-center gap-gp-2xs p-[3px] rounded-radius-lg bg-bg-muted\",\r\n});\r\n\r\nexport const hdTab = tv({\r\n base: [\r\n \"inline-flex items-center justify-center gap-gp-xs\",\r\n \"h-[28px] px-[10px] rounded-radius-sm\",\r\n \"text-body-xs font-medium text-fg-muted cursor-pointer\",\r\n \"bg-transparent border-0\",\r\n \"transition-colors duration-150\",\r\n \"hover:text-fg-default\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-secondary\",\r\n ],\r\n variants: {\r\n active: {\r\n true: \"bg-bg-accent text-fg-default font-semibold shadow-sh-sm dark:shadow-sh-none\",\r\n },\r\n },\r\n});\r\n\r\nexport const hdTabCount = tv({\r\n base: \"text-caption-xs font-bold tabular-nums opacity-70\",\r\n});\r\n\r\n/* ── Body (lista scrollável) ──────────────────────────────────────────────── */\r\nexport const hdBody = tv({\r\n base: \"flex-1 overflow-y-auto p-pad-sm flex flex-col gap-px\",\r\n});\r\n\r\n/* ── Empty state ──────────────────────────────────────────────────────────── */\r\nexport const hdEmpty = tv({\r\n base: \"flex flex-col items-center justify-center gap-gp-md py-pad-7xl text-fg-subtle\",\r\n});\r\n\r\nexport const hdEmptyText = tv({\r\n base: \"text-body-md\",\r\n});\r\n\r\n/* ── Notification item ────────────────────────────────────────────────────── */\r\nexport const hdNotif = tv({\r\n base: [\r\n \"relative flex items-start gap-gp-lg p-pad-lg rounded-radius-md text-left w-full\",\r\n \"bg-transparent border-0 cursor-pointer\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-muted\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-secondary\",\r\n ],\r\n});\r\n\r\nexport const hdNotifIcon = tv({\r\n base: \"flex-none w-[28px] h-[28px] rounded-radius-md grid place-items-center\",\r\n});\r\n\r\nexport const hdNotifBody = tv({\r\n base: \"flex-1 min-w-0 flex flex-col gap-gp-2xs\",\r\n});\r\n\r\nexport const hdNotifTitle = tv({\r\n base: \"text-body-sm font-semibold text-fg-default leading-tight\",\r\n});\r\n\r\nexport const hdNotifText = tv({\r\n base: \"text-body-xs font-normal text-fg-muted leading-snug line-clamp-2\",\r\n});\r\n\r\nexport const hdNotifTime = tv({\r\n base: \"text-caption-sm text-fg-subtle\",\r\n});\r\n\r\nexport const hdNotifDot = tv({\r\n base: \"shrink-0 mt-pad-xs w-[8px] h-[8px] rounded-full bg-bg-brand\",\r\n});\r\n\r\n/* ── Message item ─────────────────────────────────────────────────────────── */\r\nexport const hdMsg = tv({\r\n base: [\r\n \"relative flex items-center gap-gp-lg p-pad-lg rounded-radius-md text-left w-full\",\r\n \"bg-transparent border-0 cursor-pointer\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-muted\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-secondary\",\r\n ],\r\n});\r\n\r\nexport const hdMsgAvatar = tv({\r\n base: [\r\n \"flex-none grid place-items-center w-icon-lg h-icon-lg rounded-full\",\r\n \"text-white text-caption-sm font-bold uppercase tracking-[0.02em] leading-none\",\r\n ],\r\n});\r\n\r\nexport const hdMsgBody = tv({\r\n base: \"flex-1 min-w-0 flex flex-col gap-gp-2xs\",\r\n});\r\n\r\nexport const hdMsgRow = tv({\r\n base: \"flex items-center justify-between gap-gp-sm\",\r\n});\r\n\r\nexport const hdMsgName = tv({\r\n base: \"text-body-sm font-semibold text-fg-default truncate\",\r\n});\r\n\r\nexport const hdMsgTime = tv({\r\n base: \"text-caption-sm text-fg-subtle shrink-0\",\r\n});\r\n\r\nexport const hdMsgPreviewRow = tv({\r\n base: \"flex items-center gap-gp-sm\",\r\n});\r\n\r\nexport const hdMsgPreview = tv({\r\n base: \"flex-1 min-w-0 text-body-xs font-normal text-fg-muted truncate\",\r\n});\r\n\r\nexport const hdMsgDot = tv({\r\n base: \"shrink-0 w-[8px] h-[8px] rounded-full bg-bg-brand\",\r\n});\r\n\r\n/* ── Footer ───────────────────────────────────────────────────────────────── */\r\nexport const hdFooter = tv({\r\n base: \"flex-none p-pad-md border-t border-border-subtle text-center\",\r\n});\r\n\r\nexport const hdFooterLink = tv({\r\n base: [\r\n \"inline-flex items-center justify-center gap-gp-sm\",\r\n \"h-form-sm px-pad-lg rounded-radius-md w-full\",\r\n \"text-body-sm font-medium text-fg-brand no-underline\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-brand-subtle\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-brand\",\r\n ],\r\n});\r\n","import { Fragment } from \"react\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n breadcrumbRoot,\n breadcrumbItem,\n breadcrumbSeparator,\n} from \"./header.styles\";\nimport type { HeaderBreadcrumbItem } from \"./header.types\";\n\nexport type HeaderBreadcrumbProps = {\n items: HeaderBreadcrumbItem[];\n /**\n * Quando true, em mobile (< md) mostra apenas o último item (título da seção\n * atual). Em desktop continua mostrando a cadeia completa.\n */\n mobileShowLastOnly?: boolean;\n className?: string;\n};\n\n/**\n * Breadcrumb / title — auto-renderiza como string única quando 1 item,\n * ou como cadeia \"Item / Item / Item\" quando 2+. Último item nunca é link\n * (representa página atual).\n */\nexport function HeaderBreadcrumb({\n items,\n mobileShowLastOnly,\n className,\n}: HeaderBreadcrumbProps) {\n if (items.length === 0) return null;\n\n /** Quando há 1 só item, renderiza como título (15px). 2+ → cadeia breadcrumb (13px). */\n const isStandalone = items.length === 1;\n const lastItem = items[items.length - 1];\n\n return (\n <>\n {/* Desktop: cadeia completa */}\n <nav\n className={cn(\n breadcrumbRoot(),\n mobileShowLastOnly && \"hidden md:flex\",\n className,\n )}\n aria-label=\"Breadcrumb\"\n >\n {items.map((item, idx) => {\n const isLast = idx === items.length - 1;\n const isClickable =\n !isLast && (item.href !== undefined || item.onClick !== undefined);\n\n return (\n <Fragment key={`${item.label}-${idx}`}>\n {idx > 0 && (\n <ChevronRight\n size={14}\n strokeWidth={1.7}\n className={breadcrumbSeparator()}\n aria-hidden=\"true\"\n />\n )}\n {isClickable ? (\n <a\n href={item.href ?? \"#\"}\n className={breadcrumbItem({\n current: false,\n standalone: isStandalone,\n })}\n onClick={(e) => {\n if (!item.href) e.preventDefault();\n item.onClick?.(e);\n }}\n >\n {item.label}\n </a>\n ) : (\n <span\n className={breadcrumbItem({\n current: isLast,\n standalone: isStandalone,\n })}\n aria-current={isLast ? \"page\" : undefined}\n >\n {item.label}\n </span>\n )}\n </Fragment>\n );\n })}\n </nav>\n\n {/* Mobile: só o último item (título da seção atual) */}\n {mobileShowLastOnly && (\n <nav\n className={cn(breadcrumbRoot(), \"md:hidden\", className)}\n aria-label=\"Seção atual\"\n >\n <span\n className={breadcrumbItem({ current: true, standalone: true })}\n aria-current=\"page\"\n >\n {lastItem.label}\n </span>\n </nav>\n )}\n </>\n );\n}\n","import { useEffect, useState } from \"react\";\r\nimport { Search } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport {\r\n CommandDialog,\r\n CommandInput,\r\n CommandList,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandItem,\r\n CommandSeparator,\r\n CommandShortcut,\r\n} from \"@/components/shadcn/command\";\r\nimport {\r\n searchFakeInput,\r\n searchFakeInputIcon,\r\n searchFakeInputText,\r\n searchFakeInputKbd,\r\n} from \"./header.styles\";\r\nimport type { HeaderCommandGroup } from \"./header.types\";\r\n\r\nexport type HeaderSearchProps = {\r\n placeholder?: string;\r\n shortcut?: string;\r\n commandGroups?: HeaderCommandGroup[];\r\n commandPlaceholder?: string;\r\n commandEmptyMessage?: string;\r\n /** Atalho de teclado pra abrir (default: cmd/ctrl + k) */\r\n hotkey?: { key: string; meta?: boolean; ctrl?: boolean };\r\n className?: string;\r\n};\r\n\r\n/**\r\n * Fake input no header que abre Command palette ao click.\r\n * Atalho ⌘K (Mac) / Ctrl+K (Windows) registrado globalmente.\r\n */\r\nexport function HeaderSearch({\r\n placeholder = \"Buscar...\",\r\n shortcut = \"⌘K\",\r\n commandGroups = [],\r\n commandPlaceholder = \"Digite um comando ou busque...\",\r\n commandEmptyMessage = \"Nenhum resultado encontrado.\",\r\n hotkey = { key: \"k\", meta: true, ctrl: true },\r\n className,\r\n}: HeaderSearchProps) {\r\n const [open, setOpen] = useState(false);\r\n\r\n // Atalho global (⌘K / Ctrl+K)\r\n useEffect(() => {\r\n const handler = (e: KeyboardEvent) => {\r\n if (e.key.toLowerCase() !== hotkey.key.toLowerCase()) return;\r\n const meta = hotkey.meta && e.metaKey;\r\n const ctrl = hotkey.ctrl && e.ctrlKey;\r\n if (meta || ctrl) {\r\n e.preventDefault();\r\n setOpen((o) => !o);\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handler);\r\n return () => window.removeEventListener(\"keydown\", handler);\r\n }, [hotkey.key, hotkey.meta, hotkey.ctrl]);\r\n\r\n return (\r\n <>\r\n {/* Desktop: fake input completo com placeholder + atalho */}\r\n <button\r\n type=\"button\"\r\n className={cn(searchFakeInput(), \"hidden md:inline-flex\", className)}\r\n onClick={() => setOpen(true)}\r\n aria-label=\"Abrir busca\"\r\n >\r\n <Search className={searchFakeInputIcon()} strokeWidth={1.8} />\r\n <span className={searchFakeInputText()}>{placeholder}</span>\r\n <kbd className={searchFakeInputKbd()}>{shortcut}</kbd>\r\n </button>\r\n\r\n {/* Mobile: icon-button (mesma altura/style dos triggers do header) */}\r\n <Button\r\n color=\"secondary\"\r\n variant=\"outline\"\r\n size=\"icon-sm\"\r\n className=\"md:hidden rounded-radius-md\"\r\n onClick={() => setOpen(true)}\r\n aria-label=\"Abrir busca\"\r\n title={`Buscar (${shortcut})`}\r\n >\r\n <Search />\r\n </Button>\r\n\r\n <CommandDialog open={open} onOpenChange={setOpen}>\r\n <CommandInput placeholder={commandPlaceholder} />\r\n <CommandList>\r\n <CommandEmpty>{commandEmptyMessage}</CommandEmpty>\r\n {commandGroups.map((group, gIdx) => (\r\n <CommandGroupBlock\r\n key={group.heading}\r\n group={group}\r\n isLast={gIdx === commandGroups.length - 1}\r\n onSelect={() => setOpen(false)}\r\n />\r\n ))}\r\n </CommandList>\r\n </CommandDialog>\r\n </>\r\n );\r\n}\r\n\r\nfunction CommandGroupBlock({\r\n group,\r\n isLast,\r\n onSelect,\r\n}: {\r\n group: HeaderCommandGroup;\r\n isLast: boolean;\r\n onSelect: () => void;\r\n}) {\r\n return (\r\n <>\r\n <CommandGroup heading={group.heading}>\r\n {group.items.map((item) => {\r\n const Icon = item.icon;\r\n return (\r\n <CommandItem\r\n key={item.id ?? item.label}\r\n value={item.id ?? item.label}\r\n keywords={item.keywords}\r\n onSelect={() => {\r\n item.onSelect();\r\n onSelect();\r\n }}\r\n className={item.destructive ? \"text-fg-danger [&_svg]:text-fg-danger\" : undefined}\r\n >\r\n {Icon && <Icon />}\r\n <span>{item.label}</span>\r\n {item.shortcut && <CommandShortcut>{item.shortcut}</CommandShortcut>}\r\n </CommandItem>\r\n );\r\n })}\r\n </CommandGroup>\r\n {!isLast && <CommandSeparator />}\r\n </>\r\n );\r\n}\r\n","import { tv, type VariantProps } from \"@/utils/tv\";\r\n\r\n/**\r\n * Chip styles — pílula compacta pra status, tags, filtros, abas.\r\n *\r\n * Pode ser estático (span) ou interativo (button via `onClick` / dentro de ChipGroup).\r\n *\r\n * Variantes:\r\n * - color: primary | neutral | danger | warning | success | info\r\n * - variant: solid | outline | soft\r\n * - size: sm (24px) | md (28px = form-xs) | lg (32px = form-sm)\r\n *\r\n * Padding/font-size escalam por size — alturas coerentes com o sistema (sm < form-xs\r\n * pra ficar mais compacto que o menor botão; md/lg alinham com Button).\r\n */\r\nexport const chipVariants = tv({\r\n base: [\r\n \"inline-flex items-center justify-center gap-gp-xs shrink-0\",\r\n \"font-semibold whitespace-nowrap select-none\",\r\n \"transition-[background-color,color,border-color,box-shadow] duration-150\",\r\n \"[&_svg]:shrink-0\",\r\n ],\r\n variants: {\r\n size: {\r\n sm: \"h-[24px] px-pad-md text-caption-sm [&_svg]:size-[12px]\",\r\n md: \"h-form-xs px-pad-lg text-body-xs font-normal [&_svg]:size-[12px]\", // 28px\r\n lg: \"h-form-sm px-pad-xl text-body-sm font-normal [&_svg]:size-[14px]\", // 32px\r\n xl: \"h-form-md px-pad-xl text-body-sm font-normal [&_svg]:size-[14px]\", // 36px (= Button md)\r\n },\r\n /**\r\n * `pill` = rounded-full (default — chip pílula clássico).\r\n * `rounded` = canto arredondado igual ao Button (radius-md em sm/md, radius-lg em lg/xl).\r\n */\r\n shape: {\r\n pill: \"rounded-radius-full\",\r\n rounded: \"\", // aplica via compoundVariants por size\r\n },\r\n color: {\r\n primary: \"\",\r\n neutral: \"\",\r\n danger: \"\",\r\n warning: \"\",\r\n success: \"\",\r\n info: \"\",\r\n },\r\n variant: {\r\n solid: \"\",\r\n outline: \"border\",\r\n soft: \"\",\r\n \"soft-outline\": \"border\",\r\n },\r\n interactive: {\r\n true: \"cursor-pointer outline-none focus-visible:shadow-sh-ring\",\r\n false: \"\",\r\n },\r\n selected: {\r\n true: \"\",\r\n false: \"\",\r\n },\r\n },\r\n compoundVariants: [\r\n /* ── Shape rounded × size — radius proporcional ao Button ──── */\r\n { shape: \"rounded\", size: \"sm\", class: \"rounded-radius-md\" },\r\n { shape: \"rounded\", size: \"md\", class: \"rounded-radius-md\" },\r\n { shape: \"rounded\", size: \"lg\", class: \"rounded-radius-lg\" },\r\n { shape: \"rounded\", size: \"xl\", class: \"rounded-radius-lg\" },\r\n\r\n /* ── Solid ──────────────────────────────────────────────────── */\r\n { color: \"primary\", variant: \"solid\", class: \"bg-bg-brand text-fg-on-brand\" },\r\n { color: \"neutral\", variant: \"solid\", class: \"bg-bg-muted text-fg-default\" },\r\n { color: \"danger\", variant: \"solid\", class: \"bg-bg-danger text-fg-on-danger\" },\r\n { color: \"warning\", variant: \"solid\", class: \"bg-bg-warning text-fg-on-warning\" },\r\n { color: \"success\", variant: \"solid\", class: \"bg-bg-success text-fg-on-success\" },\r\n { color: \"info\", variant: \"solid\", class: \"bg-bg-info text-fg-on-info\" },\r\n\r\n /* ── Outline ────────────────────────────────────────────────── */\r\n { color: \"primary\", variant: \"outline\", class: \"bg-transparent border-border-brand text-fg-brand\" },\r\n { color: \"neutral\", variant: \"outline\", class: \"bg-transparent border-border-default text-fg-default\" },\r\n { color: \"danger\", variant: \"outline\", class: \"bg-transparent border-border-danger-muted text-fg-danger\" },\r\n { color: \"warning\", variant: \"outline\", class: \"bg-transparent border-border-warning-muted text-fg-warning\" },\r\n { color: \"success\", variant: \"outline\", class: \"bg-transparent border-border-success-muted text-fg-success\" },\r\n { color: \"info\", variant: \"outline\", class: \"bg-transparent border-border-info-muted text-fg-info\" },\r\n\r\n /* ── Soft ───────────────────────────────────────────────────── */\r\n { color: \"primary\", variant: \"soft\", class: \"bg-bg-brand-subtle text-fg-brand\" },\r\n { color: \"neutral\", variant: \"soft\", class: \"bg-bg-muted text-fg-muted\" },\r\n { color: \"danger\", variant: \"soft\", class: \"bg-bg-danger-muted text-fg-danger\" },\r\n { color: \"warning\", variant: \"soft\", class: \"bg-bg-warning-muted text-fg-warning\" },\r\n { color: \"success\", variant: \"soft\", class: \"bg-bg-success-muted text-fg-success\" },\r\n { color: \"info\", variant: \"soft\", class: \"bg-bg-info-muted text-fg-info\" },\r\n\r\n /* ── Soft + Outline (bg sutil + borda definida) ─────────────── */\r\n { color: \"primary\", variant: \"soft-outline\", class: \"bg-bg-brand-subtle border-border-brand text-fg-brand\" },\r\n { color: \"neutral\", variant: \"soft-outline\", class: \"bg-bg-muted border-border-default text-fg-muted\" },\r\n { color: \"danger\", variant: \"soft-outline\", class: \"bg-bg-danger-muted border-border-danger-muted text-fg-danger\" },\r\n { color: \"warning\", variant: \"soft-outline\", class: \"bg-bg-warning-muted border-border-warning-muted text-fg-warning\" },\r\n { color: \"success\", variant: \"soft-outline\", class: \"bg-bg-success-muted border-border-success-muted text-fg-success\" },\r\n { color: \"info\", variant: \"soft-outline\", class: \"bg-bg-info-muted border-border-info-muted text-fg-info\" },\r\n\r\n /* ── Hover (somente quando interactive) ────────────────────── */\r\n { interactive: true, color: \"primary\", variant: \"solid\", class: \"hover:bg-bg-brand-hover\" },\r\n { interactive: true, color: \"neutral\", variant: \"solid\", class: \"hover:bg-bg-muted-hover\" },\r\n { interactive: true, color: \"danger\", variant: \"solid\", class: \"hover:bg-bg-danger-hover\" },\r\n { interactive: true, color: \"warning\", variant: \"solid\", class: \"hover:bg-bg-warning-hover\" },\r\n { interactive: true, color: \"success\", variant: \"solid\", class: \"hover:bg-bg-success-hover\" },\r\n { interactive: true, color: \"info\", variant: \"solid\", class: \"hover:bg-bg-info-hover\" },\r\n\r\n { interactive: true, color: \"primary\", variant: \"outline\", class: \"hover:bg-bg-brand-subtle\" },\r\n { interactive: true, color: \"neutral\", variant: \"outline\", class: \"hover:bg-bg-muted\" },\r\n { interactive: true, color: \"danger\", variant: \"outline\", class: \"hover:bg-bg-danger-muted\" },\r\n { interactive: true, color: \"warning\", variant: \"outline\", class: \"hover:bg-bg-warning-muted\" },\r\n { interactive: true, color: \"success\", variant: \"outline\", class: \"hover:bg-bg-success-muted\" },\r\n { interactive: true, color: \"info\", variant: \"outline\", class: \"hover:bg-bg-info-muted\" },\r\n\r\n { interactive: true, color: \"primary\", variant: \"soft\", class: \"hover:bg-bg-brand-subtle-hover\" },\r\n { interactive: true, color: \"neutral\", variant: \"soft\", class: \"hover:bg-bg-muted-hover hover:text-fg-default\" },\r\n { interactive: true, color: \"danger\", variant: \"soft\", class: \"hover:bg-bg-danger-muted-hover\" },\r\n { interactive: true, color: \"warning\", variant: \"soft\", class: \"hover:bg-bg-warning-muted-hover\" },\r\n { interactive: true, color: \"success\", variant: \"soft\", class: \"hover:bg-bg-success-muted-hover\" },\r\n { interactive: true, color: \"info\", variant: \"soft\", class: \"hover:bg-bg-info-muted-hover\" },\r\n\r\n { interactive: true, color: \"primary\", variant: \"soft-outline\", class: \"hover:bg-bg-brand-subtle-hover\" },\r\n { interactive: true, color: \"neutral\", variant: \"soft-outline\", class: \"hover:bg-bg-muted-hover hover:text-fg-default\" },\r\n { interactive: true, color: \"danger\", variant: \"soft-outline\", class: \"hover:bg-bg-danger-muted-hover\" },\r\n { interactive: true, color: \"warning\", variant: \"soft-outline\", class: \"hover:bg-bg-warning-muted-hover\" },\r\n { interactive: true, color: \"success\", variant: \"soft-outline\", class: \"hover:bg-bg-success-muted-hover\" },\r\n { interactive: true, color: \"info\", variant: \"soft-outline\", class: \"hover:bg-bg-info-muted-hover\" },\r\n\r\n /* ── Selected (ChipGroup) — força \"soft\" da color como visual ativo ── */\r\n { selected: true, color: \"primary\", class: \"bg-bg-brand-subtle text-fg-brand border-transparent\" },\r\n { selected: true, color: \"neutral\", class: \"bg-bg-accent text-fg-default font-semibold border-transparent shadow-sh-sm\" },\r\n { selected: true, color: \"danger\", class: \"bg-bg-danger-muted text-fg-danger border-transparent\" },\r\n { selected: true, color: \"warning\", class: \"bg-bg-warning-muted text-fg-warning border-transparent\" },\r\n { selected: true, color: \"success\", class: \"bg-bg-success-muted text-fg-success border-transparent\" },\r\n { selected: true, color: \"info\", class: \"bg-bg-info-muted text-fg-info border-transparent\" },\r\n ],\r\n defaultVariants: {\r\n color: \"neutral\",\r\n variant: \"soft\",\r\n size: \"md\",\r\n shape: \"pill\",\r\n interactive: false,\r\n selected: false,\r\n },\r\n});\r\n\r\nexport type ChipVariantProps = VariantProps<typeof chipVariants>;\r\n\r\n/** Contador inline pra usar como adornment no Chip (ex: \"Não lidas (3)\") */\r\nexport const chipCount = tv({\r\n base: [\r\n \"inline-flex items-center justify-center min-w-[16px] h-[16px] px-[4px]\",\r\n \"rounded-radius-full text-caption-xs font-semibold leading-none\",\r\n \"bg-bg-muted text-fg-default\",\r\n ],\r\n});\r\n","import { forwardRef, type ReactNode } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { chipVariants, type ChipVariantProps } from \"./chip.styles\";\n\nexport type ChipProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement> &\n React.HTMLAttributes<HTMLSpanElement>,\n \"color\"\n> &\n ChipVariantProps & {\n /** Conteúdo (label, ícone, etc) */\n children: ReactNode;\n /**\n * Quando passado, o chip vira `<button>` clicável. Se omitido,\n * renderiza como `<span>` estático (pra status/tag).\n */\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n /** Força renderizar como button mesmo sem onClick */\n asButton?: boolean;\n };\n\n/**\n * Chip — pílula compacta pra status/tags/filtros/abas.\n *\n * Dual-mode:\n * - **Span estático** (default): usado pra Badge-like (status, categoria, count)\n * - **Button interativo**: quando recebe `onClick` OU `asButton`\n *\n * Pra grupo de seleção (radio/checkbox via chips), use `<ChipGroup>`.\n *\n * Variantes:\n * - `color`: primary | neutral | danger | warning | success | info (default `neutral`)\n * - `variant`: solid | outline | soft (default `soft`)\n * - `size`: sm (24px) | md (28px) | lg (32px) (default `md`)\n */\nexport const Chip = forwardRef<HTMLElement, ChipProps>(function Chip(\n {\n children,\n color,\n variant,\n size,\n shape,\n selected,\n onClick,\n asButton,\n className,\n type,\n ...rest\n },\n ref,\n) {\n const interactive = Boolean(onClick) || asButton === true;\n const classes = cn(\n chipVariants({ color, variant, size, shape, interactive, selected }),\n className,\n );\n\n if (interactive) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type={type ?? \"button\"}\n onClick={onClick}\n className={classes}\n aria-pressed={selected}\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {children}\n </button>\n );\n }\n\n return (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n className={classes}\n {...(rest as React.HTMLAttributes<HTMLSpanElement>)}\n >\n {children}\n </span>\n );\n});\n","import { createContext, forwardRef, useContext, type ReactNode } from \"react\";\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\nimport { cn } from \"@/lib/utils\";\nimport { chipVariants, type ChipVariantProps } from \"./chip.styles\";\n\ntype ChipColor = NonNullable<ChipVariantProps[\"color\"]>;\ntype ChipVariant = NonNullable<ChipVariantProps[\"variant\"]>;\ntype ChipSize = NonNullable<ChipVariantProps[\"size\"]>;\ntype ChipShape = NonNullable<ChipVariantProps[\"shape\"]>;\n\n/* ── Classes do estado SELECTED (data-state=on) por color × variant ── */\n/**\n * Mapeamento color × variant → classes aplicadas em items selecionados\n * (Radix dá `data-state=\"on\"` quando ativo).\n *\n * Inclui todas as 4 variants × 6 cores = 24 combos.\n */\nconst SELECTED_CLASSES: Record<ChipColor, Record<ChipVariant, string>> = {\n primary: {\n solid: \"data-[state=on]:bg-bg-brand data-[state=on]:text-fg-on-brand data-[state=on]:border-transparent\",\n outline: \"data-[state=on]:border-border-brand data-[state=on]:text-fg-brand data-[state=on]:bg-transparent\",\n soft: \"data-[state=on]:bg-bg-brand-subtle data-[state=on]:text-fg-brand data-[state=on]:border-transparent\",\n \"soft-outline\":\"data-[state=on]:bg-bg-brand-subtle data-[state=on]:border-border-brand data-[state=on]:text-fg-brand\",\n },\n neutral: {\n solid: \"data-[state=on]:bg-bg-muted data-[state=on]:text-fg-default data-[state=on]:border-transparent\",\n outline: \"data-[state=on]:border-border-default data-[state=on]:text-fg-default data-[state=on]:bg-transparent\",\n soft: \"data-[state=on]:bg-bg-accent data-[state=on]:text-fg-default data-[state=on]:border-transparent data-[state=on]:shadow-sh-sm\",\n \"soft-outline\":\"data-[state=on]:bg-bg-muted data-[state=on]:border-border-default data-[state=on]:text-fg-default\",\n },\n danger: {\n solid: \"data-[state=on]:bg-bg-danger data-[state=on]:text-fg-on-danger data-[state=on]:border-transparent\",\n outline: \"data-[state=on]:border-border-danger-muted data-[state=on]:text-fg-danger data-[state=on]:bg-transparent\",\n soft: \"data-[state=on]:bg-bg-danger-muted data-[state=on]:text-fg-danger data-[state=on]:border-transparent\",\n \"soft-outline\":\"data-[state=on]:bg-bg-danger-muted data-[state=on]:border-border-danger-muted data-[state=on]:text-fg-danger\",\n },\n warning: {\n solid: \"data-[state=on]:bg-bg-warning data-[state=on]:text-fg-on-warning data-[state=on]:border-transparent\",\n outline: \"data-[state=on]:border-border-warning-muted data-[state=on]:text-fg-warning data-[state=on]:bg-transparent\",\n soft: \"data-[state=on]:bg-bg-warning-muted data-[state=on]:text-fg-warning data-[state=on]:border-transparent\",\n \"soft-outline\":\"data-[state=on]:bg-bg-warning-muted data-[state=on]:border-border-warning-muted data-[state=on]:text-fg-warning\",\n },\n success: {\n solid: \"data-[state=on]:bg-bg-success data-[state=on]:text-fg-on-success data-[state=on]:border-transparent\",\n outline: \"data-[state=on]:border-border-success-muted data-[state=on]:text-fg-success data-[state=on]:bg-transparent\",\n soft: \"data-[state=on]:bg-bg-success-muted data-[state=on]:text-fg-success data-[state=on]:border-transparent\",\n \"soft-outline\":\"data-[state=on]:bg-bg-success-muted data-[state=on]:border-border-success-muted data-[state=on]:text-fg-success\",\n },\n info: {\n solid: \"data-[state=on]:bg-bg-info data-[state=on]:text-fg-on-info data-[state=on]:border-transparent\",\n outline: \"data-[state=on]:border-border-info-muted data-[state=on]:text-fg-info data-[state=on]:bg-transparent\",\n soft: \"data-[state=on]:bg-bg-info-muted data-[state=on]:text-fg-info data-[state=on]:border-transparent\",\n \"soft-outline\":\"data-[state=on]:bg-bg-info-muted data-[state=on]:border-border-info-muted data-[state=on]:text-fg-info\",\n },\n};\n\n/* ── ChipGroup root ──────────────────────────────────────────────── */\n\ntype CommonProps = {\n /** Cor do estado INATIVO (default `\"neutral\"`) */\n inactiveColor?: ChipColor;\n /** Variant do estado INATIVO (default `\"outline\"`) */\n inactiveVariant?: ChipVariant;\n /** Cor do estado ATIVO (default `\"primary\"`) */\n activeColor?: ChipColor;\n /** Variant do estado ATIVO (default `\"soft-outline\"`) */\n activeVariant?: ChipVariant;\n /** Size aplicado em todos os chips do grupo */\n size?: ChipSize;\n /** Shape aplicado em todos os chips (default `\"pill\"`) */\n shape?: ChipShape;\n /** Direção do grupo */\n orientation?: \"horizontal\" | \"vertical\";\n /** Aria-label do grupo */\n ariaLabel?: string;\n className?: string;\n children: ReactNode;\n};\n\ntype SingleProps = CommonProps & {\n type: \"single\";\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n};\n\ntype MultipleProps = CommonProps & {\n type: \"multiple\";\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n};\n\nexport type ChipGroupProps = SingleProps | MultipleProps;\n\n/**\n * ChipGroup — agrupa chips com seleção controlada.\n *\n * - `type=\"single\"`: escolha única (radio-like)\n * - `type=\"multiple\"`: escolha múltipla (checkbox-like)\n *\n * **Estado visual configurável independentemente:**\n * - `inactiveColor` + `inactiveVariant` → estilo dos items NÃO selecionados\n * (default: `neutral` + `outline`)\n * - `activeColor` + `activeVariant` → estilo dos items SELECIONADOS\n * (default: `primary` + `soft-outline`)\n *\n * Usa `@radix-ui/react-toggle-group` por baixo.\n */\nexport const ChipGroup = forwardRef<HTMLDivElement, ChipGroupProps>(\n function ChipGroup(props, ref) {\n const {\n inactiveColor = \"neutral\",\n inactiveVariant = \"outline\",\n activeColor = \"primary\",\n activeVariant = \"soft-outline\",\n size = \"md\",\n shape = \"pill\",\n orientation = \"horizontal\",\n ariaLabel,\n className,\n children,\n } = props;\n\n const contextValue = {\n inactiveColor,\n inactiveVariant,\n activeColor,\n activeVariant,\n size,\n shape,\n };\n\n if (props.type === \"single\") {\n return (\n <ChipGroupContext.Provider value={contextValue}>\n <ToggleGroupPrimitive.Root\n ref={ref}\n type=\"single\"\n value={props.value}\n defaultValue={props.defaultValue}\n onValueChange={props.onValueChange as (v: string) => void}\n orientation={orientation}\n aria-label={ariaLabel}\n className={cn(\n \"inline-flex items-center gap-gp-sm\",\n orientation === \"vertical\" && \"flex-col\",\n className,\n )}\n >\n {children}\n </ToggleGroupPrimitive.Root>\n </ChipGroupContext.Provider>\n );\n }\n\n return (\n <ChipGroupContext.Provider value={contextValue}>\n <ToggleGroupPrimitive.Root\n ref={ref}\n type=\"multiple\"\n value={props.value}\n defaultValue={props.defaultValue}\n onValueChange={props.onValueChange as (v: string[]) => void}\n orientation={orientation}\n aria-label={ariaLabel}\n className={cn(\n \"inline-flex items-center gap-gp-sm\",\n orientation === \"vertical\" && \"flex-col\",\n className,\n )}\n >\n {children}\n </ToggleGroupPrimitive.Root>\n </ChipGroupContext.Provider>\n );\n },\n);\n\n/* ── Context ─────────────────────────────────────────────────────── */\ntype ChipGroupContextValue = {\n inactiveColor: ChipColor;\n inactiveVariant: ChipVariant;\n activeColor: ChipColor;\n activeVariant: ChipVariant;\n size: ChipSize;\n shape: ChipShape;\n};\n\nconst ChipGroupContext = createContext<ChipGroupContextValue>({\n inactiveColor: \"neutral\",\n inactiveVariant: \"outline\",\n activeColor: \"primary\",\n activeVariant: \"soft-outline\",\n size: \"md\",\n shape: \"pill\",\n});\n\n/* ── ChipGroupItem ───────────────────────────────────────────────── */\n\nexport type ChipGroupItemProps = Omit<\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item>,\n \"color\"\n>;\n\n/**\n * ChipGroupItem — item dentro do `<ChipGroup>`. Visual gerenciado pelo\n * grupo via context: estilo `inactive*` quando OFF e `active*` quando ON.\n *\n * <ChipGroup type=\"single\" inactiveVariant=\"outline\" activeVariant=\"soft-outline\">\n * <ChipGroupItem value=\"all\">Todas</ChipGroupItem>\n * <ChipGroupItem value=\"unread\">Não lidas</ChipGroupItem>\n * </ChipGroup>\n */\nexport const ChipGroupItem = forwardRef<HTMLButtonElement, ChipGroupItemProps>(\n function ChipGroupItem({ className, children, ...rest }, ref) {\n const {\n inactiveColor,\n inactiveVariant,\n activeColor,\n activeVariant,\n size,\n shape,\n } = useContext(ChipGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n // Estado OFF — visual inativo (passa pelo chipVariants normal)\n chipVariants({\n color: inactiveColor,\n variant: inactiveVariant,\n size,\n shape,\n interactive: true,\n }),\n // Estado ON — override via data-state=on com classes do active*\n SELECTED_CLASSES[activeColor][activeVariant],\n className,\n )}\n {...rest}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n },\n);\n","import { useState } from \"react\";\r\nimport { Bell, CheckCheck, MoreHorizontal } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { ChipGroup, ChipGroupItem } from \"@/components/ui/Chip\";\r\nimport {\r\n Popover,\r\n PopoverTrigger,\r\n PopoverContent,\r\n} from \"@/components/shadcn/popover\";\r\nimport {\r\n headerIconBtnBadge,\r\n hdTop,\r\n hdHeader,\r\n hdTitle,\r\n hdTitleCount,\r\n hdHeaderActions,\r\n hdBody,\r\n hdEmpty,\r\n hdEmptyText,\r\n hdNotif,\r\n hdNotifIcon,\r\n hdNotifBody,\r\n hdNotifTitle,\r\n hdNotifText,\r\n hdNotifTime,\r\n hdNotifDot,\r\n hdFooter,\r\n hdFooterLink,\r\n} from \"./header.styles\";\r\nimport type {\r\n HeaderNotification,\r\n HeaderNotificationFilter,\r\n HeaderNotificationsConfig,\r\n} from \"./header.types\";\r\n\r\nconst DEFAULT_FILTERS: HeaderNotificationFilter[] = [\r\n { id: \"all\", label: \"Todas\", predicate: () => true },\r\n { id: \"unread\", label: \"Não lidas\", predicate: (n) => !!n.unread },\r\n { id: \"mentions\", label: \"Menções\", predicate: (n) => n.kind === \"mention\" },\r\n];\r\n\r\nexport type HeaderNotificationsProps = {\r\n config: HeaderNotificationsConfig;\r\n className?: string;\r\n};\r\n\r\nexport function HeaderNotifications({ config, className }: HeaderNotificationsProps) {\r\n const {\r\n items,\r\n filters = DEFAULT_FILTERS,\r\n emptyMessage = \"Nenhuma notificação por aqui.\",\r\n onMarkAllRead,\r\n onMoreActions,\r\n onViewAll,\r\n viewAllLabel = \"Ver todas as notificações\",\r\n } = config;\r\n\r\n const [open, setOpen] = useState(false);\r\n const [activeFilter, setActiveFilter] = useState(filters[0]?.id ?? \"all\");\r\n\r\n const unreadCount = items.filter((n) => n.unread).length;\r\n\r\n const filtered = items.filter(\r\n filters.find((f) => f.id === activeFilter)?.predicate ?? (() => true)\r\n );\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n color=\"secondary\"\r\n variant=\"outline\"\r\n size=\"icon-sm\"\r\n className=\"rounded-radius-md relative\"\r\n aria-label=\"Notificações\"\r\n title=\"Notificações\"\r\n >\r\n <Bell />\r\n {unreadCount > 0 && (\r\n <span className={headerIconBtnBadge({ kind: \"danger\" })} aria-hidden=\"true\" />\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n\r\n <PopoverContent\r\n align=\"end\"\r\n // mobileSheet (default true): no mobile vira sheet bottom-up colado nas\r\n // bordas em vez de popover cortando na tela.\r\n className={cn(\r\n \"w-[380px] max-w-[calc(100vw-32px)] max-h-[520px] p-0 flex flex-col overflow-hidden\",\r\n className,\r\n )}\r\n aria-label=\"Notificações\"\r\n >\r\n <div className={hdTop()}>\r\n <div className={hdHeader()}>\r\n <div className={hdTitle()}>\r\n <span>Notificações</span>\r\n {unreadCount > 0 && <span className={hdTitleCount()}>{unreadCount}</span>}\r\n </div>\r\n <div className={hdHeaderActions()}>\r\n {onMarkAllRead && (\r\n <Button\r\n color=\"secondary\"\r\n variant=\"ghost\"\r\n size=\"icon-2xs\"\r\n className=\"rounded-radius-sm\"\r\n title=\"Marcar todas como lidas\"\r\n onClick={onMarkAllRead}\r\n >\r\n <CheckCheck />\r\n </Button>\r\n )}\r\n {onMoreActions && (\r\n <Button\r\n color=\"secondary\"\r\n variant=\"ghost\"\r\n size=\"icon-2xs\"\r\n className=\"rounded-radius-sm\"\r\n title=\"Mais ações\"\r\n onClick={onMoreActions}\r\n >\r\n <MoreHorizontal />\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {filters.length > 0 && (\r\n <ChipGroup\r\n type=\"single\"\r\n value={activeFilter}\r\n onValueChange={(v) => v && setActiveFilter(v)}\r\n size=\"lg\"\r\n ariaLabel=\"Filtrar notificações\"\r\n >\r\n {filters.map((f) => {\r\n const count = items.filter(f.predicate ?? (() => true)).length;\r\n return (\r\n <ChipGroupItem key={f.id} value={f.id}>\r\n {f.label}\r\n {count > 0 && ` (${count})`}\r\n </ChipGroupItem>\r\n );\r\n })}\r\n </ChipGroup>\r\n )}\r\n </div>\r\n\r\n <div className={hdBody()}>\r\n {filtered.length === 0 ? (\r\n <div className={hdEmpty()}>\r\n <Bell size={28} strokeWidth={1.4} />\r\n <p className={hdEmptyText()}>{emptyMessage}</p>\r\n </div>\r\n ) : (\r\n filtered.map((n) => <NotificationRow key={n.id} item={n} />)\r\n )}\r\n </div>\r\n\r\n {onViewAll && (\r\n <div className={hdFooter()}>\r\n <a\r\n href=\"#\"\r\n className={hdFooterLink()}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n onViewAll();\r\n setOpen(false);\r\n }}\r\n >\r\n {viewAllLabel}\r\n </a>\r\n </div>\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n\r\nfunction NotificationRow({ item }: { item: HeaderNotification }) {\r\n const Icon = item.icon;\r\n return (\r\n <button\r\n type=\"button\"\r\n className={hdNotif()}\r\n onClick={item.onClick}\r\n >\r\n <span\r\n className={hdNotifIcon()}\r\n style={{ color: item.color, background: `${item.color}1f` }}\r\n aria-hidden=\"true\"\r\n >\r\n <Icon size={15} strokeWidth={1.8} />\r\n </span>\r\n <span className={hdNotifBody()}>\r\n <span className={hdNotifTitle()}>{item.title}</span>\r\n <span className={hdNotifText()}>{item.body}</span>\r\n <span className={hdNotifTime()}>{item.time}</span>\r\n </span>\r\n {item.unread && <span className={hdNotifDot()} aria-label=\"não lida\" />}\r\n </button>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { MessageSquare, PenLine, Maximize2, Search } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { ChipGroup, ChipGroupItem } from \"@/components/ui/Chip\";\r\nimport {\r\n InputGroup,\r\n InputGroupAddon,\r\n InputGroupInput,\r\n} from \"@/components/shadcn/input-group\";\r\nimport {\r\n Popover,\r\n PopoverTrigger,\r\n PopoverContent,\r\n} from \"@/components/shadcn/popover\";\r\nimport {\r\n headerIconBtnBadge,\r\n hdTop,\r\n hdHeader,\r\n hdTitle,\r\n hdTitleCount,\r\n hdHeaderActions,\r\n hdBody,\r\n hdEmpty,\r\n hdEmptyText,\r\n hdMsg,\r\n hdMsgAvatar,\r\n hdMsgBody,\r\n hdMsgRow,\r\n hdMsgName,\r\n hdMsgTime,\r\n hdMsgPreviewRow,\r\n hdMsgPreview,\r\n hdMsgDot,\r\n hdFooter,\r\n hdFooterLink,\r\n} from \"./header.styles\";\r\nimport type {\r\n HeaderMessage,\r\n HeaderMessageFilter,\r\n HeaderMessagesConfig,\r\n} from \"./header.types\";\r\n\r\nconst DEFAULT_FILTERS: HeaderMessageFilter[] = [\r\n { id: \"all\", label: \"Tudo\", predicate: () => true },\r\n { id: \"unread\", label: \"Não lidas\", predicate: (m) => !!m.unread },\r\n { id: \"groups\", label: \"Grupos\", predicate: (m) => !!m.group },\r\n];\r\n\r\nexport type HeaderMessagesProps = {\r\n config: HeaderMessagesConfig;\r\n className?: string;\r\n};\r\n\r\nexport function HeaderMessages({ config, className }: HeaderMessagesProps) {\r\n const {\r\n items,\r\n filters = DEFAULT_FILTERS,\r\n showSearch = true,\r\n searchPlaceholder = \"Pesquisar conversas...\",\r\n emptyMessage = \"Nenhuma conversa encontrada.\",\r\n onNewMessage,\r\n onExpand,\r\n onViewAll,\r\n viewAllLabel = \"Ver todas no Chat Interno\",\r\n } = config;\r\n\r\n const [open, setOpen] = useState(false);\r\n const [activeFilter, setActiveFilter] = useState(filters[0]?.id ?? \"all\");\r\n const [search, setSearch] = useState(\"\");\r\n\r\n const unreadCount = items.filter((m) => m.unread).length;\r\n\r\n const filtered = items\r\n .filter(filters.find((f) => f.id === activeFilter)?.predicate ?? (() => true))\r\n .filter((m) =>\r\n search ? m.name.toLowerCase().includes(search.toLowerCase()) : true\r\n );\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n color=\"secondary\"\r\n variant=\"outline\"\r\n size=\"icon-sm\"\r\n className=\"rounded-radius-md relative\"\r\n aria-label=\"Mensagens\"\r\n title=\"Mensagens\"\r\n >\r\n <MessageSquare />\r\n {unreadCount > 0 && (\r\n <span className={headerIconBtnBadge({ kind: \"brand\" })} aria-hidden=\"true\" />\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n\r\n <PopoverContent\r\n align=\"end\"\r\n className={cn(\r\n \"w-[380px] max-w-[calc(100vw-32px)] max-h-[520px] p-0 flex flex-col overflow-hidden\",\r\n className,\r\n )}\r\n aria-label=\"Mensagens\"\r\n >\r\n <div className={hdTop()}>\r\n <div className={hdHeader()}>\r\n <div className={hdTitle()}>\r\n <span>Conversas</span>\r\n {unreadCount > 0 && <span className={hdTitleCount()}>{unreadCount}</span>}\r\n </div>\r\n <div className={hdHeaderActions()}>\r\n {onNewMessage && (\r\n <Button\r\n color=\"secondary\"\r\n variant=\"ghost\"\r\n size=\"icon-2xs\"\r\n className=\"rounded-radius-sm\"\r\n title=\"Nova mensagem\"\r\n onClick={onNewMessage}\r\n >\r\n <PenLine />\r\n </Button>\r\n )}\r\n {onExpand && (\r\n <Button\r\n color=\"secondary\"\r\n variant=\"ghost\"\r\n size=\"icon-2xs\"\r\n className=\"rounded-radius-sm\"\r\n title=\"Expandir\"\r\n onClick={onExpand}\r\n >\r\n <Maximize2 />\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {showSearch && (\r\n <InputGroup size=\"sm\">\r\n <InputGroupAddon align=\"inline-start\">\r\n <Search strokeWidth={1.8} />\r\n </InputGroupAddon>\r\n <InputGroupInput\r\n type=\"text\"\r\n placeholder={searchPlaceholder}\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n />\r\n </InputGroup>\r\n )}\r\n\r\n {filters.length > 0 && (\r\n <ChipGroup\r\n type=\"single\"\r\n value={activeFilter}\r\n onValueChange={(v) => v && setActiveFilter(v)}\r\n size=\"lg\"\r\n ariaLabel=\"Filtrar mensagens\"\r\n >\r\n {filters.map((f) => {\r\n const count = items.filter(f.predicate ?? (() => true)).length;\r\n return (\r\n <ChipGroupItem key={f.id} value={f.id}>\r\n {f.label}\r\n {count > 0 && ` (${count})`}\r\n </ChipGroupItem>\r\n );\r\n })}\r\n </ChipGroup>\r\n )}\r\n </div>\r\n\r\n <div className={hdBody()}>\r\n {filtered.length === 0 ? (\r\n <div className={hdEmpty()}>\r\n <MessageSquare size={28} strokeWidth={1.4} />\r\n <p className={hdEmptyText()}>{emptyMessage}</p>\r\n </div>\r\n ) : (\r\n filtered.map((m) => <MessageRow key={m.id} item={m} />)\r\n )}\r\n </div>\r\n\r\n {onViewAll && (\r\n <div className={hdFooter()}>\r\n <a\r\n href=\"#\"\r\n className={hdFooterLink()}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n onViewAll();\r\n setOpen(false);\r\n }}\r\n >\r\n {viewAllLabel}\r\n </a>\r\n </div>\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n\r\nfunction MessageRow({ item }: { item: HeaderMessage }) {\r\n return (\r\n <button\r\n type=\"button\"\r\n className={hdMsg()}\r\n onClick={item.onClick}\r\n title={`Conversar com ${item.name}`}\r\n >\r\n {item.avatarUrl ? (\r\n <img\r\n src={item.avatarUrl}\r\n alt={item.name}\r\n className=\"flex-none w-icon-lg h-icon-lg rounded-full object-cover\"\r\n />\r\n ) : (\r\n <span className={hdMsgAvatar()} style={{ backgroundColor: item.color }}>\r\n {item.initials}\r\n </span>\r\n )}\r\n <span className={hdMsgBody()}>\r\n <span className={hdMsgRow()}>\r\n <span className={hdMsgName()}>{item.name}</span>\r\n <span className={hdMsgTime()}>{item.time}</span>\r\n </span>\r\n <span className={hdMsgPreviewRow()}>\r\n <span className={hdMsgPreview()}>{item.preview}</span>\r\n {item.unread && <span className={hdMsgDot()} aria-label=\"não lida\" />}\r\n </span>\r\n </span>\r\n </button>\r\n );\r\n}\r\n","import { Check, Sun, Moon } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n} from \"@/components/shadcn/dropdown-menu\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport type { HeaderThemeOption } from \"./header.types\";\r\n\r\nconst DEFAULT_OPTIONS: HeaderThemeOption[] = [\r\n { id: \"light\", label: \"Claro\", icon: Sun },\r\n { id: \"dark\", label: \"Escuro\", icon: Moon },\r\n];\r\n\r\nexport type HeaderThemeSwitcherProps = {\r\n theme: string;\r\n onThemeChange: (id: string) => void;\r\n options?: HeaderThemeOption[];\r\n className?: string;\r\n};\r\n\r\nexport function HeaderThemeSwitcher({\r\n theme,\r\n onThemeChange,\r\n options = DEFAULT_OPTIONS,\r\n className,\r\n}: HeaderThemeSwitcherProps) {\r\n const current = options.find((o) => o.id === theme) ?? options[0];\r\n const CurrentIcon = current?.icon ?? Sun;\r\n\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button\r\n color=\"secondary\"\r\n variant=\"outline\"\r\n size=\"icon-sm\"\r\n className={cn(\"rounded-radius-md\", className)}\r\n aria-label=\"Trocar tema\"\r\n title={`Tema: ${current?.label ?? \"\"}`}\r\n >\r\n <CurrentIcon />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\" sideOffset={8} className=\"min-w-[160px]\">\r\n {options.map((opt) => {\r\n const Icon = opt.icon;\r\n const isActive = opt.id === theme;\r\n return (\r\n <DropdownMenuItem\r\n key={opt.id}\r\n onSelect={() => onThemeChange(opt.id)}\r\n >\r\n <Icon />\r\n <span className=\"flex-1\">{opt.label}</span>\r\n {isActive && <Check className=\"text-fg-brand\" />}\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n","import { Menu, PanelLeftClose, PanelLeftOpen } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n headerRoot,\n headerLeft,\n headerRight,\n headerDivider,\n headerIconBtn,\n} from \"./header.styles\";\nimport { HeaderBreadcrumb } from \"./header-breadcrumb\";\nimport { HeaderSearch } from \"./header-search\";\nimport { HeaderNotifications } from \"./header-notifications\";\nimport { HeaderMessages } from \"./header-messages\";\nimport { HeaderThemeSwitcher } from \"./header-theme-switcher\";\nimport type { HeaderProps } from \"./header.types\";\n\n/**\n * Header — top bar template (rail-friendly).\n *\n * Layout:\n * left: [collapse btn] [divider] [breadcrumb]\n * right: [rightSlot] [search] [theme] [messages] [notifications]\n *\n * Posicionamento (sticky/fixed) é responsabilidade do template consumer.\n * Componente só define altura/layout/cores (60px, border-bottom).\n *\n * Todos os blocos do `right` são opcionais:\n * - search desliga via `showSearch={false}`\n * - notifications/messages/theme escondem o ícone se config não passada\n * - onCollapseMenu omitido esconde o botão de collapse\n */\nexport function Header({\n breadcrumb,\n onCollapseMenu,\n menuCollapsed,\n showSearch = true,\n searchPlaceholder = \"Buscar...\",\n searchShortcut = \"⌘K\",\n commandGroups,\n commandPlaceholder,\n commandEmptyMessage,\n notifications,\n messages,\n theme,\n onThemeChange,\n themeOptions,\n rightSlot,\n className,\n}: HeaderProps) {\n return (\n <header className={cn(headerRoot(), className)}>\n <div className={headerLeft()}>\n {onCollapseMenu && (\n <>\n {/* Desktop: collapse panel (toggle sidebar) */}\n <button\n type=\"button\"\n className={cn(\n headerIconBtn({ variant: \"ghost\" }),\n \"hidden md:inline-flex text-fg-muted hover:text-fg-default\",\n )}\n onClick={onCollapseMenu}\n aria-label={menuCollapsed ? \"Expandir menu\" : \"Colapsar menu\"}\n title={menuCollapsed ? \"Expandir menu\" : \"Colapsar menu\"}\n >\n {menuCollapsed ? (\n <PanelLeftOpen size={20} strokeWidth={1.7} />\n ) : (\n <PanelLeftClose size={20} strokeWidth={1.7} />\n )}\n </button>\n {/* Mobile: hamburger */}\n <button\n type=\"button\"\n className={cn(\n headerIconBtn({ variant: \"ghost\" }),\n \"md:hidden text-fg-muted hover:text-fg-default\",\n )}\n onClick={onCollapseMenu}\n aria-label=\"Abrir menu\"\n title=\"Menu\"\n >\n <Menu size={20} strokeWidth={1.8} />\n </button>\n {/* Divider só em desktop */}\n <span\n className={cn(headerDivider(), \"hidden md:block\")}\n aria-hidden=\"true\"\n />\n </>\n )}\n\n {/* Breadcrumb mostra todos os items em desktop;\n em mobile só o último (título da seção). */}\n <HeaderBreadcrumb\n items={breadcrumb}\n mobileShowLastOnly\n />\n </div>\n\n <div className={headerRight()}>\n {rightSlot}\n\n {showSearch && (\n <HeaderSearch\n placeholder={searchPlaceholder}\n shortcut={searchShortcut}\n commandGroups={commandGroups}\n commandPlaceholder={commandPlaceholder}\n commandEmptyMessage={commandEmptyMessage}\n />\n )}\n\n {/* Theme switcher: desktop only */}\n {theme !== undefined && onThemeChange && (\n <div className=\"hidden md:contents\">\n <HeaderThemeSwitcher\n theme={theme}\n onThemeChange={onThemeChange}\n options={themeOptions}\n />\n </div>\n )}\n\n {messages && <HeaderMessages config={messages} />}\n\n {notifications && <HeaderNotifications config={notifications} />}\n </div>\n </header>\n );\n}\n","import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Sidebar styles — alinhado com /design-and-table-v2 (rail + panel).\r\n *\r\n * Dimensões preservadas do sandbox:\r\n * - rail: 64px de largura\r\n * - panel: 264px de largura (collapse → 0)\r\n * - header: 60px de altura\r\n * - panel item: 40px (h-form-lg) com font 13px e gap 11px\r\n * - subitem: 32px (h-form-sm) com font 12.5px\r\n *\r\n * Cores via tokens v3:\r\n * - bg-bg-sidebar + bg-bg-sidebar-accent (hover) + bg-bg-sidebar-accent-hover\r\n * - bg-bg-surface + shadow-sh-sm pro active (light only — dark auto-none)\r\n * - text-fg-default / text-fg-muted / text-fg-brand\r\n * - border-border-sidebar / border-border-subtle\r\n */\r\n\r\n/* ── Root ──────────────────────────────────────────────────────────────────── */\r\n/**\r\n * `w-fit` é crítico: faz o root ocupar SÓ a largura visível (rail 64px quando\r\n * colapsado, rail + panel 328px quando aberto). Sem isso, o div ocuparia 100%\r\n * da largura do parent e o hover-to-expand dispararia em qualquer lugar do app.\r\n * `relative` é necessário pro panel `absolute` (floating) ancorar no root.\r\n *\r\n * Mobile: vira drawer fixed overlay sobre o conteúdo, com transform anim.\r\n */\r\nexport const sidebarRoot = tv({\r\n base: \"relative flex h-screen w-fit bg-bg-sidebar text-fg-default font-sans\",\r\n variants: {\r\n mobile: {\r\n // w-screen: drawer ocupa 100vw (rail + panel preenchendo) e h-screen (100vh).\r\n true: \"fixed inset-y-0 left-0 z-50 h-screen w-screen max-w-full transition-transform duration-200 ease-out\",\r\n false: \"\",\r\n },\r\n mobileOpen: {\r\n true: \"translate-x-0\",\r\n false: \"\",\r\n },\r\n },\r\n compoundVariants: [\r\n // Mobile + fechado: empurra pra fora da tela\r\n { mobile: true, mobileOpen: false, class: \"-translate-x-full\" },\r\n ],\r\n});\r\n\r\n/** Versão sem h-screen — pra usar em containers de tamanho fixo (docs, modals) */\r\nexport const sidebarRootContained = tv({\r\n base: \"relative flex h-full w-fit bg-bg-sidebar text-fg-default font-sans\",\r\n});\r\n\r\n/* ── Mobile-specific ──────────────────────────────────────────────────────── */\r\n/** Backdrop escuro atrás do drawer mobile — clicável pra fechar */\r\nexport const sidebarMobileBackdrop = tv({\r\n base: \"fixed inset-0 z-40 bg-overlay-scrim transition-opacity duration-200\",\r\n});\r\n\r\n/** Close button (X) flutuante no canto superior direito do drawer mobile */\r\nexport const sidebarMobileCloseBtn = tv({\r\n base: [\r\n \"absolute top-[14px] right-[14px] z-10\",\r\n \"w-form-sm h-form-sm rounded-radius-md grid place-items-center\",\r\n \"bg-transparent border-0 cursor-pointer\",\r\n \"text-fg-muted\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-sidebar-accent-hover hover:text-fg-default\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\r\n ],\r\n});\r\n\r\n/* ── Rail (coluna 1 — ícones) ─────────────────────────────────────────────── */\r\nexport const sidebarRail = tv({\r\n base: [\r\n \"flex flex-col items-center w-[64px] flex-none\",\r\n \"h-full sticky top-0 z-30\",\r\n \"gap-gp-sm py-pad-md\",\r\n \"bg-bg-sidebar border-r border-border-sidebar\",\r\n ],\r\n});\r\n\r\nexport const sidebarRailBrand = tv({\r\n base: [\r\n \"w-form-lg h-form-lg rounded-radius-xl grid place-items-center\",\r\n \"bg-bg-brand text-fg-on-brand mb-pad-sm\",\r\n \"transition-opacity hover:opacity-90\",\r\n ],\r\n});\r\n\r\nexport const sidebarRailList = tv({\r\n base: \"flex flex-col items-center gap-gp-sm flex-1\",\r\n});\r\n\r\nexport const sidebarRailItem = tv({\r\n base: [\r\n \"group/rail-item relative w-form-lg h-form-lg rounded-radius-xl grid place-items-center\",\r\n \"bg-transparent border-0 cursor-pointer\",\r\n \"text-fg-muted\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-sidebar-accent-hover hover:text-fg-default\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\r\n ],\r\n variants: {\r\n active: {\r\n // Light: bg sidebar-accent (= branco via token), ícone mantém cor padrão (sem brand).\r\n // Dark: bg sidebar-accent (alpha-8), ícone ganha fg-brand.\r\n true: \"bg-bg-sidebar-accent dark:text-fg-brand\",\r\n },\r\n },\r\n});\r\n\r\n/** Pílula esquerda do item ativo (3px x 24px) */\r\nexport const sidebarRailActiveBar = tv({\r\n base: [\r\n \"absolute -left-pad-2xl top-pad-md bottom-pad-md w-[3px]\",\r\n \"rounded-r-radius-sm bg-bg-brand\",\r\n ],\r\n});\r\n\r\n/** Tooltip CSS-only que aparece no hover do rail item */\r\nexport const sidebarRailTooltip = tv({\r\n base: [\r\n \"pointer-events-none absolute left-full ml-[14px] top-1/2 -translate-y-1/2\",\r\n \"px-pad-md py-[5px] rounded-radius-sm\",\r\n \"bg-fg-default text-bg-sidebar\",\r\n \"text-caption-sm font-semibold tracking-[0.01em] whitespace-nowrap\",\r\n \"opacity-0 group-hover/rail-item:opacity-100\",\r\n \"transition-opacity duration-150 z-50\",\r\n \"shadow-sh-md\",\r\n ],\r\n});\r\n\r\nexport const sidebarRailAdd = tv({\r\n base: [\r\n \"w-form-lg h-form-lg rounded-radius-xl grid place-items-center\",\r\n \"text-fg-muted bg-transparent border-0 cursor-pointer mt-pad-xs opacity-70\",\r\n \"transition-[opacity,background-color,color] duration-150\",\r\n \"hover:opacity-100 hover:bg-bg-sidebar-accent-hover hover:text-fg-brand\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\r\n ],\r\n});\r\n\r\n/**\r\n * Wrapper do user — apenas positioning (empurra pro bottom). O visual fica\r\n * no conteúdo passado via `user` prop:\r\n * - Quando `user` é ReactNode custom (ex: UserMenu com DropdownMenu), o\r\n * consumer controla 100% do visual.\r\n * - Quando `user` é falsy/undefined, o sidebar-rail renderiza o avatar\r\n * default usando `sidebarRailUserDefault` styles.\r\n */\r\nexport const sidebarRailUser = tv({\r\n base: \"mt-auto\",\r\n});\r\n\r\n/** Avatar default (string \"SV\") — usado quando user prop não foi passado. */\r\nexport const sidebarRailUserDefault = tv({\r\n base: [\r\n \"grid place-items-center size-comp-lg rounded-full\",\r\n // tracking-[0.02em] preserva tracking original (preset usa +0.06em)\r\n \"bg-bg-brand text-fg-on-brand font-bold text-caption-sm uppercase tracking-[0.02em]\",\r\n ],\r\n});\r\n\r\n/* ── Panel (coluna 2 — menus) ─────────────────────────────────────────────── */\r\nexport const sidebarPanel = tv({\r\n base: [\r\n \"w-[264px] flex-none h-full sticky top-0 flex flex-col overflow-hidden\",\r\n \"bg-bg-sidebar border-r border-border-sidebar\",\r\n \"transition-[width,opacity,border-color] duration-200 ease-out\",\r\n ],\r\n variants: {\r\n collapsed: {\r\n true: \"w-0 border-r-0 opacity-0 pointer-events-none\",\r\n },\r\n /** Quando true: overlay absoluto sobre o conteúdo (hover-to-expand). */\r\n floating: {\r\n true: \"absolute left-[64px] top-0 h-full z-40\",\r\n },\r\n /** Mobile: panel preenche o resto do drawer (100vw - rail) em vez de 264px fixo. */\r\n mobile: {\r\n true: \"!w-auto flex-1\",\r\n },\r\n },\r\n});\r\n\r\nexport const sidebarPanelHeader = tv({\r\n base: \"flex items-center h-[60px] flex-none px-[14px] border-b border-border-sidebar\",\r\n});\r\n\r\nexport const sidebarPanelTitle = tv({\r\n base: [\r\n \"flex-1 min-w-0 inline-flex items-center gap-gp-sm\",\r\n \"py-pad-sm px-pad-md rounded-radius-md\",\r\n \"bg-transparent border-0 cursor-pointer text-left\",\r\n \"text-body-md font-medium font-bold text-fg-default\",\r\n \"transition-colors hover:bg-bg-sidebar-accent-hover\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\r\n ],\r\n});\r\n\r\nexport const sidebarPanelBody = tv({\r\n base: \"flex-1 overflow-y-auto p-[14px] scrollbar-thin\",\r\n});\r\n\r\nexport const sidebarPanelGroup = tv({\r\n base: \"flex flex-col gap-px\",\r\n});\r\n\r\n/* ── Item (link/group/subitem) ────────────────────────────────────────────── */\r\nexport const sidebarItem = tv({\r\n base: [\r\n \"flex items-center gap-[11px] h-form-lg w-full px-pad-xl rounded-radius-md\",\r\n \"text-fg-default text-body-sm font-medium text-left no-underline cursor-pointer\",\r\n \"bg-transparent border-0\",\r\n \"transition-colors duration-150\",\r\n // Hover usa sidebar-accent-hover (mineral subtle no light, alpha-12 no dark) —\r\n // assim fica distinto do active (sidebar-accent = white no light).\r\n \"hover:bg-bg-sidebar-accent-hover hover:text-fg-default\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\r\n ],\r\n variants: {\r\n active: {\r\n // Light: sidebar-accent (= white via token) + brand text + shadow.\r\n // Dark: sidebar-accent (alpha-8) + brand text + sem shadow.\r\n true: [\r\n \"bg-bg-sidebar-accent text-fg-brand font-semibold shadow-sh-sm\",\r\n \"dark:shadow-sh-none\",\r\n ],\r\n },\r\n subitem: {\r\n true: \"h-form-sm px-pad-lg text-body-xs font-normal text-fg-muted hover:text-fg-default\",\r\n },\r\n },\r\n compoundVariants: [\r\n {\r\n subitem: true,\r\n active: true,\r\n class: \"bg-bg-sidebar-accent text-fg-default shadow-sh-none\",\r\n },\r\n ],\r\n});\r\n\r\nexport const sidebarItemIcon = tv({\r\n base: \"flex-none w-[17px] h-[17px] text-fg-muted transition-colors\",\r\n variants: {\r\n active: {\r\n true: \"text-fg-brand\",\r\n },\r\n parentActive: {\r\n true: \"text-fg-brand\",\r\n },\r\n },\r\n});\r\n\r\nexport const sidebarItemText = tv({\r\n base: \"flex-1 min-w-0 whitespace-nowrap overflow-hidden text-ellipsis\",\r\n});\r\n\r\nexport const sidebarPill = tv({\r\n base: [\r\n \"inline-flex items-center justify-center flex-none\",\r\n \"min-w-[22px] h-[22px] px-[7px] rounded-radius-sm\",\r\n // tracking-[0.02em] e leading-none preservam visual original (preset usa +0.06em e lineHeight 14px)\r\n \"text-caption-sm font-bold leading-none tracking-[0.02em] tabular-nums\",\r\n ],\r\n variants: {\r\n kind: {\r\n // Light: consome border-sidebar (mineral-200, warm) — combina com sidebar mineral-100.\r\n // Dark: bg-muted (alpha-white subtle).\r\n default: \"bg-border-sidebar text-fg-muted dark:bg-bg-muted\",\r\n counter: \"bg-border-sidebar text-fg-muted dark:bg-bg-brand dark:text-fg-on-brand\",\r\n success: \"bg-bg-success-muted text-fg-success dark:bg-bg-brand dark:text-fg-on-brand\",\r\n },\r\n active: {\r\n true: \"bg-bg-muted-hover text-fg-default dark:bg-bg-muted-hover dark:text-fg-default\",\r\n },\r\n },\r\n defaultVariants: { kind: \"default\" },\r\n});\r\n\r\n/* ── Subgroup (item com subitems colapsável) ──────────────────────────────── */\r\nexport const sidebarSubgroupRoot = tv({\r\n base: \"flex flex-col gap-px\",\r\n});\r\n\r\nexport const sidebarSubgroupChev = tv({\r\n base: \"flex-none w-[13px] h-[13px] text-fg-muted ml-auto transition-transform duration-200\",\r\n variants: {\r\n collapsed: {\r\n true: \"-rotate-90\",\r\n },\r\n },\r\n});\r\n\r\nexport const sidebarSubgroupList = tv({\r\n base: [\r\n \"flex flex-col gap-px overflow-hidden\",\r\n \"ml-pad-xl pl-[14px] py-pad-2xs\",\r\n \"border-l border-border-sidebar\",\r\n \"transition-[max-height,opacity,padding] duration-200 ease-out\",\r\n ],\r\n variants: {\r\n collapsed: {\r\n true: \"max-h-0 opacity-0 py-0\",\r\n false: \"max-h-[400px] opacity-100\",\r\n },\r\n },\r\n defaultVariants: { collapsed: false },\r\n});\r\n\r\n/* ── Section (bookmarks / chats / listas genéricas) ───────────────────────── */\r\nexport const sidebarSection = tv({\r\n base: \"flex flex-col gap-px pt-[18px] mt-pad-xl border-t border-border-sidebar\",\r\n});\r\n\r\nexport const sidebarSectionHeader = tv({\r\n base: [\r\n \"flex items-center gap-gp-sm px-pad-lg pt-pad-sm pb-pad-md\",\r\n \"bg-transparent border-0 text-left cursor-pointer select-none w-full\",\r\n \"text-caption-xs font-bold uppercase tracking-[0.06em] text-fg-default\",\r\n \"transition-colors hover:text-fg-default\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary rounded-radius-sm\",\r\n // Dark: enfraquecer (mais sutil)\r\n \"dark:text-fg-muted dark:font-medium dark:opacity-70\",\r\n ],\r\n});\r\n\r\nexport const sidebarSectionChev = tv({\r\n base: \"flex-none w-[12px] h-[12px] transition-transform duration-200\",\r\n variants: {\r\n collapsed: {\r\n true: \"-rotate-90\",\r\n },\r\n },\r\n});\r\n\r\nexport const sidebarSectionAdd = tv({\r\n base: [\r\n \"ml-auto w-[18px] h-[18px] grid place-items-center rounded-radius-xs\",\r\n \"text-fg-muted bg-transparent border-0 cursor-pointer text-body-md leading-none\",\r\n \"transition-colors hover:bg-bg-sidebar-accent-hover hover:text-fg-default\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-secondary\",\r\n ],\r\n});\r\n\r\nexport const sidebarSectionList = tv({\r\n base: \"flex flex-col gap-px overflow-hidden transition-[max-height,opacity] duration-200 ease-out\",\r\n variants: {\r\n collapsed: {\r\n true: \"max-h-0 opacity-0\",\r\n false: \"max-h-[600px] opacity-100\",\r\n },\r\n variant: {\r\n bookmark: \"\",\r\n chat: \"gap-gp-sm\",\r\n },\r\n },\r\n defaultVariants: { collapsed: false, variant: \"bookmark\" },\r\n});\r\n\r\n/** Item das sections (bookmark/chat) — herda visual do sidebarItem subitem */\r\nexport const sidebarSectionItem = tv({\r\n base: [\r\n \"flex items-center gap-[11px] h-form-sm w-full px-pad-lg rounded-radius-md\",\r\n \"text-body-xs font-medium text-fg-muted no-underline cursor-pointer\",\r\n \"bg-transparent border-0 text-left\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-sidebar-accent-hover hover:text-fg-default\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\r\n ],\r\n});\r\n\r\nexport const sidebarBookmarkDot = tv({\r\n base: \"flex-none w-[10px] h-[10px] rounded-full\",\r\n});\r\n\r\nexport const sidebarBookmarkIcon = tv({\r\n base: [\r\n // mesmo footprint do dot/avatar → alinhamento consistente; ícone herda a\r\n // cor via `color` inline (currentColor), sem caixa de fundo\r\n \"flex-none grid place-items-center w-icon-lg h-icon-lg\",\r\n // menor que o ícone de categoria (17px) → menos destaque, perto do peso do dot\r\n \"[&>svg]:size-icon-xs\",\r\n ],\r\n});\r\n\r\nexport const sidebarChatAvatar = tv({\r\n base: [\r\n \"flex-none grid place-items-center w-icon-lg h-icon-lg rounded-full\",\r\n // tracking-[0.02em] preserva o tracking original (preset usa +0.06em); leading-none mantém centralização vertical\r\n \"text-white text-caption-xs font-bold uppercase tracking-[0.02em] leading-none\",\r\n ],\r\n});\r\n\r\nexport const sidebarChatStatus = tv({\r\n base: \"flex-none w-[7px] h-[7px] rounded-full ml-auto\",\r\n variants: {\r\n status: {\r\n online: \"bg-fg-success\",\r\n offline: \"bg-fg-subtle\",\r\n },\r\n },\r\n defaultVariants: { status: \"online\" },\r\n});\r\n","/**\r\n * A marca iGreen dentro do quadrado de brand — o default do header da\r\n * `SingleMenuSidebar`.\r\n *\r\n * Por que ela existe aqui, e não como markup solto em quem monta: o `logo` da\r\n * `SingleMenuSidebar` era **obrigatório e sem fallback**, enquanto o `brand` do\r\n * `MenuSidebar` é opcional e cai em `<SidebarBrandIcon />`. Trocar pra sidebar única\r\n * portanto **forçava** quem montava a inventar uma logo — e em 2026-08-22 um consumidor\r\n * relatou justamente a logo da iGreen desaparecendo na troca. A IA não removeu nada: a\r\n * API pediu outra. Com o default, a marca não depende de ninguém lembrar.\r\n *\r\n * O tratamento (quadrado `bg-bg-brand` + ícone `fg-on-brand`) é o mesmo que a página de\r\n * doc já usava na mão — aqui ele só passou a ter um nome.\r\n */\r\nexport function SidebarBrandMark() {\r\n return (\r\n <div className=\"grid size-form-lg place-items-center rounded-radius-xl bg-bg-brand text-fg-on-brand\">\r\n <SidebarBrandIcon size={18} />\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Logo iGreen — default usado no rail.\r\n * Single-color (currentColor) pra herdar o fg-on-brand.\r\n */\r\nexport function SidebarBrandIcon({ size = 18 }: { size?: number }) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size * (25 / 18)}\r\n viewBox=\"0 0 46 64\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-label=\"iGreen\"\r\n >\r\n <path\r\n fillRule=\"evenodd\"\r\n clipRule=\"evenodd\"\r\n d=\"M23.164 30.3908C18.9426 33.9472 15.488 37.9995 14.4032 43.8429H14.4073C14.5406 43.8429 14.6469 43.8482 14.7351 43.8526C14.8818 43.86 14.9789 43.8649 15.068 43.8386C15.8605 43.5936 16.6564 43.3583 17.4522 43.123C19.3184 42.5713 21.1848 42.0195 23.009 41.3416C32.3202 37.8861 35.2732 29.344 32.2837 19.9864C32.2369 19.9956 32.1889 20.0014 32.1404 20.0072C32.0324 20.0204 31.9238 20.0336 31.8309 20.083C30.7722 20.6536 29.7117 21.2208 28.6512 21.7879C25.7732 23.3269 22.8951 24.8663 20.0519 26.4727C17.0665 28.1586 14.8314 30.5925 13.7466 34.006C13.7044 34.1395 13.5982 34.2516 13.5398 34.3134C13.5245 34.3293 13.5127 34.342 13.5059 34.3507C13.1946 34.0579 12.9032 33.742 12.6157 33.4305C11.9956 32.7583 11.395 32.1074 10.6591 31.7569C8.30519 30.6325 5.89307 29.6329 3.45529 28.6228C2.48425 28.2202 1.50909 27.8162 0.532006 27.4018C-0.683422 31.5972 0.20163 35.225 3.0036 38.3864C5.54867 41.2617 8.72989 42.485 12.6372 42.279C11.9072 38.8362 10.1329 36.2047 7.93458 33.8001C9.89561 34.8394 10.9816 36.6237 12.1043 38.469C12.6255 39.3256 13.1549 40.1952 13.7832 41.0095C15.5819 36.0574 18.5797 32.4674 23.164 30.3908ZM18.3593 48.1644C17.3457 48.1644 16.524 49.0113 16.524 50.0562C16.524 51.1009 17.3457 51.9478 18.3593 51.9478H33.6948C34.7084 51.9478 35.5301 51.1009 35.5301 50.0562C35.5301 49.0113 34.7084 48.1644 33.6948 48.1644H18.3593ZM18.2779 54.7121C18.2779 53.6673 19.0996 52.8204 20.1132 52.8204H31.8593C32.8731 52.8204 33.6948 53.6673 33.6948 54.7121C33.6948 55.7568 32.8731 56.6039 31.8593 56.6039H20.1132C19.0996 56.6039 18.2779 55.7568 18.2779 54.7121ZM21.4161 57.3921C20.5164 57.3921 19.7869 58.144 19.7869 59.0716C19.7869 59.8346 20.2376 60.5206 20.9249 60.8039L22.4227 61.4216C22.7004 61.536 22.946 61.72 23.1376 61.9567C24.5776 63.7379 27.2319 63.7379 28.6719 61.9567C28.8634 61.72 29.109 61.536 29.3867 61.4216L30.8846 60.8039C31.5719 60.5206 32.0226 59.8346 32.0226 59.0716C32.0226 58.144 31.2931 57.3921 30.3933 57.3921H21.4161Z\"\r\n fill=\"currentColor\"\r\n />\r\n <path\r\n fillRule=\"evenodd\"\r\n clipRule=\"evenodd\"\r\n d=\"M44.6078 8.96738C45.0034 8.58801 45.3999 8.20795 45.7978 7.82772H45.7937C45.7145 7.72076 45.6474 7.62532 45.5867 7.53882C45.4751 7.38013 45.3846 7.25152 45.2788 7.13705C45.2014 7.05134 45.1245 6.96498 45.0476 6.87858C44.7386 6.53188 44.4293 6.18462 44.0858 5.87783C39.8486 2.08758 34.8311 0.289299 29.3028 0.0366203C23.2801 -0.237139 17.5271 0.992601 12.6525 4.78709C5.81257 10.1145 3.26295 17.4129 4.20688 26.101C4.313 27.0907 4.86457 27.5708 5.73095 27.8193C8.29274 28.5562 10.7771 29.4659 12.9181 31.2853C12.9839 31.2072 13.0497 31.1297 13.1153 31.0521C14.3138 29.6385 15.4412 28.3083 14.7323 26.2401C14.6277 25.9331 14.5969 25.6008 14.5662 25.268C14.5502 25.0939 14.5342 24.9198 14.5076 24.7493C13.2041 16.499 18.8019 9.38173 26.9165 8.92689C31.4397 8.67 35.3295 10.144 38.6923 13.2268C38.9498 13.4626 39.6035 13.6774 39.7588 13.5342C41.3958 12.0464 42.9959 10.5126 44.6078 8.96738ZM19.2274 44.0715C19.0668 44.13 18.88 44.1982 18.6507 44.2775C18.8702 44.3799 19.0457 44.4679 19.1938 44.5423C19.454 44.6729 19.6304 44.7615 19.8153 44.8124C28.404 47.1833 36.4696 45.8736 43.9797 41.0264C44.4986 40.6935 44.9806 39.8177 44.9889 39.1901C45.0334 35.5838 45.021 31.9754 45.0085 28.3664C45.0029 26.6821 44.997 24.9976 44.997 23.313C44.997 22.5592 44.7111 22.294 43.9674 22.3066C41.6833 22.3488 39.3952 22.3697 37.1111 22.2982C36.0651 22.2644 35.7872 22.6435 35.8036 23.6711C35.8302 25.2672 35.826 26.8634 35.8221 28.4595C35.8179 30.0556 35.8138 31.6517 35.8404 33.2478C35.8607 34.5828 35.4726 35.4294 34.1855 35.9642C33.0701 36.4274 31.9097 37.0424 31.0721 37.9014C27.9422 41.1064 24.1136 42.8162 19.9173 43.8438C19.7115 43.8947 19.5103 43.9682 19.2274 44.0715Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","/**\r\n * nav-link.ts — decide se o clique num item de navegação deve cancelar a\r\n * navegação nativa do `<a>`.\r\n *\r\n * ## O defeito que isto corrige\r\n *\r\n * O `SidebarItem` renderiza `<a href={item.href}>` e **nunca** chamava\r\n * `preventDefault`. Com `href` de PATH (`/app/clientes`) — o que todo app com\r\n * `BrowserRouter` usa — o handler do consumidor rodava **e** o browser executava a\r\n * navegação: **recarregamento completo da página a cada clique de menu**.\r\n *\r\n * Ficou meses invisível porque o exemplo canônico (`src/examples/app-shell/nav-data.ts`)\r\n * usa `href` de **HASH** (`#/app/clientes`) em todos os itens, e mudança de fragmento\r\n * **não** recarrega documento. Showcase verde, consumidor quebrado — a assinatura da\r\n * \"segunda regra de ouro\" do DS. Nenhum gate podia pegar: `tsc`, os testes,\r\n * `registry-check` e `examples-drift` não exercitam roteamento.\r\n *\r\n * Reproduzido em 2026-08-08 com o componente real: o jsdom imprime\r\n * `Not implemented: navigation to another Document` no clique.\r\n *\r\n * ## Por que NÃO é só \"chamar preventDefault\"\r\n *\r\n * Cancelar sempre quebraria quatro coisas legítimas, e a 4ª quebraria o próprio showcase:\r\n *\r\n * 1. **Clique modificado** (ctrl/cmd/shift/alt, botão do meio) — é como o usuário abre\r\n * em nova aba. Cancelar mata isso e não há como o consumidor recuperar.\r\n * 2. **`target=\"_blank\"`** — o item pede explicitamente outra aba.\r\n * 3. **Link externo** (`https:`, `mailto:`, `tel:`, `//host`) — não é rota do app;\r\n * router nenhum resolve, e cancelar deixaria o link morto.\r\n * 4. **`href` de HASH** (`#/rota`) — ⚠️ o mais sutil. Hash router escuta `hashchange`;\r\n * cancelar o default impede o fragmento de mudar e **o evento nunca dispara**. Ou\r\n * seja: cancelar cegamente trocaria \"recarrega\" por \"não navega\" em todo consumidor\r\n * de hash router — e no `example-app-shell`, que é a referência do próprio DS.\r\n *\r\n * ## A regra\r\n *\r\n * Só cancela quando as 4 condições valem juntas: há intenção declarada de tratar o\r\n * clique (`onItemClick` no componente ou `onClick` no item), o clique é simples, o\r\n * destino é uma rota interna, e o `href` **não** é hash.\r\n *\r\n * Consumidor que quer o caminho canônico passa `renderLink` — aí o `<Link>` do router\r\n * cuida de tudo e esta heurística nem roda.\r\n */\r\nimport type { MouseEvent } from \"react\";\r\n\r\n/** Protocolos/formas que nunca são rota interna do app. */\r\nconst EXTERNO = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\r\n\r\n/** `https://x`, `mailto:a@b`, `tel:+55`, `//cdn` → true. `/app`, `#/app`, `app` → false. */\r\nexport function isExternalHref(href: string | undefined): boolean {\r\n if (!href) return false;\r\n // `#` sozinho ou `#/rota` nunca é externo, e `:` dentro de fragmento não conta.\r\n if (href.startsWith(\"#\")) return false;\r\n return EXTERNO.test(href);\r\n}\r\n\r\n/** `#`, `#/rota` → true. Hash muda fragmento, não documento. */\r\nexport function isHashHref(href: string | undefined): boolean {\r\n return !!href && href.startsWith(\"#\");\r\n}\r\n\r\n/** ctrl/cmd/shift/alt ou botão que não é o principal → o usuário quer outra aba/janela. */\r\nexport function isModifiedClick(e: {\r\n button?: number;\r\n metaKey?: boolean;\r\n ctrlKey?: boolean;\r\n shiftKey?: boolean;\r\n altKey?: boolean;\r\n}): boolean {\r\n return (\r\n (e.button ?? 0) !== 0 ||\r\n !!e.metaKey ||\r\n !!e.ctrlKey ||\r\n !!e.shiftKey ||\r\n !!e.altKey\r\n );\r\n}\r\n\r\nexport type PreventNavigationInput = {\r\n /** O `href` do item. Ausente → é `<button>`, não há navegação a cancelar. */\r\n href?: string;\r\n /** Há handler do consumidor pro clique? Sem isso, o `<a>` é a única navegação. */\r\n hasHandler: boolean;\r\n /** `target` do item (`\"_blank\"` desliga o cancelamento). */\r\n target?: string;\r\n /** O evento — só as teclas/botão são lidos. */\r\n event: Pick<\r\n MouseEvent<HTMLAnchorElement>,\r\n \"button\" | \"metaKey\" | \"ctrlKey\" | \"shiftKey\" | \"altKey\" | \"defaultPrevented\"\r\n >;\r\n};\r\n\r\n/**\r\n * @returns `true` quando o clique deve ter `preventDefault()` — ou seja, quando cancelar\r\n * a navegação nativa é o que o consumidor claramente quer.\r\n */\r\nexport function shouldPreventNavigation({\r\n href,\r\n hasHandler,\r\n target,\r\n event,\r\n}: PreventNavigationInput): boolean {\r\n if (!href) return false; // é <button>\r\n if (!hasHandler) return false; // ninguém vai tratar → deixa o <a> navegar\r\n if (event.defaultPrevented) return false; // alguém já decidiu antes\r\n if (target && target !== \"_self\") return false; // pediu outra aba\r\n if (isHashHref(href)) return false; // hash router depende do hashchange\r\n if (isExternalHref(href)) return false; // não é rota do app\r\n if (isModifiedClick(event)) return false; // abrir em nova aba\r\n return true;\r\n}\r\n","import type { ReactNode, MouseEvent } from \"react\";\r\nimport { Plus } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n sidebarRail,\r\n sidebarRailBrand,\r\n sidebarRailList,\r\n sidebarRailItem,\r\n sidebarRailActiveBar,\r\n sidebarRailTooltip,\r\n sidebarRailAdd,\r\n sidebarRailUser,\r\n sidebarRailUserDefault,\r\n} from \"./sidebar.styles\";\r\nimport { SidebarBrandIcon } from \"./sidebar-brand\";\r\nimport { shouldPreventNavigation } from \"@/utils/nav-link\";\r\nimport type { SidebarContext, SidebarLinkRenderer } from \"./sidebar.types\";\r\n\r\nexport type SidebarRailProps = {\r\n contexts: SidebarContext[];\r\n activeContextId: string;\r\n onContextChange: (id: string) => void;\r\n brand?: ReactNode;\r\n user?: ReactNode;\r\n showAdd?: boolean;\r\n onAddClick?: () => void;\r\n /** Destino do brand. Default `\"/\"`; string vazia torna o brand não-navegável. */\r\n brandHref?: string;\r\n onBrandClick?: (e: MouseEvent<HTMLAnchorElement>) => void;\r\n renderLink?: SidebarLinkRenderer;\r\n className?: string;\r\n};\r\n\r\nexport function SidebarRail({\r\n contexts,\r\n activeContextId,\r\n onContextChange,\r\n brand,\r\n user,\r\n showAdd = false,\r\n onAddClick,\r\n brandHref = \"/\",\r\n onBrandClick,\r\n renderLink,\r\n className,\r\n}: SidebarRailProps) {\r\n return (\r\n <aside className={cn(sidebarRail(), className)}>\r\n <SidebarBrandLink\r\n href={brandHref}\r\n onClick={onBrandClick}\r\n renderLink={renderLink}\r\n >\r\n {brand ?? <SidebarBrandIcon />}\r\n </SidebarBrandLink>\r\n\r\n <div className={sidebarRailList()}>\r\n {contexts.map((ctx) => {\r\n const Icon = ctx.icon;\r\n const isActive = activeContextId === ctx.id;\r\n return (\r\n <button\r\n key={ctx.id}\r\n type=\"button\"\r\n className={sidebarRailItem({ active: isActive })}\r\n onClick={() => onContextChange(ctx.id)}\r\n aria-label={ctx.label}\r\n aria-current={isActive ? \"page\" : undefined}\r\n >\r\n <Icon size={18} strokeWidth={1.7} />\r\n {isActive && <span className={sidebarRailActiveBar()} aria-hidden=\"true\" />}\r\n <span className={sidebarRailTooltip()}>{ctx.label}</span>\r\n </button>\r\n );\r\n })}\r\n\r\n {showAdd && (\r\n <button\r\n type=\"button\"\r\n className={sidebarRailAdd()}\r\n onClick={onAddClick}\r\n aria-label=\"Adicionar contexto\"\r\n >\r\n <Plus size={16} strokeWidth={2} />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {user !== null && (\r\n <div className={sidebarRailUser()}>\r\n {user ?? <div className={sidebarRailUserDefault()}>SV</div>}\r\n </div>\r\n )}\r\n </aside>\r\n );\r\n}\r\n\r\n/* ── Brand do rail ─────────────────────────────────────────────────────────── */\r\n//\r\n// ⚠️ Era `<a href=\"/\">` FIXO no JSX até 2026-08-08: recarregava pra raiz em qualquer\r\n// app, sem forma de configurar nem de rotear. Agora aceita `brandHref`, `onBrandClick`\r\n// e `renderLink`, e segue a mesma regra de cancelamento dos itens (ver `@/utils/nav-link`).\r\nfunction SidebarBrandLink({\r\n href,\r\n onClick,\r\n renderLink,\r\n children,\r\n}: {\r\n href?: string;\r\n onClick?: (e: MouseEvent<HTMLAnchorElement>) => void;\r\n renderLink?: SidebarLinkRenderer;\r\n children: ReactNode;\r\n}) {\r\n // `brandHref=\"\"` = brand decorativo/só-ação: vira <button> pra não mentir semântica\r\n // de link (screen reader anuncia \"link\" pra algo que não navega).\r\n if (!href) {\r\n return (\r\n <button\r\n type=\"button\"\r\n className={sidebarRailBrand()}\r\n onClick={onClick as unknown as () => void}\r\n aria-label=\"Home\"\r\n >\r\n {children}\r\n </button>\r\n );\r\n }\r\n\r\n const handleClick = (e: MouseEvent<HTMLAnchorElement>) => {\r\n if (!renderLink) {\r\n const prevent = shouldPreventNavigation({ href, hasHandler: !!onClick, event: e });\r\n if (prevent) e.preventDefault();\r\n }\r\n onClick?.(e);\r\n };\r\n\r\n const linkProps = {\r\n href,\r\n className: sidebarRailBrand(),\r\n onClick: handleClick,\r\n \"aria-label\": \"Home\",\r\n children,\r\n };\r\n\r\n if (renderLink) return <>{renderLink(linkProps)}</>;\r\n return <a {...linkProps} />;\r\n}\r\n","import { forwardRef } from \"react\";\r\nimport type { MouseEvent, ReactNode } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n sidebarItem,\r\n sidebarItemIcon,\r\n sidebarItemText,\r\n sidebarPill,\r\n} from \"./sidebar.styles\";\r\nimport { shouldPreventNavigation } from \"@/utils/nav-link\";\r\nimport type {\r\n SidebarMenuItem,\r\n SidebarBadgeKind,\r\n SidebarLinkRenderer,\r\n} from \"./sidebar.types\";\r\n\r\nexport type SidebarItemProps = {\r\n item: SidebarMenuItem;\r\n active?: boolean;\r\n subitem?: boolean;\r\n /** Quando true, o ícone usa cor de brand (usado em groups com filho ativo) */\r\n iconBrand?: boolean;\r\n onClick?: (e: MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => void;\r\n /** Substitui o `<a>` pelo link do router do consumidor. Ver `SidebarLinkRenderer`. */\r\n renderLink?: SidebarLinkRenderer;\r\n /**\r\n * O consumidor trata a navegação? Decide se o clique cancela o `<a>` nativo.\r\n *\r\n * ⚠️ Existe porque **inferir pelo `onClick` não funciona no caminho composto**: o\r\n * `SidebarPanel` SEMPRE passa um `onClick` (é como o `MenuSidebar` mantém o item ativo\r\n * em modo uncontrolled), então \"tem onClick\" seria sempre verdadeiro e o sidebar\r\n * cancelaria a navegação até de quem não passou handler nenhum — trocando o bug do\r\n * reload por \"o link não faz nada\". Foi o que um teste pegou nesta implementação.\r\n *\r\n * - `undefined` (uso standalone do `SidebarItem`) → infere de `item.onClick`/`onClick`.\r\n * - `boolean` (uso composto) → o `MenuSidebar` decide, olhando o `onItemClick` DELE.\r\n */\r\n interceptNavigation?: boolean;\r\n className?: string;\r\n};\r\n\r\nexport const SidebarItem = forwardRef<HTMLAnchorElement | HTMLButtonElement, SidebarItemProps>(\r\n (\r\n {\r\n item,\r\n active,\r\n subitem,\r\n iconBrand,\r\n onClick,\r\n renderLink,\r\n interceptNavigation,\r\n className,\r\n },\r\n ref,\r\n ) => {\r\n const Icon = item.icon;\r\n const classes = cn(sidebarItem({ active, subitem }), className);\r\n\r\n const content: ReactNode = (\r\n <>\r\n {Icon && (\r\n <Icon\r\n size={subitem ? 15 : 17}\r\n strokeWidth={1.7}\r\n className={sidebarItemIcon({ active, parentActive: iconBrand })}\r\n />\r\n )}\r\n <span className={sidebarItemText()}>{item.name}</span>\r\n {item.badge && (\r\n <SidebarPill kind={item.badgeKind} active={active}>\r\n {item.badge}\r\n </SidebarPill>\r\n )}\r\n </>\r\n );\r\n\r\n const handleClick = (e: MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => {\r\n // Cancela a navegação nativa do `<a>` quando o consumidor claramente trata o\r\n // clique — mas nunca em clique modificado, `target=\"_blank\"`, link externo ou\r\n // href de HASH. A regra e o porquê de cada exceção estão em `@/utils/nav-link`.\r\n //\r\n // Só corre quando NÃO há `renderLink`: com ele, quem decide é o `<Link>` do router.\r\n if (!renderLink) {\r\n const prevent = shouldPreventNavigation({\r\n href: item.href,\r\n hasHandler: interceptNavigation ?? !!(item.onClick || onClick),\r\n target: item.target,\r\n event: e as MouseEvent<HTMLAnchorElement>,\r\n });\r\n if (prevent) e.preventDefault();\r\n }\r\n if (item.onClick) item.onClick(e);\r\n onClick?.(e);\r\n };\r\n\r\n if (item.href) {\r\n const linkProps = {\r\n href: item.href,\r\n className: classes,\r\n onClick: handleClick as (e: MouseEvent<HTMLAnchorElement>) => void,\r\n target: item.target,\r\n \"aria-current\": active ? (\"page\" as const) : undefined,\r\n ref: ref as React.Ref<HTMLAnchorElement>,\r\n children: content,\r\n };\r\n\r\n // `renderLink` recebe as props de um `<a>` e devolve o link do router do\r\n // consumidor. `ref` vai no objeto: em React 19 `ref` é prop normal, então\r\n // funciona igual pra elemento DOM e pra componente.\r\n if (renderLink) return <>{renderLink(linkProps)}</>;\r\n\r\n return <a {...linkProps} />;\r\n }\r\n\r\n return (\r\n <button\r\n ref={ref as React.Ref<HTMLButtonElement>}\r\n type=\"button\"\r\n className={classes}\r\n onClick={handleClick}\r\n aria-current={active ? \"page\" : undefined}\r\n >\r\n {content}\r\n </button>\r\n );\r\n }\r\n);\r\nSidebarItem.displayName = \"SidebarItem\";\r\n\r\n/* ── Pill (badge) ─────────────────────────────────────────────────────────── */\r\nexport function SidebarPill({\r\n kind,\r\n active,\r\n children,\r\n className,\r\n}: {\r\n kind?: SidebarBadgeKind;\r\n active?: boolean;\r\n children: ReactNode;\r\n className?: string;\r\n}) {\r\n return (\r\n <span className={cn(sidebarPill({ kind, active }), className)}>\r\n {children}\r\n </span>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { ChevronDown } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n sidebarItem,\r\n sidebarItemIcon,\r\n sidebarItemText,\r\n sidebarSubgroupRoot,\r\n sidebarSubgroupChev,\r\n sidebarSubgroupList,\r\n} from \"./sidebar.styles\";\r\nimport { SidebarItem } from \"./sidebar-item\";\r\nimport type { MouseEvent } from \"react\";\r\nimport type { SidebarMenuItem, SidebarLinkRenderer } from \"./sidebar.types\";\r\n\r\nexport type SidebarSubgroupProps = {\r\n item: SidebarMenuItem;\r\n activeItemHref?: string;\r\n onItemClick?: (\r\n item: SidebarMenuItem,\r\n event?: MouseEvent<HTMLAnchorElement | HTMLButtonElement>,\r\n ) => void;\r\n renderLink?: SidebarLinkRenderer;\r\n interceptNavigation?: boolean;\r\n /** Estado controlado de collapse — se omitido, gerencia internamente */\r\n open?: boolean;\r\n defaultOpen?: boolean;\r\n onOpenChange?: (open: boolean) => void;\r\n className?: string;\r\n};\r\n\r\nexport function SidebarSubgroup({\r\n item,\r\n activeItemHref,\r\n onItemClick,\r\n renderLink,\r\n interceptNavigation,\r\n open,\r\n defaultOpen,\r\n onOpenChange,\r\n className,\r\n}: SidebarSubgroupProps) {\r\n const hasActiveChild = item.subitems?.some(\r\n (s) => s.href !== undefined && s.href === activeItemHref\r\n );\r\n\r\n const [internalOpen, setInternalOpen] = useState<boolean>(\r\n defaultOpen ?? item.defaultOpen ?? hasActiveChild ?? false\r\n );\r\n const isOpen = open ?? internalOpen;\r\n const collapsed = !isOpen;\r\n\r\n const setOpen = (next: boolean) => {\r\n if (open === undefined) setInternalOpen(next);\r\n onOpenChange?.(next);\r\n };\r\n\r\n const Icon = item.icon;\r\n\r\n return (\r\n <div className={cn(sidebarSubgroupRoot(), className)}>\r\n <button\r\n type=\"button\"\r\n className={cn(sidebarItem(), \"select-none\")}\r\n onClick={() => setOpen(!isOpen)}\r\n aria-expanded={isOpen}\r\n aria-controls={`subgroup-${item.name}`}\r\n >\r\n {Icon && (\r\n <Icon\r\n size={17}\r\n strokeWidth={1.7}\r\n className={sidebarItemIcon({ parentActive: hasActiveChild })}\r\n />\r\n )}\r\n <span className={sidebarItemText()}>{item.name}</span>\r\n <ChevronDown\r\n size={13}\r\n strokeWidth={2}\r\n className={sidebarSubgroupChev({ collapsed })}\r\n />\r\n </button>\r\n\r\n <div id={`subgroup-${item.name}`} className={sidebarSubgroupList({ collapsed })}>\r\n {item.subitems?.map((sub) => (\r\n <SidebarItem\r\n key={sub.href ?? sub.name}\r\n item={sub}\r\n subitem\r\n active={sub.href !== undefined && sub.href === activeItemHref}\r\n onClick={(e) => onItemClick?.(sub, e)}\r\n renderLink={renderLink}\r\n interceptNavigation={interceptNavigation}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport type { MouseEvent } from \"react\";\r\nimport { ChevronDown } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n sidebarSection,\r\n sidebarSectionHeader,\r\n sidebarSectionChev,\r\n sidebarSectionAdd,\r\n sidebarSectionList,\r\n sidebarSectionItem,\r\n sidebarItemText,\r\n sidebarBookmarkDot,\r\n sidebarBookmarkIcon,\r\n sidebarChatAvatar,\r\n sidebarChatStatus,\r\n} from \"./sidebar.styles\";\r\nimport { shouldPreventNavigation } from \"@/utils/nav-link\";\r\nimport type {\r\n SidebarSection as SidebarSectionData,\r\n SidebarLinkRenderer,\r\n} from \"./sidebar.types\";\r\n\r\nexport type SidebarSectionProps = {\r\n section: SidebarSectionData;\r\n /** Estado controlado — se omitido, gerencia internamente */\r\n open?: boolean;\r\n onOpenChange?: (open: boolean) => void;\r\n /** Substitui o `<a>` pelo link do router do consumidor. */\r\n renderLink?: SidebarLinkRenderer;\r\n className?: string;\r\n};\r\n\r\nexport function SidebarSection({\r\n section,\r\n open,\r\n onOpenChange,\r\n renderLink,\r\n className,\r\n}: SidebarSectionProps) {\r\n const [internalOpen, setInternalOpen] = useState<boolean>(section.defaultOpen ?? true);\r\n const isOpen = open ?? internalOpen;\r\n const collapsed = !isOpen;\r\n\r\n const setOpen = (next: boolean) => {\r\n if (open === undefined) setInternalOpen(next);\r\n onOpenChange?.(next);\r\n };\r\n\r\n return (\r\n <div className={cn(sidebarSection(), className)}>\r\n <button\r\n type=\"button\"\r\n className={sidebarSectionHeader()}\r\n onClick={() => setOpen(!isOpen)}\r\n aria-expanded={isOpen}\r\n aria-controls={`section-${section.id}`}\r\n >\r\n <ChevronDown\r\n size={12}\r\n strokeWidth={2}\r\n className={sidebarSectionChev({ collapsed })}\r\n />\r\n <span>{section.label}</span>\r\n {section.onAdd && (\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n className={sidebarSectionAdd()}\r\n onClick={(e: MouseEvent<HTMLSpanElement>) => {\r\n e.stopPropagation();\r\n section.onAdd?.();\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n section.onAdd?.();\r\n }\r\n }}\r\n aria-label={`Adicionar em ${section.label}`}\r\n >\r\n +\r\n </span>\r\n )}\r\n </button>\r\n\r\n <div\r\n id={`section-${section.id}`}\r\n className={sidebarSectionList({ collapsed, variant: section.variant })}\r\n >\r\n {section.variant === \"bookmark\" &&\r\n section.items.map((item) => {\r\n const Icon = item.icon;\r\n return (\r\n <SidebarSectionLink\r\n key={item.name}\r\n href={item.href}\r\n onClick={item.onClick}\r\n renderLink={renderLink}\r\n title={item.name}\r\n >\r\n {Icon ? (\r\n <span\r\n className={sidebarBookmarkIcon()}\r\n style={{ color: item.color }}\r\n aria-hidden=\"true\"\r\n >\r\n <Icon />\r\n </span>\r\n ) : (\r\n <span\r\n className={sidebarBookmarkDot()}\r\n style={{ backgroundColor: item.color }}\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n <span className={sidebarItemText()}>{item.name}</span>\r\n </SidebarSectionLink>\r\n );\r\n })}\r\n\r\n {section.variant === \"chat\" &&\r\n section.items.map((item) => (\r\n <SidebarSectionLink\r\n key={item.name}\r\n href={item.href}\r\n onClick={item.onClick}\r\n renderLink={renderLink}\r\n title={`Conversar com ${item.name}`}\r\n >\r\n <span\r\n className={sidebarChatAvatar()}\r\n style={{ backgroundColor: item.color }}\r\n >\r\n {item.initials}\r\n </span>\r\n <span className={sidebarItemText()}>{item.name}</span>\r\n <span\r\n className={sidebarChatStatus({ status: item.status })}\r\n aria-hidden=\"true\"\r\n />\r\n </SidebarSectionLink>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ── Wrapper que vira `<a>` ou link do router ──────────────────────────────── */\r\nfunction SidebarSectionLink({\r\n href,\r\n onClick,\r\n title,\r\n renderLink,\r\n children,\r\n}: {\r\n href?: string;\r\n onClick?: (e: MouseEvent<HTMLAnchorElement>) => void;\r\n title?: string;\r\n renderLink?: SidebarLinkRenderer;\r\n children: React.ReactNode;\r\n}) {\r\n const handleClick = (e: MouseEvent<HTMLAnchorElement>) => {\r\n // Sem href (ou `#` puro) o anchor é só afordância — cancelar sempre foi certo aqui.\r\n if (!href || href === \"#\") {\r\n e.preventDefault();\r\n onClick?.(e);\r\n return;\r\n }\r\n // COM href, a versão anterior não cancelava nada: com `href` de path o browser\r\n // navegava e recarregava a página, mesmo tendo `onClick`. Mesma causa do\r\n // `sidebar-item.tsx`. Ver `@/utils/nav-link`.\r\n if (!renderLink) {\r\n const prevent = shouldPreventNavigation({\r\n href,\r\n hasHandler: !!onClick,\r\n event: e,\r\n });\r\n if (prevent) e.preventDefault();\r\n }\r\n onClick?.(e);\r\n };\r\n\r\n const linkProps = {\r\n href: href ?? \"#\",\r\n className: sidebarSectionItem(),\r\n onClick: handleClick,\r\n title,\r\n children,\r\n };\r\n\r\n // `renderLink` só faz sentido com destino real — `#` puro é afordância, não rota.\r\n if (renderLink && href && href !== \"#\") return <>{renderLink(linkProps)}</>;\r\n\r\n return <a {...linkProps} />;\r\n}\r\n","import type { ReactNode, MouseEvent } from \"react\";\r\nimport { ChevronDown, Check } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n} from \"@/components/shadcn/dropdown-menu\";\r\nimport {\r\n sidebarPanel,\r\n sidebarPanelHeader,\r\n sidebarPanelTitle,\r\n sidebarPanelBody,\r\n sidebarPanelGroup,\r\n} from \"./sidebar.styles\";\r\nimport { SidebarItem } from \"./sidebar-item\";\r\nimport { SidebarSubgroup } from \"./sidebar-subgroup\";\r\nimport { SidebarSection } from \"./sidebar-section\";\r\nimport type {\r\n SidebarContext,\r\n SidebarMenuItem,\r\n SidebarLinkRenderer,\r\n} from \"./sidebar.types\";\r\n\r\nexport type SidebarPanelProps = {\r\n context: SidebarContext;\r\n collapsed?: boolean;\r\n /** Quando true: panel renderiza como overlay absoluto (hover-to-expand) */\r\n floating?: boolean;\r\n /** Quando true (mobile): panel preenche o drawer full-screen (flex-1). */\r\n mobile?: boolean;\r\n activeItemHref?: string;\r\n onItemClick?: (\r\n item: SidebarMenuItem,\r\n event?: MouseEvent<HTMLAnchorElement | HTMLButtonElement>,\r\n ) => void;\r\n renderLink?: SidebarLinkRenderer;\r\n interceptNavigation?: boolean;\r\n /** Quando passados, o título vira um dropdown switcher de contextos */\r\n contexts?: SidebarContext[];\r\n onContextChange?: (id: string) => void;\r\n /** Fallback: callback ao clicar no título (usado quando contexts não passado) */\r\n onTitleClick?: () => void;\r\n /** Conteúdo custom no body (substitui items/sections quando passado) */\r\n children?: ReactNode;\r\n className?: string;\r\n};\r\n\r\nexport function SidebarPanel({\r\n context,\r\n collapsed,\r\n floating,\r\n mobile,\r\n activeItemHref,\r\n onItemClick,\r\n renderLink,\r\n interceptNavigation,\r\n contexts,\r\n onContextChange,\r\n onTitleClick,\r\n children,\r\n className,\r\n}: SidebarPanelProps) {\r\n const hasSwitcher = contexts && contexts.length > 1 && onContextChange;\r\n\r\n return (\r\n <aside\r\n className={cn(sidebarPanel({ collapsed, floating, mobile }), className)}\r\n aria-hidden={collapsed}\r\n >\r\n <div className={sidebarPanelHeader()}>\r\n {hasSwitcher ? (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <button type=\"button\" className={sidebarPanelTitle()}>\r\n <span className=\"flex-1 min-w-0 whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {context.label}\r\n </span>\r\n <ChevronDown\r\n size={14}\r\n strokeWidth={2}\r\n className=\"flex-none w-[14px] h-[14px] text-fg-muted\"\r\n />\r\n </button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\" sideOffset={6} className=\"min-w-[220px]\">\r\n {contexts.map((ctx) => {\r\n const Icon = ctx.icon;\r\n const isActive = ctx.id === context.id;\r\n return (\r\n <DropdownMenuItem\r\n key={ctx.id}\r\n onSelect={() => onContextChange?.(ctx.id)}\r\n >\r\n <Icon className=\"size-4 text-fg-muted\" strokeWidth={1.7} />\r\n <span className=\"flex-1 truncate\">{ctx.label}</span>\r\n {isActive && <Check className=\"size-4 text-fg-brand\" strokeWidth={2} />}\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n ) : (\r\n <button type=\"button\" className={sidebarPanelTitle()} onClick={onTitleClick}>\r\n <span className=\"flex-1 min-w-0 whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {context.label}\r\n </span>\r\n <ChevronDown\r\n size={14}\r\n strokeWidth={2}\r\n className=\"flex-none w-[14px] h-[14px] text-fg-muted\"\r\n />\r\n </button>\r\n )}\r\n </div>\r\n\r\n <div className={sidebarPanelBody()}>\r\n {children ?? (\r\n <>\r\n <div className={sidebarPanelGroup()}>\r\n {context.items.map((item) => {\r\n if (item.subitems && item.subitems.length > 0) {\r\n return (\r\n <SidebarSubgroup\r\n key={item.name}\r\n item={item}\r\n activeItemHref={activeItemHref}\r\n onItemClick={onItemClick}\r\n renderLink={renderLink}\r\n interceptNavigation={interceptNavigation}\r\n />\r\n );\r\n }\r\n return (\r\n <SidebarItem\r\n key={item.href ?? item.name}\r\n item={item}\r\n active={item.href !== undefined && item.href === activeItemHref}\r\n onClick={(e) => onItemClick?.(item, e)}\r\n renderLink={renderLink}\r\n interceptNavigation={interceptNavigation}\r\n />\r\n );\r\n })}\r\n </div>\r\n\r\n {context.sections?.map((section) => (\r\n <SidebarSection\r\n key={section.id}\r\n section={section}\r\n renderLink={renderLink}\r\n />\r\n ))}\r\n </>\r\n )}\r\n </div>\r\n </aside>\r\n );\r\n}\r\n","import { useState, useCallback } from \"react\";\n\n/**\n * Hook genérico controlled/uncontrolled.\n * - Se `controlledValue` for fornecido, opera em modo controlled.\n * - Caso contrário, usa o `defaultValue` como inicial e gerencia internamente.\n */\nexport function useControllable<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void\n): [T, (value: T) => void] {\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState<T>(defaultValue);\n const value = isControlled ? (controlledValue as T) : internalValue;\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n return [value, setValue];\n}\n","import { useEffect, useState } from \"react\";\n\n/**\n * Reactive media query matcher.\n *\n * Re-renderiza quando o resultado da media query muda (resize do viewport,\n * mudança de orientação, etc).\n *\n * Uso:\n * const isMobile = useMediaQuery(\"(max-width: 767px)\");\n */\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mql = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n setMatches(mql.matches);\n mql.addEventListener(\"change\", handler);\n return () => mql.removeEventListener(\"change\", handler);\n }, [query]);\n\n return matches;\n}\n","import { useEffect, useRef, useState } from \"react\";\r\nimport type { MouseEvent } from \"react\";\r\nimport { X } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n sidebarRoot,\r\n sidebarMobileBackdrop,\r\n sidebarMobileCloseBtn,\r\n} from \"./sidebar.styles\";\r\nimport { SidebarRail } from \"./sidebar-rail\";\r\nimport { SidebarPanel } from \"./sidebar-panel\";\r\nimport { useControllable } from \"./use-sidebar-state\";\r\nimport { useMediaQuery } from \"./use-media-query\";\r\nimport type { SidebarProps, SidebarMenuItem } from \"./sidebar.types\";\r\n\r\n/**\r\n * MenuSidebar — composição completa (rail + panel) data-driven.\r\n *\r\n * Modo all-in-one: passa `contexts` e o componente gerencia tudo.\r\n * Para composição manual, use os subcomponentes:\r\n * `<SidebarRail>` + `<SidebarPanel>` + `<SidebarItem>` + `<SidebarSubgroup>` + `<SidebarSection>`.\r\n *\r\n * Estados controlled/uncontrolled:\r\n * - activeContextId / defaultActiveContextId / onContextChange\r\n * - activeItemHref / defaultActiveItemHref / onItemClick\r\n * - panelCollapsed / defaultPanelCollapsed / onPanelCollapseChange\r\n *\r\n * Hover-to-expand (desktop):\r\n * - `expandOnHover` (default true) + estado colapsado → panel vira overlay flutuante.\r\n *\r\n * Mobile responsive:\r\n * - Detecta breakpoint (default `max-md` = 767px) via matchMedia.\r\n * - Mobile: vira drawer fixed overlay; panel sempre aberto (sem rail-only);\r\n * close button (X) no canto + backdrop scrim clicável pra fechar.\r\n * - Estado: mobileOpen / defaultMobileOpen / onMobileOpenChange.\r\n * - Trigger externo: qualquer botão que altere `mobileOpen` (hamburger no header da app).\r\n */\r\nexport function MenuSidebar({\r\n contexts,\r\n brand,\r\n user,\r\n showRailAdd,\r\n onRailAddClick,\r\n activeContextId,\r\n defaultActiveContextId,\r\n onContextChange,\r\n activeItemHref,\r\n defaultActiveItemHref,\r\n onItemClick,\r\n panelCollapsed,\r\n defaultPanelCollapsed,\r\n onPanelCollapseChange,\r\n expandOnHover = true,\r\n onPanelTitleClick,\r\n mobileOpen,\r\n defaultMobileOpen,\r\n onMobileOpenChange,\r\n mobileBreakpoint = \"(max-width: 767px)\",\r\n renderLink,\r\n brandHref,\r\n onBrandClick,\r\n className,\r\n}: SidebarProps) {\r\n const isMobile = useMediaQuery(mobileBreakpoint);\r\n\r\n const [ctxId, setCtxId] = useControllable<string>(\r\n activeContextId,\r\n defaultActiveContextId ?? contexts[0]?.id ?? \"\",\r\n onContextChange\r\n );\r\n\r\n const [itemHref, setItemHref] = useControllable<string>(\r\n activeItemHref,\r\n defaultActiveItemHref ?? \"\",\r\n () => {}\r\n );\r\n\r\n const [collapsed] = useControllable<boolean>(\r\n panelCollapsed,\r\n defaultPanelCollapsed ?? false,\r\n onPanelCollapseChange\r\n );\r\n\r\n const [openMobile, setOpenMobile] = useControllable<boolean>(\r\n mobileOpen,\r\n defaultMobileOpen ?? false,\r\n onMobileOpenChange\r\n );\r\n\r\n /**\r\n * Hover-to-expand: 2 states pra preservar overlay durante animação de saída.\r\n *\r\n * - `hoverExpanded` = true enquanto o cursor está sobre a sidebar\r\n * - `hoverExiting` = true por 200ms após mouseleave (duração da transition\r\n * de width no panel — `transition-[width,opacity,...]\r\n * duration-200`)\r\n *\r\n * Bug original: ao mouseleave, hoverExpanded virava false instantâneo. O\r\n * panel perdia `position: absolute` (vira `relative`) com width ainda em\r\n * 264px e entrava no fluxo flex — empurrava o main area por 200ms até a\r\n * width animar de 264→0. Visual de \"card empurrado e volta\".\r\n *\r\n * Fix: durante `hoverExiting`, mantém `floating: true` (position absolute) +\r\n * passa `collapsed: true` pro panel — width anima 264→0 DENTRO do overlay,\r\n * sem afetar o fluxo. Depois de 200ms, hoverExiting=false e a sidebar volta\r\n * ao layout normal (já com width=0).\r\n */\r\n const [hoverExpanded, setHoverExpanded] = useState(false);\r\n const [hoverExiting, setHoverExiting] = useState(false);\r\n const exitTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (exitTimerRef.current) clearTimeout(exitTimerRef.current);\r\n };\r\n }, []);\r\n\r\n const shouldFloat =\r\n !isMobile && !!expandOnHover && collapsed && (hoverExpanded || hoverExiting);\r\n\r\n const activeContext = contexts.find((c) => c.id === ctxId) ?? contexts[0];\r\n\r\n // Intenção do CONSUMIDOR, não do wrapper interno. O panel sempre passa um onClick\r\n // (é como o item ativo funciona em modo uncontrolled), então inferir por ele\r\n // cancelaria a navegação de quem não passou handler nenhum. Ver SidebarItemProps.\r\n const interceptNavigation = !renderLink && !!onItemClick;\r\n\r\n const handleItemClick = (\r\n item: SidebarMenuItem,\r\n event?: MouseEvent<HTMLAnchorElement | HTMLButtonElement>,\r\n ) => {\r\n if (item.href && activeItemHref === undefined) {\r\n setItemHref(item.href);\r\n }\r\n // O evento passa adiante: sem ele o consumidor não tinha como cancelar a\r\n // navegação do <a> nem sabendo do problema (era `(item) => void`).\r\n onItemClick?.(item, event);\r\n // Mobile: fecha após selecionar (UX padrão de drawer)\r\n if (isMobile && item.href) setOpenMobile(false);\r\n };\r\n\r\n return (\r\n <>\r\n {/* Backdrop mobile — clicável pra fechar */}\r\n {isMobile && openMobile && (\r\n <div\r\n className={sidebarMobileBackdrop()}\r\n onClick={() => setOpenMobile(false)}\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n\r\n <div\r\n className={cn(\r\n sidebarRoot({ mobile: isMobile, mobileOpen: isMobile && openMobile }),\r\n className\r\n )}\r\n onMouseEnter={() => {\r\n if (!isMobile && expandOnHover && collapsed) {\r\n // Cancela timer de saída se reentra antes de 200ms (evita flash)\r\n if (exitTimerRef.current) {\r\n clearTimeout(exitTimerRef.current);\r\n exitTimerRef.current = null;\r\n }\r\n setHoverExiting(false);\r\n setHoverExpanded(true);\r\n }\r\n }}\r\n onMouseLeave={() => {\r\n setHoverExpanded(false);\r\n // Mantém floating=true durante a animação 200ms da width voltando a 0,\r\n // pra panel encolher dentro do overlay (não empurrar o main area).\r\n if (!isMobile && expandOnHover && collapsed) {\r\n setHoverExiting(true);\r\n if (exitTimerRef.current) clearTimeout(exitTimerRef.current);\r\n exitTimerRef.current = setTimeout(() => {\r\n setHoverExiting(false);\r\n exitTimerRef.current = null;\r\n }, 200);\r\n }\r\n }}\r\n >\r\n <SidebarRail\r\n contexts={contexts}\r\n activeContextId={ctxId}\r\n onContextChange={setCtxId}\r\n brand={brand}\r\n user={user}\r\n showAdd={showRailAdd}\r\n onAddClick={onRailAddClick}\r\n brandHref={brandHref}\r\n onBrandClick={onBrandClick}\r\n renderLink={renderLink}\r\n />\r\n {activeContext && (\r\n <SidebarPanel\r\n context={activeContext}\r\n // collapsed lógico:\r\n // - mobile: nunca colapsado (drawer overlay tem sua própria lógica)\r\n // - hover entering (hoverExpanded): expanded dentro do overlay\r\n // - hover exiting (hoverExiting): collapsed (width animando 264→0)\r\n // mantendo floating=true pra animar DENTRO do overlay\r\n // - sem hover, estado base: respeita `collapsed` controlled\r\n collapsed={\r\n isMobile ? false : hoverExpanded ? false : collapsed\r\n }\r\n floating={shouldFloat}\r\n mobile={isMobile}\r\n activeItemHref={itemHref}\r\n onItemClick={handleItemClick}\r\n contexts={contexts}\r\n onContextChange={setCtxId}\r\n onTitleClick={onPanelTitleClick}\r\n renderLink={renderLink}\r\n interceptNavigation={interceptNavigation}\r\n />\r\n )}\r\n\r\n {/* Close button — só no mobile aberto */}\r\n {isMobile && openMobile && (\r\n <button\r\n type=\"button\"\r\n className={sidebarMobileCloseBtn()}\r\n onClick={() => setOpenMobile(false)}\r\n aria-label=\"Fechar menu\"\r\n >\r\n <X size={18} strokeWidth={1.7} />\r\n </button>\r\n )}\r\n </div>\r\n </>\r\n );\r\n}\r\n","import {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\n\r\n/* ══════════════════════════════════════════════════════════════════════════\r\n SingleMenuSidebar — hooks de UI (sem business logic, sem fetch, sem store)\r\n ══════════════════════════════════════════════════════════════════════════ */\r\n\r\ninterface SingleMenuSidebarContextValue {\r\n expanded: boolean;\r\n /** Se o estado expandido veio de hover (temporário) ou toggle (travado) */\r\n isHoverExpand: boolean;\r\n toggle: () => void;\r\n /** Categoria aberta no accordion (apenas 1 por vez) */\r\n openCategoryId: string | null;\r\n setOpenCategoryId: (id: string | null) => void;\r\n}\r\n\r\nexport const SingleMenuSidebarContext =\r\n createContext<SingleMenuSidebarContextValue>({\r\n expanded: true,\r\n isHoverExpand: false,\r\n toggle: () => {},\r\n openCategoryId: null,\r\n setOpenCategoryId: () => {},\r\n });\r\n\r\nexport function useSingleMenuSidebar() {\r\n return useContext(SingleMenuSidebarContext);\r\n}\r\n\r\n// ── Estado expandido controlado/não-controlado + suporte a hover ──\r\nexport function useSingleMenuSidebarState(\r\n defaultExpanded: boolean,\r\n controlledExpanded?: boolean,\r\n onExpandedChange?: (v: boolean) => void,\r\n) {\r\n const [internal, setInternal] = useState(defaultExpanded);\r\n const isControlled = controlledExpanded !== undefined;\r\n const expanded = isControlled ? controlledExpanded : internal;\r\n\r\n // \"Travado\" aberto (via toggle) vs \"hover\" aberto (temporário)\r\n const [lockedOpen, setLockedOpen] = useState(defaultExpanded);\r\n const [hoverOpen, setHoverOpen] = useState(false);\r\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n // Suprime o hover-expand logo após colapsar manualmente — senão, com o mouse\r\n // ainda por cima, ele re-expande na hora (\"pisca e cresce de novo\").\r\n const suppressHoverRef = useRef(false);\r\n const suppressTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const setExpanded = useCallback(\r\n (v: boolean) => {\r\n if (!isControlled) setInternal(v);\r\n onExpandedChange?.(v);\r\n },\r\n [isControlled, onExpandedChange],\r\n );\r\n\r\n // Toggle: trava/destrava a sidebar\r\n const toggle = useCallback(() => {\r\n const next = !lockedOpen;\r\n setLockedOpen(next);\r\n setHoverOpen(false);\r\n // Colapsou manualmente → bloqueia hover-expand por um instante (e até o\r\n // mouse sair) pra retrair de fato mesmo com o cursor ainda por cima.\r\n if (!next) {\r\n suppressHoverRef.current = true;\r\n if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);\r\n suppressTimerRef.current = setTimeout(() => {\r\n suppressHoverRef.current = false;\r\n }, 500);\r\n }\r\n setExpanded(next);\r\n }, [lockedOpen, setExpanded]);\r\n\r\n // Hover enter: se travada fechada, expande temporariamente\r\n const onMouseEnter = useCallback(() => {\r\n if (lockedOpen) return; // já aberta, hover desnecessário\r\n if (suppressHoverRef.current) return; // recém-colapsada: ignora o hover\r\n if (hoverTimeoutRef.current) {\r\n clearTimeout(hoverTimeoutRef.current);\r\n hoverTimeoutRef.current = null;\r\n }\r\n setHoverOpen(true);\r\n setExpanded(true);\r\n }, [lockedOpen, setExpanded]);\r\n\r\n // Hover leave: se expandida por hover, recolhe após breve delay\r\n const onMouseLeave = useCallback(() => {\r\n if (lockedOpen) return; // travada aberta, não recolhe\r\n hoverTimeoutRef.current = setTimeout(() => {\r\n setHoverOpen(false);\r\n setExpanded(false);\r\n }, 200);\r\n }, [lockedOpen, setExpanded]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (hoverTimeoutRef.current) clearTimeout(hoverTimeoutRef.current);\r\n if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);\r\n };\r\n }, []);\r\n\r\n const isHoverExpand = hoverOpen && !lockedOpen;\r\n\r\n // Accordion: apenas 1 categoria aberta por vez\r\n const [openCategoryId, setOpenCategoryId] = useState<string | null>(null);\r\n\r\n return {\r\n expanded,\r\n isHoverExpand,\r\n toggle,\r\n onMouseEnter,\r\n onMouseLeave,\r\n openCategoryId,\r\n setOpenCategoryId,\r\n };\r\n}\r\n","import { tv } from \"@/utils/tv\";\r\n\r\n/* ══════════════════════════════════════════════════════════════════════════\r\n SingleMenuSidebar — estilos (tv() + objeto estático)\r\n\r\n 100% tokens do DS. Sem palette própria, sem hardcode de cor.\r\n Valores literais `[Npx]` remanescentes são alinhamento fino calibrado\r\n (logo, indent do sub-item, faixa de seleção 3px, largura do container) —\r\n exceção visual válida (L-014), não há token DS equivalente.\r\n ══════════════════════════════════════════════════════════════════════════ */\r\n\r\n/* ── Container: DUAS caixas, e a separação é o ponto ────────────────────────\r\n\r\n `sidebarRoot` é a caixa que ocupa espaço no FLUXO (o flex row do AppShell).\r\n `sidebarPanel` é a caixa VISUAL — bg, borda, o conteúdo, a animação de largura.\r\n\r\n Por que separar. Antes havia uma caixa só, com `transition-[width]` no próprio\r\n root: expandir por hover animava a largura DENTRO do fluxo, então o conteúdo ao\r\n lado (a tabela) era empurrado e re-diagramado a cada frame. Medido em 2026-08-19\r\n no `#/usinas`: 5 recálculos completos de largura de coluna por gesto, travada de\r\n ~100ms e **CLS 0,117** — 7 layout shifts na janela da animação.\r\n\r\n O `MenuSidebar` nunca teve isso porque o painel dele é `absolute` sobre o\r\n conteúdo (`sidebar.styles.ts:177` — `absolute left-[64px] top-0 h-full z-40`).\r\n Aqui aplicamos o mesmo, mas SÓ no peek por hover:\r\n\r\n recolhida → fluxo 80px · painel 80px (estático)\r\n hover (peek) → fluxo 80px · painel 280px ABSOLUTO ← passa por cima\r\n clique (travada) → fluxo 280px · painel 280px (empurra, e deve)\r\n\r\n A distinção clique-vs-hover é deliberada: o clique é decisão de layout do\r\n usuário — ele quer o menu ocupando espaço. O hover é espiada, e quem está com o\r\n menu recolhido escolheu maximizar a área de conteúdo. ── */\r\n\r\nexport const sidebarRoot = tv({\r\n base: \"relative h-full shrink-0\",\r\n variants: {\r\n // Largura NO FLUXO. `rail` cobre recolhida E peek por hover — é isso que\r\n // impede o conteúdo ao lado de se mexer durante a espiada.\r\n flowWidth: {\r\n rail: \"hidden md:block md:w-20\",\r\n full: \"w-full md:w-[280px]\",\r\n },\r\n },\r\n defaultVariants: {\r\n flowWidth: \"full\",\r\n },\r\n});\r\n\r\nexport const sidebarPanel = tv({\r\n base: [\r\n \"flex h-full flex-col overflow-x-hidden\",\r\n \"border-r border-border-sidebar bg-bg-sidebar\",\r\n \"transition-[width] duration-300 ease-in-out\",\r\n ],\r\n variants: {\r\n /**\r\n * `overlay` segue o estado TRAVADO, não o hover — e isso é o que evita um\r\n * defeito medido.\r\n *\r\n * A 1ª versão ligava `overlay` ao `isHoverExpand`. Ao sair do hover, o\r\n * `position` voltava a `static` **antes** de a largura terminar de animar:\r\n * aferido, aos +400ms o painel estava `static` com **279px** dentro de um\r\n * `<aside>` de 80px, sem `z-index` — grande, no fluxo e passível de ser\r\n * pintado atrás do conteúdo por ~300ms.\r\n *\r\n * Amarrando ao travado, o `position` **nunca troca durante a animação**:\r\n * fora do estado travado o painel é sempre absoluto, e só a largura anima.\r\n *\r\n * `md:` em tudo porque overlay é comportamento de DESKTOP — abaixo de md a\r\n * sidebar é drawer de largura cheia e não existe hover em touch.\r\n */\r\n overlay: {\r\n true: \"md:absolute md:inset-y-0 md:left-0 md:z-40\",\r\n false: \"\",\r\n },\r\n /** Largura VISUAL — independente da que o `<aside>` ocupa no fluxo. */\r\n visualWidth: {\r\n rail: \"w-full md:w-20\",\r\n full: \"w-full md:w-[280px]\",\r\n },\r\n },\r\n compoundVariants: [\r\n // Sombra só na espiada: é ela que indica \"isto está flutuando sobre o\r\n // conteúdo\". Recolhida, o painel também é absoluto (pra não trocar de\r\n // `position` no meio da animação), mas ali ele coincide com o rail e uma\r\n // sombra seria ruído.\r\n { overlay: true, visualWidth: \"full\", class: \"md:shadow-sh-lg\" },\r\n ],\r\n defaultVariants: {\r\n overlay: false,\r\n visualWidth: \"full\",\r\n },\r\n});\r\n\r\n// ── Categoria (botão + texto/ícone/chevron por estado) ──\r\nexport const category = tv({\r\n slots: {\r\n root: \"flex items-center rounded-radius-lg cursor-pointer transition-all\",\r\n text: \"flex-1 text-left text-body-sm whitespace-nowrap overflow-hidden text-ellipsis\",\r\n // SVG do consumidor (ícone bare do lucide vem 24px) dimensionado no slot → 18px\r\n icon: \"grid size-[18px] shrink-0 place-items-center [&>svg]:size-[18px]\",\r\n chevron: \"size-icon-sm shrink-0 transition-transform\",\r\n },\r\n variants: {\r\n // selected = folha ativa OU pai que contém o item ativo → card cheio\r\n // default = nada marcado (inclui pai apenas aberto, sem filho ativo)\r\n state: {\r\n selected: {\r\n root: \"bg-bg-sidebar-accent shadow-sh-sm\",\r\n text: \"font-bold text-fg-brand\",\r\n icon: \"text-fg-brand\",\r\n chevron: \"text-fg-brand\",\r\n },\r\n default: {\r\n root: \"hover:bg-bg-sidebar-accent\",\r\n text: \"font-medium text-fg-default\",\r\n icon: \"text-fg-muted\",\r\n chevron: \"text-fg-subtle\",\r\n },\r\n },\r\n collapsed: {\r\n true: { root: \"justify-center px-0 size-form-xl\" },\r\n false: { root: \"w-full gap-gp-lg px-pad-2xl py-pad-xl\" },\r\n },\r\n },\r\n defaultVariants: {\r\n state: \"default\",\r\n collapsed: false,\r\n },\r\n});\r\n\r\n// ── Sub-item (item de menu dentro de uma categoria) ──\r\nexport const menuItem = tv({\r\n slots: {\r\n root: \"flex h-[38px] items-center gap-[18px] pl-[18px] pr-pad-2xl cursor-pointer transition-colors hover:bg-bg-sidebar-accent\",\r\n border: \"h-full w-0 shrink-0\",\r\n text: \"text-body-sm text-left\",\r\n },\r\n variants: {\r\n selected: {\r\n true: {\r\n border: \"border-l-[3px] border-border-brand\",\r\n text: \"font-semibold text-fg-default\",\r\n },\r\n false: {\r\n border: \"border-l border-border-subtle\",\r\n text: \"font-medium text-fg-muted\",\r\n },\r\n },\r\n },\r\n defaultVariants: {\r\n selected: false,\r\n },\r\n});\r\n\r\n// ── Estilos estáticos (sem variante) ──\r\nexport const styles = {\r\n // Header\r\n header: {\r\n wrapper:\r\n \"flex h-layout-navbar items-center overflow-hidden px-pad-4xl py-pad-md shrink-0\",\r\n wrapperCollapsed: \"justify-center px-0\",\r\n inner: \"flex items-center gap-gp-md\",\r\n logo: \"shrink-0\",\r\n title: \"text-title-sm font-bold text-fg-default whitespace-nowrap\",\r\n collapseBtn:\r\n \"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\",\r\n expandBtn:\r\n \"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\",\r\n expandBtnIcon: \"size-icon-sm\",\r\n },\r\n\r\n // Module selector\r\n module: {\r\n trigger:\r\n \"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\",\r\n iconContainer:\r\n \"flex size-icon-xl shrink-0 items-center justify-center rounded-radius-md bg-bg-brand text-fg-on-brand\",\r\n textContainer: \"flex flex-col items-start gap-gp-xs overflow-hidden\",\r\n title:\r\n \"text-body-md font-bold leading-4 text-fg-default truncate text-left\",\r\n subtitle: \"text-caption-sm font-semibold text-fg-subtle text-left\",\r\n chevron: \"ml-auto shrink-0 size-icon-sm text-fg-subtle\",\r\n dropdownItem: \"flex items-center gap-gp-lg cursor-pointer\",\r\n // selecionado: realça a linha (bg-brand-subtle) + label/check em fg-brand\r\n dropdownItemSelected: \"bg-bg-brand-subtle text-fg-brand\",\r\n // [&>svg]:!text-fg-on-brand: o DropdownMenuItem força [&_svg]:text-fg-muted\r\n // (+ fg-default no hover) em TODOS os svgs descendentes — o ! garante que o\r\n // ícone do chip siga fg-on-brand igual ao trigger (branco light / preto dark).\r\n dropdownItemIcon:\r\n \"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\",\r\n dropdownItemLabel: \"flex-1 text-body-md font-medium\",\r\n dropdownItemCheck: \"ml-auto shrink-0 size-icon-sm !text-fg-brand\",\r\n },\r\n\r\n // Search\r\n search: {\r\n wrapper:\r\n \"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\",\r\n inner:\r\n \"flex flex-1 items-center gap-gp-md opacity-60 focus-within:opacity-100\",\r\n icon: \"shrink-0 size-icon-sm text-fg-muted\",\r\n text: \"text-body-sm font-medium text-fg-default placeholder:text-fg-subtle\",\r\n shortcutBadge:\r\n \"shrink-0 flex items-center justify-center rounded-radius-md bg-bg-surface px-pad-md py-pad-xs shadow-sh-sm\",\r\n shortcutText: \"text-body-sm font-medium text-fg-muted\",\r\n },\r\n\r\n // Footer\r\n footer: {\r\n wrapper: \"px-pad-lg py-pad-xl\",\r\n button:\r\n \"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\",\r\n avatar:\r\n \"flex size-form-sm shrink-0 items-center justify-center rounded-radius-full bg-bg-muted overflow-hidden\",\r\n avatarIcon: \"shrink-0 size-icon-sm text-fg-muted\",\r\n textContainer: \"flex flex-col items-start gap-gp-2xs overflow-hidden\",\r\n name: \"text-body-sm font-semibold text-fg-default truncate w-full text-left\",\r\n email:\r\n \"text-caption-sm font-medium text-fg-muted truncate w-full text-left\",\r\n chevron: \"ml-auto shrink-0 size-icon-sm text-fg-subtle\",\r\n dropdownLabel:\r\n \"flex flex-col gap-gp-2xs px-pad-sm py-pad-xs normal-case tracking-normal\",\r\n dropdownLabelName: \"text-body-md font-semibold\",\r\n dropdownLabelEmail: \"text-caption-md font-normal text-fg-muted\",\r\n dropdownItem: \"flex items-center gap-gp-md cursor-pointer\",\r\n dropdownItemIcon: \"size-icon-sm shrink-0\",\r\n },\r\n\r\n // Layout\r\n // Fade do conteúdo textual durante a transição de largura (evita wrap visível)\r\n textFadeIn: \"animate-in fade-in-0 duration-200\",\r\n divider: \"mx-pad-3xl h-px bg-border-sidebar\",\r\n sectionPadding:\r\n \"flex flex-col gap-gp-2xl px-pad-3xl py-pad-4xl shrink-0 overflow-hidden\",\r\n navContainer:\r\n \"scrollbar-thin flex flex-1 flex-col overflow-y-auto overflow-x-hidden py-pad-4xl\",\r\n navContainerExpanded: \"px-pad-3xl\",\r\n navContainerCollapsed: \"items-center\",\r\n navList: \"flex flex-col\",\r\n subItemList: \"flex flex-col py-pad-lg\",\r\n} as const;\r\n","\"use client\";\r\n\r\nimport { PanelLeftClose } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { SidebarBrandMark } from \"@/components/ui/MenuSidebar/sidebar-brand\";\r\nimport { useSingleMenuSidebar } from \"./use-single-menu-sidebar\";\r\nimport { styles } from \"./single-menu-sidebar.styles\";\r\nimport type { SingleMenuHeaderProps } from \"./single-menu-sidebar.types\";\r\n\r\nexport function SingleMenuHeader({\r\n logo,\r\n title,\r\n showToggleIndicator = false,\r\n}: SingleMenuHeaderProps) {\r\n const { expanded, isHoverExpand, toggle } = useSingleMenuSidebar();\r\n\r\n // Ícone invertido = sidebar foi recolhida manualmente (toggle).\r\n // Permanece invertido mesmo quando o hover expande temporariamente.\r\n const isFlipped = isHoverExpand || !expanded;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n styles.header.wrapper,\r\n !expanded && styles.header.wrapperCollapsed,\r\n )}\r\n >\r\n <div className={styles.header.inner}>\r\n {/* Sem `logo` explícito, a marca iGreen entra sozinha (ver `SidebarBrandMark`).\r\n É o mesmo contrato do `brand` do MenuSidebar — antes só esta sidebar cobrava. */}\r\n <div className={styles.header.logo}>{logo ?? <SidebarBrandMark />}</div>\r\n {expanded && (\r\n <span className={cn(styles.header.title, styles.textFadeIn)}>\r\n {title}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {expanded ? (\r\n <button\r\n type=\"button\"\r\n onClick={toggle}\r\n className={styles.header.collapseBtn}\r\n aria-label={isFlipped ? \"Expandir sidebar\" : \"Recolher sidebar\"}\r\n >\r\n <PanelLeftClose\r\n className={cn(\r\n \"size-icon-sm transition-transform duration-300\",\r\n isFlipped && \"rotate-180\",\r\n )}\r\n />\r\n </button>\r\n ) : showToggleIndicator ? (\r\n <button\r\n type=\"button\"\r\n onClick={toggle}\r\n className={styles.header.expandBtn}\r\n aria-label=\"Expandir sidebar\"\r\n >\r\n <PanelLeftClose\r\n className={cn(\r\n styles.header.expandBtnIcon,\r\n \"transition-transform duration-300 rotate-180\",\r\n )}\r\n />\r\n </button>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nSingleMenuHeader.displayName = \"SingleMenuHeader\";\r\n","\"use client\";\r\n\r\nimport { Check, ChevronsUpDown } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n} from \"@/components/shadcn/dropdown-menu\";\r\nimport { styles } from \"./single-menu-sidebar.styles\";\r\nimport type { SingleMenuModuleSelectorProps } from \"./single-menu-sidebar.types\";\r\n\r\nexport function SingleMenuModuleSelector({\r\n icon,\r\n title,\r\n subtitle,\r\n options,\r\n onModuleChange,\r\n}: SingleMenuModuleSelectorProps) {\r\n const s = styles.module;\r\n\r\n const triggerContent = (\r\n <>\r\n <div className={s.iconContainer}>{icon}</div>\r\n <div className={s.textContainer}>\r\n <span className={s.title}>{title}</span>\r\n <span className={s.subtitle}>{subtitle}</span>\r\n </div>\r\n <ChevronsUpDown className={s.chevron} />\r\n </>\r\n );\r\n\r\n // Sem opções: somente display (sem dropdown)\r\n if (!options || options.length === 0) {\r\n return <div className={s.trigger}>{triggerContent}</div>;\r\n }\r\n\r\n // Com opções: dropdown para trocar de módulo\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger className={s.trigger}>\r\n {triggerContent}\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent side=\"bottom\" sideOffset={4} align=\"start\">\r\n {options.map((option) => {\r\n // módulo atual = o que está exibido no trigger (title)\r\n const isSelected = option.label === title;\r\n return (\r\n <DropdownMenuItem\r\n key={option.id}\r\n className={cn(\r\n s.dropdownItem,\r\n isSelected && s.dropdownItemSelected,\r\n )}\r\n onClick={() => onModuleChange?.(option.id)}\r\n >\r\n <div className={s.dropdownItemIcon}>{option.icon}</div>\r\n <span className={s.dropdownItemLabel}>{option.label}</span>\r\n {isSelected && <Check className={s.dropdownItemCheck} />}\r\n </DropdownMenuItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\nSingleMenuModuleSelector.displayName = \"SingleMenuModuleSelector\";\r\n","\"use client\";\r\n\r\nimport { Search } from \"lucide-react\";\r\nimport { styles } from \"./single-menu-sidebar.styles\";\r\n\r\ninterface SingleMenuSearchTriggerProps {\r\n placeholder?: string;\r\n /** Abre a paleta de busca (Command) */\r\n onOpen: () => void;\r\n}\r\n\r\n/**\r\n * Campo de busca — na verdade um trigger que abre o CommandDialog.\r\n * O input \"real\" + filtragem ficam no Command.\r\n */\r\nexport function SingleMenuSearch({\r\n placeholder = \"Buscar\",\r\n onOpen,\r\n}: SingleMenuSearchTriggerProps) {\r\n const s = styles.search;\r\n\r\n return (\r\n <button type=\"button\" onClick={onOpen} className={s.wrapper}>\r\n <div className={s.inner}>\r\n <Search className={s.icon} />\r\n <span className={s.text}>{placeholder}</span>\r\n </div>\r\n <div className={s.shortcutBadge}>\r\n <span className={s.shortcutText}>⌘K</span>\r\n </div>\r\n </button>\r\n );\r\n}\r\n\r\nSingleMenuSearch.displayName = \"SingleMenuSearch\";\r\n","\"use client\";\r\n\r\nimport type { ReactNode } from \"react\";\r\nimport {\r\n CommandDialog,\r\n CommandInput,\r\n CommandList,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandItem,\r\n} from \"@/components/shadcn/command\";\r\nimport type { SingleMenuCategory } from \"./single-menu-sidebar.types\";\r\n\r\ninterface SingleMenuCommandProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n categories: SingleMenuCategory[];\r\n placeholder?: string;\r\n /** Seleciona um item de menu (folha ou sub-item) */\r\n onSelect: (id: string, parentId?: string) => void;\r\n /** Conteúdo customizado (substitui a lista padrão derivada das categorias) */\r\n custom?: ReactNode;\r\n}\r\n\r\n/**\r\n * Paleta de busca (Command) acionada pelo campo de busca da sidebar.\r\n * Por padrão lista os menus (categorias-folha + sub-itens agrupados);\r\n * `custom` substitui a lista padrão.\r\n */\r\nexport function SingleMenuCommand({\r\n open,\r\n onOpenChange,\r\n categories,\r\n placeholder = \"Buscar no menu…\",\r\n onSelect,\r\n custom,\r\n}: SingleMenuCommandProps) {\r\n const leaves = categories.filter((c) => !c.items?.length);\r\n const groups = categories.filter((c) => c.items?.length);\r\n\r\n const handle = (id: string, parentId?: string) => {\r\n onSelect(id, parentId);\r\n onOpenChange(false);\r\n };\r\n\r\n return (\r\n <CommandDialog open={open} onOpenChange={onOpenChange}>\r\n <CommandInput placeholder={placeholder} />\r\n <CommandList>\r\n <CommandEmpty>Nenhum resultado.</CommandEmpty>\r\n\r\n {custom ?? (\r\n <>\r\n {leaves.length > 0 && (\r\n <CommandGroup heading=\"Menu\">\r\n {leaves.map((c) => (\r\n <CommandItem\r\n key={c.id}\r\n value={c.label}\r\n onSelect={() => handle(c.id)}\r\n >\r\n {c.icon}\r\n <span>{c.label}</span>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n )}\r\n\r\n {groups.map((cat) => (\r\n <CommandGroup key={cat.id} heading={cat.label}>\r\n {cat.items!.map((item) => (\r\n <CommandItem\r\n key={item.id}\r\n value={`${cat.label} ${item.label}`}\r\n onSelect={() => handle(item.id, cat.id)}\r\n >\r\n <span>{item.label}</span>\r\n </CommandItem>\r\n ))}\r\n </CommandGroup>\r\n ))}\r\n </>\r\n )}\r\n </CommandList>\r\n </CommandDialog>\r\n );\r\n}\r\n\r\nSingleMenuCommand.displayName = \"SingleMenuCommand\";\r\n","\"use client\";\r\n\r\nimport type { MouseEvent } from \"react\";\r\nimport { shouldPreventNavigation } from \"@/utils/nav-link\";\r\nimport { menuItem } from \"./single-menu-sidebar.styles\";\r\nimport type { SingleMenuItemProps } from \"./single-menu-sidebar.types\";\r\n\r\n/**\r\n * Item de menu do `SingleMenuSidebar`.\r\n *\r\n * ## O defeito que isto corrige (medido em 2026-08-18)\r\n *\r\n * Até aqui este componente renderizava **sempre** `<button type=\"button\" onClick>` — e o\r\n * tipo `SingleMenuSubItem` declarava `href?: string`, e o `USAGE.md` documentava\r\n * `{ id, label, href? }`. Ou seja: o consumidor declarava o destino, o TypeScript aceitava,\r\n * e **nada lia**. `href` era prop morta.\r\n *\r\n * O que se perdia com isso — tudo silenciosamente, sem erro nenhum:\r\n *\r\n * · ctrl/cmd+clique e botão do meio não abriam em nova aba\r\n * · \"copiar endereço do link\" não existia no menu de contexto\r\n * · leitor de tela anunciava \"botão\", não \"link\"\r\n * · nenhum router do consumidor podia ser integrado\r\n *\r\n * ⚠️ **Não era o mesmo defeito do `MenuSidebar`.** Lá o `<a href>` existia e navegava\r\n * nativamente **junto** do handler, recarregando a página inteira a cada clique. Aqui o\r\n * problema é o oposto: não havia `<a>` nenhum. O conserto, porém, usa a mesma regra —\r\n * `@/utils/nav-link`, movido pra util compartilhada nesta mesma mudança justamente pra\r\n * não haver duas cópias divergindo (e pra o `single-menu-sidebar` não precisar depender\r\n * do item de registry do `menu-sidebar` inteiro só pra reaproveitar 60 linhas puras).\r\n */\r\nexport function SingleMenuItem({\r\n label,\r\n selected = false,\r\n href,\r\n target,\r\n onClick,\r\n renderLink,\r\n interceptNavigation,\r\n}: SingleMenuItemProps) {\r\n const s = menuItem({ selected });\r\n\r\n const content = (\r\n <>\r\n <div className={s.border()} />\r\n <span className={s.text()}>{label}</span>\r\n </>\r\n );\r\n\r\n const handleClick = (e: MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => {\r\n // Só cancela a navegação nativa quando o consumidor claramente trata o clique — e\r\n // nunca em clique modificado, `target=\"_blank\"`, link externo ou href de HASH. As 5\r\n // exceções e o porquê de cada uma estão em `@/utils/nav-link`.\r\n //\r\n // Não corre quando há `renderLink`: aí quem decide é o `<Link>` do router.\r\n if (!renderLink) {\r\n const prevent = shouldPreventNavigation({\r\n href,\r\n hasHandler: interceptNavigation ?? !!onClick,\r\n target,\r\n event: e as MouseEvent<HTMLAnchorElement>,\r\n });\r\n if (prevent) e.preventDefault();\r\n }\r\n onClick?.(e);\r\n };\r\n\r\n if (href) {\r\n const linkProps = {\r\n href,\r\n target,\r\n className: s.root(),\r\n onClick: handleClick as (e: MouseEvent<HTMLAnchorElement>) => void,\r\n \"aria-current\": selected ? (\"page\" as const) : undefined,\r\n children: content,\r\n };\r\n\r\n // `renderLink` é render-prop, não `linkComponent`: um componente escrito inline\r\n // remonta a subárvore a cada render do pai (L-068).\r\n if (renderLink) return <>{renderLink(linkProps)}</>;\r\n\r\n return <a {...linkProps} />;\r\n }\r\n\r\n return (\r\n <button type=\"button\" onClick={handleClick} className={s.root()}>\r\n {content}\r\n </button>\r\n );\r\n}\r\n\r\nSingleMenuItem.displayName = \"SingleMenuItem\";\r\n","\"use client\";\r\n\r\nimport type { MouseEvent } from \"react\";\r\nimport { ChevronDown } from \"lucide-react\";\r\nimport { shouldPreventNavigation } from \"@/utils/nav-link\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n Collapsible,\r\n CollapsibleTrigger,\r\n CollapsibleContent,\r\n} from \"@/components/shadcn/collapsible\";\r\nimport {\r\n Tooltip,\r\n TooltipTrigger,\r\n TooltipContent,\r\n} from \"@/components/shadcn/tooltip\";\r\nimport { useSingleMenuSidebar } from \"./use-single-menu-sidebar\";\r\nimport { category, styles } from \"./single-menu-sidebar.styles\";\r\nimport { SingleMenuItem } from \"./menu-item\";\r\nimport type { SingleMenuCategoryProps } from \"./single-menu-sidebar.types\";\r\n\r\nexport function SingleMenuCategory({\r\n id,\r\n icon,\r\n label,\r\n active = false,\r\n items,\r\n activeItemId,\r\n onItemClick,\r\n onCategoryClick,\r\n href,\r\n renderLink,\r\n}: SingleMenuCategoryProps) {\r\n const { expanded, openCategoryId, setOpenCategoryId } =\r\n useSingleMenuSidebar();\r\n const hasItems = !!items && items.length > 0;\r\n\r\n // Accordion: esta categoria abre só se for a selecionada\r\n const isOpen = hasItems ? openCategoryId === id : false;\r\n\r\n // Marcação com fonte única — sempre 1 item marcado:\r\n // • Pai aberto É o marcado (abrir = marcar; suprime a folha enquanto aberto).\r\n // • Folha marcada quando é a ativa E nenhum pai está aberto.\r\n // No rail (recolhido) não há expansão → o pai marca quando CONTÉM o ativo.\r\n const isLeafActive =\r\n !hasItems && (activeItemId !== undefined ? activeItemId === id : !!active);\r\n const containsActive =\r\n hasItems && items!.some((item) => item.id === activeItemId);\r\n\r\n const selected = !expanded\r\n ? hasItems\r\n ? isOpen || containsActive\r\n : isLeafActive\r\n : hasItems\r\n ? isOpen\r\n : isLeafActive && openCategoryId == null;\r\n\r\n const state = selected ? \"selected\" : \"default\";\r\n\r\n const s = category({ state, collapsed: !expanded });\r\n\r\n const handleToggle = () => {\r\n if (hasItems) {\r\n // Pai: alterna o accordion — abrir vira o marcado (suprime a folha)\r\n setOpenCategoryId(isOpen ? null : id);\r\n onCategoryClick?.();\r\n } else {\r\n // Folha: vira a seleção e fecha qualquer pai aberto (assume a marca)\r\n onItemClick?.(id);\r\n setOpenCategoryId(null);\r\n onCategoryClick?.();\r\n }\r\n };\r\n\r\n // Sidebar recolhida: só ícone com tooltip, centralizado\r\n if (!expanded) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={handleToggle}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n handleToggle();\r\n }\r\n }}\r\n className={s.root()}\r\n >\r\n <span className={s.icon()}>{icon}</span>\r\n </TooltipTrigger>\r\n <TooltipContent side=\"right\" sideOffset={8}>\r\n {label}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n }\r\n\r\n // Sem sub-itens: é link simples (o que o USAGE.md sempre prometeu) quando tem `href`,\r\n // e botão quando não tem. Até 2026-08-18 era SEMPRE botão, e o `href` da categoria era\r\n // prop morta igual à do sub-item.\r\n if (!hasItems) {\r\n const conteudo = (\r\n <>\r\n <span className={s.icon()}>{icon}</span>\r\n <span className={cn(s.text(), styles.textFadeIn)}>{label}</span>\r\n </>\r\n );\r\n\r\n if (href) {\r\n const linkProps = {\r\n href,\r\n className: s.root(),\r\n onClick: (e: MouseEvent<HTMLAnchorElement>) => {\r\n // `hasHandler: true` porque o `handleToggle` abaixo SEMPRE trata o clique\r\n // (é como a categoria assume a marcação). As 5 exceções seguem valendo:\r\n // clique modificado, target, href externo e href de hash não são cancelados.\r\n if (!renderLink) {\r\n const prevent = shouldPreventNavigation({ href, hasHandler: true, event: e });\r\n if (prevent) e.preventDefault();\r\n }\r\n handleToggle();\r\n },\r\n \"aria-current\": selected ? (\"page\" as const) : undefined,\r\n children: conteudo,\r\n };\r\n if (renderLink) return <>{renderLink(linkProps)}</>;\r\n return <a {...linkProps} />;\r\n }\r\n\r\n return (\r\n <button type=\"button\" onClick={handleToggle} className={s.root()}>\r\n {conteudo}\r\n </button>\r\n );\r\n }\r\n\r\n // Com sub-itens: collapsible controlado pelo accordion\r\n return (\r\n <Collapsible\r\n open={isOpen}\r\n onOpenChange={(open) => {\r\n setOpenCategoryId(open ? id : null);\r\n onCategoryClick?.();\r\n }}\r\n >\r\n <CollapsibleTrigger className={s.root()}>\r\n <span className={s.icon()}>{icon}</span>\r\n <span className={cn(s.text(), styles.textFadeIn)}>{label}</span>\r\n <ChevronDown className={cn(s.chevron(), isOpen && \"rotate-180\")} />\r\n </CollapsibleTrigger>\r\n <CollapsibleContent>\r\n <div className={styles.subItemList}>\r\n {items!.map((item) => (\r\n <SingleMenuItem\r\n key={item.id}\r\n label={item.label}\r\n selected={item.id === activeItemId}\r\n href={item.href}\r\n renderLink={renderLink}\r\n // O container SEMPRE passa onClick (mantém a marcação), então inferir\r\n // por \"tem handler\" cancelaria a navegação de quem não passou nada.\r\n interceptNavigation={!!onItemClick}\r\n onClick={() => onItemClick?.(item.id)}\r\n />\r\n ))}\r\n </div>\r\n </CollapsibleContent>\r\n </Collapsible>\r\n );\r\n}\r\n\r\nSingleMenuCategory.displayName = \"SingleMenuCategory\";\r\n","\"use client\";\r\n\r\nimport { ChevronsUpDown, User } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuGroup,\r\n DropdownMenuLabel,\r\n} from \"@/components/shadcn/dropdown-menu\";\r\nimport { useSingleMenuSidebar } from \"./use-single-menu-sidebar\";\r\nimport { styles } from \"./single-menu-sidebar.styles\";\r\nimport type { SingleMenuFooterProps } from \"./single-menu-sidebar.types\";\r\n\r\nexport function SingleMenuFooter({\r\n name,\r\n email,\r\n avatar,\r\n actions,\r\n onAction,\r\n}: SingleMenuFooterProps) {\r\n const { expanded } = useSingleMenuSidebar();\r\n const s = styles.footer;\r\n\r\n const triggerContent = (\r\n <>\r\n <div className={s.avatar}>\r\n {avatar ?? <User className={s.avatarIcon} />}\r\n </div>\r\n {expanded && (\r\n <>\r\n <div className={s.textContainer}>\r\n <span className={s.name}>{name}</span>\r\n <span className={s.email}>{email}</span>\r\n </div>\r\n <ChevronsUpDown className={s.chevron} />\r\n </>\r\n )}\r\n </>\r\n );\r\n\r\n // Sem ações: somente display (sem dropdown)\r\n if (!actions || actions.length === 0) {\r\n return (\r\n <div className={s.wrapper}>\r\n <div className={cn(s.button, !expanded && \"justify-center px-0\")}>\r\n {triggerContent}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Com ações: dropdown do usuário\r\n return (\r\n <div className={s.wrapper}>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger\r\n className={cn(s.button, !expanded && \"justify-center px-0\")}\r\n >\r\n {triggerContent}\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent\r\n side={expanded ? \"top\" : \"right\"}\r\n sideOffset={8}\r\n align={expanded ? \"end\" : \"start\"}\r\n >\r\n <DropdownMenuGroup>\r\n <DropdownMenuLabel className={s.dropdownLabel}>\r\n <span className={s.dropdownLabelName}>{name}</span>\r\n <span className={s.dropdownLabelEmail}>{email}</span>\r\n </DropdownMenuLabel>\r\n </DropdownMenuGroup>\r\n <DropdownMenuSeparator />\r\n {actions.map((action) => (\r\n <DropdownMenuItem\r\n key={action.id}\r\n variant={\r\n action.variant === \"destructive\" ? \"destructive\" : \"default\"\r\n }\r\n onClick={() => onAction?.(action.id)}\r\n className={s.dropdownItem}\r\n >\r\n {action.icon && (\r\n <span className={s.dropdownItemIcon}>{action.icon}</span>\r\n )}\r\n <span>{action.label}</span>\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n );\r\n}\r\n\r\nSingleMenuFooter.displayName = \"SingleMenuFooter\";\r\n","\"use client\";\r\n\r\nimport { useEffect, useMemo, useState } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { TooltipProvider } from \"@/components/shadcn/tooltip\";\r\nimport {\r\n SingleMenuSidebarContext,\r\n useSingleMenuSidebarState,\r\n} from \"./use-single-menu-sidebar\";\r\nimport { sidebarRoot, sidebarPanel, styles } from \"./single-menu-sidebar.styles\";\r\nimport { SingleMenuHeader } from \"./header\";\r\nimport { SingleMenuModuleSelector } from \"./module-selector\";\r\nimport { SingleMenuSearch } from \"./search\";\r\nimport { SingleMenuCommand } from \"./command\";\r\nimport { SingleMenuCategory } from \"./category\";\r\nimport { SingleMenuFooter } from \"./footer\";\r\nimport type {\r\n SingleMenuModule,\r\n SingleMenuSidebarProps,\r\n} from \"./single-menu-sidebar.types\";\r\n\r\n/* ══════════════════════════════════════════════════════════════════════════\r\n SingleMenuSidebar — Container (view only, sem business logic)\r\n\r\n Sidebar de navegação de nível único: categoria → sub-itens em accordion.\r\n Recebe `categories` + `activeItemId` + callbacks via props. Zero fetch,\r\n zero store. Alternativa enxuta ao MenuSidebar (sem variantes).\r\n\r\n Comportamentos:\r\n - Toggle trava/destrava o expandido; recolhida, hover expande temporariamente\r\n - 1 categoria aberta por vez (accordion); seleção única\r\n - `modules`: cada módulo tem seu próprio menu — trocar atualiza tudo\r\n - Busca abre uma paleta (Command) com os itens do menu (⌘K)\r\n - Mobile (< md): expandida = 100% width; recolhida = some\r\n ══════════════════════════════════════════════════════════════════════════ */\r\n\r\nexport function SingleMenuSidebar({\r\n logo,\r\n title,\r\n module,\r\n modules,\r\n activeModuleId,\r\n defaultModuleId,\r\n onModuleChange,\r\n showSearch = true,\r\n searchPlaceholder,\r\n searchCommand,\r\n categories,\r\n activeItemId,\r\n onItemClick,\r\n renderLink,\r\n user,\r\n defaultExpanded = true,\r\n expanded: controlledExpanded,\r\n onExpandedChange,\r\n showToggleIndicator = false,\r\n className,\r\n ...props\r\n}: SingleMenuSidebarProps) {\r\n const {\r\n expanded,\r\n isHoverExpand,\r\n toggle,\r\n onMouseEnter,\r\n onMouseLeave,\r\n openCategoryId,\r\n setOpenCategoryId,\r\n } = useSingleMenuSidebarState(\r\n defaultExpanded,\r\n controlledExpanded,\r\n onExpandedChange,\r\n );\r\n\r\n // ── Módulos (opcional): cada um com seu próprio menu ──\r\n const hasModules = !!modules && modules.length > 0;\r\n const [internalModuleId, setInternalModuleId] = useState(\r\n defaultModuleId ?? modules?.[0]?.id,\r\n );\r\n const currentModuleId = activeModuleId ?? internalModuleId;\r\n const activeModule = hasModules\r\n ? (modules!.find((m) => m.id === currentModuleId) ?? modules![0])\r\n : undefined;\r\n\r\n const handleModuleChange = (id: string) => {\r\n if (activeModuleId === undefined) setInternalModuleId(id);\r\n onModuleChange?.(id);\r\n };\r\n\r\n // Display do seletor + categorias efetivas dependem do modo (modules vs simples)\r\n const moduleDisplay: SingleMenuModule | undefined = hasModules\r\n ? {\r\n icon: activeModule!.icon,\r\n title: activeModule!.title,\r\n subtitle: activeModule!.subtitle ?? \"\",\r\n options: modules!.map((m) => ({\r\n id: m.id,\r\n label: m.title,\r\n icon: m.icon,\r\n })),\r\n onModuleChange: handleModuleChange,\r\n }\r\n : module;\r\n\r\n const effectiveCategories = hasModules\r\n ? activeModule!.categories\r\n : (categories ?? []);\r\n\r\n // ── Busca (Command palette) ──\r\n const [commandOpen, setCommandOpen] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!showSearch) return;\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key.toLowerCase() === \"k\" && (e.metaKey || e.ctrlKey)) {\r\n e.preventDefault();\r\n setCommandOpen((o) => !o);\r\n }\r\n };\r\n document.addEventListener(\"keydown\", onKey);\r\n return () => document.removeEventListener(\"keydown\", onKey);\r\n }, [showSearch]);\r\n\r\n const selectFromSearch = (id: string, parentId?: string) => {\r\n onItemClick?.(id);\r\n setOpenCategoryId(parentId ?? null);\r\n };\r\n\r\n // Categoria aberta — do accordion ou derivada do activeItemId\r\n const resolvedOpenCategoryId =\r\n openCategoryId ??\r\n effectiveCategories.find((cat) =>\r\n cat.items?.some((item) => item.id === activeItemId),\r\n )?.id ??\r\n null;\r\n\r\n const contextValue = useMemo(\r\n () => ({\r\n expanded,\r\n isHoverExpand,\r\n toggle,\r\n openCategoryId: resolvedOpenCategoryId,\r\n setOpenCategoryId,\r\n }),\r\n [\r\n expanded,\r\n isHoverExpand,\r\n toggle,\r\n resolvedOpenCategoryId,\r\n setOpenCategoryId,\r\n ],\r\n );\r\n\r\n /**\r\n * Travada aberta = o usuário CLICOU pra expandir. É o único estado em que a\r\n * sidebar ocupa espaço no fluxo e empurra o conteúdo — decisão dele.\r\n * Recolhida ou em espiada por hover, ela flutua sobre o conteúdo.\r\n */\r\n const travadaAberta = expanded && !isHoverExpand;\r\n\r\n return (\r\n <SingleMenuSidebarContext.Provider value={contextValue}>\r\n <TooltipProvider delayDuration={0}>\r\n <aside\r\n aria-label=\"Navegação lateral\"\r\n // A caixa de FLUXO. Fica na largura do rail quando recolhida E quando\r\n // expandida por hover — é o que impede o conteúdo ao lado de ser\r\n // empurrado durante a espiada. Só o clique (travada aberta) ocupa espaço.\r\n className={cn(sidebarRoot({ flowWidth: travadaAberta ? \"full\" : \"rail\" }), className)}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n {...props}\r\n >\r\n {/* A caixa VISUAL. Fora do estado travado ela é absoluta e cobre o\r\n conteúdo em vez de disputar espaço no flex row — e como o `position`\r\n segue o travado (não o hover), ele não muda durante a animação. */}\r\n <div\r\n className={sidebarPanel({\r\n overlay: !travadaAberta,\r\n visualWidth: expanded ? \"full\" : \"rail\",\r\n })}\r\n >\r\n <SingleMenuHeader\r\n logo={logo}\r\n title={title}\r\n showToggleIndicator={showToggleIndicator}\r\n />\r\n\r\n <div className={styles.divider} />\r\n\r\n {expanded && (moduleDisplay || showSearch) && (\r\n <div className={cn(styles.sectionPadding, styles.textFadeIn)}>\r\n {moduleDisplay && <SingleMenuModuleSelector {...moduleDisplay} />}\r\n {showSearch && (\r\n <SingleMenuSearch\r\n placeholder={searchPlaceholder}\r\n onOpen={() => setCommandOpen(true)}\r\n />\r\n )}\r\n </div>\r\n )}\r\n\r\n {expanded && <div className={styles.divider} />}\r\n\r\n <nav\r\n className={cn(\r\n styles.navContainer,\r\n expanded\r\n ? styles.navContainerExpanded\r\n : styles.navContainerCollapsed,\r\n )}\r\n >\r\n <div className={styles.navList}>\r\n {effectiveCategories.map((cat) => (\r\n <SingleMenuCategory\r\n key={cat.id}\r\n {...cat}\r\n activeItemId={activeItemId}\r\n onItemClick={onItemClick}\r\n renderLink={renderLink}\r\n />\r\n ))}\r\n </div>\r\n </nav>\r\n\r\n <SingleMenuFooter {...user} />\r\n </div>\r\n </aside>\r\n </TooltipProvider>\r\n\r\n {showSearch && (\r\n <SingleMenuCommand\r\n open={commandOpen}\r\n onOpenChange={setCommandOpen}\r\n categories={effectiveCategories}\r\n placeholder={searchPlaceholder}\r\n onSelect={selectFromSearch}\r\n custom={searchCommand}\r\n />\r\n )}\r\n </SingleMenuSidebarContext.Provider>\r\n );\r\n}\r\n\r\nSingleMenuSidebar.displayName = \"SingleMenuSidebar\";\r\n","import { LayoutGrid, LogOut, Settings, SunMoon } from \"lucide-react\";\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/shadcn/avatar\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuTrigger,\r\n} from \"@/components/shadcn/dropdown-menu\";\r\nimport type { HeaderThemeOption } from \"@/components/ui/Header\";\r\nimport type { AppShellLayoutOption, AppShellUser } from \"./app-shell.types\";\r\n\r\nexport type UserMenuProps = {\r\n user: AppShellUser;\r\n /** Layout state (radio group). Sem theme/layout escondidos automaticamente. */\r\n layout?: string;\r\n onLayoutChange?: (id: string) => void;\r\n layoutOptions?: AppShellLayoutOption[];\r\n theme?: string;\r\n onThemeChange?: (id: string) => void;\r\n themeOptions?: HeaderThemeOption[];\r\n onSettings?: () => void;\r\n onLogout?: () => void;\r\n};\r\n\r\nfunction deriveInitials(name: string): string {\r\n return name\r\n .split(\" \")\r\n .filter(Boolean)\r\n .map((p) => p[0])\r\n .join(\"\")\r\n .slice(0, 2)\r\n .toUpperCase();\r\n}\r\n\r\n/**\r\n * UserMenu — Avatar do rail do MenuSidebar com DropdownMenu.\r\n *\r\n * Conteúdo (na ordem):\r\n * 1. Header com avatar + nome + email\r\n * 2. Separator\r\n * 3. Layout radio group (se layoutOptions)\r\n * 4. Tema radio group (se themeOptions)\r\n * 5. Configurações (se onSettings)\r\n * 6. Separator\r\n * 7. Sair (se onLogout)\r\n *\r\n * Renderizado como `user={<UserMenu ...>}` na MenuSidebar.\r\n */\r\nexport function UserMenu({\r\n user,\r\n layout,\r\n onLayoutChange,\r\n layoutOptions,\r\n theme,\r\n onThemeChange,\r\n themeOptions,\r\n onSettings,\r\n onLogout,\r\n}: UserMenuProps) {\r\n const initials = user.initials ?? deriveInitials(user.name);\r\n const hasLayout = !!(layoutOptions && layoutOptions.length > 0);\r\n const hasTheme = !!(themeOptions && themeOptions.length > 0);\r\n const hasGroups = hasLayout || hasTheme || !!onSettings;\r\n\r\n const currentLayoutLabel =\r\n hasLayout && layout\r\n ? layoutOptions!.find((o) => o.id === layout)?.label\r\n : undefined;\r\n const currentThemeLabel =\r\n hasTheme && theme\r\n ? themeOptions!.find((o) => o.id === theme)?.label\r\n : undefined;\r\n\r\n return (\r\n // modal={false}: dentro do drawer mobile (overlay próprio), o modo modal do\r\n // Radix injeta um dismiss/scroll-lock que entra em corrida com o gesto de\r\n // abertura → o menu abre no pointerdown e fecha no click/pointerup do mesmo\r\n // toque (\"aparece e some\", precisa 2-3 toques). Sem modal, o dismiss por\r\n // toque-fora continua via DismissableLayer, sem a corrida.\r\n <DropdownMenu modal={false}>\r\n <DropdownMenuTrigger asChild>\r\n <button\r\n type=\"button\"\r\n aria-label={`Menu do usuário (${user.name})`}\r\n className={[\r\n \"grid place-items-center size-comp-lg rounded-full shrink-0\",\r\n \"bg-bg-brand text-fg-on-brand text-caption-sm font-bold uppercase tracking-[0.02em]\",\r\n \"cursor-pointer transition-opacity duration-150\",\r\n \"hover:opacity-90\",\r\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\r\n \"data-[state=open]:ring-4 data-[state=open]:ring-ring-secondary\",\r\n ].join(\" \")}\r\n style={user.avatarColor ? { background: user.avatarColor } : undefined}\r\n >\r\n {user.avatarSrc ? (\r\n <Avatar className=\"size-comp-lg\">\r\n <AvatarImage src={user.avatarSrc} alt={user.name} />\r\n <AvatarFallback className=\"bg-transparent text-fg-on-brand\">\r\n {initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n ) : (\r\n <span aria-hidden>{initials}</span>\r\n )}\r\n </button>\r\n </DropdownMenuTrigger>\r\n\r\n <DropdownMenuContent\r\n side=\"right\"\r\n align=\"end\"\r\n sideOffset={12}\r\n className=\"min-w-[240px]\"\r\n >\r\n {/* Header — avatar + nome + email */}\r\n <div className=\"flex items-center gap-gp-md px-pad-lg py-pad-md\">\r\n <Avatar\r\n className=\"size-comp-lg shrink-0\"\r\n style={user.avatarColor ? { background: user.avatarColor } : undefined}\r\n >\r\n {user.avatarSrc && <AvatarImage src={user.avatarSrc} alt={user.name} />}\r\n <AvatarFallback className=\"bg-bg-brand text-fg-on-brand text-body-xs font-bold uppercase\">\r\n {initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n <div className=\"flex flex-col min-w-0 flex-1\">\r\n <span className=\"text-body-sm font-medium text-fg-default truncate\">\r\n {user.name}\r\n </span>\r\n {user.email && (\r\n <span className=\"text-caption-sm text-fg-muted truncate\">\r\n {user.email}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {hasGroups && <DropdownMenuSeparator />}\r\n\r\n {/* Layout — submenu */}\r\n {hasLayout && (\r\n <DropdownMenuSub>\r\n <DropdownMenuSubTrigger>\r\n <LayoutGrid />\r\n <span>Layout</span>\r\n {currentLayoutLabel && (\r\n <span className=\"flex-1 text-right text-caption-sm text-fg-subtle\">\r\n {currentLayoutLabel}\r\n </span>\r\n )}\r\n </DropdownMenuSubTrigger>\r\n <DropdownMenuSubContent sideOffset={4}>\r\n <DropdownMenuRadioGroup\r\n value={layout}\r\n onValueChange={onLayoutChange}\r\n >\r\n {layoutOptions!.map((opt) => {\r\n const Icon = opt.icon;\r\n return (\r\n <DropdownMenuRadioItem key={opt.id} value={opt.id}>\r\n <Icon />\r\n <span>{opt.label}</span>\r\n </DropdownMenuRadioItem>\r\n );\r\n })}\r\n </DropdownMenuRadioGroup>\r\n </DropdownMenuSubContent>\r\n </DropdownMenuSub>\r\n )}\r\n\r\n {/* Tema — submenu */}\r\n {hasTheme && (\r\n <DropdownMenuSub>\r\n <DropdownMenuSubTrigger>\r\n <SunMoon />\r\n <span>Tema</span>\r\n {currentThemeLabel && (\r\n <span className=\"flex-1 text-right text-caption-sm text-fg-subtle\">\r\n {currentThemeLabel}\r\n </span>\r\n )}\r\n </DropdownMenuSubTrigger>\r\n <DropdownMenuSubContent sideOffset={4}>\r\n <DropdownMenuRadioGroup\r\n value={theme}\r\n onValueChange={onThemeChange}\r\n >\r\n {themeOptions!.map((opt) => {\r\n const Icon = opt.icon;\r\n return (\r\n <DropdownMenuRadioItem key={opt.id} value={opt.id}>\r\n <Icon />\r\n <span>{opt.label}</span>\r\n </DropdownMenuRadioItem>\r\n );\r\n })}\r\n </DropdownMenuRadioGroup>\r\n </DropdownMenuSubContent>\r\n </DropdownMenuSub>\r\n )}\r\n\r\n {/* Configurações */}\r\n {onSettings && (\r\n <DropdownMenuItem onSelect={onSettings}>\r\n <Settings />\r\n <span>Configurações</span>\r\n </DropdownMenuItem>\r\n )}\r\n\r\n {/* Logout */}\r\n {onLogout && (\r\n <>\r\n <DropdownMenuSeparator />\r\n <DropdownMenuItem onSelect={onLogout}>\r\n <LogOut />\r\n <span>Sair</span>\r\n </DropdownMenuItem>\r\n </>\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n","import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Slots do `<AppShell>` template.\r\n *\r\n * Layout 2-column: sidebar à esquerda (fixa, full-height) + main area\r\n * à direita (Header sticky no topo + body abaixo).\r\n *\r\n * Body recebe `gap-gp-4xl` (24px) fixo e padding responsivo em 3 patamares\r\n * (18 / 24 / 32px — ver `bodyInner`) por design — slot \"padronizado\" pra todas\r\n * as telas. Consumer customiza só os filhos.\r\n */\r\n\r\n/**\r\n * Raiz do shell. A altura é o ponto sensível aqui.\r\n *\r\n * ## Por que `fillHeight` existe (medido em 2026-08-18)\r\n *\r\n * `h-screen` é 100vh **sempre**, ignorando a altura do container pai. Consequência\r\n * medida na própria página de doc do AppShell, que o renderiza dentro de\r\n * `<div class=\"h-[640px] … overflow-hidden\">`:\r\n *\r\n * container do exemplo 640px\r\n * <main> do shell 660px (60 do header + 660 = 720 = 100vh)\r\n * → o shell termina 56px ABAIXO da borda, e o overflow-hidden do wrapper\r\n * corta esse pedaço — levando os 24px de padding-bottom do body junto\r\n *\r\n * O sintoma que aparece é \"o conteúdo está colado na borda de baixo\", e a leitura\r\n * natural é \"falta padding-bottom\". **Não falta**: o padding existe e é simétrico\r\n * (medido: 24px em cima e 24px embaixo). Ele está sendo *clipado*. Acrescentar mais\r\n * padding não consertaria nada — só mudaria o quanto se perde.\r\n *\r\n * Vale para qualquer consumidor que embuta o shell em algo com altura definida:\r\n * um layout com footer próprio, um painel de aba, um card de preview.\r\n *\r\n * fillHeight=false (default) h-screen — o shell É a página. Comportamento atual,\r\n * preservado pra não mexer em quem já usa.\r\n * fillHeight=true h-full — o shell obedece o pai. **Exige que o pai\r\n * tenha altura**: `h-full` sem pai medido\r\n * colapsa pra zero, que é o modo de falhar\r\n * deste modo.\r\n */\r\nexport const root = tv({\r\n base: [\r\n \"flex w-full bg-bg-canvas\",\r\n \"overflow-hidden\", // garante que sidebar + main não vazem o container\r\n ],\r\n variants: {\r\n fillHeight: {\r\n false: \"h-screen\",\r\n true: \"h-full\",\r\n },\r\n },\r\n defaultVariants: { fillHeight: false },\r\n});\r\n\r\n/** Wrapper da área principal (Header + Body). Ocupa o resto do flex row. */\r\nexport const main = tv({\r\n base: [\r\n \"flex flex-col flex-1 min-w-0\",\r\n \"overflow-hidden\",\r\n ],\r\n});\r\n\r\n/**\r\n * Body slot — wrapper externo do conteúdo da tela. Gerencia scroll.\r\n * `min-h-0` permite o body shrink dentro do flex pai pra scroll interno\r\n * funcionar (children podem ter `overflow-auto` ou `flex-1 min-h-0` próprio).\r\n *\r\n * O padding + gap + max-width ficam no `bodyInner` (slot interno) — assim\r\n * o scroll continua na viewport inteira mesmo em layout=compact.\r\n */\r\nexport const body = tv({\r\n base: [\r\n \"flex flex-col flex-1 min-h-0\",\r\n \"overflow-auto scrollbar-thin\",\r\n ],\r\n});\r\n\r\n/**\r\n * Wrapper interno do body — controla padding, gap entre filhos e o max-width\r\n * conforme `layout`.\r\n *\r\n * - `fluid` (default): ocupa 100% da largura disponível (atual)\r\n * - `compact`: max-width 1368px (`--container-main-content-max`), centralizado\r\n *\r\n * Padding por faixa de viewport — 3 patamares, não 2:\r\n *\r\n * < 768px (max-md) 18px — telas pequenas precisam respiro mínimo mas não\r\n * zero (chat/navegação por overlays usam o\r\n * bodyInner cheio).\r\n * 768–1535 (max-2xl) 24px — NOTEBOOK. Até 2026-08-04 esta faixa herdava os\r\n * 32px do desktop: um 1366×768 gastava a mesma\r\n * moldura de um 4K, com muito menos área útil.\r\n * O corte é em `2xl` (1536) e não em `xl` (1280)\r\n * porque 1366 e 1536 são as duas resoluções de\r\n * notebook dominantes — cortar em `xl` deixaria a\r\n * 1536 de fora justamente onde aperta.\r\n * ≥ 1536px 32px — desktop, valor original preservado.\r\n *\r\n * ⚠️ `max-md:` tem que vencer `max-2xl:` abaixo de 768px. Vence por ordem de\r\n * fonte: o Tailwind emite as variantes `max-*` em breakpoint DECRESCENTE, então\r\n * a regra `max-md` sai depois da `max-2xl` com a mesma especificidade. Medido no\r\n * browser nos 3 patamares, não deduzido — é a classe de erro da L-066.\r\n */\r\nexport const bodyInner = tv({\r\n base: [\r\n \"flex flex-col flex-1 min-h-0 w-full mx-auto\",\r\n \"gap-gp-4xl p-pad-6xl max-2xl:p-pad-4xl\",\r\n ],\r\n variants: {\r\n layout: {\r\n fluid: \"max-w-full\",\r\n compact: \"max-w-[var(--container-main-content-max)]\",\r\n },\r\n /**\r\n * Em mobile (<md):\r\n * - `false` (default): padding reduzido pra 18px (telas pequenas\r\n * precisam respiro mínimo).\r\n * - `true`: padding zero — útil pra patterns \"app feel\" (chat,\r\n * navegação por overlays fullscreen) onde a page controla o\r\n * próprio padding interno.\r\n */\r\n mobileEdgeToEdge: {\r\n true: \"max-md:p-0\",\r\n false: \"max-md:p-[18px]\",\r\n },\r\n },\r\n defaultVariants: {\r\n layout: \"fluid\",\r\n mobileEdgeToEdge: false,\r\n },\r\n});\r\n","import { useCallback, useState } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Header } from \"@/components/ui/Header\";\r\nimport { MenuSidebar } from \"@/components/ui/MenuSidebar\";\r\nimport { SingleMenuSidebar } from \"@/components/ui/SingleMenuSidebar\";\r\nimport { useMediaQuery } from \"@/components/ui/MenuSidebar/use-media-query\";\r\nimport { UserMenu } from \"./user-menu\";\r\nimport * as s from \"./app-shell.styles\";\r\nimport type { AppShellProps, AppShellInternalProps } from \"./app-shell.types\";\r\n\r\n/**\r\n * `<AppShell>` — template de aplicação (rail + panel + header + body).\r\n *\r\n * Compõe os 3 primitives da família \"app skeleton\":\r\n * - `<MenuSidebar>` (rail + panel, full-height, à esquerda)\r\n * - `<Header>` (top bar com breadcrumb/search/notif/messages/theme)\r\n * - **Body slot** (children, `gap-gp-4xl p-pad-6xl`, scroll vertical interno)\r\n *\r\n * **Padrão controlled/uncontrolled** pra `menuCollapsed`:\r\n * - `menuCollapsed` prop → controlled (consumer gerencia state)\r\n * - `defaultMenuCollapsed` → uncontrolled initial value (vence a regra responsiva)\r\n * - Sem nenhum dos dois → uncontrolled com default **responsivo**: colapsado\r\n * abaixo de 1536px, expandido acima (ver o `useState` do `internalCollapsed`)\r\n *\r\n * Todas as outras props são **passthrough 1:1** pros sub-componentes.\r\n * AppShell não impõe styling ao body além de gap/padding fixos — consumer\r\n * controla 100% do conteúdo (cards, tabelas, qualquer coisa).\r\n *\r\n * Pra uso real: declare um `MOCK_CONTEXTS`, `MOCK_COMMANDS`, etc compartilhados\r\n * num arquivo da app (ex: `src/config/app-shell-mocks.ts`) e passe nas pages.\r\n */\r\nexport function AppShell(props: AppShellProps) {\r\n // Ver AppShellInternalProps: a união vale na fronteira pública; aqui destruturo tudo.\r\n const {\r\n // Sidebar\r\n contexts,\r\n defaultActiveContextId,\r\n activeContextId,\r\n onContextChange,\r\n defaultActiveItemHref,\r\n activeItemHref,\r\n onItemClick,\r\n renderLink,\r\n brandHref,\r\n onBrandClick,\r\n // Header\r\n breadcrumb,\r\n commandGroups,\r\n commandPlaceholder,\r\n commandEmptyMessage,\r\n searchPlaceholder,\r\n notifications,\r\n messages,\r\n theme,\r\n onThemeChange,\r\n themeOptions,\r\n headerRightSlot,\r\n // User menu\r\n user,\r\n layout,\r\n onLayoutChange,\r\n layoutOptions,\r\n onSettings,\r\n onLogout,\r\n // Menu collapse (controlled/uncontrolled)\r\n menuCollapsed: controlledCollapsed,\r\n defaultMenuCollapsed,\r\n onMenuCollapseChange,\r\n // Body\r\n children,\r\n bodyClassName,\r\n mobileEdgeToEdge,\r\n fillHeight,\r\n // Escolha da sidebar. SEM default aqui: um default literal estreitaria o tipo pra\r\n // \"menu\" e o TS marcaria a comparação com \"single\" como morta (TS2367).\r\n sidebar,\r\n categories,\r\n sidebarLogo,\r\n sidebarTitle,\r\n activeItemId,\r\n onSidebarItemClick,\r\n sidebarModules,\r\n sidebarShowSearch,\r\n sidebarSearchPlaceholder,\r\n className,\r\n } = props as AppShellInternalProps;\r\n /**\r\n * Default do collapse é RESPONSIVO: abaixo de 1536px o menu nasce colapsado.\r\n *\r\n * Mesma fronteira do padding do body (`max-2xl`) — uma história de breakpoint só.\r\n * Notebook 1366/1440/1536 é onde o painel expandido custa caro: some ~200px de\r\n * largura útil numa tela que já é estreita.\r\n *\r\n * Três decisões que valem estar escritas:\r\n *\r\n * 1. **Só no mount, não reativo.** Colapsar de novo a cada resize brigaria com o\r\n * usuário: depois que ele abre o menu na mão, não dá pra distinguir \"estado\r\n * inicial\" de \"ele quis assim\". `useMediaQuery` (reativo) é usado logo abaixo\r\n * pro `isMobile`, que decide COMPORTAMENTO do toggle — outra coisa.\r\n * 2. **`defaultMenuCollapsed` explícito vence.** Por isso a prop perdeu o\r\n * `= false` na desestruturação: com valor default eu não conseguiria\r\n * distinguir \"consumer passou false\" de \"consumer não passou\". Só o `undefined`\r\n * cai na regra responsiva.\r\n * 3. **Não precisa excluir mobile.** Abaixo de 768px o `MenuSidebar` força\r\n * `collapsed = false` internamente (o menu vira drawer overlay), então o valor\r\n * daqui é ignorado — verificado no browser, não deduzido da leitura.\r\n *\r\n * Lê síncrono no initializer pra não haver flash de menu expandido no 1º paint.\r\n */\r\n const [internalCollapsed, setInternalCollapsed] = useState<boolean>(() => {\r\n if (defaultMenuCollapsed !== undefined) return defaultMenuCollapsed;\r\n if (typeof window === \"undefined\") return false; // SSR: expandido, sem viewport\r\n return window.matchMedia(\"(max-width: 1535px)\").matches;\r\n });\r\n const menuCollapsed: boolean = controlledCollapsed ?? internalCollapsed;\r\n\r\n // Mobile: o hamburger abre/fecha o drawer overlay (mobileOpen do MenuSidebar),\r\n // NÃO o collapse de desktop (panelCollapsed). Antes o toggle só mexia no\r\n // panelCollapsed → no mobile o menu nunca abria.\r\n const isMobile = useMediaQuery(\"(max-width: 767px)\");\r\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\r\n\r\n const toggleMenuCollapsed = useCallback(() => {\r\n const next = !menuCollapsed;\r\n if (controlledCollapsed === undefined) setInternalCollapsed(next);\r\n onMenuCollapseChange?.(next);\r\n }, [menuCollapsed, controlledCollapsed, onMenuCollapseChange]);\r\n\r\n const handleToggleMenu = useCallback(() => {\r\n if (isMobile) setMobileMenuOpen((o) => !o);\r\n else toggleMenuCollapsed();\r\n }, [isMobile, toggleMenuCollapsed]);\r\n\r\n const userNode = user ? (\r\n <UserMenu\r\n user={user}\r\n layout={layout}\r\n onLayoutChange={onLayoutChange}\r\n layoutOptions={layoutOptions}\r\n theme={theme}\r\n onThemeChange={onThemeChange}\r\n themeOptions={themeOptions}\r\n onSettings={onSettings}\r\n onLogout={onLogout}\r\n />\r\n ) : undefined;\r\n\r\n /**\r\n * A sidebar single modela o estado como `expanded`, não `collapsed` — e no mobile o\r\n * `expanded` É a visibilidade (< md: expandida ocupa 100% da largura, recolhida some).\r\n * Então o hamburger do Header mapeia assim:\r\n *\r\n * desktop expanded = !menuCollapsed\r\n * mobile expanded = mobileMenuOpen (o mesmo state que abre o drawer do MenuSidebar)\r\n *\r\n * Com isso o mesmo `handleToggleMenu` serve pras duas, e quem consome não precisa saber\r\n * qual das duas está montada pra o botão funcionar.\r\n */\r\n const sidebarNode =\r\n sidebar === \"single\" ? (\r\n <SingleMenuSidebar\r\n logo={sidebarLogo}\r\n title={sidebarTitle ?? \"\"}\r\n categories={categories}\r\n modules={sidebarModules}\r\n activeItemId={activeItemId}\r\n onItemClick={onSidebarItemClick}\r\n renderLink={renderLink as never}\r\n /**\r\n * ⚠️ `?? false` não é redundante: o `SingleMenuSidebar` tem `showSearch = true` como\r\n * DEFAULT dele (faz sentido em uso standalone, onde não há Header). Dentro do shell\r\n * há Header com `commandGroups`, então herdar esse default entrega **duas buscas na\r\n * mesma tela** — pego na verificação visual, não na leitura.\r\n *\r\n * Aqui o default se inverte: desligada, e quem quiser uma busca de escopo próprio\r\n * na sidebar liga com `sidebarShowSearch`.\r\n */\r\n showSearch={sidebarShowSearch ?? false}\r\n searchPlaceholder={sidebarSearchPlaceholder}\r\n /**\r\n * `showToggleIndicator` fica FALSE (o default dela) de propósito.\r\n *\r\n * Ele desenha um botãozinho flutuante grudado na borda externa da sidebar recolhida\r\n * (`absolute right-0 translate-x-1/2`, 26×26) — ruído visual num rail que já responde\r\n * a **hover**: passar o mouse expande, e aí o toggle interno aparece pra travar.\r\n *\r\n * ⚠️ Eu havia forçado esta prop, argumentando que sem ela \"não haveria como expandir\r\n * de novo\". Errado: ignorei o hover-expand, que é o mecanismo primário de abertura\r\n * no desktop. No mobile, onde não há hover, quem abre é o botão do Header — que é\r\n * exatamente por isso que ele NÃO é removido lá (ver `onCollapseMenu`).\r\n */\r\n expanded={isMobile ? mobileMenuOpen : !menuCollapsed}\r\n onExpandedChange={(next) => {\r\n if (isMobile) {\r\n setMobileMenuOpen(next);\r\n return;\r\n }\r\n const nextCollapsed = !next;\r\n if (controlledCollapsed === undefined) setInternalCollapsed(nextCollapsed);\r\n onMenuCollapseChange?.(nextCollapsed);\r\n }}\r\n // O Single exige `user`; o AppShell o tem opcional e com outro shape. As ações do\r\n // rodapé reaproveitam os callbacks que o shell já recebe pro user menu, pra não\r\n // haver duas fontes de \"Configurações\"/\"Sair\" na mesma tela.\r\n user={{\r\n name: user?.name ?? \"\",\r\n email: user?.email ?? \"\",\r\n actions: [\r\n ...(onSettings ? [{ id: \"settings\", label: \"Configurações\" }] : []),\r\n ...(onLogout\r\n ? [{ id: \"logout\", label: \"Sair\", variant: \"destructive\" as const }]\r\n : []),\r\n ],\r\n onAction: (id) => {\r\n if (id === \"settings\") onSettings?.();\r\n if (id === \"logout\") onLogout?.();\r\n },\r\n }}\r\n />\r\n ) : (\r\n <MenuSidebar\r\n // A união pública EXIGE `contexts` quando a sidebar não é \"single\" — o shape\r\n // interno é que relaxa. Um consumidor JS que burle os tipos quebra no\r\n // MenuSidebar, alto e visível, em vez de renderizar um rail vazio em silêncio.\r\n contexts={contexts as NonNullable<typeof contexts>}\r\n activeContextId={activeContextId}\r\n defaultActiveContextId={defaultActiveContextId}\r\n onContextChange={onContextChange}\r\n activeItemHref={activeItemHref}\r\n defaultActiveItemHref={defaultActiveItemHref}\r\n onItemClick={onItemClick}\r\n renderLink={renderLink}\r\n brandHref={brandHref}\r\n onBrandClick={onBrandClick}\r\n user={userNode}\r\n panelCollapsed={menuCollapsed}\r\n onPanelCollapseChange={(next) => {\r\n if (controlledCollapsed === undefined) setInternalCollapsed(next);\r\n onMenuCollapseChange?.(next);\r\n }}\r\n mobileOpen={mobileMenuOpen}\r\n onMobileOpenChange={setMobileMenuOpen}\r\n />\r\n );\r\n\r\n return (\r\n <div className={cn(s.root({ fillHeight: fillHeight ?? false }), className)}>\r\n {sidebarNode}\r\n\r\n <div className={s.main()}>\r\n <Header\r\n breadcrumb={breadcrumb}\r\n /**\r\n * A sidebar single tem o próprio botão de recolher, no header dela (é o desenho\r\n * dela — logo + título + toggle). Manter também o do Header dá DOIS controles\r\n * pra mesma coisa, lado a lado. O Header esconde o botão quando `onCollapseMenu`\r\n * é omitido, então basta não passar.\r\n *\r\n * ⚠️ **Menos no mobile.** Abaixo de 768px a single fica `hidden` quando recolhida\r\n * — o toggle dela desaparece junto, e não haveria como abrir o menu. Ali o botão\r\n * do Header é a única entrada, então ele fica.\r\n */\r\n onCollapseMenu={sidebar === \"single\" && !isMobile ? undefined : handleToggleMenu}\r\n /**\r\n * No mobile o botão do Header controla a VISIBILIDADE (`mobileMenuOpen`), não o\r\n * collapse de desktop — o `handleToggleMenu` acima já ramifica assim. Mas o\r\n * rótulo vinha só de `menuCollapsed`, então com o menu fechado no celular o\r\n * leitor de tela anunciava \"Colapsar menu\": a ação oposta à que o clique faz.\r\n *\r\n * Medido no Chrome em 420px de largura: sidebar `display: none` e o botão\r\n * dizendo \"Colapsar\". Defeito pré-existente (vale pras duas sidebars), achado ao\r\n * validar o mobile da variante single.\r\n */\r\n menuCollapsed={isMobile ? !mobileMenuOpen : menuCollapsed}\r\n commandGroups={commandGroups}\r\n commandPlaceholder={commandPlaceholder}\r\n commandEmptyMessage={commandEmptyMessage}\r\n searchPlaceholder={searchPlaceholder}\r\n notifications={notifications}\r\n messages={messages}\r\n theme={theme}\r\n onThemeChange={onThemeChange}\r\n themeOptions={themeOptions}\r\n rightSlot={headerRightSlot}\r\n />\r\n\r\n <main className={cn(s.body(), bodyClassName)}>\r\n <div\r\n className={s.bodyInner({\r\n layout: layout === \"compact\" ? \"compact\" : \"fluid\",\r\n mobileEdgeToEdge: mobileEdgeToEdge ?? false,\r\n })}\r\n >\r\n {children}\r\n </div>\r\n </main>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nAppShell.displayName = \"AppShell\";\r\n","import { useCallback, useEffect, useState } from \"react\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\n\nconst STORAGE_KEY = \"igreen-ds-theme\";\nconst CHANGE_EVENT = \"igreen-ds-theme-change\";\n\nfunction isTheme(value: unknown): value is Theme {\n return value === \"light\" || value === \"dark\" || value === \"system\";\n}\n\nfunction getStoredTheme(): Theme {\n if (typeof window === \"undefined\") return \"system\";\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return isTheme(stored) ? stored : \"system\";\n}\n\nfunction getEffectiveDark(theme: Theme): boolean {\n if (theme === \"dark\") return true;\n if (theme === \"light\") return false;\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\n/**\n * Hook único de tema do app.\n *\n * - 3 valores: `\"light\"` | `\"dark\"` | `\"system\"` (segue prefers-color-scheme).\n * - Persiste em `localStorage[\"igreen-ds-theme\"]`.\n * - Sincroniza múltiplas instâncias na mesma tab via `CustomEvent` e entre\n * tabs via `storage` event. Pode ser chamado em qualquer page/component\n * sem precisar de Context Provider.\n * - Aplica `.dark` no `<html>` com observador de `prefers-color-scheme`\n * quando theme=`\"system\"`.\n */\nexport function useTheme() {\n const [theme, setThemeState] = useState<Theme>(() => getStoredTheme());\n\n // Aplica .dark no <html> + observa prefers-color-scheme quando theme=\"system\"\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const apply = () => root.classList.toggle(\"dark\", getEffectiveDark(theme));\n apply();\n\n if (theme === \"system\") {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", apply);\n return () => mq.removeEventListener(\"change\", apply);\n }\n }, [theme]);\n\n // setTheme — persiste no localStorage + broadcast pra outras instâncias do hook\n const setTheme = useCallback((next: Theme) => {\n setThemeState(next);\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(STORAGE_KEY, next);\n } catch {\n /* ignore */\n }\n window.dispatchEvent(new CustomEvent(CHANGE_EVENT, { detail: next }));\n }, []);\n\n // Listener — recebe broadcast de outras instâncias (mesma tab + cross-tab)\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onCustom = (e: Event) => {\n const next = (e as CustomEvent).detail;\n if (isTheme(next)) setThemeState(next);\n };\n const onStorage = (e: StorageEvent) => {\n if (e.key !== STORAGE_KEY) return;\n if (isTheme(e.newValue)) setThemeState(e.newValue);\n };\n window.addEventListener(CHANGE_EVENT, onCustom);\n window.addEventListener(\"storage\", onStorage);\n return () => {\n window.removeEventListener(CHANGE_EVENT, onCustom);\n window.removeEventListener(\"storage\", onStorage);\n };\n }, []);\n\n const isDark = getEffectiveDark(theme);\n\n // Backwards-compat: alterna apenas entre light/dark (ignora system).\n const toggle = useCallback(() => {\n setTheme(theme === \"dark\" ? \"light\" : \"dark\");\n }, [theme, setTheme]);\n\n return { theme, setTheme, isDark, toggle } as const;\n}\n"],"names":["tv","jsxs","Fragment","jsx","cn","ChevronRight","useState","useEffect","Search","Button","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","CommandShortcut","CommandSeparator","forwardRef","Chip","ChipGroup","ToggleGroupPrimitive","createContext","ChipGroupItem","useContext","DEFAULT_FILTERS","Popover","PopoverTrigger","Bell","PopoverContent","CheckCheck","MoreHorizontal","MessageSquare","PenLine","Maximize2","InputGroup","InputGroupAddon","InputGroupInput","Sun","Moon","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","Check","PanelLeftOpen","PanelLeftClose","Menu","sidebarRoot","sidebarPanel","Plus","ChevronDown","useCallback","useRef","X","ChevronsUpDown","Tooltip","TooltipTrigger","TooltipContent","Collapsible","CollapsibleTrigger","CollapsibleContent","avatar","User","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuSeparator","module","useMemo","TooltipProvider","Avatar","AvatarImage","AvatarFallback","DropdownMenuSub","DropdownMenuSubTrigger","LayoutGrid","DropdownMenuSubContent","DropdownMenuRadioGroup","DropdownMenuRadioItem","SunMoon","Settings","LogOut","s.root","s.main","s.body","s.bodyInner","root"],"mappings":"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"}
|