@snksergio/design-system 0.30.2 → 0.30.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell-78w0pYdP.mjs","sources":["../../src/lib/utils.ts","../../src/utils/tv.ts","../../src/components/ui/Button/button.styles.ts","../../src/components/ui/Button/button.tsx","../../src/components/ui/Header/header.styles.ts","../../src/components/ui/Header/header-breadcrumb.tsx","../../src/components/shadcn/dialog.tsx","../../src/components/shadcn/command.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/shadcn/popover.tsx","../../src/components/ui/Header/header-notifications.tsx","../../src/components/shadcn/input-group.tsx","../../src/components/ui/Header/header-messages.tsx","../../src/components/shadcn/dropdown-menu.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/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/shadcn/avatar.tsx","../../src/components/ui/AppShell/user-menu.tsx","../../src/components/ui/AppShell/app-shell.styles.ts","../../src/components/ui/AppShell/app-shell.tsx"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\r\nimport { extendTailwindMerge } from \"tailwind-merge\";\r\n\r\n/**\r\n * tw-merge configurado pra reconhecer:\r\n *\r\n * 1) Presets tipográficos do iGreen DS como `font-size` (e não text-color).\r\n * Sem isso, `text-title-md` e `text-fg-default` colidem e um é removido.\r\n *\r\n * 2) Prefixos DS (pad-*, sp-*, gp-*, radius-*, sh-*, form-*) como conflitantes\r\n * com utilitários nativos do Tailwind. Sem isso, `p-pad-4xl` + `p-0` no cn()\r\n * deixava AMBOS no className final (24px + 0 = 24px ganhava).\r\n */\r\n\r\n/** Padding/Margin spacing: pad-* (padding contexts), sp-* (geral) */\r\nconst isDsPad = (v: string) => /^(pad|sp)-/.test(v);\r\n/** Gap: gp-* */\r\nconst isDsGap = (v: string) => /^gp-/.test(v);\r\n/** Border-radius: radius-* */\r\nconst isDsRadius = (v: string) => /^radius-/.test(v);\r\n/** Shadow: sh-* */\r\nconst isDsShadow = (v: string) => /^sh-/.test(v);\r\n/** Form heights: form-* (min-h, h, w, size) */\r\nconst isDsForm = (v: string) => /^form-/.test(v);\r\n\r\nconst twMerge = extendTailwindMerge({\r\n extend: {\r\n classGroups: {\r\n \"font-size\": [\r\n {\r\n // Lista 1:1 com tokens/brands/default/semantic/typography.ts.\r\n // Manter sincronizado com src/utils/tv.ts. Ver L-016.\r\n text: [\r\n // Displays (fluid clamp)\r\n \"display-2xl\", \"display-xl\", \"display-lg\", \"display-md\",\r\n // Headings (xs estático, sm-xl fluid clamp)\r\n \"heading-xl\", \"heading-lg\", \"heading-md\", \"heading-sm\", \"heading-xs\",\r\n // Titles (weight 600 default)\r\n \"title-lg\", \"title-md\", \"title-sm\",\r\n // Body (xs/sm = weight 500 interactive; md-2xl = 400 corrido)\r\n \"body-2xl\", \"body-xl\", \"body-lg\", \"body-md\", \"body-sm\", \"body-xs\",\r\n // Captions (weight 400)\r\n \"caption-md\", \"caption-sm\", \"caption-xs\",\r\n // Code (mono regular)\r\n \"code-md\", \"code-sm\",\r\n ],\r\n },\r\n ],\r\n\r\n /* ── Padding ──────────────────────────────────────────────────────── */\r\n p: [{ p: [isDsPad] }],\r\n px: [{ px: [isDsPad] }],\r\n py: [{ py: [isDsPad] }],\r\n pt: [{ pt: [isDsPad] }],\r\n pr: [{ pr: [isDsPad] }],\r\n pb: [{ pb: [isDsPad] }],\r\n pl: [{ pl: [isDsPad] }],\r\n ps: [{ ps: [isDsPad] }],\r\n pe: [{ pe: [isDsPad] }],\r\n\r\n /* ── Margin (usa mesmo sp-*) ──────────────────────────────────────── */\r\n m: [{ m: [isDsPad] }],\r\n mx: [{ mx: [isDsPad] }],\r\n my: [{ my: [isDsPad] }],\r\n mt: [{ mt: [isDsPad] }],\r\n mr: [{ mr: [isDsPad] }],\r\n mb: [{ mb: [isDsPad] }],\r\n ml: [{ ml: [isDsPad] }],\r\n ms: [{ ms: [isDsPad] }],\r\n me: [{ me: [isDsPad] }],\r\n\r\n /* ── Inset / position (top/right/bottom/left) ─────────────────────── */\r\n inset: [{ inset: [isDsPad] }],\r\n \"inset-x\": [{ \"inset-x\": [isDsPad] }],\r\n \"inset-y\": [{ \"inset-y\": [isDsPad] }],\r\n \"top\": [{ top: [isDsPad] }],\r\n \"right\": [{ right: [isDsPad] }],\r\n \"bottom\": [{ bottom: [isDsPad] }],\r\n \"left\": [{ left: [isDsPad] }],\r\n \"start\": [{ start: [isDsPad] }],\r\n \"end\": [{ end: [isDsPad] }],\r\n\r\n /* ── Gap ──────────────────────────────────────────────────────────── */\r\n gap: [{ gap: [isDsGap] }],\r\n \"gap-x\": [{ \"gap-x\": [isDsGap] }],\r\n \"gap-y\": [{ \"gap-y\": [isDsGap] }],\r\n\r\n /* ── Rounded (todas as cantos) ────────────────────────────────────── */\r\n rounded: [{ rounded: [isDsRadius] }],\r\n \"rounded-s\": [{ \"rounded-s\": [isDsRadius] }],\r\n \"rounded-e\": [{ \"rounded-e\": [isDsRadius] }],\r\n \"rounded-t\": [{ \"rounded-t\": [isDsRadius] }],\r\n \"rounded-r\": [{ \"rounded-r\": [isDsRadius] }],\r\n \"rounded-b\": [{ \"rounded-b\": [isDsRadius] }],\r\n \"rounded-l\": [{ \"rounded-l\": [isDsRadius] }],\r\n \"rounded-ss\": [{ \"rounded-ss\": [isDsRadius] }],\r\n \"rounded-se\": [{ \"rounded-se\": [isDsRadius] }],\r\n \"rounded-ee\": [{ \"rounded-ee\": [isDsRadius] }],\r\n \"rounded-es\": [{ \"rounded-es\": [isDsRadius] }],\r\n \"rounded-tl\": [{ \"rounded-tl\": [isDsRadius] }],\r\n \"rounded-tr\": [{ \"rounded-tr\": [isDsRadius] }],\r\n \"rounded-br\": [{ \"rounded-br\": [isDsRadius] }],\r\n \"rounded-bl\": [{ \"rounded-bl\": [isDsRadius] }],\r\n\r\n /* ── Shadow ───────────────────────────────────────────────────────── */\r\n shadow: [{ shadow: [isDsShadow] }],\r\n\r\n /* ── Form sizes (min-h, h, w, size) ───────────────────────────────── */\r\n \"min-h\": [{ \"min-h\": [isDsForm] }],\r\n h: [{ h: [isDsForm] }],\r\n w: [{ w: [isDsForm] }],\r\n size: [{ size: [isDsForm] }],\r\n },\r\n },\r\n});\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","// src/utils/tv.ts\r\n// tv() customizado que ensina o tailwind-merge a reconhecer\r\n// os presets tipográficos do iGreen como font-size, não text-color.\r\nimport { tv as tvBase, type TVConfig } from \"tailwind-variants\";\r\n\r\n// Objeto de config — NÃO é o resultado de extendTailwindMerge()\r\n// TV3 recebe o config diretamente e aplica o merge internamente\r\nconst twMergeConfig = {\r\n extend: {\r\n classGroups: {\r\n \"font-size\": [\r\n {\r\n text: [\r\n // Displays (fluid clamp)\r\n \"display-2xl\", \"display-xl\", \"display-lg\", \"display-md\",\r\n // Headings (xs estático, sm-xl fluid clamp)\r\n \"heading-xl\", \"heading-lg\", \"heading-md\", \"heading-sm\", \"heading-xs\",\r\n // Titles (weight 600 default)\r\n \"title-lg\", \"title-md\", \"title-sm\",\r\n // Body (xs/sm = weight 500 interactive; md-2xl = 400 corrido)\r\n \"body-2xl\", \"body-xl\", \"body-lg\", \"body-md\", \"body-sm\", \"body-xs\",\r\n // Captions (weight 400)\r\n \"caption-md\", \"caption-sm\", \"caption-xs\",\r\n // Stat (número de métrica/KPI — estático, bold, leading tight)\r\n \"stat-xl\", \"stat-lg\", \"stat-md\", \"stat-sm\",\r\n // Code (mono regular)\r\n \"code-md\", \"code-sm\",\r\n ],\r\n },\r\n ],\r\n },\r\n },\r\n};\r\n\r\nexport const tv: typeof tvBase = (options, config) =>\r\n tvBase(options, {\r\n ...config,\r\n twMergeConfig,\r\n } as TVConfig);\r\n\r\nexport type { VariantProps } from \"tailwind-variants\";\r\n","import { tv, type VariantProps } from \"@/utils/tv\";\r\n\r\n/**\r\n * Button styles — V3 tokens (alinhado com /design-and-table-v2)\r\n *\r\n * Specs base:\r\n * - font-size 13px (text-body-md font-medium = 0.8125rem / 600)\r\n * - border-radius 10px (rounded-radius-lg)\r\n * - secondary usa fg-secondary\r\n * - rings cor-pura via ring.{brand|danger|success|warning|secondary}\r\n *\r\n * Variants color: primary/secondary/critical/success/warning\r\n * - primary → bg-brand / fg-brand / border-brand\r\n * - critical → bg-danger / fg-danger / border-danger-muted\r\n * - secondary → neutros (bg-muted, fg-secondary, border-default)\r\n *\r\n * Variants visual: filled/outline/soft/ghost\r\n *\r\n * Sizes mantidas (largura/espaçamento como estavam).\r\n *\r\n * Disabled: opacity-50 (v3 não tem bg-disabled token).\r\n */\r\nexport const buttonVariants = tv({\r\n base: [\r\n \"inline-flex items-center justify-center\",\r\n \"select-none whitespace-nowrap\",\r\n \"focus-visible:outline-none\",\r\n \"border border-transparent\",\r\n \"text-body-sm font-semibold leading-none\", // 13px / 600 — alinhado com sandbox btn\r\n \"[&_svg]:shrink-0\", // SVG não diminui; tamanho controlado por size\r\n \"transition-all duration-200 ease-out\",\r\n \"cursor-pointer\",\r\n \"focus-visible:ring-4\",\r\n ],\r\n\r\n variants: {\r\n color: {\r\n primary: \"focus-visible:ring-ring-brand\",\r\n secondary: \"focus-visible:ring-ring-secondary\",\r\n critical: \"focus-visible:ring-ring-danger\",\r\n success: \"focus-visible:ring-ring-success\",\r\n warning: \"focus-visible:ring-ring-warning\",\r\n },\r\n\r\n variant: {\r\n filled: \"\",\r\n outline: \"\",\r\n soft: \"\",\r\n ghost: \"bg-transparent\",\r\n },\r\n\r\n size: {\r\n // h28 / pad 10 / gap 6 / radius 8 / icon 12\r\n \"2xs\": \"min-h-form-xs px-pad-lg gap-gp-sm rounded-radius-md [&_svg]:size-[12px]\",\r\n // h32 / pad 12 / gap 6 / radius 8 / icon 14\r\n xs: \"min-h-form-sm px-pad-xl gap-gp-sm rounded-radius-md [&_svg]:size-[14px]\",\r\n // h36 / pad 12 / gap 6 / radius 10 / icon 14\r\n sm: \"min-h-form-md px-pad-xl gap-gp-sm rounded-radius-lg [&_svg]:size-[14px]\",\r\n // h40 / pad 16 / gap 6 / radius 10 / icon 14 (alinhado com sandbox Exportar)\r\n md: \"min-h-form-lg px-pad-2xl gap-gp-sm rounded-radius-lg [&_svg]:size-[14px]\",\r\n // h44 / pad 16 / gap 8 / radius 10 / icon 16\r\n lg: \"min-h-form-xl px-pad-2xl gap-gp-md rounded-radius-lg [&_svg]:size-[16px]\",\r\n\r\n // Icon buttons — width = height (square). Regra: SVG +2px vs versão com label\r\n // (precisa preencher mais o quadrado sem o texto carregando peso visual).\r\n \"icon-2xs\": \"size-form-xs rounded-radius-md p-0 [&_svg]:size-[14px]\", // 28×28 / +2 (12→14)\r\n \"icon-xs\": \"size-form-sm rounded-radius-md p-0 [&_svg]:size-[16px]\", // 32×32 / +2 (14→16)\r\n \"icon-sm\": \"size-form-md rounded-radius-lg p-0 [&_svg]:size-[16px]\", // 36×36 / +2 (14→16)\r\n \"icon-md\": \"size-form-lg rounded-radius-lg p-0 [&_svg]:size-[16px]\", // 40×40 / +2 (14→16)\r\n \"icon-lg\": \"size-form-xl rounded-radius-lg p-0 [&_svg]:size-[18px]\", // 44×44 / +2 (16→18)\r\n },\r\n\r\n fullWidth: {\r\n true: \"w-full flex-1\",\r\n },\r\n\r\n /**\r\n * Shape do botão:\r\n * - rounded (default): mantém o radius da `size` (varia por tamanho)\r\n * - pill: força `rounded-full` (override com `!` pra ganhar do size)\r\n */\r\n shape: {\r\n rounded: \"\",\r\n pill: \"!rounded-full\",\r\n },\r\n\r\n disabled: {\r\n true: \"pointer-events-none opacity-50\",\r\n },\r\n },\r\n\r\n compoundVariants: [\r\n // ── Primary (brand) ─────────────────────────────────────────────\r\n {\r\n color: \"primary\", variant: \"filled\",\r\n class: \"bg-bg-brand text-fg-on-brand hover:bg-bg-brand-hover\",\r\n },\r\n {\r\n color: \"primary\", variant: \"outline\",\r\n class: \"bg-bg-surface border-border-brand text-fg-brand shadow-sh-sm hover:bg-bg-brand-subtle hover:border-transparent hover:shadow-sh-none\",\r\n },\r\n {\r\n color: \"primary\", variant: \"soft\",\r\n class: \"bg-bg-brand-subtle text-fg-brand hover:bg-bg-brand-subtle-hover\",\r\n },\r\n {\r\n color: \"primary\", variant: \"ghost\",\r\n class: \"text-fg-brand hover:bg-bg-brand-subtle\",\r\n },\r\n\r\n // ── Secondary (neutro) ──────────────────────────────────────────\r\n {\r\n color: \"secondary\", variant: \"filled\",\r\n class: \"bg-bg-muted text-fg-muted hover:bg-bg-muted-hover hover:text-fg-default\",\r\n },\r\n {\r\n // Outline alinhado com `.btn.tbl-tool-btn` do design-and-table-v2:\r\n // light = bg-surface + border-subtle + fg-default + shadow-sm (mantém no hover)\r\n // dark = bg-muted + border-input + fg-muted + sem shadow\r\n color: \"secondary\", variant: \"outline\",\r\n class: [\r\n \"bg-bg-surface border-border-subtle text-fg-default shadow-sh-sm\",\r\n \"dark:bg-bg-muted dark:border-border-input dark:text-fg-muted dark:shadow-sh-none\",\r\n \"hover:bg-bg-muted-hover hover:text-fg-default\",\r\n \"dark:hover:bg-bg-muted-hover dark:hover:text-fg-default\",\r\n ].join(\" \"),\r\n },\r\n {\r\n color: \"secondary\", variant: \"soft\",\r\n class: \"bg-bg-muted text-fg-muted hover:bg-bg-muted-hover hover:text-fg-default\",\r\n },\r\n {\r\n color: \"secondary\", variant: \"ghost\",\r\n class: \"text-fg-muted hover:bg-bg-muted hover:text-fg-default\",\r\n },\r\n\r\n // ── Critical (danger) ───────────────────────────────────────────\r\n {\r\n color: \"critical\", variant: \"filled\",\r\n class: \"bg-bg-danger text-fg-on-danger hover:bg-bg-danger-hover\",\r\n },\r\n {\r\n color: \"critical\", variant: \"outline\",\r\n class: \"bg-bg-surface border-border-danger-muted text-fg-danger shadow-sh-sm hover:bg-bg-danger-muted hover:shadow-sh-none\",\r\n },\r\n {\r\n color: \"critical\", variant: \"soft\",\r\n class: \"bg-bg-danger-muted text-fg-danger hover:bg-bg-danger-muted-hover\",\r\n },\r\n {\r\n color: \"critical\", variant: \"ghost\",\r\n class: \"text-fg-danger hover:bg-bg-danger-muted\",\r\n },\r\n\r\n // ── Success ─────────────────────────────────────────────────────\r\n {\r\n color: \"success\", variant: \"filled\",\r\n class: \"bg-bg-success text-fg-on-success hover:bg-bg-success-hover\",\r\n },\r\n {\r\n color: \"success\", variant: \"outline\",\r\n class: \"bg-bg-surface border-border-success-muted text-fg-success shadow-sh-sm hover:bg-bg-success-muted hover:shadow-sh-none\",\r\n },\r\n {\r\n color: \"success\", variant: \"soft\",\r\n class: \"bg-bg-success-muted text-fg-success hover:bg-bg-success-muted-hover\",\r\n },\r\n {\r\n color: \"success\", variant: \"ghost\",\r\n class: \"text-fg-success hover:bg-bg-success-muted\",\r\n },\r\n\r\n // ── Warning ─────────────────────────────────────────────────────\r\n {\r\n color: \"warning\", variant: \"filled\",\r\n class: \"bg-bg-warning text-fg-on-warning hover:bg-bg-warning-hover\",\r\n },\r\n {\r\n color: \"warning\", variant: \"outline\",\r\n class: \"bg-bg-surface border-border-warning-muted text-fg-warning shadow-sh-sm hover:bg-bg-warning-muted hover:shadow-sh-none\",\r\n },\r\n {\r\n color: \"warning\", variant: \"soft\",\r\n class: \"bg-bg-warning-muted text-fg-warning hover:bg-bg-warning-muted-hover\",\r\n },\r\n {\r\n color: \"warning\", variant: \"ghost\",\r\n class: \"text-fg-warning hover:bg-bg-warning-muted\",\r\n },\r\n\r\n // ── Disabled — SEMPRE por último ────────────────────────────────\r\n { disabled: true, class: \"pointer-events-none opacity-50\" },\r\n ],\r\n\r\n defaultVariants: {\r\n color: \"primary\",\r\n variant: \"filled\",\r\n size: \"md\",\r\n shape: \"rounded\",\r\n },\r\n});\r\n\r\nexport type ButtonVariantProps = VariantProps<typeof buttonVariants>;\r\n","import { forwardRef } from \"react\";\r\nimport type { ButtonProps } from \"./button.types\";\r\nimport { buttonVariants } from \"./button.styles\";\r\n\r\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n function Button(\r\n {\r\n color,\r\n variant,\r\n size,\r\n shape,\r\n fullWidth,\r\n loading = false,\r\n disabled = false,\r\n iconLeft,\r\n iconRight,\r\n children,\r\n className,\r\n type = \"button\",\r\n ...rest\r\n },\r\n ref,\r\n ) {\r\n const isDisabled = disabled || loading;\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type={type}\r\n disabled={isDisabled}\r\n className={buttonVariants({\r\n color,\r\n variant,\r\n size,\r\n shape,\r\n fullWidth,\r\n disabled: isDisabled,\r\n className,\r\n })}\r\n {...rest}\r\n >\r\n {loading && <Spinner />}\r\n {!loading && iconLeft}\r\n {children}\r\n {!loading && iconRight}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nfunction Spinner() {\r\n return (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n className=\"animate-spin\"\r\n >\r\n <circle\r\n cx=\"8\"\r\n cy=\"8\"\r\n r=\"6\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray=\"28\"\r\n strokeDashoffset=\"8\"\r\n className=\"opacity-70\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","import { tv } from \"@/utils/tv\";\n\n/**\n * Header styles — alinhado com `.header` do design-and-table-v2.\n *\n * Layout:\n * - height 60px, padding-x 16px, border-bottom subtle\n * - left: collapse btn + divider + breadcrumb\n * - right: search + theme + messages + notifications (gap 4)\n *\n * Position é responsabilidade do consumer (template). Componente só define\n * altura/layout/cores.\n */\n\n/* ── Root ─────────────────────────────────────────────────────────────────── */\nexport const headerRoot = tv({\n base: [\n \"flex items-center justify-between gap-gp-lg\",\n \"h-[60px] flex-none px-pad-2xl\",\n \"bg-bg-canvas border-b border-border-subtle\",\n \"text-fg-default font-sans\",\n ],\n});\n\nexport const headerLeft = tv({\n base: \"flex items-center gap-gp-md min-w-0 flex-1\",\n});\n\nexport const headerRight = tv({\n base: \"flex items-center gap-gp-sm shrink-0\",\n});\n\nexport const headerDivider = tv({\n base: \"h-[24px] w-px bg-border-default shrink-0 mx-pad-xs\",\n});\n\n/* ── Icon button (header-level) ───────────────────────────────────────────── */\n/**\n * Os icon-buttons \"trigger\" do header (theme/notifications/messages) agora usam\n * `<Button>` do DS. Este `headerIconBtn` é mantido APENAS pro botão de collapse\n * do menu — que tem visual ghost específico do header (radius menor, hover sutil).\n */\nexport const headerIconBtn = tv({\n base: [\n \"relative inline-flex items-center justify-center\",\n \"w-form-md h-form-md rounded-radius-md\",\n \"cursor-pointer text-fg-default\",\n \"transition-colors duration-150\",\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\n ],\n variants: {\n variant: {\n ghost: \"bg-transparent border-0 hover:bg-bg-muted\",\n },\n },\n defaultVariants: { variant: \"ghost\" },\n});\n\n/**\n * Badge dot (indicador de unread) no canto do icon-button do header.\n * Variantes seguem o sandbox: brand (mensagens) / danger (notificações alerta).\n */\nexport const headerIconBtnBadge = tv({\n base: \"absolute top-[4px] right-[4px] w-[8px] h-[8px] rounded-full ring-2 ring-bg-canvas\",\n variants: {\n kind: {\n brand: \"bg-bg-brand\",\n danger: \"bg-bg-danger\",\n },\n },\n defaultVariants: { kind: \"brand\" },\n});\n\n/* ── Breadcrumb ───────────────────────────────────────────────────────────── */\nexport const breadcrumbRoot = tv({\n base: \"flex items-center gap-gp-sm min-w-0\",\n});\n\nexport const breadcrumbItem = tv({\n base: \"font-medium truncate transition-colors leading-none\",\n variants: {\n current: {\n true: \"text-fg-default font-semibold\",\n false: \"text-fg-muted hover:text-fg-default cursor-pointer\",\n },\n /** Quando único item no breadcrumb (= título da página), font-size sobe pra 16px */\n standalone: {\n true: \"text-body-lg\",\n false: \"text-body-sm font-normal\",\n },\n },\n defaultVariants: { current: false, standalone: false },\n});\n\nexport const breadcrumbSeparator = tv({\n base: \"text-fg-subtle shrink-0\",\n});\n\n/* ── Search (fake input) ──────────────────────────────────────────────────── */\nexport const searchFakeInput = tv({\n base: [\n \"inline-flex items-center gap-gp-md h-form-md w-[180px]\",\n \"px-pad-xl rounded-radius-md\",\n \"bg-bg-subtle border border-border-subtle cursor-pointer\",\n \"text-fg-subtle text-body-sm font-normal\",\n \"transition-colors duration-150\",\n \"hover:bg-bg-muted hover:border-border-default\",\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-secondary\",\n ],\n});\n\nexport const searchFakeInputIcon = tv({\n base: \"size-[14px] text-fg-subtle shrink-0\",\n});\n\nexport const searchFakeInputText = tv({\n base: \"flex-1 text-left truncate\",\n});\n\nexport const searchFakeInputKbd = tv({\n base: [\n \"ml-auto inline-flex items-center justify-center\",\n \"h-[20px] px-pad-xs rounded-radius-xs\",\n \"bg-bg-canvas border border-border-subtle dark:bg-bg-muted\",\n \"text-caption-xs font-semibold text-fg-muted tabular-nums shrink-0\",\n ],\n});\n\n/* ── Dropdown chrome (notifications, messages) ────────────────────────────── */\n/**\n * Pattern compartilhado: bell/msg → click → dropdown ancorado abaixo direita.\n * Reusa o token bg-dropdown (frosted-glass) e os mesmos padrões do DropdownMenu.\n */\nexport const hdWrap = tv({\n base: \"relative inline-flex\",\n});\n\nexport const hdDropdown = tv({\n base: [\n \"absolute top-[calc(100%+8px)] right-0 z-50\",\n \"w-[380px] max-w-[calc(100vw-32px)] max-h-[520px] flex flex-col\",\n \"rounded-[12px] bg-bg-dropdown\",\n \"border border-border-default shadow-sh-lg outline-float\",\n \"before:pointer-events-none before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150\",\n \"overflow-hidden\",\n // Animation\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n ],\n});\n\nexport const hdTop = tv({\n base: \"flex flex-col gap-gp-md p-pad-xl border-b border-border-subtle bg-bg-canvas/40\",\n});\n\nexport const hdHeader = tv({\n base: \"flex items-center justify-between\",\n});\n\nexport const hdTitle = tv({\n base: \"flex items-center gap-gp-sm text-body-lg font-semibold text-fg-default\",\n});\n\nexport const hdTitleCount = tv({\n base: [\n \"inline-flex items-center justify-center min-w-[20px] h-[20px] px-pad-xs\",\n \"rounded-radius-xs bg-bg-brand text-fg-on-brand\",\n \"text-caption-sm font-bold tabular-nums\",\n ],\n});\n\nexport const hdHeaderActions = tv({\n base: \"flex items-center gap-gp-xs\",\n});\n\n/* ── Search interno (msgs) ────────────────────────────────────────────────── */\nexport const hdSearch = tv({\n base: [\n \"inline-flex items-center gap-gp-sm h-form-sm w-full\",\n \"px-pad-lg rounded-radius-md\",\n \"bg-bg-input border border-border-input\",\n \"transition-colors duration-150\",\n \"focus-within:border-border-brand focus-within:ring-4 focus-within:ring-ring-brand\",\n ],\n});\n\nexport const hdSearchIcon = tv({\n base: \"size-[14px] text-fg-muted shrink-0\",\n});\n\nexport const hdSearchInput = tv({\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\",\n});\n\n/* ── Tabs (filtros internos) ──────────────────────────────────────────────── */\nexport const hdTabs = tv({\n base: \"flex items-center gap-gp-2xs p-[3px] rounded-radius-lg bg-bg-muted\",\n});\n\nexport const hdTab = tv({\n base: [\n \"inline-flex items-center justify-center gap-gp-xs\",\n \"h-[28px] px-[10px] rounded-radius-sm\",\n \"text-body-xs font-medium text-fg-muted cursor-pointer\",\n \"bg-transparent border-0\",\n \"transition-colors duration-150\",\n \"hover:text-fg-default\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-secondary\",\n ],\n variants: {\n active: {\n true: \"bg-bg-accent text-fg-default font-semibold shadow-sh-sm dark:shadow-sh-none\",\n },\n },\n});\n\nexport const hdTabCount = tv({\n base: \"text-caption-xs font-bold tabular-nums opacity-70\",\n});\n\n/* ── Body (lista scrollável) ──────────────────────────────────────────────── */\nexport const hdBody = tv({\n base: \"flex-1 overflow-y-auto p-pad-sm flex flex-col gap-px\",\n});\n\n/* ── Empty state ──────────────────────────────────────────────────────────── */\nexport const hdEmpty = tv({\n base: \"flex flex-col items-center justify-center gap-gp-md py-pad-7xl text-fg-subtle\",\n});\n\nexport const hdEmptyText = tv({\n base: \"text-body-md\",\n});\n\n/* ── Notification item ────────────────────────────────────────────────────── */\nexport const hdNotif = tv({\n base: [\n \"relative flex items-start gap-gp-lg p-pad-lg rounded-radius-md text-left w-full\",\n \"bg-transparent border-0 cursor-pointer\",\n \"transition-colors duration-150\",\n \"hover:bg-bg-muted\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-secondary\",\n ],\n});\n\nexport const hdNotifIcon = tv({\n base: \"flex-none w-[28px] h-[28px] rounded-radius-md grid place-items-center\",\n});\n\nexport const hdNotifBody = tv({\n base: \"flex-1 min-w-0 flex flex-col gap-gp-2xs\",\n});\n\nexport const hdNotifTitle = tv({\n base: \"text-body-sm font-semibold text-fg-default leading-tight\",\n});\n\nexport const hdNotifText = tv({\n base: \"text-body-xs font-normal text-fg-muted leading-snug line-clamp-2\",\n});\n\nexport const hdNotifTime = tv({\n base: \"text-caption-sm text-fg-subtle\",\n});\n\nexport const hdNotifDot = tv({\n base: \"shrink-0 mt-pad-xs w-[8px] h-[8px] rounded-full bg-bg-brand\",\n});\n\n/* ── Message item ─────────────────────────────────────────────────────────── */\nexport const hdMsg = tv({\n base: [\n \"relative flex items-center gap-gp-lg p-pad-lg rounded-radius-md text-left w-full\",\n \"bg-transparent border-0 cursor-pointer\",\n \"transition-colors duration-150\",\n \"hover:bg-bg-muted\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-secondary\",\n ],\n});\n\nexport const hdMsgAvatar = tv({\n base: [\n \"flex-none grid place-items-center w-icon-lg h-icon-lg rounded-full\",\n \"text-white text-caption-sm font-bold uppercase tracking-[0.02em] leading-none\",\n ],\n});\n\nexport const hdMsgBody = tv({\n base: \"flex-1 min-w-0 flex flex-col gap-gp-2xs\",\n});\n\nexport const hdMsgRow = tv({\n base: \"flex items-center justify-between gap-gp-sm\",\n});\n\nexport const hdMsgName = tv({\n base: \"text-body-sm font-semibold text-fg-default truncate\",\n});\n\nexport const hdMsgTime = tv({\n base: \"text-caption-sm text-fg-subtle shrink-0\",\n});\n\nexport const hdMsgPreviewRow = tv({\n base: \"flex items-center gap-gp-sm\",\n});\n\nexport const hdMsgPreview = tv({\n base: \"flex-1 min-w-0 text-body-xs font-normal text-fg-muted truncate\",\n});\n\nexport const hdMsgDot = tv({\n base: \"shrink-0 w-[8px] h-[8px] rounded-full bg-bg-brand\",\n});\n\n/* ── Footer ───────────────────────────────────────────────────────────────── */\nexport const hdFooter = tv({\n base: \"flex-none p-pad-md border-t border-border-subtle text-center\",\n});\n\nexport const hdFooterLink = tv({\n base: [\n \"inline-flex items-center justify-center gap-gp-sm\",\n \"h-form-sm px-pad-lg rounded-radius-md w-full\",\n \"text-body-sm font-medium text-fg-brand no-underline\",\n \"transition-colors duration-150\",\n \"hover:bg-bg-brand-subtle\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring-brand\",\n ],\n});\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 * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Dialog = DialogPrimitive.Root\r\n\r\nconst DialogTrigger = DialogPrimitive.Trigger\r\n\r\nconst DialogPortal = DialogPrimitive.Portal\r\n\r\nconst DialogClose = DialogPrimitive.Close\r\n\r\nconst DialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Overlay\r\n ref={ref}\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/30 supports-[backdrop-filter]:backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\r\n\r\nconst DialogContent = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\r\n /** Esconde o botão \"X\" (Close) no canto superior direito. Default: false. */\r\n hideClose?: boolean;\r\n }\r\n>(({ className, children, hideClose, ...props }, ref) => (\r\n <DialogPortal>\r\n <DialogOverlay />\r\n <DialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-gp-4xl rounded-radius-base bg-bg-surface p-pad-4xl text-body-md text-fg-default shadow-sh-xl outline-float duration-200 sm:max-w-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {!hideClose && (\r\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-radius-sm opacity-70 transition-opacity hover:opacity-100 outline-none ring-0 ring-ring-brand focus-visible:ring-4 disabled:pointer-events-none data-[state=open]:bg-bg-muted data-[state=open]:text-fg-muted\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n )}\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n))\r\nDialogContent.displayName = DialogPrimitive.Content.displayName\r\n\r\nconst DialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\"flex flex-col gap-gp-sm\", className)}\r\n {...props}\r\n />\r\n)\r\nDialogHeader.displayName = \"DialogHeader\"\r\n\r\nconst DialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse gap-gp-md sm:flex-row sm:justify-end\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogFooter.displayName = \"DialogFooter\"\r\n\r\nconst DialogTitle = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\r\n \"text-title-md font-medium text-fg-default leading-none\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogTitle.displayName = DialogPrimitive.Title.displayName\r\n\r\nconst DialogDescription = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-body-md text-fg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nDialogDescription.displayName = DialogPrimitive.Description.displayName\r\n\r\nexport {\r\n Dialog,\r\n DialogPortal,\r\n DialogOverlay,\r\n DialogClose,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { type DialogProps } from \"@radix-ui/react-dialog\"\r\nimport { Command as CommandPrimitive } from \"cmdk\"\r\nimport { Search } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/shadcn/dialog\"\r\n\r\n/**\r\n * Command — alinhado com o views-popover do design-and-table-v2.\r\n *\r\n * Estrutura:\r\n * - <Command> raiz (flex column)\r\n * - <CommandInput> = input \"real\" boxed (bg-input + border + radius-lg + shadow)\r\n * - <CommandList> com padding 4px\r\n * - <CommandGroup> heading uppercase + items\r\n * - <CommandItem> radius-lg (10px), px 12, py 8, font 13px, ícones 18px\r\n *\r\n * Pattern do input replica `.tbl-views-pop-search` exatamente.\r\n */\r\n\r\nconst Command = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive\r\n ref={ref}\r\n className={cn(\r\n \"flex h-full w-full flex-col overflow-hidden p-pad-xl bg-popover text-popover-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommand.displayName = CommandPrimitive.displayName\r\n\r\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\r\n return (\r\n <Dialog {...props}>\r\n <DialogContent\r\n hideClose\r\n // A11y: Radix exige título; aqui é sr-only (paleta de comando não tem\r\n // header visível) e opt-out de descrição.\r\n aria-describedby={undefined}\r\n className={cn(\r\n \"overflow-hidden p-0 gap-0 sm:max-w-[384px]\",\r\n \"rounded-[12px] border border-border-default\",\r\n // Outline padrão de elementos flutuantes\r\n \"outline-float\"\r\n )}\r\n >\r\n <DialogTitle className=\"sr-only\">Comando</DialogTitle>\r\n <Command>{children}</Command>\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n\r\n/* ── Input boxed (igual views-popover search) ─────────────────────────────── */\r\nconst CommandInput = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Input>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n cmdk-input-wrapper=\"\"\r\n className={cn(\r\n \"flex items-center gap-gp-md h-form-md px-pad-xl rounded-radius-lg\",\r\n \"bg-bg-input border border-border-subtle shadow-sh-sm\",\r\n \"transition-[border-color,box-shadow,background-color] duration-150\",\r\n \"focus-within:border-border-brand focus-within:shadow-sh-ring\",\r\n \"dark:bg-bg-muted dark:border-border-input dark:shadow-sh-none\"\r\n )}\r\n >\r\n <Search className=\"size-[14px] text-fg-muted shrink-0\" strokeWidth={1.8} />\r\n <CommandPrimitive.Input\r\n ref={ref}\r\n className={cn(\r\n \"flex-1 min-w-0 bg-transparent border-0 outline-none\",\r\n \"text-body-sm font-normal text-fg-default placeholder:text-fg-muted\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n))\r\nCommandInput.displayName = CommandPrimitive.Input.displayName\r\n\r\n/* ── List ─────────────────────────────────────────────────────────────────── */\r\nconst CommandList = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.List>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.List\r\n ref={ref}\r\n className={cn(\r\n \"max-h-[300px] overflow-y-auto overflow-x-hidden mt-pad-md scrollbar-thin\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandList.displayName = CommandPrimitive.List.displayName\r\n\r\nconst CommandEmpty = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Empty>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\r\n>((props, ref) => (\r\n <CommandPrimitive.Empty\r\n ref={ref}\r\n className=\"py-pad-5xl text-center text-body-md text-fg-muted\"\r\n {...props}\r\n />\r\n))\r\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\r\n\r\n/* ── Group (heading uppercase 28px, sem padding extra no group) ──────────── */\r\nconst CommandGroup = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Group>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Group\r\n ref={ref}\r\n className={cn(\r\n \"overflow-hidden text-fg-default\",\r\n \"[&_[cmdk-group-heading]]:flex [&_[cmdk-group-heading]]:items-center\",\r\n \"[&_[cmdk-group-heading]]:h-[28px] [&_[cmdk-group-heading]]:px-pad-xl\",\r\n \"[&_[cmdk-group-heading]]:text-caption-xs [&_[cmdk-group-heading]]:font-bold\",\r\n \"[&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider\",\r\n \"[&_[cmdk-group-heading]]:text-fg-subtle\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandGroup.displayName = CommandPrimitive.Group.displayName\r\n\r\nconst CommandSeparator = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"mx-pad-xs my-pad-xs h-px bg-border-default\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\r\n\r\n/* ── Item: px-12 py-8, radius-lg (10px), font 13px, ícones 18px ───────────── */\r\nconst CommandItem = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center gap-gp-md\",\r\n \"rounded-radius-lg px-pad-xl py-pad-md\",\r\n \"text-body-sm font-medium text-fg-muted\",\r\n \"outline-none transition-colors\",\r\n \"data-[selected='true']:bg-bg-muted data-[selected='true']:text-fg-default data-[selected='true']:[&_svg]:text-fg-default\",\r\n \"data-[disabled='true']:pointer-events-none data-[disabled='true']:opacity-50\",\r\n \"[&_svg]:pointer-events-none [&_svg]:size-[18px] [&_svg]:shrink-0 [&_svg]:text-fg-muted\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandItem.displayName = CommandPrimitive.Item.displayName\r\n\r\nconst CommandShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\r\n \"ml-auto text-caption-sm tracking-wider text-fg-subtle\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\nCommandShortcut.displayName = \"CommandShortcut\"\r\n\r\nexport {\r\n Command,\r\n CommandDialog,\r\n CommandInput,\r\n CommandList,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandItem,\r\n CommandShortcut,\r\n CommandSeparator,\r\n}\r\n","import { useEffect, useState } from \"react\";\nimport { Search } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/Button/button\";\nimport {\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandSeparator,\n CommandShortcut,\n} from \"@/components/shadcn/command\";\nimport {\n searchFakeInput,\n searchFakeInputIcon,\n searchFakeInputText,\n searchFakeInputKbd,\n} from \"./header.styles\";\nimport type { HeaderCommandGroup } from \"./header.types\";\n\nexport type HeaderSearchProps = {\n placeholder?: string;\n shortcut?: string;\n commandGroups?: HeaderCommandGroup[];\n commandPlaceholder?: string;\n commandEmptyMessage?: string;\n /** Atalho de teclado pra abrir (default: cmd/ctrl + k) */\n hotkey?: { key: string; meta?: boolean; ctrl?: boolean };\n className?: string;\n};\n\n/**\n * Fake input no header que abre Command palette ao click.\n * Atalho ⌘K (Mac) / Ctrl+K (Windows) registrado globalmente.\n */\nexport function HeaderSearch({\n placeholder = \"Buscar...\",\n shortcut = \"⌘K\",\n commandGroups = [],\n commandPlaceholder = \"Digite um comando ou busque...\",\n commandEmptyMessage = \"Nenhum resultado encontrado.\",\n hotkey = { key: \"k\", meta: true, ctrl: true },\n className,\n}: HeaderSearchProps) {\n const [open, setOpen] = useState(false);\n\n // Atalho global (⌘K / Ctrl+K)\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() !== hotkey.key.toLowerCase()) return;\n const meta = hotkey.meta && e.metaKey;\n const ctrl = hotkey.ctrl && e.ctrlKey;\n if (meta || ctrl) {\n e.preventDefault();\n setOpen((o) => !o);\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [hotkey.key, hotkey.meta, hotkey.ctrl]);\n\n return (\n <>\n {/* Desktop: fake input completo com placeholder + atalho */}\n <button\n type=\"button\"\n className={cn(searchFakeInput(), \"hidden md:inline-flex\", className)}\n onClick={() => setOpen(true)}\n aria-label=\"Abrir busca\"\n >\n <Search className={searchFakeInputIcon()} strokeWidth={1.8} />\n <span className={searchFakeInputText()}>{placeholder}</span>\n <kbd className={searchFakeInputKbd()}>{shortcut}</kbd>\n </button>\n\n {/* Mobile: icon-button (mesma altura/style dos triggers do header) */}\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"icon-sm\"\n className=\"md:hidden rounded-radius-md\"\n onClick={() => setOpen(true)}\n aria-label=\"Abrir busca\"\n title={`Buscar (${shortcut})`}\n >\n <Search />\n </Button>\n\n <CommandDialog open={open} onOpenChange={setOpen}>\n <CommandInput placeholder={commandPlaceholder} />\n <CommandList>\n <CommandEmpty>{commandEmptyMessage}</CommandEmpty>\n {commandGroups.map((group, gIdx) => (\n <CommandGroupBlock\n key={group.heading}\n group={group}\n isLast={gIdx === commandGroups.length - 1}\n onSelect={() => setOpen(false)}\n />\n ))}\n </CommandList>\n </CommandDialog>\n </>\n );\n}\n\nfunction CommandGroupBlock({\n group,\n isLast,\n onSelect,\n}: {\n group: HeaderCommandGroup;\n isLast: boolean;\n onSelect: () => void;\n}) {\n return (\n <>\n <CommandGroup heading={group.heading}>\n {group.items.map((item) => {\n const Icon = item.icon;\n return (\n <CommandItem\n key={item.id ?? item.label}\n value={item.id ?? item.label}\n keywords={item.keywords}\n onSelect={() => {\n item.onSelect();\n onSelect();\n }}\n className={item.destructive ? \"text-fg-danger [&_svg]:text-fg-danger\" : undefined}\n >\n {Icon && <Icon />}\n <span>{item.label}</span>\n {item.shortcut && <CommandShortcut>{item.shortcut}</CommandShortcut>}\n </CommandItem>\n );\n })}\n </CommandGroup>\n {!isLast && <CommandSeparator />}\n </>\n );\n}\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\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { chipVariants, type ChipVariantProps } from \"./chip.styles\";\r\n\r\nexport type ChipProps = Omit<\r\n React.ButtonHTMLAttributes<HTMLButtonElement> &\r\n React.HTMLAttributes<HTMLSpanElement>,\r\n \"color\"\r\n> &\r\n ChipVariantProps & {\r\n /** Conteúdo (label, ícone, etc) */\r\n children: ReactNode;\r\n /**\r\n * Quando passado, o chip vira `<button>` clicável. Se omitido,\r\n * renderiza como `<span>` estático (pra status/tag).\r\n */\r\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\r\n /** Força renderizar como button mesmo sem onClick */\r\n asButton?: boolean;\r\n };\r\n\r\n/**\r\n * Chip — pílula compacta pra status/tags/filtros/abas.\r\n *\r\n * Dual-mode:\r\n * - **Span estático** (default): usado pra Badge-like (status, categoria, count)\r\n * - **Button interativo**: quando recebe `onClick` OU `asButton`\r\n *\r\n * Pra grupo de seleção (radio/checkbox via chips), use `<ChipGroup>`.\r\n *\r\n * Variantes:\r\n * - `color`: primary | neutral | danger | warning | success | info (default `neutral`)\r\n * - `variant`: solid | outline | soft (default `soft`)\r\n * - `size`: sm (24px) | md (28px) | lg (32px) (default `md`)\r\n */\r\nexport const Chip = forwardRef<HTMLElement, ChipProps>(function Chip(\r\n {\r\n children,\r\n color,\r\n variant,\r\n size,\r\n shape,\r\n selected,\r\n onClick,\r\n asButton,\r\n className,\r\n type,\r\n ...rest\r\n },\r\n ref,\r\n) {\r\n const interactive = Boolean(onClick) || asButton === true;\r\n const classes = cn(\r\n chipVariants({ color, variant, size, shape, interactive, selected }),\r\n className,\r\n );\r\n\r\n if (interactive) {\r\n return (\r\n <button\r\n ref={ref as React.Ref<HTMLButtonElement>}\r\n type={type ?? \"button\"}\r\n onClick={onClick}\r\n className={classes}\r\n aria-pressed={selected}\r\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\r\n >\r\n {children}\r\n </button>\r\n );\r\n }\r\n\r\n return (\r\n <span\r\n ref={ref as React.Ref<HTMLSpanElement>}\r\n className={classes}\r\n {...(rest as React.HTMLAttributes<HTMLSpanElement>)}\r\n >\r\n {children}\r\n </span>\r\n );\r\n});\r\n","import { createContext, forwardRef, useContext, type ReactNode } from \"react\";\r\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { chipVariants, type ChipVariantProps } from \"./chip.styles\";\r\n\r\ntype ChipColor = NonNullable<ChipVariantProps[\"color\"]>;\r\ntype ChipVariant = NonNullable<ChipVariantProps[\"variant\"]>;\r\ntype ChipSize = NonNullable<ChipVariantProps[\"size\"]>;\r\ntype ChipShape = NonNullable<ChipVariantProps[\"shape\"]>;\r\n\r\n/* ── Classes do estado SELECTED (data-state=on) por color × variant ── */\r\n/**\r\n * Mapeamento color × variant → classes aplicadas em items selecionados\r\n * (Radix dá `data-state=\"on\"` quando ativo).\r\n *\r\n * Inclui todas as 4 variants × 6 cores = 24 combos.\r\n */\r\nconst SELECTED_CLASSES: Record<ChipColor, Record<ChipVariant, string>> = {\r\n primary: {\r\n solid: \"data-[state=on]:bg-bg-brand data-[state=on]:text-fg-on-brand data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-brand data-[state=on]:text-fg-brand data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-brand-subtle data-[state=on]:text-fg-brand data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-brand-subtle data-[state=on]:border-border-brand data-[state=on]:text-fg-brand\",\r\n },\r\n neutral: {\r\n solid: \"data-[state=on]:bg-bg-muted data-[state=on]:text-fg-default data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-default data-[state=on]:text-fg-default data-[state=on]:bg-transparent\",\r\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\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-muted data-[state=on]:border-border-default data-[state=on]:text-fg-default\",\r\n },\r\n danger: {\r\n solid: \"data-[state=on]:bg-bg-danger data-[state=on]:text-fg-on-danger data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-danger-muted data-[state=on]:text-fg-danger data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-danger-muted data-[state=on]:text-fg-danger data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-danger-muted data-[state=on]:border-border-danger-muted data-[state=on]:text-fg-danger\",\r\n },\r\n warning: {\r\n solid: \"data-[state=on]:bg-bg-warning data-[state=on]:text-fg-on-warning data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-warning-muted data-[state=on]:text-fg-warning data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-warning-muted data-[state=on]:text-fg-warning data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-warning-muted data-[state=on]:border-border-warning-muted data-[state=on]:text-fg-warning\",\r\n },\r\n success: {\r\n solid: \"data-[state=on]:bg-bg-success data-[state=on]:text-fg-on-success data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-success-muted data-[state=on]:text-fg-success data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-success-muted data-[state=on]:text-fg-success data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-success-muted data-[state=on]:border-border-success-muted data-[state=on]:text-fg-success\",\r\n },\r\n info: {\r\n solid: \"data-[state=on]:bg-bg-info data-[state=on]:text-fg-on-info data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-info-muted data-[state=on]:text-fg-info data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-info-muted data-[state=on]:text-fg-info data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-info-muted data-[state=on]:border-border-info-muted data-[state=on]:text-fg-info\",\r\n },\r\n};\r\n\r\n/* ── ChipGroup root ──────────────────────────────────────────────── */\r\n\r\ntype CommonProps = {\r\n /** Cor do estado INATIVO (default `\"neutral\"`) */\r\n inactiveColor?: ChipColor;\r\n /** Variant do estado INATIVO (default `\"outline\"`) */\r\n inactiveVariant?: ChipVariant;\r\n /** Cor do estado ATIVO (default `\"primary\"`) */\r\n activeColor?: ChipColor;\r\n /** Variant do estado ATIVO (default `\"soft-outline\"`) */\r\n activeVariant?: ChipVariant;\r\n /** Size aplicado em todos os chips do grupo */\r\n size?: ChipSize;\r\n /** Shape aplicado em todos os chips (default `\"pill\"`) */\r\n shape?: ChipShape;\r\n /** Direção do grupo */\r\n orientation?: \"horizontal\" | \"vertical\";\r\n /** Aria-label do grupo */\r\n ariaLabel?: string;\r\n className?: string;\r\n children: ReactNode;\r\n};\r\n\r\ntype SingleProps = CommonProps & {\r\n type: \"single\";\r\n value?: string;\r\n defaultValue?: string;\r\n onValueChange?: (value: string) => void;\r\n};\r\n\r\ntype MultipleProps = CommonProps & {\r\n type: \"multiple\";\r\n value?: string[];\r\n defaultValue?: string[];\r\n onValueChange?: (value: string[]) => void;\r\n};\r\n\r\nexport type ChipGroupProps = SingleProps | MultipleProps;\r\n\r\n/**\r\n * ChipGroup — agrupa chips com seleção controlada.\r\n *\r\n * - `type=\"single\"`: escolha única (radio-like)\r\n * - `type=\"multiple\"`: escolha múltipla (checkbox-like)\r\n *\r\n * **Estado visual configurável independentemente:**\r\n * - `inactiveColor` + `inactiveVariant` → estilo dos items NÃO selecionados\r\n * (default: `neutral` + `outline`)\r\n * - `activeColor` + `activeVariant` → estilo dos items SELECIONADOS\r\n * (default: `primary` + `soft-outline`)\r\n *\r\n * Usa `@radix-ui/react-toggle-group` por baixo.\r\n */\r\nexport const ChipGroup = forwardRef<HTMLDivElement, ChipGroupProps>(\r\n function ChipGroup(props, ref) {\r\n const {\r\n inactiveColor = \"neutral\",\r\n inactiveVariant = \"outline\",\r\n activeColor = \"primary\",\r\n activeVariant = \"soft-outline\",\r\n size = \"md\",\r\n shape = \"pill\",\r\n orientation = \"horizontal\",\r\n ariaLabel,\r\n className,\r\n children,\r\n } = props;\r\n\r\n const contextValue = {\r\n inactiveColor,\r\n inactiveVariant,\r\n activeColor,\r\n activeVariant,\r\n size,\r\n shape,\r\n };\r\n\r\n if (props.type === \"single\") {\r\n return (\r\n <ChipGroupContext.Provider value={contextValue}>\r\n <ToggleGroupPrimitive.Root\r\n ref={ref}\r\n type=\"single\"\r\n value={props.value}\r\n defaultValue={props.defaultValue}\r\n onValueChange={props.onValueChange as (v: string) => void}\r\n orientation={orientation}\r\n aria-label={ariaLabel}\r\n className={cn(\r\n \"inline-flex items-center gap-gp-sm\",\r\n orientation === \"vertical\" && \"flex-col\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </ToggleGroupPrimitive.Root>\r\n </ChipGroupContext.Provider>\r\n );\r\n }\r\n\r\n return (\r\n <ChipGroupContext.Provider value={contextValue}>\r\n <ToggleGroupPrimitive.Root\r\n ref={ref}\r\n type=\"multiple\"\r\n value={props.value}\r\n defaultValue={props.defaultValue}\r\n onValueChange={props.onValueChange as (v: string[]) => void}\r\n orientation={orientation}\r\n aria-label={ariaLabel}\r\n className={cn(\r\n \"inline-flex items-center gap-gp-sm\",\r\n orientation === \"vertical\" && \"flex-col\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </ToggleGroupPrimitive.Root>\r\n </ChipGroupContext.Provider>\r\n );\r\n },\r\n);\r\n\r\n/* ── Context ─────────────────────────────────────────────────────── */\r\ntype ChipGroupContextValue = {\r\n inactiveColor: ChipColor;\r\n inactiveVariant: ChipVariant;\r\n activeColor: ChipColor;\r\n activeVariant: ChipVariant;\r\n size: ChipSize;\r\n shape: ChipShape;\r\n};\r\n\r\nconst ChipGroupContext = createContext<ChipGroupContextValue>({\r\n inactiveColor: \"neutral\",\r\n inactiveVariant: \"outline\",\r\n activeColor: \"primary\",\r\n activeVariant: \"soft-outline\",\r\n size: \"md\",\r\n shape: \"pill\",\r\n});\r\n\r\n/* ── ChipGroupItem ───────────────────────────────────────────────── */\r\n\r\nexport type ChipGroupItemProps = Omit<\r\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item>,\r\n \"color\"\r\n>;\r\n\r\n/**\r\n * ChipGroupItem — item dentro do `<ChipGroup>`. Visual gerenciado pelo\r\n * grupo via context: estilo `inactive*` quando OFF e `active*` quando ON.\r\n *\r\n * <ChipGroup type=\"single\" inactiveVariant=\"outline\" activeVariant=\"soft-outline\">\r\n * <ChipGroupItem value=\"all\">Todas</ChipGroupItem>\r\n * <ChipGroupItem value=\"unread\">Não lidas</ChipGroupItem>\r\n * </ChipGroup>\r\n */\r\nexport const ChipGroupItem = forwardRef<HTMLButtonElement, ChipGroupItemProps>(\r\n function ChipGroupItem({ className, children, ...rest }, ref) {\r\n const {\r\n inactiveColor,\r\n inactiveVariant,\r\n activeColor,\r\n activeVariant,\r\n size,\r\n shape,\r\n } = useContext(ChipGroupContext);\r\n\r\n return (\r\n <ToggleGroupPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n // Estado OFF — visual inativo (passa pelo chipVariants normal)\r\n chipVariants({\r\n color: inactiveColor,\r\n variant: inactiveVariant,\r\n size,\r\n shape,\r\n interactive: true,\r\n }),\r\n // Estado ON — override via data-state=on com classes do active*\r\n SELECTED_CLASSES[activeColor][activeVariant],\r\n className,\r\n )}\r\n {...rest}\r\n >\r\n {children}\r\n </ToggleGroupPrimitive.Item>\r\n );\r\n },\r\n);\r\n","import * as React from \"react\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\n/**\r\n * Popover — primitives baixo nível pra menus flutuantes (Cols, Sort, Filter, Views).\r\n *\r\n * Visual unificado com DropdownMenu/Select: bg-bg-dropdown (frosted-glass no\r\n * dark via `before:backdrop-blur-2xl`), border-default, radius 12px, shadow-lg\r\n * + outline-float (halo). Padronizado pra evitar inconsistência visual entre\r\n * menus de ação (DropdownMenu) e menus de configuração (Popover de Filtros,\r\n * Sort, Cols, Views).\r\n *\r\n * Não tem `Item` próprio — o consumer monta o conteúdo do popover livremente.\r\n * Pra menus de ação com items semânticos, prefira `DropdownMenu`.\r\n */\r\n\r\nconst Popover = PopoverPrimitive.Root;\r\nconst PopoverTrigger = PopoverPrimitive.Trigger;\r\nconst PopoverAnchor = PopoverPrimitive.Anchor;\r\nconst PopoverClose = PopoverPrimitive.Close;\r\n\r\n/* ── Mobile sheet (<md) ───────────────────────────────────────────────\r\n * Em telas <md o conteúdo vira sheet bottom-up colado nas bordas: full-width,\r\n * só cantos superiores arredondados, flush, sem outline/shadow, cap 92vh.\r\n * O wrapper do Radix Popper é reposicionado no globals.css via a regra\r\n * `[data-radix-popper-content-wrapper]:has([data-mobile-sheet])` (mesma usada\r\n * pelo DropdownMenu). Animação: neutraliza o zoom e desliza de baixo. */\r\nconst POPOVER_MOBILE_SHEET = [\r\n \"max-md:w-full max-md:min-w-0 max-md:max-w-none\",\r\n \"max-md:!max-h-[92vh]\",\r\n \"max-md:rounded-b-none max-md:rounded-t-[12px]\",\r\n \"max-md:border-x-0 max-md:border-b-0\",\r\n \"max-md:outline-none max-md:shadow-none\",\r\n // Respiro de 20px (pad-3xl) no rodapé pra o conteúdo (footer/última seção)\r\n // não colar na borda inferior do device quando vira sheet.\r\n \"max-md:pb-pad-3xl\",\r\n \"max-md:data-[state=open]:zoom-in-100 max-md:data-[state=closed]:zoom-out-100\",\r\n \"max-md:data-[state=open]:slide-in-from-bottom-12 max-md:data-[state=closed]:slide-out-to-bottom-12\",\r\n].join(\" \");\r\n\r\n/** Backdrop suave — só mobile (md:hidden). Toque fecha via dismiss do Radix. */\r\nconst PopoverSheetBackdrop = () => (\r\n <div\r\n aria-hidden=\"true\"\r\n className=\"fixed inset-0 z-[55] bg-overlay-scrim pointer-events-auto md:hidden animate-in fade-in-0 duration-150\"\r\n />\r\n);\r\n\r\ntype PopoverContentProps = React.ComponentPropsWithoutRef<\r\n typeof PopoverPrimitive.Content\r\n> & {\r\n /**\r\n * Renderiza o conteúdo SEM `<Portal>`. Útil quando o conteúdo interno usa\r\n * libs como dnd-kit que conflitam com o transform do Floating UI do Portal.\r\n * Default `false` (usa portal — comportamento padrão).\r\n */\r\n disablePortal?: boolean;\r\n /**\r\n * Em telas <md, transforma o popover em **sheet bottom-up** colado nas bordas,\r\n * com backdrop suave (toque fora fecha). No desktop não muda nada. Default `true`.\r\n * Passe `false` pra manter o popover ancorado no trigger também em mobile.\r\n * (Mesmo nome da prop do `DropdownMenu` — comportamento consistente.)\r\n */\r\n mobileSheet?: boolean;\r\n};\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n PopoverContentProps\r\n>(\r\n (\r\n { className, align = \"center\", sideOffset = 6, disablePortal, mobileSheet = true, ...props },\r\n ref,\r\n ) => {\r\n const content = (\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n data-mobile-sheet={mobileSheet ? \"\" : undefined}\r\n className={cn(\r\n \"relative z-50\",\r\n // Unificado com DropdownMenu/Select: bg-bg-dropdown (frosted no dark)\r\n // + border-border-default + outline-float. O `before` pseudo-element\r\n // aplica o blur backdrop (necessário pra bg-bg-dropdown semi-transparente\r\n // render correto no dark mode).\r\n \"bg-bg-dropdown\",\r\n \"border border-border-default rounded-[12px] 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 \"text-fg-default\",\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 \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\r\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n mobileSheet && POPOVER_MOBILE_SHEET,\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n\r\n if (disablePortal) {\r\n // Sem portal: backdrop inline (fixed escapa do flow mesmo assim).\r\n return mobileSheet ? (\r\n <>\r\n <PopoverSheetBackdrop />\r\n {content}\r\n </>\r\n ) : (\r\n content\r\n );\r\n }\r\n\r\n // Com portal: backdrop em Portal próprio (cada Portal Radix aceita 1 filho\r\n // e é montado/desmontado junto com o popover via Presence).\r\n return (\r\n <>\r\n {mobileSheet && (\r\n <PopoverPrimitive.Portal>\r\n <PopoverSheetBackdrop />\r\n </PopoverPrimitive.Portal>\r\n )}\r\n <PopoverPrimitive.Portal>{content}</PopoverPrimitive.Portal>\r\n </>\r\n );\r\n },\r\n);\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\r\n\r\nexport { Popover, PopoverTrigger, PopoverAnchor, PopoverClose, PopoverContent };\r\n","import { useState } from \"react\";\nimport { Bell, CheckCheck, MoreHorizontal } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/Button/button\";\nimport { ChipGroup, ChipGroupItem } from \"@/components/ui/Chip\";\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"@/components/shadcn/popover\";\nimport {\n headerIconBtnBadge,\n hdTop,\n hdHeader,\n hdTitle,\n hdTitleCount,\n hdHeaderActions,\n hdBody,\n hdEmpty,\n hdEmptyText,\n hdNotif,\n hdNotifIcon,\n hdNotifBody,\n hdNotifTitle,\n hdNotifText,\n hdNotifTime,\n hdNotifDot,\n hdFooter,\n hdFooterLink,\n} from \"./header.styles\";\nimport type {\n HeaderNotification,\n HeaderNotificationFilter,\n HeaderNotificationsConfig,\n} from \"./header.types\";\n\nconst DEFAULT_FILTERS: HeaderNotificationFilter[] = [\n { id: \"all\", label: \"Todas\", predicate: () => true },\n { id: \"unread\", label: \"Não lidas\", predicate: (n) => !!n.unread },\n { id: \"mentions\", label: \"Menções\", predicate: (n) => n.kind === \"mention\" },\n];\n\nexport type HeaderNotificationsProps = {\n config: HeaderNotificationsConfig;\n className?: string;\n};\n\nexport function HeaderNotifications({ config, className }: HeaderNotificationsProps) {\n const {\n items,\n filters = DEFAULT_FILTERS,\n emptyMessage = \"Nenhuma notificação por aqui.\",\n onMarkAllRead,\n onMoreActions,\n onViewAll,\n viewAllLabel = \"Ver todas as notificações\",\n } = config;\n\n const [open, setOpen] = useState(false);\n const [activeFilter, setActiveFilter] = useState(filters[0]?.id ?? \"all\");\n\n const unreadCount = items.filter((n) => n.unread).length;\n\n const filtered = items.filter(\n filters.find((f) => f.id === activeFilter)?.predicate ?? (() => true)\n );\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"icon-sm\"\n className=\"rounded-radius-md relative\"\n aria-label=\"Notificações\"\n title=\"Notificações\"\n >\n <Bell />\n {unreadCount > 0 && (\n <span className={headerIconBtnBadge({ kind: \"danger\" })} aria-hidden=\"true\" />\n )}\n </Button>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"end\"\n // mobileSheet (default true): no mobile vira sheet bottom-up colado nas\n // bordas em vez de popover cortando na tela.\n className={cn(\n \"w-[380px] max-w-[calc(100vw-32px)] max-h-[520px] p-0 flex flex-col overflow-hidden\",\n className,\n )}\n aria-label=\"Notificações\"\n >\n <div className={hdTop()}>\n <div className={hdHeader()}>\n <div className={hdTitle()}>\n <span>Notificações</span>\n {unreadCount > 0 && <span className={hdTitleCount()}>{unreadCount}</span>}\n </div>\n <div className={hdHeaderActions()}>\n {onMarkAllRead && (\n <Button\n color=\"secondary\"\n variant=\"ghost\"\n size=\"icon-2xs\"\n className=\"rounded-radius-sm\"\n title=\"Marcar todas como lidas\"\n onClick={onMarkAllRead}\n >\n <CheckCheck />\n </Button>\n )}\n {onMoreActions && (\n <Button\n color=\"secondary\"\n variant=\"ghost\"\n size=\"icon-2xs\"\n className=\"rounded-radius-sm\"\n title=\"Mais ações\"\n onClick={onMoreActions}\n >\n <MoreHorizontal />\n </Button>\n )}\n </div>\n </div>\n\n {filters.length > 0 && (\n <ChipGroup\n type=\"single\"\n value={activeFilter}\n onValueChange={(v) => v && setActiveFilter(v)}\n size=\"lg\"\n ariaLabel=\"Filtrar notificações\"\n >\n {filters.map((f) => {\n const count = items.filter(f.predicate ?? (() => true)).length;\n return (\n <ChipGroupItem key={f.id} value={f.id}>\n {f.label}\n {count > 0 && ` (${count})`}\n </ChipGroupItem>\n );\n })}\n </ChipGroup>\n )}\n </div>\n\n <div className={hdBody()}>\n {filtered.length === 0 ? (\n <div className={hdEmpty()}>\n <Bell size={28} strokeWidth={1.4} />\n <p className={hdEmptyText()}>{emptyMessage}</p>\n </div>\n ) : (\n filtered.map((n) => <NotificationRow key={n.id} item={n} />)\n )}\n </div>\n\n {onViewAll && (\n <div className={hdFooter()}>\n <a\n href=\"#\"\n className={hdFooterLink()}\n onClick={(e) => {\n e.preventDefault();\n onViewAll();\n setOpen(false);\n }}\n >\n {viewAllLabel}\n </a>\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction NotificationRow({ item }: { item: HeaderNotification }) {\n const Icon = item.icon;\n return (\n <button\n type=\"button\"\n className={hdNotif()}\n onClick={item.onClick}\n >\n <span\n className={hdNotifIcon()}\n style={{ color: item.color, background: `${item.color}1f` }}\n aria-hidden=\"true\"\n >\n <Icon size={15} strokeWidth={1.8} />\n </span>\n <span className={hdNotifBody()}>\n <span className={hdNotifTitle()}>{item.title}</span>\n <span className={hdNotifText()}>{item.body}</span>\n <span className={hdNotifTime()}>{item.time}</span>\n </span>\n {item.unread && <span className={hdNotifDot()} aria-label=\"não lida\" />}\n </button>\n );\n}\n","import * as React from \"react\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\n/**\r\n * InputGroup — composição rica pra inputs com addons (prefixo, sufixo, ícone, botão).\r\n *\r\n * Estrutura:\r\n * <InputGroup>\r\n * <InputGroupAddon align=\"inline-start\"><Icon /></InputGroupAddon>\r\n * <InputGroupInput placeholder=\"...\" />\r\n * <InputGroupAddon align=\"inline-end\">\r\n * <InputGroupButton><X /></InputGroupButton>\r\n * </InputGroupAddon>\r\n * </InputGroup>\r\n *\r\n * Visual alinhado com `.tbl-form-input` (mesmo bg/border/radius do <Input>).\r\n * State (default/error/warning/success) afeta borda + focus ring (shadow-sh-ring-*).\r\n */\r\n\r\nexport type InputGroupState = \"default\" | \"error\" | \"warning\" | \"success\";\r\n\r\n/* ── Wrapper ─────────────────────────────────────────────────────────────── */\r\nconst inputGroupVariants = cva(\r\n [\r\n \"group/input-group relative flex w-full items-center\",\r\n \"bg-bg-input dark:bg-bg-muted\",\r\n \"hover:bg-bg-input-hover dark:hover:bg-bg-muted-hover\",\r\n \"border border-border-input rounded-radius-lg\",\r\n \"transition-[border-color,box-shadow,background-color] outline-none\",\r\n \"has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50 has-[input:disabled]:hover:bg-bg-input dark:has-[input:disabled]:hover:bg-bg-muted\",\r\n ],\r\n {\r\n variants: {\r\n size: {\r\n xxs: \"min-h-form-xs px-pad-md gap-gp-xs rounded-radius-md text-body-sm font-normal\",\r\n xs: \"min-h-form-sm px-pad-xl gap-gp-md rounded-radius-md text-body-sm font-normal\",\r\n sm: \"min-h-form-md px-pad-xl gap-gp-md rounded-radius-lg text-body-sm font-normal\",\r\n md: \"min-h-form-lg px-pad-xl gap-gp-md rounded-radius-lg text-body-sm font-normal\",\r\n },\r\n state: {\r\n default: \"focus-within:border-border-brand focus-within:shadow-sh-ring\",\r\n error: \"border-border-danger-muted focus-within:border-border-danger-muted focus-within:shadow-sh-ring-danger\",\r\n warning: \"border-border-warning-muted focus-within:border-border-warning-muted focus-within:shadow-sh-ring-warning\",\r\n success: \"border-border-success-muted focus-within:border-border-success-muted focus-within:shadow-sh-ring-success\",\r\n },\r\n },\r\n defaultVariants: { size: \"md\", state: \"default\" },\r\n },\r\n);\r\n\r\nexport type InputGroupVariantProps = VariantProps<typeof inputGroupVariants>;\r\n\r\nexport interface InputGroupProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n InputGroupVariantProps {}\r\n\r\nexport const InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\r\n ({ className, size, state, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n role=\"group\"\r\n data-slot=\"input-group\"\r\n className={cn(inputGroupVariants({ size, state }), className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\nInputGroup.displayName = \"InputGroup\";\r\n\r\n/* ── Input (sem bg/border — herda do wrapper) ─────────────────────────── */\r\nconst inputGroupInputVariants = cva([\r\n \"flex-1 min-w-0 bg-transparent border-0 outline-none\",\r\n \"text-body-sm font-normal text-fg-default placeholder:text-fg-muted placeholder:opacity-70\",\r\n \"disabled:cursor-not-allowed\",\r\n \"file:inline-flex file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-fg-default\",\r\n]);\r\n\r\nexport interface InputGroupInputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement> {}\r\n\r\nexport const InputGroupInput = React.forwardRef<\r\n HTMLInputElement,\r\n InputGroupInputProps\r\n>(({ className, type, ...props }, ref) => (\r\n <input\r\n ref={ref}\r\n type={type}\r\n data-slot=\"input-group-input\"\r\n className={cn(inputGroupInputVariants(), className)}\r\n {...props}\r\n />\r\n));\r\nInputGroupInput.displayName = \"InputGroupInput\";\r\n\r\n/* ── Textarea ──────────────────────────────────────────────────────────── */\r\nconst inputGroupTextareaVariants = cva([\r\n \"flex-1 min-w-0 bg-transparent border-0 outline-none resize-y\",\r\n \"py-pad-md\",\r\n \"text-body-sm font-normal leading-[1.5] text-fg-default placeholder:text-fg-muted placeholder:opacity-70\",\r\n \"disabled:cursor-not-allowed\",\r\n]);\r\n\r\nexport interface InputGroupTextareaProps\r\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\r\n\r\nexport const InputGroupTextarea = React.forwardRef<\r\n HTMLTextAreaElement,\r\n InputGroupTextareaProps\r\n>(({ className, ...props }, ref) => (\r\n <textarea\r\n ref={ref}\r\n data-slot=\"input-group-textarea\"\r\n className={cn(inputGroupTextareaVariants(), className)}\r\n {...props}\r\n />\r\n));\r\nInputGroupTextarea.displayName = \"InputGroupTextarea\";\r\n\r\n/* ── Addon (prefix/suffix slot) ───────────────────────────────────────── */\r\nconst inputGroupAddonVariants = cva(\r\n \"flex items-center text-fg-muted shrink-0 select-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n {\r\n variants: {\r\n align: {\r\n // Inline = horizontal (start/end do eixo do texto)\r\n \"inline-start\": \"\",\r\n \"inline-end\": \"\",\r\n // Block = vertical (top/bottom — multi-linha em textarea)\r\n \"block-start\": \"\",\r\n \"block-end\": \"\",\r\n },\r\n },\r\n defaultVariants: { align: \"inline-start\" },\r\n },\r\n);\r\n\r\nexport type InputGroupAddonAlign =\r\n | \"inline-start\"\r\n | \"inline-end\"\r\n | \"block-start\"\r\n | \"block-end\";\r\n\r\nexport interface InputGroupAddonProps\r\n extends React.HTMLAttributes<HTMLDivElement> {\r\n align?: InputGroupAddonAlign;\r\n}\r\n\r\nexport const InputGroupAddon = React.forwardRef<\r\n HTMLDivElement,\r\n InputGroupAddonProps\r\n>(({ className, align = \"inline-start\", onClick, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n role=\"group\"\r\n data-slot=\"input-group-addon\"\r\n data-align={align}\r\n className={cn(inputGroupAddonVariants({ align }), className)}\r\n onClick={(e) => {\r\n // Click no addon (ícone, texto, espaço vazio) → foca o input do grupo.\r\n // Botões dentro do addon (`InputGroupButton`) continuam funcionando.\r\n if ((e.target as HTMLElement).closest(\"button\")) {\r\n onClick?.(e);\r\n return;\r\n }\r\n e.currentTarget.parentElement\r\n ?.querySelector<HTMLInputElement | HTMLTextAreaElement>(\r\n \"input, textarea\",\r\n )\r\n ?.focus();\r\n onClick?.(e);\r\n }}\r\n {...props}\r\n />\r\n));\r\nInputGroupAddon.displayName = \"InputGroupAddon\";\r\n\r\n/* ── Text (texto formatado dentro do addon) ───────────────────────────── */\r\nexport interface InputGroupTextProps\r\n extends React.HTMLAttributes<HTMLSpanElement> {}\r\n\r\nexport const InputGroupText = React.forwardRef<\r\n HTMLSpanElement,\r\n InputGroupTextProps\r\n>(({ className, ...props }, ref) => (\r\n <span\r\n ref={ref}\r\n data-slot=\"input-group-text\"\r\n className={cn(\r\n \"text-body-xs text-fg-muted whitespace-nowrap\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nInputGroupText.displayName = \"InputGroupText\";\r\n\r\n/* ── Button (botão dentro do addon — ex copy/clear) ───────────────────── */\r\nconst inputGroupButtonVariants = cva(\r\n [\r\n \"inline-flex items-center justify-center shrink-0\",\r\n \"rounded-radius-md transition-colors outline-none cursor-pointer\",\r\n \"focus-visible:ring-4 focus-visible:ring-ring-brand\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"[&_svg]:size-4 [&_svg]:shrink-0\",\r\n ],\r\n {\r\n variants: {\r\n size: {\r\n xs: \"h-form-xs px-pad-md gap-gp-xs text-body-xs font-normal\",\r\n \"icon-xs\": \"size-form-xs\",\r\n sm: \"h-form-sm px-pad-lg gap-gp-md text-body-xs font-normal\",\r\n \"icon-sm\": \"size-form-sm\",\r\n },\r\n variant: {\r\n default: \"bg-bg-muted text-fg-default hover:bg-bg-muted-hover\",\r\n destructive: \"bg-bg-danger text-fg-on-danger hover:bg-bg-danger-hover\",\r\n outline: \"border border-border-input bg-transparent text-fg-default hover:bg-bg-muted\",\r\n secondary: \"bg-bg-emphasis text-fg-default hover:bg-bg-muted-hover\",\r\n ghost: \"bg-transparent text-fg-muted hover:bg-bg-muted hover:text-fg-default\",\r\n link: \"bg-transparent text-fg-brand underline-offset-4 hover:underline\",\r\n },\r\n },\r\n defaultVariants: { size: \"xs\", variant: \"ghost\" },\r\n },\r\n);\r\n\r\nexport interface InputGroupButtonProps\r\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"size\">,\r\n VariantProps<typeof inputGroupButtonVariants> {}\r\n\r\nexport const InputGroupButton = React.forwardRef<\r\n HTMLButtonElement,\r\n InputGroupButtonProps\r\n>(({ className, size, variant, type = \"button\", ...props }, ref) => (\r\n <button\r\n ref={ref}\r\n type={type}\r\n data-slot=\"input-group-button\"\r\n className={cn(inputGroupButtonVariants({ size, variant }), className)}\r\n {...props}\r\n />\r\n));\r\nInputGroupButton.displayName = \"InputGroupButton\";\r\n\r\nexport {\r\n inputGroupVariants,\r\n inputGroupInputVariants,\r\n inputGroupTextareaVariants,\r\n inputGroupAddonVariants,\r\n inputGroupButtonVariants,\r\n};\r\n","import { useState } from \"react\";\nimport { MessageSquare, PenLine, Maximize2, Search } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/Button/button\";\nimport { ChipGroup, ChipGroupItem } from \"@/components/ui/Chip\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/components/shadcn/input-group\";\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"@/components/shadcn/popover\";\nimport {\n headerIconBtnBadge,\n hdTop,\n hdHeader,\n hdTitle,\n hdTitleCount,\n hdHeaderActions,\n hdBody,\n hdEmpty,\n hdEmptyText,\n hdMsg,\n hdMsgAvatar,\n hdMsgBody,\n hdMsgRow,\n hdMsgName,\n hdMsgTime,\n hdMsgPreviewRow,\n hdMsgPreview,\n hdMsgDot,\n hdFooter,\n hdFooterLink,\n} from \"./header.styles\";\nimport type {\n HeaderMessage,\n HeaderMessageFilter,\n HeaderMessagesConfig,\n} from \"./header.types\";\n\nconst DEFAULT_FILTERS: HeaderMessageFilter[] = [\n { id: \"all\", label: \"Tudo\", predicate: () => true },\n { id: \"unread\", label: \"Não lidas\", predicate: (m) => !!m.unread },\n { id: \"groups\", label: \"Grupos\", predicate: (m) => !!m.group },\n];\n\nexport type HeaderMessagesProps = {\n config: HeaderMessagesConfig;\n className?: string;\n};\n\nexport function HeaderMessages({ config, className }: HeaderMessagesProps) {\n const {\n items,\n filters = DEFAULT_FILTERS,\n showSearch = true,\n searchPlaceholder = \"Pesquisar conversas...\",\n emptyMessage = \"Nenhuma conversa encontrada.\",\n onNewMessage,\n onExpand,\n onViewAll,\n viewAllLabel = \"Ver todas no Chat Interno\",\n } = config;\n\n const [open, setOpen] = useState(false);\n const [activeFilter, setActiveFilter] = useState(filters[0]?.id ?? \"all\");\n const [search, setSearch] = useState(\"\");\n\n const unreadCount = items.filter((m) => m.unread).length;\n\n const filtered = items\n .filter(filters.find((f) => f.id === activeFilter)?.predicate ?? (() => true))\n .filter((m) =>\n search ? m.name.toLowerCase().includes(search.toLowerCase()) : true\n );\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"icon-sm\"\n className=\"rounded-radius-md relative\"\n aria-label=\"Mensagens\"\n title=\"Mensagens\"\n >\n <MessageSquare />\n {unreadCount > 0 && (\n <span className={headerIconBtnBadge({ kind: \"brand\" })} aria-hidden=\"true\" />\n )}\n </Button>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"end\"\n className={cn(\n \"w-[380px] max-w-[calc(100vw-32px)] max-h-[520px] p-0 flex flex-col overflow-hidden\",\n className,\n )}\n aria-label=\"Mensagens\"\n >\n <div className={hdTop()}>\n <div className={hdHeader()}>\n <div className={hdTitle()}>\n <span>Conversas</span>\n {unreadCount > 0 && <span className={hdTitleCount()}>{unreadCount}</span>}\n </div>\n <div className={hdHeaderActions()}>\n {onNewMessage && (\n <Button\n color=\"secondary\"\n variant=\"ghost\"\n size=\"icon-2xs\"\n className=\"rounded-radius-sm\"\n title=\"Nova mensagem\"\n onClick={onNewMessage}\n >\n <PenLine />\n </Button>\n )}\n {onExpand && (\n <Button\n color=\"secondary\"\n variant=\"ghost\"\n size=\"icon-2xs\"\n className=\"rounded-radius-sm\"\n title=\"Expandir\"\n onClick={onExpand}\n >\n <Maximize2 />\n </Button>\n )}\n </div>\n </div>\n\n {showSearch && (\n <InputGroup size=\"sm\">\n <InputGroupAddon align=\"inline-start\">\n <Search strokeWidth={1.8} />\n </InputGroupAddon>\n <InputGroupInput\n type=\"text\"\n placeholder={searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </InputGroup>\n )}\n\n {filters.length > 0 && (\n <ChipGroup\n type=\"single\"\n value={activeFilter}\n onValueChange={(v) => v && setActiveFilter(v)}\n size=\"lg\"\n ariaLabel=\"Filtrar mensagens\"\n >\n {filters.map((f) => {\n const count = items.filter(f.predicate ?? (() => true)).length;\n return (\n <ChipGroupItem key={f.id} value={f.id}>\n {f.label}\n {count > 0 && ` (${count})`}\n </ChipGroupItem>\n );\n })}\n </ChipGroup>\n )}\n </div>\n\n <div className={hdBody()}>\n {filtered.length === 0 ? (\n <div className={hdEmpty()}>\n <MessageSquare size={28} strokeWidth={1.4} />\n <p className={hdEmptyText()}>{emptyMessage}</p>\n </div>\n ) : (\n filtered.map((m) => <MessageRow key={m.id} item={m} />)\n )}\n </div>\n\n {onViewAll && (\n <div className={hdFooter()}>\n <a\n href=\"#\"\n className={hdFooterLink()}\n onClick={(e) => {\n e.preventDefault();\n onViewAll();\n setOpen(false);\n }}\n >\n {viewAllLabel}\n </a>\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction MessageRow({ item }: { item: HeaderMessage }) {\n return (\n <button\n type=\"button\"\n className={hdMsg()}\n onClick={item.onClick}\n title={`Conversar com ${item.name}`}\n >\n {item.avatarUrl ? (\n <img\n src={item.avatarUrl}\n alt={item.name}\n className=\"flex-none w-icon-lg h-icon-lg rounded-full object-cover\"\n />\n ) : (\n <span className={hdMsgAvatar()} style={{ backgroundColor: item.color }}>\n {item.initials}\n </span>\n )}\n <span className={hdMsgBody()}>\n <span className={hdMsgRow()}>\n <span className={hdMsgName()}>{item.name}</span>\n <span className={hdMsgTime()}>{item.time}</span>\n </span>\n <span className={hdMsgPreviewRow()}>\n <span className={hdMsgPreview()}>{item.preview}</span>\n {item.unread && <span className={hdMsgDot()} aria-label=\"não lida\" />}\n </span>\n </span>\n </button>\n );\n}\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\r\nimport { Check, ChevronRight } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\n/**\r\n * DropdownMenu — alinhado com `.tbl-row-actions-menu` / `.tbl-more-menu`\r\n * do design-and-table-v2.\r\n *\r\n * Container:\r\n * - bg-bg-dropdown (token frosted-glass — solid no light, 70% transparent + blur no dark)\r\n * - border 1px + radius 12px + padding 6px + shadow-lg\r\n * - min-w 180px, items separados por 1px (gap-px)\r\n *\r\n * Item:\r\n * - h variavel, padding 8/10, radius 6px, gap 10, font 13px medium\r\n * - rest: fg-muted (texto + ícone), hover/focus: bg-muted + fg-default\r\n * - variant=\"destructive\": fg-danger + hover bg-danger-muted\r\n *\r\n * Divider:\r\n * - 1px bg-border-default com margin 4px (não estende além do padding)\r\n */\r\n\r\nconst DropdownMenu = DropdownMenuPrimitive.Root\r\n\r\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\r\n\r\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\r\n\r\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\r\n\r\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\r\n\r\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\r\n\r\n/* ── Container (Content + SubContent) ─────────────────────────────────────── */\r\nconst CONTAINER_CLASSES = [\r\n \"relative z-50 min-w-[180px] overflow-hidden\",\r\n \"flex flex-col gap-px\",\r\n \"rounded-[12px] bg-bg-dropdown p-pad-sm\",\r\n \"border border-border-default shadow-sh-lg\",\r\n // Outline padrão de elementos flutuantes\r\n \"outline-float\",\r\n \"text-fg-muted\",\r\n // Frosted-glass blur (necessário pra fazer o bg-dropdown semi-transparent render correto no dark)\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 // Animações Radix\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 \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\r\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n \"origin-[--radix-dropdown-menu-content-transform-origin]\",\r\n].join(\" \")\r\n\r\n/* ── Mobile sheet (só Content, <md) ───────────────────────────────────────\r\n * Em telas <md o Content vira sheet bottom-up colado nas bordas: full-width,\r\n * só cantos superiores arredondados, flush, sem outline/shadow, cap 92vh.\r\n * O reposicionamento do wrapper Radix é feito no globals.css via [data-mobile-sheet].\r\n * Animação: neutraliza o zoom e desliza de baixo (sobrescreve os slides por side).\r\n */\r\nconst MOBILE_SHEET_CLASSES = [\r\n \"max-md:w-full max-md:min-w-0 max-md:max-w-none\",\r\n \"max-md:!max-h-[92vh]\",\r\n \"max-md:rounded-b-none max-md:rounded-t-[12px]\",\r\n \"max-md:border-x-0 max-md:border-b-0\",\r\n \"max-md:outline-none max-md:shadow-none\",\r\n \"max-md:data-[state=open]:zoom-in-100 max-md:data-[state=closed]:zoom-out-100\",\r\n \"max-md:data-[state=open]:slide-in-from-bottom-12 max-md:data-[state=closed]:slide-out-to-bottom-12\",\r\n].join(\" \")\r\n\r\n/* ── Item base ────────────────────────────────────────────────────────────── */\r\nconst ITEM_BASE = [\r\n \"relative flex cursor-default select-none items-center\",\r\n \"gap-pad-lg px-pad-lg py-pad-md rounded-radius-sm\",\r\n \"text-body-sm font-medium\",\r\n \"outline-none transition-colors\",\r\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n].join(\" \")\r\n\r\nconst ITEM_VARIANT_DEFAULT = [\r\n \"text-fg-muted [&_svg]:text-fg-muted\",\r\n \"focus:bg-bg-muted focus:text-fg-default focus:[&_svg]:text-fg-default\",\r\n].join(\" \")\r\n\r\nconst ITEM_VARIANT_DESTRUCTIVE = [\r\n \"text-fg-danger [&_svg]:text-fg-danger\",\r\n \"focus:bg-bg-danger-muted focus:text-fg-danger focus:[&_svg]:text-fg-danger\",\r\n].join(\" \")\r\n\r\n/* ── SubTrigger ───────────────────────────────────────────────────────────── */\r\nconst DropdownMenuSubTrigger = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubTrigger\r\n ref={ref}\r\n className={cn(\r\n ITEM_BASE,\r\n ITEM_VARIANT_DEFAULT,\r\n \"data-[state=open]:bg-bg-muted data-[state=open]:text-fg-default\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRight className=\"ml-auto\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n))\r\nDropdownMenuSubTrigger.displayName =\r\n DropdownMenuPrimitive.SubTrigger.displayName\r\n\r\n/* ── SubContent ───────────────────────────────────────────────────────────── */\r\nconst DropdownMenuSubContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubContent\r\n ref={ref}\r\n className={cn(CONTAINER_CLASSES, className)}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSubContent.displayName =\r\n DropdownMenuPrimitive.SubContent.displayName\r\n\r\n/* ── Content ──────────────────────────────────────────────────────────────── */\r\nconst DropdownMenuContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & {\r\n /**\r\n * Em telas <md, transforma o menu em sheet bottom-up colado nas bordas,\r\n * com backdrop suave (toque fora fecha via dismiss do Radix). Default true.\r\n * Passe `false` pra manter o popover ancorado no trigger também em mobile.\r\n */\r\n mobileSheet?: boolean\r\n }\r\n>(({ className, sideOffset = 8, mobileSheet = true, ...props }, ref) => (\r\n <>\r\n {/* Backdrop suave — só mobile (md:hidden), em Portal próprio (cada Portal\r\n Radix aceita 1 filho e é montado/desmontado junto com o menu via Presence).\r\n\r\n ⚠️ pointer-events-NONE (não auto). O DropdownMenu do Radix abre no\r\n `pointerdown`; o backdrop monta via React no meio do gesto e, com\r\n pointer-events-auto, captura o `pointerup`/`click` seguinte → o menu\r\n abre e fecha no mesmo toque (bug do avatar/UserMenu dentro do drawer\r\n mobile). Com pointer-events-none o gesto de abertura passa direto e o\r\n dismiss por toque-fora continua funcionando (Radix escuta pointerdown\r\n a nível de document, independente do backdrop capturar). z-[55] fica\r\n acima do drawer mobile (z-50) só pra escurecer; o Content vai a z-60. */}\r\n {mobileSheet && (\r\n <DropdownMenuPrimitive.Portal>\r\n <div\r\n aria-hidden=\"true\"\r\n className=\"fixed inset-0 z-[55] bg-overlay-scrim pointer-events-none md:hidden animate-in fade-in-0 duration-150\"\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n )}\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n data-mobile-sheet={mobileSheet ? \"\" : undefined}\r\n className={cn(\r\n CONTAINER_CLASSES,\r\n \"max-h-[var(--radix-dropdown-menu-content-available-height)] overflow-y-auto overflow-x-hidden\",\r\n mobileSheet && MOBILE_SHEET_CLASSES,\r\n className\r\n )}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n </>\r\n))\r\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\r\n\r\n/* ── Item ─────────────────────────────────────────────────────────────────── */\r\nconst DropdownMenuItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean\r\n /** Variante semântica — \"destructive\" pinta fg-danger e usa bg-danger-muted no hover */\r\n variant?: \"default\" | \"destructive\"\r\n }\r\n>(({ className, inset, variant = \"default\", ...props }, ref) => (\r\n <DropdownMenuPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n ITEM_BASE,\r\n variant === \"destructive\" ? ITEM_VARIANT_DESTRUCTIVE : ITEM_VARIANT_DEFAULT,\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\r\n\r\n/* ── CheckboxItem ─────────────────────────────────────────────────────────── */\r\nconst DropdownMenuCheckboxItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\r\n>(({ className, children, checked, ...props }, ref) => (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n ref={ref}\r\n className={cn(\r\n ITEM_BASE,\r\n ITEM_VARIANT_DEFAULT,\r\n \"pl-8 pr-pad-lg\",\r\n className\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"absolute left-pad-md flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n))\r\nDropdownMenuCheckboxItem.displayName =\r\n DropdownMenuPrimitive.CheckboxItem.displayName\r\n\r\n/* ── RadioItem ────────────────────────────────────────────────────────────── */\r\n/**\r\n * RadioItem — item selecionado ganha tom brand:\r\n * - rest: fg-muted (igual default item)\r\n * - hover: bg-muted + fg-default (igual default item)\r\n * - checked: bg-bg-brand-subtle + fg-fg-brand (estado ativo destacado)\r\n *\r\n * Indicator: `<Check />` consistente com `<DropdownMenuCheckboxItem>` (antes era `<Circle />`).\r\n */\r\nconst DropdownMenuRadioItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\r\n>(({ className, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.RadioItem\r\n ref={ref}\r\n className={cn(\r\n ITEM_BASE,\r\n ITEM_VARIANT_DEFAULT,\r\n \"pl-8 pr-pad-lg\",\r\n // Selected state — brand tint (mantém no focus pra não voltar pra muted)\r\n \"data-[state=checked]:bg-bg-brand-subtle data-[state=checked]:text-fg-brand\",\r\n \"data-[state=checked]:[&_svg]:text-fg-brand\",\r\n \"data-[state=checked]:focus:bg-bg-brand-subtle data-[state=checked]:focus:text-fg-brand\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-pad-md flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"size-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n))\r\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\r\n\r\n/* ── Label ────────────────────────────────────────────────────────────────── */\r\nconst DropdownMenuLabel = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Label\r\n ref={ref}\r\n className={cn(\r\n \"px-pad-lg py-pad-sm text-caption-sm font-semibold uppercase tracking-wider text-fg-subtle\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\r\n\r\n/* ── Separator (divider) ──────────────────────────────────────────────────── */\r\nconst DropdownMenuSeparator = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"mx-pad-xs my-pad-xs h-px bg-border-default\", className)}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\r\n\r\n/* ── Shortcut (texto à direita do item) ───────────────────────────────────── */\r\nconst DropdownMenuShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\"ml-auto text-caption-sm tracking-wider text-fg-subtle\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuGroup,\r\n DropdownMenuPortal,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuRadioGroup,\r\n}\r\n","import { Check, Sun, Moon } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"@/components/shadcn/dropdown-menu\";\nimport { Button } from \"@/components/ui/Button/button\";\nimport type { HeaderThemeOption } from \"./header.types\";\n\nconst DEFAULT_OPTIONS: HeaderThemeOption[] = [\n { id: \"light\", label: \"Claro\", icon: Sun },\n { id: \"dark\", label: \"Escuro\", icon: Moon },\n];\n\nexport type HeaderThemeSwitcherProps = {\n theme: string;\n onThemeChange: (id: string) => void;\n options?: HeaderThemeOption[];\n className?: string;\n};\n\nexport function HeaderThemeSwitcher({\n theme,\n onThemeChange,\n options = DEFAULT_OPTIONS,\n className,\n}: HeaderThemeSwitcherProps) {\n const current = options.find((o) => o.id === theme) ?? options[0];\n const CurrentIcon = current?.icon ?? Sun;\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n color=\"secondary\"\n variant=\"outline\"\n size=\"icon-sm\"\n className={cn(\"rounded-radius-md\", className)}\n aria-label=\"Trocar tema\"\n title={`Tema: ${current?.label ?? \"\"}`}\n >\n <CurrentIcon />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" sideOffset={8} className=\"min-w-[160px]\">\n {options.map((opt) => {\n const Icon = opt.icon;\n const isActive = opt.id === theme;\n return (\n <DropdownMenuItem\n key={opt.id}\n onSelect={() => onThemeChange(opt.id)}\n >\n <Icon />\n <span className=\"flex-1\">{opt.label}</span>\n {isActive && <Check className=\"text-fg-brand\" />}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\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","/**\n * Logo iGreen — default usado no rail.\n * Single-color (currentColor) pra herdar o fg-on-brand.\n */\nexport function SidebarBrandIcon({ size = 18 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size * (25 / 18)}\n viewBox=\"0 0 46 64\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-label=\"iGreen\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\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\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\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\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Plus } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n sidebarRail,\n sidebarRailBrand,\n sidebarRailList,\n sidebarRailItem,\n sidebarRailActiveBar,\n sidebarRailTooltip,\n sidebarRailAdd,\n sidebarRailUser,\n sidebarRailUserDefault,\n} from \"./sidebar.styles\";\nimport { SidebarBrandIcon } from \"./sidebar-brand\";\nimport type { SidebarContext } from \"./sidebar.types\";\n\nexport type SidebarRailProps = {\n contexts: SidebarContext[];\n activeContextId: string;\n onContextChange: (id: string) => void;\n brand?: ReactNode;\n user?: ReactNode;\n showAdd?: boolean;\n onAddClick?: () => void;\n className?: string;\n};\n\nexport function SidebarRail({\n contexts,\n activeContextId,\n onContextChange,\n brand,\n user,\n showAdd = false,\n onAddClick,\n className,\n}: SidebarRailProps) {\n return (\n <aside className={cn(sidebarRail(), className)}>\n <a href=\"/\" className={sidebarRailBrand()} aria-label=\"Home\">\n {brand ?? <SidebarBrandIcon />}\n </a>\n\n <div className={sidebarRailList()}>\n {contexts.map((ctx) => {\n const Icon = ctx.icon;\n const isActive = activeContextId === ctx.id;\n return (\n <button\n key={ctx.id}\n type=\"button\"\n className={sidebarRailItem({ active: isActive })}\n onClick={() => onContextChange(ctx.id)}\n aria-label={ctx.label}\n aria-current={isActive ? \"page\" : undefined}\n >\n <Icon size={18} strokeWidth={1.7} />\n {isActive && <span className={sidebarRailActiveBar()} aria-hidden=\"true\" />}\n <span className={sidebarRailTooltip()}>{ctx.label}</span>\n </button>\n );\n })}\n\n {showAdd && (\n <button\n type=\"button\"\n className={sidebarRailAdd()}\n onClick={onAddClick}\n aria-label=\"Adicionar contexto\"\n >\n <Plus size={16} strokeWidth={2} />\n </button>\n )}\n </div>\n\n {user !== null && (\n <div className={sidebarRailUser()}>\n {user ?? <div className={sidebarRailUserDefault()}>SV</div>}\n </div>\n )}\n </aside>\n );\n}\n","import { forwardRef } from \"react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n sidebarItem,\n sidebarItemIcon,\n sidebarItemText,\n sidebarPill,\n} from \"./sidebar.styles\";\nimport type { SidebarMenuItem, SidebarBadgeKind } from \"./sidebar.types\";\n\nexport type SidebarItemProps = {\n item: SidebarMenuItem;\n active?: boolean;\n subitem?: boolean;\n /** Quando true, o ícone usa cor de brand (usado em groups com filho ativo) */\n iconBrand?: boolean;\n onClick?: (e: MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => void;\n className?: string;\n};\n\nexport const SidebarItem = forwardRef<HTMLAnchorElement | HTMLButtonElement, SidebarItemProps>(\n ({ item, active, subitem, iconBrand, onClick, className }, ref) => {\n const Icon = item.icon;\n const classes = cn(sidebarItem({ active, subitem }), className);\n\n const content: ReactNode = (\n <>\n {Icon && (\n <Icon\n size={subitem ? 15 : 17}\n strokeWidth={1.7}\n className={sidebarItemIcon({ active, parentActive: iconBrand })}\n />\n )}\n <span className={sidebarItemText()}>{item.name}</span>\n {item.badge && (\n <SidebarPill kind={item.badgeKind} active={active}>\n {item.badge}\n </SidebarPill>\n )}\n </>\n );\n\n const handleClick = (e: MouseEvent<HTMLAnchorElement | HTMLButtonElement>) => {\n if (item.onClick) item.onClick(e);\n onClick?.(e);\n };\n\n if (item.href) {\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={item.href}\n className={classes}\n onClick={handleClick}\n aria-current={active ? \"page\" : undefined}\n >\n {content}\n </a>\n );\n }\n\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n className={classes}\n onClick={handleClick}\n aria-current={active ? \"page\" : undefined}\n >\n {content}\n </button>\n );\n }\n);\nSidebarItem.displayName = \"SidebarItem\";\n\n/* ── Pill (badge) ─────────────────────────────────────────────────────────── */\nexport function SidebarPill({\n kind,\n active,\n children,\n className,\n}: {\n kind?: SidebarBadgeKind;\n active?: boolean;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <span className={cn(sidebarPill({ kind, active }), className)}>\n {children}\n </span>\n );\n}\n","import { useState } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n sidebarItem,\n sidebarItemIcon,\n sidebarItemText,\n sidebarSubgroupRoot,\n sidebarSubgroupChev,\n sidebarSubgroupList,\n} from \"./sidebar.styles\";\nimport { SidebarItem } from \"./sidebar-item\";\nimport type { SidebarMenuItem } from \"./sidebar.types\";\n\nexport type SidebarSubgroupProps = {\n item: SidebarMenuItem;\n activeItemHref?: string;\n onItemClick?: (item: SidebarMenuItem) => void;\n /** Estado controlado de collapse — se omitido, gerencia internamente */\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n};\n\nexport function SidebarSubgroup({\n item,\n activeItemHref,\n onItemClick,\n open,\n defaultOpen,\n onOpenChange,\n className,\n}: SidebarSubgroupProps) {\n const hasActiveChild = item.subitems?.some(\n (s) => s.href !== undefined && s.href === activeItemHref\n );\n\n const [internalOpen, setInternalOpen] = useState<boolean>(\n defaultOpen ?? item.defaultOpen ?? hasActiveChild ?? false\n );\n const isOpen = open ?? internalOpen;\n const collapsed = !isOpen;\n\n const setOpen = (next: boolean) => {\n if (open === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n const Icon = item.icon;\n\n return (\n <div className={cn(sidebarSubgroupRoot(), className)}>\n <button\n type=\"button\"\n className={cn(sidebarItem(), \"select-none\")}\n onClick={() => setOpen(!isOpen)}\n aria-expanded={isOpen}\n aria-controls={`subgroup-${item.name}`}\n >\n {Icon && (\n <Icon\n size={17}\n strokeWidth={1.7}\n className={sidebarItemIcon({ parentActive: hasActiveChild })}\n />\n )}\n <span className={sidebarItemText()}>{item.name}</span>\n <ChevronDown\n size={13}\n strokeWidth={2}\n className={sidebarSubgroupChev({ collapsed })}\n />\n </button>\n\n <div id={`subgroup-${item.name}`} className={sidebarSubgroupList({ collapsed })}>\n {item.subitems?.map((sub) => (\n <SidebarItem\n key={sub.href ?? sub.name}\n item={sub}\n subitem\n active={sub.href !== undefined && sub.href === activeItemHref}\n onClick={() => onItemClick?.(sub)}\n />\n ))}\n </div>\n </div>\n );\n}\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 type { SidebarSection as SidebarSectionData } 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 className?: string;\r\n};\r\n\r\nexport function SidebarSection({\r\n section,\r\n open,\r\n onOpenChange,\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 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 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 `<button>` ─────────────────────────────────── */\r\nfunction SidebarSectionLink({\r\n href,\r\n onClick,\r\n title,\r\n children,\r\n}: {\r\n href?: string;\r\n onClick?: (e: MouseEvent<HTMLAnchorElement>) => void;\r\n title?: string;\r\n children: React.ReactNode;\r\n}) {\r\n const handleClick = (e: MouseEvent<HTMLAnchorElement>) => {\r\n if (!href || href === \"#\") e.preventDefault();\r\n onClick?.(e);\r\n };\r\n\r\n return (\r\n <a\r\n href={href ?? \"#\"}\r\n className={sidebarSectionItem()}\r\n onClick={handleClick}\r\n title={title}\r\n >\r\n {children}\r\n </a>\r\n );\r\n}\r\n","import type { ReactNode } from \"react\";\nimport { ChevronDown, Check } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"@/components/shadcn/dropdown-menu\";\nimport {\n sidebarPanel,\n sidebarPanelHeader,\n sidebarPanelTitle,\n sidebarPanelBody,\n sidebarPanelGroup,\n} from \"./sidebar.styles\";\nimport { SidebarItem } from \"./sidebar-item\";\nimport { SidebarSubgroup } from \"./sidebar-subgroup\";\nimport { SidebarSection } from \"./sidebar-section\";\nimport type { SidebarContext, SidebarMenuItem } from \"./sidebar.types\";\n\nexport type SidebarPanelProps = {\n context: SidebarContext;\n collapsed?: boolean;\n /** Quando true: panel renderiza como overlay absoluto (hover-to-expand) */\n floating?: boolean;\n /** Quando true (mobile): panel preenche o drawer full-screen (flex-1). */\n mobile?: boolean;\n activeItemHref?: string;\n onItemClick?: (item: SidebarMenuItem) => void;\n /** Quando passados, o título vira um dropdown switcher de contextos */\n contexts?: SidebarContext[];\n onContextChange?: (id: string) => void;\n /** Fallback: callback ao clicar no título (usado quando contexts não passado) */\n onTitleClick?: () => void;\n /** Conteúdo custom no body (substitui items/sections quando passado) */\n children?: ReactNode;\n className?: string;\n};\n\nexport function SidebarPanel({\n context,\n collapsed,\n floating,\n mobile,\n activeItemHref,\n onItemClick,\n contexts,\n onContextChange,\n onTitleClick,\n children,\n className,\n}: SidebarPanelProps) {\n const hasSwitcher = contexts && contexts.length > 1 && onContextChange;\n\n return (\n <aside\n className={cn(sidebarPanel({ collapsed, floating, mobile }), className)}\n aria-hidden={collapsed}\n >\n <div className={sidebarPanelHeader()}>\n {hasSwitcher ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" className={sidebarPanelTitle()}>\n <span className=\"flex-1 min-w-0 whitespace-nowrap overflow-hidden text-ellipsis\">\n {context.label}\n </span>\n <ChevronDown\n size={14}\n strokeWidth={2}\n className=\"flex-none w-[14px] h-[14px] text-fg-muted\"\n />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" sideOffset={6} className=\"min-w-[220px]\">\n {contexts.map((ctx) => {\n const Icon = ctx.icon;\n const isActive = ctx.id === context.id;\n return (\n <DropdownMenuItem\n key={ctx.id}\n onSelect={() => onContextChange?.(ctx.id)}\n >\n <Icon className=\"size-4 text-fg-muted\" strokeWidth={1.7} />\n <span className=\"flex-1 truncate\">{ctx.label}</span>\n {isActive && <Check className=\"size-4 text-fg-brand\" strokeWidth={2} />}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <button type=\"button\" className={sidebarPanelTitle()} onClick={onTitleClick}>\n <span className=\"flex-1 min-w-0 whitespace-nowrap overflow-hidden text-ellipsis\">\n {context.label}\n </span>\n <ChevronDown\n size={14}\n strokeWidth={2}\n className=\"flex-none w-[14px] h-[14px] text-fg-muted\"\n />\n </button>\n )}\n </div>\n\n <div className={sidebarPanelBody()}>\n {children ?? (\n <>\n <div className={sidebarPanelGroup()}>\n {context.items.map((item) => {\n if (item.subitems && item.subitems.length > 0) {\n return (\n <SidebarSubgroup\n key={item.name}\n item={item}\n activeItemHref={activeItemHref}\n onItemClick={onItemClick}\n />\n );\n }\n return (\n <SidebarItem\n key={item.href ?? item.name}\n item={item}\n active={item.href !== undefined && item.href === activeItemHref}\n onClick={() => onItemClick?.(item)}\n />\n );\n })}\n </div>\n\n {context.sections?.map((section) => (\n <SidebarSection key={section.id} section={section} />\n ))}\n </>\n )}\n </div>\n </aside>\n );\n}\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\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\nimport {\n sidebarRoot,\n sidebarMobileBackdrop,\n sidebarMobileCloseBtn,\n} from \"./sidebar.styles\";\nimport { SidebarRail } from \"./sidebar-rail\";\nimport { SidebarPanel } from \"./sidebar-panel\";\nimport { useControllable } from \"./use-sidebar-state\";\nimport { useMediaQuery } from \"./use-media-query\";\nimport type { SidebarProps, SidebarMenuItem } from \"./sidebar.types\";\n\n/**\n * MenuSidebar — composição completa (rail + panel) data-driven.\n *\n * Modo all-in-one: passa `contexts` e o componente gerencia tudo.\n * Para composição manual, use os subcomponentes:\n * `<SidebarRail>` + `<SidebarPanel>` + `<SidebarItem>` + `<SidebarSubgroup>` + `<SidebarSection>`.\n *\n * Estados controlled/uncontrolled:\n * - activeContextId / defaultActiveContextId / onContextChange\n * - activeItemHref / defaultActiveItemHref / onItemClick\n * - panelCollapsed / defaultPanelCollapsed / onPanelCollapseChange\n *\n * Hover-to-expand (desktop):\n * - `expandOnHover` (default true) + estado colapsado → panel vira overlay flutuante.\n *\n * Mobile responsive:\n * - Detecta breakpoint (default `max-md` = 767px) via matchMedia.\n * - Mobile: vira drawer fixed overlay; panel sempre aberto (sem rail-only);\n * close button (X) no canto + backdrop scrim clicável pra fechar.\n * - Estado: mobileOpen / defaultMobileOpen / onMobileOpenChange.\n * - Trigger externo: qualquer botão que altere `mobileOpen` (hamburger no header da app).\n */\nexport function MenuSidebar({\n contexts,\n brand,\n user,\n showRailAdd,\n onRailAddClick,\n activeContextId,\n defaultActiveContextId,\n onContextChange,\n activeItemHref,\n defaultActiveItemHref,\n onItemClick,\n panelCollapsed,\n defaultPanelCollapsed,\n onPanelCollapseChange,\n expandOnHover = true,\n onPanelTitleClick,\n mobileOpen,\n defaultMobileOpen,\n onMobileOpenChange,\n mobileBreakpoint = \"(max-width: 767px)\",\n className,\n}: SidebarProps) {\n const isMobile = useMediaQuery(mobileBreakpoint);\n\n const [ctxId, setCtxId] = useControllable<string>(\n activeContextId,\n defaultActiveContextId ?? contexts[0]?.id ?? \"\",\n onContextChange\n );\n\n const [itemHref, setItemHref] = useControllable<string>(\n activeItemHref,\n defaultActiveItemHref ?? \"\",\n () => {}\n );\n\n const [collapsed] = useControllable<boolean>(\n panelCollapsed,\n defaultPanelCollapsed ?? false,\n onPanelCollapseChange\n );\n\n const [openMobile, setOpenMobile] = useControllable<boolean>(\n mobileOpen,\n defaultMobileOpen ?? false,\n onMobileOpenChange\n );\n\n /**\n * Hover-to-expand: 2 states pra preservar overlay durante animação de saída.\n *\n * - `hoverExpanded` = true enquanto o cursor está sobre a sidebar\n * - `hoverExiting` = true por 200ms após mouseleave (duração da transition\n * de width no panel — `transition-[width,opacity,...]\n * duration-200`)\n *\n * Bug original: ao mouseleave, hoverExpanded virava false instantâneo. O\n * panel perdia `position: absolute` (vira `relative`) com width ainda em\n * 264px e entrava no fluxo flex — empurrava o main area por 200ms até a\n * width animar de 264→0. Visual de \"card empurrado e volta\".\n *\n * Fix: durante `hoverExiting`, mantém `floating: true` (position absolute) +\n * passa `collapsed: true` pro panel — width anima 264→0 DENTRO do overlay,\n * sem afetar o fluxo. Depois de 200ms, hoverExiting=false e a sidebar volta\n * ao layout normal (já com width=0).\n */\n const [hoverExpanded, setHoverExpanded] = useState(false);\n const [hoverExiting, setHoverExiting] = useState(false);\n const exitTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (exitTimerRef.current) clearTimeout(exitTimerRef.current);\n };\n }, []);\n\n const shouldFloat =\n !isMobile && !!expandOnHover && collapsed && (hoverExpanded || hoverExiting);\n\n const activeContext = contexts.find((c) => c.id === ctxId) ?? contexts[0];\n\n const handleItemClick = (item: SidebarMenuItem) => {\n if (item.href && activeItemHref === undefined) {\n setItemHref(item.href);\n }\n onItemClick?.(item);\n // Mobile: fecha após selecionar (UX padrão de drawer)\n if (isMobile && item.href) setOpenMobile(false);\n };\n\n return (\n <>\n {/* Backdrop mobile — clicável pra fechar */}\n {isMobile && openMobile && (\n <div\n className={sidebarMobileBackdrop()}\n onClick={() => setOpenMobile(false)}\n aria-hidden=\"true\"\n />\n )}\n\n <div\n className={cn(\n sidebarRoot({ mobile: isMobile, mobileOpen: isMobile && openMobile }),\n className\n )}\n onMouseEnter={() => {\n if (!isMobile && expandOnHover && collapsed) {\n // Cancela timer de saída se reentra antes de 200ms (evita flash)\n if (exitTimerRef.current) {\n clearTimeout(exitTimerRef.current);\n exitTimerRef.current = null;\n }\n setHoverExiting(false);\n setHoverExpanded(true);\n }\n }}\n onMouseLeave={() => {\n setHoverExpanded(false);\n // Mantém floating=true durante a animação 200ms da width voltando a 0,\n // pra panel encolher dentro do overlay (não empurrar o main area).\n if (!isMobile && expandOnHover && collapsed) {\n setHoverExiting(true);\n if (exitTimerRef.current) clearTimeout(exitTimerRef.current);\n exitTimerRef.current = setTimeout(() => {\n setHoverExiting(false);\n exitTimerRef.current = null;\n }, 200);\n }\n }}\n >\n <SidebarRail\n contexts={contexts}\n activeContextId={ctxId}\n onContextChange={setCtxId}\n brand={brand}\n user={user}\n showAdd={showRailAdd}\n onAddClick={onRailAddClick}\n />\n {activeContext && (\n <SidebarPanel\n context={activeContext}\n // collapsed lógico:\n // - mobile: nunca colapsado (drawer overlay tem sua própria lógica)\n // - hover entering (hoverExpanded): expanded dentro do overlay\n // - hover exiting (hoverExiting): collapsed (width animando 264→0)\n // mantendo floating=true pra animar DENTRO do overlay\n // - sem hover, estado base: respeita `collapsed` controlled\n collapsed={\n isMobile ? false : hoverExpanded ? false : collapsed\n }\n floating={shouldFloat}\n mobile={isMobile}\n activeItemHref={itemHref}\n onItemClick={handleItemClick}\n contexts={contexts}\n onContextChange={setCtxId}\n onTitleClick={onPanelTitleClick}\n />\n )}\n\n {/* Close button — só no mobile aberto */}\n {isMobile && openMobile && (\n <button\n type=\"button\"\n className={sidebarMobileCloseBtn()}\n onClick={() => setOpenMobile(false)}\n aria-label=\"Fechar menu\"\n >\n <X size={18} strokeWidth={1.7} />\n </button>\n )}\n </div>\n </>\n );\n}\n","import * as React from \"react\"\r\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Avatar = React.forwardRef<\r\n React.ElementRef<typeof AvatarPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\r\n>(({ className, ...props }, ref) => (\r\n <AvatarPrimitive.Root\r\n ref={ref}\r\n className={cn(\r\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nAvatar.displayName = AvatarPrimitive.Root.displayName\r\n\r\nconst AvatarImage = React.forwardRef<\r\n React.ElementRef<typeof AvatarPrimitive.Image>,\r\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\r\n>(({ className, ...props }, ref) => (\r\n <AvatarPrimitive.Image\r\n ref={ref}\r\n className={cn(\"aspect-square h-full w-full\", className)}\r\n {...props}\r\n />\r\n))\r\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\r\n\r\n/**\r\n * AvatarFallback — `text-body-sm font-normal` (13px) como default mais compacto.\r\n *\r\n * Antes usava `text-body-md font-medium` (14px) que ficava grande demais em avatares\r\n * pequenos (≤24px), forçando consumer a sobrescrever via className. Caption\r\n * é mais seguro como default — consumer ainda pode override (ex: `text-caption-xs`\r\n * pra container muito pequeno, ou `text-body-lg font-medium` pra avatar grande).\r\n */\r\nconst AvatarFallback = React.forwardRef<\r\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\r\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\r\n>(({ className, ...props }, ref) => (\r\n <AvatarPrimitive.Fallback\r\n ref={ref}\r\n className={cn(\r\n \"flex h-full w-full items-center justify-center rounded-full bg-bg-muted text-fg-muted text-body-sm font-normal\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\r\n\r\nexport { Avatar, AvatarImage, AvatarFallback }\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\";\n\n/**\n * Slots do `<AppShell>` template.\n *\n * Layout 2-column: sidebar à esquerda (fixa, full-height) + main area\n * à direita (Header sticky no topo + body abaixo).\n *\n * Body recebe `gap-gp-4xl` (24px) e `p-pad-6xl` (32px) por design — slot\n * \"padronizado\" pra todas as telas. Consumer customiza só os filhos.\n */\n\nexport const root = tv({\n base: [\n \"flex h-screen w-full bg-bg-canvas\",\n \"overflow-hidden\", // garante que sidebar + main não vazem viewport\n ],\n});\n\n/** Wrapper da área principal (Header + Body). Ocupa o resto do flex row. */\nexport const main = tv({\n base: [\n \"flex flex-col flex-1 min-w-0\",\n \"overflow-hidden\",\n ],\n});\n\n/**\n * Body slot — wrapper externo do conteúdo da tela. Gerencia scroll.\n * `min-h-0` permite o body shrink dentro do flex pai pra scroll interno\n * funcionar (children podem ter `overflow-auto` ou `flex-1 min-h-0` próprio).\n *\n * O padding + gap + max-width ficam no `bodyInner` (slot interno) — assim\n * o scroll continua na viewport inteira mesmo em layout=compact.\n */\nexport const body = tv({\n base: [\n \"flex flex-col flex-1 min-h-0\",\n \"overflow-auto scrollbar-thin\",\n ],\n});\n\n/**\n * Wrapper interno do body — controla padding, gap entre filhos e o max-width\n * conforme `layout`.\n *\n * - `fluid` (default): ocupa 100% da largura disponível (atual)\n * - `compact`: max-width 1368px (`--container-main-content-max`), centralizado\n *\n * Mobile (<md): padding reduzido pra 18px — telas pequenas precisam respiro\n * mínimo mas não zero (chat/navegação por overlays usam o bodyInner cheio).\n */\nexport const bodyInner = tv({\n base: [\n \"flex flex-col flex-1 min-h-0 w-full mx-auto\",\n \"gap-gp-4xl p-pad-6xl\",\n ],\n variants: {\n layout: {\n fluid: \"max-w-full\",\n compact: \"max-w-[var(--container-main-content-max)]\",\n },\n /**\n * Em mobile (<md):\n * - `false` (default): padding reduzido pra 18px (telas pequenas\n * precisam respiro mínimo).\n * - `true`: padding zero — útil pra patterns \"app feel\" (chat,\n * navegação por overlays fullscreen) onde a page controla o\n * próprio padding interno.\n */\n mobileEdgeToEdge: {\n true: \"max-md:p-0\",\n false: \"max-md:p-[18px]\",\n },\n },\n defaultVariants: {\n layout: \"fluid\",\n mobileEdgeToEdge: false,\n },\n});\n","import { useCallback, useState } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Header } from \"@/components/ui/Header\";\nimport { MenuSidebar } from \"@/components/ui/MenuSidebar\";\nimport { useMediaQuery } from \"@/components/ui/MenuSidebar/use-media-query\";\nimport { UserMenu } from \"./user-menu\";\nimport * as s from \"./app-shell.styles\";\nimport type { AppShellProps } from \"./app-shell.types\";\n\n/**\n * `<AppShell>` — template de aplicação (rail + panel + header + body).\n *\n * Compõe os 3 primitives da família \"app skeleton\":\n * - `<MenuSidebar>` (rail + panel, full-height, à esquerda)\n * - `<Header>` (top bar com breadcrumb/search/notif/messages/theme)\n * - **Body slot** (children, `gap-gp-4xl p-pad-6xl`, scroll vertical interno)\n *\n * **Padrão controlled/uncontrolled** pra `menuCollapsed`:\n * - `menuCollapsed` prop → controlled (consumer gerencia state)\n * - `defaultMenuCollapsed` → uncontrolled initial value\n * - Sem nenhum dos dois → uncontrolled, default `false`\n *\n * Todas as outras props são **passthrough 1:1** pros sub-componentes.\n * AppShell não impõe styling ao body além de gap/padding fixos — consumer\n * controla 100% do conteúdo (cards, tabelas, qualquer coisa).\n *\n * Pra uso real: declare um `MOCK_CONTEXTS`, `MOCK_COMMANDS`, etc compartilhados\n * num arquivo da app (ex: `src/config/app-shell-mocks.ts`) e passe nas pages.\n */\nexport function AppShell({\n // Sidebar\n contexts,\n defaultActiveContextId,\n activeContextId,\n onContextChange,\n defaultActiveItemHref,\n activeItemHref,\n onItemClick,\n // Header\n breadcrumb,\n commandGroups,\n commandPlaceholder,\n commandEmptyMessage,\n searchPlaceholder,\n notifications,\n messages,\n theme,\n onThemeChange,\n themeOptions,\n headerRightSlot,\n // User menu\n user,\n layout,\n onLayoutChange,\n layoutOptions,\n onSettings,\n onLogout,\n // Menu collapse (controlled/uncontrolled)\n menuCollapsed: controlledCollapsed,\n defaultMenuCollapsed = false,\n onMenuCollapseChange,\n // Body\n children,\n bodyClassName,\n mobileEdgeToEdge,\n className,\n}: AppShellProps) {\n const [internalCollapsed, setInternalCollapsed] = useState<boolean>(defaultMenuCollapsed);\n const menuCollapsed: boolean = controlledCollapsed ?? internalCollapsed;\n\n // Mobile: o hamburger abre/fecha o drawer overlay (mobileOpen do MenuSidebar),\n // NÃO o collapse de desktop (panelCollapsed). Antes o toggle só mexia no\n // panelCollapsed → no mobile o menu nunca abria.\n const isMobile = useMediaQuery(\"(max-width: 767px)\");\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n\n const toggleMenuCollapsed = useCallback(() => {\n const next = !menuCollapsed;\n if (controlledCollapsed === undefined) setInternalCollapsed(next);\n onMenuCollapseChange?.(next);\n }, [menuCollapsed, controlledCollapsed, onMenuCollapseChange]);\n\n const handleToggleMenu = useCallback(() => {\n if (isMobile) setMobileMenuOpen((o) => !o);\n else toggleMenuCollapsed();\n }, [isMobile, toggleMenuCollapsed]);\n\n const userNode = user ? (\n <UserMenu\n user={user}\n layout={layout}\n onLayoutChange={onLayoutChange}\n layoutOptions={layoutOptions}\n theme={theme}\n onThemeChange={onThemeChange}\n themeOptions={themeOptions}\n onSettings={onSettings}\n onLogout={onLogout}\n />\n ) : undefined;\n\n return (\n <div className={cn(s.root(), className)}>\n <MenuSidebar\n contexts={contexts}\n activeContextId={activeContextId}\n defaultActiveContextId={defaultActiveContextId}\n onContextChange={onContextChange}\n activeItemHref={activeItemHref}\n defaultActiveItemHref={defaultActiveItemHref}\n onItemClick={onItemClick}\n user={userNode}\n panelCollapsed={menuCollapsed}\n onPanelCollapseChange={(next) => {\n if (controlledCollapsed === undefined) setInternalCollapsed(next);\n onMenuCollapseChange?.(next);\n }}\n mobileOpen={mobileMenuOpen}\n onMobileOpenChange={setMobileMenuOpen}\n />\n\n <div className={s.main()}>\n <Header\n breadcrumb={breadcrumb}\n onCollapseMenu={handleToggleMenu}\n menuCollapsed={menuCollapsed}\n commandGroups={commandGroups}\n commandPlaceholder={commandPlaceholder}\n commandEmptyMessage={commandEmptyMessage}\n searchPlaceholder={searchPlaceholder}\n notifications={notifications}\n messages={messages}\n theme={theme}\n onThemeChange={onThemeChange}\n themeOptions={themeOptions}\n rightSlot={headerRightSlot}\n />\n\n <main className={cn(s.body(), bodyClassName)}>\n <div\n className={s.bodyInner({\n layout: layout === \"compact\" ? \"compact\" : \"fluid\",\n mobileEdgeToEdge: mobileEdgeToEdge ?? false,\n })}\n >\n {children}\n </div>\n </main>\n </div>\n </div>\n );\n}\n\nAppShell.displayName = \"AppShell\";\n"],"names":["tvBase","Button","Fragment","DialogPrimitive","CommandPrimitive","Chip","ChipGroup","ChipGroupItem","DEFAULT_FILTERS","s.root","s.main","s.body","s.bodyInner"],"mappings":"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"}
1
+ {"version":3,"file":"app-shell-78w0pYdP.mjs","sources":["../../src/lib/utils.ts","../../src/utils/tv.ts","../../src/components/ui/Button/button.styles.ts","../../src/components/ui/Button/button.tsx","../../src/components/ui/Header/header.styles.ts","../../src/components/ui/Header/header-breadcrumb.tsx","../../src/components/shadcn/dialog.tsx","../../src/components/shadcn/command.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/shadcn/popover.tsx","../../src/components/ui/Header/header-notifications.tsx","../../src/components/shadcn/input-group.tsx","../../src/components/ui/Header/header-messages.tsx","../../src/components/shadcn/dropdown-menu.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/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/shadcn/avatar.tsx","../../src/components/ui/AppShell/user-menu.tsx","../../src/components/ui/AppShell/app-shell.styles.ts","../../src/components/ui/AppShell/app-shell.tsx"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\r\nimport { extendTailwindMerge } from \"tailwind-merge\";\r\n\r\n/**\r\n * tw-merge configurado pra reconhecer:\r\n *\r\n * 1) Presets tipográficos do iGreen DS como `font-size` (e não text-color).\r\n * Sem isso, `text-title-md` e `text-fg-default` colidem e um é removido.\r\n *\r\n * 2) Prefixos DS (pad-*, sp-*, gp-*, radius-*, sh-*, form-*) como conflitantes\r\n * com utilitários nativos do Tailwind. Sem isso, `p-pad-4xl` + `p-0` no cn()\r\n * deixava AMBOS no className final (24px + 0 = 24px ganhava).\r\n */\r\n\r\n/** Padding/Margin spacing: pad-* (padding contexts), sp-* (geral) */\r\nconst isDsPad = (v: string) => /^(pad|sp)-/.test(v);\r\n/** Gap: gp-* */\r\nconst isDsGap = (v: string) => /^gp-/.test(v);\r\n/** Border-radius: radius-* */\r\nconst isDsRadius = (v: string) => /^radius-/.test(v);\r\n/** Shadow: sh-* */\r\nconst isDsShadow = (v: string) => /^sh-/.test(v);\r\n/** Form heights: form-* (min-h, h, w, size) */\r\nconst isDsForm = (v: string) => /^form-/.test(v);\r\n\r\nconst twMerge = extendTailwindMerge({\r\n extend: {\r\n classGroups: {\r\n \"font-size\": [\r\n {\r\n // Lista 1:1 com tokens/brands/default/semantic/typography.ts.\r\n // Manter sincronizado com src/utils/tv.ts. Ver L-016.\r\n text: [\r\n // Displays (fluid clamp)\r\n \"display-2xl\", \"display-xl\", \"display-lg\", \"display-md\",\r\n // Headings (xs estático, sm-xl fluid clamp)\r\n \"heading-xl\", \"heading-lg\", \"heading-md\", \"heading-sm\", \"heading-xs\",\r\n // Titles (weight 600 default)\r\n \"title-lg\", \"title-md\", \"title-sm\",\r\n // Body (xs/sm = weight 500 interactive; md-2xl = 400 corrido)\r\n \"body-2xl\", \"body-xl\", \"body-lg\", \"body-md\", \"body-sm\", \"body-xs\",\r\n // Captions (weight 400)\r\n \"caption-md\", \"caption-sm\", \"caption-xs\",\r\n // Code (mono regular)\r\n \"code-md\", \"code-sm\",\r\n ],\r\n },\r\n ],\r\n\r\n /* ── Padding ──────────────────────────────────────────────────────── */\r\n p: [{ p: [isDsPad] }],\r\n px: [{ px: [isDsPad] }],\r\n py: [{ py: [isDsPad] }],\r\n pt: [{ pt: [isDsPad] }],\r\n pr: [{ pr: [isDsPad] }],\r\n pb: [{ pb: [isDsPad] }],\r\n pl: [{ pl: [isDsPad] }],\r\n ps: [{ ps: [isDsPad] }],\r\n pe: [{ pe: [isDsPad] }],\r\n\r\n /* ── Margin (usa mesmo sp-*) ──────────────────────────────────────── */\r\n m: [{ m: [isDsPad] }],\r\n mx: [{ mx: [isDsPad] }],\r\n my: [{ my: [isDsPad] }],\r\n mt: [{ mt: [isDsPad] }],\r\n mr: [{ mr: [isDsPad] }],\r\n mb: [{ mb: [isDsPad] }],\r\n ml: [{ ml: [isDsPad] }],\r\n ms: [{ ms: [isDsPad] }],\r\n me: [{ me: [isDsPad] }],\r\n\r\n /* ── Inset / position (top/right/bottom/left) ─────────────────────── */\r\n inset: [{ inset: [isDsPad] }],\r\n \"inset-x\": [{ \"inset-x\": [isDsPad] }],\r\n \"inset-y\": [{ \"inset-y\": [isDsPad] }],\r\n \"top\": [{ top: [isDsPad] }],\r\n \"right\": [{ right: [isDsPad] }],\r\n \"bottom\": [{ bottom: [isDsPad] }],\r\n \"left\": [{ left: [isDsPad] }],\r\n \"start\": [{ start: [isDsPad] }],\r\n \"end\": [{ end: [isDsPad] }],\r\n\r\n /* ── Gap ──────────────────────────────────────────────────────────── */\r\n gap: [{ gap: [isDsGap] }],\r\n \"gap-x\": [{ \"gap-x\": [isDsGap] }],\r\n \"gap-y\": [{ \"gap-y\": [isDsGap] }],\r\n\r\n /* ── Rounded (todas as cantos) ────────────────────────────────────── */\r\n rounded: [{ rounded: [isDsRadius] }],\r\n \"rounded-s\": [{ \"rounded-s\": [isDsRadius] }],\r\n \"rounded-e\": [{ \"rounded-e\": [isDsRadius] }],\r\n \"rounded-t\": [{ \"rounded-t\": [isDsRadius] }],\r\n \"rounded-r\": [{ \"rounded-r\": [isDsRadius] }],\r\n \"rounded-b\": [{ \"rounded-b\": [isDsRadius] }],\r\n \"rounded-l\": [{ \"rounded-l\": [isDsRadius] }],\r\n \"rounded-ss\": [{ \"rounded-ss\": [isDsRadius] }],\r\n \"rounded-se\": [{ \"rounded-se\": [isDsRadius] }],\r\n \"rounded-ee\": [{ \"rounded-ee\": [isDsRadius] }],\r\n \"rounded-es\": [{ \"rounded-es\": [isDsRadius] }],\r\n \"rounded-tl\": [{ \"rounded-tl\": [isDsRadius] }],\r\n \"rounded-tr\": [{ \"rounded-tr\": [isDsRadius] }],\r\n \"rounded-br\": [{ \"rounded-br\": [isDsRadius] }],\r\n \"rounded-bl\": [{ \"rounded-bl\": [isDsRadius] }],\r\n\r\n /* ── Shadow ───────────────────────────────────────────────────────── */\r\n shadow: [{ shadow: [isDsShadow] }],\r\n\r\n /* ── Form sizes (min-h, h, w, size) ───────────────────────────────── */\r\n \"min-h\": [{ \"min-h\": [isDsForm] }],\r\n h: [{ h: [isDsForm] }],\r\n w: [{ w: [isDsForm] }],\r\n size: [{ size: [isDsForm] }],\r\n },\r\n },\r\n});\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","// src/utils/tv.ts\r\n// tv() customizado que ensina o tailwind-merge a reconhecer\r\n// os presets tipográficos do iGreen como font-size, não text-color.\r\nimport { tv as tvBase, type TVConfig } from \"tailwind-variants\";\r\n\r\n// Objeto de config — NÃO é o resultado de extendTailwindMerge()\r\n// TV3 recebe o config diretamente e aplica o merge internamente\r\nconst twMergeConfig = {\r\n extend: {\r\n classGroups: {\r\n \"font-size\": [\r\n {\r\n text: [\r\n // Displays (fluid clamp)\r\n \"display-2xl\", \"display-xl\", \"display-lg\", \"display-md\",\r\n // Headings (xs estático, sm-xl fluid clamp)\r\n \"heading-xl\", \"heading-lg\", \"heading-md\", \"heading-sm\", \"heading-xs\",\r\n // Titles (weight 600 default)\r\n \"title-lg\", \"title-md\", \"title-sm\",\r\n // Body (xs/sm = weight 500 interactive; md-2xl = 400 corrido)\r\n \"body-2xl\", \"body-xl\", \"body-lg\", \"body-md\", \"body-sm\", \"body-xs\",\r\n // Captions (weight 400)\r\n \"caption-md\", \"caption-sm\", \"caption-xs\",\r\n // Stat (número de métrica/KPI — estático, bold, leading tight)\r\n \"stat-xl\", \"stat-lg\", \"stat-md\", \"stat-sm\",\r\n // Code (mono regular)\r\n \"code-md\", \"code-sm\",\r\n ],\r\n },\r\n ],\r\n },\r\n },\r\n};\r\n\r\nexport const tv: typeof tvBase = (options, config) =>\r\n tvBase(options, {\r\n ...config,\r\n twMergeConfig,\r\n } as TVConfig);\r\n\r\nexport type { VariantProps } from \"tailwind-variants\";\r\n","import { tv, type VariantProps } from \"@/utils/tv\";\r\n\r\n/**\r\n * Button styles — V3 tokens (alinhado com /design-and-table-v2)\r\n *\r\n * Specs base:\r\n * - font-size 13px (text-body-md font-medium = 0.8125rem / 600)\r\n * - border-radius 10px (rounded-radius-lg)\r\n * - secondary usa fg-secondary\r\n * - rings cor-pura via ring.{brand|danger|success|warning|secondary}\r\n *\r\n * Variants color: primary/secondary/critical/success/warning\r\n * - primary → bg-brand / fg-brand / border-brand\r\n * - critical → bg-danger / fg-danger / border-danger-muted\r\n * - secondary → neutros (bg-muted, fg-secondary, border-default)\r\n *\r\n * Variants visual: filled/outline/soft/ghost\r\n *\r\n * Sizes mantidas (largura/espaçamento como estavam).\r\n *\r\n * Disabled: opacity-50 (v3 não tem bg-disabled token).\r\n */\r\nexport const buttonVariants = tv({\r\n base: [\r\n \"inline-flex items-center justify-center\",\r\n \"select-none whitespace-nowrap\",\r\n \"focus-visible:outline-none\",\r\n \"border border-transparent\",\r\n \"text-body-sm font-semibold leading-none\", // 13px / 600 — alinhado com sandbox btn\r\n \"[&_svg]:shrink-0\", // SVG não diminui; tamanho controlado por size\r\n \"transition-all duration-200 ease-out\",\r\n \"cursor-pointer\",\r\n \"focus-visible:ring-4\",\r\n ],\r\n\r\n variants: {\r\n color: {\r\n primary: \"focus-visible:ring-ring-brand\",\r\n secondary: \"focus-visible:ring-ring-secondary\",\r\n critical: \"focus-visible:ring-ring-danger\",\r\n success: \"focus-visible:ring-ring-success\",\r\n warning: \"focus-visible:ring-ring-warning\",\r\n },\r\n\r\n variant: {\r\n filled: \"\",\r\n outline: \"\",\r\n soft: \"\",\r\n ghost: \"bg-transparent\",\r\n },\r\n\r\n size: {\r\n // h28 / pad 10 / gap 6 / radius 8 / icon 12\r\n \"2xs\": \"min-h-form-xs px-pad-lg gap-gp-sm rounded-radius-md [&_svg]:size-[12px]\",\r\n // h32 / pad 12 / gap 6 / radius 8 / icon 14\r\n xs: \"min-h-form-sm px-pad-xl gap-gp-sm rounded-radius-md [&_svg]:size-[14px]\",\r\n // h36 / pad 12 / gap 6 / radius 10 / icon 14\r\n sm: \"min-h-form-md px-pad-xl gap-gp-sm rounded-radius-lg [&_svg]:size-[14px]\",\r\n // h40 / pad 16 / gap 6 / radius 10 / icon 14 (alinhado com sandbox Exportar)\r\n md: \"min-h-form-lg px-pad-2xl gap-gp-sm rounded-radius-lg [&_svg]:size-[14px]\",\r\n // h44 / pad 16 / gap 8 / radius 10 / icon 16\r\n lg: \"min-h-form-xl px-pad-2xl gap-gp-md rounded-radius-lg [&_svg]:size-[16px]\",\r\n\r\n // Icon buttons — width = height (square). Regra: SVG +2px vs versão com label\r\n // (precisa preencher mais o quadrado sem o texto carregando peso visual).\r\n \"icon-2xs\": \"size-form-xs rounded-radius-md p-0 [&_svg]:size-[14px]\", // 28×28 / +2 (12→14)\r\n \"icon-xs\": \"size-form-sm rounded-radius-md p-0 [&_svg]:size-[16px]\", // 32×32 / +2 (14→16)\r\n \"icon-sm\": \"size-form-md rounded-radius-lg p-0 [&_svg]:size-[16px]\", // 36×36 / +2 (14→16)\r\n \"icon-md\": \"size-form-lg rounded-radius-lg p-0 [&_svg]:size-[16px]\", // 40×40 / +2 (14→16)\r\n \"icon-lg\": \"size-form-xl rounded-radius-lg p-0 [&_svg]:size-[18px]\", // 44×44 / +2 (16→18)\r\n },\r\n\r\n fullWidth: {\r\n true: \"w-full flex-1\",\r\n },\r\n\r\n /**\r\n * Shape do botão:\r\n * - rounded (default): mantém o radius da `size` (varia por tamanho)\r\n * - pill: força `rounded-full` (override com `!` pra ganhar do size)\r\n */\r\n shape: {\r\n rounded: \"\",\r\n pill: \"!rounded-full\",\r\n },\r\n\r\n disabled: {\r\n true: \"pointer-events-none opacity-50\",\r\n },\r\n },\r\n\r\n compoundVariants: [\r\n // ── Primary (brand) ─────────────────────────────────────────────\r\n {\r\n color: \"primary\", variant: \"filled\",\r\n class: \"bg-bg-brand text-fg-on-brand hover:bg-bg-brand-hover\",\r\n },\r\n {\r\n color: \"primary\", variant: \"outline\",\r\n class: \"bg-bg-surface border-border-brand text-fg-brand shadow-sh-sm hover:bg-bg-brand-subtle hover:border-transparent hover:shadow-sh-none\",\r\n },\r\n {\r\n color: \"primary\", variant: \"soft\",\r\n class: \"bg-bg-brand-subtle text-fg-brand hover:bg-bg-brand-subtle-hover\",\r\n },\r\n {\r\n color: \"primary\", variant: \"ghost\",\r\n class: \"text-fg-brand hover:bg-bg-brand-subtle\",\r\n },\r\n\r\n // ── Secondary (neutro) ──────────────────────────────────────────\r\n {\r\n color: \"secondary\", variant: \"filled\",\r\n class: \"bg-bg-muted text-fg-muted hover:bg-bg-muted-hover hover:text-fg-default\",\r\n },\r\n {\r\n // Outline alinhado com `.btn.tbl-tool-btn` do design-and-table-v2:\r\n // light = bg-surface + border-subtle + fg-default + shadow-sm (mantém no hover)\r\n // dark = bg-muted + border-input + fg-muted + sem shadow\r\n color: \"secondary\", variant: \"outline\",\r\n class: [\r\n \"bg-bg-surface border-border-subtle text-fg-default shadow-sh-sm\",\r\n \"dark:bg-bg-muted dark:border-border-input dark:text-fg-muted dark:shadow-sh-none\",\r\n \"hover:bg-bg-muted-hover hover:text-fg-default\",\r\n \"dark:hover:bg-bg-muted-hover dark:hover:text-fg-default\",\r\n ].join(\" \"),\r\n },\r\n {\r\n color: \"secondary\", variant: \"soft\",\r\n class: \"bg-bg-muted text-fg-muted hover:bg-bg-muted-hover hover:text-fg-default\",\r\n },\r\n {\r\n color: \"secondary\", variant: \"ghost\",\r\n class: \"text-fg-muted hover:bg-bg-muted hover:text-fg-default\",\r\n },\r\n\r\n // ── Critical (danger) ───────────────────────────────────────────\r\n {\r\n color: \"critical\", variant: \"filled\",\r\n class: \"bg-bg-danger text-fg-on-danger hover:bg-bg-danger-hover\",\r\n },\r\n {\r\n color: \"critical\", variant: \"outline\",\r\n class: \"bg-bg-surface border-border-danger-muted text-fg-danger shadow-sh-sm hover:bg-bg-danger-muted hover:shadow-sh-none\",\r\n },\r\n {\r\n color: \"critical\", variant: \"soft\",\r\n class: \"bg-bg-danger-muted text-fg-danger hover:bg-bg-danger-muted-hover\",\r\n },\r\n {\r\n color: \"critical\", variant: \"ghost\",\r\n class: \"text-fg-danger hover:bg-bg-danger-muted\",\r\n },\r\n\r\n // ── Success ─────────────────────────────────────────────────────\r\n {\r\n color: \"success\", variant: \"filled\",\r\n class: \"bg-bg-success text-fg-on-success hover:bg-bg-success-hover\",\r\n },\r\n {\r\n color: \"success\", variant: \"outline\",\r\n class: \"bg-bg-surface border-border-success-muted text-fg-success shadow-sh-sm hover:bg-bg-success-muted hover:shadow-sh-none\",\r\n },\r\n {\r\n color: \"success\", variant: \"soft\",\r\n class: \"bg-bg-success-muted text-fg-success hover:bg-bg-success-muted-hover\",\r\n },\r\n {\r\n color: \"success\", variant: \"ghost\",\r\n class: \"text-fg-success hover:bg-bg-success-muted\",\r\n },\r\n\r\n // ── Warning ─────────────────────────────────────────────────────\r\n {\r\n color: \"warning\", variant: \"filled\",\r\n class: \"bg-bg-warning text-fg-on-warning hover:bg-bg-warning-hover\",\r\n },\r\n {\r\n color: \"warning\", variant: \"outline\",\r\n class: \"bg-bg-surface border-border-warning-muted text-fg-warning shadow-sh-sm hover:bg-bg-warning-muted hover:shadow-sh-none\",\r\n },\r\n {\r\n color: \"warning\", variant: \"soft\",\r\n class: \"bg-bg-warning-muted text-fg-warning hover:bg-bg-warning-muted-hover\",\r\n },\r\n {\r\n color: \"warning\", variant: \"ghost\",\r\n class: \"text-fg-warning hover:bg-bg-warning-muted\",\r\n },\r\n\r\n // ── Disabled — SEMPRE por último ────────────────────────────────\r\n { disabled: true, class: \"pointer-events-none opacity-50\" },\r\n ],\r\n\r\n defaultVariants: {\r\n color: \"primary\",\r\n variant: \"filled\",\r\n size: \"md\",\r\n shape: \"rounded\",\r\n },\r\n});\r\n\r\nexport type ButtonVariantProps = VariantProps<typeof buttonVariants>;\r\n","import { forwardRef } from \"react\";\r\nimport type { ButtonProps } from \"./button.types\";\r\nimport { buttonVariants } from \"./button.styles\";\r\n\r\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n function Button(\r\n {\r\n color,\r\n variant,\r\n size,\r\n shape,\r\n fullWidth,\r\n loading = false,\r\n disabled = false,\r\n iconLeft,\r\n iconRight,\r\n children,\r\n className,\r\n type = \"button\",\r\n ...rest\r\n },\r\n ref,\r\n ) {\r\n const isDisabled = disabled || loading;\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type={type}\r\n disabled={isDisabled}\r\n className={buttonVariants({\r\n color,\r\n variant,\r\n size,\r\n shape,\r\n fullWidth,\r\n disabled: isDisabled,\r\n className,\r\n })}\r\n {...rest}\r\n >\r\n {loading && <Spinner />}\r\n {!loading && iconLeft}\r\n {children}\r\n {!loading && iconRight}\r\n </button>\r\n );\r\n },\r\n);\r\n\r\nfunction Spinner() {\r\n return (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n className=\"animate-spin\"\r\n >\r\n <circle\r\n cx=\"8\"\r\n cy=\"8\"\r\n r=\"6\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray=\"28\"\r\n strokeDashoffset=\"8\"\r\n className=\"opacity-70\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","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\";\r\nimport { ChevronRight } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n breadcrumbRoot,\r\n breadcrumbItem,\r\n breadcrumbSeparator,\r\n} from \"./header.styles\";\r\nimport type { HeaderBreadcrumbItem } from \"./header.types\";\r\n\r\nexport type HeaderBreadcrumbProps = {\r\n items: HeaderBreadcrumbItem[];\r\n /**\r\n * Quando true, em mobile (< md) mostra apenas o último item (título da seção\r\n * atual). Em desktop continua mostrando a cadeia completa.\r\n */\r\n mobileShowLastOnly?: boolean;\r\n className?: string;\r\n};\r\n\r\n/**\r\n * Breadcrumb / title — auto-renderiza como string única quando 1 item,\r\n * ou como cadeia \"Item / Item / Item\" quando 2+. Último item nunca é link\r\n * (representa página atual).\r\n */\r\nexport function HeaderBreadcrumb({\r\n items,\r\n mobileShowLastOnly,\r\n className,\r\n}: HeaderBreadcrumbProps) {\r\n if (items.length === 0) return null;\r\n\r\n /** Quando há 1 só item, renderiza como título (15px). 2+ → cadeia breadcrumb (13px). */\r\n const isStandalone = items.length === 1;\r\n const lastItem = items[items.length - 1];\r\n\r\n return (\r\n <>\r\n {/* Desktop: cadeia completa */}\r\n <nav\r\n className={cn(\r\n breadcrumbRoot(),\r\n mobileShowLastOnly && \"hidden md:flex\",\r\n className,\r\n )}\r\n aria-label=\"Breadcrumb\"\r\n >\r\n {items.map((item, idx) => {\r\n const isLast = idx === items.length - 1;\r\n const isClickable =\r\n !isLast && (item.href !== undefined || item.onClick !== undefined);\r\n\r\n return (\r\n <Fragment key={`${item.label}-${idx}`}>\r\n {idx > 0 && (\r\n <ChevronRight\r\n size={14}\r\n strokeWidth={1.7}\r\n className={breadcrumbSeparator()}\r\n aria-hidden=\"true\"\r\n />\r\n )}\r\n {isClickable ? (\r\n <a\r\n href={item.href ?? \"#\"}\r\n className={breadcrumbItem({\r\n current: false,\r\n standalone: isStandalone,\r\n })}\r\n onClick={(e) => {\r\n if (!item.href) e.preventDefault();\r\n item.onClick?.(e);\r\n }}\r\n >\r\n {item.label}\r\n </a>\r\n ) : (\r\n <span\r\n className={breadcrumbItem({\r\n current: isLast,\r\n standalone: isStandalone,\r\n })}\r\n aria-current={isLast ? \"page\" : undefined}\r\n >\r\n {item.label}\r\n </span>\r\n )}\r\n </Fragment>\r\n );\r\n })}\r\n </nav>\r\n\r\n {/* Mobile: só o último item (título da seção atual) */}\r\n {mobileShowLastOnly && (\r\n <nav\r\n className={cn(breadcrumbRoot(), \"md:hidden\", className)}\r\n aria-label=\"Seção atual\"\r\n >\r\n <span\r\n className={breadcrumbItem({ current: true, standalone: true })}\r\n aria-current=\"page\"\r\n >\r\n {lastItem.label}\r\n </span>\r\n </nav>\r\n )}\r\n </>\r\n );\r\n}\r\n","import * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Dialog = DialogPrimitive.Root\r\n\r\nconst DialogTrigger = DialogPrimitive.Trigger\r\n\r\nconst DialogPortal = DialogPrimitive.Portal\r\n\r\nconst DialogClose = DialogPrimitive.Close\r\n\r\nconst DialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Overlay\r\n ref={ref}\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/30 supports-[backdrop-filter]:backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\r\n\r\nconst DialogContent = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\r\n /** Esconde o botão \"X\" (Close) no canto superior direito. Default: false. */\r\n hideClose?: boolean;\r\n }\r\n>(({ className, children, hideClose, ...props }, ref) => (\r\n <DialogPortal>\r\n <DialogOverlay />\r\n <DialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-gp-4xl rounded-radius-base bg-bg-surface p-pad-4xl text-body-md text-fg-default shadow-sh-xl outline-float duration-200 sm:max-w-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n {!hideClose && (\r\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-radius-sm opacity-70 transition-opacity hover:opacity-100 outline-none ring-0 ring-ring-brand focus-visible:ring-4 disabled:pointer-events-none data-[state=open]:bg-bg-muted data-[state=open]:text-fg-muted\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n )}\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n))\r\nDialogContent.displayName = DialogPrimitive.Content.displayName\r\n\r\nconst DialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\"flex flex-col gap-gp-sm\", className)}\r\n {...props}\r\n />\r\n)\r\nDialogHeader.displayName = \"DialogHeader\"\r\n\r\nconst DialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse gap-gp-md sm:flex-row sm:justify-end\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogFooter.displayName = \"DialogFooter\"\r\n\r\nconst DialogTitle = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\r\n \"text-title-md font-medium text-fg-default leading-none\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogTitle.displayName = DialogPrimitive.Title.displayName\r\n\r\nconst DialogDescription = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-body-md text-fg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nDialogDescription.displayName = DialogPrimitive.Description.displayName\r\n\r\nexport {\r\n Dialog,\r\n DialogPortal,\r\n DialogOverlay,\r\n DialogClose,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n}\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { type DialogProps } from \"@radix-ui/react-dialog\"\r\nimport { Command as CommandPrimitive } from \"cmdk\"\r\nimport { Search } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\nimport { Dialog, DialogContent, DialogTitle } from \"@/components/shadcn/dialog\"\r\n\r\n/**\r\n * Command — alinhado com o views-popover do design-and-table-v2.\r\n *\r\n * Estrutura:\r\n * - <Command> raiz (flex column)\r\n * - <CommandInput> = input \"real\" boxed (bg-input + border + radius-lg + shadow)\r\n * - <CommandList> com padding 4px\r\n * - <CommandGroup> heading uppercase + items\r\n * - <CommandItem> radius-lg (10px), px 12, py 8, font 13px, ícones 18px\r\n *\r\n * Pattern do input replica `.tbl-views-pop-search` exatamente.\r\n */\r\n\r\nconst Command = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive\r\n ref={ref}\r\n className={cn(\r\n \"flex h-full w-full flex-col overflow-hidden p-pad-xl bg-popover text-popover-foreground\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommand.displayName = CommandPrimitive.displayName\r\n\r\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\r\n return (\r\n <Dialog {...props}>\r\n <DialogContent\r\n hideClose\r\n // A11y: Radix exige título; aqui é sr-only (paleta de comando não tem\r\n // header visível) e opt-out de descrição.\r\n aria-describedby={undefined}\r\n className={cn(\r\n \"overflow-hidden p-0 gap-0 sm:max-w-[384px]\",\r\n \"rounded-[12px] border border-border-default\",\r\n // Outline padrão de elementos flutuantes\r\n \"outline-float\"\r\n )}\r\n >\r\n <DialogTitle className=\"sr-only\">Comando</DialogTitle>\r\n <Command>{children}</Command>\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n\r\n/* ── Input boxed (igual views-popover search) ─────────────────────────────── */\r\nconst CommandInput = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Input>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n cmdk-input-wrapper=\"\"\r\n className={cn(\r\n \"flex items-center gap-gp-md h-form-md px-pad-xl rounded-radius-lg\",\r\n \"bg-bg-input border border-border-subtle shadow-sh-sm\",\r\n \"transition-[border-color,box-shadow,background-color] duration-150\",\r\n \"focus-within:border-border-brand focus-within:shadow-sh-ring\",\r\n \"dark:bg-bg-muted dark:border-border-input dark:shadow-sh-none\"\r\n )}\r\n >\r\n <Search className=\"size-[14px] text-fg-muted shrink-0\" strokeWidth={1.8} />\r\n <CommandPrimitive.Input\r\n ref={ref}\r\n className={cn(\r\n \"flex-1 min-w-0 bg-transparent border-0 outline-none\",\r\n \"text-body-sm font-normal text-fg-default placeholder:text-fg-muted\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </div>\r\n))\r\nCommandInput.displayName = CommandPrimitive.Input.displayName\r\n\r\n/* ── List ─────────────────────────────────────────────────────────────────── */\r\nconst CommandList = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.List>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.List\r\n ref={ref}\r\n className={cn(\r\n \"max-h-[300px] overflow-y-auto overflow-x-hidden mt-pad-md scrollbar-thin\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandList.displayName = CommandPrimitive.List.displayName\r\n\r\nconst CommandEmpty = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Empty>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\r\n>((props, ref) => (\r\n <CommandPrimitive.Empty\r\n ref={ref}\r\n className=\"py-pad-5xl text-center text-body-md text-fg-muted\"\r\n {...props}\r\n />\r\n))\r\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\r\n\r\n/* ── Group (heading uppercase 28px, sem padding extra no group) ──────────── */\r\nconst CommandGroup = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Group>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Group\r\n ref={ref}\r\n className={cn(\r\n \"overflow-hidden text-fg-default\",\r\n \"[&_[cmdk-group-heading]]:flex [&_[cmdk-group-heading]]:items-center\",\r\n \"[&_[cmdk-group-heading]]:h-[28px] [&_[cmdk-group-heading]]:px-pad-xl\",\r\n \"[&_[cmdk-group-heading]]:text-caption-xs [&_[cmdk-group-heading]]:font-bold\",\r\n \"[&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider\",\r\n \"[&_[cmdk-group-heading]]:text-fg-subtle\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandGroup.displayName = CommandPrimitive.Group.displayName\r\n\r\nconst CommandSeparator = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"mx-pad-xs my-pad-xs h-px bg-border-default\", className)}\r\n {...props}\r\n />\r\n))\r\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\r\n\r\n/* ── Item: px-12 py-8, radius-lg (10px), font 13px, ícones 18px ───────────── */\r\nconst CommandItem = React.forwardRef<\r\n React.ElementRef<typeof CommandPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\r\n>(({ className, ...props }, ref) => (\r\n <CommandPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center gap-gp-md\",\r\n \"rounded-radius-lg px-pad-xl py-pad-md\",\r\n \"text-body-sm font-medium text-fg-muted\",\r\n \"outline-none transition-colors\",\r\n \"data-[selected='true']:bg-bg-muted data-[selected='true']:text-fg-default data-[selected='true']:[&_svg]:text-fg-default\",\r\n \"data-[disabled='true']:pointer-events-none data-[disabled='true']:opacity-50\",\r\n \"[&_svg]:pointer-events-none [&_svg]:size-[18px] [&_svg]:shrink-0 [&_svg]:text-fg-muted\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nCommandItem.displayName = CommandPrimitive.Item.displayName\r\n\r\nconst CommandShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\r\n \"ml-auto text-caption-sm tracking-wider text-fg-subtle\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\nCommandShortcut.displayName = \"CommandShortcut\"\r\n\r\nexport {\r\n Command,\r\n CommandDialog,\r\n CommandInput,\r\n CommandList,\r\n CommandEmpty,\r\n CommandGroup,\r\n CommandItem,\r\n CommandShortcut,\r\n CommandSeparator,\r\n}\r\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\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { chipVariants, type ChipVariantProps } from \"./chip.styles\";\r\n\r\nexport type ChipProps = Omit<\r\n React.ButtonHTMLAttributes<HTMLButtonElement> &\r\n React.HTMLAttributes<HTMLSpanElement>,\r\n \"color\"\r\n> &\r\n ChipVariantProps & {\r\n /** Conteúdo (label, ícone, etc) */\r\n children: ReactNode;\r\n /**\r\n * Quando passado, o chip vira `<button>` clicável. Se omitido,\r\n * renderiza como `<span>` estático (pra status/tag).\r\n */\r\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\r\n /** Força renderizar como button mesmo sem onClick */\r\n asButton?: boolean;\r\n };\r\n\r\n/**\r\n * Chip — pílula compacta pra status/tags/filtros/abas.\r\n *\r\n * Dual-mode:\r\n * - **Span estático** (default): usado pra Badge-like (status, categoria, count)\r\n * - **Button interativo**: quando recebe `onClick` OU `asButton`\r\n *\r\n * Pra grupo de seleção (radio/checkbox via chips), use `<ChipGroup>`.\r\n *\r\n * Variantes:\r\n * - `color`: primary | neutral | danger | warning | success | info (default `neutral`)\r\n * - `variant`: solid | outline | soft (default `soft`)\r\n * - `size`: sm (24px) | md (28px) | lg (32px) (default `md`)\r\n */\r\nexport const Chip = forwardRef<HTMLElement, ChipProps>(function Chip(\r\n {\r\n children,\r\n color,\r\n variant,\r\n size,\r\n shape,\r\n selected,\r\n onClick,\r\n asButton,\r\n className,\r\n type,\r\n ...rest\r\n },\r\n ref,\r\n) {\r\n const interactive = Boolean(onClick) || asButton === true;\r\n const classes = cn(\r\n chipVariants({ color, variant, size, shape, interactive, selected }),\r\n className,\r\n );\r\n\r\n if (interactive) {\r\n return (\r\n <button\r\n ref={ref as React.Ref<HTMLButtonElement>}\r\n type={type ?? \"button\"}\r\n onClick={onClick}\r\n className={classes}\r\n aria-pressed={selected}\r\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\r\n >\r\n {children}\r\n </button>\r\n );\r\n }\r\n\r\n return (\r\n <span\r\n ref={ref as React.Ref<HTMLSpanElement>}\r\n className={classes}\r\n {...(rest as React.HTMLAttributes<HTMLSpanElement>)}\r\n >\r\n {children}\r\n </span>\r\n );\r\n});\r\n","import { createContext, forwardRef, useContext, type ReactNode } from \"react\";\r\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { chipVariants, type ChipVariantProps } from \"./chip.styles\";\r\n\r\ntype ChipColor = NonNullable<ChipVariantProps[\"color\"]>;\r\ntype ChipVariant = NonNullable<ChipVariantProps[\"variant\"]>;\r\ntype ChipSize = NonNullable<ChipVariantProps[\"size\"]>;\r\ntype ChipShape = NonNullable<ChipVariantProps[\"shape\"]>;\r\n\r\n/* ── Classes do estado SELECTED (data-state=on) por color × variant ── */\r\n/**\r\n * Mapeamento color × variant → classes aplicadas em items selecionados\r\n * (Radix dá `data-state=\"on\"` quando ativo).\r\n *\r\n * Inclui todas as 4 variants × 6 cores = 24 combos.\r\n */\r\nconst SELECTED_CLASSES: Record<ChipColor, Record<ChipVariant, string>> = {\r\n primary: {\r\n solid: \"data-[state=on]:bg-bg-brand data-[state=on]:text-fg-on-brand data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-brand data-[state=on]:text-fg-brand data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-brand-subtle data-[state=on]:text-fg-brand data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-brand-subtle data-[state=on]:border-border-brand data-[state=on]:text-fg-brand\",\r\n },\r\n neutral: {\r\n solid: \"data-[state=on]:bg-bg-muted data-[state=on]:text-fg-default data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-default data-[state=on]:text-fg-default data-[state=on]:bg-transparent\",\r\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\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-muted data-[state=on]:border-border-default data-[state=on]:text-fg-default\",\r\n },\r\n danger: {\r\n solid: \"data-[state=on]:bg-bg-danger data-[state=on]:text-fg-on-danger data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-danger-muted data-[state=on]:text-fg-danger data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-danger-muted data-[state=on]:text-fg-danger data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-danger-muted data-[state=on]:border-border-danger-muted data-[state=on]:text-fg-danger\",\r\n },\r\n warning: {\r\n solid: \"data-[state=on]:bg-bg-warning data-[state=on]:text-fg-on-warning data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-warning-muted data-[state=on]:text-fg-warning data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-warning-muted data-[state=on]:text-fg-warning data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-warning-muted data-[state=on]:border-border-warning-muted data-[state=on]:text-fg-warning\",\r\n },\r\n success: {\r\n solid: \"data-[state=on]:bg-bg-success data-[state=on]:text-fg-on-success data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-success-muted data-[state=on]:text-fg-success data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-success-muted data-[state=on]:text-fg-success data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-success-muted data-[state=on]:border-border-success-muted data-[state=on]:text-fg-success\",\r\n },\r\n info: {\r\n solid: \"data-[state=on]:bg-bg-info data-[state=on]:text-fg-on-info data-[state=on]:border-transparent\",\r\n outline: \"data-[state=on]:border-border-info-muted data-[state=on]:text-fg-info data-[state=on]:bg-transparent\",\r\n soft: \"data-[state=on]:bg-bg-info-muted data-[state=on]:text-fg-info data-[state=on]:border-transparent\",\r\n \"soft-outline\":\"data-[state=on]:bg-bg-info-muted data-[state=on]:border-border-info-muted data-[state=on]:text-fg-info\",\r\n },\r\n};\r\n\r\n/* ── ChipGroup root ──────────────────────────────────────────────── */\r\n\r\ntype CommonProps = {\r\n /** Cor do estado INATIVO (default `\"neutral\"`) */\r\n inactiveColor?: ChipColor;\r\n /** Variant do estado INATIVO (default `\"outline\"`) */\r\n inactiveVariant?: ChipVariant;\r\n /** Cor do estado ATIVO (default `\"primary\"`) */\r\n activeColor?: ChipColor;\r\n /** Variant do estado ATIVO (default `\"soft-outline\"`) */\r\n activeVariant?: ChipVariant;\r\n /** Size aplicado em todos os chips do grupo */\r\n size?: ChipSize;\r\n /** Shape aplicado em todos os chips (default `\"pill\"`) */\r\n shape?: ChipShape;\r\n /** Direção do grupo */\r\n orientation?: \"horizontal\" | \"vertical\";\r\n /** Aria-label do grupo */\r\n ariaLabel?: string;\r\n className?: string;\r\n children: ReactNode;\r\n};\r\n\r\ntype SingleProps = CommonProps & {\r\n type: \"single\";\r\n value?: string;\r\n defaultValue?: string;\r\n onValueChange?: (value: string) => void;\r\n};\r\n\r\ntype MultipleProps = CommonProps & {\r\n type: \"multiple\";\r\n value?: string[];\r\n defaultValue?: string[];\r\n onValueChange?: (value: string[]) => void;\r\n};\r\n\r\nexport type ChipGroupProps = SingleProps | MultipleProps;\r\n\r\n/**\r\n * ChipGroup — agrupa chips com seleção controlada.\r\n *\r\n * - `type=\"single\"`: escolha única (radio-like)\r\n * - `type=\"multiple\"`: escolha múltipla (checkbox-like)\r\n *\r\n * **Estado visual configurável independentemente:**\r\n * - `inactiveColor` + `inactiveVariant` → estilo dos items NÃO selecionados\r\n * (default: `neutral` + `outline`)\r\n * - `activeColor` + `activeVariant` → estilo dos items SELECIONADOS\r\n * (default: `primary` + `soft-outline`)\r\n *\r\n * Usa `@radix-ui/react-toggle-group` por baixo.\r\n */\r\nexport const ChipGroup = forwardRef<HTMLDivElement, ChipGroupProps>(\r\n function ChipGroup(props, ref) {\r\n const {\r\n inactiveColor = \"neutral\",\r\n inactiveVariant = \"outline\",\r\n activeColor = \"primary\",\r\n activeVariant = \"soft-outline\",\r\n size = \"md\",\r\n shape = \"pill\",\r\n orientation = \"horizontal\",\r\n ariaLabel,\r\n className,\r\n children,\r\n } = props;\r\n\r\n const contextValue = {\r\n inactiveColor,\r\n inactiveVariant,\r\n activeColor,\r\n activeVariant,\r\n size,\r\n shape,\r\n };\r\n\r\n if (props.type === \"single\") {\r\n return (\r\n <ChipGroupContext.Provider value={contextValue}>\r\n <ToggleGroupPrimitive.Root\r\n ref={ref}\r\n type=\"single\"\r\n value={props.value}\r\n defaultValue={props.defaultValue}\r\n onValueChange={props.onValueChange as (v: string) => void}\r\n orientation={orientation}\r\n aria-label={ariaLabel}\r\n className={cn(\r\n \"inline-flex items-center gap-gp-sm\",\r\n orientation === \"vertical\" && \"flex-col\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </ToggleGroupPrimitive.Root>\r\n </ChipGroupContext.Provider>\r\n );\r\n }\r\n\r\n return (\r\n <ChipGroupContext.Provider value={contextValue}>\r\n <ToggleGroupPrimitive.Root\r\n ref={ref}\r\n type=\"multiple\"\r\n value={props.value}\r\n defaultValue={props.defaultValue}\r\n onValueChange={props.onValueChange as (v: string[]) => void}\r\n orientation={orientation}\r\n aria-label={ariaLabel}\r\n className={cn(\r\n \"inline-flex items-center gap-gp-sm\",\r\n orientation === \"vertical\" && \"flex-col\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </ToggleGroupPrimitive.Root>\r\n </ChipGroupContext.Provider>\r\n );\r\n },\r\n);\r\n\r\n/* ── Context ─────────────────────────────────────────────────────── */\r\ntype ChipGroupContextValue = {\r\n inactiveColor: ChipColor;\r\n inactiveVariant: ChipVariant;\r\n activeColor: ChipColor;\r\n activeVariant: ChipVariant;\r\n size: ChipSize;\r\n shape: ChipShape;\r\n};\r\n\r\nconst ChipGroupContext = createContext<ChipGroupContextValue>({\r\n inactiveColor: \"neutral\",\r\n inactiveVariant: \"outline\",\r\n activeColor: \"primary\",\r\n activeVariant: \"soft-outline\",\r\n size: \"md\",\r\n shape: \"pill\",\r\n});\r\n\r\n/* ── ChipGroupItem ───────────────────────────────────────────────── */\r\n\r\nexport type ChipGroupItemProps = Omit<\r\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item>,\r\n \"color\"\r\n>;\r\n\r\n/**\r\n * ChipGroupItem — item dentro do `<ChipGroup>`. Visual gerenciado pelo\r\n * grupo via context: estilo `inactive*` quando OFF e `active*` quando ON.\r\n *\r\n * <ChipGroup type=\"single\" inactiveVariant=\"outline\" activeVariant=\"soft-outline\">\r\n * <ChipGroupItem value=\"all\">Todas</ChipGroupItem>\r\n * <ChipGroupItem value=\"unread\">Não lidas</ChipGroupItem>\r\n * </ChipGroup>\r\n */\r\nexport const ChipGroupItem = forwardRef<HTMLButtonElement, ChipGroupItemProps>(\r\n function ChipGroupItem({ className, children, ...rest }, ref) {\r\n const {\r\n inactiveColor,\r\n inactiveVariant,\r\n activeColor,\r\n activeVariant,\r\n size,\r\n shape,\r\n } = useContext(ChipGroupContext);\r\n\r\n return (\r\n <ToggleGroupPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n // Estado OFF — visual inativo (passa pelo chipVariants normal)\r\n chipVariants({\r\n color: inactiveColor,\r\n variant: inactiveVariant,\r\n size,\r\n shape,\r\n interactive: true,\r\n }),\r\n // Estado ON — override via data-state=on com classes do active*\r\n SELECTED_CLASSES[activeColor][activeVariant],\r\n className,\r\n )}\r\n {...rest}\r\n >\r\n {children}\r\n </ToggleGroupPrimitive.Item>\r\n );\r\n },\r\n);\r\n","import * as React from \"react\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\n\r\n/**\r\n * Popover — primitives baixo nível pra menus flutuantes (Cols, Sort, Filter, Views).\r\n *\r\n * Visual unificado com DropdownMenu/Select: bg-bg-dropdown (frosted-glass no\r\n * dark via `before:backdrop-blur-2xl`), border-default, radius 12px, shadow-lg\r\n * + outline-float (halo). Padronizado pra evitar inconsistência visual entre\r\n * menus de ação (DropdownMenu) e menus de configuração (Popover de Filtros,\r\n * Sort, Cols, Views).\r\n *\r\n * Não tem `Item` próprio — o consumer monta o conteúdo do popover livremente.\r\n * Pra menus de ação com items semânticos, prefira `DropdownMenu`.\r\n */\r\n\r\nconst Popover = PopoverPrimitive.Root;\r\nconst PopoverTrigger = PopoverPrimitive.Trigger;\r\nconst PopoverAnchor = PopoverPrimitive.Anchor;\r\nconst PopoverClose = PopoverPrimitive.Close;\r\n\r\n/* ── Mobile sheet (<md) ───────────────────────────────────────────────\r\n * Em telas <md o conteúdo vira sheet bottom-up colado nas bordas: full-width,\r\n * só cantos superiores arredondados, flush, sem outline/shadow, cap 92vh.\r\n * O wrapper do Radix Popper é reposicionado no globals.css via a regra\r\n * `[data-radix-popper-content-wrapper]:has([data-mobile-sheet])` (mesma usada\r\n * pelo DropdownMenu). Animação: neutraliza o zoom e desliza de baixo. */\r\nconst POPOVER_MOBILE_SHEET = [\r\n \"max-md:w-full max-md:min-w-0 max-md:max-w-none\",\r\n \"max-md:!max-h-[92vh]\",\r\n \"max-md:rounded-b-none max-md:rounded-t-[12px]\",\r\n \"max-md:border-x-0 max-md:border-b-0\",\r\n \"max-md:outline-none max-md:shadow-none\",\r\n // Respiro de 20px (pad-3xl) no rodapé pra o conteúdo (footer/última seção)\r\n // não colar na borda inferior do device quando vira sheet.\r\n \"max-md:pb-pad-3xl\",\r\n \"max-md:data-[state=open]:zoom-in-100 max-md:data-[state=closed]:zoom-out-100\",\r\n \"max-md:data-[state=open]:slide-in-from-bottom-12 max-md:data-[state=closed]:slide-out-to-bottom-12\",\r\n].join(\" \");\r\n\r\n/** Backdrop suave — só mobile (md:hidden). Toque fecha via dismiss do Radix. */\r\nconst PopoverSheetBackdrop = () => (\r\n <div\r\n aria-hidden=\"true\"\r\n className=\"fixed inset-0 z-[55] bg-overlay-scrim pointer-events-auto md:hidden animate-in fade-in-0 duration-150\"\r\n />\r\n);\r\n\r\ntype PopoverContentProps = React.ComponentPropsWithoutRef<\r\n typeof PopoverPrimitive.Content\r\n> & {\r\n /**\r\n * Renderiza o conteúdo SEM `<Portal>`. Útil quando o conteúdo interno usa\r\n * libs como dnd-kit que conflitam com o transform do Floating UI do Portal.\r\n * Default `false` (usa portal — comportamento padrão).\r\n */\r\n disablePortal?: boolean;\r\n /**\r\n * Em telas <md, transforma o popover em **sheet bottom-up** colado nas bordas,\r\n * com backdrop suave (toque fora fecha). No desktop não muda nada. Default `true`.\r\n * Passe `false` pra manter o popover ancorado no trigger também em mobile.\r\n * (Mesmo nome da prop do `DropdownMenu` — comportamento consistente.)\r\n */\r\n mobileSheet?: boolean;\r\n};\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n PopoverContentProps\r\n>(\r\n (\r\n { className, align = \"center\", sideOffset = 6, disablePortal, mobileSheet = true, ...props },\r\n ref,\r\n ) => {\r\n const content = (\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n data-mobile-sheet={mobileSheet ? \"\" : undefined}\r\n className={cn(\r\n \"relative z-50\",\r\n // Unificado com DropdownMenu/Select: bg-bg-dropdown (frosted no dark)\r\n // + border-border-default + outline-float. O `before` pseudo-element\r\n // aplica o blur backdrop (necessário pra bg-bg-dropdown semi-transparente\r\n // render correto no dark mode).\r\n \"bg-bg-dropdown\",\r\n \"border border-border-default rounded-[12px] 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 \"text-fg-default\",\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 \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\r\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n mobileSheet && POPOVER_MOBILE_SHEET,\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n\r\n if (disablePortal) {\r\n // Sem portal: backdrop inline (fixed escapa do flow mesmo assim).\r\n return mobileSheet ? (\r\n <>\r\n <PopoverSheetBackdrop />\r\n {content}\r\n </>\r\n ) : (\r\n content\r\n );\r\n }\r\n\r\n // Com portal: backdrop em Portal próprio (cada Portal Radix aceita 1 filho\r\n // e é montado/desmontado junto com o popover via Presence).\r\n return (\r\n <>\r\n {mobileSheet && (\r\n <PopoverPrimitive.Portal>\r\n <PopoverSheetBackdrop />\r\n </PopoverPrimitive.Portal>\r\n )}\r\n <PopoverPrimitive.Portal>{content}</PopoverPrimitive.Portal>\r\n </>\r\n );\r\n },\r\n);\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\r\n\r\nexport { Popover, PopoverTrigger, PopoverAnchor, PopoverClose, PopoverContent };\r\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 * as React from \"react\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\n/**\r\n * InputGroup — composição rica pra inputs com addons (prefixo, sufixo, ícone, botão).\r\n *\r\n * Estrutura:\r\n * <InputGroup>\r\n * <InputGroupAddon align=\"inline-start\"><Icon /></InputGroupAddon>\r\n * <InputGroupInput placeholder=\"...\" />\r\n * <InputGroupAddon align=\"inline-end\">\r\n * <InputGroupButton><X /></InputGroupButton>\r\n * </InputGroupAddon>\r\n * </InputGroup>\r\n *\r\n * Visual alinhado com `.tbl-form-input` (mesmo bg/border/radius do <Input>).\r\n * State (default/error/warning/success) afeta borda + focus ring (shadow-sh-ring-*).\r\n */\r\n\r\nexport type InputGroupState = \"default\" | \"error\" | \"warning\" | \"success\";\r\n\r\n/* ── Wrapper ─────────────────────────────────────────────────────────────── */\r\nconst inputGroupVariants = cva(\r\n [\r\n \"group/input-group relative flex w-full items-center\",\r\n \"bg-bg-input dark:bg-bg-muted\",\r\n \"hover:bg-bg-input-hover dark:hover:bg-bg-muted-hover\",\r\n \"border border-border-input rounded-radius-lg\",\r\n \"transition-[border-color,box-shadow,background-color] outline-none\",\r\n \"has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50 has-[input:disabled]:hover:bg-bg-input dark:has-[input:disabled]:hover:bg-bg-muted\",\r\n ],\r\n {\r\n variants: {\r\n size: {\r\n xxs: \"min-h-form-xs px-pad-md gap-gp-xs rounded-radius-md text-body-sm font-normal\",\r\n xs: \"min-h-form-sm px-pad-xl gap-gp-md rounded-radius-md text-body-sm font-normal\",\r\n sm: \"min-h-form-md px-pad-xl gap-gp-md rounded-radius-lg text-body-sm font-normal\",\r\n md: \"min-h-form-lg px-pad-xl gap-gp-md rounded-radius-lg text-body-sm font-normal\",\r\n },\r\n state: {\r\n default: \"focus-within:border-border-brand focus-within:shadow-sh-ring\",\r\n error: \"border-border-danger-muted focus-within:border-border-danger-muted focus-within:shadow-sh-ring-danger\",\r\n warning: \"border-border-warning-muted focus-within:border-border-warning-muted focus-within:shadow-sh-ring-warning\",\r\n success: \"border-border-success-muted focus-within:border-border-success-muted focus-within:shadow-sh-ring-success\",\r\n },\r\n },\r\n defaultVariants: { size: \"md\", state: \"default\" },\r\n },\r\n);\r\n\r\nexport type InputGroupVariantProps = VariantProps<typeof inputGroupVariants>;\r\n\r\nexport interface InputGroupProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n InputGroupVariantProps {}\r\n\r\nexport const InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\r\n ({ className, size, state, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n role=\"group\"\r\n data-slot=\"input-group\"\r\n className={cn(inputGroupVariants({ size, state }), className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\nInputGroup.displayName = \"InputGroup\";\r\n\r\n/* ── Input (sem bg/border — herda do wrapper) ─────────────────────────── */\r\nconst inputGroupInputVariants = cva([\r\n \"flex-1 min-w-0 bg-transparent border-0 outline-none\",\r\n \"text-body-sm font-normal text-fg-default placeholder:text-fg-muted placeholder:opacity-70\",\r\n \"disabled:cursor-not-allowed\",\r\n \"file:inline-flex file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-fg-default\",\r\n]);\r\n\r\nexport interface InputGroupInputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement> {}\r\n\r\nexport const InputGroupInput = React.forwardRef<\r\n HTMLInputElement,\r\n InputGroupInputProps\r\n>(({ className, type, ...props }, ref) => (\r\n <input\r\n ref={ref}\r\n type={type}\r\n data-slot=\"input-group-input\"\r\n className={cn(inputGroupInputVariants(), className)}\r\n {...props}\r\n />\r\n));\r\nInputGroupInput.displayName = \"InputGroupInput\";\r\n\r\n/* ── Textarea ──────────────────────────────────────────────────────────── */\r\nconst inputGroupTextareaVariants = cva([\r\n \"flex-1 min-w-0 bg-transparent border-0 outline-none resize-y\",\r\n \"py-pad-md\",\r\n \"text-body-sm font-normal leading-[1.5] text-fg-default placeholder:text-fg-muted placeholder:opacity-70\",\r\n \"disabled:cursor-not-allowed\",\r\n]);\r\n\r\nexport interface InputGroupTextareaProps\r\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\r\n\r\nexport const InputGroupTextarea = React.forwardRef<\r\n HTMLTextAreaElement,\r\n InputGroupTextareaProps\r\n>(({ className, ...props }, ref) => (\r\n <textarea\r\n ref={ref}\r\n data-slot=\"input-group-textarea\"\r\n className={cn(inputGroupTextareaVariants(), className)}\r\n {...props}\r\n />\r\n));\r\nInputGroupTextarea.displayName = \"InputGroupTextarea\";\r\n\r\n/* ── Addon (prefix/suffix slot) ───────────────────────────────────────── */\r\nconst inputGroupAddonVariants = cva(\r\n \"flex items-center text-fg-muted shrink-0 select-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n {\r\n variants: {\r\n align: {\r\n // Inline = horizontal (start/end do eixo do texto)\r\n \"inline-start\": \"\",\r\n \"inline-end\": \"\",\r\n // Block = vertical (top/bottom — multi-linha em textarea)\r\n \"block-start\": \"\",\r\n \"block-end\": \"\",\r\n },\r\n },\r\n defaultVariants: { align: \"inline-start\" },\r\n },\r\n);\r\n\r\nexport type InputGroupAddonAlign =\r\n | \"inline-start\"\r\n | \"inline-end\"\r\n | \"block-start\"\r\n | \"block-end\";\r\n\r\nexport interface InputGroupAddonProps\r\n extends React.HTMLAttributes<HTMLDivElement> {\r\n align?: InputGroupAddonAlign;\r\n}\r\n\r\nexport const InputGroupAddon = React.forwardRef<\r\n HTMLDivElement,\r\n InputGroupAddonProps\r\n>(({ className, align = \"inline-start\", onClick, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n role=\"group\"\r\n data-slot=\"input-group-addon\"\r\n data-align={align}\r\n className={cn(inputGroupAddonVariants({ align }), className)}\r\n onClick={(e) => {\r\n // Click no addon (ícone, texto, espaço vazio) → foca o input do grupo.\r\n // Botões dentro do addon (`InputGroupButton`) continuam funcionando.\r\n if ((e.target as HTMLElement).closest(\"button\")) {\r\n onClick?.(e);\r\n return;\r\n }\r\n e.currentTarget.parentElement\r\n ?.querySelector<HTMLInputElement | HTMLTextAreaElement>(\r\n \"input, textarea\",\r\n )\r\n ?.focus();\r\n onClick?.(e);\r\n }}\r\n {...props}\r\n />\r\n));\r\nInputGroupAddon.displayName = \"InputGroupAddon\";\r\n\r\n/* ── Text (texto formatado dentro do addon) ───────────────────────────── */\r\nexport interface InputGroupTextProps\r\n extends React.HTMLAttributes<HTMLSpanElement> {}\r\n\r\nexport const InputGroupText = React.forwardRef<\r\n HTMLSpanElement,\r\n InputGroupTextProps\r\n>(({ className, ...props }, ref) => (\r\n <span\r\n ref={ref}\r\n data-slot=\"input-group-text\"\r\n className={cn(\r\n \"text-body-xs text-fg-muted whitespace-nowrap\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n));\r\nInputGroupText.displayName = \"InputGroupText\";\r\n\r\n/* ── Button (botão dentro do addon — ex copy/clear) ───────────────────── */\r\nconst inputGroupButtonVariants = cva(\r\n [\r\n \"inline-flex items-center justify-center shrink-0\",\r\n \"rounded-radius-md transition-colors outline-none cursor-pointer\",\r\n \"focus-visible:ring-4 focus-visible:ring-ring-brand\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"[&_svg]:size-4 [&_svg]:shrink-0\",\r\n ],\r\n {\r\n variants: {\r\n size: {\r\n xs: \"h-form-xs px-pad-md gap-gp-xs text-body-xs font-normal\",\r\n \"icon-xs\": \"size-form-xs\",\r\n sm: \"h-form-sm px-pad-lg gap-gp-md text-body-xs font-normal\",\r\n \"icon-sm\": \"size-form-sm\",\r\n },\r\n variant: {\r\n default: \"bg-bg-muted text-fg-default hover:bg-bg-muted-hover\",\r\n destructive: \"bg-bg-danger text-fg-on-danger hover:bg-bg-danger-hover\",\r\n outline: \"border border-border-input bg-transparent text-fg-default hover:bg-bg-muted\",\r\n secondary: \"bg-bg-emphasis text-fg-default hover:bg-bg-muted-hover\",\r\n ghost: \"bg-transparent text-fg-muted hover:bg-bg-muted hover:text-fg-default\",\r\n link: \"bg-transparent text-fg-brand underline-offset-4 hover:underline\",\r\n },\r\n },\r\n defaultVariants: { size: \"xs\", variant: \"ghost\" },\r\n },\r\n);\r\n\r\nexport interface InputGroupButtonProps\r\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"size\">,\r\n VariantProps<typeof inputGroupButtonVariants> {}\r\n\r\nexport const InputGroupButton = React.forwardRef<\r\n HTMLButtonElement,\r\n InputGroupButtonProps\r\n>(({ className, size, variant, type = \"button\", ...props }, ref) => (\r\n <button\r\n ref={ref}\r\n type={type}\r\n data-slot=\"input-group-button\"\r\n className={cn(inputGroupButtonVariants({ size, variant }), className)}\r\n {...props}\r\n />\r\n));\r\nInputGroupButton.displayName = \"InputGroupButton\";\r\n\r\nexport {\r\n inputGroupVariants,\r\n inputGroupInputVariants,\r\n inputGroupTextareaVariants,\r\n inputGroupAddonVariants,\r\n inputGroupButtonVariants,\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","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\r\nimport { Check, ChevronRight } from \"lucide-react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\n/**\r\n * DropdownMenu — alinhado com `.tbl-row-actions-menu` / `.tbl-more-menu`\r\n * do design-and-table-v2.\r\n *\r\n * Container:\r\n * - bg-bg-dropdown (token frosted-glass — solid no light, 70% transparent + blur no dark)\r\n * - border 1px + radius 12px + padding 6px + shadow-lg\r\n * - min-w 180px, items separados por 1px (gap-px)\r\n *\r\n * Item:\r\n * - h variavel, padding 8/10, radius 6px, gap 10, font 13px medium\r\n * - rest: fg-muted (texto + ícone), hover/focus: bg-muted + fg-default\r\n * - variant=\"destructive\": fg-danger + hover bg-danger-muted\r\n *\r\n * Divider:\r\n * - 1px bg-border-default com margin 4px (não estende além do padding)\r\n */\r\n\r\nconst DropdownMenu = DropdownMenuPrimitive.Root\r\n\r\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\r\n\r\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\r\n\r\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\r\n\r\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\r\n\r\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\r\n\r\n/* ── Container (Content + SubContent) ─────────────────────────────────────── */\r\nconst CONTAINER_CLASSES = [\r\n \"relative z-50 min-w-[180px] overflow-hidden\",\r\n \"flex flex-col gap-px\",\r\n \"rounded-[12px] bg-bg-dropdown p-pad-sm\",\r\n \"border border-border-default shadow-sh-lg\",\r\n // Outline padrão de elementos flutuantes\r\n \"outline-float\",\r\n \"text-fg-muted\",\r\n // Frosted-glass blur (necessário pra fazer o bg-dropdown semi-transparent render correto no dark)\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 // Animações Radix\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 \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\r\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n \"origin-[--radix-dropdown-menu-content-transform-origin]\",\r\n].join(\" \")\r\n\r\n/* ── Mobile sheet (só Content, <md) ───────────────────────────────────────\r\n * Em telas <md o Content vira sheet bottom-up colado nas bordas: full-width,\r\n * só cantos superiores arredondados, flush, sem outline/shadow, cap 92vh.\r\n * O reposicionamento do wrapper Radix é feito no globals.css via [data-mobile-sheet].\r\n * Animação: neutraliza o zoom e desliza de baixo (sobrescreve os slides por side).\r\n */\r\nconst MOBILE_SHEET_CLASSES = [\r\n \"max-md:w-full max-md:min-w-0 max-md:max-w-none\",\r\n \"max-md:!max-h-[92vh]\",\r\n \"max-md:rounded-b-none max-md:rounded-t-[12px]\",\r\n \"max-md:border-x-0 max-md:border-b-0\",\r\n \"max-md:outline-none max-md:shadow-none\",\r\n \"max-md:data-[state=open]:zoom-in-100 max-md:data-[state=closed]:zoom-out-100\",\r\n \"max-md:data-[state=open]:slide-in-from-bottom-12 max-md:data-[state=closed]:slide-out-to-bottom-12\",\r\n].join(\" \")\r\n\r\n/* ── Item base ────────────────────────────────────────────────────────────── */\r\nconst ITEM_BASE = [\r\n \"relative flex cursor-default select-none items-center\",\r\n \"gap-pad-lg px-pad-lg py-pad-md rounded-radius-sm\",\r\n \"text-body-sm font-medium\",\r\n \"outline-none transition-colors\",\r\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n \"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n].join(\" \")\r\n\r\nconst ITEM_VARIANT_DEFAULT = [\r\n \"text-fg-muted [&_svg]:text-fg-muted\",\r\n \"focus:bg-bg-muted focus:text-fg-default focus:[&_svg]:text-fg-default\",\r\n].join(\" \")\r\n\r\nconst ITEM_VARIANT_DESTRUCTIVE = [\r\n \"text-fg-danger [&_svg]:text-fg-danger\",\r\n \"focus:bg-bg-danger-muted focus:text-fg-danger focus:[&_svg]:text-fg-danger\",\r\n].join(\" \")\r\n\r\n/* ── SubTrigger ───────────────────────────────────────────────────────────── */\r\nconst DropdownMenuSubTrigger = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubTrigger\r\n ref={ref}\r\n className={cn(\r\n ITEM_BASE,\r\n ITEM_VARIANT_DEFAULT,\r\n \"data-[state=open]:bg-bg-muted data-[state=open]:text-fg-default\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRight className=\"ml-auto\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n))\r\nDropdownMenuSubTrigger.displayName =\r\n DropdownMenuPrimitive.SubTrigger.displayName\r\n\r\n/* ── SubContent ───────────────────────────────────────────────────────────── */\r\nconst DropdownMenuSubContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubContent\r\n ref={ref}\r\n className={cn(CONTAINER_CLASSES, className)}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSubContent.displayName =\r\n DropdownMenuPrimitive.SubContent.displayName\r\n\r\n/* ── Content ──────────────────────────────────────────────────────────────── */\r\nconst DropdownMenuContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & {\r\n /**\r\n * Em telas <md, transforma o menu em sheet bottom-up colado nas bordas,\r\n * com backdrop suave (toque fora fecha via dismiss do Radix). Default true.\r\n * Passe `false` pra manter o popover ancorado no trigger também em mobile.\r\n */\r\n mobileSheet?: boolean\r\n }\r\n>(({ className, sideOffset = 8, mobileSheet = true, ...props }, ref) => (\r\n <>\r\n {/* Backdrop suave — só mobile (md:hidden), em Portal próprio (cada Portal\r\n Radix aceita 1 filho e é montado/desmontado junto com o menu via Presence).\r\n\r\n ⚠️ pointer-events-NONE (não auto). O DropdownMenu do Radix abre no\r\n `pointerdown`; o backdrop monta via React no meio do gesto e, com\r\n pointer-events-auto, captura o `pointerup`/`click` seguinte → o menu\r\n abre e fecha no mesmo toque (bug do avatar/UserMenu dentro do drawer\r\n mobile). Com pointer-events-none o gesto de abertura passa direto e o\r\n dismiss por toque-fora continua funcionando (Radix escuta pointerdown\r\n a nível de document, independente do backdrop capturar). z-[55] fica\r\n acima do drawer mobile (z-50) só pra escurecer; o Content vai a z-60. */}\r\n {mobileSheet && (\r\n <DropdownMenuPrimitive.Portal>\r\n <div\r\n aria-hidden=\"true\"\r\n className=\"fixed inset-0 z-[55] bg-overlay-scrim pointer-events-none md:hidden animate-in fade-in-0 duration-150\"\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n )}\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n data-mobile-sheet={mobileSheet ? \"\" : undefined}\r\n className={cn(\r\n CONTAINER_CLASSES,\r\n \"max-h-[var(--radix-dropdown-menu-content-available-height)] overflow-y-auto overflow-x-hidden\",\r\n mobileSheet && MOBILE_SHEET_CLASSES,\r\n className\r\n )}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n </>\r\n))\r\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\r\n\r\n/* ── Item ─────────────────────────────────────────────────────────────────── */\r\nconst DropdownMenuItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean\r\n /** Variante semântica — \"destructive\" pinta fg-danger e usa bg-danger-muted no hover */\r\n variant?: \"default\" | \"destructive\"\r\n }\r\n>(({ className, inset, variant = \"default\", ...props }, ref) => (\r\n <DropdownMenuPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n ITEM_BASE,\r\n variant === \"destructive\" ? ITEM_VARIANT_DESTRUCTIVE : ITEM_VARIANT_DEFAULT,\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\r\n\r\n/* ── CheckboxItem ─────────────────────────────────────────────────────────── */\r\nconst DropdownMenuCheckboxItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\r\n>(({ className, children, checked, ...props }, ref) => (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n ref={ref}\r\n className={cn(\r\n ITEM_BASE,\r\n ITEM_VARIANT_DEFAULT,\r\n \"pl-8 pr-pad-lg\",\r\n className\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"absolute left-pad-md flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n))\r\nDropdownMenuCheckboxItem.displayName =\r\n DropdownMenuPrimitive.CheckboxItem.displayName\r\n\r\n/* ── RadioItem ────────────────────────────────────────────────────────────── */\r\n/**\r\n * RadioItem — item selecionado ganha tom brand:\r\n * - rest: fg-muted (igual default item)\r\n * - hover: bg-muted + fg-default (igual default item)\r\n * - checked: bg-bg-brand-subtle + fg-fg-brand (estado ativo destacado)\r\n *\r\n * Indicator: `<Check />` consistente com `<DropdownMenuCheckboxItem>` (antes era `<Circle />`).\r\n */\r\nconst DropdownMenuRadioItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\r\n>(({ className, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.RadioItem\r\n ref={ref}\r\n className={cn(\r\n ITEM_BASE,\r\n ITEM_VARIANT_DEFAULT,\r\n \"pl-8 pr-pad-lg\",\r\n // Selected state — brand tint (mantém no focus pra não voltar pra muted)\r\n \"data-[state=checked]:bg-bg-brand-subtle data-[state=checked]:text-fg-brand\",\r\n \"data-[state=checked]:[&_svg]:text-fg-brand\",\r\n \"data-[state=checked]:focus:bg-bg-brand-subtle data-[state=checked]:focus:text-fg-brand\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-pad-md flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"size-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n))\r\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\r\n\r\n/* ── Label ────────────────────────────────────────────────────────────────── */\r\nconst DropdownMenuLabel = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Label\r\n ref={ref}\r\n className={cn(\r\n \"px-pad-lg py-pad-sm text-caption-sm font-semibold uppercase tracking-wider text-fg-subtle\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\r\n\r\n/* ── Separator (divider) ──────────────────────────────────────────────────── */\r\nconst DropdownMenuSeparator = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"mx-pad-xs my-pad-xs h-px bg-border-default\", className)}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\r\n\r\n/* ── Shortcut (texto à direita do item) ───────────────────────────────────── */\r\nconst DropdownMenuShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\"ml-auto text-caption-sm tracking-wider text-fg-subtle\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuGroup,\r\n DropdownMenuPortal,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuRadioGroup,\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\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n headerRoot,\r\n headerLeft,\r\n headerRight,\r\n headerDivider,\r\n headerIconBtn,\r\n} from \"./header.styles\";\r\nimport { HeaderBreadcrumb } from \"./header-breadcrumb\";\r\nimport { HeaderSearch } from \"./header-search\";\r\nimport { HeaderNotifications } from \"./header-notifications\";\r\nimport { HeaderMessages } from \"./header-messages\";\r\nimport { HeaderThemeSwitcher } from \"./header-theme-switcher\";\r\nimport type { HeaderProps } from \"./header.types\";\r\n\r\n/**\r\n * Header — top bar template (rail-friendly).\r\n *\r\n * Layout:\r\n * left: [collapse btn] [divider] [breadcrumb]\r\n * right: [rightSlot] [search] [theme] [messages] [notifications]\r\n *\r\n * Posicionamento (sticky/fixed) é responsabilidade do template consumer.\r\n * Componente só define altura/layout/cores (60px, border-bottom).\r\n *\r\n * Todos os blocos do `right` são opcionais:\r\n * - search desliga via `showSearch={false}`\r\n * - notifications/messages/theme escondem o ícone se config não passada\r\n * - onCollapseMenu omitido esconde o botão de collapse\r\n */\r\nexport function Header({\r\n breadcrumb,\r\n onCollapseMenu,\r\n menuCollapsed,\r\n showSearch = true,\r\n searchPlaceholder = \"Buscar...\",\r\n searchShortcut = \"⌘K\",\r\n commandGroups,\r\n commandPlaceholder,\r\n commandEmptyMessage,\r\n notifications,\r\n messages,\r\n theme,\r\n onThemeChange,\r\n themeOptions,\r\n rightSlot,\r\n className,\r\n}: HeaderProps) {\r\n return (\r\n <header className={cn(headerRoot(), className)}>\r\n <div className={headerLeft()}>\r\n {onCollapseMenu && (\r\n <>\r\n {/* Desktop: collapse panel (toggle sidebar) */}\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n headerIconBtn({ variant: \"ghost\" }),\r\n \"hidden md:inline-flex text-fg-muted hover:text-fg-default\",\r\n )}\r\n onClick={onCollapseMenu}\r\n aria-label={menuCollapsed ? \"Expandir menu\" : \"Colapsar menu\"}\r\n title={menuCollapsed ? \"Expandir menu\" : \"Colapsar menu\"}\r\n >\r\n {menuCollapsed ? (\r\n <PanelLeftOpen size={20} strokeWidth={1.7} />\r\n ) : (\r\n <PanelLeftClose size={20} strokeWidth={1.7} />\r\n )}\r\n </button>\r\n {/* Mobile: hamburger */}\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n headerIconBtn({ variant: \"ghost\" }),\r\n \"md:hidden text-fg-muted hover:text-fg-default\",\r\n )}\r\n onClick={onCollapseMenu}\r\n aria-label=\"Abrir menu\"\r\n title=\"Menu\"\r\n >\r\n <Menu size={20} strokeWidth={1.8} />\r\n </button>\r\n {/* Divider só em desktop */}\r\n <span\r\n className={cn(headerDivider(), \"hidden md:block\")}\r\n aria-hidden=\"true\"\r\n />\r\n </>\r\n )}\r\n\r\n {/* Breadcrumb mostra todos os items em desktop;\r\n em mobile só o último (título da seção). */}\r\n <HeaderBreadcrumb\r\n items={breadcrumb}\r\n mobileShowLastOnly\r\n />\r\n </div>\r\n\r\n <div className={headerRight()}>\r\n {rightSlot}\r\n\r\n {showSearch && (\r\n <HeaderSearch\r\n placeholder={searchPlaceholder}\r\n shortcut={searchShortcut}\r\n commandGroups={commandGroups}\r\n commandPlaceholder={commandPlaceholder}\r\n commandEmptyMessage={commandEmptyMessage}\r\n />\r\n )}\r\n\r\n {/* Theme switcher: desktop only */}\r\n {theme !== undefined && onThemeChange && (\r\n <div className=\"hidden md:contents\">\r\n <HeaderThemeSwitcher\r\n theme={theme}\r\n onThemeChange={onThemeChange}\r\n options={themeOptions}\r\n />\r\n </div>\r\n )}\r\n\r\n {messages && <HeaderMessages config={messages} />}\r\n\r\n {notifications && <HeaderNotifications config={notifications} />}\r\n </div>\r\n </header>\r\n );\r\n}\r\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 * 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","import type { ReactNode } 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 type { SidebarContext } 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 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 className,\r\n}: SidebarRailProps) {\r\n return (\r\n <aside className={cn(sidebarRail(), className)}>\r\n <a href=\"/\" className={sidebarRailBrand()} aria-label=\"Home\">\r\n {brand ?? <SidebarBrandIcon />}\r\n </a>\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","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 type { SidebarMenuItem, SidebarBadgeKind } 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 className?: string;\r\n};\r\n\r\nexport const SidebarItem = forwardRef<HTMLAnchorElement | HTMLButtonElement, SidebarItemProps>(\r\n ({ item, active, subitem, iconBrand, onClick, className }, ref) => {\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 if (item.onClick) item.onClick(e);\r\n onClick?.(e);\r\n };\r\n\r\n if (item.href) {\r\n return (\r\n <a\r\n ref={ref as React.Ref<HTMLAnchorElement>}\r\n href={item.href}\r\n className={classes}\r\n onClick={handleClick}\r\n aria-current={active ? \"page\" : undefined}\r\n >\r\n {content}\r\n </a>\r\n );\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 { SidebarMenuItem } from \"./sidebar.types\";\r\n\r\nexport type SidebarSubgroupProps = {\r\n item: SidebarMenuItem;\r\n activeItemHref?: string;\r\n onItemClick?: (item: SidebarMenuItem) => void;\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 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={() => onItemClick?.(sub)}\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 type { SidebarSection as SidebarSectionData } 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 className?: string;\r\n};\r\n\r\nexport function SidebarSection({\r\n section,\r\n open,\r\n onOpenChange,\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 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 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 `<button>` ─────────────────────────────────── */\r\nfunction SidebarSectionLink({\r\n href,\r\n onClick,\r\n title,\r\n children,\r\n}: {\r\n href?: string;\r\n onClick?: (e: MouseEvent<HTMLAnchorElement>) => void;\r\n title?: string;\r\n children: React.ReactNode;\r\n}) {\r\n const handleClick = (e: MouseEvent<HTMLAnchorElement>) => {\r\n if (!href || href === \"#\") e.preventDefault();\r\n onClick?.(e);\r\n };\r\n\r\n return (\r\n <a\r\n href={href ?? \"#\"}\r\n className={sidebarSectionItem()}\r\n onClick={handleClick}\r\n title={title}\r\n >\r\n {children}\r\n </a>\r\n );\r\n}\r\n","import type { ReactNode } 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 { SidebarContext, SidebarMenuItem } 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?: (item: SidebarMenuItem) => void;\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 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 />\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={() => onItemClick?.(item)}\r\n />\r\n );\r\n })}\r\n </div>\r\n\r\n {context.sections?.map((section) => (\r\n <SidebarSection key={section.id} section={section} />\r\n ))}\r\n </>\r\n )}\r\n </div>\r\n </aside>\r\n );\r\n}\r\n","import { useState, useCallback } from \"react\";\r\n\r\n/**\r\n * Hook genérico controlled/uncontrolled.\r\n * - Se `controlledValue` for fornecido, opera em modo controlled.\r\n * - Caso contrário, usa o `defaultValue` como inicial e gerencia internamente.\r\n */\r\nexport function useControllable<T>(\r\n controlledValue: T | undefined,\r\n defaultValue: T,\r\n onChange?: (value: T) => void\r\n): [T, (value: T) => void] {\r\n const isControlled = controlledValue !== undefined;\r\n const [internalValue, setInternalValue] = useState<T>(defaultValue);\r\n const value = isControlled ? (controlledValue as T) : internalValue;\r\n\r\n const setValue = useCallback(\r\n (next: T) => {\r\n if (!isControlled) setInternalValue(next);\r\n onChange?.(next);\r\n },\r\n [isControlled, onChange]\r\n );\r\n\r\n return [value, setValue];\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\n/**\r\n * Reactive media query matcher.\r\n *\r\n * Re-renderiza quando o resultado da media query muda (resize do viewport,\r\n * mudança de orientação, etc).\r\n *\r\n * Uso:\r\n * const isMobile = useMediaQuery(\"(max-width: 767px)\");\r\n */\r\nexport function useMediaQuery(query: string): boolean {\r\n const [matches, setMatches] = useState<boolean>(() => {\r\n if (typeof window === \"undefined\") return false;\r\n return window.matchMedia(query).matches;\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n const mql = window.matchMedia(query);\r\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\r\n setMatches(mql.matches);\r\n mql.addEventListener(\"change\", handler);\r\n return () => mql.removeEventListener(\"change\", handler);\r\n }, [query]);\r\n\r\n return matches;\r\n}\r\n","import { useEffect, useRef, useState } 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 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 const handleItemClick = (item: SidebarMenuItem) => {\r\n if (item.href && activeItemHref === undefined) {\r\n setItemHref(item.href);\r\n }\r\n onItemClick?.(item);\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 />\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 />\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 * as React from \"react\"\r\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst Avatar = React.forwardRef<\r\n React.ElementRef<typeof AvatarPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\r\n>(({ className, ...props }, ref) => (\r\n <AvatarPrimitive.Root\r\n ref={ref}\r\n className={cn(\r\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nAvatar.displayName = AvatarPrimitive.Root.displayName\r\n\r\nconst AvatarImage = React.forwardRef<\r\n React.ElementRef<typeof AvatarPrimitive.Image>,\r\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\r\n>(({ className, ...props }, ref) => (\r\n <AvatarPrimitive.Image\r\n ref={ref}\r\n className={cn(\"aspect-square h-full w-full\", className)}\r\n {...props}\r\n />\r\n))\r\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\r\n\r\n/**\r\n * AvatarFallback — `text-body-sm font-normal` (13px) como default mais compacto.\r\n *\r\n * Antes usava `text-body-md font-medium` (14px) que ficava grande demais em avatares\r\n * pequenos (≤24px), forçando consumer a sobrescrever via className. Caption\r\n * é mais seguro como default — consumer ainda pode override (ex: `text-caption-xs`\r\n * pra container muito pequeno, ou `text-body-lg font-medium` pra avatar grande).\r\n */\r\nconst AvatarFallback = React.forwardRef<\r\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\r\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\r\n>(({ className, ...props }, ref) => (\r\n <AvatarPrimitive.Fallback\r\n ref={ref}\r\n className={cn(\r\n \"flex h-full w-full items-center justify-center rounded-full bg-bg-muted text-fg-muted text-body-sm font-normal\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\r\n\r\nexport { Avatar, AvatarImage, AvatarFallback }\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) e `p-pad-6xl` (32px) por design — slot\r\n * \"padronizado\" pra todas as telas. Consumer customiza só os filhos.\r\n */\r\n\r\nexport const root = tv({\r\n base: [\r\n \"flex h-screen w-full bg-bg-canvas\",\r\n \"overflow-hidden\", // garante que sidebar + main não vazem viewport\r\n ],\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 * Mobile (<md): padding reduzido pra 18px — telas pequenas precisam respiro\r\n * mínimo mas não zero (chat/navegação por overlays usam o bodyInner cheio).\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\",\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 { 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 } 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\r\n * - Sem nenhum dos dois → uncontrolled, default `false`\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({\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 // 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 = false,\r\n onMenuCollapseChange,\r\n // Body\r\n children,\r\n bodyClassName,\r\n mobileEdgeToEdge,\r\n className,\r\n}: AppShellProps) {\r\n const [internalCollapsed, setInternalCollapsed] = useState<boolean>(defaultMenuCollapsed);\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 return (\r\n <div className={cn(s.root(), className)}>\r\n <MenuSidebar\r\n contexts={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 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 <div className={s.main()}>\r\n <Header\r\n breadcrumb={breadcrumb}\r\n onCollapseMenu={handleToggleMenu}\r\n menuCollapsed={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"],"names":["tvBase","Button","Fragment","DialogPrimitive","CommandPrimitive","Chip","ChipGroup","ChipGroupItem","DEFAULT_FILTERS","s.root","s.main","s.body","s.bodyInner"],"mappings":"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"}