@rendra-ui/web 2.8.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/base.css +1 -1
- package/dist/{button-CrSlVIsY.js → button-BcCBrlnt.js} +6 -6
- package/dist/{button-CrSlVIsY.js.map → button-BcCBrlnt.js.map} +1 -1
- package/dist/chart.js +7 -7
- package/dist/cli/auditar.js +1 -1
- package/dist/cli/codigos.js +2 -2
- package/dist/cli/executar-auditar.js +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/trocar.js +2 -2
- package/dist/cli/typescript-loader.js +1 -1
- package/dist/{cn-BlJHpkDs.js → cn-CpdCvlkP.js} +2 -2
- package/dist/{cn-BlJHpkDs.js.map → cn-CpdCvlkP.js.map} +1 -1
- package/dist/{components-6RpoJ2Od.js → components-Bus_Jh2R.js} +7 -4
- package/dist/components-Bus_Jh2R.js.map +1 -0
- package/dist/components.css +67 -26
- package/dist/document-viewer.js +4 -4
- package/dist/{dropdown-menu-BUGKtR6k.js → dropdown-menu-B3L1XSDf.js} +5 -5
- package/dist/{dropdown-menu-BUGKtR6k.js.map → dropdown-menu-B3L1XSDf.js.map} +1 -1
- package/dist/{brand-feedback-icon-CVux4pNh.js → empty-state-Bcx4M0Me.js} +64 -4
- package/dist/empty-state-Bcx4M0Me.js.map +1 -0
- package/dist/{features-max-BCIy1Ic-.js → features-max-CoyJ_kuK.js} +1 -1
- package/dist/flow.js +2818 -868
- package/dist/flow.js.map +1 -1
- package/dist/index.js +80 -465
- package/dist/index.js.map +1 -1
- package/dist/{motion-context-PJPj6X4g.js → motion-context-DWFl2xRr.js} +4 -4
- package/dist/{motion-context-PJPj6X4g.js.map → motion-context-DWFl2xRr.js.map} +1 -1
- package/dist/{motion-on-Bocf4Smc.js → motion-on-zwsBqYZL.js} +2 -2
- package/dist/{motion-on-Bocf4Smc.js.map → motion-on-zwsBqYZL.js.map} +1 -1
- package/dist/motion.js +2 -2
- package/dist/{rendra-provider-Do_qWjJC.js → rendra-provider-DuIhBatD.js} +3 -3
- package/dist/{rendra-provider-Do_qWjJC.js.map → rendra-provider-DuIhBatD.js.map} +1 -1
- package/dist/rich-text-editor.js +4 -4
- package/dist/router-bridge.js +2 -2
- package/dist/{timeline-xrMHeV92.js → toast-C7qYslCp.js} +464 -80
- package/dist/toast-C7qYslCp.js.map +1 -0
- package/dist/tokens.css +1 -1
- package/dist/{tooltip-to0h6aPe.js → tooltip-BSPO-bH4.js} +5 -5
- package/dist/{tooltip-to0h6aPe.js.map → tooltip-BSPO-bH4.js.map} +1 -1
- package/dist/types/components/ui/flow-config-panels.d.ts +10 -0
- package/dist/types/components/ui/flow-editor.d.ts +5 -0
- package/dist/types/components/ui/flow-sidebar.d.ts +21 -0
- package/dist/types/components/ui/flow-simulation-panel.d.ts +20 -0
- package/dist/types/components/ui/flow-viewer.d.ts +27 -10
- package/dist/types/flow.d.ts +1 -1
- package/dist/types/lib/flow-blocks.d.ts +122 -0
- package/dist/types/lib/flow-edit.d.ts +88 -0
- package/dist/types/lib/flow-layout.d.ts +3 -0
- package/dist/types/lib/flow-sim.d.ts +24 -0
- package/dist/types/lib/flow.d.ts +30 -80
- package/dist/{use-breakpoint-CM-yeDHJ.js → use-breakpoint-BGmY3ir-.js} +2 -2
- package/dist/{use-breakpoint-CM-yeDHJ.js.map → use-breakpoint-BGmY3ir-.js.map} +1 -1
- package/dist/{use-motion-presets-I4StrsCi.js → use-motion-presets-CmMLBQLI.js} +3 -3
- package/dist/{use-motion-presets-I4StrsCi.js.map → use-motion-presets-CmMLBQLI.js.map} +1 -1
- package/dist/widget-grid.js +2 -2
- package/package.json +2 -1
- package/dist/brand-feedback-icon-CVux4pNh.js.map +0 -1
- package/dist/components-6RpoJ2Od.js.map +0 -1
- package/dist/empty-state-i4e-LacG.js +0 -67
- package/dist/empty-state-i4e-LacG.js.map +0 -1
- package/dist/timeline-xrMHeV92.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/lib/motion/reorder.ts","../src/lib/motion/count.ts","../src/components/ui/accordion.tsx","../src/lib/initials.ts","../src/components/ui/avatar.tsx","../src/components/ui/badge.tsx","../src/components/ui/brand-logo.tsx","../src/components/ui/breadcrumb.tsx","../src/components/ui/button-group.tsx","../src/components/ui/calendar.tsx","../src/components/ui/popover.tsx","../src/assets/channels/facebook.png","../src/assets/channels/google.png","../src/assets/channels/instagram.png","../src/assets/channels/reclameaqui.png","../src/assets/channels/tiktok.png","../src/assets/channels/whatsapp-web.png","../src/assets/channels/whatsapp.png","../src/components/ui/chat.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/checklist.tsx","../src/brand/palette.ts","../src/components/ui/color-picker.tsx","../src/components/ui/switch.tsx","../src/components/ui/data-toolbar.tsx","../src/components/ui/date-picker.tsx","../src/components/ui/error-page.tsx","../src/components/ui/form.tsx","../src/components/ui/slider.tsx","../src/components/ui/tabs.tsx","../src/lib/sortable.ts","../src/components/ui/image-cropper.tsx","../src/components/ui/image-viewer.tsx","../src/components/ui/kanban.tsx","../src/components/ui/sortable-handle.tsx","../src/components/ui/list.tsx","../src/components/ui/otp-input.tsx","../src/components/ui/pagination.tsx","../src/components/ui/progress.tsx","../src/lib/qr-encode.ts","../src/components/ui/qr-code.tsx","../src/components/ui/radio-group.tsx","../src/components/ui/rating.tsx","../src/components/ui/rendra-credit.tsx","../src/components/ui/repeatable-field.tsx","../src/components/ui/separator.tsx","../src/components/ui/skeleton.tsx","../src/components/ui/stat-card.tsx","../src/hooks/use-debounced-value.ts","../src/components/ui/table.tsx","../src/components/ui/textarea.tsx","../src/components/ui/toast.tsx","../src/components/ui/upload.tsx","../src/components/ui/wizard.tsx","../src/components/layout/primitives.tsx","../src/components/layout/page-header.tsx","../src/components/app-shell/command-search.tsx","../src/lib/shape.ts","../src/components/app-shell/layout.ts","../src/components/app-shell/mega-menu.tsx","../src/components/app-shell/notifications.tsx","../src/components/app-shell/header.tsx","../src/components/app-shell/navigation-utils.ts","../src/components/app-shell/sidebar.tsx","../src/components/app-shell/app-shell.tsx","../src/lib/contrast.ts","../src/lib/validators.ts","../src/brand/apply-theme.ts","../src/brand/brand-provider.tsx","../src/brand/theme.ts"],"sourcesContent":["import type { MotionMode } from './motion-context'\n\n/*\n * Regra de reordenação (kanban, list, upload): o `layout` do Motion só fica ligado quando\n * não há arraste em curso. Sob o dedo ou o ponteiro a ordem muda a cada passo, e animar cada\n * passo atrasaria o item atrás do cursor; ao soltar (ou pelo teclado/menu) a ordem muda de uma\n * vez, e aí o layout anima o resultado.\n */\nexport function layoutEnabled({\n mode,\n ready,\n dragging,\n}: {\n mode: MotionMode\n /** O chunk do `domMax` já chegou (`useLayoutReady`). Antes disso `layout` não faz nada. */\n ready: boolean\n dragging: boolean\n}) {\n return mode === 'on' && ready && !dragging\n}\n","import type { ReactNode } from 'react'\n\n/*\n * Contador do StatCard: lê o `value` (número, ou texto com número em pt-BR, como\n * \"R$ 1.234,50\", \"98%\" ou \"12,5 mil\"), preserva prefixo, sufixo, casas decimais e agrupamento,\n * e reescreve o número durante a contagem. O que não for número devolve null (só aparece, sem\n * contar). No fim da contagem o texto é exatamente o `value` original.\n */\n\nexport interface ParsedNumber {\n /** Tudo antes do número (inclui o sinal de menos). */\n prefix: string\n /** Tudo depois do número. */\n suffix: string\n /** Valor numérico (sem sinal no `prefix`: o sinal já está aqui). */\n value: number\n decimals: number\n /** Separador de milhar \".\" (texto pt-BR que o usava). */\n grouping: boolean\n /** Separador decimal: \",\" no texto pt-BR, \".\" no número do JavaScript. */\n decimalSeparator: ',' | '.'\n}\n\n// prefixo sem dígito nem sinal, sinal opcional, inteiro (com milhar \".\" ou sem), decimais, sufixo sem dígito.\nconst PT_BR = /^([^\\d-]*)(-?)(\\d{1,3}(?:\\.\\d{3})+|\\d+)(?:,(\\d+))?([^\\d]*)$/\n\nexport function parseLocaleNumber(value: ReactNode): ParsedNumber | null {\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) return null\n const text = String(Math.abs(value))\n if (/e/i.test(text)) return null\n const decimals = text.includes('.') ? text.split('.')[1]!.length : 0\n return {\n prefix: value < 0 ? '-' : '',\n suffix: '',\n value: Math.abs(value),\n decimals,\n grouping: false,\n decimalSeparator: '.',\n }\n }\n if (typeof value !== 'string') return null\n const match = PT_BR.exec(value)\n if (!match) return null\n const [, prefix = '', sign = '', integer = '', fraction = '', suffix = ''] = match\n const grouping = integer.includes('.')\n const n = Number(`${integer.replace(/\\./g, '')}${fraction ? `.${fraction}` : ''}`)\n if (!Number.isFinite(n)) return null\n return {\n prefix: `${prefix}${sign}`,\n suffix,\n value: n,\n decimals: fraction.length,\n grouping,\n decimalSeparator: ',',\n }\n}\n\n/** Escreve `n` com o mesmo formato do valor original. */\nexport function formatLike(parsed: ParsedNumber, n: number): string {\n const [int = '0', frac = ''] = Math.abs(n).toFixed(parsed.decimals).split('.')\n const grouped = parsed.grouping ? int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.') : int\n const number = frac ? `${grouped}${parsed.decimalSeparator}${frac}` : grouped\n return `${parsed.prefix}${number}${parsed.suffix}`\n}\n","import { ChevronDown } from 'lucide-react'\nimport { Accordion as A } from 'radix-ui'\nimport { useState, type ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface AccordionItem {\n value: string\n title: ReactNode\n content: ReactNode\n disabled?: boolean\n}\n\nexport interface AccordionProps {\n items: AccordionItem[]\n /** Permite abrir vários ao mesmo tempo. */\n multiple?: boolean\n defaultValue?: string[]\n className?: string\n}\n\n/** Accordion único, com animação de altura e área de toque de 44px no mobile. */\nexport function Accordion({ items, multiple, defaultValue, className }: AccordionProps) {\n const lib = useMotionLib()\n const presets = useMotionPresets()\n // Só em `on`: o valor aberto é espelhado aqui, para o conteúdo continuar montado durante a\n // saída animada. Sempre uma lista; no modo único tem no máximo um item.\n const [open, setOpen] = useState<string[]>(\n multiple ? (defaultValue ?? []) : defaultValue?.[0] ? [defaultValue[0]] : [],\n )\n\n if (lib) {\n const rootProps = multiple\n ? ({ type: 'multiple', value: open, onValueChange: setOpen } as const)\n : ({\n type: 'single',\n collapsible: true,\n value: open[0] ?? '',\n onValueChange: (v: string) => setOpen(v ? [v] : []),\n } as const)\n return (\n <A.Root {...rootProps} data-rendra=\"ACRN-001\" className={cn('flex flex-col', className)}>\n {items.map((it) => {\n const isOpen = open.includes(it.value)\n return (\n <A.Item\n key={it.value}\n value={it.value}\n disabled={it.disabled}\n className=\"border-b last:border-b-0\"\n >\n <A.Header>\n <A.Trigger className=\"group flex min-h-touch w-full cursor-pointer items-center justify-between gap-4 py-4 text-left text-sm font-medium transition-colors hover:text-primary-text disabled:cursor-not-allowed disabled:opacity-50 md:min-h-0\">\n {it.title}\n <lib.m.span\n aria-hidden\n className=\"flex shrink-0\"\n animate={{ rotate: isOpen ? 180 : 0 }}\n transition={presets.fade.transition}\n >\n <ChevronDown className=\"size-icon-sm text-muted-foreground\" />\n </lib.m.span>\n </A.Trigger>\n </A.Header>\n <lib.AnimatePresence initial={false}>\n {isOpen && (\n <A.Content forceMount asChild>\n <lib.m.div\n className=\"overflow-hidden text-sm wrap-break-word text-muted-foreground\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={presets.fade.transition}\n >\n <div className=\"pb-4\">{it.content}</div>\n </lib.m.div>\n </A.Content>\n )}\n </lib.AnimatePresence>\n </A.Item>\n )\n })}\n </A.Root>\n )\n }\n\n const content = items.map((it) => (\n <A.Item\n key={it.value}\n value={it.value}\n disabled={it.disabled}\n className=\"border-b last:border-b-0\"\n >\n <A.Header>\n <A.Trigger className=\"group flex min-h-touch w-full cursor-pointer items-center justify-between gap-4 py-4 text-left text-sm font-medium transition-colors hover:text-primary-text disabled:cursor-not-allowed disabled:opacity-50 md:min-h-0\">\n {it.title}\n <ChevronDown\n aria-hidden\n className=\"size-icon-sm shrink-0 text-muted-foreground transition-transform duration-(--rendra-duration-base) ease-move group-data-[state=open]:rotate-180\"\n />\n </A.Trigger>\n </A.Header>\n <A.Content className=\"overflow-hidden text-sm wrap-break-word text-muted-foreground data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\">\n <div className=\"pb-4\">{it.content}</div>\n </A.Content>\n </A.Item>\n ))\n return multiple ? (\n <A.Root\n type=\"multiple\"\n defaultValue={defaultValue}\n data-rendra=\"ACRN-001\"\n className={cn('flex flex-col', className)}\n >\n {content}\n </A.Root>\n ) : (\n <A.Root\n type=\"single\"\n collapsible\n defaultValue={defaultValue?.[0]}\n data-rendra=\"ACRN-001\"\n className={cn('flex flex-col', className)}\n >\n {content}\n </A.Root>\n )\n}\n","/** Iniciais de um nome: primeira letra do primeiro e do último nome, em maiúsculas. */\nexport function initials(name: string) {\n const parts = name.trim().split(/\\s+/)\n const first = parts[0]?.charAt(0) ?? ''\n const last = parts.length > 1 ? (parts[parts.length - 1]?.charAt(0) ?? '') : ''\n return (first + last).toUpperCase()\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { Avatar as A } from 'radix-ui'\nimport { cn } from '@/lib/cn'\nimport { initials } from '@/lib/initials'\n\nconst avatarVariants = cva(\n 'relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-avatar bg-primary-soft font-medium text-primary-soft-foreground select-none',\n {\n variants: {\n size: {\n sm: 'size-6 text-xs',\n md: 'size-8 text-xs',\n lg: 'size-12 text-base',\n },\n },\n defaultVariants: { size: 'md' },\n },\n)\n\nexport interface AvatarProps extends VariantProps<typeof avatarVariants> {\n name: string\n src?: string\n className?: string\n}\n\nexport function Avatar({ name, src, size, className }: AvatarProps) {\n return (\n <A.Root data-rendra=\"AVT-001\" className={cn(avatarVariants({ size }), className)}>\n {src && <A.Image src={src} alt={name} className=\"size-full object-cover\" />}\n <A.Fallback delayMs={src ? 400 : 0} aria-label={name}>\n {initials(name)}\n </A.Fallback>\n </A.Root>\n )\n}\n\nexport interface AvatarGroupProps {\n people: { name: string; src?: string }[]\n /** Máximo visível antes de \"+N\". */\n max?: number\n size?: AvatarProps['size']\n className?: string\n}\n\n/** Avatares sobrepostos, com contador do excedente. */\nexport function AvatarGroup({ people, max = 4, size = 'md', className }: AvatarGroupProps) {\n const visible = people.slice(0, max)\n const rest = people.length - visible.length\n return (\n <div\n className={cn('flex items-center -space-x-2', className)}\n aria-label={people.map((p) => p.name).join(', ')}\n role=\"group\"\n data-rendra=\"AVT-002\"\n >\n {visible.map((p) => (\n <Avatar key={p.name} name={p.name} src={p.src} size={size} className=\"ring-2 ring-card\" />\n ))}\n {rest > 0 && (\n <span\n className={cn(\n avatarVariants({ size }),\n 'bg-muted text-muted-foreground tabular-nums ring-2 ring-card',\n )}\n >\n +{rest}\n </span>\n )}\n </div>\n )\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport type { HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\n\nconst badgeVariants = cva(\n 'inline-flex max-w-full shrink-0 items-center gap-1 rounded-item border px-2 py-1 text-xs leading-none font-medium whitespace-nowrap [&_svg]:size-3',\n {\n variants: {\n tone: {\n neutral: 'border-transparent bg-muted text-foreground',\n primary: 'border-transparent bg-primary-soft text-primary-soft-foreground',\n success: 'border-transparent bg-success-soft text-success-soft-foreground',\n warning: 'border-transparent bg-warning-soft text-warning-soft-foreground',\n error: 'border-transparent bg-destructive-soft text-destructive-soft-foreground',\n info: 'border-transparent bg-info-soft text-info-soft-foreground',\n outline: 'border-border bg-card text-foreground',\n },\n solid: { true: '', false: '' },\n },\n compoundVariants: [\n { tone: 'primary', solid: true, className: 'bg-primary text-primary-foreground' },\n { tone: 'success', solid: true, className: 'bg-success text-success-foreground' },\n { tone: 'warning', solid: true, className: 'bg-warning text-warning-foreground' },\n { tone: 'error', solid: true, className: 'bg-destructive text-destructive-foreground' },\n { tone: 'info', solid: true, className: 'bg-info text-info-foreground' },\n ],\n defaultVariants: { tone: 'neutral', solid: false },\n },\n)\n\nexport interface BadgeProps\n extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {\n /** Ícone antes do texto (fica fora do corte com reticências). */\n icon?: ReactNode\n /** Bolinha de status à esquerda. */\n dot?: boolean\n}\n\n/** Badge único: tom semântico, suave ou sólido, com bolinha opcional. */\nexport function Badge({ tone, solid, dot, icon, className, children, ...props }: BadgeProps) {\n return (\n <span\n data-rendra=\"BDG-001\"\n className={cn(badgeVariants({ tone, solid }), className)}\n {...props}\n >\n {dot && <span aria-hidden className=\"size-2 shrink-0 rounded-full bg-current\" />}\n {icon && (\n <span aria-hidden className=\"flex shrink-0\">\n {icon}\n </span>\n )}\n <span className=\"truncate\">{children}</span>\n </span>\n )\n}\n","import { cva } from 'class-variance-authority'\nimport { useBrand } from '@/brand/use-brand'\nimport { cn } from '@/lib/cn'\n\n/*\n * Logotipo da marca, montado com o símbolo do modelo e as cores da paleta ativa.\n * Assim o logo acompanha o tema: forma e símbolo vêm do modelo; cores, da paleta.\n * Com logoMode: 'image' no brand.config, usa os SVGs oficiais sem recolorir.\n *\n * on=\"sidebar\" sobre a sidebar colorida\n * on=\"surface\" sobre fundo claro ou escuro comum (header, telas de login no mobile)\n * on=\"brand\" sobre o degradê forte (painel do login)\n */\n\nconst tile = cva('flex shrink-0 items-center justify-center rounded-control', {\n variants: {\n on: {\n sidebar: 'bg-sidebar-indicator text-sidebar',\n surface: 'bg-primary text-primary-foreground',\n brand: 'bg-gradient-brand-foreground text-sidebar',\n },\n size: { sm: 'size-6 p-1', md: 'size-8 p-1' },\n },\n defaultVariants: { on: 'surface', size: 'md' },\n})\n\nconst word = {\n sidebar: ['text-sidebar-foreground', 'text-sidebar-muted-foreground'],\n surface: ['text-foreground', 'text-muted-foreground'],\n brand: ['text-gradient-brand-foreground', 'text-gradient-brand-foreground opacity-80'],\n} as const\n\nexport interface BrandLogoProps {\n on?: 'sidebar' | 'surface' | 'brand'\n /** Só o selo com o símbolo (sidebar recolhida, favicon). */\n symbolOnly?: boolean\n size?: 'sm' | 'md'\n className?: string\n}\n\nexport function BrandLogo({ on = 'surface', symbolOnly, size = 'md', className }: BrandLogoProps) {\n const { brand, resolvedMode, sidebarLogoVariant } = useBrand()\n\n // Arte oficial: usa os SVGs como estão.\n if (brand.logoMode === 'image' && !symbolOnly) {\n const variant =\n on === 'sidebar'\n ? sidebarLogoVariant\n : on === 'brand' || resolvedMode === 'dark'\n ? 'dark'\n : 'light'\n const Logo = brand.logo[variant]\n return (\n // Wrapper sem layout próprio (display: contents): só para carregar o data-rendra,\n // já que o SVG da arte oficial não repassa atributos que não conhece.\n <span className=\"contents\" data-rendra=\"LOGO-001\">\n <Logo className={cn('h-8 w-auto', className)} role=\"img\" aria-label={brand.productName} />\n </span>\n )\n }\n\n const Symbol = brand.symbol\n const [first, ...rest] = brand.productName.split(' ')\n const [strong, soft] = word[on]\n return (\n <span data-rendra=\"LOGO-001\" className={cn('flex min-w-0 items-center gap-3', className)}>\n <span aria-hidden className={tile({ on, size })}>\n <Symbol className=\"size-full\" />\n </span>\n {!symbolOnly && (\n <span className=\"truncate text-lg leading-none tracking-tight\">\n <span className={cn('font-semibold', strong)}>{first}</span>\n {/* O espaço fica fora dos spans: o axe apara o espaço da ponta de cada um e juntaria\n \"RendraSafira\", que o nome acessível do link não contém (WCAG 2.5.3). */}\n {rest.length > 0 && ' '}\n {rest.length > 0 && <span className={cn('font-normal', soft)}>{rest.join(' ')}</span>}\n </span>\n )}\n {symbolOnly && <span className=\"sr-only\">{brand.productName}</span>}\n </span>\n )\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { useRendraLink } from '@/components/rendra-provider'\nimport { cn } from '@/lib/cn'\n\nexport interface BreadcrumbItem {\n label: string\n to?: string\n}\n\ninterface BreadcrumbProps {\n items: BreadcrumbItem[]\n /**\n * responsive: trilha no desktop e botão voltar no mobile (padrão, dentro das páginas).\n * trail: sempre a trilha, em texto pequeno (usado no header, abaixo do título).\n */\n variant?: 'responsive' | 'trail'\n className?: string\n}\n\n/**\n * Breadcrumb único. No desktop mostra a trilha completa. No mobile vira botão\n * voltar para o nível anterior com o nome da tela atual (mesmo componente, mesma API).\n */\nexport function Breadcrumb({ items, variant = 'responsive', className }: BreadcrumbProps) {\n const Link = useRendraLink()\n if (items.length === 0) return null\n const code = resolveCatalogCode('Breadcrumb', { variant })\n if (variant === 'trail') {\n return (\n <nav data-rendra={code} aria-label=\"Trilha de navegação\" className={cn('min-w-0', className)}>\n <ol className=\"flex min-w-0 items-center gap-1 overflow-hidden text-xs text-muted-foreground\">\n {items.map((item, i) => {\n const last = i === items.length - 1\n return (\n <li\n key={`${item.label}-${i}`}\n className={cn(\n 'flex min-w-0 items-center gap-1',\n !last && 'shrink-0 max-sm:max-w-24',\n )}\n >\n {item.to && !last ? (\n <>\n {/* Links só a partir de md; no celular a trilha é informativa (toque de 44px) */}\n <Link\n to={item.to}\n className=\"hidden truncate rounded-item transition-colors hover:text-primary-text md:inline\"\n >\n {item.label}\n </Link>\n <span className=\"truncate md:hidden\">{item.label}</span>\n </>\n ) : (\n <span aria-current={last ? 'page' : undefined} className=\"truncate\">\n {item.label}\n </span>\n )}\n {!last && <ChevronRight className=\"size-3 shrink-0\" aria-hidden />}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n }\n const current = items[items.length - 1]\n const parent = [...items.slice(0, -1)].reverse().find((i) => i.to)\n\n return (\n <nav data-rendra={code} aria-label=\"Trilha de navegação\" className={cn('min-w-0', className)}>\n {/* Mobile: voltar + tela atual */}\n <div className=\"flex min-w-0 items-center gap-1 md:hidden\">\n {parent?.to ? (\n <Link\n to={parent.to}\n aria-label={`Voltar para ${parent.label}`}\n className=\"-ml-2 flex min-h-touch min-w-0 items-center gap-1 rounded-item pr-2 text-base font-medium text-foreground active:bg-accent\"\n >\n <ChevronLeft className=\"size-icon-md shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"truncate\">{current?.label}</span>\n </Link>\n ) : (\n <span className=\"truncate text-base font-medium\">{current?.label}</span>\n )}\n </div>\n\n {/* Desktop: trilha completa */}\n <ol className=\"hidden min-w-0 items-center gap-1 text-sm md:flex\">\n {items.map((item, i) => {\n const last = i === items.length - 1\n return (\n <li key={`${item.label}-${i}`} className=\"flex min-w-0 items-center gap-1\">\n {last || !item.to ? (\n <span\n aria-current={last ? 'page' : undefined}\n className={cn(\n 'truncate',\n last ? 'font-medium text-foreground' : 'text-muted-foreground',\n )}\n >\n {item.label}\n </span>\n ) : (\n <Link\n to={item.to}\n className=\"truncate rounded-item text-muted-foreground transition-colors hover:text-foreground\"\n >\n {item.label}\n </Link>\n )}\n {!last && (\n <ChevronRight className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import type { ReactNode } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { cn } from '@/lib/cn'\n\ninterface ButtonGroupProps {\n /** Botões encostados, com borda compartilhada. */\n children?: ReactNode\n /**\n * Modo seleção (segmentado): passe options, value e onChange.\n * Se as opções não couberem, o grupo quebra linha em vez de rolar.\n */\n options?: { value: string; label: ReactNode; icon?: ReactNode; disabled?: boolean }[]\n value?: string\n onChange?: (value: string) => void\n size?: 'sm' | 'md'\n fullWidth?: boolean\n /**\n * Só no modo agrupado (`children`); o segmentado (`options`) ignora. `horizontal` (padrão):\n * botões lado a lado. `vertical`: empilhados, na largura do grupo, com as bordas unidas.\n * `responsive`: vertical abaixo de `md` e horizontal a partir dele (para três botões largos\n * que não cabem em 360 px).\n */\n orientation?: 'horizontal' | 'vertical' | 'responsive'\n 'aria-label'?: string\n className?: string\n}\n\n/**\n * ButtonGroup único: agrupa botões de ação (children) ou funciona como controle\n * segmentado de escolha única (options + value).\n */\nexport function ButtonGroup({\n children,\n options,\n value,\n onChange,\n size = 'md',\n fullWidth,\n orientation = 'horizontal',\n className,\n ...aria\n}: ButtonGroupProps) {\n if (options) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={aria['aria-label']}\n data-rendra={resolveCatalogCode('ButtonGroup', { orientation: 'horizontal' })}\n className={cn(\n 'inline-flex max-w-full flex-wrap gap-1 rounded-control border bg-muted p-1',\n fullWidth && 'flex w-full',\n className,\n )}\n >\n {options.map((o) => {\n const active = o.value === value\n return (\n <button\n key={o.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n disabled={o.disabled}\n onClick={() => onChange?.(o.value)}\n className={cn(\n 'inline-flex min-h-touch flex-1 cursor-pointer items-center justify-center gap-2 rounded-item px-3 text-sm font-medium whitespace-nowrap transition-colors md:min-h-0 [&_svg]:size-icon-sm',\n size === 'sm' ? 'md:h-8' : 'md:h-8',\n active\n ? 'bg-card text-foreground shadow-sm'\n : 'text-muted-foreground hover:bg-card/60 hover:text-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n {o.icon}\n {o.label}\n </button>\n )\n })}\n </div>\n )\n }\n const vertical = orientation === 'vertical'\n const responsive = orientation === 'responsive'\n return (\n <div\n role=\"group\"\n aria-label={aria['aria-label']}\n data-rendra={resolveCatalogCode('ButtonGroup', { orientation })}\n className={cn(\n 'inline-flex max-w-full',\n '[&>*]:rounded-none [&>*]:shadow-none [&>*:focus-visible]:z-10',\n orientation === 'horizontal' &&\n '[&>*:first-child]:rounded-l-control [&>*:last-child]:rounded-r-control [&>*:not(:first-child)]:-ml-px',\n vertical &&\n 'flex-col [&>*]:w-full [&>*:first-child]:rounded-t-control [&>*:last-child]:rounded-b-control [&>*:not(:first-child)]:-mt-px',\n // Vertical abaixo de md; de md em diante volta a linha e zera o que a vertical pôs\n // (o canto superior direito do primeiro, o inferior esquerdo do último e o -mt-px).\n responsive &&\n 'flex-col md:flex-row [&>*]:w-full md:[&>*]:w-auto [&>*:first-child]:rounded-t-control md:[&>*:first-child]:rounded-l-control md:[&>*:first-child]:rounded-tr-none [&>*:last-child]:rounded-b-control md:[&>*:last-child]:rounded-r-control md:[&>*:last-child]:rounded-bl-none [&>*:not(:first-child)]:-mt-px md:[&>*:not(:first-child)]:mt-0 md:[&>*:not(:first-child)]:-ml-px',\n fullWidth && (vertical ? 'flex w-full' : 'flex w-full [&>*]:flex-1'),\n className,\n )}\n >\n {children}\n </div>\n )\n}\n","import {\n addDays,\n addMonths,\n addWeeks,\n differenceInMinutes,\n endOfMonth,\n endOfWeek,\n format,\n isSameDay,\n isSameMonth,\n isToday,\n startOfDay,\n startOfMonth,\n startOfWeek,\n} from 'date-fns'\nimport { ptBR } from 'date-fns/locale'\nimport { ChevronLeft, ChevronRight, Clock, MapPin } from 'lucide-react'\nimport { useMemo, useState, type CSSProperties } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { ButtonGroup } from '@/components/ui/button-group'\nimport { Card } from '@/components/ui/card'\nimport { EmptyState } from '@/components/ui/empty-state'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\n\n/*\n * Calendário único do sistema: mês, semana, dia e agenda (lista) são a prop view,\n * nunca componentes separados. Os eventos vêm por props; criar e editar ficam com a tela\n * (onDateClick e onEventClick abrem um Drawer, por exemplo).\n *\n * Mobile (< 768px), sem rolagem lateral:\n * month vira um mês compacto com pontos nos dias e a lista do dia tocado embaixo;\n * week vira o dia, com uma faixa dos 7 dias para trocar;\n * day e agenda seguem iguais, na largura da tela.\n */\n\nexport type CalendarView = 'month' | 'week' | 'day' | 'agenda'\nexport type CalendarTone = 'primary' | 'success' | 'warning' | 'error' | 'info' | 'neutral'\n\nexport interface CalendarEvent {\n id: string\n title: string\n start: Date\n /** Fim. Sem valor, o evento dura 1 hora. */\n end?: Date\n /** Dia inteiro: aparece no topo do dia, sem horário. */\n allDay?: boolean\n tone?: CalendarTone\n description?: string\n location?: string\n}\n\nexport interface CalendarProps {\n events: CalendarEvent[]\n view?: CalendarView\n defaultView?: CalendarView\n onViewChange?: (view: CalendarView) => void\n /** Visões oferecidas no seletor. Padrão: todas. */\n views?: CalendarView[]\n /** Data em foco (mês, semana ou dia mostrado). */\n date?: Date\n defaultDate?: Date\n onDateChange?: (date: Date) => void\n onEventClick?: (event: CalendarEvent) => void\n /** Clique em um dia ou horário vazio (ex.: abrir o cadastro de evento já com a data). */\n onDateClick?: (date: Date) => void\n /** Faixa de horas da semana e do dia. Padrão: 7h às 21h. */\n hours?: [number, number]\n 'aria-label'?: string\n className?: string\n}\n\nconst viewLabels: Record<CalendarView, string> = {\n month: 'Mês',\n week: 'Semana',\n day: 'Dia',\n agenda: 'Agenda',\n}\n\nconst toneChip: Record<CalendarTone, string> = {\n primary: 'bg-primary-soft text-primary-soft-foreground',\n success: 'bg-success-soft text-success-soft-foreground',\n warning: 'bg-warning-soft text-warning-soft-foreground',\n error: 'bg-destructive-soft text-destructive-soft-foreground',\n info: 'bg-info-soft text-info-soft-foreground',\n neutral: 'bg-muted text-foreground',\n}\nconst toneDot: Record<CalendarTone, string> = {\n primary: 'bg-primary',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-destructive',\n info: 'bg-info',\n neutral: 'bg-muted-foreground',\n}\n\nconst WEEK = { weekStartsOn: 0 as const, locale: ptBR }\nconst endOf = (e: CalendarEvent) => e.end ?? new Date(e.start.getTime() + 60 * 60 * 1000)\nconst hhmm = (d: Date) => format(d, 'HH:mm')\nconst timeRange = (e: CalendarEvent) =>\n e.allDay ? 'Dia inteiro' : `${hhmm(e.start)} às ${hhmm(endOf(e))}`\nconst capital = (s: string) => s.charAt(0).toUpperCase() + s.slice(1)\n\nfunction sortByStart(list: CalendarEvent[]) {\n return [...list].sort(\n (a, b) => Number(Boolean(b.allDay)) - Number(Boolean(a.allDay)) || +a.start - +b.start,\n )\n}\n\n/** Botão de evento em formato de chip (mês, lista do dia, topo \"dia inteiro\"). */\nfunction EventChip({\n event,\n onClick,\n compact,\n}: {\n event: CalendarEvent\n onClick?: (e: CalendarEvent) => void\n compact?: boolean\n}) {\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n className={cn(\n 'flex w-full min-w-0 cursor-pointer items-center gap-1 rounded-item px-2 text-left text-xs font-medium transition-[filter] outline-none hover:brightness-95 focus-visible:ring-2 focus-visible:ring-ring',\n compact ? 'py-1' : 'min-h-touch py-2 md:min-h-0 md:py-1',\n toneChip[event.tone ?? 'primary'],\n )}\n >\n {!event.allDay && (\n <span className=\"shrink-0 font-normal tabular-nums\">{hhmm(event.start)}</span>\n )}\n <span className=\"truncate\">{event.title}</span>\n </button>\n )\n}\n\n/** Lista de eventos de um dia (mobile do mês e visão agenda). */\nfunction DayList({\n events,\n onEventClick,\n}: {\n events: CalendarEvent[]\n onEventClick?: (e: CalendarEvent) => void\n}) {\n return (\n <ul className=\"flex flex-col gap-2\">\n {events.map((e) => (\n <li key={e.id}>\n <button\n type=\"button\"\n onClick={() => onEventClick?.(e)}\n className=\"flex w-full cursor-pointer items-stretch gap-3 rounded-block border bg-card p-3 text-left transition-colors outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span\n aria-hidden\n className={cn('w-1 shrink-0 rounded-full', toneDot[e.tone ?? 'primary'])}\n />\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"truncate text-sm font-medium\">{e.title}</span>\n <span className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"size-3\" aria-hidden />\n {timeRange(e)}\n </span>\n {e.location && (\n <span className=\"inline-flex min-w-0 items-center gap-1\">\n <MapPin className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"truncate\">{e.location}</span>\n </span>\n )}\n </span>\n </span>\n </button>\n </li>\n ))}\n </ul>\n )\n}\n\nexport function Calendar({\n events,\n view: viewProp,\n defaultView = 'month',\n onViewChange,\n views = ['month', 'week', 'day', 'agenda'],\n date: dateProp,\n defaultDate,\n onDateChange,\n onEventClick,\n onDateClick,\n hours = [7, 21],\n className,\n ...aria\n}: CalendarProps) {\n const { isMobile } = useBreakpoint()\n const [innerView, setInnerView] = useState<CalendarView>(defaultView)\n const [innerDate, setInnerDate] = useState<Date>(() => startOfDay(defaultDate ?? new Date()))\n const view = viewProp ?? innerView\n const date = dateProp ?? innerDate\n // No celular a semana vira o dia (com a faixa dos 7 dias para trocar).\n const shown: CalendarView = isMobile && view === 'week' ? 'day' : view\n const mobileViews = views.filter((v) => v !== 'week')\n\n const setView = (v: CalendarView) => {\n setInnerView(v)\n onViewChange?.(v)\n }\n const setDate = (d: Date) => {\n setInnerDate(startOfDay(d))\n onDateChange?.(startOfDay(d))\n }\n\n const byDay = useMemo(() => {\n const map = new Map<string, CalendarEvent[]>()\n for (const e of sortByStart(events)) {\n const key = format(e.start, 'yyyy-MM-dd')\n map.set(key, [...(map.get(key) ?? []), e])\n }\n return map\n }, [events])\n const eventsOn = (d: Date) => byDay.get(format(d, 'yyyy-MM-dd')) ?? []\n\n const step = (dir: 1 | -1) => {\n if (shown === 'month' || shown === 'agenda') setDate(addMonths(date, dir))\n else if (shown === 'week') setDate(addWeeks(date, dir))\n else setDate(addDays(date, dir))\n }\n\n const title =\n shown === 'day'\n ? capital(format(date, \"EEEE, d 'de' MMMM\", { locale: ptBR }))\n : shown === 'week'\n ? `${format(startOfWeek(date, WEEK), 'd MMM', { locale: ptBR })} a ${format(endOfWeek(date, WEEK), \"d MMM 'de' yyyy\", { locale: ptBR })}`\n : capital(format(date, \"MMMM 'de' yyyy\", { locale: ptBR }))\n\n /* ---------------------------------------------------------------- barra */\n const toolbar = (\n <div className=\"flex flex-col gap-3 border-b p-4 md:flex-row md:items-center\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <h2\n className=\"order-first w-full min-w-0 truncate text-base font-semibold md:order-last md:w-auto\"\n aria-live=\"polite\"\n >\n {title}\n </h2>\n <Button variant=\"outline\" onClick={() => setDate(new Date())}>\n Hoje\n </Button>\n <Button variant=\"ghost\" iconOnly aria-label=\"Anterior\" onClick={() => step(-1)}>\n <ChevronLeft />\n </Button>\n <Button variant=\"ghost\" iconOnly aria-label=\"Próximo\" onClick={() => step(1)}>\n <ChevronRight />\n </Button>\n </div>\n {(isMobile ? mobileViews : views).length > 1 && (\n <ButtonGroup\n fullWidth={isMobile}\n aria-label=\"Visão do calendário\"\n className=\"md:ml-auto\"\n value={shown}\n onChange={(v) => setView(v as CalendarView)}\n options={(isMobile ? mobileViews : views).map((v) => ({\n value: v,\n label: viewLabels[v],\n }))}\n />\n )}\n </div>\n )\n\n /* ---------------------------------------------------------------- mês */\n const monthDays = () => {\n const start = startOfWeek(startOfMonth(date), WEEK)\n const end = endOfWeek(endOfMonth(date), WEEK)\n const days: Date[] = []\n for (let d = start; d <= end; d = addDays(d, 1)) days.push(d)\n return days\n }\n const weekdayNames = Array.from({ length: 7 }, (_, i) =>\n format(addDays(startOfWeek(date, WEEK), i), isMobile ? 'EEEEE' : 'EEE', { locale: ptBR }),\n )\n\n const month = () => {\n const days = monthDays()\n if (isMobile) {\n const list = eventsOn(date)\n return (\n <div className=\"flex flex-col\">\n <div className=\"grid grid-cols-week px-2 pt-2 text-center text-xs font-medium text-muted-foreground uppercase\">\n {weekdayNames.map((n, i) => (\n <span key={i} className=\"py-2\">\n {n}\n </span>\n ))}\n </div>\n <div className=\"grid grid-cols-week px-2 pb-2\">\n {days.map((d) => {\n const evs = eventsOn(d)\n const selected = isSameDay(d, date)\n return (\n <button\n key={d.toISOString()}\n type=\"button\"\n onClick={() => setDate(d)}\n aria-pressed={selected}\n aria-label={`${format(d, \"d 'de' MMMM\", { locale: ptBR })}${evs.length ? `, ${evs.length} ${evs.length === 1 ? 'evento' : 'eventos'}` : ''}`}\n className={cn(\n 'flex min-h-touch cursor-pointer flex-col items-center justify-center gap-1 rounded-item text-sm tabular-nums outline-none focus-visible:ring-2 focus-visible:ring-ring',\n !isSameMonth(d, date) && 'text-muted-foreground',\n selected && 'bg-primary font-semibold text-primary-foreground',\n !selected && isToday(d) && 'font-semibold text-primary-text',\n )}\n >\n {format(d, 'd')}\n <span className=\"flex h-1 gap-1\" aria-hidden>\n {evs.slice(0, 3).map((e) => (\n <span\n key={e.id}\n className={cn(\n 'size-1 rounded-full',\n selected ? 'bg-primary-foreground' : toneDot[e.tone ?? 'primary'],\n )}\n />\n ))}\n </span>\n </button>\n )\n })}\n </div>\n <div className=\"flex flex-col gap-3 border-t p-4\">\n <p className=\"text-sm font-semibold\">\n {capital(format(date, \"EEEE, d 'de' MMMM\", { locale: ptBR }))}\n </p>\n {list.length ? (\n <DayList events={list} onEventClick={onEventClick} />\n ) : (\n <p className=\"text-sm text-muted-foreground\">Nenhum evento neste dia.</p>\n )}\n {onDateClick && (\n <Button variant=\"outline\" fullWidth onClick={() => onDateClick(date)}>\n Novo evento neste dia\n </Button>\n )}\n </div>\n </div>\n )\n }\n return (\n <div className=\"flex flex-col\">\n <div className=\"grid grid-cols-week border-b bg-muted/50 text-xs font-medium text-muted-foreground\">\n {weekdayNames.map((n, i) => (\n <span key={i} className=\"px-2 py-2 capitalize\">\n {n.replace('.', '')}\n </span>\n ))}\n </div>\n <div className=\"grid grid-cols-week\">\n {days.map((d) => {\n const evs = eventsOn(d)\n const extra = evs.length - 3\n return (\n <div\n key={d.toISOString()}\n className={cn(\n 'flex min-h-24 min-w-0 flex-col gap-1 border-r border-b p-1 nth-[7n]:border-r-0',\n !isSameMonth(d, date) && 'bg-muted/30',\n )}\n >\n <button\n type=\"button\"\n onClick={() => (onDateClick ? onDateClick(d) : (setDate(d), setView('day')))}\n aria-label={\n onDateClick\n ? `Novo evento em ${format(d, \"d 'de' MMMM\", { locale: ptBR })}`\n : `Ver ${format(d, \"d 'de' MMMM\", { locale: ptBR })}`\n }\n className={cn(\n 'flex size-8 cursor-pointer items-center justify-center self-start rounded-item text-sm tabular-nums transition-colors outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring',\n !isSameMonth(d, date) && 'text-muted-foreground',\n isToday(d) &&\n 'bg-primary font-semibold text-primary-foreground hover:bg-primary-hover hover:text-primary-hover-foreground',\n )}\n >\n {format(d, 'd')}\n </button>\n {evs.slice(0, 3).map((e) => (\n <EventChip key={e.id} event={e} onClick={onEventClick} compact />\n ))}\n {extra > 0 && (\n <button\n type=\"button\"\n onClick={() => {\n setDate(d)\n setView('day')\n }}\n className=\"cursor-pointer self-start rounded-item px-2 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n +{extra} {extra === 1 ? 'evento' : 'eventos'}\n </button>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n }\n\n /* ---------------------------------------------------------------- semana e dia */\n const [h0, h1] = hours\n const hourList = Array.from({ length: h1 - h0 }, (_, i) => h0 + i)\n const now = new Date()\n\n const timeGrid = (days: Date[]) => (\n <div className=\"flex flex-col\">\n {/* Faixa dos 7 dias no celular: troca o dia mostrado. */}\n {isMobile && (\n <div className=\"grid grid-cols-week gap-1 border-b p-2\">\n {Array.from({ length: 7 }, (_, i) => addDays(startOfWeek(date, WEEK), i)).map((d) => {\n const selected = isSameDay(d, date)\n return (\n <button\n key={d.toISOString()}\n type=\"button\"\n onClick={() => setDate(d)}\n aria-pressed={selected}\n aria-label={format(d, \"EEEE, d 'de' MMMM\", { locale: ptBR })}\n className={cn(\n 'flex min-h-touch cursor-pointer flex-col items-center justify-center rounded-item text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected ? 'bg-primary text-primary-foreground' : 'text-muted-foreground',\n )}\n >\n <span className=\"uppercase\">{format(d, 'EEEEE', { locale: ptBR })}</span>\n <span className=\"text-sm font-semibold tabular-nums\">{format(d, 'd')}</span>\n </button>\n )\n })}\n </div>\n )}\n {/* Cabeçalho dos dias e eventos de dia inteiro. */}\n <div\n className=\"grid grid-cols-week-time border-b\"\n style={{ '--days': days.length } as CSSProperties}\n >\n <span className=\"border-r\" />\n {days.map((d) => {\n const allDay = eventsOn(d).filter((e) => e.allDay)\n return (\n <div\n key={d.toISOString()}\n className=\"flex min-w-0 flex-col gap-1 border-r p-2 last:border-r-0\"\n >\n {!isMobile && (\n <span\n className={cn(\n 'text-xs text-muted-foreground capitalize',\n isToday(d) && 'font-semibold text-primary-text',\n )}\n >\n {format(d, 'EEE d', { locale: ptBR }).replace('.', '')}\n </span>\n )}\n {allDay.map((e) => (\n <EventChip key={e.id} event={e} onClick={onEventClick} compact />\n ))}\n </div>\n )\n })}\n </div>\n <div className=\"grid grid-cols-week-time\" style={{ '--days': days.length } as CSSProperties}>\n <div className=\"border-r\">\n {hourList.map((h) => (\n <div\n key={h}\n className=\"h-12 pr-2 text-right text-xs text-muted-foreground tabular-nums\"\n >\n <span className=\"relative -top-2\">{String(h).padStart(2, '0')}:00</span>\n </div>\n ))}\n </div>\n {days.map((d) => {\n const timed = eventsOn(d).filter((e) => !e.allDay)\n const showNow = isToday(d) && now.getHours() >= h0 && now.getHours() < h1\n return (\n <div key={d.toISOString()} className=\"relative min-w-0 border-r last:border-r-0\">\n {hourList.map((h) => (\n <button\n key={h}\n type=\"button\"\n tabIndex={onDateClick ? 0 : -1}\n aria-label={`Novo evento em ${format(d, \"d 'de' MMMM\", { locale: ptBR })} às ${String(h).padStart(2, '0')}:00`}\n onClick={() =>\n onDateClick?.(new Date(d.getFullYear(), d.getMonth(), d.getDate(), h))\n }\n className={cn(\n 'block h-12 w-full border-b border-dashed outline-none focus-visible:bg-accent',\n onDateClick ? 'cursor-pointer hover:bg-accent/60' : 'cursor-default',\n )}\n />\n ))}\n {showNow && (\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-x-0 calendar-now z-10 h-0 border-t-2 border-destructive\"\n style={\n {\n '--from': (now.getHours() - h0 + now.getMinutes() / 60).toFixed(3),\n } as CSSProperties\n }\n />\n )}\n {timed.map((e) => {\n const from = Math.max(0, e.start.getHours() - h0 + e.start.getMinutes() / 60)\n const span = Math.max(0.5, differenceInMinutes(endOf(e), e.start) / 60)\n return (\n <button\n key={e.id}\n type=\"button\"\n onClick={() => onEventClick?.(e)}\n style={\n {\n '--from': from.toFixed(3),\n '--span': Math.min(span, h1 - h0 - from).toFixed(3),\n } as CSSProperties\n }\n className={cn(\n 'absolute inset-x-1 calendar-event z-20 flex cursor-pointer flex-col overflow-hidden rounded-item px-2 text-left text-xs outline-none hover:brightness-95 focus-visible:ring-2 focus-visible:ring-ring',\n span < 0.75 ? 'justify-center' : 'py-1',\n toneChip[e.tone ?? 'primary'],\n )}\n >\n {span < 0.75 ? (\n <span className=\"truncate font-medium\">\n <span className=\"font-normal tabular-nums\">{hhmm(e.start)}</span> {e.title}\n </span>\n ) : (\n <>\n <span className=\"truncate font-medium\">{e.title}</span>\n <span className=\"truncate font-normal tabular-nums\">{timeRange(e)}</span>\n </>\n )}\n </button>\n )\n })}\n </div>\n )\n })}\n </div>\n </div>\n )\n\n /* ---------------------------------------------------------------- agenda */\n const agenda = () => {\n const days: Date[] = []\n for (let d = startOfMonth(date); d <= endOfMonth(date); d = addDays(d, 1)) days.push(d)\n const withEvents = days.filter((d) => eventsOn(d).length)\n if (!withEvents.length)\n return (\n <EmptyState\n size=\"compact\"\n title=\"Nenhum evento neste mês\"\n description=\"Use as setas para ver outros meses.\"\n />\n )\n return (\n <ol className=\"flex flex-col divide-y\">\n {withEvents.map((d) => (\n <li key={d.toISOString()} className=\"flex flex-col gap-3 p-4 md:flex-row md:gap-6\">\n <div className=\"flex shrink-0 items-baseline gap-2 md:w-24 md:flex-col md:gap-0\">\n <span\n className={cn(\n 'text-2xl font-semibold tabular-nums',\n isToday(d) && 'text-primary-text',\n )}\n >\n {format(d, 'd')}\n </span>\n <span className=\"text-sm text-muted-foreground capitalize\">\n {format(d, 'EEEE', { locale: ptBR })}\n </span>\n </div>\n <div className=\"min-w-0 flex-1\">\n <DayList events={eventsOn(d)} onEventClick={onEventClick} />\n </div>\n </li>\n ))}\n </ol>\n )\n }\n\n const weekDays = Array.from({ length: 7 }, (_, i) => addDays(startOfWeek(date, WEEK), i))\n\n return (\n <Card\n data-rendra=\"CAL-001\"\n className={cn('overflow-hidden', className)}\n aria-label={aria['aria-label'] ?? 'Calendário'}\n role=\"region\"\n >\n {toolbar}\n {shown === 'month' && month()}\n {shown === 'week' && timeGrid(weekDays)}\n {shown === 'day' && timeGrid([date])}\n {shown === 'agenda' && agenda()}\n </Card>\n )\n}\n","import { Popover as P } from 'radix-ui'\nimport { createContext, useContext, useState, type ComponentProps } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionMode, useMotionPresets } from '@/lib/motion'\n\n/*\n * Em `on` o Popover precisa saber se está aberto para manter o conteúdo montado durante a\n * saída animada. O Root vira um wrapper com exatamente os mesmos tipos do Radix\n * (`ComponentProps<typeof P.Root>`) que espelha o estado (controlado ou não) num contexto.\n * Em `off` é o `P.Root` de sempre, sem estado nem contexto novos.\n */\nconst PopoverOpenContext = createContext<boolean | null>(null)\n\nfunction AnimatedRoot({ open, defaultOpen, onOpenChange, ...rest }: ComponentProps<typeof P.Root>) {\n const [inner, setInner] = useState(defaultOpen ?? false)\n const current = open ?? inner\n return (\n <PopoverOpenContext.Provider value={current}>\n <P.Root\n {...rest}\n open={current}\n onOpenChange={(next) => {\n setInner(next)\n onOpenChange?.(next)\n }}\n />\n </PopoverOpenContext.Provider>\n )\n}\n\nexport function Popover(props: ComponentProps<typeof P.Root>) {\n return useMotionMode() === 'on' ? <AnimatedRoot {...props} /> : <P.Root {...props} />\n}\nexport const PopoverTrigger = P.Trigger\nexport const PopoverClose = P.Close\nexport const PopoverAnchor = P.Anchor\n\ninterface PopoverContentProps extends ComponentProps<typeof P.Content> {\n /** Largura: sm (16rem) ou md (22rem). Sempre limitada à tela menos 32px. */\n width?: 'sm' | 'md'\n}\n\nexport function PopoverContent({\n className,\n align = 'center',\n sideOffset = 8,\n width = 'md',\n children,\n asChild,\n ...props\n}: PopoverContentProps) {\n const open = useContext(PopoverOpenContext)\n const lib = useMotionLib()\n const presets = useMotionPresets()\n // O popover nasce do gatilho, não do centro (W6): a origem vem do Radix.\n const base = cn(\n 'z-50 origin-(--radix-popover-content-transform-origin) rounded-surface border bg-popover text-popover-foreground shadow-md outline-none',\n width === 'sm' ? 'w-popover-sm' : 'w-popover',\n )\n\n if (lib && open !== null && !asChild) {\n return (\n <lib.AnimatePresence>\n {open && (\n <P.Portal forceMount key=\"popover\">\n <P.Content\n forceMount\n asChild\n align={align}\n sideOffset={sideOffset}\n collisionPadding={16}\n data-rendra=\"POP-001\"\n className={cn(base, className)}\n {...props}\n >\n <lib.m.div {...presets.open()}>{children}</lib.m.div>\n </P.Content>\n </P.Portal>\n )}\n </lib.AnimatePresence>\n )\n }\n\n return (\n <P.Portal>\n <P.Content\n align={align}\n sideOffset={sideOffset}\n collisionPadding={16}\n data-rendra=\"POP-001\"\n className={cn(\n base,\n // A saída é mais curta que a entrada (W5): o usuário já decidiu fechar.\n 'animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n className,\n )}\n asChild={asChild}\n {...props}\n >\n {children}\n </P.Content>\n </P.Portal>\n )\n}\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAQAElEQVR4AexdCbhcRZX+6/b2Xr8lCSFENgmgkIBA2HcIiyiOSAhxQQTEBXV0MvqNfoYYjY4C8o2TbwDH+YgOoo6yKApugIoQEyGAICSBJCSQkJCEkO0lb+31zv/f7n72y1u6+y7d/ULf7/xddetWnTrn1LlVt+oubWEv3GzbHkecRXySmE/8nlhCLCXWEJuIDqJAiitNx5RHeVVGZcXjTGYctxeaCnuFA7BxziO+TjxCvM6G2kEsIhYQXyAuJk4ljiEOJ/YnxhAFUlxpOqY8yqsyKisei5lxh3gTqkN1TWPaqKdR5wBsgCbifOIbxGNEH1vhz8Q84nxiIhEUibfqUF2Pqm5CMjgOwXhTUBUHxXdUOAANaxEXEjobN9AYjxBfI84lYkStSHVLBschKMQGyng7cQExKmxbt0LKgMS5xHdp2I3EH4lPEvsS9UqS7ToK9ydio2Qnzibq1s51KRgN9l4a8C/EY8RnibcQo40ks2SXHgupk64p6k6HunEAGihEXEkspZV+Q5xJ7C10FhXRrOJ56ncFEeJ+XVBdOAAN8i5aYznxf4SuwhnslXQstfoZsTyvM6O1oUKtNXUAGuFI4kEK8xAxmXizkHR9SLoTh9ZS6Zo4AJVuI26h4jrr383wzUrSfQVtcSPRVgsjVNUBqKSmcx+noquJWUSYeLOTppLX0wiraZ9riaq2SdUqo2JaRNGCzQ+orOIMGlRkAdnkDu7/mbaq2rJzVRyACp1DxZ4jtGjCoEEjWEA2eo42O3mEPL4dCtQBqIQh1L3pzNe82DfB93JGb6V+i2k7rSMwGhwF5gAUXnPd2yn6jYTiDBpUgQWizPtd2nEBEZj9AnEACizh76cCWrpl0CAPFpAN78/b1AObXNE9f313AAqqW6ua12s5d8/6GvvuLCBbat0g7q748KV8dQA2/gRWpfvw5zFskL8WkE11C1o29o2zbw7Axj+IUj1O7M1LuVSvpnQKa388b2tGvZMvDkCB9qEoC4m3EQ0K1gKysR5Ckc091+TZAdj4rZRCY/5hDBtUHQvo0bUH87b3VKMnB6AAmp7o1m1VFi08abr3FdZw8EC+DVxr59oBWLFhrT8h9oqHI6nHaCQ9n3hnvi1cye/aAVibnoO7gmGDamuBj7B6tQWD4Wm4I64cgB6n9eqvDse0kV51C3yVbeKqJ67YAVjRflTvHqLisizToGAsoLa4O982FdWggmUXYAUa99X4unVZdrlGxqpYQG0iJ1AblV1hRQ5ArjcRrroalmtQ8BbQamFF1wNlOwDP/hMo/xeJBtW3BeayrU4qV8SyHIAMlU9v5WjeXy7vRr7aWEBt9L18m5WUQA1bMhMz6Pm9ExkGStkssH57Fis2ZcrDxjQWLXnNE17cWGZdQ8ikskue3YbFT20pC8tW7EQySSUDtaLDXAtzekPJ2Rnpp6QD0JO05vzNkZh4PdabtLF4dRY3/S6BHyxM46ePp8rCHX/owJxvLXKPGxbhp4sTZdU1lEx3LUnj2wtWYe63nykLs+Y+iUs/+gh+/IuXsWt30qvZSpX/JttufKlMJR2ADOYTWu9nEAz9jIZ8eGkSvQkbWXUDZVbTvXMXqGSZuf3Pprpbx7WUzdi2s+jtS+GHd72E2Tc8g2QqU3ZZFxn1nuJ/lio3ogPYtq0Fn2tKMXF7PJu1cd/fMlj7RoYNWTmXzm0dMKaiWU/llZQo0bJPO2CXyLTHYdoVK1Z3YN53nkeGNtjjsJ+717AuLRcPy3NEB2Cpm4nAaEsnsHxD2hV/Ywy6duxyVdbPQq1yAFcMbTzx9BasXB24Dnomc1gJh3UAeo7m+/pSxrCFvR54bUcWqXSFp0++UsqHnl30oPx+rYKmlmbAdSeUxbKVOxHwdiptpbYcspphHYC5ZxOB0opNWfBEdlVHNp1Gsi/wC6mSslmREMJEyYxDZjB4krOIIQ/5mzhsWw7pAPQYTfku8leGgdx05b92q13p8NnPJJ1KI5PJ9u/XLmIQjkVcV7+cPcDuzsAd+SK26ZCLQ0M6ALX5EmGIwOjlrVmkM+66fwmVTqUQqICqpAzQsIhE3TtAOp3BE8+8UUZNnrLIVEOu4g5yACr0dlZ1OREovUKds5wWua0kyymUe/dxW+vgcrSXpx5AU4gnn93OWZC/2gyWFJdT1iP2TB/kAMxwJRH4W7ubOrI8g+WYrM0FpRPsNu3AjVZaMooQ8TAESIW16ztdXwyXFrA/h9r0w/17+chQDvCh/LHAgnQW2LKLPy5roCcj1ZeoxllTUkJjGURiehGqZNZhM2zc3MUFInfT4WGZDn1gUNsOcAAadirLHUkESkvXpzn+e6uir6vHGwMfSze16BV/9ww1FX74UX0IzT2PMkvqiyxq4/7sAxyAqR8lAiV1eU+vYxWKMHBDxhj0dXa5KRpImVirt+9D8sTDrx/eVK1ZzYA27ncACjHkGOG3xTr7bGzl+g2HTves6QC9u+vHAbQYpGVt9woBm7b0YOv2hBcW5ZYdMAz0OwBL61Nmvr53Rp6DaFuXjRTn8IMOVJBguHrQW0dDQDQeAy8FKtBgcNZsNoWX1/HMGHzI75SJPNn7VwaLHaA/0e8ai/lp8cfr/Q+bC0CJHn0iuJhz7eJhrgOEXK8GFuS28fwLOwo7QYf9bV11B1i5Ocurd2/69bHx/VoFtN3PRP+hhGUh0uztOgCcFD/53DZ43cosP9AB2CVEWfA0IlDa3pnFG7u9V9HD8d+PduNIonUYOqSnKxKWzyLGmQDt6Em5DRu7sJ7wxKS8wrpB5ExdCj3AGSznJDAMjFZr9S+T8cRfRu7r7AZ4IYh62eg/ze3ev91gZ7NYuIRGCl4vdVenq5qCA+iDhdoPFGu5/u9h9tcvW193L9vflz6gn6enCB1AMwFPPFhY10bPL99RremgMwxU1QG27KalfGi3ZE8vzVVHRJ1inAkYw4gHsVR8w6auaiwLS8qcA7BLlRO8QylBoqPHhq4BvNZBeZGsk2XgYl1y9wPo4MWJLuJbt/di42YOcS7KVlhE/4MUUuPrm3ShCgtXnP3pV9yv/RdXZoxBOpEqTqqLeCjKdTTK5lUYDZEPPKw/RfHKqWR5CoyD5QCTSmb1IcPS12xeLQ88Q3Q2VwoO/kglEgy8dbd7qlSpHMX5xSsUkT0VGxkDLTA4b5YXgo8s3jz4QDApk+QA+nR5MOyLuHb2JJBNJ/NIIZ1KukI2w7LJlONMxY3gJi7x0pQpQ1m8whg2rZ1BNpMeEXbRcTubhkGGUJiDZTLo6a58kUu6uED1HKC3cwf6ujvy2IlE904kezoqgsr0de2ErctldbcewSZDb1cHEpTDK5K9u5BJ98DOdJeNbLobmZTQw/AfSKe6XLSlqyKOA1RlCAiFwig+S12Jy0LpdBZZi90tB0sNAp4QbUIyYzlykbVroijImDBMrIm8KmNTbJNC3EAdM6qxTVZNVfmI837t/lxndnRnYTf5sOjCVrPGjENnL11IXYFHc6foSOH9DiYX78zG76N1GrIKnt4iB6hKbe85qQ2Ga+ZudcqdHXqSCAiNG082gy8qmVg2Gea0xo5HV4I9AOP0B/66JRu7EhGED2BnanlzdGMMPnFl4LPygqJNVXOAIw5oxiETYoWKXYWdvTbSGRtW+1iYNn2S2BUbdtM8S9mLiE9vyqA7KTMwzQU7OWZvKoRdfREYYxDed/8cfze8WOaQg9pxwbmHMFYVGivNx1alKlbyvlPGojkWcgzF3bJIBhZSaRsbd2RzZWTogw4FeLbpWC6xvF8nfziC6OTjYFgeMFi/PcJrATgNV0lPIF7Kv6VTjm2gLTppMgydS8e0Xz5sNDdF8Olrp6KJNiq/nKec1esBJOahE6P44FnjYIyMVdkZ9yrvI6Qy4pKDaWpGZDK7SvIq19iFfNHDpwCRaI4RfyXJhh2FfQ0tTCxB4qXGX78rjt40nZr5pZUh36YpJ4FKOg6FMjdjDD738ak485QDyizhS7bqOoBEPmZSHDPOmIBUNuIYKGdINYGO5lBIU9jdZ2PVxjS7aR6jhWknMAAY0ZkWPuIdMM3xHC8MvYmPIKeJTjmeQwidEORCUqBSfWmDNVuj6MkPB8ov6FgBanClCQnmX98RZ/4QD4sRA5JiVrwV8ROnITR2X9hc2FE5HhqSjDHYf2Ibbpx7Di551+FD5hkp0eMxZwjwyKOy4hYV3qc9grUdbdi8M4ueRNYZ17Oc28uwCjXOdzN9w7YM1ryeQV9qcB0ytGC1tCJy5LEIHzwJhoaHppvMLl5yK9sKwbS0IfzWwxE95iRYre08ikK7o7CJVyJtYe32KDZ2ROhwFuUCJI94ZdmKGY5AvSkLb3RFsXZHC3o49oOcVBaFLb9jxZrR/I5TEZt8AkJj9gHC0dzjB+STkysMq6Ud579zCu649SKcdeqBsKx84QKvKoQW6+ggqk9WFB3pffDSxiSWrUti6asJLF+fdOLLX01hzaYMdnRlQX/BSGbRcVoOoQkHcFw/FtHjaPSppyN23CmIHc/whDMQmzIV4YkHko+B8pthtHWO8eCu3jDW7Yhh1dY4Vm6J46U34lhFrNzawoaPY3tPFFmbGUXEMOygQxHK1XzM6Wg5/SK0nHkxWk69CK2nXYy2s96D+AnTcMxpR6O1pTD8DMcpsPQOOUDV1h33VMMKRRBrnQhjWeCJgXTWhmNXWY4wxJ5lSu/z/NKZxLEYPPsdxiwkVgKjFZHkyWQNbIK/qFQm5RfoMSzL3igagwmHASrsyOP8VCSSn5n7auoA0sRi1xiNs4uUldh2SpNNBMUrgVg4YCGVVxyKcN8P8sJKZYvl0b6fsrnUz3GA2gwBlNgYA2MMQpEmxOL7gns8M9DYqmcBZwiomQMU62mFY4i0aIVPHW3xkUY8QAs4DvB6gBWUxdoY4+QLhZsQada61ChxAg5ZmSw0vGtIBxcpndBRZnT8vK5rAL2pV3NxjTEwxiAUjSOiawKgLo3JazdHrlAIOPeoKL4+swULrmvH9z/VhpuvaMUlJ0YRjxpKT/md32B+fOK6rm4coFihEIeDcPM4JrEn4FnGSF0QJymYfEAY82a24d7Pj8Xs6a0448goDpkQwsHjQ5h6aBj/fFEz7ppFZ7iyBae9LQyuA9WzJ6yUA6ysC+vmhTCGZw8RjjQj3JRbtKm1D6h+zlRx1TlxzP/oGKfRW7mIalFOY4zTcxljoH0hFjE49q1hfG1mHP96cROaonXrA/XnAOBmTM6o4WgLIk1jmFJbClkG868Zi4/QAUIG/Q2OYTZjTC4Pj58zJYLm/JDA3XqjdZYxRrOAwL9W6FZzq6gncMvDSzmbF3nXXRjHEQeEYMiI9uI1gA0tDad4BbhqUwq/e7YPD/ytD8++kkJfMusc1/Lx7t4s5v28hyuatlOWxeuJtlAXZxYgoZ7TT72BAkJQTyDAZldKVFPOs6dEcenJzU73LlnUsKr/qTUpfPZ/d+Ozd3Ti1gd7VBydFAAACmdJREFU8L0/9OLLP+vCtf/TiT8uTUKN/437evHCa0W3MFWwfuAM/boGkEiP6aeeEYq2IsQhoaoy0tnef3qcTpirtdD49z7Rh2/8vBOvbs0gTAs6PQOz6DphZ4+N+b/vpSN04cV84xtl4PE6I6fNKb4jlrPjxOrsxxjDBsjBcYJIqzqCqkh56MQQ3r4/1+1ZmzHGqffxl5L44aM9YO8PGAzYCruaKvYkbOcYizlhHf44bV5wgCcoYM1uCrHukmSMgTGGMwP2BLwusNkcOROXLOoqgxrxyrNbYFm5esVETyXd/sduZ4zXfgGSI0RLhkKAQn0rIsyrxXB+X2mFY2RXKOYq9KmQ2lptDooNGTYB4EliVFAo1gYr3ByorFE24PGTIjD5WtT9P8/b1Jt2Zul6+cSiYMEn23D3rDFEO9cBhDbc9S8FtDJOfK4FV5+lB2GKCtYm+qQxRm2ec4C8DE6XkI/XZUChUUA41konaOLZGIyo8SbDs7nQ/HC2FzakmQbKgEFbC9cFWlmmFI7YPzSkAw1iGGxCf1s7PUC+riX5sO6DnBNYXCNopxPEEMSmbhsD2x+JlDr7kWvLyWYwVKiSWkDSW2SK1xBDOsCfKFDV3kliXb5QOEYnCEV84VXMRB8ys7X2W5TYHi8+X4oOVBCVE5V2owoYVp51K4ssJhzq14gem2bKfcSoIMrbf5aFuWRs6AS6cPNLeD2TqG8aFvM7+fBI7uq/ODEfX7QyiT8tS3INIEEknbj2k+w1dP2QzwZ9JcWYwl5Nwl8aY9TWTuX9DuDsAXdilG1Uho5gQbeRjZW7wPLjDNM079EXEv3jteo5/C1hyAmGcrTvPtyL7/y2h8iHv+nB3Y8noJkA8pvKPf5SmvLmE2oT3F1c7QAHoJIaG14pzjCa4k5PYHLzdq9yG56ldy/ucT7XUjiDmYRPXBDnhaBi/6hBe/1QRIcYzjyV1ycMtSseXX02VmzMaLdWWGuMURv31z/AAfKpP8mHoyagUjyrjINwM+8g0gn86AV62X0/vSbp9AJqQBnksP3CmH91O/YbkzOdzmqlF6B9zfXV+OcdHYbhAckneVZtzqD45RYeKpt8yvjjPfnktBiY+iPuSl4Go4tkaGMsRONjYQynW9JC8KDGnY91o6svN/cXf7GafGAYt13bjktOaMKkCSGMiRu0NhtMHGvhxEPD+NYHW/CxaTFEwwYqI+dJpm389K9J6Kkh8agBZIlBQ/wgB6DAayncvcSoJg0HgIHXbf22DG75XRcKL4jQPg7LsS2W8/DHbde24Y7PjMGPPtOO2z/Rhn//QBzH0wkK+dT4KnDPEyms0p9kaac2uJcyDXr6a5AD5GX7D4byGAaji6gkcrAQ4ewA8O4Ef+UV/nd+08VbvTYXnnJmUR2WZSEasRCPGQexiEE4ZMEyBsYYaNNM8sHnUvjlU7mhBLlkHaomJPTNQ1U4pAMYY55h5j8Qo5aoA4wVQqR5DBjJjeNwsRlAjfjnZQne2+/EK2+kHSfQmV2AMQbG5FBI0/MCHT1Z/PgvCdz2UJ+ziMQsLgTwpcivjTF/H4rTkA6Qz/jtfDiqA8Nrgtxw4F4Nw6LCc2uTmHXHLtzwq27nm4c6rWz+aHhQgyvUfooD/SPLkvj097txzxO5qaTKk81gYvnBib6nDNuWwzoAPUbThUBuEA1bqc96UwcYWt7QCXQDCeAtXQ8GFy9dxS9akcDV/92B6xbswpy7OnHT/V24+YFufP0XXZh1ZxeuuKXTWQ/Y1WtDZQQMu9nDHvHpwEJjzLDL/KXaYq5PQgxgc+D4EMJW4Irn6zROaFlhhHkXEaATwP1myE5IZwC9vfz3dWksWpHCwhdTeGpNGqtfz6ArYbMWOMCwm4ExBuNaSzXBsAzKPfBvI2UcsXZjjO4P3DMSAzfHWmPA0QeF3RR1VYZ6OOUMrwnCsRYnbju/Hn8M2IgYsBmmDUgYaYeZ3z5xpAyAx6M/MrnruWHZjOgA+VJfYuj7f5l84eIITnlbGFYoRPbBEw3hVGLYEziPlqmhfPECh23ZPwYGFmcP49tDmDcj5rxPgGA2tdmIZ7+qLekANJw+XHujMvuJCW3AvMuiuPWqCK5/XwxfviQaOGazHmHOZa2YO3M8vjJzHL5yOcFwDsM5M8bCweVj8JUZQjvmXDaGaQxn5HFZG9MUZzi9DddPb8X15Hf99BaGxPQ45uTjsxmffWkcsy9txuzpxPuEGOZdHsXtH4vhlMNKmt+Lyb/GttteikG5EswnoxcJX8kY4LD9LJw9OYRzp4SrimlHx3De0c2YdnRTCcRwLvM6OIpxB1FMOyoKvRo2AFOYJhwVoS5DQTqy5zs87Kwb+GrMgcxWcfdWoiSV5QDGmCQ5lexOmKdB9WGBT7PNsuWIUpYDiBEZPsTwdqJB9W2BW9hWmsKXJWXZDpDn9jmGTxMNqk8LPEOxvkiUTRU5AD0rTc7vJ/Q6GYMG1ZEF1CYz8m1UtlgVOYC4soJXGV5DNChAC7hgfRXbZn2l5Sp2AFXAin7N8BaiQfVhAY37v3UjiisHyFekWYGrSvPlG4E/FlAbqC1ccXPtAOwFuBqOmay1cVFII9SIdLU/M98WrkRw7QCqjRXr9SL96eQL2m+gqhbQiXdJvg1cV+zJAVQrBdjB8J3EqH2amLKPNpKt303be36Rx7MDyHIUZDPDC4lNRIOCtYBsfCFtrhPPc02+OICkoEB6mHQq408RDQrGAn8j2+PytmbUO/nmABKFgum9s/MYf5RokAsLjFDkQR47hzbextA38tUBJBUF7GGoC8MBryAxrUHuLfBzFn0vbdvL0Ffy3QEkHQXV3cMPMz6H0HSRQYNcWEC2m8tyH6RNy7q7x7wVUSAOIAkosE3cxPj5RM2/R0wZRhvJZufThjcQgT27FJgDFKxN4f/CuC4OFzJsUHkW0Hg/NW+78kq4zBW4A0guKrKF4QWEeoTAvJn8RzsVuvx/ytsscH2q4gDSggplCF0TnMn9Z4kGDbSAbHI2bRRolz+wSqBqDlComArq82Qnc38WsZt4s5Ns8Hka4eS8bRitHlXdAaQaFc0StzF+JOH7ewfkORpIQ6Fe1z6StriFCOQqv5QhauIABaGo9OvEh7h/AqELHwZvCtLzlSdS92sJXe3XTOmaOkBBaxrh78R7uH86sTc7ghr+dOp6MTHk27rUv6pUFw5Q0JhGWULIEU5jmu51M9grSLqcRt3U8MO+qFkLTevKAQoGoKH0KVPdU5jGNBmPwagkyT6N+pxHBPKmtVer1KUDFJSi0fRqsxwhxjQ9fXQ/Qy0zM6hL0keYtW4/ndLFKL8avq4XwOraAWhEh2jIJHEfcRkT9OeCCvWSip5QZlJNSTIsoAQziAmU8QPEA0Q9OypFzdGocICcqLlfGraLuJ/Q60+TmDqF+ALxMKEzkEGgpDpUl+o8inJMIj5F/Irw/IROoJIPwXzUOcCeOtDoK4n/IvSIVDOPH0KcQ1xF6E7aDxiqwTQGL2P8ZUJPMBX/T5LiStMx5VFelVHZrzL/1cS5hBq7OV+X6lzBNE9U68L/DwAA///mqFBLAAAABklEQVQDANn6OQK154ftAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAQAElEQVR4AexdCXQUxbquGgh7AK8kQTnCY5XLpkKQXcLxsCPKEsKq7EsSQoCw+FSe74mHh0lICElYFBAEJGyKoFwMGpAtouyEzXvjCVxZEhAIBLIR7v917GEmycx09/RM90wmJ5XqruXfu/qvv6o6BuaGPxEREQ1DQ0ODx44du37gwIHHO3XqlNm6dev7zZo1e9SgQYN8X1/fwpo1axYR60+QcI0y1DVt2vRRq1at7nfs2DETfQEjLCxsKmBSW7f7dQsDIGXPHDp0aIq/v//tOnXqFEZFRaXHx8cnrFu3bsyuXbvapqam+pw7d67Gb7/9VuXKlStemZmZFbKzs7moTVyjLCMjwwtt0BZ90Bcwli1btjw6Ojrdx8ensH379rcDAwNTpk+fHi72d+Xc5QwgPDy8dnBw8GxS+P62bdveqVSpUlF8fPySbdu2Bfz6669/u3XrVgVRIU+ePGFlJbHeVl6yb1ZWVoVffvnlb1u3bg0go4gBbtBAtKSEhIQQaeG1bcHUW71LGEBAQEBFUvrc3r17X1i/fv3txMTEKFJ49xMnTtTOz883PsnOFi5wgwaiJSAhISEGtBGN52lEigDNzqZHCT7dGgAESIKc0a9fvzNpaWm5pPTFe/fubf7nn3/qlmbQRjT+nUakSNAM2sl/CAEvSpTjjD66FOa0adP+9+7du7dJkLHfffddawy9zhCGmjhAM2iPi4uLJ15uTZ069QM14asFSzcGQI5VpQkTJiTAU1+xYsWC06dP11SLSa3hnDp1qhbx9H/E20PicRl41ZomEb8uDICejveOHz+evXr16uDLly9XEZ0vkUh3yYm3qsRjKHgFz1ryJeLW1ADIbe6L+TY9HQvT09Mri0S5ew5ewTN4nzlzZnct+dXEAObOnfv8gAEDTtJU6lvMt7UUgJa4wTvNHlIGDx58GDLRghanGgC8YYqsrV2zZs2V3bt3v/z48WPNpnBaCLssnJhK7tixozNkQrJZDRmV1c5RZU4zABrqWlPELYsia2NNgzWOYszV4EImn3/++XjIiF6NjZxFv1MMgKJkYRs3bjxJPy4XKXOWIkQ8CCxt2bLlEoWax4pljswdbQCGoKCgfyxfvjwWsXZ39e7VVtC1a9cqkpO4ZvTo0Ulqwy4Jz2EG0Ldv38oUFk1LSkrqXVRUVO7f9SUFb+u+oKCAb9iwYRjJ8AJkaau90nqHGMD48eO97927l0Fh0eZKCfP0K5YAZAhZQqbFJfb9LdlbdQOYN29efYriZRw9etSvJDLPvTIJHDlyxA8yJb/ARxkEy71UNYDZs2e3oCnNJXJknrGM0lOjRAKQ6f79+9MhYyX9LfVRzQBomvcqLYuexIYKj7NnSdzKyyHTs2fP1oCMIWvlkMx7qmIARFCT7du3H8rIyKhkDt5zp7YEIOMdO3YcgszVgG23AVDQ4rnvv//+FLZaqUGQB4ZtCZAReO3bt+8kZG+7tfUWdhkApic//fTT+bS0tOrW0Xhq1ZYA9i0ePnz4HHRgD2x7DKBCbm4uHD5PdM8eDdjRF3sgKV5wPjAw0LgPUi44xQYwdOjQfSkpKQ3kIvS0V0cCcAqR6FXQiPJ9tqBaqldkAKGhoTPI6dN0HdsSQ+WxHLoIDg6eqYR32QZA3mfLzZs3R5PVecK7SiTugD7QBS0gRUI3csHLNYAKBw4cOISlS7mIPO0dKwHohBzyg4RFlj8gywAGDRp0yLOkSyLW6e/x48efgW8mhzzJBkBzzlHffPNNBznAXalt//79GQ2hbM6cOWzu3Lls/vz5QoqIiGAzZswQEsXi2bRp09iIESN0yxoFiboTvW9LJVCSAbRr186Lgj0rsYWL3jdSYbtUu6CgILZkyRL2ySefsMWLF7NFixYJKTIyksXGxgopLi6OJSYmsk2bNjGDwcA452ZJDwxj6Z1mBonQmRR6DFIavfjii1vOnz/vtsEezrkUMZi1qVWrlvHcoVmFDm4QmGvZsuXnUkixaQA0LDbZuXPnm1KAuWobjGqcyzOC0aNH65rd3bt3D581a1YzW0TaNAAKOe7JycmRJx1bWHVWzzln1avLG+DwOtAZG2bk4JwirR5+a1ZYxo1VA0DAJzk5uUkZ/dyuqGLFirJ58vPzE3wA2R2d1AG6owBRhDV0Vg1g//79C611Lu91PXr00K0fIOqGYgP/I16XlVs0AJryhNPwX6OsTp6yYgn06tWLeXl5Fd/o9C90CF1aIs+iARw7duw9S5085cUSGDduHKMZUvGNjv9a02WZBhAWFjaGOj2rY55UJ+327duKYJKjxSpXriy8ChQBcEIn6NJScKhMAyCm8O53a89fTbnTVFnXziDxys+cOfMR5aV+SxkAMdOLHIcXMDcu1dpTUKYEEDVs3lxfRyBMCYUuodPZs2f3Ni3HdSkDuHr16rsI+aLSk6RLgCKlrEMH/S6VQKcZGRnzS3JUygBoRalzyUbl4Z5z+994qamprG3btsI6gR5lVpZuzQyAHIWg33//vdxt7eacM29vb1V0RkIWFpXq1q2rCjw1gUC30LEpTDMDSE9Pn2daWZ6uK1SQtY/CqmhIyOz69euMZlOsdu3aTEmU0SoCOypL6thoAIGBgVWPHDnykh2wXborHCW1GVi6dCm7c+cOw7rBlClTWNeuXVnDhg2ZmsYml+ajR4+2oT7G953RAHx9fafQXNh4T408vypJAJtIVqxYwQ4ePMjoCWSFhYWsZ8+ewtSRc27MVUJnFQy2joWEhMwQGxkVfvPmTbde8hUZtpRzzi1VOaTcESOOVEJNdW00ALLMl6UCcMd2WVlZTmUrPz/fIfikADXVtWAA+PgALRrUktLZHdsUFRU5/b3MuXNHHFO9paWl1Zo8ebKgb8EAqlatOoEsUjuKTKnzXDtcAnl5eZxWMccBkWAA165dC8JNeU4YBcoT/6IfIBgAhTHL7fQPSuec63o1DzSqnUQ/wIDtw/iqh9oIXAkePPJq1arJIhnzeczvZXUyaVypkrYB19OnT9fC0XJDQEBABxr+3Ob9z/lTVsSAC+dPy0x0YLzEHn+xrbHQxkVGRgaj1TWGfYFKDAE4baBwaDUWh1q0aNHekJub6+9QTE4CXr9+fdatWzf2zjvvsGXLlrGvv/5aCLjg6SYDZ2+++aYx4MI5N7tGG6bgBwGdzMxM4dSQv78/W7lypWQowCkmyZ1UbgjdG+7fv99eZbhOBYcTPRAknkha82Zr165loaGhgsJNCUEb0/uS1zCSkmXW7k3hcc4ZFoGA18fHR4jybdmyxVp3VlBQYLVebqWS9jk5Oa0MFKv+u5LOWvXBUN2mTRv2/vvvC47b5s2btSLFDC/nnNGwyiiczn744Qc2fPhwVqNGDfb666+zSZMmsZiYGME4N27cyL766iuWlencwJMZsX/dPHjwoDEMoO5f97rPaO4qKJ4cGPbRR2XucLLIA/btWaykinv37tFfdX8fPnzIfvzxR7Z69WrBX6CAG8OJosGDB7NzaefURaYAGhlrI8Pdu3fVWQhXQIDULpxz1qVLF0bBKvbhhx9K7WbWzprTheEc73OzDhJuOC/2Jaw15Zwbqznngu8hFnBufi+WOysno69poHdRBWchVIoHT86hQ4eUdpfUT64PIAmohUaca6t4kSx6oCoa6I9uDQAbKcLDw9lnn30m0uyQnPPyFwiCIMkJrIRZgG4NYObMmYLzBGLVSBjqLcGBA2epzlI54CGJ9bi2J4lwnJXTw2/ACCCEg52FVAoezjkbOnSo8LEGKe2ltLH1jpcbCZSCU+9tsCiEQJDu6GzcuDHbunWrqnThCeecW4SJ143FSh1X2ENadna2QXdPP55EWpuwh68y+4pDc5mVVIh6ysrdr6FmzZpFeuGac85mzZrlEHJouusQuK4MFLo3UIDkiV6YwAqb3ACPNdoXLFjAOnXqJOz2QZgYbfGkl0xiOXKpifOnrxMRntS+emkH3RtoWVIXIwDnxY6fPcJZt24dGzhwoHBkG1FDGBNO62CODyVZgo06RO0s1btrOXRvqF69una7E00kS9YofJ7NpEjWJY5k4bz+rl272OXLl4WVQM6fPqXWgHHOhSijtTbuWAfdwwBy9cDcgAEDFJHxwQcfCOfzT548KSwOKQGCEQBJSV9X7kMGkAsn8K7WTHDOWZ8+fWSTERwczBYuXKjK01seDYCcwLuG2rVr/5tzaUOlbA1J7ICPLk6YMEFi6+Jm0dHRDKdtiu/K3181OCa5/9vg7e39LzWA2QMD6+Zy+69Zs8ZmFzlPNXwQmwBNGnCu7UNjQoriS3r4zxpI+KmKIajUkQiRBWnnzp3swoULsvrYalylShVbTdyunnyAwxgBkrXmDLt85NCA977YnnNutsYulsvNOedyu7h8ewp/pxo+/vjjDHIGNA0GIfwrR5rYfydneLcFm3POsJfPVjvTejXxm8J11nWdOnUekx+VIawFNGnSRP39UDI4kTsCWNvdIwOtsSnnnA0ZMsR4Xx4u6tevfx98CgbQqFGjU7jRKsmNwolPn5jbSzeihnJgwAeR016PbUWdCwZQt27dnVoSmZsrLxaF0K6a9Hbs2FEWuPT0dN1+CEoqI35+foLOBQPIy8tbS9MgzfwAuQag9ufYXn31ValyE9pdvXpV2AIu3Dj5jxrooOuCgoK1gCUYwKpVq+61bNlSMz/gwYMHoEVymj59uuS2thpi+teuXTtbzczqHbFfwQyBg2+ga+gcaAQDwIX4TsC1s1NOTo5wlEsq3lGjRjEcDkF7e/2AF154geF0EWBJTa5uAKa6NhoATYN+kCoAtdvBAG7L/FgzRgHO7Z+745NucvmBAXDOhfgD509zuXC0ai++/4HfaAC3bt2KpsiQZn7A3r17QY/kNHHiRIbEOZfcp2RDnNAJCQkpWWz1Hu0x6pSVrHbUSeWzzz5blJmZaTzFajSArVu3PurcubNm6wLffmvz39uUEiG9x4ThG8ooVWmjAN/53759u41WpatxzEsJvtKQtCkhh/cidC1iNxoACpo1a5aAXIv06NEjtnz5ctmov/zyS+EfPlJkS1JfBJ3at2/PLl68KKm9aaOEhARGMybTIpe7pvf/p6ZEmxkAMbiUIkSanFvGU6X0BBD+4SM+82bLmcOiE4W+2bFjx0xlIPmanhzJbfXYkBzeAujYlDYzA6CKJzREHKZck99Lly4xW+fqrRGGo+IwJBzBxtc7Ro4cybBNDP8NFFvF7ty5w+bNU/Y55KSkJOFLn9bwO7JODdgUP4Fuzfy8kgbAyEpw/NaskRrIpcDAbECNTR5QfFRUFIMhYN/AnDlzmNItZyLdkydPZmpHIEXYTsqfkG4XlMRVygBiYmIO9OjR42rJhs66T0lJEc7TOwufFDxjxoxh2dnZUprqtg10Sro9WJLAUgaABq1bt36fck1GAcIrfAQCuR5S0uYku15LeuCBaHhCOn2X8lK/ZRpAXFzcF/S+UPZvtEqhf9gq/wAABjFJREFUkF9w48YNNmjQIPkdVe6BaeKIkSOE7/lwzo2BH5XROBxc165db5BON5WFqEwDQEN/f/+PkWuVsOQ6duxYrdALeBFthFMp3Ljwn7Zt25Z694vsWDQAmi7EtmrVSt4qjQhVhRyC37BhA4MSVAAnC8SmTZtY1apVhf/6gY6gxTShzFUSKf8uPf0Wv7Bh0QDAYLdu3fD/A3GpScKRbkT73njjDafhx35DhHvlLlE7jUCZiGj4D7PWxaoBUGRuMXmPV6wBcHRdfn4+2717N8P/6XU0rsDAQIaTRno6SWwPzz179vwnPf1fWINh1QDQ8ZVXXgmqUaOGZjMC0ICUnJzM6tWrx3DgE/dqpvj4eEZr5AxOH+dcTdCawYLOyPPvb4sAmwZAYdZUCqLIW6qzhVVh/bVr1xiOfMMQ7IkYiuihcHJ2BT/j/PnzYrFb5AMHDtxJurtsixmbBgAA1apVG9a4ceM8XOshwRAQ7WvevDlD/sUXVkc5M5LXr1sv9KGFL2El8cSJEy47vTNjzOSmYcOG+RRWH2ZSZPFSkgFQOPU+vYM1dQhLcgAHkZhkWA18++23BSViZHjrrbcYInemCe/25557TtjIOXbcWKEPNnUAhql3L16XxOVq93379p1//PhxSYt6kgwAAiCHcCEB1vU4iZEB8QNMH03Ttm3b2M2bN4Xj41Ay+HHXRDOmk4mJiTFS+ZNsAABIjoU/OUs5uHa15O6Khz5atGiRU6VKlS64lppkGQCthz/q169fb62Pkkllrjy1g0769OnTCzqSw7csAwDgyMjIw8OHD1+Ea09ynATkQiadLCSv/4jcfrINAAgoOvce3jW49iTtJQBdkE4WKKFEkQEAUWFhYafOnTvfxLUnaScB6AC6UEqBYgPYs2dPHi0WveiqTqFSgempHxZ6oAPoQildig0ACGnYuUfxgZebNGki73QnOnuSXRLAg/faa6+1gA7sAWSXAQBxTEzMPyns2Fmr3cSgobwlyBoPXmxs7HV7ebfbAEAAeZ8nhwwZ0tPPz+8x7j3JcRKAjCFrPHhqYFHFAEAIEXRg9OjRbeidpNkmEtDhzgnDPsm4FWStFp+qGQAIio6OPt+jR49G7dq1u4N7T5IvAUs9OnbsmBUQENCAZHzRUhsl5aoaAAhYtmxZ1ksvvdSADCED955kvwS6d+9+taCgoF5CQoLqG3VVNwCwi9XDlJSURkFBQXsNBoPmm0lAkysmyG7YsGHJBw4c+C+pq3ty+XSIAfxFRFFSUlKfadOmhfv4+Hicw7+EIjWDzCC7LVu29KI+DvukvyMNgOhmjIatOHJcXkHQQijw/LEpAbzvITPIzmZjOxs43ABAH3mtZxs3buw3ePBgLFZ4XgkQShlJHPJTU1PrQmZlNFG9yCkGAKppmTJ/x44dXUJCQqbSuvVDlHnSUwlAJjTkT3X0kP8UY/GV0wygGJ3wSljl6+tbi4a4bd7e3uV+NIAMRo0a9RVkQkP+KlFOzsqdbgBgbP/+/YUbNmwInDJlyss0XdT03AHo0Sg9wb59yGDjxo2DIRMt6NDEAERGo6KiztB0sUF4ePhIOD5iubvn4JV4HpWcnNwUMtCSX00NQGQ8Njb2S3J8fMPCwiZ16tQpi3Mu7PIV690lh+LBI3gFz3rgSxcGIAoiLi7us6NHj/qSozjRnaaN4CU0NHQiFA8eRX71kOvKAESBxMfHr6bI1zMktHAITyx3tRy0g4cTJ048A570SL8uDUAUFAltKYQXHBzsPWnSpKiuXbte9/Ly0u3MAR9hRtyeHLtFoBm0gweRHz3mujYAUWCJiYkPPv300zmHDh16npyn5ydPnvz/OKRSr169QrGNVjlo6N279wVS+mJ6vz9Pcfv6K1eu/G/QrBVNcvC6hAGYMhQZGXlj1apV7+7Zs6flH3/84TVr1qz+I0eO/LpDhw638ASatnXENXAAF3AS7jdAw969e1uQ0ueDNkfgdCRMlzOAksJYsmTJd5s2bRr0888/++Tl5RkiIiI605MYOn78+BVYSaOn8yIUho0qTZs2zW3QoEEBBV0e4yCFCAvXKEMd2qAt+qAvwdg3bty4lfQuD5szZ05X4AAu4CTcu0UYSnOt+/0HAAD//7pW51sAAAAGSURBVAMAq9TgqVf8gCYAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import { format, isToday, isYesterday } from 'date-fns'\nimport { ptBR } from 'date-fns/locale'\nimport {\n Bot,\n MoreHorizontal,\n Reply,\n Pencil,\n Pause,\n Download,\n Check,\n CheckCheck,\n FileText,\n Film,\n Globe,\n ImagePlus,\n Mail,\n MessageCircle,\n MessagesSquare,\n Mic,\n Play,\n Paperclip,\n Search,\n Send,\n Smartphone,\n Smile,\n Trash2,\n X,\n ArrowLeft,\n EllipsisVertical,\n Zap,\n type LucideIcon,\n} from 'lucide-react'\nimport { ContextMenu } from 'radix-ui'\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ClipboardEvent,\n type DragEvent,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { Avatar } from '@/components/ui/avatar'\nimport { Badge, type BadgeProps } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Input } from '@/components/ui/input'\nimport { Popover, PopoverClose, PopoverContent, PopoverTrigger } from '@/components/ui/popover'\nimport logoFacebook from '@/assets/channels/facebook.png'\nimport logoGoogle from '@/assets/channels/google.png'\nimport logoInstagram from '@/assets/channels/instagram.png'\nimport logoReclameAqui from '@/assets/channels/reclameaqui.png'\nimport logoTiktok from '@/assets/channels/tiktok.png'\nimport logoWhatsappWeb from '@/assets/channels/whatsapp-web.png'\nimport logoWhatsapp from '@/assets/channels/whatsapp.png'\nimport { cn } from '@/lib/cn'\n\n/*\n * Chat de atendimento: três peças que as telas combinam.\n * ConversationList lista de conversas (canal, última mensagem, espera, não lidas)\n * ChatThread mensagens do cliente, do atendente, do robô (URA/IA) e do sistema\n * ChatComposer campo de mensagem: textarea de 2 linhas que cresce, anexos por botão,\n * arrastar e soltar ou colar (Ctrl+V de arquivo, print ou imagem)\n * Selo do canal sobre a foto do contato com o logotipo (src/assets/channels); site, e-mail\n * e SMS com ícone. A etiqueta do canal (ChannelBadge) usa sempre o ícone e o nome.\n */\n\nexport type ChatChannel =\n | 'whatsapp'\n | 'whatsapp-web'\n | 'instagram'\n | 'facebook'\n | 'tiktok'\n | 'google'\n | 'reclameaqui'\n | 'site'\n | 'email'\n | 'sms'\n\nexport const chatChannels: Record<\n ChatChannel,\n {\n label: string\n icon: LucideIcon\n /** Logotipo do canal (imagem redonda); sem ele, vale o ícone. */\n logo?: string\n tone: NonNullable<BadgeProps['tone']>\n }\n> = {\n whatsapp: { label: 'WhatsApp', icon: MessageCircle, logo: logoWhatsapp, tone: 'success' },\n 'whatsapp-web': {\n label: 'WhatsApp Web',\n icon: MessageCircle,\n logo: logoWhatsappWeb,\n tone: 'info',\n },\n instagram: { label: 'Instagram', icon: MessagesSquare, logo: logoInstagram, tone: 'error' },\n facebook: { label: 'Facebook', icon: MessagesSquare, logo: logoFacebook, tone: 'info' },\n tiktok: { label: 'TikTok', icon: MessagesSquare, logo: logoTiktok, tone: 'neutral' },\n google: { label: 'Google Meu Negócio', icon: Globe, logo: logoGoogle, tone: 'info' },\n reclameaqui: {\n label: 'Reclame Aqui',\n icon: MessagesSquare,\n logo: logoReclameAqui,\n tone: 'success',\n },\n site: { label: 'Chat do site', icon: Globe, tone: 'primary' },\n email: { label: 'E-mail', icon: Mail, tone: 'neutral' },\n sms: { label: 'SMS', icon: Smartphone, tone: 'warning' },\n}\n\n/** Logotipo do canal em círculo (selo sobre a foto do contato), ou o ícone sem logotipo. */\nfunction ChannelMark({ channel, className }: { channel: ChatChannel; className?: string }) {\n const c = chatChannels[channel]\n if (c.logo) return <img src={c.logo} alt=\"\" className={cn('shrink-0 rounded-full', className)} />\n return <c.icon className={className} aria-hidden />\n}\n\nexport function ChannelBadge({ channel }: { channel: ChatChannel }) {\n const c = chatChannels[channel]\n return (\n <Badge tone={c.tone} icon={<c.icon />}>\n {c.label}\n </Badge>\n )\n}\n\nexport interface ChatAttachment {\n name: string\n /** Endereço do arquivo (ou blob: local, para prévia antes de enviar). */\n url?: string\n type?: string\n size?: number\n /** Duração em segundos (áudio e vídeo). */\n duration?: number\n}\n\nexport interface ChatMessage {\n id: string\n /** Foto de quem enviou (cliente ou atendente). */\n avatar?: string\n /** Quem enviou: o cliente, o atendente, o robô (URA/IA) ou um aviso do sistema. */\n from: 'contact' | 'agent' | 'bot' | 'system'\n text?: string\n time: Date\n /** Nome de quem enviou (atendente ou robô). */\n author?: string\n /** Resposta a outra mensagem: mostra a citação acima do texto. */\n /** Mensagem citada. Com o id, clicar na citação leva até a original. */\n replyTo?: { id?: string; author?: string; text?: string }\n /** Reações com emoji. */\n reactions?: string[]\n /** Excluída: continua no chat, riscada e em vermelho claro. */\n deleted?: boolean\n /** Texto antes da edição: a mensagem mostra o novo e o original. */\n editedFrom?: string\n /** Situação da mensagem enviada: enviada, entregue, lida. */\n status?: 'sent' | 'delivered' | 'read'\n attachments?: ChatAttachment[]\n}\n\nexport interface Conversation {\n id: string\n name: string\n /** Foto do contato. */\n avatar?: string\n channel: ChatChannel\n /** Conta ou número do canal que recebeu (ex.: \"Comercial\"). */\n account?: string\n /** Departamento ou fila (ex.: \"Suporte\"). */\n department?: string\n lastMessage: string\n time: Date\n unread?: number\n /** Esperando desde (fila): mostra o tempo de espera. */\n waitingSince?: Date\n assignee?: string\n}\n\nconst hhmm = (d: Date) => format(d, 'HH:mm')\nconst secs = (n: number) => `${Math.floor(n / 60)}:${String(n % 60).padStart(2, '0')}`\nconst stamp = (d: Date) => (isToday(d) ? hhmm(d) : format(d, 'dd/MM/yyyy HH:mm'))\nconst channelText: Record<ChatChannel, string> = {\n whatsapp: 'text-success-soft-foreground',\n 'whatsapp-web': 'text-info-soft-foreground',\n tiktok: 'text-foreground',\n google: 'text-info-soft-foreground',\n reclameaqui: 'text-success-soft-foreground',\n instagram: 'text-destructive-soft-foreground',\n facebook: 'text-info-soft-foreground',\n site: 'text-primary-text',\n email: 'text-muted-foreground',\n sms: 'text-warning-soft-foreground',\n}\nconst dayLabel = (d: Date) =>\n isToday(d) ? 'Hoje' : isYesterday(d) ? 'Ontem' : format(d, \"d 'de' MMMM\", { locale: ptBR })\nconst sizeLabel = (n?: number) =>\n n == null\n ? ''\n : n < 1024 * 1024\n ? `${Math.max(1, Math.round(n / 1024))} KB`\n : `${(n / 1024 / 1024).toFixed(1).replace('.', ',')} MB`\nconst waited = (since: Date, now = new Date()) => {\n const min = Math.max(0, Math.round((now.getTime() - since.getTime()) / 60000))\n return min < 60 ? `${min} min` : `${Math.floor(min / 60)} h ${min % 60} min`\n}\n\n/* ================================================================ lista */\n\nexport interface ConversationListProps {\n items: Conversation[]\n activeId?: string | null\n onSelect: (id: string) => void\n /** Texto quando não há conversas (ex.: com os filtros aplicados). */\n empty?: string\n className?: string\n}\n\nexport function ConversationList({\n items,\n activeId,\n onSelect,\n empty = 'Nenhuma conversa aqui.',\n className,\n}: ConversationListProps) {\n if (!items.length) return <p className=\"p-6 text-center text-sm text-muted-foreground\">{empty}</p>\n return (\n <ul data-rendra=\"CHAT-001\" className={cn('flex flex-col gap-1 p-2', className)}>\n {items.map((c) => {\n const active = c.id === activeId\n return (\n <li key={c.id}>\n <button\n type=\"button\"\n onClick={() => onSelect(c.id)}\n aria-current={active || undefined}\n className={cn(\n 'flex w-full cursor-pointer items-start gap-3 rounded-item px-3 py-3 text-left transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring',\n active ? 'bg-primary-soft' : 'hover:bg-accent',\n )}\n >\n <span className=\"relative shrink-0\">\n <Avatar name={c.name} src={c.avatar} size=\"lg\" />\n <span\n className=\"absolute -right-1 -bottom-1 flex size-6 items-center justify-center rounded-full bg-card text-muted-foreground ring-2 ring-card\"\n title={chatChannels[c.channel].label}\n >\n <ChannelMark\n channel={c.channel}\n className={chatChannels[c.channel].logo ? 'size-6' : 'size-3'}\n />\n </span>\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"flex items-baseline gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-semibold\">{c.name}</span>\n <span className=\"shrink-0 text-xs text-muted-foreground tabular-nums\">\n {stamp(c.time)}\n </span>\n </span>\n <span className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted-foreground\">\n {[c.department, c.assignee].filter(Boolean).join(' · ') || c.lastMessage}\n </span>\n {c.unread ? (\n <span className=\"flex min-w-6 shrink-0 items-center justify-center rounded-full bg-primary px-1 text-xs font-semibold text-primary-foreground tabular-nums\">\n {c.unread}\n </span>\n ) : null}\n </span>\n <span className=\"flex min-w-0 items-center gap-1 text-xs\">\n <span className={cn('shrink-0 font-semibold', channelText[c.channel])}>\n {chatChannels[c.channel].label}\n {c.account ? ':' : ''}\n </span>\n {c.account && <span className=\"truncate text-muted-foreground\">{c.account}</span>}\n </span>\n {c.waitingSince && (\n <span className=\"text-xs font-medium text-warning-soft-foreground\">\n Esperando há {waited(c.waitingSince)}\n </span>\n )}\n </span>\n </button>\n </li>\n )\n })}\n </ul>\n )\n}\n\n/* ================================================================ mensagens */\n\nexport interface ChatThreadProps {\n messages: ChatMessage[]\n /** Responder (citar) uma mensagem: a tela mostra a citação no campo de mensagem. */\n onReply?: (message: ChatMessage) => void\n /** Reagir com emoji (clicar de novo na mesma reação a remove). */\n onReact?: (message: ChatMessage, emoji: string) => void\n /** Editar uma mensagem do atendente. */\n onEdit?: (message: ChatMessage) => void\n /** Excluir uma mensagem do atendente (continua no chat, riscada). */\n onDelete?: (message: ChatMessage) => void\n className?: string\n}\n\nconst REACTIONS = ['👍', '❤️', '😂', '😮', '🙏', '✅']\nconst SPEEDS = [1, 1.5, 2] as const\n\n/** Tocador de áudio: tocar e pausar, progresso, velocidade 1x, 1,5x e 2x, e baixar. */\nfunction AudioPlayer({ file, mine }: { file: ChatAttachment; mine: boolean }) {\n const total = Math.max(1, file.duration ?? 8)\n const [playing, setPlaying] = useState(false)\n const [pos, setPos] = useState(0)\n const [speed, setSpeed] = useState<(typeof SPEEDS)[number]>(1)\n const audio = useRef<HTMLAudioElement>(null)\n // Sem arquivo de verdade (demo), o progresso é simulado no ritmo da velocidade escolhida.\n useEffect(() => {\n if (!playing || file.url) return\n const t = window.setInterval(() => {\n setPos((p) => {\n const next = p + 0.1 * speed\n if (next >= total) {\n setPlaying(false)\n return 0\n }\n return next\n })\n }, 100)\n return () => window.clearInterval(t)\n }, [playing, speed, total, file.url])\n useEffect(() => {\n if (audio.current) audio.current.playbackRate = speed\n }, [speed])\n const toggle = () => {\n if (file.url && audio.current) {\n if (playing) audio.current.pause()\n else void audio.current.play()\n }\n setPlaying((v) => !v)\n }\n const progress = Math.min(1, pos / total)\n return (\n <span\n className={cn(\n 'flex min-w-0 items-center gap-2 rounded-full py-1 pr-1 pl-1 text-xs md:min-w-3xs',\n mine ? 'bg-primary-foreground/15' : 'bg-muted',\n )}\n >\n {file.url && (\n <audio\n ref={audio}\n src={file.url}\n onTimeUpdate={(e) => setPos(e.currentTarget.currentTime)}\n onEnded={() => {\n setPlaying(false)\n setPos(0)\n }}\n >\n <track kind=\"captions\" />\n </audio>\n )}\n <Button\n size=\"sm\"\n iconOnly\n variant={mine ? 'secondary' : 'primary'}\n aria-label={playing ? 'Pausar áudio' : 'Tocar áudio'}\n onClick={toggle}\n className=\"rounded-full\"\n >\n {playing ? <Pause /> : <Play />}\n </Button>\n <span className=\"relative h-1 min-w-12 flex-1 overflow-hidden rounded-full bg-current/25\">\n <span\n aria-hidden\n className=\"absolute inset-y-0 left-0 w-progress rounded-full bg-current\"\n style={{ '--progress': `${(progress * 100).toFixed(1)}%` } as CSSProperties}\n />\n </span>\n <span className=\"shrink-0 tabular-nums\">{secs(Math.round(playing ? pos : total))}</span>\n <button\n type=\"button\"\n onClick={() => setSpeed((s) => SPEEDS[(SPEEDS.indexOf(s) + 1) % SPEEDS.length] ?? 1)}\n aria-label={`Velocidade ${String(speed).replace('.', ',')}x. Trocar velocidade`}\n className=\"flex h-6 min-w-12 shrink-0 cursor-pointer items-center justify-center rounded-full bg-current/15 px-2 font-semibold tabular-nums max-md:h-touch\"\n >\n {String(speed).replace('.', ',')}x\n </button>\n <a\n href={file.url ?? '#'}\n download={file.name}\n aria-label={`Baixar ${file.name}`}\n onClick={(e) => !file.url && e.preventDefault()}\n className=\"flex size-8 shrink-0 items-center justify-center rounded-full hover:bg-current/15 max-md:size-touch\"\n >\n <Download className=\"size-icon-sm\" aria-hidden />\n </a>\n </span>\n )\n}\n\nfunction Attachments({ files, mine }: { files: ChatAttachment[]; mine: boolean }) {\n return (\n <span className=\"flex flex-col gap-2\">\n {files.map((f, i) => {\n if (f.type?.startsWith('audio/')) return <AudioPlayer key={i} file={f} mine={mine} />\n const media = f.url && (f.type?.startsWith('image/') || f.type?.startsWith('video/'))\n return media ? (\n <span key={i} className=\"relative flex flex-col gap-1\">\n {f.type?.startsWith('video/') ? (\n <video src={f.url} controls className=\"max-h-chart-sm max-w-full rounded-item\">\n <track kind=\"captions\" />\n </video>\n ) : (\n <img\n src={f.url}\n alt={f.name}\n className=\"max-h-chart-sm max-w-full rounded-item object-cover\"\n />\n )}\n <a\n href={f.url}\n download={f.name}\n className=\"flex items-center gap-1 self-start text-xs underline-offset-4 hover:underline max-md:min-h-touch\"\n >\n <Download className=\"size-3\" aria-hidden />\n Baixar\n <span className=\"sr-only\">{f.name}</span>\n </a>\n </span>\n ) : (\n <a\n key={i}\n href={f.url}\n download={f.name}\n className={cn(\n 'flex min-w-0 items-center gap-2 rounded-item px-2 py-2 text-xs underline-offset-4 hover:underline',\n mine ? 'bg-primary-foreground/15' : 'bg-muted',\n )}\n >\n <FileText className=\"size-icon-sm shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate\">{f.name}</span>\n {f.size != null && <span className=\"shrink-0\">{sizeLabel(f.size)}</span>}\n <Download className=\"size-icon-sm shrink-0\" aria-label=\"Baixar\" />\n </a>\n )\n })}\n </span>\n )\n}\n\n/** Ações da mensagem: no botão direito (ContextMenu) e no botão \"…\" (toque e teclado). */\nfunction MessageActions({\n m,\n mine,\n onReply,\n onReact,\n onEdit,\n onDelete,\n kind,\n}: {\n m: ChatMessage\n mine: boolean\n kind: 'context' | 'dropdown'\n} & Pick<ChatThreadProps, 'onReply' | 'onReact' | 'onEdit' | 'onDelete'>) {\n const Item = kind === 'context' ? ContextMenu.Item : DropdownMenuItem\n const itemClass =\n kind === 'context'\n ? 'flex min-h-touch cursor-pointer items-center gap-2 rounded-item px-3 text-sm outline-none select-none data-[highlighted]:bg-accent md:min-h-0 md:py-2 [&_svg]:size-icon-sm'\n : undefined\n return (\n <>\n <div role=\"group\" aria-label=\"Reagir\" className=\"flex gap-1 p-1\">\n {REACTIONS.map((e) => (\n <Item\n key={e}\n onSelect={() => onReact?.(m, e)}\n aria-label={`Reagir com ${e}`}\n className={cn(\n 'flex size-touch cursor-pointer items-center justify-center rounded-item text-lg outline-none data-[highlighted]:bg-accent md:size-8',\n )}\n >\n {e}\n </Item>\n ))}\n </div>\n <Item className={itemClass} onSelect={() => onReply?.(m)}>\n <Reply aria-hidden /> Responder\n </Item>\n {mine && !m.deleted && (\n <>\n <Item className={itemClass} onSelect={() => onEdit?.(m)}>\n <Pencil aria-hidden /> Editar\n </Item>\n <Item\n className={cn(itemClass, kind === 'context' && 'text-destructive-soft-foreground')}\n {...(kind === 'dropdown' ? { destructive: true } : {})}\n onSelect={() => onDelete?.(m)}\n >\n <Trash2 aria-hidden /> Excluir\n </Item>\n </>\n )}\n </>\n )\n}\n\nexport function ChatThread({\n messages,\n onReply,\n onReact,\n onEdit,\n onDelete,\n className,\n}: ChatThreadProps) {\n const endRef = useRef<HTMLDivElement>(null)\n // Sempre mostra a mensagem mais nova.\n useEffect(() => {\n endRef.current?.scrollIntoView({ block: 'end' })\n }, [messages.length])\n\n const groups = useMemo(() => {\n const out: { day: string; items: ChatMessage[] }[] = []\n for (const m of messages) {\n const day = dayLabel(m.time)\n const last = out[out.length - 1]\n if (last?.day === day) last.items.push(m)\n else out.push({ day, items: [m] })\n }\n return out\n }, [messages])\n const actionsOn = Boolean(onReply || onReact || onEdit || onDelete)\n const logRef = useRef<HTMLDivElement>(null)\n const [flash, setFlash] = useState<string | null>(null)\n useEffect(() => {\n if (!flash) return\n const t = window.setTimeout(() => setFlash(null), 1600)\n return () => window.clearTimeout(t)\n }, [flash])\n // Leva até a mensagem citada e a destaca por um instante.\n const goTo = (id: string) => {\n const el = logRef.current?.querySelector<HTMLElement>(`[data-message-id=\"${CSS.escape(id)}\"]`)\n if (!el) return\n const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n el.scrollIntoView({ behavior: reduce ? 'auto' : 'smooth', block: 'center' })\n setFlash(id)\n }\n\n return (\n <div\n ref={logRef}\n role=\"log\"\n // Área rolável focável: dá para rolar as mensagens pelo teclado (WCAG, axe\n // scrollable-region-focusable). O log não é interativo, mas precisa receber foco.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n aria-live=\"polite\"\n aria-label=\"Mensagens da conversa\"\n data-rendra=\"CHAT-002\"\n className={cn(\n 'flex min-h-0 flex-1 scrollbar-subtle flex-col gap-3 overflow-y-auto overscroll-contain bg-muted/40 p-4',\n className,\n )}\n >\n {groups.map((g) => (\n <section key={g.day} className=\"flex flex-col gap-3\" aria-label={g.day}>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\" aria-hidden>\n <span className=\"h-px flex-1 bg-border\" />\n {g.day}\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n {g.items.map((m) => {\n if (m.from === 'system')\n return (\n <p key={m.id} className=\"self-center text-center text-xs text-muted-foreground\">\n {m.text} · {hhmm(m.time)}\n </p>\n )\n const mine = m.from === 'agent'\n const bot = m.from === 'bot'\n const who = m.author ?? (bot ? 'Assistente virtual' : undefined)\n const bubble = (\n <div\n className={cn(\n 'group/msg relative flex min-w-0 flex-col gap-2 rounded-surface px-3 py-2 text-sm wrap-anywhere shadow-sm transition-shadow',\n flash === m.id && 'ring-4 ring-ring/60',\n mine && !m.deleted && 'bg-primary text-primary-foreground',\n bot && 'border border-dashed bg-card',\n m.from === 'contact' && !m.deleted && 'border bg-card',\n m.deleted &&\n 'border border-destructive/30 bg-destructive-soft text-destructive-soft-foreground',\n )}\n >\n <span\n className={cn(\n 'flex items-center gap-2 text-xs',\n mine && !m.deleted\n ? 'flex-row-reverse text-primary-foreground'\n : 'text-muted-foreground',\n m.deleted && 'text-destructive-soft-foreground',\n )}\n >\n {bot ? (\n <Bot className=\"size-icon-sm\" aria-hidden />\n ) : (\n <Avatar name={who ?? '?'} src={m.avatar} size=\"sm\" />\n )}\n {who && <span className=\"font-semibold\">{who}</span>}\n <span className={cn('tabular-nums', mine ? 'mr-auto' : 'ml-auto')}>\n {format(m.time, 'dd/MM/yyyy HH:mm')}\n </span>\n {actionsOn && (\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label=\"Ações da mensagem\"\n className=\"-my-1 flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-item opacity-70 outline-none hover:opacity-100 focus-visible:ring-2 focus-visible:ring-ring max-md:size-touch\"\n >\n <MoreHorizontal className=\"size-icon-sm\" aria-hidden />\n </DropdownMenuTrigger>\n <DropdownMenuContent align={mine ? 'end' : 'start'}>\n <MessageActions\n kind=\"dropdown\"\n m={m}\n mine={mine}\n onReply={onReply}\n onReact={onReact}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </span>\n {m.replyTo &&\n (() => {\n const quoteClass = cn(\n 'flex flex-col rounded-block border-l-4 px-2 py-1 text-left text-xs',\n mine && !m.deleted\n ? 'border-primary-foreground/60 bg-primary-foreground/15'\n : 'border-primary bg-muted',\n )\n const body = (\n <>\n <span className=\"font-semibold\">{m.replyTo.author}</span>\n <span className=\"line-clamp-2\">{m.replyTo.text}</span>\n </>\n )\n const target = m.replyTo.id\n return target ? (\n <button\n type=\"button\"\n onClick={() => goTo(target)}\n aria-label={`Ir para a mensagem citada de ${m.replyTo.author ?? 'contato'}`}\n className={cn(\n quoteClass,\n 'cursor-pointer outline-none hover:opacity-90 focus-visible:ring-2 focus-visible:ring-ring',\n )}\n >\n {body}\n </button>\n ) : (\n <span className={quoteClass}>{body}</span>\n )\n })()}\n {m.attachments?.length && !m.deleted ? (\n <Attachments files={m.attachments} mine={mine} />\n ) : null}\n {m.deleted ? (\n <p className=\"line-through\">\n {m.text || 'Anexo'}\n <span className=\"sr-only\"> (mensagem excluída)</span>\n </p>\n ) : (\n m.text && <p className=\"wrap-anywhere whitespace-pre-wrap\">{m.text}</p>\n )}\n {m.editedFrom && !m.deleted && (\n <p\n className={cn(\n 'border-t pt-1 text-xs',\n mine\n ? 'border-primary-foreground/30 text-primary-foreground'\n : 'text-muted-foreground',\n )}\n >\n Editada. Antes: <span className=\"line-through\">{m.editedFrom}</span>\n </p>\n )}\n {(m.deleted || (mine && m.status)) && (\n <span className=\"flex items-center justify-end gap-1 text-xs\">\n {m.deleted && <span className=\"font-semibold\">Mensagem excluída</span>}\n {mine && !m.deleted && m.status === 'sent' && (\n <Check className=\"size-3\" aria-label=\"Enviada\" />\n )}\n {mine && !m.deleted && m.status && m.status !== 'sent' && (\n <CheckCheck\n className=\"size-3\"\n aria-label={m.status === 'read' ? 'Lida' : 'Entregue'}\n />\n )}\n </span>\n )}\n </div>\n )\n return (\n <div\n key={m.id}\n data-message-id={m.id}\n className={cn(\n 'flex max-w-full flex-col gap-1 md:max-w-4/5',\n mine ? 'items-end self-end' : 'items-start self-start',\n )}\n >\n {actionsOn ? (\n <ContextMenu.Root>\n <ContextMenu.Trigger asChild>{bubble}</ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"z-50 min-w-3xs rounded-surface border bg-popover p-1 text-popover-foreground shadow-md\">\n <MessageActions\n kind=\"context\"\n m={m}\n mine={mine}\n onReply={onReply}\n onReact={onReact}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n ) : (\n bubble\n )}\n {m.reactions && m.reactions.length > 0 && (\n <span className=\"-mt-2 flex gap-1 px-2\" aria-label=\"Reações\">\n {[...new Set(m.reactions)].map((e) => (\n <button\n key={e}\n type=\"button\"\n onClick={() => onReact?.(m, e)}\n aria-label={`Reação ${e}. Remover`}\n className=\"flex h-6 cursor-pointer items-center gap-1 rounded-full border bg-card px-2 text-xs shadow-sm max-md:h-touch\"\n >\n {e}\n {m.reactions!.filter((x) => x === e).length > 1 && (\n <span className=\"tabular-nums\">\n {m.reactions!.filter((x) => x === e).length}\n </span>\n )}\n </button>\n ))}\n </span>\n )}\n </div>\n )\n })}\n </section>\n ))}\n <div ref={endRef} />\n </div>\n )\n}\n\n/* ================================================================ campo de mensagem */\n\nconst EMOJIS = [\n '😀',\n '😂',\n '😊',\n '😍',\n '🤔',\n '😅',\n '😉',\n '🙏',\n '👍',\n '👏',\n '🙌',\n '💪',\n '🎉',\n '✅',\n '❤️',\n '🔥',\n '👀',\n '🚀',\n '📎',\n '📅',\n '💬',\n '⏰',\n '📞',\n '🤝',\n]\n\nexport interface QuickReply {\n id: string\n /** Nome curto na lista (ex.: \"Saudação\"). */\n title: string\n text: string\n}\n\nexport interface ChatComposerProps {\n /** files inclui o áudio gravado (tipo audio/*), com a duração em segundos. */\n onSend: (message: { text: string; files: File[]; audioSeconds?: number }) => void\n placeholder?: string\n disabled?: boolean\n /** Motivo de estar desativado, mostrado no lugar do campo (ex.: \"Assuma a conversa\"). */\n disabledHint?: string\n /** Ação mostrada junto do motivo (ex.: botão \"Assumir atendimento\"). */\n disabledAction?: ReactNode\n /** Tipos aceitos no botão de arquivo. Padrão: qualquer arquivo. */\n accept?: string\n /**\n * Mensagens rápidas cadastradas. Com elas, o raio ao lado do microfone abre a lista (com\n * busca); a escolhida vai para o campo, para revisar antes de enviar.\n */\n quickReplies?: QuickReply[]\n /** Mensagem sendo respondida: aparece citada acima do campo. */\n quote?: { author?: string; text?: string } | null\n onCancelQuote?: () => void\n /** Mensagem sendo editada: o campo vem com o texto dela. */\n editing?: { id: string; text?: string } | null\n onCancelEdit?: () => void\n className?: string\n}\n\n/**\n * Campo de mensagem. Esquerda: arquivo, imagem ou vídeo e emoji. Centro: textarea de 2\n * linhas que cresce com o texto (Enter envia, Shift+Enter quebra a linha); aceita arrastar e\n * soltar e colar arquivos, prints e imagens. Direita: mensagens rápidas (quando cadastradas),\n * gravar áudio (a gravação é simulada no demo: contador, ondas e ponto pulsando; cancelar ou\n * enviar) e enviar.\n */\nexport function ChatComposer({\n onSend,\n placeholder = 'Escreva uma mensagem',\n disabled,\n disabledHint,\n disabledAction,\n accept,\n quickReplies,\n quote,\n onCancelQuote,\n editing,\n onCancelEdit,\n className,\n}: ChatComposerProps) {\n const [text, setText] = useState('')\n const [files, setFiles] = useState<File[]>([])\n const [drag, setDrag] = useState(false)\n const [recording, setRecording] = useState(false)\n // Menu de ações da conversa estreita: lista, emojis ou mensagens rápidas.\n const [menu, setMenu] = useState<'menu' | 'emoji' | 'quick' | null>(null)\n const [seconds, setSeconds] = useState(0)\n const fileInput = useRef<HTMLInputElement>(null)\n const mediaInput = useRef<HTMLInputElement>(null)\n const area = useRef<HTMLTextAreaElement>(null)\n // Safari e Firefox não têm field-sizing: mede a altura do texto para o campo crescer.\n useLayoutEffect(() => {\n const el = area.current\n if (!el || CSS.supports('field-sizing', 'content')) return\n el.style.removeProperty('--autosize-h')\n el.style.setProperty('--autosize-h', `${el.scrollHeight + el.offsetHeight - el.clientHeight}px`)\n }, [text])\n const previews = useMemo(\n () => files.map((f) => (f.type.startsWith('image/') ? URL.createObjectURL(f) : null)),\n [files],\n )\n useEffect(() => () => previews.forEach((u) => u && URL.revokeObjectURL(u)), [previews])\n // Editar: o campo recebe o texto da mensagem escolhida.\n useEffect(() => {\n if (!editing) return\n setText(editing.text ?? '')\n window.requestAnimationFrame(() => area.current?.focus())\n }, [editing])\n useEffect(() => {\n if (quote) area.current?.focus()\n }, [quote])\n useEffect(() => {\n if (!recording) return\n const t = window.setInterval(() => setSeconds((n) => n + 1), 1000)\n return () => window.clearInterval(t)\n }, [recording])\n\n const add = (list: FileList | File[] | null | undefined) => {\n const next = [...(list ?? [])]\n if (next.length) setFiles((f) => [...f, ...next])\n }\n const send = () => {\n if (disabled || (!text.trim() && !files.length)) return\n onSend({ text: text.trim(), files })\n setText('')\n setFiles([])\n }\n const insertEmoji = (emoji: string) => {\n const el = area.current\n const start = el?.selectionStart ?? text.length\n const end = el?.selectionEnd ?? text.length\n setText(text.slice(0, start) + emoji + text.slice(end))\n window.requestAnimationFrame(() => {\n el?.focus()\n el?.setSelectionRange(start + emoji.length, start + emoji.length)\n })\n }\n const insertQuickReply = (t: string) => {\n setText((cur) => (cur.trim() ? `${cur.trimEnd()} ${t}` : t))\n window.requestAnimationFrame(() => area.current?.focus())\n }\n const startRecording = () => {\n setSeconds(0)\n setRecording(true)\n }\n const stopRecording = (keep: boolean) => {\n setRecording(false)\n if (keep && seconds > 0) {\n const audio = new File(\n [new Blob([], { type: 'audio/webm' })],\n `Áudio ${secs(seconds)}.webm`,\n {\n type: 'audio/webm',\n },\n )\n onSend({ text: '', files: [audio], audioSeconds: seconds })\n }\n setSeconds(0)\n }\n const onPaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n // Colar arquivo, print ou imagem copiada vira anexo; texto segue normal.\n if (e.clipboardData.files.length) {\n e.preventDefault()\n add(e.clipboardData.files)\n }\n }\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDrag(false)\n if (!disabled) add(e.dataTransfer.files)\n }\n\n if (disabled && disabledHint)\n return (\n <div\n className={cn(\n 'flex flex-col items-center gap-3 border-t bg-card p-4 pb-safe text-center text-sm text-muted-foreground md:pb-4',\n className,\n )}\n >\n {disabledHint}\n {disabledAction}\n </div>\n )\n\n return (\n <div\n onDragOver={(e) => {\n e.preventDefault()\n if (!disabled) setDrag(true)\n }}\n onDragLeave={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setDrag(false)\n }}\n onDrop={onDrop}\n data-rendra=\"CHAT-003\"\n className={cn(\n '@container relative flex flex-col gap-2 border-t bg-card p-3 pb-safe md:pb-3',\n className,\n )}\n >\n {drag && (\n <div className=\"pointer-events-none absolute inset-2 z-10 flex items-center justify-center rounded-control border-2 border-dashed border-primary bg-primary-soft text-sm font-medium text-primary-soft-foreground\">\n Solte para anexar\n </div>\n )}\n {(quote || editing) && (\n <div className=\"flex items-start gap-2 rounded-block border-l-4 border-primary bg-muted px-3 py-2 text-xs\">\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"font-semibold\">\n {editing ? 'Editando mensagem' : `Respondendo a ${quote?.author ?? 'mensagem'}`}\n </span>\n {!editing && <span className=\"line-clamp-2 text-muted-foreground\">{quote?.text}</span>}\n </span>\n <button\n type=\"button\"\n aria-label={editing ? 'Cancelar edição' : 'Cancelar resposta'}\n onClick={() => {\n if (editing) {\n setText('')\n onCancelEdit?.()\n } else onCancelQuote?.()\n }}\n className=\"flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-card hover:text-foreground max-md:size-touch\"\n >\n <X className=\"size-3\" aria-hidden />\n </button>\n </div>\n )}\n {files.length > 0 && (\n <ul className=\"flex flex-wrap gap-2\" aria-label=\"Anexos\">\n {files.map((f, i) => (\n <li\n key={`${f.name}-${i}`}\n className=\"flex max-w-full items-center gap-2 rounded-item border bg-muted py-1 pr-1 pl-1 text-xs\"\n >\n {previews[i] ? (\n <img src={previews[i] ?? ''} alt=\"\" className=\"size-8 rounded-item object-cover\" />\n ) : f.type.startsWith('video/') ? (\n <Film className=\"ml-1 size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n ) : (\n <FileText\n className=\"ml-1 size-icon-sm shrink-0 text-muted-foreground\"\n aria-hidden\n />\n )}\n <span className=\"max-w-3xs truncate\">{f.name}</span>\n <span className=\"text-muted-foreground\">{sizeLabel(f.size)}</span>\n <button\n type=\"button\"\n aria-label={`Remover ${f.name}`}\n onClick={() => setFiles((l) => l.filter((_, j) => j !== i))}\n className=\"flex size-6 cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-card hover:text-foreground max-md:size-touch\"\n >\n <X className=\"size-3\" aria-hidden />\n </button>\n </li>\n ))}\n </ul>\n )}\n {/*\n * Conversa larga: arquivo, imagem, emoji | campo | mensagens rápidas, áudio, enviar.\n * Conversa estreita (celular ou três colunas): campo, enviar e o botão de ações, que abre\n * as outras opções.\n */}\n <div className=\"flex items-end gap-1\">\n {recording ? (\n /* Gravação simulada: ponto pulsando, tempo e ondas no lugar do campo. */\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"flex h-control-md min-w-0 flex-1 items-center gap-3 rounded-control border border-destructive/40 bg-destructive-soft px-3 text-destructive-soft-foreground\"\n >\n <span\n aria-hidden\n className=\"size-3 shrink-0 animate-pulse rounded-full bg-destructive\"\n />\n <span className=\"shrink-0 text-sm font-semibold tabular-nums\">{secs(seconds)}</span>\n <span className=\"sr-only\">Gravando áudio</span>\n <span\n aria-hidden\n className=\"flex h-6 min-w-0 flex-1 items-center gap-1 overflow-hidden\"\n >\n {Array.from({ length: 28 }, (_, i) => (\n <span\n key={i}\n className=\"h-full w-1 shrink-0 wave-bar rounded-full bg-destructive\"\n style={{ '--delay': `${(i * 83) % 900}ms` } as CSSProperties}\n />\n ))}\n </span>\n </div>\n ) : (\n <>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Anexar arquivo\"\n disabled={disabled}\n onClick={() => fileInput.current?.click()}\n className=\"@max-xl:hidden\"\n >\n <Paperclip />\n </Button>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Enviar imagem ou vídeo\"\n disabled={disabled}\n onClick={() => mediaInput.current?.click()}\n className=\"@max-xl:hidden\"\n >\n <ImagePlus />\n </Button>\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Emoji\"\n disabled={disabled}\n className=\"@max-xl:hidden\"\n >\n <Smile />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" side=\"top\" className=\"w-auto p-2\">\n <EmojiGrid onPick={insertEmoji} />\n </PopoverContent>\n </Popover>\n <textarea\n ref={area}\n rows={2}\n value={text}\n disabled={disabled}\n onChange={(e) => setText(e.target.value)}\n onPaste={onPaste}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n send()\n }\n }}\n placeholder={placeholder}\n aria-label=\"Mensagem\"\n className=\"field-sizing-content h-autosize max-h-chart-sm min-h-control-md min-w-0 flex-1 resize-none rounded-control border border-input bg-field px-3 py-2 text-base wrap-break-word text-foreground outline-none placeholder:text-muted-foreground focus:border-ring focus:bg-card focus:ring-2 focus:ring-ring/25 disabled:opacity-60 md:text-sm\"\n />\n {quickReplies?.length ? (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Mensagens rápidas\"\n disabled={disabled}\n className=\"@max-xl:hidden\"\n >\n <Zap />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" side=\"top\" className=\"flex flex-col gap-2 p-2\">\n <QuickReplyList items={quickReplies} onPick={insertQuickReply} />\n </PopoverContent>\n </Popover>\n ) : null}\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Gravar áudio\"\n disabled={disabled}\n onClick={startRecording}\n className=\"@max-xl:hidden\"\n >\n <Mic />\n </Button>\n </>\n )}\n {recording ? (\n <>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Cancelar gravação\"\n onClick={() => stopRecording(false)}\n >\n <Trash2 />\n </Button>\n <Button iconOnly aria-label=\"Enviar áudio\" onClick={() => stopRecording(true)}>\n <Send />\n </Button>\n </>\n ) : (\n <>\n <Button\n iconOnly\n aria-label=\"Enviar\"\n disabled={disabled || (!text.trim() && !files.length)}\n onClick={send}\n >\n <Send />\n </Button>\n {/* Conversa estreita: as outras opções num só botão. */}\n <Popover open={menu !== null} onOpenChange={(v) => setMenu(v ? 'menu' : null)}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Mais ações da mensagem\"\n disabled={disabled}\n className=\"@xl:hidden\"\n >\n <EllipsisVertical />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" side=\"top\" className=\"flex flex-col gap-1 p-2\">\n {menu === 'menu' && (\n <ul className=\"flex flex-col gap-1\" aria-label=\"Ações da mensagem\">\n {[\n {\n label: 'Anexar arquivo',\n icon: Paperclip,\n run: () => {\n setMenu(null)\n fileInput.current?.click()\n },\n },\n {\n label: 'Imagem ou vídeo',\n icon: ImagePlus,\n run: () => {\n setMenu(null)\n mediaInput.current?.click()\n },\n },\n { label: 'Emoji', icon: Smile, run: () => setMenu('emoji') },\n ...(quickReplies?.length\n ? [{ label: 'Mensagens rápidas', icon: Zap, run: () => setMenu('quick') }]\n : []),\n {\n label: 'Gravar áudio',\n icon: Mic,\n run: () => {\n setMenu(null)\n startRecording()\n },\n },\n ].map((a) => (\n <li key={a.label}>\n <button\n type=\"button\"\n onClick={a.run}\n className=\"flex min-h-touch w-full cursor-pointer items-center gap-3 rounded-item px-3 text-left text-sm outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <a.icon className=\"size-icon-sm text-muted-foreground\" aria-hidden />\n {a.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n {menu && menu !== 'menu' && (\n <button\n type=\"button\"\n onClick={() => setMenu('menu')}\n className=\"flex min-h-touch cursor-pointer items-center gap-2 rounded-item px-2 text-left text-xs font-semibold outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ArrowLeft className=\"size-icon-sm\" aria-hidden />\n Voltar\n </button>\n )}\n {menu === 'emoji' && (\n <EmojiGrid\n onPick={(em) => {\n insertEmoji(em)\n setMenu(null)\n }}\n />\n )}\n {menu === 'quick' && quickReplies && (\n <QuickReplyList\n items={quickReplies}\n onPick={(t) => {\n insertQuickReply(t)\n setMenu(null)\n }}\n />\n )}\n </PopoverContent>\n </Popover>\n </>\n )}\n </div>\n <p className=\"hidden text-xs text-muted-foreground md:block\">\n Enter envia, Shift+Enter quebra a linha. Arraste ou cole arquivos e prints no campo.\n </p>\n <input\n ref={fileInput}\n type=\"file\"\n multiple\n hidden\n accept={accept}\n onChange={(e) => {\n add(e.target.files)\n e.target.value = ''\n }}\n />\n <input\n ref={mediaInput}\n type=\"file\"\n multiple\n hidden\n accept=\"image/*,video/*\"\n onChange={(e) => {\n add(e.target.files)\n e.target.value = ''\n }}\n />\n </div>\n )\n}\n\n/** Grade de emojis do campo de mensagem. */\nfunction EmojiGrid({ onPick }: { onPick: (emoji: string) => void }) {\n return (\n <div role=\"group\" aria-label=\"Emojis\" className=\"grid grid-cols-6 gap-1\">\n {EMOJIS.map((em) => (\n <button\n key={em}\n type=\"button\"\n onClick={() => onPick(em)}\n aria-label={`Inserir ${em}`}\n className=\"flex size-touch cursor-pointer items-center justify-center rounded-item text-xl hover:bg-accent md:size-control-md\"\n >\n {em}\n </button>\n ))}\n </div>\n )\n}\n\n/** Lista de mensagens rápidas, com busca pelo nome ou pelo texto. */\nfunction QuickReplyList({\n items,\n onPick,\n}: {\n items: QuickReply[]\n onPick: (text: string) => void\n}) {\n const [q, setQ] = useState('')\n const term = q.trim().toLowerCase()\n const list = term\n ? items.filter((i) => `${i.title} ${i.text}`.toLowerCase().includes(term))\n : items\n return (\n <>\n <span className=\"px-2 pt-1 text-xs font-semibold\">Mensagens rápidas</span>\n <Input\n icon={<Search />}\n type=\"search\"\n value={q}\n onChange={setQ}\n placeholder=\"Buscar mensagem\"\n aria-label=\"Buscar mensagem rápida\"\n />\n <ul className=\"flex max-h-chart-sm scrollbar-subtle flex-col gap-1 overflow-y-auto\">\n {list.map((i) => (\n <li key={i.id}>\n <PopoverClose asChild>\n <button\n type=\"button\"\n onClick={() => onPick(i.text)}\n className=\"flex min-h-touch w-full cursor-pointer flex-col gap-1 rounded-item px-2 py-2 text-left outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span className=\"text-sm font-semibold\">{i.title}</span>\n <span className=\"line-clamp-2 text-xs text-muted-foreground\">{i.text}</span>\n </button>\n </PopoverClose>\n </li>\n ))}\n {!list.length && (\n <li className=\"px-2 py-4 text-center text-xs text-muted-foreground\">\n Nenhuma mensagem com essa busca.\n </li>\n )}\n </ul>\n </>\n )\n}\n","import { Check, Minus } from 'lucide-react'\nimport { Checkbox as C } from 'radix-ui'\nimport { useId, useState, type ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface CheckboxProps {\n checked?: boolean | 'indeterminate'\n defaultChecked?: boolean\n onCheckedChange?: (checked: boolean) => void\n label?: ReactNode\n description?: ReactNode\n disabled?: boolean\n invalid?: boolean\n id?: string\n name?: string\n className?: string\n 'aria-label'?: string\n}\n\n/**\n * Checkbox único, com estado indeterminado (checked=\"indeterminate\").\n * Com label, a linha inteira é área de toque de 44px no mobile.\n */\nexport function Checkbox({\n checked,\n defaultChecked,\n onCheckedChange,\n label,\n description,\n disabled,\n invalid,\n id,\n name,\n className,\n ...aria\n}: CheckboxProps) {\n const auto = useId()\n const cid = id ?? `cb${auto}`\n const lib = useMotionLib()\n const on = lib !== null\n const presets = useMotionPresets()\n // Só em `on`: o estado marcado é espelhado aqui (controlado ou não) para o indicador poder\n // sair com animação. O Radix mantém o indicador sempre presente com forceMount, então ele só\n // existe no DOM enquanto marcado ou saindo (AnimatePresence).\n const [inner, setInner] = useState<boolean | 'indeterminate'>(defaultChecked ?? false)\n const state = checked ?? inner\n const mark =\n checked === 'indeterminate' ? (\n <Minus className=\"size-3\" strokeWidth={3} aria-hidden />\n ) : (\n <Check className=\"size-3\" strokeWidth={3} aria-hidden />\n )\n const rootProps = {\n id: cid,\n name,\n checked: on ? state : checked,\n defaultChecked: on ? undefined : defaultChecked,\n onCheckedChange: (v: boolean | 'indeterminate') => {\n if (on) setInner(v)\n onCheckedChange?.(v === true)\n },\n disabled,\n 'aria-invalid': invalid || undefined,\n 'aria-label': aria['aria-label'],\n 'data-touch': label ? undefined : 'expanded',\n className: cn(\n 'peer relative flex size-icon-md shrink-0 cursor-pointer items-center justify-center rounded-item border border-input bg-card transition-colors',\n 'hover:border-primary data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n invalid && 'border-destructive',\n // Área de toque ampliada sem mudar o desenho\n !label && 'before:absolute before:-inset-3 md:before:hidden',\n ),\n } as const\n const box = on ? (\n // `on`: a caixa responde ao toque (whileTap 0,97) e o indicador entra de 0,9 a 1 sem quique.\n <C.Root asChild {...rootProps}>\n <lib.m.button\n type=\"button\"\n whileTap={presets.press.whileTap}\n transition={presets.press.transition}\n >\n <lib.AnimatePresence initial={false}>\n {state !== false && (\n <C.Indicator forceMount asChild>\n <lib.m.span className=\"flex items-center justify-center\" {...presets.indicator}>\n {mark}\n </lib.m.span>\n </C.Indicator>\n )}\n </lib.AnimatePresence>\n </lib.m.button>\n </C.Root>\n ) : (\n <C.Root {...rootProps}>\n <C.Indicator className=\"flex items-center justify-center data-[state=checked]:animate-in data-[state=checked]:duration-(--rendra-duration-fast) data-[state=checked]:zoom-in-90\">\n {mark}\n </C.Indicator>\n </C.Root>\n )\n if (!label)\n return (\n <span data-rendra=\"CHK-001\" className={cn('inline-flex', className)}>\n {box}\n </span>\n )\n return (\n <label\n htmlFor={cid}\n data-rendra=\"CHK-001\"\n className={cn(\n 'flex min-h-touch cursor-pointer items-start gap-3 py-3 md:min-h-0 md:py-1',\n disabled && 'cursor-not-allowed opacity-60',\n className,\n )}\n >\n <span className=\"flex pt-px\">{box}</span>\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"text-sm font-medium\">{label}</span>\n {description && <span className=\"text-sm text-muted-foreground\">{description}</span>}\n </span>\n </label>\n )\n}\n\nexport interface CheckboxGroupProps {\n options: { value: string; label: ReactNode; description?: ReactNode; disabled?: boolean }[]\n value?: string[]\n onChange?: (value: string[]) => void\n /** Checkbox \"Selecionar todos\" com estado indeterminado. */\n selectAll?: boolean\n orientation?: 'vertical' | 'horizontal'\n invalid?: boolean\n id?: string\n 'aria-describedby'?: string\n label?: string\n}\n\nexport function CheckboxGroup({\n options,\n value = [],\n onChange,\n selectAll,\n orientation = 'vertical',\n invalid,\n id,\n label,\n ...aria\n}: CheckboxGroupProps) {\n const enabled = options.filter((o) => !o.disabled)\n const all = enabled.length > 0 && enabled.every((o) => value.includes(o.value))\n const some = value.length > 0 && !all\n return (\n <div\n id={id}\n role=\"group\"\n aria-label={label}\n aria-describedby={aria['aria-describedby']}\n data-rendra=\"CHK-002\"\n className=\"flex flex-col\"\n >\n {selectAll && (\n <Checkbox\n label=\"Selecionar todos\"\n checked={all ? true : some ? 'indeterminate' : false}\n onCheckedChange={() => onChange?.(all ? [] : enabled.map((o) => o.value))}\n className=\"border-b\"\n />\n )}\n <div\n className={cn(\n 'flex',\n orientation === 'vertical' ? 'flex-col' : 'flex-col sm:flex-row sm:flex-wrap sm:gap-x-6',\n )}\n >\n {options.map((o) => (\n <Checkbox\n key={o.value}\n label={o.label}\n description={o.description}\n disabled={o.disabled}\n invalid={invalid}\n checked={value.includes(o.value)}\n onCheckedChange={(c) =>\n onChange?.(c ? [...value, o.value] : value.filter((v) => v !== o.value))\n }\n />\n ))}\n </div>\n </div>\n )\n}\n","import { Plus, Trash2 } from 'lucide-react'\nimport { useEffect, useId, useRef } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { Input } from '@/components/ui/input'\nimport { cn } from '@/lib/cn'\n\n/*\n * Lista de verificação editável: cada item é uma caixa de seleção mais um campo de texto (o\n * próprio nome do item), então criar, renomear, marcar e remover são todos operáveis só de\n * teclado, sem gesto especial.\n */\n\nexport interface ChecklistItem {\n id: string\n label: string\n checked: boolean\n}\n\nexport interface ChecklistProps {\n value: ChecklistItem[]\n onChange: (value: ChecklistItem[]) => void\n addLabel?: string\n disabled?: boolean\n id?: string\n className?: string\n 'aria-label'?: string\n}\n\n/** Uma lista de verificação por finalidade: itens de um checklist usam este componente. */\nexport function Checklist({\n value,\n onChange,\n addLabel = 'Adicionar item',\n disabled = false,\n id,\n className,\n ...aria\n}: ChecklistProps) {\n // Id de verdade, não crypto.randomUUID(): esse método só existe em contexto seguro\n // (HTTPS ou localhost) e quebra em produção atrás de HTTP puro.\n const baseId = useId()\n const nextIndex = useRef(0)\n const pendingFocusId = useRef<string | null>(null)\n\n useEffect(() => {\n if (!pendingFocusId.current) return\n const el = document.getElementById(`${pendingFocusId.current}-label`)\n el?.focus()\n pendingFocusId.current = null\n })\n\n const updateLabel = (itemId: string, label: string) =>\n onChange(value.map((item) => (item.id === itemId ? { ...item, label } : item)))\n\n const toggle = (itemId: string) =>\n onChange(value.map((item) => (item.id === itemId ? { ...item, checked: !item.checked } : item)))\n\n const remove = (itemId: string) => onChange(value.filter((item) => item.id !== itemId))\n\n const add = () => {\n nextIndex.current += 1\n const newId = `${baseId}item${nextIndex.current}`\n pendingFocusId.current = newId\n onChange([...value, { id: newId, label: '', checked: false }])\n }\n\n return (\n <div\n id={id}\n data-rendra=\"CKLT-001\"\n role=\"group\"\n aria-label={aria['aria-label']}\n className={cn('flex flex-col gap-2', className)}\n >\n {value.map((item, index) => (\n <div key={item.id} className=\"flex min-h-touch items-center gap-2 md:min-h-0\">\n <Checkbox\n checked={item.checked}\n onCheckedChange={() => toggle(item.id)}\n disabled={disabled}\n aria-label={item.label ? `Marcar ${item.label}` : `Marcar item ${index + 1}`}\n />\n <Input\n id={`${item.id}-label`}\n value={item.label}\n onChange={(v) => updateLabel(item.id, v)}\n placeholder=\"Descreva o item\"\n disabled={disabled}\n aria-label={`Nome do item ${index + 1}`}\n className=\"flex-1\"\n inputClassName={cn(item.checked && 'text-muted-foreground line-through')}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n icon={<Trash2 />}\n aria-label={`Remover item ${index + 1}`}\n disabled={disabled}\n onClick={() => remove(item.id)}\n />\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n icon={<Plus />}\n disabled={disabled}\n onClick={add}\n >\n {addLabel}\n </Button>\n </div>\n )\n}\n","/*\n * PALETA A PARTIR DE SEMENTES\n * ---------------------------\n * Uma paleta é só a cor da marca: 4 cores (primária e hover, secundária e hover) e o degradê\n * da marca (3 paradas, da luz ao fundo). Todo o resto é gerado aqui, com contraste WCAG AA\n * conferido e ajustado na geração: texto sobre cada cor, fundo suave, primária como texto,\n * foco, sidebar, degradês, gráficos, sombra e as superfícies do modo escuro.\n *\n * O que NÃO é da paleta (fica fixo em src/styles/theme.css, igual para todas):\n * - neutros do modo claro (fundo #f5f6f7, card branco, borda, texto);\n * - cores de sistema: sucesso, alerta, erro e informação;\n * - fonte e raio, que são do modelo (Safira, Equilíbrio ou Aurora).\n *\n * Usos:\n * - build: scripts/build-palettes.mjs gera src/styles/palettes.css com as paletas prontas\n * (src/brand/palettes.ts);\n * - tempo de execução (white label): applyPalette(sementes) injeta a paleta de um cliente\n * sem build, com o mesmo resultado.\n *\n * Este arquivo não importa nada: o script de build o lê direto com o Node.\n */\n\nexport interface PaletteSeeds {\n /** Identificador usado em data-palette no <html> (ex.: \"safira\", \"cliente-42\"). */\n id: string\n /** Nome curto exibido nos seletores. */\n name: string\n primary: string\n primaryHover: string\n secondary: string\n secondaryHover: string\n /** Degradê da marca (sidebar, painel do login, destaque): luz, meio e fundo. */\n gradient: [string, string, string]\n /**\n * Texto sobre a primária e a secundária. 'auto' (padrão) escolhe o que passa AA (branco\n * ou escuro); 'light' força texto branco e escurece a cor até passar; 'dark', o contrário.\n */\n onPrimary?: TextOn\n onSecondary?: TextOn\n}\n\nexport type TextOn = 'auto' | 'light' | 'dark'\nexport type PaletteVars = Record<string, string>\n\nexport interface Palette {\n seeds: PaletteSeeds\n light: PaletteVars\n dark: PaletteVars\n /** Logotipo adequado sobre a sidebar desta paleta. */\n sidebarLogo: 'light' | 'dark'\n /** Ajustes feitos para passar AA (ex.: \"secundária escurecida de #EA600D para #C94F0A\"). */\n adjustments: string[]\n}\n\n/* ------------------------------------------------------------------ cor */\n\ntype Rgb = [number, number, number]\n\n/**\n * Branco e tinta escura de referência. Exportados para o ColorPicker (A1) escolher, por\n * contraste, a cor do check sobre uma amostra livre do usuário (que não é do tema, então\n * não tem um par claro/escuro pronto): nenhum componente de fora de src/brand pode ter um\n * hexadecimal literal, então a comparação usa estas constantes em vez de repetir a cor.\n * O mesmo par vive em CSS como --rendra-swatch-check-light e --rendra-swatch-check-dark\n * (src/styles/globals.css); mude os dois lados juntos.\n */\nexport const WHITE = '#ffffff'\nconst BLACK = '#000000'\n/** Texto escuro padrão (o mesmo --foreground do theme.css). */\nexport const INK = '#0b1d37'\n/** Neutros fixos do modo claro, contra os quais a paleta é conferida. */\nconst LIGHT = { background: '#f5f6f7', card: '#ffffff' }\n/** Texto claro padrão do modo escuro. */\nconst INK_DARK = '#e8eff8'\n\nfunction toRgb(hex: string): Rgb {\n let h = hex.trim().replace('#', '')\n if (h.length === 3)\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n if (!/^[0-9a-f]{6}$/i.test(h)) throw new Error(`Cor inválida: ${hex} (use #RRGGBB)`)\n return [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16)) as Rgb\n}\n\nfunction toHex([r, g, b]: Rgb) {\n return `#${[r, g, b]\n .map((c) =>\n Math.round(Math.min(255, Math.max(0, c)))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`\n}\n\n/** Mistura em sRGB, como color-mix(in srgb): t = quanto de b entra (0 a 1). */\nexport function mix(a: string, b: string, t: number) {\n const x = toRgb(a)\n const y = toRgb(b)\n return toHex([0, 1, 2].map((i) => x[i]! + (y[i]! - x[i]!) * t) as Rgb)\n}\n\n/**\n * Amostras padrão do ColorPicker (A1): um ponto de partida variado, sem relação com a\n * paleta da marca. Hexadecimal fixo só pode existir aqui dentro (src/brand); o componente\n * (fora daqui) sempre recebe a lista por import, nunca com a cor escrita nele.\n */\nexport const COLOR_PICKER_SWATCHES: string[] = [\n '#0ea5e9',\n '#6366f1',\n '#8b5cf6',\n '#ec4899',\n '#ef4444',\n '#f97316',\n '#f59e0b',\n '#84cc16',\n '#10b981',\n '#14b8a6',\n '#64748b',\n '#0f172a',\n]\n\nfunction luminance(hex: string) {\n const lin = (c: number) => {\n const s = c / 255\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4\n }\n const [r, g, b] = toRgb(hex)\n return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b)\n}\n\n/** Contraste WCAG entre duas cores #RRGGBB. */\nexport function contrast(a: string, b: string) {\n const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x) as [number, number]\n return (hi + 0.05) / (lo + 0.05)\n}\n\nconst isDark = (hex: string) => contrast(hex, WHITE) >= contrast(hex, INK)\n\n/**\n * Leva `fg` em direção ao preto (toward 'dark') ou ao branco ('light') até ter `min` de\n * contraste com `bg`. Devolve a própria cor se já passar.\n */\nfunction reach(fg: string, bg: string, min: number, toward: 'dark' | 'light') {\n const end = toward === 'dark' ? BLACK : WHITE\n for (let t = 0; t <= 1.0001; t += 0.02) {\n const c = mix(fg, end, t)\n if (contrast(c, bg) >= min) return c\n }\n return end\n}\n\nconst rgbTriplet = (hex: string) => toRgb(hex).join(' ')\nconst alpha = (hex: string, a: number) => `rgb(${rgbTriplet(hex)} / ${a})`\n\n/* ------------------------------------------------------------------ geração */\n\n/** Cor de preenchimento com o texto por cima, ajustando a cor quando o texto é forçado. */\nfunction fill(color: string, on: TextOn, label: string, notes: string[]) {\n const base = color.toLowerCase()\n if (on === 'auto') {\n const text = isDark(base) ? WHITE : INK\n if (contrast(text, base) >= 4.5) return { fill: base, text }\n // Nenhum dos dois passa: escurece a cor para o branco passar.\n on = 'light'\n }\n const text = on === 'light' ? WHITE : INK\n const adjusted = reach(base, text, 4.5, on === 'light' ? 'dark' : 'light')\n if (adjusted !== base)\n notes.push(\n `${label}: ${base.toUpperCase()} ajustada para ${adjusted.toUpperCase()} (AA com texto ${on === 'light' ? 'branco' : 'escuro'})`,\n )\n return { fill: adjusted, text }\n}\n\n/** Gera as duas versões (claro e escuro) da paleta a partir das sementes. */\nexport function createPalette(seeds: PaletteSeeds): Palette {\n const notes: string[] = []\n const [g0, g1, g2] = seeds.gradient.map((c) => c.toLowerCase()) as [string, string, string]\n const P = seeds.primary.toLowerCase()\n const S = seeds.secondary.toLowerCase()\n\n const primary = fill(P, seeds.onPrimary ?? 'auto', 'Primária', notes)\n const primaryHover = fill(\n seeds.primaryHover,\n seeds.onPrimary ?? 'auto',\n 'Hover da primária',\n notes,\n )\n const secondary = fill(S, seeds.onSecondary ?? 'auto', 'Secundária', notes)\n const secondaryHover = fill(\n seeds.secondaryHover,\n seeds.onSecondary ?? 'auto',\n 'Hover da secundária',\n notes,\n )\n\n // Sidebar e degradê da marca: sempre coloridos, texto claro ou escuro conforme o fundo.\n const sidebarDark = isDark(g1)\n const sidebarText = sidebarDark ? mix(WHITE, g0, 0.06) : INK\n const sidebarFg = reach(sidebarText, g0, 7, sidebarDark ? 'light' : 'dark')\n const sidebarMuted = reach(mix(sidebarFg, g1, 0.3), g0, 4.5, sidebarDark ? 'light' : 'dark')\n // Item ativo: a primária, se ela aparece sobre a sidebar; senão, a secundária.\n // Indicador: a secundária, se ela aparece; senão, a primária.\n const active = contrast(P, g1) >= 2 ? P : S\n const indicator = reach(contrast(S, g1) >= 3 ? S : P, g1, 3, sidebarDark ? 'light' : 'dark')\n const brandGradient = `radial-gradient(120% 120% at 80% 0%, ${g0} 0%, ${g1} 45%, ${g2} 100%)`\n const onBrand = sidebarDark ? WHITE : INK\n\n const sidebar = {\n '--rendra-sidebar': g1,\n '--rendra-sidebar-image': brandGradient,\n '--rendra-sidebar-foreground': sidebarFg,\n '--rendra-sidebar-muted-foreground': sidebarMuted,\n '--rendra-sidebar-border': alpha(sidebarDark ? WHITE : INK, 0.14),\n '--rendra-sidebar-accent': alpha(sidebarDark ? WHITE : INK, 0.08),\n '--rendra-sidebar-active': alpha(active, 0.24),\n '--rendra-sidebar-active-foreground': onBrand,\n '--rendra-sidebar-indicator': indicator,\n '--rendra-gradient-brand': brandGradient,\n '--rendra-gradient-brand-foreground': onBrand,\n '--rendra-gradient-accent': `linear-gradient(90deg, ${P} 0%, ${S} 100%)`,\n }\n const brand = {\n '--rendra-primary': primary.fill,\n '--rendra-primary-foreground': primary.text,\n '--rendra-primary-hover': primaryHover.fill,\n '--rendra-primary-hover-foreground': primaryHover.text,\n '--rendra-secondary': secondary.fill,\n '--rendra-secondary-foreground': secondary.text,\n '--rendra-secondary-hover': secondaryHover.fill,\n '--rendra-secondary-hover-foreground': secondaryHover.text,\n }\n\n /* ---------- claro: sobre os neutros fixos (fundo #f5f6f7, card branco) */\n const softL = mix(P, WHITE, 0.9)\n const textL = reach(P, LIGHT.background, 4.5, 'dark')\n const light: PaletteVars = {\n ...brand,\n '--rendra-primary-soft': softL,\n '--rendra-primary-soft-foreground': reach(P, softL, 4.5, 'dark'),\n '--rendra-primary-text': textL,\n '--rendra-ring': textL,\n '--rendra-accent': mix(P, WHITE, 0.94),\n '--rendra-accent-foreground': INK,\n ...sidebar,\n '--rendra-gradient-soft': `linear-gradient(135deg, ${softL} 0%, ${LIGHT.card} 65%)`,\n '--rendra-chart-1': P,\n '--rendra-chart-2': S,\n '--rendra-chart-3': mix(P, WHITE, 0.45),\n '--rendra-chart-4': mix(P, BLACK, 0.35),\n '--rendra-chart-5': mix(S, BLACK, 0.3),\n '--rendra-shadow-color': rgbTriplet(g2),\n }\n\n /* ---------- escuro: superfícies tiradas do fundo do degradê, texto claro */\n // O brilho de cada superfície fica numa faixa fixa (contraste com o branco), para qualquer\n // degradê dar um escuro na medida: a cor vem do degradê, a luminosidade é sempre a mesma.\n const bgD = reach(g2, WHITE, 17.5, 'dark')\n const cardD = reach(mix(g2, g0, 0.14), WHITE, 15.5, 'dark')\n const popD = reach(mix(g2, g0, 0.2), WHITE, 14.5, 'dark')\n const mutedD = reach(mix(g2, g0, 0.26), WHITE, 13.5, 'dark')\n // Botões no escuro: a cor que some no fundo (menos de 3:1 com o card) fica mais clara,\n // e o texto por cima volta a ser escolhido para passar AA.\n const onDark = (color: string, label: string) => {\n if (contrast(color, cardD) >= 3) return fill(color, 'auto', label, [])\n return fill(reach(color, cardD, 3, 'light'), 'auto', label, [])\n }\n const pD = onDark(primary.fill, 'Primária')\n const phD = onDark(primaryHover.fill, 'Hover da primária')\n const sD = onDark(secondary.fill, 'Secundária')\n const shD = onDark(secondaryHover.fill, 'Hover da secundária')\n const brandDark = {\n '--rendra-primary': pD.fill,\n '--rendra-primary-foreground': pD.text,\n '--rendra-primary-hover': phD.fill,\n '--rendra-primary-hover-foreground': phD.text,\n '--rendra-secondary': sD.fill,\n '--rendra-secondary-foreground': sD.text,\n '--rendra-secondary-hover': shD.fill,\n '--rendra-secondary-hover-foreground': shD.text,\n }\n const softD = mix(cardD, P, 0.28)\n const textD = reach(mix(P, WHITE, 0.2), cardD, 4.5, 'light')\n const fgD = reach(INK_DARK, popD, 12, 'light')\n const dark: PaletteVars = {\n '--rendra-background': bgD,\n '--rendra-background-image': `radial-gradient(120% 80% at 80% 0%, ${reach(mix(g0, bgD, 0.45), WHITE, 12, 'dark')} 0%, ${reach(mix(g1, bgD, 0.4), WHITE, 16, 'dark')} 40%, ${bgD} 100%)`,\n '--rendra-foreground': fgD,\n '--rendra-card': cardD,\n '--rendra-card-foreground': fgD,\n '--rendra-popover': popD,\n '--rendra-popover-foreground': fgD,\n '--rendra-muted': mutedD,\n '--rendra-muted-foreground': reach(mix(fgD, mutedD, 0.35), mutedD, 4.5, 'light'),\n '--rendra-border': mix(cardD, WHITE, 0.12),\n '--rendra-input': reach(mix(cardD, WHITE, 0.32), cardD, 3, 'light'),\n '--rendra-field': mix(g2, BLACK, 0.1),\n '--rendra-overlay': alpha(mix(g2, BLACK, 0.6), 0.7),\n ...brandDark,\n '--rendra-primary-soft': softD,\n '--rendra-primary-soft-foreground': reach(mix(P, WHITE, 0.45), softD, 4.5, 'light'),\n '--rendra-primary-text': textD,\n '--rendra-ring': textD,\n '--rendra-accent': mix(cardD, WHITE, 0.06),\n '--rendra-accent-foreground': fgD,\n ...sidebar,\n '--rendra-sidebar': mix(g2, BLACK, 0.1),\n '--rendra-gradient-soft': `linear-gradient(135deg, ${softD} 0%, ${cardD} 65%)`,\n '--rendra-chart-1': reach(P, cardD, 3, 'light'),\n '--rendra-chart-2': reach(S, cardD, 3, 'light'),\n '--rendra-chart-3': mix(P, WHITE, 0.45),\n '--rendra-chart-4': mix(P, WHITE, 0.72),\n '--rendra-chart-5': reach(mix(S, WHITE, 0.3), cardD, 3, 'light'),\n '--rendra-shadow-color': '0 0 0',\n }\n\n return { seeds, light, dark, sidebarLogo: sidebarDark ? 'dark' : 'light', adjustments: notes }\n}\n\n/* ------------------------------------------------------------------ CSS */\n\nconst block = (selector: string, vars: PaletteVars) =>\n `${selector} {\\n${Object.entries(vars)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n')}\\n}\\n`\n\n/**\n * CSS da paleta. `isDefault` também aplica a paleta quando o <html> ainda não tem\n * data-palette (primeira pintura).\n */\nexport function paletteCss(palette: Palette, isDefault = false) {\n const id = palette.seeds.id\n const light = isDefault\n ? `:root:not([data-palette]),\\n:root[data-palette='${id}']`\n : `:root[data-palette='${id}']`\n const dark = isDefault\n ? `:root:not([data-palette]).dark,\\n:root[data-palette='${id}'].dark`\n : `:root[data-palette='${id}'].dark`\n const notes = palette.adjustments.length\n ? `/* Ajustes de contraste: ${palette.adjustments.join('; ')}. */\\n`\n : ''\n return `/* ${palette.seeds.name} */\\n${notes}${block(light, palette.light)}\\n${block(dark, palette.dark)}`\n}\n\n/**\n * White label em tempo de execução: gera a paleta de um cliente e a injeta na página\n * (um <style> por paleta), sem build. Depois é só usar data-palette com o id dela.\n * Devolve a paleta gerada, com os ajustes de contraste feitos.\n */\nexport function applyPalette(seeds: PaletteSeeds, doc: Document = document) {\n const palette = createPalette(seeds)\n const attr = 'data-palette-runtime'\n let style = doc.head.querySelector<HTMLStyleElement>(`style[${attr}=\"${seeds.id}\"]`)\n if (!style) {\n style = doc.createElement('style')\n style.setAttribute(attr, seeds.id)\n doc.head.appendChild(style)\n }\n style.textContent = paletteCss(palette)\n return palette\n}\n","import { Check } from 'lucide-react'\nimport { forwardRef, useEffect, useState, type CSSProperties } from 'react'\nimport { COLOR_PICKER_SWATCHES, contrast, INK, WHITE } from '@/brand/palette'\nimport { Input } from '@/components/ui/input'\nimport { PickerPanel } from '@/components/ui/picker-panel'\nimport { cn } from '@/lib/cn'\nimport { controlFrame } from '@/lib/control'\n\n/*\n * Seletor de cor único do sistema (A1 do plano da v2). Amostras fixas com padrão de marca\n * e uma cor livre por campo hexadecimal, no mesmo painel do Select e do DatePicker\n * (PickerPanel): popover no desktop, bottom sheet no mobile.\n */\n\nconst HEX_PATTERN = /^#?[0-9a-f]{6}$/i\n\n/**\n * #rrggbb minúsculo, ou null quando o texto não é um hexadecimal válido de 6 dígitos.\n * Aceita com ou sem o \"#\" na frente (o campo livre também aceita \"0ea5e9\").\n */\nfunction normalizeHex(value: string): string | null {\n const v = value.trim()\n if (!HEX_PATTERN.test(v)) return null\n const digits = v.startsWith('#') ? v.slice(1) : v\n return `#${digits.toLowerCase()}`\n}\n\nexport interface ColorPickerProps {\n /** Cor atual, #rrggbb. */\n value?: string\n /** Só chama com hexadecimal válido, sempre em minúsculas. */\n onChange?: (hex: string) => void\n /** Amostras fixas oferecidas antes da cor livre. */\n swatches?: string[]\n disabled?: boolean\n /** Nome acessível do grupo de amostras e do campo. */\n 'aria-label'?: string\n className?: string\n}\n\n/**\n * Amostra de cor: quadrado com a cor via variável CSS (a única forma de estilo inline\n * permitida) e, quando selecionada, um anel e um check cuja cor (clara ou escura) segue o\n * contraste da própria amostra, nunca um tom fixo do tema.\n */\nfunction Swatch({\n hex,\n selected,\n disabled,\n onSelect,\n}: {\n hex: string\n selected: boolean\n disabled?: boolean\n onSelect: () => void\n}) {\n const useLightCheck = contrast(hex, WHITE) >= contrast(hex, INK)\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onSelect}\n aria-pressed={selected}\n aria-label={hex}\n style={{ '--rendra-swatch': hex } as CSSProperties}\n className={cn(\n 'relative size-touch shrink-0 rounded-item border bg-swatch transition-shadow outline-none',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-popover',\n selected && 'ring-2 ring-primary ring-offset-2 ring-offset-popover',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {selected && (\n <Check\n aria-hidden\n className={cn(\n 'absolute inset-0 m-auto size-icon-sm',\n useLightCheck ? 'swatch-check-light' : 'swatch-check-dark',\n )}\n />\n )}\n </button>\n )\n}\n\nexport const ColorPicker = forwardRef<HTMLButtonElement, ColorPickerProps>(function ColorPicker(\n {\n value,\n onChange,\n swatches = COLOR_PICKER_SWATCHES,\n disabled,\n 'aria-label': ariaLabel = 'Cor',\n className,\n },\n ref,\n) {\n const [open, setOpen] = useState(false)\n const [draft, setDraft] = useState(value ?? '')\n\n useEffect(() => setDraft(value ?? ''), [value])\n\n const current = value ? normalizeHex(value) : null\n\n const pick = (hex: string) => {\n const n = normalizeHex(hex)\n if (!n) return\n onChange?.(n)\n setOpen(false)\n }\n\n const trigger = (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel}\n data-rendra=\"COR-001\"\n className={cn(\n controlFrame({ size: 'md' }),\n 'cursor-pointer justify-start disabled:cursor-not-allowed disabled:opacity-60',\n className,\n )}\n >\n <span\n aria-hidden\n className=\"size-icon-md shrink-0 rounded-item border bg-swatch\"\n style={current ? ({ '--rendra-swatch': current } as CSSProperties) : undefined}\n />\n <span className=\"truncate font-mono text-sm\">{current ?? 'Selecione uma cor'}</span>\n </button>\n )\n\n return (\n <PickerPanel\n open={open}\n onOpenChange={(o) => setOpen(o && !disabled)}\n trigger={trigger}\n title={ariaLabel}\n >\n <div className=\"flex flex-col gap-4 p-2\">\n <div role=\"group\" aria-label={ariaLabel} className=\"flex flex-wrap gap-2\">\n {swatches.map((hex) => {\n const n = normalizeHex(hex) ?? hex.toLowerCase()\n return (\n <Swatch\n key={n}\n hex={n}\n selected={current === n}\n disabled={disabled}\n onSelect={() => pick(n)}\n />\n )\n })}\n </div>\n <Input\n aria-label={`${ariaLabel}: cor livre (hexadecimal)`}\n placeholder=\"Hexadecimal (ex.: 0ea5e9)\"\n value={draft}\n disabled={disabled}\n onChange={(v) => {\n setDraft(v)\n const n = normalizeHex(v)\n if (n) onChange?.(n)\n }}\n />\n </div>\n </PickerPanel>\n )\n})\n","import { Switch as S } from 'radix-ui'\nimport { useId, type ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface SwitchProps {\n checked?: boolean\n defaultChecked?: boolean\n onCheckedChange?: (checked: boolean) => void\n label?: ReactNode\n description?: ReactNode\n disabled?: boolean\n id?: string\n name?: string\n className?: string\n 'aria-label'?: string\n}\n\n/** Switch único, com rótulo e descrição à esquerda e a chave à direita. */\nexport function Switch({\n checked,\n defaultChecked,\n onCheckedChange,\n label,\n description,\n disabled,\n id,\n name,\n className,\n ...aria\n}: SwitchProps) {\n const auto = useId()\n const sid = id ?? `sw${auto}`\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const rootCls =\n 'relative inline-flex h-6 w-12 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent bg-input transition-colors disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary max-md:before:absolute max-md:before:-inset-3'\n const thumbBase =\n 'pointer-events-none block size-icon-md rounded-full bg-card shadow-sm duration-(--rendra-duration-base) ease-move data-[state=checked]:translate-x-6'\n // `off`: o CSS anima tudo (deslocamento e escala do toque). `on`: o CSS só transiciona\n // `translate`; o `transform` é do Motion, e uma transição de CSS nele (W1) faria cada quadro\n // gravado virar uma transição de 200 ms e o toque chegaria mole.\n const thumbCls = cn(thumbBase, lib ? 'transition-[translate]' : 'transition-transform')\n // `on`: o toque fica no Root (o polegar tem pointer-events-none, então um whileTap nele nunca\n // dispararia) e chega ao polegar por variants. O deslocamento é a propriedade CSS `translate`\n // (Tailwind v4) e o Motion grava `transform`: as duas se compõem, não se anulam.\n const tap = presets.tap\n const control = lib ? (\n <S.Root\n asChild\n id={sid}\n name={name}\n checked={checked}\n defaultChecked={defaultChecked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n aria-label={aria['aria-label']}\n data-touch=\"expanded\"\n data-rendra=\"SWT-001\"\n >\n <lib.m.button\n type=\"button\"\n className={rootCls}\n initial=\"rest\"\n animate=\"rest\"\n whileTap={tap ? 'tap' : undefined}\n >\n <S.Thumb asChild>\n <lib.m.span\n className={thumbCls}\n variants={{ rest: { scale: 1 }, tap: { scale: tap ? 1.15 : 1 } }}\n transition={presets.press.transition}\n />\n </S.Thumb>\n </lib.m.button>\n </S.Root>\n ) : (\n <S.Root\n id={sid}\n name={name}\n checked={checked}\n defaultChecked={defaultChecked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n aria-label={aria['aria-label']}\n data-touch=\"expanded\"\n data-rendra=\"SWT-001\"\n className={rootCls}\n >\n <S.Thumb className={thumbCls} />\n </S.Root>\n )\n if (!label) return control\n return (\n <label\n htmlFor={sid}\n className={cn(\n 'flex min-h-touch cursor-pointer items-center justify-between gap-4 py-3 md:min-h-0 md:py-2',\n disabled && 'cursor-not-allowed opacity-60',\n className,\n )}\n >\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"text-sm font-medium\">{label}</span>\n {description && <span className=\"text-sm text-muted-foreground\">{description}</span>}\n </span>\n {control}\n </label>\n )\n}\n","import { Columns3, Filter, Search, X } from 'lucide-react'\nimport { useState, type ReactNode } from 'react'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Button } from '@/components/ui/button'\nimport { Drawer } from '@/components/ui/drawer'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Input } from '@/components/ui/input'\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'\nimport { Switch } from '@/components/ui/switch'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\n\n/*\n * Barra de ferramentas de listagem. Fica dentro do mesmo card do conteúdo, acima dele.\n * Ordem: busca à esquerda; à direita, ações secundárias, Colunas, Filtros e, por último,\n * a ação principal (Novo). Abaixo, chips dos filtros. A ação principal da listagem mora\n * aqui, nunca solta acima do card.\n * Mobile: busca na largura total; embaixo, Filtros (30%) e a ação principal (70%).\n * Filtros, ordenação e colunas viram um único botão com contador, que abre um drawer.\n */\n\nexport interface FilterChip {\n id: string\n label: string\n onRemove: () => void\n}\n\nexport interface ToolbarColumn {\n id: string\n label: string\n visible: boolean\n onToggle: (visible: boolean) => void\n}\n\nexport interface DataToolbarProps {\n search?: { value: string; onChange: (v: string) => void; placeholder?: string }\n /** Conteúdo dos filtros: popover no desktop, drawer em tela cheia no mobile. */\n filters?: ReactNode\n /** Quantos filtros estão aplicados (contador no botão). */\n filterCount?: number\n onClearFilters?: () => void\n /** Chips dos filtros aplicados. */\n chips?: FilterChip[]\n /** Ordenação (vai para o drawer no mobile). */\n sort?: ReactNode\n /** Colunas que o usuário pode mostrar ou ocultar. */\n columns?: ToolbarColumn[]\n /** Ações secundárias à direita (exportar etc.). No mobile, numa linha abaixo. */\n actions?: ReactNode\n /**\n * Resumo logo depois da busca (ex.: totais de um quadro). No desktop fica entre a busca e as\n * ações; no mobile, numa linha própria abaixo da busca. Sem ele, nada é desenhado.\n */\n summary?: ReactNode\n /** Ação principal da listagem (ex.: Novo cliente). Sempre a última à direita. */\n primaryAction?: ReactNode\n /** Substitui a barra quando há itens selecionados (ações em massa, só desktop). */\n selectionBar?: ReactNode\n}\n\nexport function DataToolbar({\n search,\n filters,\n filterCount = 0,\n onClearFilters,\n chips = [],\n sort,\n columns,\n actions,\n summary,\n primaryAction,\n selectionBar,\n}: DataToolbarProps) {\n const { isMobile } = useBreakpoint()\n const [drawer, setDrawer] = useState(false)\n const hasPanel = Boolean(filters || sort || columns?.length)\n\n const columnsMenu = columns?.length ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" icon={<Columns3 />}>\n Colunas\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Colunas visíveis</DropdownMenuLabel>\n {columns.map((c) => (\n <DropdownMenuCheckboxItem\n key={c.id}\n checked={c.visible}\n onCheckedChange={(v) => c.onToggle(v === true)}\n onSelect={(e) => e.preventDefault()}\n >\n {c.label}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null\n\n const filterButton = (onClick?: () => void) => (\n <Button variant=\"outline\" icon={<Filter />} onClick={onClick}>\n Filtros\n {filterCount > 0 && (\n <span className=\"rounded-full bg-primary px-2 text-xs text-primary-foreground tabular-nums\">\n {filterCount}\n </span>\n )}\n </Button>\n )\n\n return (\n <div data-rendra=\"DTB-001\" className=\"flex flex-col gap-3 border-b p-4\">\n {selectionBar && !isMobile ? (\n <div className=\"flex min-h-control-md flex-wrap items-center gap-3\">{selectionBar}</div>\n ) : (\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center\">\n {search && (\n <Input\n icon={<Search />}\n clearable\n value={search.value}\n onChange={search.onChange}\n placeholder={search.placeholder ?? 'Buscar'}\n aria-label={search.placeholder ?? 'Buscar'}\n type=\"search\"\n className=\"md:w-3xs lg:w-sm\"\n />\n )}\n\n {summary && (\n <div data-toolbar-summary className=\"flex flex-col gap-1 text-sm\">\n {summary}\n </div>\n )}\n\n {isMobile ? (\n <>\n {(hasPanel || primaryAction) && (\n <div\n className={cn(\n 'grid gap-3',\n hasPanel && primaryAction ? 'grid-actions-2' : 'grid-cols-1',\n )}\n >\n {hasPanel && filterButton(() => setDrawer(true))}\n {primaryAction}\n </div>\n )}\n {actions && <div className=\"flex flex-wrap gap-3 *:flex-1\">{actions}</div>}\n </>\n ) : (\n <div className=\"flex flex-wrap items-center gap-2 md:ml-auto\">\n {actions}\n {columnsMenu}\n {sort}\n {filters && (\n <Popover>\n <PopoverTrigger asChild>{filterButton()}</PopoverTrigger>\n <PopoverContent align=\"end\" className=\"flex flex-col\">\n <div className=\"max-h-command overflow-y-auto p-4\">{filters}</div>\n {onClearFilters && filterCount > 0 && (\n <div className=\"border-t p-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onClearFilters}>\n Limpar filtros\n </Button>\n </div>\n )}\n </PopoverContent>\n </Popover>\n )}\n {primaryAction}\n </div>\n )}\n </div>\n )}\n\n {chips.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {chips.map((c) => (\n <span\n key={c.id}\n className=\"inline-flex items-center gap-1 rounded-item border bg-muted py-1 pr-1 pl-2 text-xs font-medium\"\n >\n {c.label}\n <button\n type=\"button\"\n onClick={c.onRemove}\n aria-label={`Remover filtro ${c.label}`}\n className=\"flex size-6 cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-card hover:text-foreground max-md:-my-3 max-md:size-touch\"\n >\n <X className=\"size-3\" aria-hidden />\n </button>\n </span>\n ))}\n {onClearFilters && (\n <Button variant=\"link\" size=\"sm\" onClick={onClearFilters}>\n Limpar filtros\n </Button>\n )}\n </div>\n )}\n\n {isMobile && hasPanel && (\n <Drawer\n open={drawer}\n onOpenChange={setDrawer}\n title=\"Filtros\"\n icon={<Filter />}\n size=\"full\"\n footer={\n <ActionBar\n cancel={onClearFilters ? { label: 'Limpar', onClick: onClearFilters } : undefined}\n primary={{ label: 'Ver resultados', onClick: () => setDrawer(false) }}\n />\n }\n >\n <div className=\"flex flex-col gap-8\">\n {filters && <div className=\"flex flex-col gap-4\">{filters}</div>}\n {sort && (\n <div className=\"flex flex-col gap-3\">\n <p className=\"text-sm font-semibold\">Ordenar por</p>\n {sort}\n </div>\n )}\n {columns?.length ? (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-sm font-semibold\">Campos no card</p>\n {columns.map((c) => (\n <Switch\n key={c.id}\n label={c.label}\n checked={c.visible}\n onCheckedChange={c.onToggle}\n />\n ))}\n </div>\n ) : null}\n </div>\n </Drawer>\n )}\n </div>\n )\n}\n","import { format } from 'date-fns'\nimport { CalendarDays, X } from 'lucide-react'\nimport { forwardRef, useState } from 'react'\nimport { DayPicker, type DateRange } from 'react-day-picker'\nimport { ptBR } from 'react-day-picker/locale'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/field'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\nimport {\n controlAdornmentButton,\n controlAdornmentSpace,\n controlFrame,\n type ControlSize,\n} from '@/lib/control'\nimport { PickerPanel } from './picker-panel'\n\nexport type { DateRange }\n\ninterface BaseProps {\n placeholder?: string\n /** Título do painel no mobile. */\n label?: string\n size?: ControlSize\n invalid?: boolean\n disabled?: boolean\n /** Com horário (campo HH:MM no painel). */\n time?: boolean\n minDate?: Date\n maxDate?: Date\n /**\n * Seletores de mês e ano no topo do calendário (padrão: ligado), para chegar rápido\n * a datas distantes, como data de nascimento, sem voltar mês a mês.\n */\n dropdowns?: boolean\n clearable?: boolean\n id?: string\n className?: string\n 'aria-describedby'?: string\n}\ninterface SingleProps extends BaseProps {\n range?: false\n value?: Date | null\n onChange?: (value: Date | null) => void\n}\ninterface RangeProps extends BaseProps {\n /** Seleção de período (início e fim). */\n range: true\n value?: DateRange | null\n onChange?: (value: DateRange | null) => void\n}\nexport type DatePickerProps = SingleProps | RangeProps\n\nconst fmtDate = (d: Date) => format(d, 'dd/MM/yyyy')\nconst fmtTime = (d: Date) => format(d, 'HH:mm')\n\nfunction withTime(d: Date | undefined, hhmm: string) {\n if (!d) return d\n const [h, m] = hhmm.split(':').map(Number)\n const n = new Date(d)\n n.setHours(Number.isFinite(h) ? (h ?? 0) : 0, Number.isFinite(m) ? (m ?? 0) : 0, 0, 0)\n return n\n}\n\n/**\n * DatePicker único em pt-BR: data, período (range) e horário (time) são props.\n * Desktop: calendário em popover (dois meses no período). Mobile: bottom sheet.\n */\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(\n function DatePicker(props, ref) {\n const {\n placeholder = props.range ? 'Selecione o período' : 'Selecione a data',\n label,\n size,\n invalid,\n disabled,\n time,\n minDate,\n maxDate,\n dropdowns = true,\n clearable,\n id,\n className,\n } = props\n const { isMobile } = useBreakpoint()\n const [open, setOpen] = useState(false)\n const [inner, setInner] = useState<Date | DateRange | null>(null)\n const committed = (props.value !== undefined ? props.value : inner) ?? null\n const [draft, setDraft] = useState<Date | DateRange | undefined>(undefined)\n const [t1, setT1] = useState('09:00')\n const [t2, setT2] = useState('18:00')\n\n const commit = (v: Date | DateRange | null) => {\n setInner(v)\n if (props.range) props.onChange?.(v as DateRange | null)\n else props.onChange?.(v as Date | null)\n }\n\n const onOpenChange = (o: boolean) => {\n setOpen(o)\n if (o) {\n setDraft(committed ?? undefined)\n if (committed instanceof Date) setT1(fmtTime(committed))\n else if (committed && 'from' in committed) {\n if (committed.from) setT1(fmtTime(committed.from))\n if (committed.to) setT2(fmtTime(committed.to))\n }\n }\n }\n\n const apply = () => {\n if (props.range) {\n const r = draft as DateRange | undefined\n commit(\n r?.from\n ? {\n from: time ? withTime(r.from, t1) : r.from,\n to: time ? withTime(r.to, t2) : r.to,\n }\n : null,\n )\n } else {\n const d = draft as Date | undefined\n commit(d ? (time ? (withTime(d, t1) ?? null) : d) : null)\n }\n setOpen(false)\n }\n\n // Texto do campo\n let text: string | null = null\n if (committed instanceof Date) {\n text = fmtDate(committed) + (time ? ` ${fmtTime(committed)}` : '')\n } else if (committed?.from) {\n const a = fmtDate(committed.from) + (time ? ` ${fmtTime(committed.from)}` : '')\n const b = committed.to\n ? fmtDate(committed.to) + (time ? ` ${fmtTime(committed.to)}` : '')\n : '...'\n text = `${a} a ${b}`\n }\n\n const disabledDays = [\n ...(minDate ? [{ before: minDate }] : []),\n ...(maxDate ? [{ after: maxDate }] : []),\n ]\n const immediate = !props.range && !time && !isMobile\n\n // Faixa dos seletores de ano: de 1900 (ou minDate) até 10 anos à frente (ou maxDate).\n const navigation = dropdowns\n ? {\n captionLayout: 'dropdown' as const,\n startMonth: minDate ?? new Date(1900, 0, 1),\n endMonth: maxDate ?? new Date(new Date().getFullYear() + 10, 11, 31),\n }\n : {}\n\n const classNames = {\n root: 'relative p-2',\n dropdowns: 'flex items-center gap-2',\n dropdown_root:\n 'relative inline-flex h-control-sm items-center rounded-item border border-input bg-field px-2 text-sm font-medium focus-within:ring-2 focus-within:ring-ring',\n // Fundo e texto explícitos: a lista nativa não herda o fundo transparente do tema escuro.\n dropdown:\n 'absolute inset-0 w-full cursor-pointer bg-popover text-popover-foreground opacity-0 [&_option]:bg-popover [&_option]:text-popover-foreground',\n caption_label: 'inline-flex items-center gap-1 capitalize [&>svg]:size-icon-sm',\n months: 'flex flex-col gap-6 md:flex-row',\n month: 'flex flex-col gap-3',\n month_caption:\n 'flex h-control-sm items-center justify-center text-sm font-semibold capitalize',\n nav: 'absolute inset-x-2 top-2 flex justify-between',\n button_previous:\n 'flex size-control-sm cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-40',\n button_next:\n 'flex size-control-sm cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-40',\n chevron: 'size-icon-sm fill-current',\n month_grid: 'border-collapse',\n weekdays: 'flex',\n weekday:\n 'w-touch py-1 text-center text-xs font-medium text-muted-foreground capitalize md:w-control-md',\n week: 'mt-1 flex',\n day: 'p-0 text-center',\n day_button:\n 'size-touch cursor-pointer rounded-item text-sm tabular-nums transition-colors hover:bg-accent disabled:cursor-not-allowed md:size-control-md',\n selected:\n '[&>button]:bg-primary [&>button]:font-medium [&>button]:text-primary-foreground [&>button]:hover:bg-primary-hover [&>button]:hover:text-primary-hover-foreground',\n range_start: '[&>button]:bg-primary [&>button]:text-primary-foreground',\n range_end: '[&>button]:bg-primary [&>button]:text-primary-foreground',\n range_middle:\n '[&>button]:rounded-none [&>button]:bg-primary-soft [&>button]:text-primary-soft-foreground [&>button]:hover:bg-primary-soft',\n today: '[&>button]:font-semibold [&>button]:text-primary-text',\n outside: 'opacity-40',\n disabled: 'opacity-30',\n }\n\n const calendar = props.range ? (\n <DayPicker\n mode=\"range\"\n locale={ptBR}\n selected={draft as DateRange | undefined}\n onSelect={(r) => setDraft(r)}\n numberOfMonths={isMobile ? 1 : 2}\n defaultMonth={(draft as DateRange | undefined)?.from}\n disabled={disabledDays}\n showOutsideDays\n classNames={classNames}\n {...navigation}\n />\n ) : (\n <DayPicker\n mode=\"single\"\n locale={ptBR}\n selected={draft as Date | undefined}\n onSelect={(d) => {\n setDraft(d)\n if (immediate) {\n commit(d ?? null)\n setOpen(false)\n }\n }}\n defaultMonth={draft as Date | undefined}\n disabled={disabledDays}\n showOutsideDays\n classNames={classNames}\n {...navigation}\n />\n )\n\n const showClear = clearable && !!text && !disabled\n const clear = showClear ? (\n <button\n type=\"button\"\n aria-label=\"Limpar data\"\n className={cn(\n controlAdornmentButton,\n 'absolute top-1/2 right-1 mr-0 -translate-y-1/2 md:right-2 md:mr-0',\n )}\n onClick={() => commit(null)}\n >\n <X aria-hidden />\n </button>\n ) : undefined\n\n const trigger = (\n <button\n ref={ref}\n id={id}\n type=\"button\"\n data-rendra=\"DTP-001\"\n disabled={disabled}\n data-invalid={invalid || undefined}\n aria-describedby={props['aria-describedby']}\n aria-haspopup=\"dialog\"\n className={cn(\n controlFrame({ size, invalid }),\n 'cursor-pointer text-left disabled:cursor-not-allowed disabled:opacity-60',\n className,\n )}\n >\n <CalendarDays className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n <span\n className={cn('min-w-0 flex-1 truncate tabular-nums', !text && 'text-muted-foreground')}\n >\n {text ?? placeholder}\n </span>\n {showClear && <span aria-hidden className={cn(controlAdornmentSpace, '-mr-2 md:-mr-1')} />}\n </button>\n )\n\n const footer = immediate ? undefined : (\n <div className=\"flex flex-col gap-3\">\n {time && (\n <div className={cn('grid gap-3', props.range ? 'grid-cols-2' : 'grid-cols-1')}>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor={`${id ?? 'data'}-hora-1`}>\n {props.range ? 'Hora inicial' : 'Horário'}\n </Label>\n <Input\n id={`${id ?? 'data'}-hora-1`}\n mask=\"time\"\n value={t1}\n onChange={setT1}\n size=\"sm\"\n />\n </div>\n {props.range && (\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor={`${id ?? 'data'}-hora-2`}>Hora final</Label>\n <Input\n id={`${id ?? 'data'}-hora-2`}\n mask=\"time\"\n value={t2}\n onChange={setT2}\n size=\"sm\"\n />\n </div>\n )}\n </div>\n )}\n <div className=\"grid grid-actions-2 gap-3\">\n <Button variant=\"outline\" onClick={() => setDraft(undefined)}>\n Limpar\n </Button>\n <Button onClick={apply}>Aplicar</Button>\n </div>\n </div>\n )\n\n return (\n <PickerPanel\n open={open}\n onOpenChange={onOpenChange}\n trigger={trigger}\n adornment={clear}\n title={label ?? placeholder}\n footer={footer}\n width=\"auto\"\n >\n <div className=\"flex justify-center\">{calendar}</div>\n </PickerPanel>\n )\n },\n)\n","import { ArrowLeft, Home, RotateCw } from 'lucide-react'\nimport { useRendraLink, useRendraNavigate } from '@/components/rendra-provider'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@/lib/cn'\n\nconst content = {\n 404: {\n type: 'warning' as const,\n title: 'Página não encontrada',\n description:\n 'O endereço pode ter mudado ou a página foi removida. Confira o link ou volte ao painel.',\n },\n 500: {\n type: 'error' as const,\n title: 'Algo deu errado do nosso lado',\n description: 'Não foi possível carregar esta tela agora. Tente de novo em instantes.',\n },\n}\n\nexport interface ErrorPageProps {\n code: 404 | 500\n /** Título próprio no lugar do padrão. */\n title?: string\n description?: string\n /** Ocupa a tela inteira (fora do AppShell). */\n fullScreen?: boolean\n /**\n * Mostra o botão Voltar (padrão). Com `false` só a ação principal é desenhada, na largura\n * toda (regra \"um botão = 100%\").\n */\n back?: boolean\n}\n\n/**\n * Tela de erro única (404 e 500), com o ícone de feedback da marca animado.\n * Ações seguem a regra 30/70: secundária à esquerda, principal à direita.\n */\nexport function ErrorPage({\n code,\n title,\n description,\n fullScreen = false,\n back = true,\n}: ErrorPageProps) {\n const Link = useRendraLink()\n const { goBack } = useRendraNavigate()\n const c = content[code]\n // Sem o Voltar, a ação principal é o único botão: 100% da largura.\n const principal = back ? 'col-span-7' : 'col-span-10'\n\n return (\n <div\n data-rendra=\"ERRO-001\"\n className={cn(\n 'flex w-full items-center justify-center px-4 py-12',\n fullScreen ? 'min-h-dvh' : 'min-h-full',\n )}\n >\n <div className=\"flex w-full max-w-md flex-col items-center gap-6 text-center\">\n <div className=\"relative flex items-center justify-center\">\n <span aria-hidden className=\"absolute size-24 rounded-full bg-gradient-soft\" />\n <BrandFeedbackIcon type={c.type} size=\"2xl\" animated className=\"relative\" />\n </div>\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-sm font-medium tracking-wide text-muted-foreground tabular-nums\">\n Erro {code}\n </p>\n <h1 className=\"text-2xl md:text-3xl\">{title ?? c.title}</h1>\n <p className=\"text-base text-muted-foreground\">{description ?? c.description}</p>\n </div>\n <div className=\"grid w-full grid-cols-10 gap-3\">\n {back && (\n <Button\n variant=\"outline\"\n icon={<ArrowLeft />}\n className=\"col-span-3\"\n onClick={goBack}\n aria-label=\"Voltar\"\n >\n <span className=\"hidden sm:inline\">Voltar</span>\n </Button>\n )}\n {code === 500 ? (\n <Button icon={<RotateCw />} className={principal} onClick={() => location.reload()}>\n Tentar de novo\n </Button>\n ) : (\n <Button asChild className={principal}>\n <Link to=\"/\">\n <Home aria-hidden />\n Ir para o painel\n </Link>\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n FormProvider,\n useController,\n useFormContext,\n type FieldPath,\n type FieldValues,\n type SubmitHandler,\n type UseFormReturn,\n} from 'react-hook-form'\nimport { fieldGridClass, gapClass } from '@/components/layout/tokens'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Field, type FieldProps } from '@/components/ui/field'\nimport { cn } from '@/lib/cn'\n\n/*\n * Integração com React Hook Form + Zod.\n * const form = useForm({ resolver: zodResolver(schema), mode: 'onTouched' })\n * <Form form={form} onSubmit={salvar}>\n * <FormSection title=\"Dados principais\">\n * <FormField name=\"nome\" label=\"Nome\" required render={(f) => <Input {...f} />} />\n * </FormSection>\n * <ActionBar sticky primary={{ label: 'Salvar', type: 'submit', loading: isSubmitting }} />\n * </Form>\n */\n\ninterface FormProps<T extends FieldValues> {\n form: UseFormReturn<T>\n onSubmit: SubmitHandler<T>\n children: ReactNode\n id?: string\n className?: string\n}\n\nexport function Form<T extends FieldValues>({\n form,\n onSubmit,\n children,\n id,\n className,\n}: FormProps<T>) {\n return (\n <FormProvider {...form}>\n <form\n id={id}\n noValidate\n onSubmit={form.handleSubmit(onSubmit)}\n data-rendra=\"FORM-001\"\n className={cn('flex min-w-0 flex-col gap-8 md:gap-12', className)}\n >\n {children}\n </form>\n </FormProvider>\n )\n}\n\n/** Props que o render recebe: prontas para espalhar em Input, Select, DatePicker etc. */\nexport interface FormControlProps<V = unknown> {\n name: string\n value: V\n onChange: (value: V) => void\n onBlur: () => void\n invalid: boolean\n ref: (el: unknown) => void\n}\n\ninterface FormFieldProps<T extends FieldValues> extends Omit<FieldProps, 'children' | 'error'> {\n name: FieldPath<T>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n render: (field: FormControlProps<any>) => ReactNode\n}\n\nexport function FormField<T extends FieldValues>({\n name,\n render,\n ...fieldProps\n}: FormFieldProps<T>) {\n const { control } = useFormContext<T>()\n const { field, fieldState } = useController({ name, control })\n return (\n <Field {...fieldProps} error={fieldState.error?.message}>\n {render({\n name: field.name,\n value: field.value,\n onChange: field.onChange,\n onBlur: field.onBlur,\n invalid: Boolean(fieldState.error),\n ref: field.ref,\n })}\n </Field>\n )\n}\n\ninterface FormSectionProps {\n title: ReactNode\n /** Subtítulo curto da seção. Instrução de uso vai em `help`. */\n description?: ReactNode\n /** Texto orientativo: ícone de informação ao lado do título, que abre um modal. */\n help?: ReactNode\n /**\n * 1: todos os campos em largura total (texto longo, cartões de seleção, anexos).\n * Sem valor: grade de formulário, com a largura de cada campo no span do Field.\n */\n columns?: 1 | 2\n children: ReactNode\n id?: string\n}\n\n/** Seção de formulário: card com título e a grade de formulário (3 campos por linha no largo). */\nexport function FormSection({ title, description, help, columns, children, id }: FormSectionProps) {\n return (\n <Card id={id} data-rendra=\"FORM-002\" className=\"scroll-mt-6\">\n <CardHeader>\n <CardTitle help={help}>{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n </CardHeader>\n <CardContent>\n <div className={columns === 1 ? undefined : '@container'}>\n <div className={cn(columns === 1 ? 'grid grid-cols-1' : fieldGridClass, gapClass.fields)}>\n {children}\n </div>\n </div>\n </CardContent>\n </Card>\n )\n}\n","import { Slider as S } from 'radix-ui'\nimport { cn } from '@/lib/cn'\n\nexport interface SliderProps {\n /** Um número, ou dois para faixa (mínimo e máximo). */\n value?: number[]\n defaultValue?: number[]\n onChange?: (value: number[]) => void\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n /** Mostra o valor atual acima da trilha. */\n showValue?: boolean\n formatValue?: (n: number) => string\n id?: string\n 'aria-label'?: string\n 'aria-describedby'?: string\n}\n\n/** Slider único: valor simples ou faixa. Alça com área de toque de 44px. */\nexport function Slider({\n value,\n defaultValue = [50],\n onChange,\n min = 0,\n max = 100,\n step = 1,\n disabled,\n showValue,\n formatValue = (n) => n.toLocaleString('pt-BR'),\n id,\n ...aria\n}: SliderProps) {\n const current = value ?? defaultValue\n return (\n <div data-rendra=\"SLD-001\" className=\"flex flex-col gap-3\">\n {showValue && (\n <div className=\"flex justify-between text-sm font-medium tabular-nums\">\n <span>{formatValue(current[0] ?? min)}</span>\n {current.length > 1 && <span>{formatValue(current[1] ?? max)}</span>}\n </div>\n )}\n <S.Root\n id={id}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onChange}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n className={cn(\n 'relative flex h-touch w-full touch-none items-center select-none md:h-6',\n disabled && 'opacity-50',\n )}\n >\n <S.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-muted\">\n <S.Range className=\"absolute h-full bg-primary\" />\n </S.Track>\n {current.map((_, i) => (\n <S.Thumb\n key={i}\n aria-label={\n aria['aria-label'] ??\n (current.length > 1 ? (i === 0 ? 'Mínimo' : 'Máximo') : undefined)\n }\n aria-describedby={aria['aria-describedby']}\n data-touch=\"expanded\"\n className=\"relative block size-icon-md cursor-grab rounded-full border-2 border-primary bg-card shadow-sm transition-transform before:absolute before:-inset-3 hover:scale-110 active:cursor-grabbing\"\n />\n ))}\n </S.Root>\n </div>\n )\n}\n","import { Tabs as T } from 'radix-ui'\nimport { useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { Select } from '@/components/ui/select'\nimport { cn } from '@/lib/cn'\nimport { useLayoutReady, useMotionLib, useMotionPresets } from '@/lib/motion'\n\n/** Contador de instâncias, só para o `layoutId` do indicador (ver `indicatorId`). */\nlet tabsCreated = 0\n\nexport interface TabItem {\n value: string\n label: string\n icon?: ReactNode\n /** Contador ao lado do rótulo. */\n count?: number\n disabled?: boolean\n content: ReactNode\n}\n\nexport interface TabsProps {\n items: TabItem[]\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n /** line: sublinhado; pill: pílulas sobre fundo suave. */\n variant?: 'line' | 'pill'\n 'aria-label'?: string\n className?: string\n}\n\n/**\n * Tabs único. Se as abas não couberem na largura, a mesma lista vira um Select\n * (nunca rolagem lateral). A troca é medida no próprio contêiner, não na tela.\n */\nexport function Tabs({\n items,\n value,\n defaultValue,\n onChange,\n variant = 'line',\n className,\n ...aria\n}: TabsProps) {\n const [inner, setInner] = useState(defaultValue ?? items[0]?.value ?? '')\n const current = value ?? inner\n const set = (v: string) => {\n setInner(v)\n onChange?.(v)\n }\n\n const boxRef = useRef<HTMLDivElement>(null)\n const measureRef = useRef<HTMLDivElement>(null)\n const [overflow, setOverflow] = useState(false)\n useLayoutEffect(() => {\n const box = boxRef.current\n const measure = measureRef.current\n if (!box || !measure) return\n const check = () => setOverflow(measure.scrollWidth > box.clientWidth + 1)\n check()\n const ro = new ResizeObserver(check)\n ro.observe(box)\n return () => ro.disconnect()\n }, [items, variant])\n\n const presets = useMotionPresets()\n // O indicador deslizante (layoutId) só existe com o domMax carregado: um elemento com layoutId\n // criado antes disso não ganha projeção. Até lá vale o destaque em CSS de sempre.\n const on = useLayoutReady()\n const lib = useMotionLib()\n\n // Em `on`, a cor do texto da aba ativa troca por clip-path: uma cópia da lista, com o texto na\n // cor de destaque, recortada só sobre a aba ativa; o recorte desliza junto com o indicador.\n // Duas cores interpoladas nunca ficam em sincronia com o indicador; um recorte, sim.\n const listRef = useRef<HTMLDivElement>(null)\n const [clip, setClip] = useState({ l: 0, r: 0 })\n useLayoutEffect(() => {\n const list = listRef.current\n if (!on || !list) return\n const measure = () => {\n const active = list.querySelector<HTMLElement>('[role=\"tab\"][data-state=\"active\"]')\n if (!active) return\n const l = active.offsetLeft\n const r = list.offsetWidth - l - active.offsetWidth\n setClip((prev) => (prev.l === l && prev.r === r ? prev : { l, r }))\n }\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(list)\n return () => ro.disconnect()\n }, [on, current, items, variant, overflow])\n // Um layoutId por instância: duas Tabs na mesma tela não trocam o indicador entre si. Não usa\n // `useId` de propósito: ele consome a sequência de ids do React e deslocaria os ids de tudo o\n // que vem depois na página, mudando o HTML do caminho `off`.\n const [indicatorId] = useState(() => `rendra-tabs-${++tabsCreated}`)\n\n const trigger = cn(\n 'inline-flex min-h-touch shrink-0 cursor-pointer items-center justify-center gap-2 px-3 text-sm font-medium whitespace-nowrap transition-colors outline-none disabled:cursor-not-allowed disabled:opacity-50 md:min-h-0 [&_svg]:size-icon-sm',\n // Em `on` o destaque da aba ativa é o indicador deslizante: a borda e o fundo em CSS saem, e\n // a cor do texto ativo vem da cópia recortada (sem `transition` de cor na aba).\n variant === 'line'\n ? on\n ? 'relative -mb-px border-b-2 border-transparent py-3 text-muted-foreground hover:text-foreground'\n : '-mb-px border-b-2 border-transparent py-3 text-muted-foreground hover:text-foreground data-[state=active]:border-primary data-[state=active]:text-foreground'\n : on\n ? 'relative isolate rounded-item py-2 text-muted-foreground hover:bg-card/60 hover:text-foreground'\n : 'rounded-item py-2 text-muted-foreground hover:bg-card/60 hover:text-foreground data-[state=active]:bg-card data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n )\n const indicator = lib && (\n <lib.m.span\n layoutId={indicatorId}\n data-indicator=\"tabs\"\n aria-hidden\n transition={presets.move}\n className={\n variant === 'line'\n ? 'absolute inset-x-0 top-full border-b-2 border-primary'\n : 'absolute inset-0 -z-10 rounded-item bg-card shadow-sm'\n }\n />\n )\n const list = cn(\n 'flex',\n variant === 'line' ? 'gap-2 border-b' : 'gap-1 rounded-control bg-muted p-1',\n )\n const label = (it: TabItem) => (\n <>\n {it.icon}\n {it.label}\n {it.count !== undefined && (\n <span className=\"rounded-full bg-muted px-2 text-xs text-muted-foreground tabular-nums\">\n {it.count}\n </span>\n )}\n </>\n )\n\n return (\n <T.Root\n value={current}\n onValueChange={set}\n data-rendra={resolveCatalogCode('Tabs', { variant })}\n className={cn('flex min-w-0 flex-col gap-6', className)}\n >\n <div ref={boxRef} className=\"relative min-w-0\">\n {/* Cópia invisível só para medir a largura natural das abas */}\n <div ref={measureRef} aria-hidden className={cn(list, 'invisible absolute w-max')}>\n {items.map((it) => (\n <span key={it.value} className={trigger}>\n {label(it)}\n </span>\n ))}\n </div>\n {overflow ? (\n <Select\n label={aria['aria-label'] ?? 'Seção'}\n value={current}\n onChange={(v) => v && set(v)}\n options={items.map((it) => ({\n value: it.value,\n label: it.count !== undefined ? `${it.label} (${it.count})` : it.label,\n disabled: it.disabled,\n }))}\n />\n ) : (\n <>\n <T.List ref={listRef} aria-label={aria['aria-label']} className={list}>\n {items.map((it) => (\n <T.Trigger\n key={it.value}\n value={it.value}\n disabled={it.disabled}\n className={trigger}\n >\n {on && current === it.value && indicator}\n {label(it)}\n </T.Trigger>\n ))}\n </T.List>\n {on && (\n <div\n data-tabs-copy\n aria-hidden\n className={cn(\n list,\n 'pointer-events-none absolute inset-0 border-transparent bg-transparent text-foreground tabs-clip',\n )}\n style={{ '--tabs-l': `${clip.l}px`, '--tabs-r': `${clip.r}px` } as CSSProperties}\n >\n {items.map((it) => (\n <span key={it.value} className={cn(trigger, 'text-foreground')}>\n {label(it)}\n </span>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n {items.map((it) => (\n <T.Content key={it.value} value={it.value} className=\"min-w-0 outline-none\">\n {/* Sem entrada animada (W4): troca de aba é frequente e vem do teclado, então o painel\n aparece direto. Quem explica a troca é o indicador. */}\n {it.content}\n </T.Content>\n ))}\n </T.Root>\n )\n}\n","import {\n useCallback,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\n\n/**\n * Motor de reordenação por pointer events (etapa A6 do plano da v2), reaproveitado pela\n * List (arraste da alça) e pelo Kanban (arraste do card no toque, que o HTML5 drag and\n * drop nativo não cobre). Pointer events funcionam iguais para mouse, caneta e toque, com\n * setPointerCapture mantendo os eventos de mover e soltar no mesmo elemento que começou o\n * arraste, mesmo que o ponteiro saia dele no meio do gesto.\n */\n\n/** Item de uma lista reordenável: id estável e o dado original associado. */\nexport interface SortableItem<T = unknown> {\n id: string\n data: T\n}\n\nexport interface UseSortableOptions<T> {\n items: SortableItem<T>[]\n /** Chamado com a lista já reordenada. Sem ela, o motor não reordena nada. */\n onReorder?: (items: SortableItem<T>[]) => void\n}\n\nexport interface UseSortableResult {\n /** Id do item sendo arrastado no momento, ou null fora de um arraste. */\n draggingId: string | null\n /**\n * Espalhe no elemento (um <button>) que serve de alça do arraste: pointer down inicia o\n * arraste (mouse e toque) e as setas ↑/↓ movem uma posição pelo teclado. Usada pelo\n * componente SortableHandle (src/components/ui/sortable-handle.tsx), reaproveitado pela\n * List e pelo Upload, para não duplicar a alça inteira em cada um.\n */\n handleProps: (id: string) => {\n onPointerDown: (e: ReactPointerEvent<HTMLElement>) => void\n onKeyDown: (e: ReactKeyboardEvent<HTMLElement>) => void\n className: string\n }\n /** Espalhe no elemento da linha, para o motor localizar o alvo do arraste sob o ponteiro. */\n itemProps: (id: string) => Record<string, string>\n /** Move o item uma posição para cima (-1) ou para baixo (1); usado pelo teclado (setas). */\n moveBy: (id: string, delta: -1 | 1) => void\n}\n\nconst DEFAULT_ATTR = 'data-sortable-id'\n\n/**\n * Acha, sob o ponto x,y da tela, o elemento mais próximo com o atributo dado (o motor da\n * List usa \"data-sortable-id\"; o Kanban passa o atributo dele, por coluna ou por card) e\n * se o ponto está antes ou depois do meio dele. Sem elemento sob o ponto, devolve null.\n */\nexport function findDragTarget(\n x: number,\n y: number,\n attr: string = DEFAULT_ATTR,\n): { id: string; before: boolean } | null {\n const el = document.elementFromPoint(x, y)\n const target = el?.closest(`[${attr}]`)\n const id = target?.getAttribute(attr)\n if (!target || !id) return null\n const rect = target.getBoundingClientRect()\n const before = y < rect.top + rect.height / 2\n return { id, before }\n}\n\n/**\n * A partir do resultado de findDragTarget (id do alvo e se o ponto está antes do meio\n * dele), calcula a posição de inserção numa lista de ids na mesma ordem em que aparecem\n * na tela. Usada pelo useSortable (List e Upload) e diretamente pelo Kanban, para os dois\n * nunca recalcularem essa conta cada um do seu jeito.\n */\nexport function resolveDropIndex(\n ids: string[],\n found: { id: string; before: boolean } | null,\n): number {\n if (!found) return ids.length\n const at = ids.indexOf(found.id)\n if (at === -1) return ids.length\n return found.before ? at : at + 1\n}\n\n/**\n * Inicia um arraste por pointer events num nó já capturado (setPointerCapture): entrega a\n * posição do ponteiro a cada movimento e avisa quando solta, sem depender de um item\n * específico. Usado tanto pelo useSortable quanto diretamente pelo Kanban.\n */\nexport function bindPointerDrag(\n node: HTMLElement,\n e: ReactPointerEvent<HTMLElement> | PointerEvent,\n handlers: { onMove: (x: number, y: number) => void; onEnd: () => void },\n): void {\n const pointerId = e.pointerId\n try {\n node.setPointerCapture(pointerId)\n } catch {\n // Ambiente sem suporte (jsdom em alguns testes): segue sem captura, ainda funcional.\n }\n const onMove = (ev: PointerEvent) => handlers.onMove(ev.clientX, ev.clientY)\n const onUp = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return\n try {\n node.releasePointerCapture(pointerId)\n } catch {\n // Idem: sem captura, nada para liberar.\n }\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onUp)\n handlers.onEnd()\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n window.addEventListener('pointercancel', onUp)\n}\n\n/**\n * Motor de reordenação de uma lista única por alça: arraste (pointer events, mouse e\n * toque) e teclado (setas, uma posição por vez). Sem onReorder, a lista é só leitura e o\n * motor não inicia arraste nenhum (quem decide se a alça aparece é o componente que usa o\n * hook, como a List).\n */\nexport function useSortable<T>({ items, onReorder }: UseSortableOptions<T>): UseSortableResult {\n const [draggingId, setDraggingId] = useState<string | null>(null)\n const itemsRef = useRef(items)\n itemsRef.current = items\n\n const reorderTo = useCallback(\n (id: string, targetId: string, before: boolean) => {\n if (id === targetId) return\n const list = [...itemsRef.current]\n const from = list.findIndex((i) => i.id === id)\n if (from === -1) return\n const [moved] = list.splice(from, 1)\n if (!moved) return\n const to = resolveDropIndex(\n list.map((i) => i.id),\n { id: targetId, before },\n )\n list.splice(to, 0, moved)\n onReorder?.(list)\n },\n [onReorder],\n )\n\n const moveBy = useCallback(\n (id: string, delta: -1 | 1) => {\n const list = [...itemsRef.current]\n const from = list.findIndex((i) => i.id === id)\n if (from === -1) return\n const to = from + delta\n if (to < 0 || to >= list.length) return\n const [moved] = list.splice(from, 1)\n if (!moved) return\n list.splice(to, 0, moved)\n onReorder?.(list)\n },\n [onReorder],\n )\n\n const handleProps = useCallback(\n (id: string) => ({\n className: 'touch-none',\n onPointerDown: (e: ReactPointerEvent<HTMLElement>) => {\n if (!onReorder) return\n const node = e.currentTarget\n setDraggingId(id)\n bindPointerDrag(node, e, {\n onMove: (x, y) => {\n const found = findDragTarget(x, y)\n if (found) reorderTo(id, found.id, found.before)\n },\n onEnd: () => setDraggingId(null),\n })\n },\n onKeyDown: (e: ReactKeyboardEvent<HTMLElement>) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n moveBy(id, -1)\n } else if (e.key === 'ArrowDown') {\n e.preventDefault()\n moveBy(id, 1)\n }\n },\n }),\n [onReorder, reorderTo, moveBy],\n )\n\n const itemProps = useCallback((id: string) => ({ [DEFAULT_ATTR]: id }), [])\n\n return { draggingId, handleProps, itemProps, moveBy }\n}\n","import { useEffect, useMemo, useRef, useState, type CSSProperties } from 'react'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Alert } from '@/components/ui/alert'\nimport { Slider } from '@/components/ui/slider'\nimport { Tabs } from '@/components/ui/tabs'\nimport { cn } from '@/lib/cn'\nimport { bindPointerDrag } from '@/lib/sortable'\n\n/**\n * Recorte de imagem (etapa A2 do plano da v2): entra um File, sai um File novo, na\n * resolução original (ou até maxOutputWidth). A geometria é uma função pura, testada por\n * proporção, para o arraste e o zoom nunca descolarem a imagem da moldura.\n */\n\nexport interface ImageCropperAspect {\n id: string\n label: string\n /** Largura dividida pela altura (1 = quadrado, 16/9 = paisagem). */\n ratio: number\n}\n\nexport interface ImageCropperProps {\n file: File\n aspects: ImageCropperAspect[]\n /** Teto de largura da saída, em pixels. Sem ele, sai na resolução original do recorte. */\n maxOutputWidth?: number\n /** Chamado só quando o recorte deu certo, com o File novo. */\n onConfirm: (file: File) => void\n onCancel: () => void\n className?: string\n}\n\nexport interface CropGeometryInput {\n imageWidth: number\n imageHeight: number\n frameWidth: number\n frameHeight: number\n /** 1 = ajuste mínimo para cobrir a moldura; maior aproxima (zoom). */\n zoom: number\n /** Deslocamento desejado do centro da imagem, em pixels de tela. */\n offsetX: number\n offsetY: number\n}\n\nexport interface CropGeometryResult {\n /** Pixels de tela por pixel da imagem original. */\n scale: number\n /** Deslocamento realmente aplicado: nunca deixa a imagem descolar da moldura. */\n offsetX: number\n offsetY: number\n /** Retângulo de origem, em pixels da imagem original, que cai dentro da moldura. */\n source: { x: number; y: number; width: number; height: number }\n}\n\n/**\n * Geometria pura do recorte: a imagem sempre cobre a moldura (escala mínima = \"cover\"\n * vezes o zoom) e o arraste é limitado à sobra, para nunca abrir vão entre a imagem e a\n * moldura. Devolve também o retângulo de origem na resolução original da imagem, pronto\n * para desenhar num canvas do tamanho da moldura (ou maior, mantendo a proporção).\n */\nexport function computeCropGeometry({\n imageWidth,\n imageHeight,\n frameWidth,\n frameHeight,\n zoom,\n offsetX,\n offsetY,\n}: CropGeometryInput): CropGeometryResult {\n const coverScale = Math.max(frameWidth / imageWidth, frameHeight / imageHeight)\n const scale = coverScale * Math.max(1, zoom)\n const scaledWidth = imageWidth * scale\n const scaledHeight = imageHeight * scale\n const maxOffsetX = Math.max(0, (scaledWidth - frameWidth) / 2)\n const maxOffsetY = Math.max(0, (scaledHeight - frameHeight) / 2)\n const clampedX = Math.min(maxOffsetX, Math.max(-maxOffsetX, offsetX))\n const clampedY = Math.min(maxOffsetY, Math.max(-maxOffsetY, offsetY))\n const centerX = imageWidth / 2 - clampedX / scale\n const centerY = imageHeight / 2 - clampedY / scale\n const sourceWidth = frameWidth / scale\n const sourceHeight = frameHeight / scale\n return {\n scale,\n offsetX: clampedX,\n offsetY: clampedY,\n source: {\n x: centerX - sourceWidth / 2,\n y: centerY - sourceHeight / 2,\n width: sourceWidth,\n height: sourceHeight,\n },\n }\n}\n\n/** document.createElement('canvas').getContext('2d') existe? Sem ele, o recorte é impossível. */\nfunction detectCanvasSupport(): boolean {\n try {\n return Boolean(document.createElement('canvas').getContext('2d'))\n } catch {\n return false\n }\n}\n\n/** Recorte único: entra um File, sai um File novo na resolução original (ou maxOutputWidth). */\nexport function ImageCropper({\n file,\n aspects,\n maxOutputWidth,\n onConfirm,\n onCancel,\n className,\n}: ImageCropperProps) {\n const canvasSupported = useMemo(detectCanvasSupport, [])\n // toBlob pode devolver null (rarissimo, mas acontece): a falha entra aqui e vira a\n // mesma tela declarada de \"não é possível recortar\", em vez de sair calada.\n const [blobFailed, setBlobFailed] = useState(false)\n const [aspectId, setAspectId] = useState(aspects[0]?.id ?? '')\n const aspect = aspects.find((a) => a.id === aspectId) ?? aspects[0]\n const [zoom, setZoom] = useState(1)\n const [offset, setOffset] = useState({ x: 0, y: 0 })\n const [frameSize, setFrameSize] = useState({ width: 0, height: 0 })\n const [natural, setNatural] = useState<{ width: number; height: number } | null>(null)\n const [url, setUrl] = useState('')\n const frameRef = useRef<HTMLDivElement>(null)\n const imgRef = useRef<HTMLImageElement>(null)\n\n useEffect(() => {\n const objectUrl = URL.createObjectURL(file)\n setUrl(objectUrl)\n return () => URL.revokeObjectURL(objectUrl)\n }, [file])\n\n useEffect(() => {\n const el = frameRef.current\n if (!el) return\n const measure = () => setFrameSize({ width: el.clientWidth, height: el.clientHeight })\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(el)\n return () => ro.disconnect()\n }, [aspect?.id])\n\n // Trocar a proporção começa um recorte novo, sem herdar arraste e zoom da anterior.\n useEffect(() => {\n setZoom(1)\n setOffset({ x: 0, y: 0 })\n }, [aspectId])\n\n if (!canvasSupported || blobFailed) {\n return (\n <div data-rendra=\"CROP-001\" className={cn('flex flex-col gap-4', className)}>\n <Alert\n type=\"error\"\n title=\"Não é possível recortar aqui\"\n description=\"Este navegador não tem suporte ao recorte de imagem. Envie o arquivo sem recortar ou tente em outro navegador.\"\n />\n <ActionBar primary={{ label: 'Fechar', onClick: onCancel }} />\n </div>\n )\n }\n\n const geometry =\n natural && frameSize.width > 0\n ? computeCropGeometry({\n imageWidth: natural.width,\n imageHeight: natural.height,\n frameWidth: frameSize.width,\n frameHeight: frameSize.height,\n zoom,\n offsetX: offset.x,\n offsetY: offset.y,\n })\n : null\n\n const confirm = () => {\n const img = imgRef.current\n if (!img || !natural || !geometry) return\n const canvas = document.createElement('canvas')\n let outWidth = Math.round(geometry.source.width)\n let outHeight = Math.round(geometry.source.height)\n if (maxOutputWidth && outWidth > maxOutputWidth) {\n const shrink = maxOutputWidth / outWidth\n outWidth = Math.round(outWidth * shrink)\n outHeight = Math.round(outHeight * shrink)\n }\n canvas.width = Math.max(1, outWidth)\n canvas.height = Math.max(1, outHeight)\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n ctx.drawImage(\n img,\n geometry.source.x,\n geometry.source.y,\n geometry.source.width,\n geometry.source.height,\n 0,\n 0,\n canvas.width,\n canvas.height,\n )\n const type = file.type || 'image/png'\n canvas.toBlob((blob) => {\n if (!blob) {\n setBlobFailed(true)\n return\n }\n onConfirm(new File([blob], file.name, { type }))\n }, type)\n }\n\n return (\n <div data-rendra=\"CROP-001\" className={cn('flex flex-col gap-4', className)}>\n {aspects.length > 1 && (\n <Tabs\n aria-label=\"Proporção do recorte\"\n variant=\"pill\"\n value={aspectId}\n onChange={setAspectId}\n items={aspects.map((a) => ({ value: a.id, label: a.label, content: null }))}\n />\n )}\n <div\n ref={frameRef}\n onPointerDown={(e) => {\n if (!natural) return\n const start = { x: e.clientX, y: e.clientY, base: offset }\n bindPointerDrag(e.currentTarget, e, {\n onMove: (x, y) => {\n const candidate = {\n x: start.base.x + (x - start.x),\n y: start.base.y + (y - start.y),\n }\n const clamped = computeCropGeometry({\n imageWidth: natural.width,\n imageHeight: natural.height,\n frameWidth: frameSize.width,\n frameHeight: frameSize.height,\n zoom,\n offsetX: candidate.x,\n offsetY: candidate.y,\n })\n setOffset({ x: clamped.offsetX, y: clamped.offsetY })\n },\n onEnd: () => {},\n })\n }}\n style={{ '--crop-ratio': aspect?.ratio ?? 1 } as CSSProperties}\n className=\"relative aspect-crop w-full touch-none overflow-hidden rounded-control bg-muted\"\n >\n {url && (\n <img\n ref={imgRef}\n src={url}\n alt=\"\"\n aria-hidden\n onLoad={(e) =>\n setNatural({\n width: e.currentTarget.naturalWidth,\n height: e.currentTarget.naturalHeight,\n })\n }\n style={\n {\n '--crop-x': `${geometry?.offsetX ?? 0}px`,\n '--crop-y': `${geometry?.offsetY ?? 0}px`,\n '--crop-scale': geometry?.scale ?? 1,\n } as CSSProperties\n }\n className=\"absolute top-1/2 left-1/2 max-w-none origin-center cropper-image select-none\"\n draggable={false}\n />\n )}\n </div>\n <Slider\n aria-label=\"Zoom\"\n value={[zoom]}\n onChange={([z]) => setZoom(z ?? 1)}\n min={1}\n max={3}\n step={0.1}\n showValue\n formatValue={(n) => `${n.toFixed(1)}x`}\n />\n <ActionBar\n cancel={{ label: 'Cancelar', onClick: onCancel }}\n primary={{ label: 'Recortar', onClick: confirm, disabled: !geometry }}\n />\n </div>\n )\n}\n","import { ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport { Dialog } from 'radix-ui'\nimport { useRef } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@/lib/cn'\n\n/*\n * Visualizador de imagens (lightbox). Abre por cima da tela, sem sair da página.\n * Tela inteira em qualquer largura: legenda e fechar no topo, imagem no meio e\n * anterior / contador / próxima embaixo, ao alcance do polegar no celular.\n * Teclado: setas trocam de imagem e Esc fecha. No toque, arraste para o lado; pinça amplia.\n */\n\nexport interface ViewerImage {\n src: string\n /** Texto alternativo: o que a imagem mostra. */\n alt: string\n /** Legenda visível. Padrão: o alt. */\n caption?: string\n}\n\nexport interface ImageViewerProps {\n images: ViewerImage[]\n /** Imagem aberta; null fecha o visualizador. */\n index: number | null\n onIndexChange: (index: number | null) => void\n}\n\nconst SWIPE = 48\n\nexport function ImageViewer({ images, index, onIndexChange }: ImageViewerProps) {\n const start = useRef<number | null>(null)\n const open = index !== null && images[index] !== undefined\n const current = open ? images[index] : undefined\n const total = images.length\n const go = (step: number) => {\n if (index === null || total === 0) return\n onIndexChange((index + step + total) % total)\n }\n\n return (\n <Dialog.Root open={open} onOpenChange={(o) => !o && onIndexChange(null)}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-50 bg-overlay data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\" />\n <Dialog.Content\n aria-describedby={undefined}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') go(1)\n if (e.key === 'ArrowLeft') go(-1)\n }}\n data-rendra=\"IMG-001\"\n className=\"fixed inset-0 z-50 flex h-dvh flex-col bg-background text-foreground outline-none data-[state=open]:animate-in data-[state=open]:fade-in-0 md:inset-6 md:h-auto md:rounded-surface md:border md:shadow-lg\"\n >\n <div className=\"flex shrink-0 items-center gap-3 border-b pt-safe pr-2 pb-2 pl-4 md:pt-2 md:pr-3 md:pl-6\">\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-base font-semibold\">\n {current?.caption ?? current?.alt}\n </Dialog.Title>\n <Dialog.Close asChild>\n <Button variant=\"ghost\" iconOnly aria-label=\"Fechar\" icon={<X />} />\n </Dialog.Close>\n </div>\n\n <div\n className=\"flex min-h-0 flex-1 touch-pan-y touch-pinch-zoom items-center justify-center overflow-hidden bg-muted p-2 md:p-6\"\n onPointerDown={(e) => (start.current = e.clientX)}\n onPointerUp={(e) => {\n if (start.current === null) return\n const dx = e.clientX - start.current\n start.current = null\n if (Math.abs(dx) >= SWIPE) go(dx < 0 ? 1 : -1)\n }}\n >\n {current && (\n <img\n key={current.src}\n src={current.src}\n alt={current.alt}\n draggable={false}\n className=\"max-h-full max-w-full rounded-item object-contain shadow-md select-none\"\n />\n )}\n </div>\n\n <div\n className={cn(\n 'flex shrink-0 items-center justify-between gap-3 border-t px-4 pt-3 pb-safe md:px-6 md:pb-3',\n total < 2 && 'hidden',\n )}\n >\n <Button variant=\"outline\" icon={<ChevronLeft />} onClick={() => go(-1)}>\n Anterior\n </Button>\n <span className=\"text-sm text-muted-foreground tabular-nums\" aria-live=\"polite\">\n {index !== null ? index + 1 : 0} de {total}\n </span>\n <Button variant=\"outline\" iconRight={<ChevronRight />} onClick={() => go(1)}>\n Próxima\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import { differenceInCalendarDays, format } from 'date-fns'\nimport {\n ArrowRightLeft,\n CalendarClock,\n CalendarDays,\n CalendarX2,\n GripVertical,\n Mail,\n MoreHorizontal,\n Phone,\n Plus,\n Settings2,\n User,\n} from 'lucide-react'\nimport {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type DragEvent as ReactDragEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Avatar } from '@/components/ui/avatar'\nimport { Badge, type BadgeProps } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { DataToolbar } from '@/components/ui/data-toolbar'\nimport { Drawer } from '@/components/ui/drawer'\nimport { Field } from '@/components/ui/field'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Modal } from '@/components/ui/modal'\nimport { Popover, PopoverAnchor, PopoverContent } from '@/components/ui/popover'\nimport { Select } from '@/components/ui/select'\nimport { Tabs } from '@/components/ui/tabs'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { useFillHeight } from '@/hooks/use-fill-height'\nimport { cn } from '@/lib/cn'\nimport {\n layoutEnabled,\n useLayoutReady,\n useMotionLib,\n useMotionMode,\n useMotionPresets,\n} from '@/lib/motion'\nimport { bindPointerDrag, findDragTarget, resolveDropIndex } from '@/lib/sortable'\n\n/*\n * Kanban único: colunas e cards por props; a tela guarda o estado e recebe onCardMove.\n * Desktop: colunas lado a lado; arraste o card para outra coluna ou outra posição.\n * Toque e teclado: o menu do card tem \"Mover para\" (arrastar nunca é o único caminho).\n * Mobile (< 768px): uma coluna por vez, escolhida pelas abas com contador, sem rolagem\n * lateral; os cards mudam de coluna pelo mesmo menu.\n * Altura: o quadro ocupa o que sobra da tela abaixo dele e nunca passa disso; cada etapa rola\n * por dentro e vai mostrando mais cards ao chegar no fim (rolagem infinita).\n */\n\n/** Marca o fim da lista: ao aparecer na rolagem da etapa, pede mais cards. */\nfunction LoadMore({ onVisible }: { onVisible: () => void }) {\n const ref = useRef<HTMLLIElement>(null)\n const cb = useRef(onVisible)\n cb.current = onVisible\n useEffect(() => {\n const el = ref.current\n if (!el) return\n const io = new IntersectionObserver(\n (entries) => entries.some((e) => e.isIntersecting) && cb.current(),\n { root: el.closest('[data-kanban-scroll]'), rootMargin: '120px' },\n )\n io.observe(el)\n return () => io.disconnect()\n }, [])\n return (\n <li ref={ref} className=\"py-2 text-center text-xs text-muted-foreground\">\n Carregando mais cards...\n </li>\n )\n}\n\nexport interface KanbanColumn {\n id: string\n title: string\n /** Cor do marcador da coluna. */\n tone?: BadgeProps['tone']\n /** Limite de cards (WIP). Passando dele, o contador fica em alerta. */\n limit?: number\n /**\n * Dias máximos de um card nesta etapa. Passando disso (pela `enteredColumnAt` do card), a\n * cadência está vencida. Sem ela, a etapa nunca vence. Aparece no cabeçalho da coluna.\n */\n cadenceDays?: number\n}\n\n/** Contador de quadros, só para o `layoutId` dos cards em `on` (um prefixo por instância). */\nlet boardsCreated = 0\n\n/** Próxima atividade agendada do card: tipo, data com hora e com quem. */\nexport interface KanbanActivity {\n /** Ex.: \"Reunião\", \"Ligação\". Só aparece no hint do calendário. */\n type: string\n /** Data e hora da atividade. */\n at: Date\n /** Com quem (pessoa de contato). */\n with?: string\n}\n\nexport interface KanbanCard {\n id: string\n columnId: string\n /** Empresa ou pessoa. */\n title: string\n /** Linha abaixo do título: CNPJ da empresa ou CPF da pessoa. */\n subtitle?: string\n description?: string\n /** Pessoa de contato: nome, telefone e e-mail. */\n contact?: { name?: string; phone?: string; email?: string }\n tags?: { label: string; tone?: BadgeProps['tone'] }[]\n /** Nome do responsável (vira avatar com iniciais). */\n assignee?: string\n dueDate?: Date\n /** Valor ou informação curta à direita do rodapé (ex.: \"R$ 12.500,00\"). */\n meta?: string\n /** Valores numéricos do card, pelas chaves de valueFields (ex.: { ps: 4800, mrr: 590 }). */\n values?: Record<string, number>\n /**\n * Próxima atividade. Com ela (ou com `cadenceDays` em alguma etapa) o quadro passa a\n * colorir o card pela situação e a mostrar o calendário no lugar do `dueDate`.\n */\n activity?: KanbanActivity\n /**\n * Quando o card entrou na etapa atual. Quem usa o componente atualiza esta data ao mover\n * o card, para a contagem da cadência recomeçar.\n */\n enteredColumnAt?: Date\n}\n\n/** Valor somado no cabeçalho da coluna e mostrado no card (ex.: P&S e MRR). */\nexport interface KanbanValueField {\n key: string\n label: string\n}\n\n/** Confirmação opcional de um destino de arraste: abre um modal antes de agir. */\nexport interface KanbanDropConfirm {\n title: string\n description: string\n /** Texto do botão. Padrão: o `label` do destino. */\n confirmLabel?: string\n /** Botão destrutivo (ex.: Perder). */\n destructive?: boolean\n /** Motivos a escolher; o escolhido chega como terceiro argumento de `onDropTarget`. */\n reasons?: { value: string; label: string }[]\n}\n\n/**\n * Destino de arraste (etapa A14): uma ação para onde o card vai, diferente de \"outra\n * coluna\" (ex.: \"Marcar como ganho\", \"Arquivar\"). Aparece numa barra durante o arraste e\n * como opção do menu \"Mover para\" (equivalente por teclado, sempre disponível).\n */\nexport interface KanbanDropTarget {\n id: string\n label: string\n /** Texto curto de apoio, mostrado abaixo do rótulo na barra. */\n hint?: string\n icon?: ReactNode\n tone?: BadgeProps['tone']\n disabled?: boolean\n /** Motivo mostrado quando desabilitado; o destino recusa o solto. */\n disabledReason?: string\n /** Sem ela, o destino age na hora. Com ela, abre a confirmação (mouse, toque e menu). */\n confirm?: KanbanDropConfirm\n}\n\nexport interface KanbanProps {\n columns: KanbanColumn[]\n cards: KanbanCard[]\n /** Card movido: coluna de destino e posição dentro dela (0 = topo). */\n onCardMove?: (cardId: string, toColumnId: string, toIndex: number) => void\n onCardClick?: (card: KanbanCard) => void\n /** Botão (+) no título de cada etapa. */\n onAddCard?: (columnId: string) => void\n /** Cards mostrados por vez em cada etapa; ao rolar até o fim, mostra mais. Padrão: 20. */\n pageSize?: number\n /**\n * Busca mais cards no servidor quando a etapa chega ao fim do que já foi carregado.\n * Sem ela, a rolagem infinita só vai revelando os cards recebidos em cards.\n */\n onLoadMore?: (columnId: string) => void\n /** A etapa ainda tem cards no servidor (usado com onLoadMore). */\n hasMore?: (columnId: string) => boolean\n /** Etapas visíveis por vez no desktop; as demais pela rolagem lateral. Padrão: 5. */\n visibleColumns?: number\n /** Conteúdo próprio do card, no lugar do padrão (substitui também calendário e valores). */\n renderCard?: (card: KanbanCard) => ReactNode\n /**\n * Valores do card (até 2, empilhados no rodapé) e o total de cada um na coluna, com o\n * percentual sobre o total do quadro. Ex.: [{ key: 'ps', label: 'P&S' }, { key: 'mrr', label: 'MRR' }].\n */\n valueFields?: KanbanValueField[]\n /** Formato dos valores. Padrão: moeda (R$ 1.250,00). */\n formatValue?: (n: number) => string\n /**\n * Destinos de arraste além das colunas (ex.: \"Marcar como ganho\"). Com eles, mostra uma\n * barra durante o arraste e o menu \"Mover para\" passa a listar estes destinos.\n */\n dropTargets?: KanbanDropTarget[]\n /**\n * Card solto num destino da barra (ou escolhido no menu \"Mover para\"). `reason` é o motivo\n * escolhido na confirmação (destinos com `confirm.reasons`).\n */\n onDropTarget?: (cardId: string, targetId: string, reason?: string) => void\n /** Data de hoje, para o status e a cadência (injetável em teste). Padrão: agora. */\n referenceDate?: Date\n /** Liga a barra do quadro: busca, filtros, totais, Customizar e Novo card. */\n toolbar?: boolean\n /** \"Novo card\" da barra do quadro (sem coluna; o (+) da coluna segue com `onAddCard`). */\n onNewCard?: () => void\n /**\n * Chave do `localStorage` em que o Customizar guarda os campos escondidos (por navegador).\n * Sem ela, a escolha vale só enquanto o quadro está montado.\n */\n storageKey?: string\n 'aria-label'?: string\n className?: string\n}\n\nconst dotTone: Record<NonNullable<BadgeProps['tone']>, string> = {\n neutral: 'bg-muted-foreground',\n primary: 'bg-primary',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-destructive',\n info: 'bg-info',\n outline: 'bg-border',\n}\n\nconst targetIconTone: Record<NonNullable<BadgeProps['tone']>, string> = {\n neutral: 'text-muted-foreground',\n primary: 'text-primary-text',\n success: 'text-success',\n warning: 'text-warning',\n error: 'text-destructive',\n info: 'text-info',\n outline: 'text-foreground',\n}\n\n/** Fundo claro de cada destino do rodapé flutuante, pela cor da ação. */\nconst targetSoft: Record<NonNullable<BadgeProps['tone']>, string> = {\n neutral: 'bg-muted',\n primary: 'bg-primary-soft',\n success: 'bg-success-soft',\n warning: 'bg-warning-soft',\n error: 'bg-destructive-soft',\n info: 'bg-info-soft',\n outline: 'bg-card',\n}\n\n/** Destino realçado (card por cima): fundo forte com o `-foreground` dele em tudo. */\nconst targetStrong: Record<NonNullable<BadgeProps['tone']>, string> = {\n neutral: 'bg-muted text-foreground',\n primary: 'bg-primary text-primary-foreground',\n success: 'bg-success text-success-foreground',\n warning: 'bg-warning text-warning-foreground',\n error: 'bg-destructive text-destructive-foreground',\n info: 'bg-info text-info-foreground',\n outline: 'bg-muted text-foreground',\n}\n\n// ---------------------------------------------------------------- status do card\n\nexport interface KanbanCardStatus {\n /** Fundo do card: crítico, cadência vencida, sem atividade ou normal. */\n background: 'critical' | 'cadenceOverdue' | 'noActivity' | 'normal'\n /** Situação do calendário: em dia, vence hoje, atrasada ou sem atividade. */\n activity: 'onTime' | 'today' | 'late' | 'none'\n /** Dias de calendário na etapa; `null` sem `enteredColumnAt`. */\n daysInColumn: number | null\n /** Dias de atraso da atividade (0 fora de `late`). */\n daysLate: number\n}\n\n/**\n * Situação do card a partir da próxima atividade e da cadência da etapa. Compara por dia de\n * calendário; `referenceDate` é o \"hoje\" (injetável para teste).\n */\nexport function getKanbanCardStatus(\n card: KanbanCard,\n column: KanbanColumn | undefined,\n referenceDate: Date,\n): KanbanCardStatus {\n const daysInColumn = card.enteredColumnAt\n ? differenceInCalendarDays(referenceDate, card.enteredColumnAt)\n : null\n const cadenceOverdue =\n column?.cadenceDays !== undefined && daysInColumn !== null && daysInColumn > column.cadenceDays\n const ahead = card.activity ? differenceInCalendarDays(card.activity.at, referenceDate) : null\n const activity = ahead === null ? 'none' : ahead < 0 ? 'late' : ahead === 0 ? 'today' : 'onTime'\n const background =\n cadenceOverdue && (activity === 'late' || activity === 'none')\n ? 'critical'\n : cadenceOverdue\n ? 'cadenceOverdue'\n : activity === 'none'\n ? 'noActivity'\n : 'normal'\n return {\n background,\n activity,\n daysInColumn,\n daysLate: ahead !== null && ahead < 0 ? -ahead : 0,\n }\n}\n\n/** Classes literais completas (nada de classe montada por string). */\nconst statusBackground: Record<KanbanCardStatus['background'], string> = {\n critical: 'bg-critical-soft',\n cadenceOverdue: 'bg-destructive-soft',\n noActivity: 'bg-warning-soft',\n normal: 'bg-card',\n}\n\nconst activityIcon: Record<\n KanbanCardStatus['activity'],\n { icon: typeof CalendarDays; circle: string }\n> = {\n onTime: { icon: CalendarDays, circle: 'bg-info-soft text-info-soft-foreground' },\n today: { icon: CalendarClock, circle: 'bg-warning-mid text-warning-mid-foreground' },\n late: { icon: CalendarX2, circle: 'bg-destructive text-destructive-foreground' },\n none: {\n icon: CalendarDays,\n circle: 'border border-dashed border-muted-foreground text-muted-foreground',\n },\n}\n\nfunction plural(n: number, one: string, many: string) {\n return `${n} ${n === 1 ? one : many}`\n}\n\nfunction situationText(status: KanbanCardStatus) {\n if (status.activity === 'onTime') return 'Em dia'\n if (status.activity === 'today') return 'Vence hoje'\n if (status.activity === 'late') {\n return `Atrasada há ${plural(status.daysLate, 'dia', 'dias')}`\n }\n return 'Sem atividade agendada'\n}\n\n/** Texto para o leitor de tela: a cor do fundo nunca é a única informação. */\nfunction backgroundLabel(status: KanbanCardStatus) {\n if (status.background === 'critical') {\n return `Situação: crítico, cadência vencida e ${\n status.activity === 'late' ? 'atividade atrasada' : 'sem próxima atividade'\n }`\n }\n if (status.background === 'cadenceOverdue') return 'Situação: cadência vencida'\n if (status.background === 'noActivity') return 'Situação: sem atividade'\n return null\n}\n\nfunction whenText(at: Date, status: KanbanCardStatus) {\n return status.activity === 'today'\n ? `Hoje às ${format(at, 'HH:mm')}`\n : `${format(at, 'dd/MM/yyyy')} às ${format(at, 'HH:mm')}`\n}\n\n// ---------------------------------------------------------------- campos do Customizar\n\nconst baseFields = [\n { id: 'tags', label: 'Tags' },\n { id: 'document', label: 'CNPJ ou CPF' },\n { id: 'description', label: 'Descrição' },\n { id: 'contact', label: 'Contato' },\n { id: 'phone', label: 'Telefone' },\n { id: 'email', label: 'E-mail' },\n { id: 'activity', label: 'Atividade' },\n { id: 'assignee', label: 'Responsável' },\n] as const\n\ntype HiddenFields = Record<string, boolean>\n\n/** Lê os campos escondidos; qualquer falha do armazenamento cai no padrão (tudo visível). */\nfunction readHidden(storageKey?: string): HiddenFields {\n if (!storageKey) return {}\n try {\n const raw = localStorage.getItem(storageKey)\n const list: unknown = raw ? JSON.parse(raw) : []\n return Array.isArray(list)\n ? Object.fromEntries(list.filter((f) => typeof f === 'string').map((f) => [f, true]))\n : {}\n } catch {\n return {}\n }\n}\n\nfunction writeHidden(storageKey: string | undefined, hidden: HiddenFields) {\n if (!storageKey) return\n try {\n localStorage.setItem(storageKey, JSON.stringify(Object.keys(hidden).filter((k) => hidden[k])))\n } catch {\n // Armazenamento indisponível: a escolha segue só em memória.\n }\n}\n\n// ---------------------------------------------------------------- calendário com hint\n\nconst HINT_CLOSE_DELAY = 150\n\n/**\n * Calendário do card: ícone de situação, data ao lado e hint (tipo, quando, com quem,\n * responsável e situação). Abre por clique, toque, foco por teclado e mouse; o gatilho é um\n * botão fora do botão de clique do card.\n */\nfunction ActivityHint({ card, status }: { card: KanbanCard; status: KanbanCardStatus }) {\n const [open, setOpen] = useState(false)\n const pressed = useRef(false)\n // Botão do mouse (ou dedo) apertado no gatilho: nada fecha o hint até soltar. Sem isso, um\n // fechamento atrasado (timer de saída, clique \"fora\" do Radix, foco) que cai no meio do\n // aperto fecha o hint debaixo do dedo, e o clique seguinte o reabre (pisca).\n const holding = useRef(false)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const lastPointer = useRef('')\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const { icon: Icon, circle } = activityIcon[status.activity]\n const activity = card.activity\n const visible = activity\n ? status.activity === 'today'\n ? `Hoje ${format(activity.at, 'HH:mm')}`\n : format(activity.at, 'dd/MM/yyyy')\n : 'Sem atividade'\n const cancelClose = () => clearTimeout(timer.current)\n const scheduleClose = () => {\n cancelClose()\n timer.current = setTimeout(() => {\n if (!holding.current) setOpen(false)\n }, HINT_CLOSE_DELAY)\n }\n useEffect(() => cancelClose, [])\n return (\n <Popover open={open} onOpenChange={(next) => !next && !holding.current && setOpen(false)}>\n {/* Âncora, não `PopoverTrigger`: o Radix alternaria o hint a cada clique, e quem abre e\n fecha aqui é o hover, o foco e o clique, cada um com a sua regra. */}\n <PopoverAnchor asChild>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={`${visible}. ${situationText(status)}`}\n className=\"relative z-10 -ml-1 inline-flex cursor-pointer items-center gap-1 rounded-item px-1 tabular-nums outline-none focus-visible:ring-2 focus-visible:ring-ring max-md:min-h-touch\"\n onPointerDown={(e) => {\n cancelClose()\n pressed.current = true\n holding.current = true\n window.addEventListener('pointerup', () => (holding.current = false), { once: true })\n window.addEventListener('pointercancel', () => (holding.current = false), {\n once: true,\n })\n lastPointer.current = e.pointerType\n }}\n onPointerEnter={(e) => {\n if (e.pointerType !== 'mouse') return\n cancelClose()\n setOpen(true)\n }}\n onPointerLeave={(e) => e.pointerType === 'mouse' && scheduleClose()}\n onFocus={() => {\n if (!pressed.current) setOpen(true)\n }}\n onBlur={() => {\n pressed.current = false\n if (!holding.current) setOpen(false)\n }}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n pressed.current = false\n // Mouse: o hover já abriu; o clique não fecha. Toque e teclado alternam. O ponteiro é\n // lido antes do `setOpen`: a função dele roda depois, já com o ref limpo.\n const byMouse = lastPointer.current === 'mouse'\n lastPointer.current = ''\n setOpen((o) => byMouse || !o)\n }}\n >\n <span\n aria-hidden\n className={cn('flex size-6 shrink-0 items-center justify-center rounded-full', circle)}\n >\n <Icon className=\"size-3\" />\n </span>\n {visible}\n </button>\n </PopoverAnchor>\n <PopoverContent\n width=\"sm\"\n align=\"start\"\n className=\"flex flex-col gap-1 p-3 text-xs\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n // Apertar ou focar o próprio gatilho não é \"fora\" do hint.\n onInteractOutside={(e) => {\n if (triggerRef.current?.contains(e.target as Node)) e.preventDefault()\n }}\n onPointerEnter={cancelClose}\n onPointerLeave={scheduleClose}\n >\n {activity ? (\n <>\n <p className=\"text-sm font-medium\">\n {activity.type} · {whenText(activity.at, status)}\n </p>\n {activity.with && <p>Com: {activity.with}</p>}\n </>\n ) : null}\n {card.assignee && <p>Responsável: {card.assignee}</p>}\n <p className=\"font-medium\">{situationText(status)}</p>\n </PopoverContent>\n </Popover>\n )\n}\n\n// ---------------------------------------------------------------- corpo e rodapé do card\n\nfunction CardBody({\n card,\n show,\n withHandle,\n}: {\n card: KanbanCard\n /** Campo visível? (o Customizar esconde; Empresa fica sempre). */\n show: (field: string) => boolean\n /** Reserva o espaço da alça de arraste no toque, à esquerda do título. */\n withHandle?: boolean\n}) {\n return (\n <>\n {show('tags') && card.tags && card.tags.length > 0 && (\n <span className=\"flex flex-wrap gap-1\">\n {card.tags.map((t) => (\n <Badge key={t.label} tone={t.tone ?? 'neutral'}>\n {t.label}\n </Badge>\n ))}\n </span>\n )}\n {/* Só o título reserva o espaço do botão de ações (e da alça, no toque). */}\n <span className={cn('flex flex-col pr-8', withHandle && 'pl-8')}>\n <span className=\"line-clamp-2 text-sm font-medium\">{card.title}</span>\n {show('document') && card.subtitle && (\n <span className=\"text-xs text-muted-foreground tabular-nums\">{card.subtitle}</span>\n )}\n </span>\n {show('description') && card.description && (\n <span className=\"line-clamp-2 text-xs text-muted-foreground\">{card.description}</span>\n )}\n {card.contact && (\n <span className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {show('contact') && card.contact.name && (\n <span className=\"flex min-w-0 items-center gap-1 text-foreground\">\n <User className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"truncate\">{card.contact.name}</span>\n </span>\n )}\n {show('phone') && card.contact.phone && (\n <span className=\"flex min-w-0 items-center gap-1 tabular-nums\">\n <Phone className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"truncate\">{card.contact.phone}</span>\n </span>\n )}\n {show('email') && card.contact.email && (\n <span className=\"flex min-w-0 items-center gap-1\">\n <Mail className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"truncate\">{card.contact.email}</span>\n </span>\n )}\n </span>\n )}\n </>\n )\n}\n\n/**\n * Rodapé do card, fora do botão de clique: linha de calendário, meta e responsável e, depois\n * de uma divisória, os valores empilhados. Sem `renderCard` apenas.\n */\nfunction cardFooter({\n card,\n status,\n show,\n valueFields,\n formatValue,\n}: {\n card: KanbanCard\n /** `null` quando o quadro não traz atividade nem cadência: o card fica como sempre foi. */\n status: KanbanCardStatus | null\n show: (field: string) => boolean\n valueFields: KanbanValueField[]\n formatValue: (n: number) => string\n}): ReactNode {\n const calendar = show('activity') ? (\n status ? (\n <ActivityHint card={card} status={status} />\n ) : (\n card.dueDate && (\n <span className=\"inline-flex items-center gap-1 tabular-nums\">\n <CalendarDays className=\"size-3\" aria-hidden />\n {format(card.dueDate, 'dd/MM/yyyy')}\n </span>\n )\n )\n ) : null\n const assignee = show('assignee') ? card.assignee : undefined\n const values = valueFields.slice(0, 2).filter((f) => show(`value:${f.key}`))\n const hasRow = Boolean(calendar || assignee || card.meta)\n if (!hasRow && values.length === 0) return null\n return (\n <>\n {hasRow && (\n <span className=\"flex items-center gap-2 border-t pt-2 text-xs text-muted-foreground\">\n {calendar}\n {card.meta && (\n <span className=\"font-medium text-foreground tabular-nums\">{card.meta}</span>\n )}\n {assignee && (\n <span className=\"ml-auto\" title={assignee}>\n <Avatar name={assignee} size=\"sm\" />\n </span>\n )}\n </span>\n )}\n {values.length > 0 && (\n <span className=\"flex flex-col gap-1 border-t pt-2 text-xs\">\n {values.map((f) => (\n <span key={f.key} className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-muted-foreground\">{f.label}:</span>\n <span className=\"truncate font-semibold text-foreground tabular-nums\">\n {formatValue(card.values?.[f.key] ?? 0)}\n </span>\n </span>\n ))}\n </span>\n )}\n </>\n )\n}\n\n/** Sem acento e sem diferença de maiúscula, para a busca. */\nfunction normalize(text: string) {\n const marks = new RegExp(`[${String.fromCharCode(0x300)}-${String.fromCharCode(0x36f)}]`, 'g')\n return text.normalize('NFD').replace(marks, '').toLowerCase()\n}\n\n/**\n * Posição, na lista completa da coluna, de um índice da lista desenhada (que pode ser só uma\n * parte dela, por busca, filtro ou paginação). Fim da lista desenhada = logo depois do último\n * card desenhado; sem card desenhado = fim da lista completa.\n */\nfunction toFullIndex(full: KanbanCard[], drawn: KanbanCard[], drawnIndex: number) {\n if (drawn.length === 0) return full.length\n if (drawnIndex < drawn.length) return full.indexOf(drawn[drawnIndex]!)\n return full.indexOf(drawn[drawn.length - 1]!) + 1\n}\n\nconst situationOptions = [\n { value: 'critical', label: 'Crítico' },\n { value: 'cadenceOverdue', label: 'Cadência vencida' },\n { value: 'noActivity', label: 'Sem atividade' },\n { value: 'late', label: 'Atividade atrasada' },\n]\n\nexport function Kanban({\n columns,\n cards,\n onCardMove,\n onCardClick,\n onAddCard,\n renderCard,\n valueFields,\n formatValue = (n) => n.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' }),\n pageSize = 20,\n visibleColumns = 5,\n onLoadMore,\n hasMore,\n dropTargets,\n onDropTarget,\n referenceDate,\n toolbar,\n onNewCard,\n storageKey,\n className,\n ...aria\n}: KanbanProps) {\n const code = resolveCatalogCode('Kanban', { hasDropTargets: Boolean(dropTargets?.length) })\n const { isMobile } = useBreakpoint()\n const motion = useMotionMode()\n const lib = useMotionLib()\n const ready = useLayoutReady()\n const presets = useMotionPresets()\n // Prefixo do layoutId dos cards: dois quadros na mesma tela não trocam cards entre si. Sem\n // `useId`, que consumiria a sequência de ids do React também em `off`.\n const [boardId] = useState(() => `rendra-kanban-${++boardsCreated}`)\n const boardRef = useFillHeight()\n // Touchpad: o gesto lateral leva o quadro para o mesmo lado dos dedos (esquerda move o\n // quadro para a esquerda). A rolagem vertical segue normal dentro de cada etapa.\n useEffect(() => {\n const el = boardRef.current\n if (!el || isMobile) return\n const onWheel = (e: WheelEvent) => {\n if (Math.abs(e.deltaX) <= Math.abs(e.deltaY)) return\n e.preventDefault()\n el.scrollLeft -= e.deltaX\n }\n el.addEventListener('wheel', onWheel, { passive: false })\n return () => el.removeEventListener('wheel', onWheel)\n }, [boardRef, isMobile])\n const [shown, setShown] = useState<Record<string, number>>({})\n const limitOf = (id: string) => shown[id] ?? pageSize\n const [active, setActive] = useState(columns[0]?.id ?? '')\n const [dragging, setDragging] = useState<string | null>(null)\n const [over, setOver] = useState<{ column: string; index: number } | null>(null)\n // Destino da barra sob o mouse (o do toque vem de `touchDrag.overTargetId`).\n const [overTarget, setOverTarget] = useState<string | null>(null)\n // Arraste por toque (motor de src/lib/sortable.ts): reordena dentro da coluna sem\n // dropTargets, ou solta num destino da barra quando dropTargets está presente.\n const [touchDrag, setTouchDrag] = useState<{\n cardId: string\n overTargetId: string | null\n } | null>(null)\n // Destino com `confirm`: o card volta ao lugar e o modal espera a decisão.\n const [pendingDrop, setPendingDrop] = useState<{ cardId: string; targetId: string } | null>(null)\n const [reason, setReason] = useState('')\n\n // Barra do quadro: busca, filtros e Customizar. Sem `toolbar`, nada disso é usado.\n const [query, setQuery] = useState('')\n const [assigneeFilter, setAssigneeFilter] = useState<string | null>(null)\n const [situationFilter, setSituationFilter] = useState<string | null>(null)\n const [customizing, setCustomizing] = useState(false)\n // Por que não `boardId`: ele muda a cada montagem (F24) e não serve de chave guardada.\n const [hidden, setHidden] = useState<HiddenFields>(() => readHidden(storageKey))\n const changeHidden = (next: HiddenFields) => {\n setHidden(next)\n writeHidden(storageKey, next)\n }\n const show = (field: string) => !hidden[field]\n\n const today = referenceDate ?? new Date()\n const statusEnabled =\n columns.some((c) => c.cadenceDays !== undefined) || cards.some((c) => c.activity)\n const statusOf = (card: KanbanCard) =>\n statusEnabled\n ? getKanbanCardStatus(\n card,\n columns.find((c) => c.id === card.columnId),\n today,\n )\n : null\n\n const filtering = toolbar && (query.trim() !== '' || assigneeFilter || situationFilter)\n const matches = (card: KanbanCard) => {\n const q = normalize(query.trim())\n if (\n q &&\n ![card.title, card.subtitle, card.contact?.name].some((t) => t && normalize(t).includes(q))\n )\n return false\n if (assigneeFilter && card.assignee !== assigneeFilter) return false\n if (situationFilter) {\n const status = statusOf(card)\n if (!status) return false\n if (\n situationFilter === 'late'\n ? status.activity !== 'late'\n : status.background !== situationFilter\n )\n return false\n }\n return true\n }\n const visibleCards = filtering ? cards.filter(matches) : cards\n\n /** Lista completa da coluna: a única fonte do índice que sai em `onCardMove`. */\n const inColumn = (id: string) => cards.filter((c) => c.columnId === id)\n /** Lista visível (busca e filtros): cards desenhados, contagem, totais, paginação e abas. */\n const visibleInColumn = (id: string) => visibleCards.filter((c) => c.columnId === id)\n\n const drop = (columnId: string, index: number) => {\n if (dragging) {\n // O mouse trabalha com o índice da lista desenhada; `onCardMove` quer o da completa.\n const drawn = visibleInColumn(columnId).slice(0, limitOf(columnId))\n onCardMove?.(dragging, columnId, toFullIndex(inColumn(columnId), drawn, index))\n }\n setDragging(null)\n setOver(null)\n setOverTarget(null)\n }\n\n const draggingCardId = dragging ?? touchDrag?.cardId ?? null\n const showTargetBar = Boolean(dropTargets?.length) && draggingCardId !== null\n\n const dropOnTarget = (cardId: string, targetId: string) => {\n const target = dropTargets?.find((t) => t.id === targetId)\n if (!target || target.disabled) return\n if (target.confirm) {\n setReason(target.confirm.reasons?.[0]?.value ?? '')\n setPendingDrop({ cardId, targetId })\n return\n }\n onDropTarget?.(cardId, targetId)\n }\n\n const startTouchDrag = (card: KanbanCard, e: ReactPointerEvent<HTMLElement>) => {\n const hasTargets = Boolean(dropTargets?.length && onDropTarget)\n if (!onCardMove && !hasTargets) return\n // Variável comum (não estado): guarda o destino sob o dedo para o onEnd ler direto,\n // sem efeito colateral dentro do updater do setState (StrictMode chamaria duas vezes).\n let overTargetId: string | null = null\n setTouchDrag({ cardId: card.id, overTargetId: null })\n bindPointerDrag(e.currentTarget, e, {\n onMove: (x, y) => {\n // A barra de destinos continua reconhecendo colunas por baixo: o toque só usa\n // a barra quando o dedo está de fato sobre ela, nunca no lugar da coluna.\n const targetHit = hasTargets ? findDragTarget(x, y, 'data-kanban-target') : null\n overTargetId = targetHit?.id ?? null\n if (targetHit) {\n setTouchDrag({ cardId: card.id, overTargetId: targetHit.id })\n return\n }\n if (hasTargets) setTouchDrag({ cardId: card.id, overTargetId: null })\n if (!onCardMove) return\n const found = findDragTarget(x, y, 'data-kanban-card')\n if (found && found.id !== card.id) {\n // O alvo achado na tela já dá o índice da lista completa (ids de `inColumn`).\n const list = inColumn(card.columnId)\n const toIndex = resolveDropIndex(\n list.map((c) => c.id),\n found,\n )\n onCardMove(card.id, card.columnId, toIndex)\n }\n },\n onEnd: () => {\n setTouchDrag(null)\n if (overTargetId) dropOnTarget(card.id, overTargetId)\n },\n })\n }\n\n const moveMenu = (card: KanbanCard) => {\n const hasTargets = Boolean(dropTargets?.length && onDropTarget)\n const otherColumns = onCardMove ? columns.filter((c) => c.id !== card.columnId) : []\n if (otherColumns.length === 0 && !hasTargets) return null\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Ações do card ${card.title}`}\n className=\"shrink-0\"\n >\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {otherColumns.length > 0 && (\n <>\n <DropdownMenuLabel>Mover para</DropdownMenuLabel>\n {otherColumns.map((c) => (\n <DropdownMenuItem\n key={c.id}\n onSelect={() => onCardMove?.(card.id, c.id, inColumn(c.id).length)}\n >\n <ArrowRightLeft />\n {c.title}\n </DropdownMenuItem>\n ))}\n </>\n )}\n {otherColumns.length > 0 && hasTargets && <DropdownMenuSeparator />}\n {hasTargets &&\n dropTargets!.map((t) => (\n <DropdownMenuItem\n key={t.id}\n disabled={t.disabled}\n onSelect={() => dropOnTarget(card.id, t.id)}\n >\n {t.icon ?? <ArrowRightLeft />}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate\">{t.label}</span>\n {t.disabled && t.disabledReason && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {t.disabledReason}\n </span>\n )}\n </span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n }\n\n /** Rodapé flutuante de destinos, mostrado durante o arraste (mouse ou toque). */\n const highlightedTarget = overTarget ?? touchDrag?.overTargetId ?? null\n const targetBar = showTargetBar && (\n <div\n aria-label=\"Soltar em\"\n className=\"fixed inset-x-4 bottom-4 z-30 grid grid-cols-2 gap-2 rounded-surface border bg-card p-2 shadow-lg md:flex md:justify-center md:overflow-x-auto\"\n >\n {dropTargets!.map((t) => {\n const tone = t.tone ?? 'neutral'\n const highlighted = !t.disabled && highlightedTarget === t.id\n return (\n <div\n key={t.id}\n data-kanban-target={t.id}\n data-over={highlighted ? 'true' : undefined}\n onDragEnter={() => {\n if (dragging && !t.disabled) setOverTarget(t.id)\n }}\n onDragOver={(e) => {\n if (dragging && !t.disabled) {\n e.preventDefault()\n setOverTarget(t.id)\n }\n }}\n onDragLeave={(e) => {\n // Passar do chip para o ícone ou o texto dentro dele não é sair do chip.\n if (e.relatedTarget instanceof Node && e.currentTarget.contains(e.relatedTarget))\n return\n setOverTarget((id) => (id === t.id ? null : id))\n }}\n onDrop={(e) => {\n e.preventDefault()\n setOverTarget(null)\n if (dragging) {\n dropOnTarget(dragging, t.id)\n setDragging(null)\n }\n }}\n className={cn(\n 'flex min-w-24 flex-col items-center gap-1 rounded-block border p-2 text-center text-xs transition-colors',\n t.disabled\n ? 'cursor-not-allowed bg-muted opacity-50'\n : highlighted\n ? cn(targetStrong[tone], 'ring-2 ring-ring')\n : targetSoft[tone],\n )}\n >\n {t.icon && (\n <span aria-hidden className={highlighted ? undefined : targetIconTone[tone]}>\n {t.icon}\n </span>\n )}\n <span className=\"font-medium\">{t.label}</span>\n {t.hint && !t.disabled && (\n <span className={highlighted ? undefined : 'text-muted-foreground'}>{t.hint}</span>\n )}\n {t.disabled && t.disabledReason && (\n <span className=\"text-muted-foreground\">{t.disabledReason}</span>\n )}\n </div>\n )\n })}\n </div>\n )\n\n const canTouchDrag = Boolean(onCardMove) || Boolean(dropTargets?.length && onDropTarget)\n const showHandle = isMobile && canTouchDrag\n\n const cardItem = (card: KanbanCard, index: number) => {\n const dragStart = (dataTransfer: DataTransfer | null) => {\n setDragging(card.id)\n if (!dataTransfer) return\n dataTransfer.effectAllowed = 'move'\n dataTransfer.setData('text/plain', card.id)\n }\n const dragEnd = () => {\n setDragging(null)\n setOver(null)\n setOverTarget(null)\n }\n const status = statusOf(card)\n const label = status && backgroundLabel(status)\n const common = {\n 'data-kanban-card': card.id,\n draggable: !isMobile && Boolean(onCardMove),\n onDragOver: (e: ReactDragEvent<HTMLLIElement>) => {\n if (!dragging) return\n e.preventDefault()\n e.stopPropagation()\n const r = e.currentTarget.getBoundingClientRect()\n const after = e.clientY > r.top + r.height / 2\n setOver({ column: card.columnId, index: index + (after ? 1 : 0) })\n },\n onDrop: (e: ReactDragEvent<HTMLLIElement>) => {\n e.preventDefault()\n e.stopPropagation()\n if (over) drop(over.column, over.index)\n },\n className: cn(\n 'relative flex rounded-block border',\n status ? statusBackground[status.background] : 'bg-card',\n 'p-3 shadow-sm transition-[box-shadow,opacity]',\n !isMobile && onCardMove && 'cursor-grab active:cursor-grabbing',\n (dragging === card.id || touchDrag?.cardId === card.id) && 'opacity-50',\n over?.column === card.columnId &&\n over.index === index &&\n dragging !== card.id &&\n 'ring-2 ring-ring ring-offset-2 ring-offset-muted',\n ),\n }\n const content = renderCard ? (\n renderCard(card)\n ) : (\n <CardBody card={card} show={show} withHandle={showHandle} />\n )\n // Sem rodapé (card só com título, descrição e contato), a estrutura é a de sempre; com\n // rodapé, o corpo e o rodapé viram irmãos num envoltório (o calendário é um botão e não\n // pode ficar dentro do botão de clique do card).\n const footer = renderCard\n ? null\n : cardFooter({\n card,\n status,\n show,\n valueFields: valueFields ?? [],\n formatValue,\n })\n const main = onCardClick ? (\n <button\n type=\"button\"\n onClick={() => onCardClick(card)}\n className={\n footer\n ? 'flex min-w-0 cursor-pointer flex-col gap-2 rounded-block text-left outline-none after:absolute after:inset-0 focus-visible:ring-2 focus-visible:ring-ring'\n : 'flex min-w-0 flex-1 cursor-pointer flex-col gap-2 rounded-block text-left outline-none after:absolute after:inset-0 focus-visible:ring-2 focus-visible:ring-ring'\n }\n >\n {content}\n </button>\n ) : (\n <div\n className={footer ? 'flex min-w-0 flex-col gap-2' : 'flex min-w-0 flex-1 flex-col gap-2'}\n >\n {content}\n </div>\n )\n const body = (\n <>\n {footer ? (\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n {main}\n {footer}\n </div>\n ) : (\n main\n )}\n {label && <span className=\"sr-only\">{label}</span>}\n {showHandle && (\n <button\n type=\"button\"\n aria-label={`Arrastar ${card.title}`}\n className=\"absolute top-2 left-2 z-10 flex size-touch touch-none items-center justify-center rounded-item text-muted-foreground active:cursor-grabbing\"\n onPointerDown={(e) => startTouchDrag(card, e)}\n >\n <GripVertical className=\"size-icon-sm\" aria-hidden />\n </button>\n )}\n <span className=\"absolute top-2 right-2 z-10\">{moveMenu(card)}</span>\n </>\n )\n\n if (lib) {\n const layout = layoutEnabled({ mode: motion, ready, dragging: touchDrag !== null })\n // O Motion toma `onDragStart`/`onDragEnd` para o gesto de arraste dele e os tira do DOM.\n // O arraste nativo (HTML5) do desktop segue por ouvintes `dragstart`/`dragend` ligados\n // direto no elemento; o layout só liga fora do arraste por toque (o arraste nativo não\n // muda a ordem até soltar, e ao soltar o layout anima o resultado).\n return (\n <lib.m.li\n key={card.id}\n ref={(el) => {\n if (!el) return\n const onStart = (e: DragEvent) => dragStart(e.dataTransfer)\n el.addEventListener('dragstart', onStart)\n el.addEventListener('dragend', dragEnd)\n return () => {\n el.removeEventListener('dragstart', onStart)\n el.removeEventListener('dragend', dragEnd)\n }\n }}\n layout={layout}\n layoutId={layout ? `${boardId}-${card.id}` : undefined}\n transition={presets.settle}\n {...common}\n >\n {body}\n </lib.m.li>\n )\n }\n return (\n <li\n key={card.id}\n onDragStart={(e) => dragStart(e.dataTransfer)}\n onDragEnd={dragEnd}\n {...common}\n >\n {body}\n </li>\n )\n }\n\n const totalFields = (valueFields ?? []).slice(0, 2)\n const sumOf = (list: KanbanCard[], key: string) =>\n list.reduce((sum, c) => sum + (c.values?.[key] ?? 0), 0)\n // Total do quadro visível: só os cards de etapas que o quadro mostra.\n const boardCards = visibleCards.filter((c) => columns.some((col) => col.id === c.columnId))\n const totals = (col: KanbanColumn) =>\n totalFields.map((f) => {\n const total = sumOf(visibleInColumn(col.id), f.key)\n const board = sumOf(boardCards, f.key)\n return { ...f, total, percent: board === 0 ? 0 : Math.round((total / board) * 100) }\n })\n\n const columnHeader = (col: KanbanColumn, count: number) => (\n <div className=\"flex flex-col gap-2 px-1\">\n <div className=\"flex items-center gap-2\">\n <span aria-hidden className={cn('size-2 rounded-full', dotTone[col.tone ?? 'neutral'])} />\n <h3 className=\"min-w-0 flex-1 truncate text-sm font-semibold\">{col.title}</h3>\n <Badge tone={col.limit && count > col.limit ? 'warning' : 'neutral'}>\n {col.limit ? `${count}/${col.limit}` : count}\n </Badge>\n {onAddCard && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Adicionar card em ${col.title}`}\n onClick={() => onAddCard(col.id)}\n className=\"-my-1 -mr-1 rounded-full\"\n >\n <Plus />\n </Button>\n )}\n </div>\n {col.cadenceDays !== undefined && (\n <p className=\"text-xs text-muted-foreground\">\n Cadência: {plural(col.cadenceDays, 'dia', 'dias')}\n </p>\n )}\n {valueFields && valueFields.length > 0 && (\n <div className=\"grid grid-cols-2 divide-x rounded-block bg-card text-xs\">\n {totals(col).map((t) => (\n <span key={t.key} className=\"flex min-w-0 flex-col px-2 py-1\">\n <span className=\"text-muted-foreground\">Total {t.label}</span>\n <span className=\"truncate font-semibold tabular-nums\">{formatValue(t.total)}</span>\n <span className=\"text-muted-foreground tabular-nums\">({t.percent}%)</span>\n </span>\n ))}\n </div>\n )}\n </div>\n )\n\n const columnList = (col: KanbanColumn) => {\n const all = visibleInColumn(col.id)\n const list = all.slice(0, limitOf(col.id))\n const more = all.length > list.length || Boolean(hasMore?.(col.id))\n return (\n <div\n data-kanban-scroll\n className=\"min-h-0 flex-1 scrollbar-subtle overflow-y-auto overscroll-y-contain\"\n >\n <ol\n // Remonta uma vez quando o domMax chega: o layout só vale para cards criados depois.\n key={String(ready)}\n aria-label={`Cards em ${col.title}`}\n onDragOver={(e) => {\n if (!dragging) return\n e.preventDefault()\n setOver({ column: col.id, index: list.length })\n }}\n onDrop={(e) => {\n e.preventDefault()\n drop(col.id, over?.column === col.id ? over.index : list.length)\n }}\n className={cn(\n 'flex min-h-24 flex-col gap-2 rounded-surface p-2 transition-colors',\n over?.column === col.id && 'bg-primary-soft/60',\n )}\n >\n {list.map((c, i) => cardItem(c, i))}\n {list.length === 0 && (\n <li className=\"flex min-h-16 items-center justify-center rounded-item border border-dashed text-xs text-muted-foreground\">\n Nenhum card\n </li>\n )}\n {more && (\n <LoadMore\n onVisible={() => {\n if (all.length > list.length)\n setShown((s) => ({ ...s, [col.id]: limitOf(col.id) + pageSize }))\n else onLoadMore?.(col.id)\n }}\n />\n )}\n </ol>\n </div>\n )\n }\n\n // ------------------------------------------------------------ barra do quadro\n\n const assignees = [...new Set(cards.map((c) => c.assignee).filter((a): a is string => !!a))].sort(\n (a, b) => a.localeCompare(b, 'pt-BR'),\n )\n const filterCount = (assigneeFilter ? 1 : 0) + (situationFilter ? 1 : 0)\n const hasFilters = assignees.length > 0 || statusEnabled\n const toolbarNode = toolbar && (\n <DataToolbar\n search={{ value: query, onChange: setQuery, placeholder: 'Buscar card' }}\n filters={\n hasFilters ? (\n <div className=\"flex flex-col gap-4\">\n {assignees.length > 0 && (\n <Field label=\"Responsável\" span=\"full\">\n <Select\n placeholder=\"Todos\"\n clearable\n options={assignees.map((a) => ({ value: a, label: a }))}\n value={assigneeFilter}\n onChange={setAssigneeFilter}\n />\n </Field>\n )}\n {statusEnabled && (\n <Field label=\"Situação\" span=\"full\">\n <Select\n placeholder=\"Todas\"\n clearable\n options={situationOptions}\n value={situationFilter}\n onChange={setSituationFilter}\n />\n </Field>\n )}\n </div>\n ) : undefined\n }\n filterCount={filterCount}\n onClearFilters={() => {\n setAssigneeFilter(null)\n setSituationFilter(null)\n }}\n summary={\n totalFields.length > 0\n ? totalFields.map((f) => (\n <span key={f.key} className=\"flex items-baseline gap-1\">\n <span className=\"text-muted-foreground\">Total {f.label}:</span>\n <span className=\"font-semibold tabular-nums\">\n {formatValue(sumOf(boardCards, f.key))}\n </span>\n </span>\n ))\n : undefined\n }\n actions={\n <Button variant=\"outline\" icon={<Settings2 />} onClick={() => setCustomizing(true)}>\n Customizar\n </Button>\n }\n primaryAction={\n onNewCard ? (\n <Button icon={<Plus />} onClick={() => onNewCard()}>\n Novo card\n </Button>\n ) : undefined\n }\n />\n )\n\n const customizeFields = [\n ...baseFields.map((f) => ({ id: f.id as string, label: f.label as string })),\n ...totalFields.map((f) => ({ id: `value:${f.key}`, label: f.label })),\n ]\n const customizeDrawer = toolbar && (\n <Drawer\n open={customizing}\n onOpenChange={setCustomizing}\n title=\"Customizar\"\n icon={<Settings2 />}\n footer={\n <ActionBar\n cancel={{ label: 'Restaurar', onClick: () => changeHidden({}) }}\n primary={{ label: 'Pronto', onClick: () => setCustomizing(false) }}\n />\n }\n >\n <div className=\"flex flex-col gap-1\">\n {customizeFields.map((f) => (\n <Checkbox\n key={f.id}\n label={f.label}\n checked={show(f.id)}\n onCheckedChange={(checked) => changeHidden({ ...hidden, [f.id]: !checked })}\n />\n ))}\n </div>\n </Drawer>\n )\n\n // ------------------------------------------------------------ confirmação do destino\n\n const pendingTarget = pendingDrop && dropTargets?.find((t) => t.id === pendingDrop.targetId)\n const pendingCard = pendingDrop && cards.find((c) => c.id === pendingDrop.cardId)\n // O card saiu do quadro por outro caminho com o modal aberto: fecha sem agir.\n useEffect(() => {\n if (pendingDrop && !pendingCard) setPendingDrop(null)\n }, [pendingDrop, pendingCard])\n const confirmation =\n pendingDrop && pendingTarget?.confirm && pendingCard ? (\n <Modal\n open\n onOpenChange={(next) => !next && setPendingDrop(null)}\n type={pendingTarget.confirm.destructive ? 'destructive' : 'confirm'}\n title={pendingTarget.confirm.title}\n description={pendingTarget.confirm.description}\n confirmLabel={pendingTarget.confirm.confirmLabel ?? pendingTarget.label}\n onConfirm={() =>\n onDropTarget?.(pendingDrop.cardId, pendingDrop.targetId, reason || undefined)\n }\n >\n <dl className=\"flex w-full flex-col gap-1 rounded-block bg-muted p-3 text-left text-sm\">\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-muted-foreground\">Empresa</dt>\n <dd className=\"font-medium\">{pendingCard.title}</dd>\n </div>\n {pendingCard.subtitle && (\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-muted-foreground\">Documento</dt>\n <dd className=\"tabular-nums\">{pendingCard.subtitle}</dd>\n </div>\n )}\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-muted-foreground\">Etapa</dt>\n <dd>{columns.find((c) => c.id === pendingCard.columnId)?.title}</dd>\n </div>\n {totalFields.map((f) => (\n <div key={f.key} className=\"flex justify-between gap-2\">\n <dt className=\"text-muted-foreground\">{f.label}:</dt>\n <dd className=\"font-semibold tabular-nums\">\n {formatValue(pendingCard.values?.[f.key] ?? 0)}\n </dd>\n </div>\n ))}\n </dl>\n {pendingTarget.confirm.reasons && (\n <div className=\"flex w-full flex-col gap-1 text-left\">\n <span className=\"text-sm font-medium\">Motivo</span>\n <Select\n label=\"Motivo\"\n options={pendingTarget.confirm.reasons}\n value={reason}\n onChange={(value) => setReason(value ?? '')}\n />\n </div>\n )}\n </Modal>\n ) : null\n\n if (isMobile) {\n const board = (\n <div\n ref={boardRef}\n className={cn('flex h-board min-w-0 flex-col gap-3', className)}\n aria-label={aria['aria-label']}\n data-rendra={code}\n >\n {targetBar}\n <Tabs\n variant=\"pill\"\n aria-label=\"Colunas\"\n value={active}\n onChange={setActive}\n items={columns.map((col) => ({\n value: col.id,\n label: col.title,\n count: visibleInColumn(col.id).length,\n content: null,\n }))}\n />\n {columns\n .filter((col) => col.id === active)\n .map((col) => (\n <div\n key={col.id}\n className=\"flex min-h-0 flex-1 flex-col gap-2 rounded-surface bg-muted p-2\"\n >\n {columnHeader(col, visibleInColumn(col.id).length)}\n {columnList(col)}\n </div>\n ))}\n </div>\n )\n return (\n <>\n {toolbar ? (\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"rounded-surface border bg-card\">{toolbarNode}</div>\n {board}\n </div>\n ) : (\n board\n )}\n {customizeDrawer}\n {confirmation}\n </>\n )\n }\n\n const board = (\n <section\n ref={boardRef}\n aria-label={aria['aria-label'] ?? 'Quadro kanban'}\n data-rendra={code}\n data-allow-overflow\n style={{ '--kanban-cols': Math.min(visibleColumns, columns.length) } as CSSProperties}\n className={cn('flex h-board min-w-0 scrollbar-subtle gap-4 overflow-x-auto', className)}\n >\n {targetBar}\n {columns.map((col) => (\n <div\n key={col.id}\n className=\"flex min-h-0 w-kanban-col flex-col gap-2 rounded-surface bg-muted p-2\"\n >\n <div className=\"pt-1\">{columnHeader(col, visibleInColumn(col.id).length)}</div>\n {columnList(col)}\n </div>\n ))}\n </section>\n )\n return (\n <>\n {toolbar ? (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <div className=\"rounded-surface border bg-card\">{toolbarNode}</div>\n {board}\n </div>\n ) : (\n board\n )}\n {customizeDrawer}\n {confirmation}\n </>\n )\n}\n\n/** Move um card na lista (para usar no onCardMove): devolve a lista nova. */\nexport function moveKanbanCard(\n cards: KanbanCard[],\n cardId: string,\n toColumnId: string,\n toIndex: number,\n) {\n const card = cards.find((c) => c.id === cardId)\n if (!card) return cards\n const rest = cards.filter((c) => c.id !== cardId)\n const target = rest.filter((c) => c.columnId === toColumnId)\n const before = target[Math.min(toIndex, target.length)]\n const moved = { ...card, columnId: toColumnId }\n if (!before) {\n const lastIndex = rest.map((c) => c.columnId).lastIndexOf(toColumnId)\n const at = lastIndex === -1 ? rest.length : lastIndex + 1\n return [...rest.slice(0, at), moved, ...rest.slice(at)]\n }\n const at = rest.indexOf(before)\n return [...rest.slice(0, at), moved, ...rest.slice(at)]\n}\n","import { GripVertical } from 'lucide-react'\nimport { cn } from '@/lib/cn'\nimport type { UseSortableResult } from '@/lib/sortable'\n\nexport interface SortableHandleProps {\n id: string\n /** Nome acessível da alça (ex.: \"Reordenar Cliente A\"). */\n label: string\n /** O resultado de useSortable (motor de src/lib/sortable.ts). */\n sortable: Pick<UseSortableResult, 'handleProps'>\n className?: string\n}\n\n/**\n * Alça de arraste única, reaproveitada pela List e pelo Upload (o Kanban tem alça própria,\n * por ser posicionada dentro do card e não ter movimento por seta): pointer down inicia o\n * arraste (mouse e toque) e as setas ↑/↓ movem uma posição pelo teclado, tudo vindo do\n * motor (useSortable), sem duplicar aqui a lógica de mover.\n */\nexport function SortableHandle({ id, label, sortable, className }: SortableHandleProps) {\n const handle = sortable.handleProps(id)\n return (\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n 'flex size-touch shrink-0 cursor-grab items-center justify-center rounded-item text-muted-foreground active:cursor-grabbing',\n handle.className,\n className,\n )}\n onPointerDown={handle.onPointerDown}\n onKeyDown={handle.onKeyDown}\n >\n <GripVertical className=\"size-icon-sm\" aria-hidden />\n </button>\n )\n}\n","import { ChevronRight } from 'lucide-react'\nimport type { ElementType, ReactNode } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { useRendraLink } from '@/components/rendra-provider'\nimport { Badge } from '@/components/ui/badge'\nimport { SortableHandle } from '@/components/ui/sortable-handle'\nimport { cn } from '@/lib/cn'\nimport {\n layoutEnabled,\n useLayoutReady,\n useMotionLib,\n useMotionMode,\n useMotionPresets,\n} from '@/lib/motion'\nimport { useSortable } from '@/lib/sortable'\n\nexport interface ListItem {\n id: string\n title: ReactNode\n description?: ReactNode\n /** Avatar, ícone ou imagem à esquerda. */\n leading?: ReactNode\n /** Valor, badge ou ação à direita. */\n trailing?: ReactNode\n /** Torna a linha navegável. */\n to?: string\n onClick?: () => void\n /** Selo textual de status da linha, com contraste AA (nunca só cor). */\n tone?: 'success' | 'error' | 'warning' | 'neutral'\n}\n\nexport interface ListProps {\n items: ListItem[]\n /** Linhas separadas por borda (padrão) ou sem divisória. */\n divided?: boolean\n empty?: ReactNode\n className?: string\n /**\n * Reordena os itens por arraste (mouse e toque) e por teclado (setas ↑/↓ na alça).\n * Sem ela a lista é só leitura e a alça de arraste não aparece.\n */\n onReorder?: (items: ListItem[]) => void\n /** Nome acessível de cada item para a alça de arraste (ex.: \"Cliente A\"). Padrão: o título, em texto. */\n itemLabel?: (item: ListItem) => string\n}\n\nconst toneLabel: Record<NonNullable<ListItem['tone']>, string> = {\n success: 'Sucesso',\n warning: 'Atenção',\n error: 'Erro',\n neutral: 'Neutro',\n}\n\nconst toneBadge: Record<\n NonNullable<ListItem['tone']>,\n 'success' | 'warning' | 'error' | 'neutral'\n> = {\n success: 'success',\n warning: 'warning',\n error: 'error',\n neutral: 'neutral',\n}\n\nfunction defaultItemLabel(item: ListItem): string {\n return typeof item.title === 'string' ? item.title : item.id\n}\n\n/** Lista única: linhas com início, título, descrição e fim; navegável por prop; reordenável por prop. */\nexport function List({\n items,\n divided = true,\n empty,\n className,\n onReorder,\n itemLabel = defaultItemLabel,\n}: ListProps) {\n const Link = useRendraLink()\n const sortable = useSortable<ListItem>({\n items: items.map((it) => ({ id: it.id, data: it })),\n onReorder: onReorder && ((sorted) => onReorder(sorted.map((s) => s.data))),\n })\n const sortableEnabled = Boolean(onReorder)\n const motion = useMotionMode()\n const lib = useMotionLib()\n const ready = useLayoutReady()\n const presets = useMotionPresets()\n // Em `on` o item anima o layout, mas só fora do arraste: sob o ponteiro a ordem muda a cada\n // passo e animar atrasaria a linha atrás do cursor. Pelo teclado (moveBy) o layout anima.\n const Item: ElementType = lib ? lib.m.li : 'li'\n const itemMotion =\n motion === 'on'\n ? {\n layout: layoutEnabled({ mode: motion, ready, dragging: sortable.draggingId !== null }),\n transition: presets.move,\n }\n : {}\n const code = resolveCatalogCode('List', { sortable: sortableEnabled })\n\n if (items.length === 0 && empty) return <>{empty}</>\n return (\n <ul\n // Remonta uma vez quando o domMax chega: o layout só vale para itens criados depois disso.\n key={String(ready)}\n data-rendra={code}\n className={cn('flex w-full min-w-0 flex-col', divided && 'divide-y', className)}\n >\n {items.map((it) => {\n const interactive = Boolean(it.to || it.onClick)\n const body = (\n <>\n {it.leading && <span className=\"flex shrink-0\">{it.leading}</span>}\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"truncate text-sm font-medium\">{it.title}</span>\n {it.description && (\n <span className=\"line-clamp-2 text-sm text-muted-foreground\">{it.description}</span>\n )}\n </span>\n {it.tone && (\n <Badge tone={toneBadge[it.tone]} className=\"shrink-0\">\n {toneLabel[it.tone]}\n </Badge>\n )}\n {it.trailing && <span className=\"flex shrink-0 items-center\">{it.trailing}</span>}\n {interactive && (\n <ChevronRight className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n )}\n </>\n )\n const cls = cn(\n 'flex min-h-touch w-full min-w-0 items-center gap-3 py-3 text-left',\n interactive && '-mx-2 rounded-item px-2 transition-colors hover:bg-accent',\n )\n const label = itemLabel(it)\n const handle = sortableEnabled && (\n <SortableHandle id={it.id} label={`Reordenar ${label}`} sortable={sortable} />\n )\n return (\n <Item\n key={it.id}\n {...(sortableEnabled ? sortable.itemProps(it.id) : {})}\n {...itemMotion}\n className={cn(\n 'flex min-w-0 items-center gap-1',\n sortable.draggingId === it.id && 'opacity-50',\n )}\n >\n {handle}\n {it.to ? (\n <Link to={it.to} className={cls}>\n {body}\n </Link>\n ) : it.onClick ? (\n <button type=\"button\" onClick={it.onClick} className={cls}>\n {body}\n </button>\n ) : (\n <div className={cls}>{body}</div>\n )}\n </Item>\n )\n })}\n </ul>\n )\n}\n","import {\n useRef,\n type ClipboardEvent,\n type CSSProperties,\n type ElementType,\n type KeyboardEvent,\n} from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface OtpInputProps {\n /** Quantidade de dígitos. Padrão 6. */\n length?: number\n value: string\n onChange: (value: string) => void\n /** Chamado quando todos os dígitos foram preenchidos. */\n onComplete?: (value: string) => void\n invalid?: boolean\n disabled?: boolean\n id?: string\n 'aria-describedby'?: string\n}\n\n/**\n * Código de verificação (2FA, confirmação de e-mail). Uma caixa por dígito, aceita colar\n * o código inteiro, teclado numérico no celular e preenchimento automático por SMS.\n */\nexport function OtpInput({\n length = 6,\n value,\n onChange,\n onComplete,\n invalid,\n disabled,\n id,\n ...aria\n}: OtpInputProps) {\n const refs = useRef<(HTMLInputElement | null)[]>([])\n const lib = useMotionLib()\n const on = lib !== null\n const presets = useMotionPresets()\n // Em `on` a célula que recebe um dígito faz um salto curto de escala.\n const Cell: ElementType = on ? lib.m.input : 'input'\n const digits = Array.from({ length }, (_, i) => value[i] ?? '')\n\n const set = (next: string) => {\n const clean = next.replace(/\\D/g, '').slice(0, length)\n onChange(clean)\n if (clean.length === length) onComplete?.(clean)\n }\n\n const onKey = (i: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !digits[i] && i > 0) refs.current[i - 1]?.focus()\n if (e.key === 'ArrowLeft' && i > 0) refs.current[i - 1]?.focus()\n if (e.key === 'ArrowRight' && i < length - 1) refs.current[i + 1]?.focus()\n }\n\n const onPaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length)\n set(pasted)\n refs.current[Math.min(pasted.length, length - 1)]?.focus()\n }\n\n return (\n <div\n id={id}\n role=\"group\"\n aria-label=\"Código de verificação\"\n aria-describedby={aria['aria-describedby']}\n data-rendra=\"OTP-001\"\n // gap-1 no celular: 6 casas com 44px de toque mesmo dentro de um card em 360px.\n className=\"grid w-full max-w-sm grid-cols-otp gap-1 sm:gap-2\"\n style={{ '--otp': length } as CSSProperties}\n >\n {digits.map((d, i) => (\n <Cell\n key={i}\n {...(on ? { animate: d ? presets.bump : undefined } : {})}\n ref={(el) => {\n refs.current[i] = el\n }}\n value={d}\n disabled={disabled}\n inputMode=\"numeric\"\n autoComplete={i === 0 ? 'one-time-code' : 'off'}\n maxLength={1}\n aria-label={`Dígito ${i + 1} de ${length}`}\n aria-invalid={invalid || undefined}\n onPaste={onPaste}\n onKeyDown={(e) => onKey(i, e)}\n onFocus={(e) => e.target.select()}\n onChange={(e) => {\n const ch = e.target.value.replace(/\\D/g, '').slice(-1)\n const arr = digits.slice()\n arr[i] = ch\n set(arr.join(''))\n if (ch && i < length - 1) refs.current[i + 1]?.focus()\n }}\n className={cn(\n 'h-control-lg w-full min-w-0 rounded-control border border-input bg-field text-center text-xl font-semibold tabular-nums transition-[border-color,box-shadow] outline-none focus:border-ring focus:ring-2 focus:ring-ring/25 disabled:opacity-60',\n d && 'border-primary',\n invalid && 'border-destructive focus:border-destructive focus:ring-destructive/25',\n )}\n />\n ))}\n </div>\n )\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Button } from '@/components/ui/button'\nimport { Select } from '@/components/ui/select'\nimport { cn } from '@/lib/cn'\n\nexport interface PaginationProps {\n /** Página atual, começando em 1. */\n page: number\n pageSize: number\n total: number\n onPageChange: (page: number) => void\n onPageSizeChange?: (size: number) => void\n pageSizes?: number[]\n /**\n * Mobile: 'pages' mostra anterior e próxima com \"Página 2 de 25\";\n * 'loadMore' troca por um botão \"Carregar mais\".\n */\n mobileMode?: 'pages' | 'loadMore'\n loading?: boolean\n className?: string\n}\n\nfunction range(page: number, pages: number): (number | '...')[] {\n if (pages <= 7) return Array.from({ length: pages }, (_, i) => i + 1)\n if (page <= 4) return [1, 2, 3, 4, 5, '...', pages]\n if (page >= pages - 3) return [1, '...', pages - 4, pages - 3, pages - 2, pages - 1, pages]\n return [1, '...', page - 1, page, page + 1, '...', pages]\n}\n\n/** Paginação única: completa no desktop, compacta ou \"carregar mais\" no mobile. */\nexport function Pagination({\n page,\n pageSize,\n total,\n onPageChange,\n onPageSizeChange,\n pageSizes = [15, 30, 50],\n mobileMode = 'pages',\n loading,\n className,\n}: PaginationProps) {\n const pages = Math.max(1, Math.ceil(total / pageSize))\n const from = total === 0 ? 0 : (page - 1) * pageSize + 1\n const to = Math.min(total, page * pageSize)\n const fmt = (n: number) => n.toLocaleString('pt-BR')\n\n return (\n <nav\n aria-label=\"Paginação\"\n data-rendra=\"PAG-001\"\n className={cn('flex min-w-0 flex-col gap-3', className)}\n >\n {/* Mobile */}\n <div className=\"flex flex-col gap-3 md:hidden\">\n {mobileMode === 'loadMore' ? (\n page < pages && (\n <Button\n variant=\"outline\"\n fullWidth\n loading={loading}\n onClick={() => onPageChange(page + 1)}\n >\n Carregar mais\n </Button>\n )\n ) : (\n <div className=\"grid grid-cols-2 gap-3\">\n <Button\n variant=\"outline\"\n icon={<ChevronLeft />}\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n >\n Anterior\n </Button>\n <Button\n variant=\"outline\"\n iconRight={<ChevronRight />}\n disabled={page >= pages}\n onClick={() => onPageChange(page + 1)}\n >\n Próxima\n </Button>\n </div>\n )}\n <p className=\"text-center text-xs text-muted-foreground tabular-nums\">\n {mobileMode === 'loadMore'\n ? `${fmt(to)} de ${fmt(total)}`\n : `Página ${fmt(page)} de ${fmt(pages)}`}\n </p>\n </div>\n\n {/* Desktop */}\n <div className=\"hidden items-center justify-between gap-4 md:flex\">\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground\">\n <span className=\"tabular-nums\">\n {fmt(from)} a {fmt(to)} de {fmt(total)}\n </span>\n {onPageSizeChange && (\n <div className=\"w-3xs\">\n <Select\n size=\"sm\"\n label=\"Itens por página\"\n value={String(pageSize)}\n onChange={(v) => v && onPageSizeChange(Number(v))}\n options={pageSizes.map((s) => ({ value: String(s), label: `${s} por página` }))}\n />\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label=\"Página anterior\"\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n >\n <ChevronLeft />\n </Button>\n {range(page, pages).map((p, i) =>\n p === '...' ? (\n <span key={`e${i}`} className=\"px-2 text-sm text-muted-foreground\" aria-hidden>\n ...\n </span>\n ) : (\n <Button\n key={p}\n size=\"sm\"\n variant={p === page ? 'secondary' : 'ghost'}\n aria-current={p === page ? 'page' : undefined}\n aria-label={`Página ${p}`}\n onClick={() => onPageChange(p)}\n className=\"min-w-8 px-2 tabular-nums\"\n >\n {p}\n </Button>\n ),\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label=\"Próxima página\"\n disabled={page >= pages}\n onClick={() => onPageChange(page + 1)}\n >\n <ChevronRight />\n </Button>\n </div>\n </div>\n </nav>\n )\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { Progress as P } from 'radix-ui'\nimport type { CSSProperties } from 'react'\nimport { cn } from '@/lib/cn'\n\nconst bar = cva(\n 'h-full rounded-full transition-[width] duration-(--rendra-duration-base) ease-linear',\n {\n variants: {\n tone: {\n primary: 'bg-primary',\n brand: 'bg-gradient-accent',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-destructive',\n },\n },\n defaultVariants: { tone: 'primary' },\n },\n)\n\nexport interface ProgressProps extends VariantProps<typeof bar> {\n /** 0 a 100. Sem valor: indeterminado (animado). */\n value?: number | null\n size?: 'sm' | 'md'\n /** Mostra o percentual à direita. */\n showValue?: boolean\n label?: string\n className?: string\n}\n\n/** Barra de progresso única. tone=\"brand\" usa o degradê de detalhe do template. */\nexport function Progress({ value, size = 'md', tone, showValue, label, className }: ProgressProps) {\n const indeterminate = value == null\n return (\n <div data-rendra=\"PROG-001\" className={cn('flex min-w-0 items-center gap-3', className)}>\n <P.Root\n value={indeterminate ? null : value}\n aria-label={label}\n // A barra indeterminada corre além do trilho e o trilho a recorta (overflow-hidden):\n // a auditoria de layout não deve tratá-la como elemento fora da tela.\n data-allow-overflow\n className={cn(\n 'relative w-full overflow-hidden rounded-full bg-muted',\n size === 'sm' ? 'h-1' : 'h-2',\n )}\n >\n <P.Indicator\n className={cn(\n bar({ tone }),\n indeterminate ? 'absolute inset-y-0 left-0 w-1/3 progress-slide' : 'w-progress',\n )}\n style={\n indeterminate\n ? undefined\n : ({ '--progress': `${Math.min(100, Math.max(0, value))}%` } as CSSProperties)\n }\n />\n </P.Root>\n {showValue && !indeterminate && (\n <span className=\"w-12 shrink-0 text-right text-xs font-medium text-muted-foreground tabular-nums\">\n {Math.round(value)}%\n </span>\n )}\n </div>\n )\n}\n","/**\n * Codificador de QR Code próprio, sem biblioteca externa. Modo byte (qualquer texto,\n * inclusive acentos, via UTF-8), versões 1 a 10, as quatro correções de erro (L, M, Q, H),\n * Reed-Solomon em GF(256), as 8 máscaras com penalidade (ISO/IEC 18004) e informação de\n * formato (e de versão, a partir da versão 7). Cada etapa segue o algoritmo publicado do\n * padrão; as tabelas de capacidade, os coeficientes do Reed-Solomon e as posições de\n * alinhamento vêm da própria especificação.\n */\n\nexport type ErrorCorrectionLevel = 'low' | 'medium' | 'quartile' | 'high'\n\nexport interface QrMatrix {\n version: number\n size: number\n /** modules[linha][coluna]; true é módulo escuro. */\n modules: boolean[][]\n}\n\n/** Valor grande demais (ou codificação impossível) até a versão 10 no nível pedido. */\nexport class QrEncodingError extends Error {}\n\nconst LEVEL_LETTER: Record<ErrorCorrectionLevel, 'L' | 'M' | 'Q' | 'H'> = {\n low: 'L',\n medium: 'M',\n quartile: 'Q',\n high: 'H',\n}\n\n// Indicador de 2 bits do nível de correção de erro, usado na informação de formato.\nconst LEVEL_BITS: Record<ErrorCorrectionLevel, number> = { low: 1, medium: 0, quartile: 3, high: 2 }\n\ninterface BlockInfo {\n totalDataCodewords: number\n ecCodewordsPerBlock: number\n group1Blocks: number\n group1DataPerBlock: number\n group2Blocks: number\n group2DataPerBlock: number\n}\n\n// Tabela de blocos (ISO/IEC 18004), versões 1 a 10, quatro níveis de correção.\nconst CAPACITY: Record<number, Record<'L' | 'M' | 'Q' | 'H', BlockInfo>> = {\n 1: {\n L: {\n totalDataCodewords: 19,\n ecCodewordsPerBlock: 7,\n group1Blocks: 1,\n group1DataPerBlock: 19,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 16,\n ecCodewordsPerBlock: 10,\n group1Blocks: 1,\n group1DataPerBlock: 16,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 13,\n ecCodewordsPerBlock: 13,\n group1Blocks: 1,\n group1DataPerBlock: 13,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 9,\n ecCodewordsPerBlock: 17,\n group1Blocks: 1,\n group1DataPerBlock: 9,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 2: {\n L: {\n totalDataCodewords: 34,\n ecCodewordsPerBlock: 10,\n group1Blocks: 1,\n group1DataPerBlock: 34,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 28,\n ecCodewordsPerBlock: 16,\n group1Blocks: 1,\n group1DataPerBlock: 28,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 22,\n ecCodewordsPerBlock: 22,\n group1Blocks: 1,\n group1DataPerBlock: 22,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 16,\n ecCodewordsPerBlock: 28,\n group1Blocks: 1,\n group1DataPerBlock: 16,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 3: {\n L: {\n totalDataCodewords: 55,\n ecCodewordsPerBlock: 15,\n group1Blocks: 1,\n group1DataPerBlock: 55,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 44,\n ecCodewordsPerBlock: 26,\n group1Blocks: 1,\n group1DataPerBlock: 44,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 34,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 17,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 26,\n ecCodewordsPerBlock: 22,\n group1Blocks: 2,\n group1DataPerBlock: 13,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 4: {\n L: {\n totalDataCodewords: 80,\n ecCodewordsPerBlock: 20,\n group1Blocks: 1,\n group1DataPerBlock: 80,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 64,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 32,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 48,\n ecCodewordsPerBlock: 26,\n group1Blocks: 2,\n group1DataPerBlock: 24,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 36,\n ecCodewordsPerBlock: 16,\n group1Blocks: 4,\n group1DataPerBlock: 9,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 5: {\n L: {\n totalDataCodewords: 108,\n ecCodewordsPerBlock: 26,\n group1Blocks: 1,\n group1DataPerBlock: 108,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 86,\n ecCodewordsPerBlock: 24,\n group1Blocks: 2,\n group1DataPerBlock: 43,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 62,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 15,\n group2Blocks: 2,\n group2DataPerBlock: 16,\n },\n H: {\n totalDataCodewords: 46,\n ecCodewordsPerBlock: 22,\n group1Blocks: 2,\n group1DataPerBlock: 11,\n group2Blocks: 2,\n group2DataPerBlock: 12,\n },\n },\n 6: {\n L: {\n totalDataCodewords: 136,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 68,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 108,\n ecCodewordsPerBlock: 16,\n group1Blocks: 4,\n group1DataPerBlock: 27,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 76,\n ecCodewordsPerBlock: 24,\n group1Blocks: 4,\n group1DataPerBlock: 19,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 60,\n ecCodewordsPerBlock: 28,\n group1Blocks: 4,\n group1DataPerBlock: 15,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 7: {\n L: {\n totalDataCodewords: 156,\n ecCodewordsPerBlock: 20,\n group1Blocks: 2,\n group1DataPerBlock: 78,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 124,\n ecCodewordsPerBlock: 18,\n group1Blocks: 4,\n group1DataPerBlock: 31,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 88,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 14,\n group2Blocks: 4,\n group2DataPerBlock: 15,\n },\n H: {\n totalDataCodewords: 66,\n ecCodewordsPerBlock: 26,\n group1Blocks: 4,\n group1DataPerBlock: 13,\n group2Blocks: 1,\n group2DataPerBlock: 14,\n },\n },\n 8: {\n L: {\n totalDataCodewords: 194,\n ecCodewordsPerBlock: 24,\n group1Blocks: 2,\n group1DataPerBlock: 97,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 154,\n ecCodewordsPerBlock: 22,\n group1Blocks: 2,\n group1DataPerBlock: 38,\n group2Blocks: 2,\n group2DataPerBlock: 39,\n },\n Q: {\n totalDataCodewords: 110,\n ecCodewordsPerBlock: 22,\n group1Blocks: 4,\n group1DataPerBlock: 18,\n group2Blocks: 2,\n group2DataPerBlock: 19,\n },\n H: {\n totalDataCodewords: 86,\n ecCodewordsPerBlock: 26,\n group1Blocks: 4,\n group1DataPerBlock: 14,\n group2Blocks: 2,\n group2DataPerBlock: 15,\n },\n },\n 9: {\n L: {\n totalDataCodewords: 232,\n ecCodewordsPerBlock: 30,\n group1Blocks: 2,\n group1DataPerBlock: 116,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 182,\n ecCodewordsPerBlock: 22,\n group1Blocks: 3,\n group1DataPerBlock: 36,\n group2Blocks: 2,\n group2DataPerBlock: 37,\n },\n Q: {\n totalDataCodewords: 132,\n ecCodewordsPerBlock: 20,\n group1Blocks: 4,\n group1DataPerBlock: 16,\n group2Blocks: 4,\n group2DataPerBlock: 17,\n },\n H: {\n totalDataCodewords: 100,\n ecCodewordsPerBlock: 24,\n group1Blocks: 4,\n group1DataPerBlock: 12,\n group2Blocks: 4,\n group2DataPerBlock: 13,\n },\n },\n 10: {\n L: {\n totalDataCodewords: 274,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 68,\n group2Blocks: 2,\n group2DataPerBlock: 69,\n },\n M: {\n totalDataCodewords: 216,\n ecCodewordsPerBlock: 26,\n group1Blocks: 4,\n group1DataPerBlock: 43,\n group2Blocks: 1,\n group2DataPerBlock: 44,\n },\n Q: {\n totalDataCodewords: 154,\n ecCodewordsPerBlock: 24,\n group1Blocks: 6,\n group1DataPerBlock: 19,\n group2Blocks: 2,\n group2DataPerBlock: 20,\n },\n H: {\n totalDataCodewords: 122,\n ecCodewordsPerBlock: 28,\n group1Blocks: 6,\n group1DataPerBlock: 15,\n group2Blocks: 2,\n group2DataPerBlock: 16,\n },\n },\n}\n\nexport const QR_MAX_VERSION = 10\n\n// Coordenadas candidatas do padrão de alinhamento (linha ou coluna), por versão. A versão 1\n// não tem padrão de alinhamento. Os módulos reais são o produto cartesiano da lista consigo\n// mesma, menos os três cantos que colidiriam com os localizadores.\nconst ALIGNMENT_COORDS: Record<number, number[]> = {\n 1: [],\n 2: [6, 18],\n 3: [6, 22],\n 4: [6, 26],\n 5: [6, 30],\n 6: [6, 34],\n 7: [6, 22, 38],\n 8: [6, 24, 42],\n 9: [6, 26, 46],\n 10: [6, 28, 50],\n}\n\n/* --------------------------------------------------------------- Reed-Solomon em GF(256) */\n\n// Multiplicação em GF(2^8) com o polinômio primitivo 0x11D (x^8 + x^4 + x^3 + x^2 + 1).\nexport function reedSolomonMultiply(x: number, y: number): number {\n let z = 0\n for (let i = 7; i >= 0; i--) {\n z = (z << 1) ^ ((z >>> 7) * 0x11d)\n z ^= ((y >>> i) & 1) * x\n }\n return z & 0xff\n}\n\n/** Polinômio gerador de grau `degree` (produto de (x - 2^i) para i de 0 a degree-1). */\nexport function reedSolomonComputeDivisor(degree: number): number[] {\n const result: number[] = new Array(degree - 1).fill(0)\n result.push(1)\n let root = 1\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = reedSolomonMultiply(result[j] as number, root)\n if (j + 1 < result.length) result[j] = (result[j] as number) ^ (result[j + 1] as number)\n }\n root = reedSolomonMultiply(root, 0x02)\n }\n return result\n}\n\n/** Resto da divisão polinomial de `data` pelo `divisor`: os codewords de correção de erro. */\nexport function reedSolomonComputeRemainder(data: number[], divisor: number[]): number[] {\n const result = divisor.map(() => 0)\n for (const b of data) {\n const factor = b ^ (result.shift() as number)\n result.push(0)\n divisor.forEach((coef, i) => {\n result[i] = (result[i] as number) ^ reedSolomonMultiply(coef, factor)\n })\n }\n return result\n}\n\n/** Codewords de correção de erro para `data`, com `ecLength` codewords de saída. */\nexport function reedSolomonEncode(data: number[], ecLength: number): number[] {\n return reedSolomonComputeRemainder(data, reedSolomonComputeDivisor(ecLength))\n}\n\n/* --------------------------------------------------------------------- Dados (modo byte) */\n\nfunction pushBits(bits: number[], value: number, length: number): void {\n for (let i = length - 1; i >= 0; i--) bits.push((value >>> i) & 1)\n}\n\n/** Exportada só para teste direto (isola a montagem dos codewords de dados do resto do pipeline). */\nexport function buildDataCodewords(\n bytes: Uint8Array,\n version: number,\n totalDataCodewords: number,\n): number[] {\n const bits: number[] = []\n pushBits(bits, 0b0100, 4) // indicador de modo: byte\n const countBits = version <= 9 ? 8 : 16\n pushBits(bits, bytes.length, countBits)\n for (const b of bytes) pushBits(bits, b, 8)\n\n const capacityBits = totalDataCodewords * 8\n const terminator = Math.min(4, Math.max(0, capacityBits - bits.length))\n for (let i = 0; i < terminator; i++) bits.push(0)\n while (bits.length % 8 !== 0) bits.push(0)\n\n const codewords: number[] = []\n for (let i = 0; i < bits.length; i += 8) {\n let byte = 0\n for (let j = 0; j < 8; j++) byte = (byte << 1) | (bits[i + j] as number)\n codewords.push(byte)\n }\n const pad = [0xec, 0x11]\n let p = 0\n while (codewords.length < totalDataCodewords) {\n codewords.push(pad[p % 2] as number)\n p++\n }\n return codewords\n}\n\n/** Separa em blocos, aplica Reed-Solomon por bloco e intercala dados e correção. */\nfunction structureCodewords(dataCodewords: number[], info: BlockInfo): number[] {\n const blocks: number[][] = []\n let offset = 0\n for (let i = 0; i < info.group1Blocks; i++) {\n blocks.push(dataCodewords.slice(offset, offset + info.group1DataPerBlock))\n offset += info.group1DataPerBlock\n }\n for (let i = 0; i < info.group2Blocks; i++) {\n blocks.push(dataCodewords.slice(offset, offset + info.group2DataPerBlock))\n offset += info.group2DataPerBlock\n }\n const ecBlocks = blocks.map((block) => reedSolomonEncode(block, info.ecCodewordsPerBlock))\n\n const result: number[] = []\n const maxDataLen = Math.max(info.group1DataPerBlock, info.group2DataPerBlock)\n for (let i = 0; i < maxDataLen; i++) {\n for (const block of blocks) if (i < block.length) result.push(block[i] as number)\n }\n for (let i = 0; i < info.ecCodewordsPerBlock; i++) {\n for (const ec of ecBlocks) result.push(ec[i] as number)\n }\n return result\n}\n\nfunction codewordsToBits(codewords: number[]): number[] {\n const bits: number[] = []\n for (const b of codewords) for (let i = 7; i >= 0; i--) bits.push((b >>> i) & 1)\n return bits\n}\n\n/* --------------------------------------------------------------- Informação de formato e versão */\n\nfunction getBit(value: number, index: number): boolean {\n return ((value >>> index) & 1) !== 0\n}\n\n/** BCH(15,5) da informação de formato: nível (2 bits) + máscara (3 bits), com a máscara fixa 0x5412. */\nexport function computeFormatBits(levelBits: number, mask: number): number {\n const data = (levelBits << 3) | mask\n let rem = data\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >>> 9) * 0x537)\n return ((data << 10) | rem) ^ 0x5412\n}\n\n/** BCH(18,6) da informação de versão (só usada a partir da versão 7). */\nexport function computeVersionBits(version: number): number {\n let rem = version\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25)\n return (version << 12) | rem\n}\n\n/** Escreve (e reserva) os 15 módulos de formato, nas duas cópias, mais o módulo escuro fixo. */\nfunction drawFormatBits(\n matrix: boolean[][],\n reserved: boolean[][],\n size: number,\n bits: number,\n): void {\n const set = (col: number, row: number, dark: boolean) => {\n ;(matrix[row] as boolean[])[col] = dark\n ;(reserved[row] as boolean[])[col] = true\n }\n for (let i = 0; i <= 5; i++) set(8, i, getBit(bits, i))\n set(8, 7, getBit(bits, 6))\n set(8, 8, getBit(bits, 7))\n set(7, 8, getBit(bits, 8))\n for (let i = 9; i < 15; i++) set(14 - i, 8, getBit(bits, i))\n for (let i = 0; i <= 7; i++) set(size - 1 - i, 8, getBit(bits, i))\n for (let i = 8; i < 15; i++) set(8, size - 15 + i, getBit(bits, i))\n set(8, size - 8, true) // módulo escuro, sempre fixo\n}\n\n/** Escreve os dois blocos (3x6 e 6x3) da informação de versão, a partir da versão 7. */\nfunction drawVersionBits(matrix: boolean[][], size: number, version: number, bits: number): void {\n if (version < 7) return\n for (let i = 0; i < 18; i++) {\n const bit = getBit(bits, i)\n const a = size - 11 + (i % 3)\n const b = Math.floor(i / 3)\n ;(matrix[b] as boolean[])[a] = bit\n ;(matrix[a] as boolean[])[b] = bit\n }\n}\n\n/* ------------------------------------------------------------------------ Padrões fixos */\n\ninterface Template {\n matrix: boolean[][]\n reserved: boolean[][]\n size: number\n}\n\nfunction buildTemplate(version: number): Template {\n const size = version * 4 + 17\n const matrix: boolean[][] = Array.from(\n { length: size },\n () => new Array(size).fill(false) as boolean[],\n )\n const reserved: boolean[][] = Array.from(\n { length: size },\n () => new Array(size).fill(false) as boolean[],\n )\n\n const drawFinder = (cx: number, cy: number) => {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const x = cx + dx\n const y = cy + dy\n if (x < 0 || x >= size || y < 0 || y >= size) continue\n const dist = Math.max(Math.abs(dx), Math.abs(dy))\n ;(reserved[y] as boolean[])[x] = true\n ;(matrix[y] as boolean[])[x] = dist !== 2 && dist !== 4\n }\n }\n }\n drawFinder(3, 3)\n drawFinder(size - 4, 3)\n drawFinder(3, size - 4)\n\n const drawAlignment = (cx: number, cy: number) => {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++) {\n const x = cx + dx\n const y = cy + dy\n ;(reserved[y] as boolean[])[x] = true\n ;(matrix[y] as boolean[])[x] = Math.max(Math.abs(dx), Math.abs(dy)) !== 1\n }\n }\n }\n const coords = ALIGNMENT_COORDS[version] ?? []\n const first = coords[0]\n const last = coords[coords.length - 1]\n for (const r of coords) {\n for (const c of coords) {\n if (\n (r === first && c === first) ||\n (r === first && c === last) ||\n (r === last && c === first)\n )\n continue\n drawAlignment(c, r)\n }\n }\n\n for (let i = 8; i < size - 8; i++) {\n ;(reserved[6] as boolean[])[i] = true\n ;(matrix[6] as boolean[])[i] = i % 2 === 0\n ;(reserved[i] as boolean[])[6] = true\n ;(matrix[i] as boolean[])[6] = i % 2 === 0\n }\n\n // Reserva a área da informação de formato (o conteúdo real entra depois da máscara escolhida).\n drawFormatBits(matrix, reserved, size, 0)\n\n if (version >= 7) {\n for (let i = 0; i < 18; i++) {\n const a = size - 11 + (i % 3)\n const b = Math.floor(i / 3)\n ;(reserved[b] as boolean[])[a] = true\n ;(reserved[a] as boolean[])[b] = true\n }\n }\n\n return { matrix, reserved, size }\n}\n\n/** Zigue-zague clássico: de baixo para cima e de cima para baixo, colunas de 2 em 2,\n * da direita para a esquerda, pulando a coluna do padrão de tempo vertical. */\nfunction placeDataBits(\n matrix: boolean[][],\n reserved: boolean[][],\n size: number,\n bits: number[],\n): void {\n let bitIndex = 0\n let upward = true\n for (let colRight = size - 1; colRight >= 1; colRight -= 2) {\n if (colRight === 6) colRight--\n for (let vert = 0; vert < size; vert++) {\n const row = upward ? size - 1 - vert : vert\n for (const col of [colRight, colRight - 1]) {\n if ((reserved[row] as boolean[])[col]) continue\n const bit = bitIndex < bits.length ? bits[bitIndex] : 0\n ;(matrix[row] as boolean[])[col] = bit === 1\n bitIndex++\n }\n }\n upward = !upward\n }\n}\n\n/* ------------------------------------------------------------------------------ Máscaras */\n\nconst MASK_FNS: ((r: number, c: number) => boolean)[] = [\n (r, c) => (r + c) % 2 === 0,\n (r) => r % 2 === 0,\n (_r, c) => c % 3 === 0,\n (r, c) => (r + c) % 3 === 0,\n (r, c) => (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0,\n (r, c) => ((r * c) % 2) + ((r * c) % 3) === 0,\n (r, c) => (((r * c) % 2) + ((r * c) % 3)) % 2 === 0,\n (r, c) => (((r + c) % 2) + ((r * c) % 3)) % 2 === 0,\n]\n\nfunction applyMask(\n matrix: boolean[][],\n reserved: boolean[][],\n size: number,\n maskId: number,\n): boolean[][] {\n const fn = MASK_FNS[maskId] as (r: number, c: number) => boolean\n const out: boolean[][] = []\n for (let r = 0; r < size; r++) {\n const row: boolean[] = []\n for (let c = 0; c < size; c++) {\n const v = (matrix[r] as boolean[])[c] as boolean\n row.push((reserved[r] as boolean[])[c] ? v : v !== fn(r, c))\n }\n out.push(row)\n }\n return out\n}\n\nfunction runPenalty(bits: boolean[]): number {\n let total = 0\n let runLen = 1\n for (let i = 1; i <= bits.length; i++) {\n if (i < bits.length && bits[i] === bits[i - 1]) {\n runLen++\n continue\n }\n if (runLen >= 5) total += 3 + (runLen - 5)\n runLen = 1\n }\n return total\n}\n\nconst FINDER_LIKE_PATTERN = [true, false, true, true, true, false, true]\n\nfunction finderLikeCount(bits: boolean[]): number {\n let count = 0\n for (let i = 0; i + 7 <= bits.length; i++) {\n let matches = true\n for (let k = 0; k < 7; k++) {\n if (bits[i + k] !== FINDER_LIKE_PATTERN[k]) {\n matches = false\n break\n }\n }\n if (!matches) continue\n const before = i >= 4 && bits.slice(i - 4, i).every((b) => !b)\n const after = i + 11 <= bits.length && bits.slice(i + 7, i + 11).every((b) => !b)\n if (before || after) count++\n }\n return count\n}\n\n/** As quatro regras de penalidade da máscara (ISO/IEC 18004: 3, 3, 40 e a proporção de módulos escuros). */\nexport function computeMaskPenalty(matrix: boolean[][], size: number): number {\n let penalty = 0\n for (let r = 0; r < size; r++) penalty += runPenalty(matrix[r] as boolean[])\n for (let c = 0; c < size; c++) penalty += runPenalty(matrix.map((row) => row[c] as boolean))\n\n for (let r = 0; r < size - 1; r++) {\n for (let c = 0; c < size - 1; c++) {\n const v = (matrix[r] as boolean[])[c]\n if (\n v === (matrix[r] as boolean[])[c + 1] &&\n v === (matrix[r + 1] as boolean[])[c] &&\n v === (matrix[r + 1] as boolean[])[c + 1]\n ) {\n penalty += 3\n }\n }\n }\n\n for (let r = 0; r < size; r++) penalty += finderLikeCount(matrix[r] as boolean[]) * 40\n for (let c = 0; c < size; c++)\n penalty += finderLikeCount(matrix.map((row) => row[c] as boolean)) * 40\n\n const total = size * size\n const dark = matrix.reduce((sum, row) => sum + row.filter(Boolean).length, 0)\n const percent = (dark * 100) / total\n const a = Math.floor(percent / 5) * 5\n const b = a + 5\n penalty += (Math.min(Math.abs(a - 50), Math.abs(b - 50)) / 5) * 10\n\n return penalty\n}\n\n/* --------------------------------------------------------------------------- API pública */\n\n/**\n * Codifica `value` (modo byte, UTF-8) num QR Code, escolhendo a menor versão (1 a 10) que\n * comporta o valor no nível de correção pedido. Lança QrEncodingError se não couber em\n * nenhuma versão suportada.\n */\nexport function encodeQrMatrix(value: string, level: ErrorCorrectionLevel = 'medium'): QrMatrix {\n const bytes = new TextEncoder().encode(value)\n const letter = LEVEL_LETTER[level]\n\n let chosenVersion: number | null = null\n let info: BlockInfo | null = null\n for (let version = 1; version <= QR_MAX_VERSION; version++) {\n const candidate = (CAPACITY[version] as Record<'L' | 'M' | 'Q' | 'H', BlockInfo>)[letter]\n const countBits = version <= 9 ? 8 : 16\n const needed = 4 + countBits + bytes.length * 8\n if (needed <= candidate.totalDataCodewords * 8) {\n chosenVersion = version\n info = candidate\n break\n }\n }\n if (chosenVersion === null || info === null) {\n throw new QrEncodingError(\n `Valor grande demais para um QR Code até a versão ${QR_MAX_VERSION} neste nível de correção.`,\n )\n }\n\n const dataCodewords = buildDataCodewords(bytes, chosenVersion, info.totalDataCodewords)\n const allCodewords = structureCodewords(dataCodewords, info)\n const dataBits = codewordsToBits(allCodewords)\n\n const { matrix, reserved, size } = buildTemplate(chosenVersion)\n placeDataBits(matrix, reserved, size, dataBits)\n\n let bestMask = 0\n let bestPenalty = Number.POSITIVE_INFINITY\n let bestMatrix = matrix\n for (let maskId = 0; maskId < 8; maskId++) {\n const masked = applyMask(matrix, reserved, size, maskId)\n const penalty = computeMaskPenalty(masked, size)\n if (penalty < bestPenalty) {\n bestPenalty = penalty\n bestMask = maskId\n bestMatrix = masked\n }\n }\n\n const formatBits = computeFormatBits(LEVEL_BITS[level], bestMask)\n drawFormatBits(bestMatrix, reserved, size, formatBits)\n if (chosenVersion >= 7) {\n drawVersionBits(bestMatrix, size, chosenVersion, computeVersionBits(chosenVersion))\n }\n\n return { version: chosenVersion, size, modules: bestMatrix }\n}\n\n/**\n * Só para teste: relê os codewords (dados + correção de erro) de um QrMatrix já pronto,\n * redescobrindo a máscara pela informação de formato armazenada. Serve para comparar a\n * saída do codificador com um valor publicado, sem repetir a tabela de máscaras aqui.\n */\nexport function readCodewordsForTest(matrix: QrMatrix, level: ErrorCorrectionLevel): number[] {\n const { reserved, size } = buildTemplate(matrix.version)\n\n let maskId = 0\n for (let candidate = 0; candidate < 8; candidate++) {\n const bits = computeFormatBits(LEVEL_BITS[level], candidate)\n const scratch: boolean[][] = Array.from(\n { length: size },\n () => new Array(size).fill(false) as boolean[],\n )\n const scratchReserved: boolean[][] = Array.from(\n { length: size },\n () => new Array(size).fill(false) as boolean[],\n )\n drawFormatBits(scratch, scratchReserved, size, bits)\n let allMatch = true\n for (let r = 0; r < size && allMatch; r++) {\n for (let c = 0; c < size; c++) {\n if (\n (scratchReserved[r] as boolean[])[c] &&\n (scratch[r] as boolean[])[c] !== (matrix.modules[r] as boolean[])[c]\n ) {\n allMatch = false\n break\n }\n }\n }\n if (allMatch) {\n maskId = candidate\n break\n }\n }\n\n const fn = MASK_FNS[maskId] as (r: number, c: number) => boolean\n const bits: number[] = []\n let upward = true\n for (let colRight = size - 1; colRight >= 1; colRight -= 2) {\n if (colRight === 6) colRight--\n for (let vert = 0; vert < size; vert++) {\n const row = upward ? size - 1 - vert : vert\n for (const col of [colRight, colRight - 1]) {\n if ((reserved[row] as boolean[])[col]) continue\n const masked = (matrix.modules[row] as boolean[])[col] as boolean\n bits.push(masked !== fn(row, col) ? 1 : 0)\n }\n }\n upward = !upward\n }\n const codewords: number[] = []\n for (let i = 0; i + 8 <= bits.length; i += 8) {\n let byte = 0\n for (let j = 0; j < 8; j++) byte = (byte << 1) | (bits[i + j] as number)\n codewords.push(byte)\n }\n return codewords\n}\n\n/** Um único `<path>` com todos os módulos escuros, para `fill=\"currentColor\"` no SVG. */\nexport function qrMatrixToSvgPath(matrix: QrMatrix): string {\n let d = ''\n for (let r = 0; r < matrix.size; r++) {\n for (let c = 0; c < matrix.size; c++) {\n if ((matrix.modules[r] as boolean[])[c]) d += `M${c} ${r}h1v1h-1z`\n }\n }\n return d\n}\n","import { TriangleAlert } from 'lucide-react'\nimport { useMemo, type CSSProperties } from 'react'\nimport { EmptyState } from '@/components/ui/empty-state'\nimport { cn } from '@/lib/cn'\nimport {\n encodeQrMatrix,\n QrEncodingError,\n qrMatrixToSvgPath,\n type ErrorCorrectionLevel,\n} from '@/lib/qr-encode'\n\n/*\n * QR Code gerado por um codificador próprio (src/lib/qr-encode.ts), sem biblioteca externa.\n * value vazio é o estado vazio legítimo; valor grande demais para caber até a versão 10 no\n * nível de correção pedido nunca quebra a tela, mostra um ícone com a falha declarada.\n */\n\nexport interface QrCodeProps {\n value: string\n /** Lado do quadrado, em pixels. */\n size?: number\n errorCorrection?: ErrorCorrectionLevel\n className?: string\n 'aria-label'?: string\n emptyLabel?: string\n errorLabel?: string\n}\n\n/** Um único QR Code por tela; nunca crie um segundo componente parecido para outro tamanho. */\nexport function QrCode({\n value,\n size = 160,\n errorCorrection = 'medium',\n className,\n emptyLabel = 'Nenhum valor para gerar o QR Code.',\n errorLabel = 'Não foi possível gerar o QR Code: o valor é grande demais.',\n ...aria\n}: QrCodeProps) {\n const result = useMemo(() => {\n if (!value) return { status: 'empty' as const, matrix: null }\n try {\n return { status: 'ready' as const, matrix: encodeQrMatrix(value, errorCorrection) }\n } catch (e) {\n if (e instanceof QrEncodingError) return { status: 'error' as const, matrix: null }\n throw e\n }\n }, [value, errorCorrection])\n\n if (result.status === 'empty') {\n return (\n <div\n data-rendra=\"QRC-001\"\n style={{ '--size': `${size}px` } as CSSProperties}\n className={cn('flex size-var items-center justify-center', className)}\n >\n <EmptyState size=\"compact\" title={emptyLabel} />\n </div>\n )\n }\n\n if (result.status === 'error') {\n return (\n <div\n data-rendra=\"QRC-001\"\n role=\"img\"\n aria-label={errorLabel}\n style={{ '--size': `${size}px` } as CSSProperties}\n className={cn(\n 'flex size-var flex-col items-center justify-center gap-2 rounded-control border border-dashed border-input p-2 text-center text-muted-foreground',\n className,\n )}\n >\n <TriangleAlert className=\"size-icon-lg\" aria-hidden />\n <span className=\"text-xs\">{errorLabel}</span>\n </div>\n )\n }\n\n const path = qrMatrixToSvgPath(result.matrix)\n return (\n <svg\n data-rendra=\"QRC-001\"\n role=\"img\"\n aria-label={aria['aria-label'] ?? `Código QR de ${value}`}\n viewBox={`0 0 ${result.matrix.size} ${result.matrix.size}`}\n style={{ '--size': `${size}px` } as CSSProperties}\n className={cn('size-var text-foreground', className)}\n >\n <path d={path} fill=\"currentColor\" />\n </svg>\n )\n}\n","import { RadioGroup as R } from 'radix-ui'\nimport { useState, type ComponentProps, type ReactNode } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface RadioOption {\n value: string\n label: ReactNode\n description?: ReactNode\n icon?: ReactNode\n disabled?: boolean\n}\n\nexport interface RadioGroupProps {\n options: RadioOption[]\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n /** list: bolinha e texto; cards: cartões selecionáveis com ícone e descrição. */\n variant?: 'list' | 'cards'\n /** Colunas dos cards a partir de md (no mobile sempre 1). */\n columns?: 1 | 2 | 3\n orientation?: 'vertical' | 'horizontal'\n invalid?: boolean\n disabled?: boolean\n id?: string\n name?: string\n 'aria-describedby'?: string\n 'aria-label'?: string\n}\n\nconst cols = { 1: '', 2: 'md:grid-cols-2', 3: 'md:grid-cols-3' } as const\n\n/**\n * O item do Radix. Em `on` ele é um `m.button` (asChild) que responde ao toque (whileTap 0,97,\n * em `press`); em `off` é o `R.Item` de sempre, sem nó novo.\n */\nfunction Item({ children, ...props }: ComponentProps<typeof R.Item>) {\n const presets = useMotionPresets()\n const lib = useMotionLib()\n if (!lib) return <R.Item {...props}>{children}</R.Item>\n return (\n <R.Item asChild {...props}>\n <lib.m.button\n type=\"button\"\n whileTap={presets.press.whileTap}\n transition={presets.press.transition}\n >\n {children}\n </lib.m.button>\n </R.Item>\n )\n}\n\n/** Radio único: em lista ou em cards, por prop. */\nexport function RadioGroup({\n options,\n value,\n defaultValue,\n onChange,\n variant = 'list',\n columns = 2,\n orientation = 'vertical',\n invalid,\n disabled,\n id,\n name,\n ...aria\n}: RadioGroupProps) {\n const lib = useMotionLib()\n const on = lib !== null\n const presets = useMotionPresets()\n // Só em `on`: o valor é espelhado aqui (controlado ou não) para a bolinha animar a escala\n // nos dois sentidos pelos presets; o Radix segue dono da seleção.\n const [inner, setInner] = useState(defaultValue)\n const current = value ?? inner\n const dotFor = (optionValue: string) => (\n <span\n aria-hidden\n className={cn(\n 'flex size-icon-md shrink-0 items-center justify-center rounded-full border border-input bg-card transition-colors group-data-[state=checked]:border-primary',\n invalid && 'border-destructive',\n )}\n >\n {on ? (\n // Nunca scale(0): a bolinha vai de 0,9 com opacidade 0 até 1, em `fast`, sem quique.\n <lib.m.span\n className=\"size-2 rounded-full bg-primary\"\n initial={false}\n animate={current === optionValue ? presets.indicator.animate : presets.indicator.initial}\n transition={presets.indicator.transition}\n />\n ) : (\n <span className=\"size-2 scale-90 rounded-full bg-primary opacity-0 transition-[transform,opacity] duration-(--rendra-duration-fast) ease-out group-data-[state=checked]:scale-100 group-data-[state=checked]:opacity-100\" />\n )}\n </span>\n )\n\n return (\n <R.Root\n id={id}\n name={name}\n value={on ? current : value}\n defaultValue={on ? undefined : defaultValue}\n onValueChange={(v) => {\n if (on) setInner(v)\n onChange?.(v)\n }}\n disabled={disabled}\n aria-invalid={invalid || undefined}\n aria-describedby={aria['aria-describedby']}\n aria-label={aria['aria-label']}\n data-rendra={resolveCatalogCode('RadioGroup', { variant })}\n className={cn(\n variant === 'cards'\n ? cn('grid grid-cols-1 gap-3', cols[columns])\n : orientation === 'horizontal'\n ? 'flex flex-col sm:flex-row sm:flex-wrap sm:gap-x-6'\n : 'flex flex-col',\n )}\n >\n {options.map((o) =>\n variant === 'cards' ? (\n <Item\n key={o.value}\n value={o.value}\n disabled={o.disabled}\n className={cn(\n 'group relative flex cursor-pointer items-start gap-3 rounded-control border bg-card p-4 text-left transition-[border-color,box-shadow,background-color]',\n 'hover:border-primary data-[state=checked]:border-primary data-[state=checked]:bg-primary-soft data-[state=checked]:ring-1 data-[state=checked]:ring-primary',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n invalid && 'border-destructive',\n )}\n >\n {o.icon && (\n <span className=\"flex size-control-sm shrink-0 items-center justify-center rounded-control bg-muted text-foreground transition-colors group-data-[state=checked]:bg-primary group-data-[state=checked]:text-primary-foreground md:size-control-md [&_svg]:size-icon-md\">\n {o.icon}\n </span>\n )}\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"text-sm font-semibold\">{o.label}</span>\n {o.description && (\n <span className=\"text-sm text-muted-foreground\">{o.description}</span>\n )}\n </span>\n {dotFor(o.value)}\n </Item>\n ) : (\n <label\n key={o.value}\n className={cn(\n 'flex min-h-touch cursor-pointer items-start gap-3 py-3 md:min-h-0 md:py-1',\n o.disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n <Item\n value={o.value}\n disabled={o.disabled}\n className=\"group flex pt-px outline-none focus-visible:[&>span]:focus-ring\"\n >\n {dotFor(o.value)}\n </Item>\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"text-sm font-medium\">{o.label}</span>\n {o.description && (\n <span className=\"text-sm text-muted-foreground\">{o.description}</span>\n )}\n </span>\n </label>\n ),\n )}\n </R.Root>\n )\n}\n","import { Star } from 'lucide-react'\nimport { useRef, useState, type KeyboardEvent } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { cn } from '@/lib/cn'\n\n/*\n * Avaliação: estrelas (1 a max, padrão 5) ou escala numérica (min a max, padrão 1 a 10).\n * value null é \"sem resposta ainda\", nunca 0: clicar de novo na opção marcada desmarca e\n * devolve null. Semântica de radiogroup, com as setas trocando (e marcando) a opção.\n */\n\nexport interface RatingProps {\n variant?: 'stars' | 'scale'\n value: number | null\n onChange?: (value: number | null) => void\n /** stars: total de estrelas (padrão 5). scale: valor máximo (padrão 10, até 10). */\n max?: number\n /** Só a escala: valor mínimo (padrão 1). */\n min?: number\n /** Só a escala: rótulo da ponta de baixo. */\n lowLabel?: string\n /** Só a escala: rótulo da ponta de cima. */\n highLabel?: string\n disabled?: boolean\n invalid?: boolean\n id?: string\n 'aria-label'?: string\n 'aria-describedby'?: string\n}\n\nfunction toneClass(ratio: number): string {\n if (ratio <= 1 / 3)\n return 'data-[state=checked]:border-destructive data-[state=checked]:bg-destructive-soft data-[state=checked]:text-destructive-soft-foreground'\n if (ratio <= 2 / 3)\n return 'data-[state=checked]:border-warning data-[state=checked]:bg-warning-soft data-[state=checked]:text-warning-soft-foreground'\n return 'data-[state=checked]:border-success data-[state=checked]:bg-success-soft data-[state=checked]:text-success-soft-foreground'\n}\n\nexport function Rating({\n variant = 'stars',\n value,\n onChange,\n max,\n min = 1,\n lowLabel,\n highLabel,\n disabled,\n invalid,\n id,\n ...aria\n}: RatingProps) {\n const groupRef = useRef<HTMLDivElement>(null)\n const [focusIndex, setFocusIndex] = useState(0)\n const effectiveMax = max ?? (variant === 'stars' ? 5 : 10)\n const options =\n variant === 'stars'\n ? Array.from({ length: effectiveMax }, (_, i) => i + 1)\n : Array.from({ length: Math.max(0, effectiveMax - min + 1) }, (_, i) => i + min)\n\n const selectedIndex = value !== null ? options.indexOf(value) : -1\n const activeIndex = selectedIndex >= 0 ? selectedIndex : focusIndex\n\n const select = (n: number) => {\n if (disabled) return\n onChange?.(value === n ? null : n)\n }\n\n const focusOption = (index: number) => {\n setFocusIndex(index)\n const el = groupRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]')[index]\n el?.focus()\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>, index: number) => {\n const map: Record<string, number> = {\n ArrowRight: index + 1,\n ArrowDown: index + 1,\n ArrowLeft: index - 1,\n ArrowUp: index - 1,\n Home: 0,\n End: options.length - 1,\n }\n if (!(event.key in map)) return\n event.preventDefault()\n const next = Math.min(options.length - 1, Math.max(0, map[event.key] as number))\n focusOption(next)\n select(options[next] as number)\n }\n\n const code = resolveCatalogCode('Rating', { variant })\n\n if (variant === 'stars') {\n return (\n <div\n ref={groupRef}\n id={id}\n role=\"radiogroup\"\n aria-label={aria['aria-label']}\n aria-describedby={aria['aria-describedby']}\n aria-invalid={invalid || undefined}\n data-rendra={code}\n className=\"inline-flex gap-1\"\n >\n {options.map((n, index) => {\n const filled = value !== null && n <= value\n return (\n <button\n key={n}\n type=\"button\"\n role=\"radio\"\n aria-checked={n === value}\n aria-label={`${n} ${n === 1 ? 'estrela' : 'estrelas'}`}\n tabIndex={index === activeIndex ? 0 : -1}\n disabled={disabled}\n onClick={() => select(n)}\n onKeyDown={(e) => onKeyDown(e, index)}\n onFocus={() => setFocusIndex(index)}\n className={cn(\n 'flex min-h-touch min-w-touch items-center justify-center rounded-control text-muted-foreground transition-colors focus-visible:focus-ring md:size-control-sm md:min-h-0 md:min-w-0',\n filled && 'text-warning',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n <Star className={cn('size-icon-lg', filled && 'fill-current')} aria-hidden />\n </button>\n )\n })}\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div\n ref={groupRef}\n id={id}\n role=\"radiogroup\"\n aria-label={aria['aria-label']}\n aria-describedby={aria['aria-describedby']}\n aria-invalid={invalid || undefined}\n data-rendra={code}\n className=\"grid grid-cols-5 gap-2 sm:flex sm:flex-wrap\"\n >\n {options.map((n, index) => {\n const ratio = options.length > 1 ? (n - min) / (effectiveMax - min) : 1\n return (\n <button\n key={n}\n type=\"button\"\n role=\"radio\"\n aria-checked={n === value}\n aria-label={`Nota ${n}`}\n tabIndex={index === activeIndex ? 0 : -1}\n disabled={disabled}\n data-state={n === value ? 'checked' : undefined}\n onClick={() => select(n)}\n onKeyDown={(e) => onKeyDown(e, index)}\n onFocus={() => setFocusIndex(index)}\n className={cn(\n 'flex aspect-square min-h-touch items-center justify-center rounded-control border border-input bg-card text-sm font-medium tabular-nums transition-colors focus-visible:focus-ring sm:flex-1',\n 'hover:border-primary',\n toneClass(ratio),\n invalid && 'border-destructive',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {n}\n </button>\n )\n })}\n </div>\n {(lowLabel || highLabel) && (\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>{lowLabel}</span>\n <span>{highLabel}</span>\n </div>\n )}\n </div>\n )\n}\n","import { cn } from '@/lib/cn'\n\n/*\n * Crédito discreto \"Feito com Rendra\", para o rodapé da tela de login (nunca na sidebar).\n * Ligado por padrão; some com credit={false}. Texto e link são substituíveis por prop.\n * Abre em nova aba, com alvo de toque de 44px no celular e texto de apoio em cor muted.\n *\n * Remover o crédito da interface é permitido: a licença MIT pede que o aviso de copyright\n * e o arquivo LICENSE fiquem no código e nas cópias, não que haja crédito visível na tela.\n */\n\nexport const RENDRA_CREDIT_TEXT = 'Feito com Rendra'\nexport const RENDRA_CREDIT_HREF = 'https://github.com/bsmagalhaes/rendra-ui-web'\n\nexport interface RendraCreditProps {\n /** Padrão true; false remove o crédito. */\n credit?: boolean\n /** Padrão \"Feito com Rendra\". */\n text?: string\n /** Padrão: o repositório do Rendra Design System. */\n href?: string\n className?: string\n}\n\nexport function RendraCredit({\n credit = true,\n text = RENDRA_CREDIT_TEXT,\n href = RENDRA_CREDIT_HREF,\n className,\n}: RendraCreditProps) {\n if (!credit) return null\n return (\n <a\n data-rendra=\"CRED-001\"\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'inline-flex min-h-touch items-center self-center rounded-item px-2 text-xs text-muted-foreground transition-colors hover:text-primary-text hover:underline md:min-h-0 md:py-1',\n className,\n )}\n >\n {text} <span className=\"sr-only\">(abre em nova aba)</span>\n </a>\n )\n}\n","import { Star, Trash2 } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@/lib/cn'\n\n/*\n * Campo repetível: uma lista de itens do mesmo formulário (telefones, e-mails, endereços...),\n * cada um desenhado por renderField. Marcar um como principal desmarca os outros; remover o\n * principal passa o papel para o primeiro item restante. Tudo dentro do próprio componente,\n * sem botão solto na tela.\n */\n\nexport interface RepeatableItem {\n id: string\n isPrimary?: boolean\n}\n\nexport interface RepeatableFieldProps<T extends RepeatableItem> {\n items: T[]\n onChange: (items: T[]) => void\n /** Cria um item novo (com id próprio) quando a pessoa clica em \"Adicionar\". */\n createItem: () => T\n /** Desenha os campos de um item; update aplica um patch parcial nesse item. */\n renderField: (item: T, update: (patch: Partial<T>) => void, index: number) => ReactNode\n /** Mostra o controle de \"marcar como principal\" em cada item. */\n showPrimary?: boolean\n maxItems?: number\n addLabel?: string\n emptyLabel?: string\n disabled?: boolean\n className?: string\n}\n\n/** Uma lista repetível por finalidade: telefones, e-mails, endereços e afins usam este componente. */\nexport function RepeatableField<T extends RepeatableItem>({\n items,\n onChange,\n createItem,\n renderField,\n showPrimary = false,\n maxItems,\n addLabel = 'Adicionar',\n emptyLabel = 'Nenhum item adicionado ainda.',\n disabled = false,\n className,\n}: RepeatableFieldProps<T>) {\n const update = (id: string, patch: Partial<T>) =>\n onChange(items.map((item) => (item.id === id ? { ...item, ...patch } : item)))\n\n const setPrimary = (id: string) =>\n onChange(items.map((item) => ({ ...item, isPrimary: item.id === id })))\n\n const remove = (id: string) => {\n const removedWasPrimary = items.find((item) => item.id === id)?.isPrimary\n const rest = items.filter((item) => item.id !== id)\n if (\n removedWasPrimary &&\n showPrimary &&\n rest.length > 0 &&\n !rest.some((item) => item.isPrimary)\n ) {\n rest[0] = { ...(rest[0] as T), isPrimary: true }\n }\n onChange(rest)\n }\n\n const add = () => onChange([...items, createItem()])\n\n const reachedMax = maxItems !== undefined && items.length >= maxItems\n\n return (\n <div data-rendra=\"REP-001\" className={cn('flex flex-col gap-4', className)}>\n {items.length === 0 && <p className=\"text-sm text-muted-foreground\">{emptyLabel}</p>}\n {items.map((item, index) => (\n <div key={item.id} className=\"flex flex-col gap-3 rounded-control border bg-card p-4\">\n <div className=\"flex flex-wrap items-start gap-3\">\n {/* min-w-24: piso de largura para o campo nunca ficar espremido pelas ações ao\n lado (ex.: telefone com o seletor de DDI); sem espaço, as ações quebram a linha. */}\n <div className=\"min-w-24 flex-1\">\n {renderField(item, (patch) => update(item.id, patch), index)}\n </div>\n <div className=\"flex shrink-0 items-center gap-1 pt-1\">\n {showPrimary && (\n <Button\n type=\"button\"\n variant={item.isPrimary ? 'secondary' : 'ghost'}\n size=\"sm\"\n icon={<Star className={item.isPrimary ? 'fill-current' : undefined} />}\n aria-pressed={item.isPrimary}\n disabled={disabled}\n onClick={() => setPrimary(item.id)}\n >\n {item.isPrimary ? 'Principal' : 'Tornar principal'}\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n icon={<Trash2 />}\n aria-label={`Remover item ${index + 1}`}\n disabled={disabled}\n onClick={() => remove(item.id)}\n />\n </div>\n </div>\n </div>\n ))}\n <Button type=\"button\" variant=\"outline\" disabled={disabled || reachedMax} onClick={add}>\n {addLabel}\n </Button>\n </div>\n )\n}\n","import { cn } from '@/lib/cn'\n\n/** Separador: hierarquia dentro de um card (no lugar de card dentro de card). */\nexport function Separator({\n orientation = 'horizontal',\n label,\n className,\n}: {\n orientation?: 'horizontal' | 'vertical'\n /** Texto no meio da linha (ex.: \"ou\"). */\n label?: string\n className?: string\n}) {\n if (label) {\n return (\n <div\n role=\"separator\"\n data-rendra=\"SEP-001\"\n className={cn('flex items-center gap-3', className)}\n >\n <span className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs text-muted-foreground\">{label}</span>\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n )\n }\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n data-rendra=\"SEP-001\"\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-px w-full' : 'w-px self-stretch',\n className,\n )}\n />\n )\n}\n","import type { HTMLAttributes } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionMode } from '@/lib/motion'\n\n/**\n * Bloco de carregamento. Monte o skeleton com a mesma estrutura do conteúdo final. Em `off` pulsa\n * (animate-pulse do Tailwind); em `on` um brilho suave cruza o bloco (skeleton-shimmer, em\n * globals.css: transform, tempo e curva pelos tokens, parado com \"reduzir movimento\").\n */\nexport function Skeleton({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n const on = useMotionMode() === 'on'\n return (\n <div\n aria-hidden\n data-slot=\"skeleton\"\n data-rendra=\"SKEL-001\"\n className={cn(on ? 'skeleton-shimmer' : 'animate-pulse', 'rounded-block bg-muted', className)}\n {...props}\n />\n )\n}\n","import { ArrowDownRight, ArrowUpRight, Minus } from 'lucide-react'\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { Card } from '@/components/ui/card'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { cn } from '@/lib/cn'\nimport { useMotionAdopted, useMotionLib, useMotionOn, useMotionPresets } from '@/lib/motion'\nimport { formatLike, parseLocaleNumber, type ParsedNumber } from '@/lib/motion/count'\n\nexport interface StatCardProps {\n label: string\n value: ReactNode\n /** Variação em %, positiva ou negativa. */\n change?: number\n /** Texto ao lado da variação (ex.: \"vs. mês anterior\"). */\n changeLabel?: string\n /** Quando cair é bom (ex.: custo), inverte as cores da variação. */\n inverse?: boolean\n icon?: ReactNode\n /** Destaque com o degradê suave do template. Use em no máximo um card por tela. */\n highlight?: boolean\n loading?: boolean\n /** Conteúdo extra no rodapé (ex.: mini gráfico). */\n footer?: ReactNode\n className?: string\n}\n\n/** Contagem de 0 até o valor, com o formato do texto original; no fim mostra o `value` exato. */\nfunction Counter({ parsed, value }: { parsed: ParsedNumber; value: ReactNode }) {\n const { animate, m, useMotionValue, useTransform } = useMotionOn()\n const presets = useMotionPresets()\n // Montado na troca tardia do `off` para o `on`: o número já estava na tela com o valor final,\n // então aparece direto, sem voltar a 0 para contar de novo.\n const [skip] = useState(useMotionAdopted())\n const progress = useMotionValue(skip ? parsed.value : 0)\n const text = useTransform(progress, (n) => formatLike(parsed, n))\n const [done, setDone] = useState(skip)\n useEffect(() => {\n if (skip) return\n const controls = animate(progress, parsed.value, {\n duration: presets.tokens.reveal.count,\n ease: presets.tokens.ease.out,\n onComplete: () => setDone(true),\n })\n return () => controls.stop()\n }, [animate, progress, parsed.value, presets.tokens, skip])\n return <m.span {...presets.fade}>{done ? value : text}</m.span>\n}\n\n/**\n * O valor do card. Em `off`, o valor como sempre veio. Em `on`, número (ou texto pt-BR com\n * número) conta até o valor; qualquer outra coisa só aparece com fade. Com \"reduzir movimento\"\n * o valor final aparece direto.\n */\nfunction StatValue({ value }: { value: ReactNode }) {\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const parsed = useMemo(() => parseLocaleNumber(value), [value])\n if (!lib) return <>{value}</>\n if (!parsed || presets.reduced) return <lib.m.span {...presets.fade}>{value}</lib.m.span>\n return <Counter key={String(value)} parsed={parsed} value={value} />\n}\n\n/** Card de indicador. Em grid: 1 coluna no mobile, 2 para cards pequenos. */\nexport function StatCard({\n label,\n value,\n change,\n changeLabel,\n inverse,\n icon,\n highlight,\n loading,\n footer,\n className,\n}: StatCardProps) {\n const up = (change ?? 0) > 0\n const flat = !change\n const good = inverse ? !up : up\n const TrendIcon = flat ? Minus : up ? ArrowUpRight : ArrowDownRight\n\n return (\n <Card\n data-rendra=\"STAT-001\"\n className={cn('@container gap-3 p-4 md:p-6', highlight && 'bg-gradient-soft', className)}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n {icon && (\n <span\n aria-hidden\n className=\"flex size-8 shrink-0 items-center justify-center rounded-control bg-primary-soft text-primary-soft-foreground [&_svg]:size-icon-sm\"\n >\n {icon}\n </span>\n )}\n </div>\n {loading ? (\n <>\n <Skeleton className=\"h-8 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </>\n ) : (\n <>\n <span className=\"text-2xl font-semibold tracking-tight tabular-nums @xs:text-3xl\">\n <StatValue value={value} />\n </span>\n {change !== undefined && (\n <span className=\"flex flex-wrap items-center gap-1 text-xs\">\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-item px-1 font-medium tabular-nums',\n flat\n ? 'bg-muted text-muted-foreground'\n : good\n ? 'bg-success-soft text-success-soft-foreground'\n : 'bg-destructive-soft text-destructive-soft-foreground',\n )}\n >\n <TrendIcon className=\"size-3\" aria-hidden />\n {change > 0 ? '+' : ''}\n {change.toLocaleString('pt-BR', { maximumFractionDigits: 1 })}%\n </span>\n {changeLabel && <span className=\"text-muted-foreground\">{changeLabel}</span>}\n </span>\n )}\n </>\n )}\n {footer}\n </Card>\n )\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Devolve o valor só depois que ele para de mudar por `delay` ms.\n * Usado na busca da Table remota: uma requisição por pausa na digitação, não por tecla.\n */\nexport function useDebouncedValue<T>(value: T, delay = 300): T {\n const [debounced, setDebounced] = useState(value)\n useEffect(() => {\n const t = window.setTimeout(() => setDebounced(value), delay)\n return () => window.clearTimeout(t)\n }, [value, delay])\n return debounced\n}\n","import {\n columnFilteringFeature,\n columnVisibilityFeature,\n createExpandedRowModel,\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n filterFn_includesString,\n globalFilteringFeature,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n sortFn_alphanumeric,\n sortFn_basic,\n tableFeatures,\n useTable,\n type ColumnDef,\n type ColumnVisibilityState,\n type RowData,\n type RowSelectionState,\n type SortingState,\n} from '@tanstack/react-table'\nimport { format } from 'date-fns'\nimport {\n ArrowDown,\n ArrowUp,\n ChevronDown,\n ChevronsUpDown,\n MoreHorizontal,\n RotateCw,\n} from 'lucide-react'\nimport { Collapsible } from 'radix-ui'\nimport { Fragment, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { useRendraLink } from '@/components/rendra-provider'\nimport { Badge, type BadgeProps } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card } from '@/components/ui/card'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { DataToolbar, type DataToolbarProps } from '@/components/ui/data-toolbar'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { EmptyState } from '@/components/ui/empty-state'\nimport { Pagination } from '@/components/ui/pagination'\nimport { Select } from '@/components/ui/select'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { Tooltip } from '@/components/ui/tooltip'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { useDebouncedValue } from '@/hooks/use-debounced-value'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\nimport { formatCurrency } from '@/lib/masks'\n\n/* ================================================================ tipos */\n\nexport interface TableColumn<T> {\n id: string\n header: string\n /** Valor da célula (para ordenar, buscar e formatar). */\n accessor: (row: T) => unknown\n /** Renderização própria da célula. */\n cell?: (row: T) => ReactNode\n /**\n * Linhas extras abaixo do valor, em texto menor (ex.: razão social e CNPJ abaixo do nome;\n * e-mail abaixo do telefone). Valores vazios são ignorados.\n */\n details?: (row: T) => (ReactNode | null | undefined)[]\n /** O valor vira link para esta rota (ex.: abrir o cadastro), com hover de clicável. */\n href?: (row: T) => string\n /**\n * Formato automático: number e currency alinham à direita; date vira DD/MM/AAAA;\n * badge usa badgeTone para escolher a cor.\n */\n kind?: 'text' | 'number' | 'currency' | 'date' | 'badge'\n badgeTone?: (row: T) => BadgeProps['tone']\n align?: 'left' | 'right' | 'center'\n sortable?: boolean\n /** Pode ser ocultada pelo menu Colunas. */\n hideable?: boolean\n /** Começa oculta (o usuário mostra pelo menu Colunas). */\n hidden?: boolean\n /** Linhas máximas do texto antes das reticências (máximo 3). */\n lines?: 1 | 2 | 3\n /**\n * No mobile, a tabela vira cards:\n * primary no topo do card (até 3; o primeiro é o título)\n * secondary recolhido em \"Ver detalhes\"\n * hidden não aparece no card\n */\n mobile?: 'primary' | 'secondary' | 'hidden'\n /** Largura mínima no desktop. */\n width?: 'sm' | 'md' | 'lg'\n}\n\nexport interface RowAction<T> {\n label: string\n icon?: ReactNode\n onClick: (row: T) => void\n destructive?: boolean\n hidden?: (row: T) => boolean\n}\n\n/** O que a Table pede ao servidor em cada carregamento (modo remoto, prop source). */\nexport interface TableQuery {\n /** Página, começando em 1. */\n page: number\n pageSize: number\n /** Texto da busca, aplicado pelo servidor a todos os registros (não só à página). */\n search: string\n sort: { id: string; desc: boolean } | null\n /** Cancela a requisição quando o usuário muda de página ou digita de novo. */\n signal: AbortSignal\n}\n\n/** Resposta do servidor: os registros da página e o total que atende à busca e aos filtros. */\nexport interface TablePage<T> {\n rows: T[]\n total: number\n}\n\n/** Registros por página em todas as tabelas do sistema. */\nexport const TABLE_PAGE_SIZE = 15\n\nexport interface TableProps<T> {\n /** Dados já carregados (modo local). Com source, é ignorado. */\n data?: T[]\n /**\n * Modo remoto: a Table pede ao servidor só a página visível. Busca, ordenação e\n * filtros são enviados na requisição e valem para todos os registros. A função precisa\n * ser estável (definida fora do componente ou com useCallback).\n */\n source?: (query: TableQuery) => Promise<TablePage<T>>\n /** Mude este valor quando filtros externos mudarem: a Table recarrega a partir da página 1. */\n queryKey?: string\n columns: TableColumn<T>[]\n getRowId: (row: T) => string\n /** Seleção por checkbox (primeira coluna; no mobile, no topo do card). */\n selectable?: boolean\n /** Conteúdo expandido da linha. */\n expandable?: (row: T) => ReactNode\n /** Ordenação por clique no cabeçalho (padrão por coluna: sortable). */\n sortable?: boolean\n /** Busca global: texto aplicado a todas as colunas. */\n globalFilter?: string\n /** Menu Colunas na barra de ferramentas. */\n columnVisibility?: boolean\n /** Ações em massa para os selecionados (botões). No mobile, barra fixa no rodapé da tela. */\n bulkActions?: (selected: T[], clear: () => void) => ReactNode\n /** Mais ações em massa, no menu de três pontinhos ao lado dos botões. */\n bulkMenu?: {\n label: string\n icon?: ReactNode\n destructive?: boolean\n onClick: (selected: T[], clear: () => void) => void\n }[]\n /** Ações por linha. Até 2 visíveis como ícone; acima disso, menu. */\n rowActions?: RowAction<T>[]\n density?: 'compact' | 'default' | 'comfortable'\n loading?: boolean\n error?: string | null\n onRetry?: () => void\n /** Estado vazio. */\n empty?: { title: string; description?: string; action?: ReactNode }\n /** Itens por página. Padrão: 15 (TABLE_PAGE_SIZE). Use 0 para mostrar tudo sem paginação. */\n pageSize?: number\n /** No mobile: \"anterior e próxima\" ou \"carregar mais\". */\n mobilePagination?: 'pages' | 'loadMore'\n /** Barra de ferramentas no mesmo card, acima da tabela. */\n toolbar?: Omit<DataToolbarProps, 'columns' | 'selectionBar' | 'sort'>\n /**\n * Colunas de situação (kind: 'badge') vão para o fim, logo antes das ações.\n * Padrão true; use false para manter a ordem exata de columns.\n */\n statusLast?: boolean\n /** Rótulo da tabela para leitores de tela. */\n 'aria-label': string\n}\n\n/* ================================================================ utilidades */\n\nconst densityRow = { compact: 'py-2', default: 'py-3', comfortable: 'py-4' } as const\nconst clamp = { 1: 'line-clamp-1', 2: 'line-clamp-2', 3: 'line-clamp-3' } as const\nconst minWidth = { sm: 'min-w-24', md: 'min-w-3xs', lg: 'min-w-sm' } as const\n\nfunction formatValue<T>(col: TableColumn<T>, row: T): ReactNode {\n if (col.cell) return col.cell(row)\n const v = col.accessor(row)\n if (v == null || v === '') return <span className=\"text-muted-foreground\">-</span>\n switch (col.kind) {\n case 'number':\n return Number(v).toLocaleString('pt-BR')\n case 'currency':\n return formatCurrency(Number(v))\n case 'date':\n return format(v instanceof Date ? v : new Date(String(v)), 'dd/MM/yyyy')\n case 'badge':\n return <Badge tone={col.badgeTone?.(row) ?? 'neutral'}>{String(v)}</Badge>\n default:\n return String(v)\n }\n}\n\n/** Valor da célula com link (href) e linhas extras (details), igual no desktop e no card. */\nfunction CellContent<T>({ col, row, title }: { col: TableColumn<T>; row: T; title?: boolean }) {\n const Link = useRendraLink()\n const main = formatValue(col, row)\n const extra = (col.details?.(row) ?? []).filter((d) => d != null && d !== '')\n const value = col.href ? (\n <Link\n to={col.href(row)}\n className={cn(\n 'rounded-item font-medium text-foreground underline-offset-4 transition-colors outline-none hover:text-primary-text hover:underline focus-visible:ring-2 focus-visible:ring-ring',\n title && 'inline-flex min-h-touch items-center md:min-h-0',\n )}\n >\n {main}\n </Link>\n ) : (\n main\n )\n if (!extra.length) return <>{value}</>\n return (\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"min-w-0\">{value}</span>\n {extra.map((d, i) => (\n <span key={i} className=\"truncate text-xs font-normal text-muted-foreground\">\n {d}\n </span>\n ))}\n </span>\n )\n}\n\nconst alignOf = <T,>(c: TableColumn<T>) =>\n c.align ?? (c.kind === 'number' || c.kind === 'currency' ? 'right' : 'left')\n\nfunction RowActions<T>({\n row,\n actions,\n mobile,\n}: {\n row: T\n actions: RowAction<T>[]\n mobile?: boolean\n}) {\n const list = actions.filter((a) => !a.hidden?.(row))\n const visible = list.length <= 2 ? list : list.slice(0, 1)\n const rest = list.length <= 2 ? [] : list.slice(1)\n return (\n <div\n className={cn('flex items-center gap-1', mobile ? 'w-full justify-end gap-2' : 'justify-end')}\n >\n {visible.map((a) =>\n mobile ? (\n <Button\n key={a.label}\n variant={a.destructive ? 'ghost' : 'outline'}\n size=\"sm\"\n icon={a.icon}\n onClick={() => a.onClick(row)}\n className={cn('flex-1', a.destructive && 'text-destructive')}\n >\n {a.label}\n </Button>\n ) : (\n <Tooltip key={a.label} content={a.label}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={a.label}\n onClick={() => a.onClick(row)}\n className={cn(\n a.destructive &&\n 'text-destructive hover:bg-destructive-soft hover:text-destructive-soft-foreground',\n )}\n >\n {a.icon}\n </Button>\n </Tooltip>\n ),\n )}\n {rest.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" iconOnly aria-label=\"Mais ações\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {rest.map((a) => (\n <DropdownMenuItem\n key={a.label}\n destructive={a.destructive}\n onSelect={() => a.onClick(row)}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )\n}\n\n/*\n * Features do TanStack Table 9, só as que o componente usa. Constante de módulo:\n * criada uma única vez, nunca a cada render. columnFilteringFeature é pré-requisito\n * técnico de globalFilteringFeature (sem UI de filtro de coluna).\n */\nconst tableFeatureSet = tableFeatures({\n rowSortingFeature,\n columnFilteringFeature,\n globalFilteringFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n columnVisibilityFeature,\n sortedRowModel: createSortedRowModel(),\n filteredRowModel: createFilteredRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n sortFns: { basic: sortFn_basic, alphanumeric: sortFn_alphanumeric },\n filterFns: { includesString: filterFn_includesString },\n})\n\n/* ================================================================ componente */\n\n/**\n * Table única do sistema (TanStack Table). Tudo é prop: seleção, expansão, ordenação,\n * busca, colunas visíveis, ações em massa e por linha, densidade e estados.\n * Mobile (< 768px): a mesma tabela vira lista de cards, sem rolagem horizontal.\n * Desktop: tabela larga rola na horizontal só dentro do próprio contêiner.\n */\n/**\n * Bloco \"Ver detalhes\" do card no celular. Em `on` a altura abre e fecha pelos presets e o\n * conteúdo fechado sai do DOM; em `off` é o Collapsible de sempre, com as animações em CSS.\n */\nfunction MobileDetails({ children }: { children: ReactNode }) {\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const [open, setOpen] = useState(false)\n const trigger = (\n <Collapsible.Trigger className=\"group flex min-h-touch cursor-pointer items-center gap-1 text-sm font-medium text-primary-text\">\n <span className=\"group-data-[state=open]:hidden\">Ver detalhes</span>\n <span className=\"hidden group-data-[state=open]:inline\">Ocultar detalhes</span>\n <ChevronDown\n className=\"size-icon-sm transition-transform duration-(--rendra-duration-base) ease-move group-data-[state=open]:rotate-180\"\n aria-hidden\n />\n </Collapsible.Trigger>\n )\n if (lib) {\n return (\n <Collapsible.Root open={open} onOpenChange={setOpen}>\n {trigger}\n <lib.AnimatePresence initial={false}>\n {open && (\n <Collapsible.Content forceMount asChild>\n <lib.m.div\n className=\"overflow-hidden\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={presets.fade.transition}\n >\n {children}\n </lib.m.div>\n </Collapsible.Content>\n )}\n </lib.AnimatePresence>\n </Collapsible.Root>\n )\n }\n return (\n <Collapsible.Root>\n {trigger}\n <Collapsible.Content className=\"overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\">\n {children}\n </Collapsible.Content>\n </Collapsible.Root>\n )\n}\n\nexport function Table<T>({\n data: dataProp,\n source,\n queryKey = '',\n columns: columnsProp,\n statusLast = true,\n getRowId,\n selectable,\n expandable,\n sortable = true,\n globalFilter,\n columnVisibility,\n bulkActions,\n bulkMenu,\n rowActions,\n density = 'default',\n loading,\n error,\n onRetry,\n empty,\n pageSize: pageSizeProp = TABLE_PAGE_SIZE,\n mobilePagination = 'pages',\n toolbar,\n ...aria\n}: TableProps<T>) {\n const { isMobile } = useBreakpoint()\n const lib = useMotionLib()\n const on = lib !== null\n const presets = useMotionPresets()\n // Linhas e cards NÃO animam a entrada, em nenhum modo (W3): a tabela é tela de dezenas de\n // vezes por dia, e a cascata a cada página, filtro ou ordenação a faria parecer lenta. O que\n // anima aqui é só a expansão da linha (altura e opacidade), que explica uma mudança de estado.\n const columns = useMemo(\n () =>\n statusLast\n ? [\n ...columnsProp.filter((c) => c.kind !== 'badge'),\n ...columnsProp.filter((c) => c.kind === 'badge'),\n ]\n : columnsProp,\n [columnsProp, statusLast],\n )\n const [sorting, setSorting] = useState<SortingState>([])\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({})\n const [visibility, setVisibility] = useState<ColumnVisibilityState>(() =>\n Object.fromEntries(columnsProp.filter((c) => c.hidden).map((c) => [c.id, false])),\n )\n const [expanded, setExpanded] = useState<Record<string, boolean>>({})\n const pageSize = pageSizeProp || undefined\n const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: pageSize ?? 0 })\n const [mobilePage, setMobilePage] = useState(1)\n\n /* ---------------- modo remoto: uma requisição por página */\n const remote = Boolean(source)\n const search = useDebouncedValue(globalFilter?.trim() ?? '', 300)\n const sortKey = sorting[0] ? `${sorting[0].id}:${sorting[0].desc ? 'desc' : 'asc'}` : ''\n // Busca, ordenação ou filtros novos voltam para a página 1 no mesmo render (sem pedir a\n // página antiga com a busca nova).\n const resetKey = `${search}|${sortKey}|${queryKey}`\n const [lastResetKey, setLastResetKey] = useState(resetKey)\n if (remote && resetKey !== lastResetKey) {\n setLastResetKey(resetKey)\n setPagination((p) => ({ ...p, pageIndex: 0 }))\n setMobilePage(1)\n }\n const [reload, setReload] = useState(0)\n const [server, setServer] = useState<{\n rows: T[]\n total: number\n loading: boolean\n error: string | null\n }>({ rows: [], total: 0, loading: remote, error: null })\n const page = isMobile ? mobilePage : pagination.pageIndex + 1\n const size = (isMobile ? pageSize : pagination.pageSize) || TABLE_PAGE_SIZE\n // No mobile com \"carregar mais\", cada página nova soma às anteriores.\n const append = isMobile && mobilePagination === 'loadMore' && page > 1\n\n useEffect(() => {\n if (!source) return\n const controller = new AbortController()\n setServer((s) => ({ ...s, loading: true, error: null }))\n const [sortId, sortDir] = sortKey.split(':')\n source({\n page,\n pageSize: size,\n search,\n sort: sortId ? { id: sortId, desc: sortDir === 'desc' } : null,\n signal: controller.signal,\n })\n .then((res) => {\n if (controller.signal.aborted) return\n setServer((s) => ({\n rows: append ? [...s.rows, ...res.rows] : res.rows,\n total: res.total,\n loading: false,\n error: null,\n }))\n })\n .catch((e: unknown) => {\n if (controller.signal.aborted) return\n setServer((s) => ({\n ...s,\n loading: false,\n error: e instanceof Error ? e.message : 'Erro ao carregar os dados.',\n }))\n })\n return () => controller.abort()\n }, [source, page, size, search, sortKey, queryKey, reload, append])\n\n const data = remote ? server.rows : (dataProp ?? [])\n\n const defs = useMemo<ColumnDef<typeof tableFeatureSet, T & RowData>[]>(\n () =>\n columns.map((c) => ({\n id: c.id,\n header: c.header,\n accessorFn: (row: T & RowData) => {\n const v = c.accessor(row)\n return v instanceof Date ? v.getTime() : v\n },\n enableSorting: sortable && c.sortable !== false,\n enableHiding: c.hideable !== false,\n sortFn:\n c.kind === 'number' || c.kind === 'currency' || c.kind === 'date'\n ? 'basic'\n : 'alphanumeric',\n })),\n [columns, sortable],\n )\n\n const table = useTable({\n features: tableFeatureSet,\n data: data as (T & RowData)[],\n columns: defs,\n getRowId: (r) => getRowId(r),\n state: {\n sorting,\n rowSelection,\n columnVisibility: visibility,\n globalFilter,\n expanded,\n pagination,\n },\n onSortingChange: setSorting,\n onRowSelectionChange: setRowSelection,\n onColumnVisibilityChange: setVisibility,\n onExpandedChange: (u) =>\n setExpanded((prev) =>\n typeof u === 'function'\n ? (u(prev) as Record<string, boolean>)\n : (u as Record<string, boolean>),\n ),\n onPaginationChange: setPagination,\n enableRowSelection: Boolean(selectable),\n getRowCanExpand: () => Boolean(expandable),\n globalFilterFn: 'includesString',\n // Os quatro modelos ficam sempre registrados (features é constante de módulo); a\n // alternância local ou remoto é só pelas flags manual* e por rowCount, como na v8.\n manualSorting: remote,\n manualFiltering: remote,\n // Mobile fatia as linhas na mão (rows, mais abaixo); sem pageSize não pagina.\n manualPagination: remote || !pageSize || isMobile,\n ...(remote ? { rowCount: server.total } : { autoResetPageIndex: true }),\n })\n\n const colById = (id: string) => columns.find((c) => c.id === id)!\n const visibleCols = table.getVisibleLeafColumns().map((c) => colById(c.id))\n const selectedRows = table.getSelectedRowModel().rows.map((r) => r.original)\n const clearSelection = () => setRowSelection({})\n const bulkMenuButton =\n bulkMenu && bulkMenu.length > 0 ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" iconOnly aria-label=\"Mais ações para os selecionados\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {bulkMenu.map((a) => (\n <DropdownMenuItem\n key={a.label}\n destructive={a.destructive}\n onSelect={() => a.onClick(selectedRows, clearSelection)}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null\n const filteredCount = remote ? server.total : table.getFilteredRowModel().rows.length\n const allRows = table.getRowModel().rows\n const isLoading = Boolean(loading) || (remote && server.loading && !append)\n const loadError = error ?? (remote ? server.error : null)\n const retry = onRetry ?? (remote ? () => setReload((n) => n + 1) : undefined)\n const rows =\n !isMobile || !pageSize || remote\n ? allRows\n : mobilePagination === 'loadMore'\n ? allRows.slice(0, mobilePage * pageSize)\n : allRows.slice((mobilePage - 1) * pageSize, mobilePage * pageSize)\n const pad = densityRow[density]\n\n /* ---------------- barra de ferramentas */\n const hideableCols = columns.filter((c) => c.hideable !== false)\n const sortControl =\n isMobile && sortable ? (\n <Select\n label=\"Ordenar por\"\n placeholder=\"Ordem padrão\"\n clearable\n value={sorting[0] ? `${sorting[0].id}:${sorting[0].desc ? 'desc' : 'asc'}` : null}\n onChange={(v) => {\n if (!v) return setSorting([])\n const [id, dir] = v.split(':')\n setSorting([{ id: id ?? '', desc: dir === 'desc' }])\n }}\n options={columns\n .filter((c) => c.sortable !== false)\n .flatMap((c) => [\n { value: `${c.id}:asc`, label: `${c.header} (crescente)` },\n { value: `${c.id}:desc`, label: `${c.header} (decrescente)` },\n ])}\n />\n ) : undefined\n\n const selectionBar =\n selectable && selectedRows.length > 0 ? (\n <>\n <span className=\"text-sm font-medium tabular-nums\">\n {selectedRows.length} {selectedRows.length === 1 ? 'selecionado' : 'selecionados'}\n </span>\n <div className=\"flex flex-wrap items-center gap-2\">\n {bulkActions?.(selectedRows, clearSelection)}\n {bulkMenuButton}\n </div>\n <Button variant=\"ghost\" className=\"ml-auto\" onClick={clearSelection}>\n Limpar seleção\n </Button>\n </>\n ) : undefined\n\n const showToolbar = toolbar || columnVisibility || (isMobile && sortable)\n\n /* ---------------- estados */\n const state = (() => {\n if (loadError)\n return (\n <EmptyState\n type=\"error\"\n size=\"compact\"\n title=\"Não foi possível carregar\"\n description={loadError}\n actions={\n retry && (\n <Button variant=\"outline\" icon={<RotateCw />} onClick={retry}>\n Tentar de novo\n </Button>\n )\n }\n />\n )\n if (!isLoading && filteredCount === 0)\n return (\n <EmptyState\n size=\"compact\"\n title={globalFilter ? 'Nenhum resultado' : (empty?.title ?? 'Nada por aqui ainda')}\n description={\n globalFilter ? 'Tente outros termos ou limpe os filtros.' : empty?.description\n }\n actions={!globalFilter && empty?.action}\n />\n )\n return null\n })()\n\n /* ---------------- mobile: cards */\n const mobileBody = () => {\n const primary = visibleCols.filter((c) => (c.mobile ?? 'secondary') === 'primary').slice(0, 3)\n const secondary = visibleCols.filter((c) => (c.mobile ?? 'secondary') === 'secondary')\n if (isLoading)\n return (\n <ul className=\"flex flex-col divide-y\">\n {Array.from({ length: 4 }, (_, i) => (\n <li key={i} className=\"flex flex-col gap-3 p-4\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-3 w-1/2\" />\n <Skeleton className=\"h-3 w-1/3\" />\n </li>\n ))}\n </ul>\n )\n return (\n <ul className=\"flex flex-col divide-y\">\n {rows.map((r) => {\n const row = r.original\n const [title, ...others] = primary\n return (\n <li\n key={r.id}\n className={cn('flex flex-col gap-3 p-4', r.getIsSelected() && 'bg-primary-soft/50')}\n >\n <div className=\"flex items-start gap-3\">\n {selectable && (\n <Checkbox\n checked={r.getIsSelected()}\n onCheckedChange={(v) => r.toggleSelected(v)}\n aria-label=\"Selecionar linha\"\n />\n )}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n {title && (\n <span className=\"line-clamp-2 text-base font-semibold\">\n <CellContent col={title} row={row} title />\n </span>\n )}\n {others.map((c) => (\n <span\n key={c.id}\n className=\"flex flex-wrap items-center gap-2 text-sm text-muted-foreground\"\n >\n <span className=\"sr-only\">{c.header}: </span>\n <CellContent col={c} row={row} />\n </span>\n ))}\n </div>\n </div>\n {(secondary.length > 0 || expandable) && (\n <MobileDetails>\n <dl className=\"grid grid-cols-1 gap-3 pt-2 sm:grid-cols-2\">\n {secondary.map((c) => (\n <div key={c.id} className=\"flex flex-col gap-1\">\n <dt className=\"text-xs text-muted-foreground\">{c.header}</dt>\n <dd className=\"text-sm\">\n <CellContent col={c} row={row} />\n </dd>\n </div>\n ))}\n </dl>\n {expandable && <div className=\"pt-3\">{expandable(row)}</div>}\n </MobileDetails>\n )}\n {rowActions && rowActions.length > 0 && (\n <div className=\"border-t pt-3\">\n <RowActions row={row} actions={rowActions} mobile />\n </div>\n )}\n </li>\n )\n })}\n </ul>\n )\n }\n\n /* ---------------- desktop: tabela */\n const desktopBody = () => (\n <div className=\"scrollbar-subtle overflow-x-auto\" data-allow-overflow>\n <table className=\"w-full border-collapse text-sm\" aria-label={aria['aria-label']}>\n <thead className=\"border-b bg-muted/50\">\n <tr>\n {selectable && (\n <th scope=\"col\" className=\"w-12 pr-2 pl-4\">\n <Checkbox\n aria-label=\"Selecionar todas as linhas da página\"\n checked={\n table.getIsAllPageRowsSelected()\n ? true\n : table.getIsSomePageRowsSelected()\n ? 'indeterminate'\n : false\n }\n onCheckedChange={(v) => table.toggleAllPageRowsSelected(v)}\n />\n </th>\n )}\n {expandable && <th scope=\"col\" className=\"w-12\" aria-label=\"Expandir\" />}\n {table.getVisibleLeafColumns().map((tc) => {\n const c = colById(tc.id)\n const sorted = tc.getIsSorted()\n const align = alignOf(c)\n return (\n <th\n key={tc.id}\n scope=\"col\"\n aria-sort={\n sorted === 'asc' ? 'ascending' : sorted === 'desc' ? 'descending' : undefined\n }\n className={cn(\n 'px-4 py-3 text-xs font-medium whitespace-nowrap text-muted-foreground',\n align === 'right'\n ? 'text-right'\n : align === 'center'\n ? 'text-center'\n : 'text-left',\n c.width && minWidth[c.width],\n )}\n >\n {tc.getCanSort() ? (\n <button\n type=\"button\"\n onClick={tc.getToggleSortingHandler()}\n className={cn(\n 'inline-flex cursor-pointer items-center gap-1 rounded-item hover:text-foreground',\n align === 'right' && 'flex-row-reverse',\n sorted && 'text-foreground',\n )}\n >\n {c.header}\n {sorted === 'asc' ? (\n <ArrowUp className=\"size-3\" aria-hidden />\n ) : sorted === 'desc' ? (\n <ArrowDown className=\"size-3\" aria-hidden />\n ) : (\n <ChevronsUpDown className=\"size-3 opacity-50\" aria-hidden />\n )}\n </button>\n ) : (\n c.header\n )}\n </th>\n )\n })}\n {rowActions && (\n <th\n scope=\"col\"\n className=\"sticky right-0 w-24 bg-muted px-4 text-right text-xs font-medium text-muted-foreground\"\n >\n <span className=\"sr-only\">Ações</span>\n </th>\n )}\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {isLoading\n ? Array.from({ length: 5 }, (_, i) => (\n <tr key={i}>\n {selectable && (\n <td className=\"pr-2 pl-4\">\n <Skeleton className=\"size-icon-md\" />\n </td>\n )}\n {expandable && <td />}\n {visibleCols.map((c) => (\n <td key={c.id} className={cn('px-4', pad)}>\n <Skeleton\n className={cn('h-3', alignOf(c) === 'right' ? 'ml-auto w-16' : 'w-3/4')}\n />\n </td>\n ))}\n {rowActions && (\n <td className=\"px-4\">\n <Skeleton className=\"ml-auto h-6 w-16\" />\n </td>\n )}\n </tr>\n ))\n : rows.map((r) => {\n const row = r.original\n return (\n <Fragment key={r.id}>\n <tr\n data-state={r.getIsSelected() ? 'selected' : undefined}\n className=\"group/row transition-colors hover:bg-muted/40 data-[state=selected]:bg-primary-soft/60\"\n >\n {selectable && (\n <td className=\"pr-2 pl-4\">\n <Checkbox\n aria-label=\"Selecionar linha\"\n checked={r.getIsSelected()}\n onCheckedChange={(v) => r.toggleSelected(v)}\n />\n </td>\n )}\n {expandable && (\n <td className=\"px-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={r.getIsExpanded() ? 'Recolher linha' : 'Expandir linha'}\n aria-expanded={r.getIsExpanded()}\n onClick={() => r.toggleExpanded()}\n >\n <ChevronDown\n className={cn(\n 'transition-transform',\n r.getIsExpanded() && 'rotate-180',\n )}\n />\n </Button>\n </td>\n )}\n {visibleCols.map((c) => {\n const align = alignOf(c)\n return (\n <td\n key={c.id}\n className={cn(\n 'px-4 align-middle',\n pad,\n align === 'right'\n ? 'text-right tabular-nums'\n : align === 'center'\n ? 'text-center'\n : 'text-left',\n c.width && minWidth[c.width],\n )}\n >\n <div\n className={cn(clamp[c.lines ?? 2], align === 'right' && 'ml-auto')}\n >\n <CellContent col={c} row={row} />\n </div>\n </td>\n )\n })}\n {rowActions && (\n <td className=\"sticky right-0 w-24 bg-card px-4 group-hover/row:bg-muted group-data-[state=selected]/row:bg-primary-soft\">\n <RowActions row={row} actions={rowActions} />\n </td>\n )}\n </tr>\n {expandable && !on && r.getIsExpanded() && (\n <tr className=\"bg-muted/30\">\n <td\n colSpan={\n visibleCols.length + (selectable ? 1 : 0) + 1 + (rowActions ? 1 : 0)\n }\n className=\"px-4 py-4\"\n >\n {expandable(row)}\n </td>\n </tr>\n )}\n {expandable && on && (\n <lib.AnimatePresence initial={false}>\n {r.getIsExpanded() && (\n <tr key=\"expanded\" className=\"bg-muted/30\">\n <td\n colSpan={\n visibleCols.length + (selectable ? 1 : 0) + 1 + (rowActions ? 1 : 0)\n }\n className=\"px-4\"\n >\n <lib.m.div\n className=\"overflow-hidden\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={presets.fade.transition}\n >\n <div className=\"py-4\">{expandable(row)}</div>\n </lib.m.div>\n </td>\n </tr>\n )}\n </lib.AnimatePresence>\n )}\n </Fragment>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n\n const total = filteredCount\n return (\n <Card\n data-rendra=\"TAB-001\"\n className=\"overflow-hidden\"\n aria-busy={isLoading || server.loading || undefined}\n // Marca a carga remota (os testes esperam a primeira página chegar).\n data-remote-loading={(remote && server.loading) || undefined}\n >\n {showToolbar && (\n <DataToolbar\n {...toolbar}\n sort={sortControl}\n selectionBar={selectionBar}\n columns={\n columnVisibility\n ? hideableCols.map((c) => ({\n id: c.id,\n label: c.header,\n visible: table.getColumn(c.id)?.getIsVisible() ?? true,\n onToggle: (v) => table.getColumn(c.id)?.toggleVisibility(v),\n }))\n : undefined\n }\n />\n )}\n\n {state ?? (isMobile ? mobileBody() : desktopBody())}\n\n {pageSize && !state && (!isLoading || remote) && total > 0 && (\n <div className=\"flex justify-end border-t p-4\">\n <Pagination\n className=\"w-full\"\n page={isMobile ? mobilePage : pagination.pageIndex + 1}\n pageSize={isMobile ? pageSize : pagination.pageSize}\n total={total}\n mobileMode={mobilePagination}\n loading={remote && server.loading}\n onPageChange={(p) =>\n isMobile ? setMobilePage(p) : setPagination((s) => ({ ...s, pageIndex: p - 1 }))\n }\n onPageSizeChange={(s) => setPagination({ pageIndex: 0, pageSize: s })}\n />\n </div>\n )}\n\n {/* Mobile: ações em massa em barra fixa no rodapé da tela */}\n {isMobile && selectable && selectedRows.length > 0 && (\n <div className=\"fixed inset-x-0 bottom-0 z-40 flex flex-col gap-3 border-t bg-card px-4 pt-3 pb-safe shadow-lg\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium tabular-nums\">\n {selectedRows.length} {selectedRows.length === 1 ? 'selecionado' : 'selecionados'}\n </span>\n <Button variant=\"ghost\" size=\"sm\" onClick={clearSelection}>\n Limpar\n </Button>\n </div>\n <div className={cn('grid gap-3', bulkMenuButton ? 'grid-actions-3' : 'grid-cols-2')}>\n {bulkMenuButton}\n {bulkActions?.(selectedRows, clearSelection)}\n </div>\n </div>\n )}\n </Card>\n )\n}\n","import { forwardRef, useState, type TextareaHTMLAttributes } from 'react'\nimport { cn } from '@/lib/cn'\n\nexport interface TextareaProps extends Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'onChange'\n> {\n invalid?: boolean\n /** Mostra contador \"12/200\". Usa maxLength quando definido. */\n counter?: boolean\n value?: string\n onChange?: (value: string) => void\n}\n\n/** Textarea único, com contador opcional. Cresce com o conteúdo até a altura máxima e depois rola por dentro. */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { invalid, counter, value, defaultValue, onChange, maxLength, rows = 4, className, ...props },\n ref,\n) {\n const [inner, setInner] = useState(String(value ?? defaultValue ?? ''))\n const current = value ?? inner\n return (\n <div className={cn('flex min-w-0 flex-col gap-1', className)}>\n <textarea\n ref={ref}\n rows={rows}\n maxLength={maxLength}\n value={current}\n data-rendra=\"TXT-001\"\n aria-invalid={invalid || undefined}\n onChange={(e) => {\n setInner(e.target.value)\n onChange?.(e.target.value)\n }}\n className={cn(\n 'field-sizing-content max-h-chart-md min-h-24 w-full resize-y rounded-control border border-input bg-field px-3 py-2 text-base transition-[border-color,box-shadow] outline-none placeholder:text-muted-foreground hover:border-foreground/40 focus:border-ring focus:bg-card focus:ring-2 focus:ring-ring/25 disabled:cursor-not-allowed disabled:opacity-60 md:text-sm',\n invalid && 'border-destructive focus:border-destructive focus:ring-destructive/25',\n )}\n {...props}\n />\n {counter && (\n <span\n aria-live=\"polite\"\n className={cn(\n 'self-end text-xs text-muted-foreground tabular-nums',\n maxLength && current.length >= maxLength && 'font-medium text-destructive',\n )}\n >\n {current.length}\n {maxLength ? `/${maxLength}` : ''}\n </span>\n )}\n </div>\n )\n})\n","import { toast as sonner, Toaster as SonnerToaster } from 'sonner'\nimport type { FeedbackType } from '@/brand/types'\nimport { useBrand } from '@/brand/use-brand'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\n\n/*\n * Toast único (Sonner), com o ícone de feedback da marca e o formato do template.\n * Uso: toast.success('Cliente salvo', { description: '...' }), toast.error(...), etc.\n * Coloque <Toaster /> uma vez na raiz da aplicação.\n */\n\nconst tone: Record<FeedbackType, string> = {\n success: 'border-success/25',\n error: 'border-destructive/25',\n warning: 'border-warning/25',\n info: 'border-info/25',\n}\n\ninterface ToastOptions {\n description?: string\n action?: { label: string; onClick: () => void }\n duration?: number\n}\n\nfunction show(type: FeedbackType, title: string, opts: ToastOptions = {}) {\n return sonner.custom(\n (id) => (\n <div\n role={type === 'error' ? 'alert' : 'status'}\n data-rendra=\"TST-001\"\n className={cn(\n 'flex w-full items-start gap-3 rounded-control border bg-popover p-4 text-popover-foreground shadow-lg',\n tone[type],\n )}\n >\n <BrandFeedbackIcon type={type} size=\"lg\" animated className=\"mt-px\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <p className=\"text-sm font-semibold wrap-break-word\">{title}</p>\n {opts.description && (\n <p className=\"text-sm wrap-break-word text-muted-foreground\">{opts.description}</p>\n )}\n </div>\n {opts.action && (\n <button\n type=\"button\"\n onClick={() => {\n opts.action?.onClick()\n sonner.dismiss(id)\n }}\n className=\"-my-1 flex min-h-touch shrink-0 cursor-pointer items-center rounded-item px-2 text-sm font-semibold text-primary-text hover:bg-accent md:min-h-0 md:py-1\"\n >\n {opts.action.label}\n </button>\n )}\n </div>\n ),\n { duration: opts.duration ?? (type === 'error' ? 8000 : 4000) },\n )\n}\n\nexport const toast = {\n success: (title: string, opts?: ToastOptions) => show('success', title, opts),\n error: (title: string, opts?: ToastOptions) => show('error', title, opts),\n warning: (title: string, opts?: ToastOptions) => show('warning', title, opts),\n info: (title: string, opts?: ToastOptions) => show('info', title, opts),\n dismiss: sonner.dismiss,\n}\n\n/** Posição: embaixo no centro no mobile (perto do polegar), canto inferior direito no desktop. */\nexport function Toaster() {\n const { isMobile } = useBreakpoint()\n const { resolvedMode } = useBrand()\n return (\n <SonnerToaster\n position={isMobile ? 'bottom-center' : 'bottom-right'}\n theme={resolvedMode}\n offset={16}\n mobileOffset={{ bottom: 88, left: 16, right: 16 }}\n visibleToasts={3}\n toastOptions={{ unstyled: true, className: 'w-full' }}\n />\n )\n}\n","import { FileText, ImageIcon, RotateCw, Trash2, UploadCloud, VideoIcon } from 'lucide-react'\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type DragEvent,\n type ElementType,\n type ReactNode,\n} from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { Button } from '@/components/ui/button'\nimport { ImageCropper, type ImageCropperAspect } from '@/components/ui/image-cropper'\nimport { Progress } from '@/components/ui/progress'\nimport { SortableHandle } from '@/components/ui/sortable-handle'\nimport { cn } from '@/lib/cn'\nimport {\n layoutEnabled,\n useLayoutReady,\n useMotionLib,\n useMotionMode,\n useMotionPresets,\n} from '@/lib/motion'\nimport { useSortable } from '@/lib/sortable'\n\nexport interface UploadItem {\n id: string\n file: File\n progress: number\n status: 'uploading' | 'done' | 'error'\n error?: string\n /** URL local (miniatura) para imagem ou vídeo; revogada ao remover ou desmontar. */\n previewUrl?: string\n /** Espelha progress (0-100), lido pelo layout \"gallery\". */\n progressPercent?: number\n /** Espelha error, lido pelo layout \"gallery\". */\n errorMessage?: string\n kind?: 'image' | 'video' | 'other'\n}\n\nexport interface UploadProps {\n /** Tipos aceitos, como no input file (ex.: \"image/*,.pdf\"). */\n accept?: string\n multiple?: boolean\n /** Tamanho máximo por arquivo, em MB. */\n maxSizeMb?: number\n /** Envia o arquivo; chame onProgress(0..100). Rejeite a promessa em caso de erro. */\n onUpload?: (file: File, onProgress: (pct: number) => void) => Promise<void>\n onChange?: (items: UploadItem[]) => void\n hint?: string\n disabled?: boolean\n invalid?: boolean\n id?: string\n /** Lista (padrão) ou galeria com miniaturas. */\n layout?: 'list' | 'gallery'\n /** Total de arquivos permitido; passando dele, a área de soltar arquivo some. */\n maxItems?: number\n /** Além da remoção interna, avisa quem usa o Upload (ex.: para apagar no servidor). */\n onRemove?: (id: string) => void\n /** Além da tentativa interna, avisa quem usa o Upload que o arquivo tentou de novo. */\n onRetry?: (id: string) => void\n /** Reordena os arquivos (motor de src/lib/sortable.ts, o mesmo da List e do Kanban). */\n onReorder?: (ids: string[]) => void\n /**\n * Com ela, toda imagem passa pelo recorte antes de virar arquivo enviado: o arquivo só é\n * entregue (a onUpload e a onChange) depois de confirmado no recorte.\n */\n crop?: { aspects: ImageCropperAspect[]; maxOutputWidth?: number }\n 'aria-describedby'?: string\n}\n\nconst formatSize = (b: number) =>\n b < 1024 * 1024\n ? `${Math.max(1, Math.round(b / 1024))} KB`\n : `${(b / 1024 / 1024).toLocaleString('pt-BR', { maximumFractionDigits: 1 })} MB`\n\nfunction kindOf(file: File): NonNullable<UploadItem['kind']> {\n if (file.type.startsWith('image/')) return 'image'\n if (file.type.startsWith('video/')) return 'video'\n return 'other'\n}\n\n/** Upload único: arrastar e soltar ou tocar para escolher, em lista ou em galeria. */\nexport function Upload({\n accept,\n multiple = true,\n maxSizeMb = 10,\n onUpload,\n onChange,\n hint,\n disabled,\n invalid,\n id,\n layout = 'list',\n maxItems,\n onRemove,\n onRetry,\n onReorder,\n crop,\n ...aria\n}: UploadProps) {\n const auto = useId()\n const inputId = id ?? `upload${auto}`\n const inputRef = useRef<HTMLInputElement>(null)\n const [drag, setDrag] = useState(false)\n const [items, setItems] = useState<UploadItem[]>([])\n const [pendingCrop, setPendingCrop] = useState<File[]>([])\n const code = resolveCatalogCode('Upload', { layout })\n\n const itemsRef = useRef<UploadItem[]>([])\n itemsRef.current = items\n useEffect(\n () => () => {\n // Revoga toda miniatura ao desmontar: object URL nunca sobrevive à tela.\n itemsRef.current.forEach((it) => it.previewUrl && URL.revokeObjectURL(it.previewUrl))\n },\n [],\n )\n\n const update = (fn: (all: UploadItem[]) => UploadItem[]) =>\n setItems((all) => {\n const next = fn(all)\n onChange?.(next)\n return next\n })\n\n const patch = (id: string, changes: Partial<UploadItem>) =>\n update((all) =>\n all.map((i) => {\n if (i.id !== id) return i\n const merged = { ...i, ...changes }\n if ('progress' in changes) merged.progressPercent = merged.progress\n if ('error' in changes) merged.errorMessage = merged.error\n return merged\n }),\n )\n\n /**\n * Acrescenta os itens novos (multiple) ou substitui o que já existia (multiple=false),\n * revogando a miniatura do que sai: o object URL nunca fica pendurado sem tela nenhuma\n * usando ele.\n */\n const insertItems = (created: UploadItem[]) =>\n update((all) => {\n if (multiple) return [...all, ...created]\n all.forEach((it) => it.previewUrl && URL.revokeObjectURL(it.previewUrl))\n return created\n })\n\n const send = (item: UploadItem) => {\n if (!onUpload) {\n patch(item.id, { progress: 100, status: 'done' })\n return\n }\n onUpload(item.file, (pct) => patch(item.id, { progress: pct }))\n .then(() => patch(item.id, { progress: 100, status: 'done' }))\n .catch((e: unknown) =>\n patch(item.id, {\n status: 'error',\n error: e instanceof Error ? e.message : 'Falha no envio.',\n }),\n )\n }\n\n const createItem = (file: File): UploadItem => {\n const tooBig = file.size > maxSizeMb * 1024 * 1024\n const kind = kindOf(file)\n return {\n id: `${file.name}-${file.size}-${crypto.randomUUID()}`,\n file,\n progress: 0,\n progressPercent: 0,\n status: tooBig ? 'error' : 'uploading',\n error: tooBig ? `Arquivo maior que ${maxSizeMb} MB.` : undefined,\n errorMessage: tooBig ? `Arquivo maior que ${maxSizeMb} MB.` : undefined,\n previewUrl: kind !== 'other' ? URL.createObjectURL(file) : undefined,\n kind,\n }\n }\n\n const acceptFiles = (files: File[]) => {\n const room = maxItems ? Math.max(0, maxItems - items.length - pendingCrop.length) : undefined\n const limited = room !== undefined ? files.slice(0, room) : files\n if (limited.length === 0) return\n if (crop) {\n const toCrop = limited.filter((f) => kindOf(f) === 'image')\n const rest = limited.filter((f) => kindOf(f) !== 'image')\n if (toCrop.length > 0) setPendingCrop((q) => [...q, ...toCrop])\n if (rest.length > 0) {\n const created = rest.map(createItem)\n insertItems(created)\n created.filter((c) => c.status === 'uploading').forEach(send)\n }\n return\n }\n const created = limited.map(createItem)\n insertItems(created)\n created.filter((c) => c.status === 'uploading').forEach(send)\n }\n\n const add = (files: FileList | null) => {\n if (!files) return\n acceptFiles(Array.from(files).slice(0, multiple ? undefined : 1))\n }\n\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDrag(false)\n if (!disabled) add(e.dataTransfer.files)\n }\n\n const remove = (removeId: string) => {\n update((all) => {\n const removed = all.find((i) => i.id === removeId)\n if (removed?.previewUrl) URL.revokeObjectURL(removed.previewUrl)\n return all.filter((i) => i.id !== removeId)\n })\n onRemove?.(removeId)\n }\n\n const retry = (it: UploadItem) => {\n patch(it.id, { status: 'uploading', progress: 0, error: undefined })\n send({ ...it, status: 'uploading', progress: 0 })\n onRetry?.(it.id)\n }\n\n const sortable = useSortable<UploadItem>({\n items: items.map((it) => ({ id: it.id, data: it })),\n onReorder: (sorted) => {\n update(() => sorted.map((s) => s.data))\n onReorder?.(sorted.map((s) => s.id))\n },\n })\n const motion = useMotionMode()\n const lib = useMotionLib()\n const ready = useLayoutReady()\n const presets = useMotionPresets()\n // Em `on` cada item entra e sai animado (a saída segura o item até terminar) e reordena com\n // layout, pela mesma regra da List: sem layout durante o arraste.\n const Item: ElementType = lib ? lib.m.li : 'li'\n const itemMotion =\n motion === 'on'\n ? {\n ...presets.fade,\n layout: layoutEnabled({ mode: motion, ready, dragging: sortable.draggingId !== null }),\n transition: { ...presets.fade.transition, layout: presets.move },\n }\n : {}\n const animated = (nodes: ReactNode) =>\n lib ? (\n <lib.AnimatePresence mode=\"popLayout\" initial={false}>\n {nodes}\n </lib.AnimatePresence>\n ) : (\n nodes\n )\n\n const reachedLimit = maxItems !== undefined && items.length + pendingCrop.length >= maxItems\n\n const dropzone = !reachedLimit && (\n <label\n htmlFor={inputId}\n onDragOver={(e) => {\n e.preventDefault()\n if (!disabled) setDrag(true)\n }}\n onDragLeave={() => setDrag(false)}\n onDrop={onDrop}\n className={cn(\n 'flex cursor-pointer flex-col items-center justify-center gap-3 rounded-control border-2 border-dashed border-input bg-card px-4 py-8 text-center transition-colors',\n 'hover:border-primary hover:bg-primary-soft/40 has-[:focus-visible]:focus-ring',\n drag && 'border-primary bg-primary-soft',\n invalid && 'border-destructive',\n disabled && 'pointer-events-none opacity-60',\n )}\n >\n <span className=\"flex size-12 items-center justify-center rounded-full bg-primary-soft text-primary-soft-foreground\">\n <UploadCloud className=\"size-icon-lg\" aria-hidden />\n </span>\n <span className=\"flex flex-col gap-1\">\n <span className=\"text-sm font-medium\">\n <span className=\"text-primary-text\">Toque para escolher</span>\n <span className=\"hidden md:inline\"> ou arraste arquivos até aqui</span>\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {hint ?? `Até ${maxSizeMb} MB por arquivo.`}\n </span>\n </span>\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n aria-describedby={aria['aria-describedby']}\n className=\"sr-only\"\n onChange={(e) => {\n add(e.target.files)\n e.target.value = ''\n }}\n />\n </label>\n )\n\n const handle = (it: UploadItem) =>\n onReorder && (\n <SortableHandle id={it.id} label={`Reordenar ${it.file.name}`} sortable={sortable} />\n )\n\n const listView = items.length > 0 && (\n <ul\n key={String(ready)}\n className=\"flex flex-col divide-y rounded-control border bg-card\"\n aria-live=\"polite\"\n >\n {animated(\n items.map((it) => (\n <Item\n key={it.id}\n {...(onReorder ? sortable.itemProps(it.id) : {})}\n {...itemMotion}\n className={cn(\n 'flex items-center gap-3 p-3',\n sortable.draggingId === it.id && 'opacity-50',\n )}\n >\n {handle(it)}\n <span className=\"flex size-control-sm shrink-0 items-center justify-center rounded-item bg-muted text-muted-foreground md:size-control-md\">\n {it.kind === 'image' ? (\n <ImageIcon className=\"size-icon-md\" aria-hidden />\n ) : it.kind === 'video' ? (\n <VideoIcon className=\"size-icon-md\" aria-hidden />\n ) : (\n <FileText className=\"size-icon-md\" aria-hidden />\n )}\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{it.file.name}</span>\n {it.status === 'done' && (\n <BrandFeedbackIcon type=\"success\" size=\"sm\" animated label=\"Enviado\" />\n )}\n {it.status === 'error' && <BrandFeedbackIcon type=\"error\" size=\"sm\" label=\"Erro\" />}\n </div>\n {it.status === 'error' ? (\n <span className=\"text-xs font-medium text-destructive\">{it.error}</span>\n ) : it.status === 'uploading' ? (\n <Progress\n value={it.progress}\n size=\"sm\"\n showValue\n label={`Enviando ${it.file.name}`}\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">{formatSize(it.file.size)}</span>\n )}\n </div>\n {it.status === 'error' && !it.error?.startsWith('Arquivo maior') && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Tentar enviar ${it.file.name} de novo`}\n onClick={() => retry(it)}\n >\n <RotateCw />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Remover ${it.file.name}`}\n onClick={() => remove(it.id)}\n >\n <Trash2 />\n </Button>\n </Item>\n )),\n )}\n </ul>\n )\n\n const galleryView = items.length > 0 && (\n <ul key={String(ready)} className=\"grid grid-cols-2 gap-3 md:grid-cols-3\">\n {animated(\n items.map((it) => (\n <Item\n key={it.id}\n {...(onReorder ? sortable.itemProps(it.id) : {})}\n {...itemMotion}\n className={cn(\n 'relative flex aspect-square flex-col overflow-hidden rounded-control border bg-card',\n sortable.draggingId === it.id && 'opacity-50',\n )}\n >\n {it.previewUrl && it.kind === 'image' ? (\n <img\n src={it.previewUrl}\n alt=\"\"\n className=\"size-full object-cover\"\n draggable={false}\n />\n ) : (\n <span className=\"flex flex-1 items-center justify-center text-muted-foreground\">\n {it.kind === 'video' ? (\n <VideoIcon className=\"size-icon-lg\" aria-hidden />\n ) : (\n <FileText className=\"size-icon-lg\" aria-hidden />\n )}\n </span>\n )}\n <span className=\"truncate bg-card/90 px-2 py-1 text-xs font-medium\">\n {it.file.name}\n </span>\n {it.status === 'uploading' && (\n <span className=\"absolute inset-x-2 bottom-8\">\n <Progress\n value={it.progressPercent ?? 0}\n size=\"sm\"\n label={`Enviando ${it.file.name}`}\n />\n </span>\n )}\n {it.status === 'error' && (\n <span className=\"absolute inset-x-2 bottom-8 truncate rounded-item bg-destructive-soft px-2 py-1 text-xs font-medium text-destructive-soft-foreground\">\n {it.errorMessage}\n </span>\n )}\n <span className=\"absolute top-1 right-1 flex gap-1\">\n {it.status === 'error' && !it.error?.startsWith('Arquivo maior') && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Tentar enviar ${it.file.name} de novo`}\n className=\"bg-card/90\"\n onClick={() => retry(it)}\n >\n <RotateCw />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Remover ${it.file.name}`}\n className=\"bg-card/90\"\n onClick={() => remove(it.id)}\n >\n <Trash2 />\n </Button>\n </span>\n <span className=\"absolute top-1 left-1 flex items-center gap-1\">\n {handle(it)}\n {it.status === 'done' && (\n <BrandFeedbackIcon type=\"success\" size=\"sm\" animated label=\"Enviado\" />\n )}\n </span>\n </Item>\n )),\n )}\n </ul>\n )\n\n return (\n <div data-rendra={code} className=\"flex min-w-0 flex-col gap-3\">\n {pendingCrop[0] && (\n <ImageCropper\n file={pendingCrop[0]}\n aspects={crop?.aspects ?? [{ id: 'livre', label: 'Livre', ratio: 1 }]}\n maxOutputWidth={crop?.maxOutputWidth}\n onCancel={() => setPendingCrop((q) => q.slice(1))}\n onConfirm={(cropped) => {\n setPendingCrop((q) => q.slice(1))\n const created = createItem(cropped)\n insertItems([created])\n if (created.status === 'uploading') send(created)\n }}\n />\n )}\n {dropzone}\n {layout === 'gallery' ? galleryView : listView}\n </div>\n )\n}\n","import { ArrowLeft, ArrowRight, Check, X } from 'lucide-react'\nimport { useRef, useState, type ReactNode } from 'react'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Progress } from '@/components/ui/progress'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface WizardStep {\n id: string\n title: string\n description?: string\n}\n\nexport type StepStatus = 'complete' | 'current' | 'pending' | 'error'\n\nexport interface StepperProps {\n steps: WizardStep[]\n /** Índice da etapa atual (0 é a primeira). */\n current: number\n /** Etapas com erro de validação (índices). */\n errors?: number[]\n orientation?: 'horizontal' | 'vertical'\n /** Permite voltar clicando em etapas concluídas. */\n onStepClick?: (index: number) => void\n className?: string\n}\n\nfunction statusOf(i: number, current: number, errors: number[]): StepStatus {\n if (errors.includes(i)) return 'error'\n if (i < current) return 'complete'\n if (i === current) return 'current'\n return 'pending'\n}\n\nconst statusLabel: Record<StepStatus, string> = {\n complete: 'concluída',\n current: 'atual',\n pending: 'pendente',\n error: 'com erro',\n}\n\n/**\n * Indicador de etapas. Desktop: todas as etapas (horizontal ou vertical).\n * Mobile: reconstruído como \"Etapa 2 de 5\", barra de progresso e nome da etapa.\n */\nexport function Stepper({\n steps,\n current,\n errors = [],\n orientation = 'horizontal',\n onStepClick,\n className,\n}: StepperProps) {\n const step = steps[current]\n const lib = useMotionLib()\n const presets = useMotionPresets()\n return (\n <div data-rendra=\"WIZ-002\" className={cn('min-w-0', className)}>\n {/* Mobile: indicador compacto */}\n <div className=\"flex flex-col gap-2 md:hidden\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <span className=\"text-xs font-medium text-muted-foreground tabular-nums\">\n Etapa {current + 1} de {steps.length}\n </span>\n {errors.includes(current) && (\n <span className=\"text-xs font-medium text-destructive\">Revise esta etapa</span>\n )}\n </div>\n <Progress\n value={((current + 1) / steps.length) * 100}\n size=\"sm\"\n tone=\"brand\"\n label=\"Progresso\"\n />\n <p className=\"text-base font-semibold\">{step?.title}</p>\n </div>\n\n {/* Desktop */}\n <ol\n className={cn(\n 'hidden md:flex',\n orientation === 'horizontal' ? 'items-start gap-2' : 'flex-col gap-1',\n )}\n >\n {steps.map((s, i) => {\n const st = statusOf(i, current, errors)\n const clickable = onStepClick && st === 'complete'\n const circle = (\n <span\n className={cn(\n 'flex size-8 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold tabular-nums transition-colors',\n st === 'complete' && 'border-primary bg-primary text-primary-foreground',\n st === 'current' && 'border-primary bg-card text-primary-text',\n st === 'pending' && 'border-border bg-card text-muted-foreground',\n st === 'error' && 'border-destructive bg-destructive text-destructive-foreground',\n )}\n >\n {st === 'complete' ? (\n lib ? (\n // O check da etapa concluída entra com o pop.\n <lib.m.span className=\"flex\" {...presets.pop}>\n <Check className=\"size-icon-sm\" strokeWidth={3} aria-hidden />\n </lib.m.span>\n ) : (\n <Check className=\"size-icon-sm\" strokeWidth={3} aria-hidden />\n )\n ) : st === 'error' ? (\n <X className=\"size-icon-sm\" strokeWidth={3} aria-hidden />\n ) : (\n i + 1\n )}\n </span>\n )\n const text = (\n <span className=\"flex min-w-0 flex-col gap-1 text-left\">\n <span\n className={cn(\n 'text-sm font-medium',\n st === 'pending' && 'text-muted-foreground',\n st === 'error' && 'text-destructive',\n )}\n >\n {s.title}\n </span>\n {s.description && (\n <span className=\"text-xs text-muted-foreground\">{s.description}</span>\n )}\n </span>\n )\n const inner = (\n <span className=\"flex items-start gap-3\">\n {circle}\n <span className=\"pt-1\">{text}</span>\n </span>\n )\n return (\n <li\n key={s.id}\n aria-current={st === 'current' ? 'step' : undefined}\n className={cn(\n 'flex min-w-0',\n orientation === 'horizontal' ? 'flex-1 flex-col gap-3' : 'flex-col',\n )}\n >\n <div\n className={cn('flex items-center gap-2', orientation === 'horizontal' && 'w-full')}\n >\n {clickable ? (\n <button\n type=\"button\"\n onClick={() => onStepClick(i)}\n className=\"cursor-pointer rounded-item text-left hover:opacity-80\"\n >\n {inner}\n </button>\n ) : (\n inner\n )}\n <span className=\"sr-only\">, {statusLabel[st]}</span>\n {orientation === 'horizontal' && i < steps.length - 1 && (\n <span\n aria-hidden\n className={cn(\n 'mt-4 h-px min-w-4 flex-1 self-start',\n i < current ? 'bg-primary' : 'bg-border',\n )}\n />\n )}\n </div>\n {orientation === 'vertical' && i < steps.length - 1 && (\n <span\n aria-hidden\n className={cn('ml-4 h-6 w-px', i < current ? 'bg-primary' : 'bg-border')}\n />\n )}\n </li>\n )\n })}\n </ol>\n </div>\n )\n}\n\nexport interface WizardProps {\n steps: WizardStep[]\n /** Conteúdo de cada etapa, na mesma ordem. */\n children: ReactNode[]\n /** Valida a etapa antes de avançar. Retorne false para bloquear (e marcar erro). */\n onValidateStep?: (index: number) => boolean | Promise<boolean>\n onFinish?: () => void | Promise<void>\n onCancel?: () => void\n /** Rótulo do cancelar da primeira etapa (só aparece com `onCancel`). Padrão: \"Cancelar\". */\n cancelLabel?: string\n /** Rótulo do voltar das etapas seguintes. Padrão: \"Voltar\". */\n backLabel?: string\n /** Rótulo do avançar (todas as etapas menos a última). Padrão: \"Avançar\". */\n nextLabel?: string\n finishLabel?: string\n /**\n * Torna a etapa opcional: \"Pular\" aparece no menu \"Mais ações\" da barra de ações (nunca na\n * última etapa), avança **sem validar** e limpa o erro da etapa. Sem esta prop não há menu.\n */\n onSkip?: () => void\n /** Rótulo do item de pular. Padrão: \"Pular\". */\n skipLabel?: string\n orientation?: 'horizontal' | 'vertical'\n /** Botões no rodapé fixo da tela. Padrão: não, seguem junto do card do wizard. */\n stickyFooter?: boolean\n}\n\n/** Cadastro em etapas, com validação por etapa e rodapé Voltar / Avançar. */\nexport function Wizard({\n steps,\n children,\n onValidateStep,\n onFinish,\n onCancel,\n cancelLabel = 'Cancelar',\n backLabel = 'Voltar',\n nextLabel = 'Avançar',\n finishLabel = 'Concluir',\n onSkip,\n skipLabel = 'Pular',\n orientation = 'horizontal',\n stickyFooter = false,\n}: WizardProps) {\n const [current, setCurrent] = useState(0)\n const [errors, setErrors] = useState<number[]>([])\n const [busy, setBusy] = useState(false)\n const last = current === steps.length - 1\n\n const next = async () => {\n setBusy(true)\n try {\n const ok = onValidateStep ? await onValidateStep(current) : true\n if (!ok) {\n setErrors((e) => [...new Set([...e, current])])\n return\n }\n setErrors((e) => e.filter((x) => x !== current))\n if (last) await onFinish?.()\n else setCurrent((c) => c + 1)\n } finally {\n setBusy(false)\n }\n }\n\n // Pular não passa pela validação: a etapa opcional fica em branco de propósito.\n const skip = () => {\n setErrors((e) => e.filter((x) => x !== current))\n setCurrent((c) => c + 1)\n onSkip?.()\n }\n\n const lib = useMotionLib()\n const presets = useMotionPresets()\n // Direção do passo (1 avança, -1 volta), guardada para a saída usar o sentido certo.\n const previous = useRef(current)\n const direction = current >= previous.current ? 1 : -1\n previous.current = current\n const body = lib ? (\n // `on`: a etapa nova entra de 8 px na direção do passo e a antiga sai por opacidade com\n // blur de 2 px, sem esperar (popLayout tira a que sai do fluxo: nada empurra a que entra).\n // A chave por etapa remonta o corpo: o estado local de campos não controlados se perde\n // (os campos do formulário do projeto são controlados, então o valor volta igual).\n <div className=\"relative flex min-w-0 flex-col gap-6\">\n <lib.AnimatePresence mode=\"popLayout\" initial={false}>\n <lib.m.div\n key={current}\n {...presets.swap(direction)}\n className=\"flex min-w-0 flex-col gap-6\"\n >\n {children[current]}\n </lib.m.div>\n </lib.AnimatePresence>\n </div>\n ) : (\n <div className=\"flex min-w-0 flex-col gap-6\">{children[current]}</div>\n )\n\n return (\n <div\n data-rendra=\"WIZ-001\"\n className={cn(\n 'flex min-w-0 flex-col gap-8',\n orientation === 'vertical' && 'md:flex-row md:gap-12',\n )}\n >\n <Stepper\n steps={steps}\n current={current}\n errors={errors}\n orientation={orientation}\n onStepClick={setCurrent}\n className={cn(orientation === 'vertical' && 'md:w-3xs md:shrink-0')}\n />\n <div className=\"flex min-w-0 flex-1 flex-col gap-8\">\n {body}\n <ActionBar\n sticky={stickyFooter}\n cancel={\n current > 0\n ? { label: backLabel, icon: <ArrowLeft />, onClick: () => setCurrent((c) => c - 1) }\n : onCancel\n ? { label: cancelLabel, onClick: onCancel }\n : undefined\n }\n secondary={onSkip && !last ? [{ label: skipLabel, onClick: skip }] : undefined}\n primary={{\n label: last ? finishLabel : nextLabel,\n icon: last ? <Check /> : <ArrowRight />,\n onClick: next,\n loading: busy,\n loadingLabel: last ? 'Concluindo...' : 'Validando...',\n }}\n />\n </div>\n </div>\n )\n}\n","import { Slot } from 'radix-ui'\nimport type { ElementType, HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport {\n alignClass,\n fieldGridClass,\n gapClass,\n justifyClass,\n type Align,\n type Justify,\n type Space,\n} from './tokens'\n\n/*\n * Primitivas de layout. Toda tela é composta por elas; classes de layout soltas\n * (flex, grid, gap, padding de página) nas telas são erro de revisão.\n */\n\ninterface BaseProps extends HTMLAttributes<HTMLElement> {\n as?: ElementType\n asChild?: boolean\n}\n\nfunction Box({ as: As = 'div', asChild, ...props }: BaseProps) {\n const Comp: ElementType = asChild ? Slot.Root : As\n return <Comp {...props} />\n}\n\n// ---------------------------------------------------------------- Container\n\nconst containerSize = {\n narrow: 'max-w-3xl',\n // Largura toda da área de conteúdo, com o mesmo respiro em todos os lados (16px/24px).\n default: 'max-w-none',\n full: 'max-w-none',\n} as const\n\nexport interface ContainerProps extends BaseProps {\n /** narrow: leitura e formulários; default: telas de sistema; full: sem limite. */\n size?: keyof typeof containerSize\n /** Respiro vertical de página (topo e base). Use no contêiner raiz de cada tela. */\n padded?: boolean\n}\n\n/** Largura máxima e padding lateral de página: 16px no mobile, 24px no tablet, 32px no desktop. */\nexport function Container({\n size = 'default',\n padded = false,\n className,\n ...props\n}: ContainerProps) {\n return (\n <Box\n className={cn(\n 'mx-auto w-full min-w-0 px-4 md:px-6',\n // Respiro igual em todos os lados: 16px no celular e 24px a partir do tablet.\n padded && 'py-4 md:py-6',\n containerSize[size],\n className,\n )}\n {...props}\n />\n )\n}\n\n// ---------------------------------------------------------------- Stack\n\nexport interface StackProps extends BaseProps {\n gap?: Space\n align?: Align\n}\n\n/** Empilha na vertical. gap=\"section\" para separar seções de página. */\nexport function Stack({ gap = '4', align = 'stretch', className, ...props }: StackProps) {\n return (\n <Box\n className={cn('flex min-w-0 flex-col', gapClass[gap], alignClass[align], className)}\n {...props}\n />\n )\n}\n\n// ---------------------------------------------------------------- Inline\n\nconst smAlignClass: Record<Align, string> = {\n start: 'sm:items-start',\n center: 'sm:items-center',\n end: 'sm:items-end',\n stretch: 'sm:items-stretch',\n baseline: 'sm:items-baseline',\n}\n\nexport interface InlineProps extends BaseProps {\n gap?: Space\n align?: Align\n justify?: Justify\n /** Quebra linha quando falta espaço (padrão). Com false, os filhos precisam poder encolher. */\n wrap?: boolean\n /** Empilha no mobile e alinha em linha a partir de sm. */\n stackOnMobile?: boolean\n}\n\n/** Alinha na horizontal, quebrando linha por padrão para nunca estourar a largura. */\nexport function Inline({\n gap = '2',\n align = 'center',\n justify = 'start',\n wrap = true,\n stackOnMobile = false,\n className,\n ...props\n}: InlineProps) {\n return (\n <Box\n className={cn(\n 'flex min-w-0',\n stackOnMobile ? 'flex-col items-stretch sm:flex-row' : 'flex-row',\n stackOnMobile ? smAlignClass[align] : alignClass[align],\n wrap && 'flex-wrap',\n gapClass[gap],\n justifyClass[justify],\n className,\n )}\n {...props}\n />\n )\n}\n\n// ---------------------------------------------------------------- Grid\n\ntype Cols = 1 | 2 | 3 | 4 | 6\nconst colsBase: Record<Cols, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n 6: 'grid-cols-6',\n}\nconst colsSm: Record<Cols, string> = {\n 1: 'sm:grid-cols-1',\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-3',\n 4: 'sm:grid-cols-4',\n 6: 'sm:grid-cols-6',\n}\nconst colsMd: Record<Cols, string> = {\n 1: 'md:grid-cols-1',\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-4',\n 6: 'md:grid-cols-6',\n}\nconst colsLg: Record<Cols, string> = {\n 1: 'lg:grid-cols-1',\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n 6: 'lg:grid-cols-6',\n}\nconst colsXl: Record<Cols, string> = {\n 1: 'xl:grid-cols-1',\n 2: 'xl:grid-cols-2',\n 3: 'xl:grid-cols-3',\n 4: 'xl:grid-cols-4',\n 6: 'xl:grid-cols-6',\n}\n// Container queries: a grade responde à largura do bloco onde está, não da tela.\nconst colsCqSm: Record<Cols, string> = {\n 1: '@sm:grid-cols-1',\n 2: '@sm:grid-cols-2',\n 3: '@sm:grid-cols-3',\n 4: '@sm:grid-cols-4',\n 6: '@sm:grid-cols-6',\n}\nconst colsCqMd: Record<Cols, string> = {\n 1: '@2xl:grid-cols-1',\n 2: '@2xl:grid-cols-2',\n 3: '@2xl:grid-cols-3',\n 4: '@2xl:grid-cols-4',\n 6: '@2xl:grid-cols-6',\n}\nconst colsCqLg: Record<Cols, string> = {\n 1: '@4xl:grid-cols-1',\n 2: '@4xl:grid-cols-2',\n 3: '@4xl:grid-cols-3',\n 4: '@4xl:grid-cols-4',\n 6: '@4xl:grid-cols-6',\n}\nconst colsCqXl: Record<Cols, string> = {\n 1: '@6xl:grid-cols-1',\n 2: '@6xl:grid-cols-2',\n 3: '@6xl:grid-cols-3',\n 4: '@6xl:grid-cols-4',\n 6: '@6xl:grid-cols-6',\n}\n\nexport interface GridProps extends BaseProps {\n /** Colunas por faixa. O padrão no mobile é sempre 1. */\n cols?: { base?: Cols; sm?: Cols; md?: Cols; lg?: Cols; xl?: Cols }\n gap?: Space\n /**\n * 'container' faz as colunas reagirem à largura do próprio bloco (@container),\n * útil dentro de drawers, cards laterais e colunas estreitas.\n */\n responsive?: 'screen' | 'container'\n /**\n * Grade de formulário: 12 colunas pela largura do bloco, com a largura de cada Field no\n * span (padrão 3 por linha). Ignora cols e responsive; o gap padrão vira \"fields\".\n */\n form?: boolean\n}\n\nexport function Grid({\n cols = { base: 1 },\n gap = '4',\n responsive = 'screen',\n form,\n className,\n children,\n ...props\n}: GridProps) {\n if (form) {\n return (\n <Box className={cn('@container min-w-0', className)} {...props}>\n <div className={cn(fieldGridClass, gapClass[gap === '4' ? 'fields' : gap])}>{children}</div>\n </Box>\n )\n }\n const cq = responsive === 'container'\n const grid = cn(\n 'grid min-w-0',\n colsBase[cols.base ?? 1],\n cols.sm && (cq ? colsCqSm : colsSm)[cols.sm],\n cols.md && (cq ? colsCqMd : colsMd)[cols.md],\n cols.lg && (cq ? colsCqLg : colsLg)[cols.lg],\n cols.xl && (cq ? colsCqXl : colsXl)[cols.xl],\n gapClass[gap],\n )\n if (cq) {\n return (\n <Box className={cn('@container min-w-0', className)} {...props}>\n <div className={grid}>{children}</div>\n </Box>\n )\n }\n return (\n <Box className={cn(grid, className)} {...props}>\n {children}\n </Box>\n )\n}\n\n// ---------------------------------------------------------------- Section\n\nexport interface SectionProps extends Omit<BaseProps, 'title'> {\n title?: ReactNode\n description?: ReactNode\n /** Ações do cabeçalho da seção, à direita no desktop e abaixo do título no mobile. */\n actions?: ReactNode\n /** Nível do título. Padrão h2. */\n level?: 2 | 3\n gap?: Space\n}\n\n/** Seção de página com título, descrição e ações. Espaço interno padrão de 16px. */\nexport function Section({\n title,\n description,\n actions,\n level = 2,\n gap = '4',\n className,\n children,\n id,\n ...props\n}: SectionProps) {\n const H = level === 2 ? 'h2' : 'h3'\n const titleId = id ? `${id}-titulo` : undefined\n return (\n <Box\n as=\"section\"\n id={id}\n aria-labelledby={title ? titleId : undefined}\n className={cn('flex min-w-0 scroll-mt-6 flex-col', gapClass[gap], className)}\n {...props}\n >\n {(title || actions) && (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between sm:gap-4\">\n <div className=\"flex min-w-0 flex-col gap-1\">\n {title && (\n <H id={titleId} className={level === 2 ? 'text-xl' : 'text-lg'}>\n {title}\n </H>\n )}\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 flex-wrap gap-2\">{actions}</div>}\n </div>\n )}\n {children}\n </Box>\n )\n}\n","import { useContext, useEffect, type ReactNode } from 'react'\nimport { ShellContext } from '@/components/app-shell/shell-context'\nimport { Breadcrumb, type BreadcrumbItem } from '@/components/ui/breadcrumb'\nimport { InfoHint } from '@/components/ui/info-hint'\nimport { cn } from '@/lib/cn'\n\nexport interface PageHeaderProps {\n /** Título da página. Dentro do AppShell ele já aparece no header, então aqui fica oculto. */\n title: ReactNode\n /**\n * Mostra o título no corpo da página. Use só quando o título do corpo for diferente\n * do header (ex.: no detalhe, o nome do cliente em vez de \"Detalhe do cliente\"),\n * ou em telas fora do AppShell.\n */\n showTitle?: boolean\n /**\n * Dado curto sobre o conteúdo (status, segmento, cidade). Nunca instrução de uso: texto\n * orientativo vai em `help`.\n */\n description?: ReactNode\n /**\n * Texto orientativo da tela (como usar, o que cada parte faz). Vira um ícone de informação\n * ao lado do título, no header fixo, que abre um modal. Nunca um parágrafo no corpo.\n */\n help?: ReactNode\n /** Trilha própria. Dentro do AppShell a trilha já aparece no header, abaixo do título. */\n breadcrumb?: BreadcrumbItem[]\n /**\n * Ação principal (e no máximo uma secundária). No mobile ficam abaixo da descrição,\n * dividindo a largura; no desktop ficam à direita, com largura automática.\n */\n actions?: ReactNode\n /**\n * Título discreto no topo do corpo quando o cabeçalho do shell esconde o título (no celular,\n * com `headerLogo`): `text-base` abaixo de `md` e só de leitor de tela a partir dele.\n * `showTitle` vence. Padrão: `false`.\n */\n bodyTitle?: boolean\n /**\n * `reserve` (padrão): o bloco do título ocupa lugar mesmo quando o título é só de leitor de\n * tela (o vão de 16 px acima das ações no celular). `none`: sem título visível e sem\n * `description`, o bloco não é desenhado e o vão some; o `h1` segue no DOM para o leitor.\n */\n titleSpace?: 'reserve' | 'none'\n /** Conteúdo abaixo, como abas ou metadados. */\n children?: ReactNode\n /**\n * Classes extras, que vencem as do componente. Para zerar a margem negativa de baixo (que\n * aproxima o cabeçalho do conteúdo) use `className=\"mb-0 md:mb-0\"`.\n */\n className?: string\n}\n\n/**\n * Cabeçalho de conteúdo: descrição e ações da tela, logo abaixo do header.\n * O título fica no header (com a trilha); aqui ele só é lido por leitores de tela,\n * para que cada página tenha um único título principal (h1).\n */\nexport function PageHeader({\n title,\n showTitle = false,\n description,\n help,\n breadcrumb,\n actions,\n bodyTitle = false,\n titleSpace = 'reserve',\n children,\n className,\n}: PageHeaderProps) {\n const shell = useContext(ShellContext)\n const setPageHelp = shell?.setPageHelp\n // Dentro do AppShell, o ícone de ajuda vai para o header, ao lado do título da tela.\n useEffect(() => {\n if (!setPageHelp) return\n setPageHelp(help ?? null)\n return () => setPageHelp(null)\n }, [help, setPageHelp])\n const inlineHelp = help && !shell\n const visible =\n showTitle || bodyTitle || description || actions || breadcrumb || children || inlineHelp\n // Sem título visível e sem descrição, o bloco do título só carregaria o h1 sr-only (que não\n // ocupa lugar); com titleSpace=\"none\" ele nem é desenhado e o vão acima das ações some.\n const titleOnlyForReader = !showTitle && !bodyTitle && !inlineHelp\n const collapseTitle = titleSpace === 'none' && titleOnlyForReader && !description\n const titleClass =\n showTitle || inlineHelp\n ? 'text-2xl md:text-3xl'\n : bodyTitle\n ? 'text-base md:sr-only'\n : 'sr-only'\n return (\n <header\n className={cn('-mb-2 flex min-w-0 flex-col gap-4 md:-mb-4', !visible && 'sr-only', className)}\n >\n {breadcrumb && <Breadcrumb items={breadcrumb} />}\n <div className=\"flex min-w-0 flex-col gap-4 md:flex-row md:items-center md:justify-between md:gap-6\">\n {collapseTitle ? (\n <h1 className=\"sr-only\">{title}</h1>\n ) : (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <h1 className={titleClass}>{title}</h1>\n {inlineHelp && (\n <InfoHint title={typeof title === 'string' ? title : 'Sobre esta tela'}>\n {help}\n </InfoHint>\n )}\n </div>\n {description && (\n <p className=\"text-sm text-muted-foreground md:text-base\">{description}</p>\n )}\n </div>\n )}\n {actions && (\n <div className=\"flex w-full shrink-0 gap-3 md:ml-auto md:w-auto [&>*]:flex-1 md:[&>*]:flex-none\">\n {actions}\n </div>\n )}\n </div>\n {children}\n </header>\n )\n}\n","import { Command } from 'cmdk'\nimport { Moon, Search, Sun, X } from 'lucide-react'\nimport { Dialog, VisuallyHidden } from 'radix-ui'\nimport { useBrand } from '@/brand/use-brand'\nimport { useRendraNavigate } from '@/components/rendra-provider'\nimport { cn } from '@/lib/cn'\nimport { useShell } from './shell-context'\n\n/*\n * Busca global (Ctrl+K / Cmd+K). Desktop: painel centralizado.\n * Mobile: tela cheia, com o campo no topo e a lista ocupando o resto.\n */\n\nconst itemClass =\n 'flex min-h-touch cursor-pointer items-center gap-3 rounded-item px-3 text-sm outline-none select-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground md:min-h-0 md:h-control-md [&_svg]:size-icon-sm [&_svg]:shrink-0 [&_svg]:text-muted-foreground'\n\nconst groupClass =\n '[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-2 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground'\n\nexport function CommandSearch() {\n const { searchOpen, setSearchOpen, navigationTargets, quickActions } = useShell()\n const { resolvedMode, setMode } = useBrand()\n const { navigate } = useRendraNavigate()\n\n const run = (fn: () => void) => {\n setSearchOpen(false)\n fn()\n }\n\n const groups = navigationTargets.reduce<Record<string, typeof navigationTargets>>((acc, t) => {\n ;(acc[t.group] ??= []).push(t)\n return acc\n }, {})\n\n return (\n <Dialog.Root open={searchOpen} onOpenChange={setSearchOpen}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-40 bg-overlay data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\" />\n <Dialog.Content\n aria-describedby={undefined}\n className={cn(\n 'fixed inset-0 z-50 flex flex-col bg-popover text-popover-foreground outline-none',\n 'md:inset-auto md:top-24 md:left-1/2 md:w-full md:max-w-xl md:-translate-x-1/2 md:rounded-surface md:border md:shadow-lg',\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0 md:data-[state=open]:zoom-in-95',\n )}\n >\n <VisuallyHidden.Root>\n <Dialog.Title>Busca global</Dialog.Title>\n </VisuallyHidden.Root>\n <Command label=\"Busca global\" className=\"flex min-h-0 flex-1 flex-col\" loop>\n <div className=\"flex shrink-0 items-center gap-2 border-b px-4 pt-safe md:pt-0\">\n <Search className=\"size-icon-md shrink-0 text-muted-foreground\" aria-hidden />\n <Command.Input\n autoFocus\n placeholder=\"Buscar telas e ações...\"\n className=\"h-control-lg min-w-0 flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n />\n <Dialog.Close\n aria-label=\"Fechar busca\"\n className=\"-mr-2 flex size-touch shrink-0 items-center justify-center rounded-item text-muted-foreground hover:bg-accent md:hidden\"\n >\n <X className=\"size-icon-md\" aria-hidden />\n </Dialog.Close>\n <kbd className=\"hidden rounded-item border bg-muted px-2 text-xs text-muted-foreground md:inline\">\n Esc\n </kbd>\n </div>\n <Command.List className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2 md:max-h-command md:flex-none\">\n <Command.Empty className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n Nada encontrado para essa busca.\n </Command.Empty>\n <Command.Group heading=\"Ações\" className={groupClass}>\n {quickActions.map((action) => {\n const Icon = action.icon\n return (\n <Command.Item\n key={action.label}\n className={itemClass}\n onSelect={() =>\n run(() => (action.to ? navigate(action.to) : action.onSelect?.()))\n }\n >\n {Icon && <Icon aria-hidden />}\n {action.label}\n </Command.Item>\n )\n })}\n <Command.Item\n className={itemClass}\n onSelect={() => run(() => setMode(resolvedMode === 'dark' ? 'light' : 'dark'))}\n >\n {resolvedMode === 'dark' ? <Sun aria-hidden /> : <Moon aria-hidden />}\n {resolvedMode === 'dark' ? 'Usar modo claro' : 'Usar modo escuro'}\n </Command.Item>\n </Command.Group>\n {Object.entries(groups).map(([group, targets]) => (\n <Command.Group key={group} heading={group} className={groupClass}>\n {targets.map((t) => {\n const Icon = t.icon\n return (\n <Command.Item\n key={t.to}\n value={`${t.title} ${group}`}\n className={itemClass}\n onSelect={() => run(() => navigate(t.to))}\n >\n <Icon aria-hidden />\n {t.title}\n </Command.Item>\n )\n })}\n </Command.Group>\n ))}\n </Command.List>\n </Command>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","/**\n * Formato visual do template. Cada template tem o seu, fixo, definido em brand.config.ts:\n * Safira: square (pedra lapidada) Equilíbrio: rounded (meio-termo) Aurora: pill (100% arredondado)\n * Os componentes não recebem formato por prop: usam rounded-control, rounded-surface,\n * rounded-item e rounded-avatar, que obedecem ao formato do template ativo.\n */\nexport type Shape = 'square' | 'rounded' | 'pill'\n\nexport const shapeLabels: Record<Shape, string> = {\n square: 'Quadrado',\n rounded: 'Meio-termo',\n pill: '100% arredondado',\n}\n","/*\n * LAYOUT DO APPSHELL\n * Tipo do layout e padrão interno do componente. O projeto escolhe os valores no\n * briefing e passa como prop `layout` (Partial<ShellLayout>) ao <AppShell>; sem a prop\n * (ou faltando alguma chave), vale o padrão abaixo. src/config/layout.ts reexporta este\n * módulo para o boilerplate e para as predefinições de src/config/presets.ts.\n * No mobile (< 768px) a navegação é sempre gaveta + barra inferior, qualquer que seja o layout.\n */\n\nexport interface ShellLayout {\n /** Menu lateral (sidebar) ou superior (topbar, no header). */\n navigation: 'sidebar' | 'topbar'\n /** Sidebar recolhida (só ícones) ou expandida (ícones e rótulos). */\n sidebar: 'collapsed' | 'expanded'\n /** Com a sidebar recolhida, abre por cima do conteúdo ao passar o mouse ou focar pelo teclado. */\n expandOnHover: boolean\n /**\n * Como abrir itens com submenu:\n * panel abre uma segunda barra lateral com os subitens\n * inline expande os subitens dentro da própria sidebar\n */\n submenu: 'panel' | 'inline'\n /**\n * Submenu do menu superior:\n * dropdown lista suspensa navegável por item\n * mega mega menu com seções (grupos do navigation.ts) e menus com descrição\n */\n topbarSubmenu: 'dropdown' | 'mega'\n /** Barra de navegação inferior no mobile (até 4 itens marcados em navigation.ts). */\n bottomNav: boolean\n}\n\nexport const defaultShellLayout: ShellLayout = {\n navigation: 'sidebar',\n sidebar: 'collapsed',\n expandOnHover: true,\n submenu: 'panel',\n topbarSubmenu: 'dropdown',\n bottomNav: true,\n}\n\nexport const layoutOptions = {\n navigation: [\n { value: 'sidebar', label: 'Menu lateral' },\n { value: 'topbar', label: 'Menu superior' },\n ],\n sidebar: [\n { value: 'collapsed', label: 'Recolhida (só ícones)' },\n { value: 'expanded', label: 'Expandida' },\n ],\n submenu: [\n { value: 'panel', label: 'Submenu em segunda barra' },\n { value: 'inline', label: 'Submenu dentro da sidebar' },\n ],\n topbarSubmenu: [\n { value: 'dropdown', label: 'Submenu navegável' },\n { value: 'mega', label: 'Mega menu' },\n ],\n} as const\n","import { ChevronDown } from 'lucide-react'\nimport { NavigationMenu as N } from 'radix-ui'\nimport { useCurrentPath, useRendraLink } from '@/components/rendra-provider'\nimport { cn } from '@/lib/cn'\nimport { useShell } from './shell-context'\nimport type { NavItem } from './types'\n\n/*\n * Mega menu do layout topbar (a partir de 1024px). Cada seção é um grupo do `navigation`\n * (prop do AppShell); o painel abre abaixo do header, na largura do conteúdo, com os menus\n * e seus subitens. Abre por clique, toque ou teclado (Radix NavigationMenu); o hover só\n * antecipa.\n */\n\nconst trigger =\n 'group inline-flex h-control-md items-center gap-1 rounded-item px-3 text-sm font-medium whitespace-nowrap transition-colors outline-none focus-visible:focus-ring data-[state=open]:bg-accent data-[state=open]:text-foreground'\n\nfunction isActive(pathname: string, to: string) {\n return to === '/' ? pathname === '/' : pathname === to || pathname.startsWith(`${to}/`)\n}\n\nfunction MegaItem({ item }: { item: NavItem }) {\n const pathname = useCurrentPath()\n const Link = useRendraLink()\n const Icon = item.icon\n const active = item.to ? isActive(pathname, item.to) : false\n const head = (\n <>\n <span\n className={cn(\n 'flex size-control-md shrink-0 items-center justify-center rounded-control transition-colors',\n active\n ? 'bg-primary text-primary-foreground'\n : 'bg-primary-soft text-primary-soft-foreground group-hover/item:bg-primary group-hover/item:text-primary-foreground',\n )}\n >\n <Icon className=\"size-icon-md\" aria-hidden />\n </span>\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"text-sm font-semibold\">{item.title}</span>\n {item.description && (\n <span className=\"text-sm text-muted-foreground\">{item.description}</span>\n )}\n </span>\n </>\n )\n return (\n <li className=\"flex flex-col gap-2\">\n {item.to ? (\n <N.Link asChild active={active}>\n <Link\n to={item.to}\n className=\"group/item flex items-start gap-3 rounded-item p-3 transition-colors hover:bg-accent\"\n >\n {head}\n </Link>\n </N.Link>\n ) : (\n <div className=\"group/item flex items-start gap-3 p-3\">{head}</div>\n )}\n {item.children && (\n <ul className=\"flex flex-col gap-1 pl-16\">\n {item.children.map((c) => (\n <li key={c.to}>\n <N.Link asChild active={isActive(pathname, c.to)}>\n <Link\n to={c.to}\n className=\"flex flex-col gap-1 rounded-item px-3 py-2 transition-colors hover:bg-accent data-[active]:bg-primary-soft data-[active]:text-primary-soft-foreground\"\n >\n <span className=\"text-sm font-medium\">{c.title}</span>\n {c.description && (\n <span className=\"text-xs text-muted-foreground\">{c.description}</span>\n )}\n </Link>\n </N.Link>\n </li>\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nexport function MegaMenu() {\n const pathname = useCurrentPath()\n const { navigation } = useShell()\n return (\n <N.Root className=\"hidden lg:block\" delayDuration={150}>\n <N.List className=\"flex items-center gap-1\">\n {navigation.map((group) => {\n const groupActive = group.items.some(\n (i) =>\n (i.to && isActive(pathname, i.to)) ||\n i.children?.some((c) => isActive(pathname, c.to)),\n )\n return (\n <N.Item key={group.title} value={group.title}>\n <N.Trigger\n className={cn(\n trigger,\n groupActive\n ? 'bg-primary-soft text-primary-soft-foreground'\n : 'text-muted-foreground hover:bg-accent hover:text-foreground',\n )}\n >\n {group.title}\n <ChevronDown\n aria-hidden\n className=\"size-icon-sm transition-transform duration-200 group-data-[state=open]:rotate-180\"\n />\n </N.Trigger>\n <N.Content className=\"w-full data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in-0 data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out-0\">\n <div className=\"grid w-full gap-6 p-6 lg:grid-cols-4\">\n <div className=\"flex flex-col gap-2 border-r pr-6\">\n <span className=\"text-xs font-medium tracking-wide text-muted-foreground uppercase\">\n Seção\n </span>\n <span className=\"text-xl font-semibold\">{group.title}</span>\n {group.description && (\n <p className=\"text-sm text-muted-foreground\">{group.description}</p>\n )}\n <div className=\"mt-2 h-1 w-12 rounded-full bg-gradient-accent\" />\n </div>\n <ul className=\"grid gap-2 lg:col-span-3 lg:grid-cols-3\">\n {group.items.map((item) => (\n <MegaItem key={item.title} item={item} />\n ))}\n </ul>\n </div>\n </N.Content>\n </N.Item>\n )\n })}\n </N.List>\n {/* Painel na largura do header, logo abaixo dele */}\n <div className=\"absolute inset-x-0 top-full z-40\">\n <N.Viewport className=\"w-full overflow-hidden border-b bg-popover text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\" />\n </div>\n </N.Root>\n )\n}\n","import { Bell } from 'lucide-react'\nimport { useState } from 'react'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { Button } from '@/components/ui/button'\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'\nimport { cn } from '@/lib/cn'\nimport { useShell } from './shell-context'\n\n/**\n * Sino de notificações. Renderizado só quando o AppShell recebe a prop `notifications`;\n * os itens e os dois retornos de chamada (marcar todas como lidas, marcar uma como lida)\n * vêm dessa prop, nunca de um mock interno.\n */\nexport function Notifications() {\n const { notifications } = useShell()\n const [items, setItems] = useState(() => notifications?.items ?? [])\n const unread = items.filter((n) => !n.read).length\n\n if (!notifications) return null\n\n const markAllRead = () => {\n setItems((all) => all.map((n) => ({ ...n, read: true })))\n notifications.onMarkAllRead?.()\n }\n const markRead = (id: string) => {\n setItems((all) => all.map((n) => (n.id === id ? { ...n, read: true } : n)))\n notifications.onItemClick?.(id)\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label={unread ? `Notificações, ${unread} não lidas` : 'Notificações'}\n className=\"relative\"\n >\n <Bell aria-hidden />\n {unread > 0 && (\n <span\n aria-hidden\n className=\"absolute top-1 right-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-xs leading-none font-medium text-destructive-foreground tabular-nums\"\n >\n {unread}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"flex flex-col\">\n <div className=\"flex items-center justify-between gap-2 border-b py-2 pr-2 pl-4\">\n <span className=\"text-sm font-semibold\">Notificações</span>\n <Button variant=\"ghost\" size=\"sm\" disabled={!unread} onClick={markAllRead}>\n Marcar como lidas\n </Button>\n </div>\n <ul className=\"flex flex-col p-2\">\n {items.map((n) => (\n <li key={n.id}>\n <button\n type=\"button\"\n onClick={() => markRead(n.id)}\n className=\"flex w-full items-start gap-3 rounded-item p-2 text-left transition-colors hover:bg-accent\"\n >\n <BrandFeedbackIcon type={n.type} size=\"md\" className=\"mt-px\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className={cn('text-sm', !n.read && 'font-medium')}>{n.title}</span>\n <span className=\"text-xs text-muted-foreground\">{n.time}</span>\n </span>\n {!n.read && (\n <span className=\"mt-2 size-2 shrink-0 rounded-full bg-primary\">\n <span className=\"sr-only\">Não lida</span>\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n </PopoverContent>\n </Popover>\n )\n}\n","import {\n ArrowLeft,\n ChevronDown,\n LayoutTemplate,\n LogOut,\n Menu,\n Monitor,\n MoreHorizontal,\n Moon,\n PanelLeft,\n Palette,\n Search,\n Sun,\n} from 'lucide-react'\nimport { useLayoutEffect, useRef, useState } from 'react'\nimport { useBrand } from '@/brand/use-brand'\nimport type { ColorMode } from '@/brand/brand-context'\nimport { useCurrentPath, useRendraBreadcrumbs, useRendraLink } from '@/components/rendra-provider'\nimport { Avatar } from '@/components/ui/avatar'\nimport { BrandLogo } from '@/components/ui/brand-logo'\nimport { Breadcrumb, type BreadcrumbItem } from '@/components/ui/breadcrumb'\nimport { Button } from '@/components/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { InfoHint } from '@/components/ui/info-hint'\nimport { Tooltip } from '@/components/ui/tooltip'\nimport { cn } from '@/lib/cn'\nimport { initials } from '@/lib/initials'\nimport { shapeLabels } from '@/lib/shape'\nimport { layoutOptions, type ShellLayout } from './layout'\nimport { MegaMenu } from './mega-menu'\nimport { Notifications } from './notifications'\nimport { useShell } from './shell-context'\n\n/**\n * Voltar das telas de segundo nível (ex.: Novo cliente, Detalhe do cliente): leva à tela-pai\n * da trilha, não ao histórico, para ser previsível mesmo quando a pessoa chegou por um link.\n */\nfunction BackButton({ crumbs }: { crumbs: BreadcrumbItem[] }) {\n const Link = useRendraLink()\n const parent = crumbs.length >= 2 ? crumbs[crumbs.length - 2] : undefined\n if (!parent?.to) return null\n return (\n <Tooltip content={`Voltar para ${parent.label}`} side=\"bottom\">\n <Button variant=\"ghost\" iconOnly asChild className=\"shrink-0\">\n <Link to={parent.to} aria-label={`Voltar para ${parent.label}`}>\n <ArrowLeft aria-hidden />\n </Link>\n </Button>\n </Tooltip>\n )\n}\n\nconst modes: { value: ColorMode; label: string; icon: typeof Sun }[] = [\n { value: 'light', label: 'Claro', icon: Sun },\n { value: 'dark', label: 'Escuro', icon: Moon },\n { value: 'system', label: 'Sistema', icon: Monitor },\n]\n\nfunction ModeItems() {\n const { mode, setMode } = useBrand()\n return (\n <DropdownMenuRadioGroup value={mode} onValueChange={(v) => setMode(v as ColorMode)}>\n {modes.map((m) => (\n <DropdownMenuRadioItem key={m.value} value={m.value}>\n <m.icon aria-hidden />\n {m.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n )\n}\n\nfunction LayoutItems() {\n const { layout, setLayout, resetLayout } = useShell()\n const radio = <K extends 'navigation' | 'sidebar' | 'submenu' | 'topbarSubmenu'>(\n key: K,\n title: string,\n ) => (\n <>\n <DropdownMenuLabel>{title}</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={layout[key]}\n onValueChange={(v) => setLayout(key, v as ShellLayout[K])}\n >\n {layoutOptions[key].map((o) => (\n <DropdownMenuRadioItem key={o.value} value={o.value}>\n {o.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </>\n )\n const sidebar = layout.navigation === 'sidebar'\n return (\n <>\n {radio('navigation', 'Posição do menu')}\n {!sidebar && (\n <>\n <DropdownMenuSeparator />\n {radio('topbarSubmenu', 'Submenu')}\n </>\n )}\n {sidebar && (\n <>\n <DropdownMenuSeparator />\n {radio('sidebar', 'Sidebar')}\n <DropdownMenuCheckboxItem\n checked={layout.expandOnHover}\n disabled={layout.sidebar !== 'collapsed'}\n onCheckedChange={(v) => setLayout('expandOnHover', v === true)}\n onSelect={(e) => e.preventDefault()}\n >\n Abrir ao passar o mouse\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n {radio('submenu', 'Submenu')}\n </>\n )}\n <DropdownMenuSeparator />\n <DropdownMenuCheckboxItem\n checked={layout.bottomNav}\n onCheckedChange={(v) => setLayout('bottomNav', v === true)}\n onSelect={(e) => e.preventDefault()}\n >\n Barra inferior no celular\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={resetLayout}>Voltar ao padrão do projeto</DropdownMenuItem>\n </>\n )\n}\n\nfunction UserMenu() {\n const Link = useRendraLink()\n const { user, userMenuItems, onLogout, userMenu, workspaces } = useShell()\n const { brand, brands, setBrandId, palette, palettes, setPaletteId } = useBrand()\n const showTheme = userMenu?.theme !== false\n const showTemplate = userMenu?.template !== false\n const showLayout = userMenu?.layout !== false\n // O separador antes do grupo só existe se ao menos um dos submenus existir.\n const showPreferences = showTheme || showTemplate || showLayout\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label={`${initials(user.name)}, menu de ${user.name}`}\n >\n <Avatar name={user.name} src={user.avatarUrl} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel className=\"flex flex-col gap-1\">\n <span className=\"text-sm font-medium text-foreground\">{user.name}</span>\n {user.email && <span className=\"font-normal\">{user.email}</span>}\n </DropdownMenuLabel>\n {workspaces && workspaces.items.length > 0 && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>{workspaces.label ?? 'Espaço'}</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={workspaces.activeId} onValueChange={workspaces.onSelect}>\n {workspaces.items.map((w) => (\n <DropdownMenuRadioItem key={w.id} value={w.id}>\n {w.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </>\n )}\n {userMenuItems.length > 0 && (\n <>\n <DropdownMenuSeparator />\n {userMenuItems.map((item) => {\n const Icon = item.icon\n return item.to ? (\n <DropdownMenuItem key={item.label} asChild>\n <Link to={item.to}>\n {Icon && <Icon aria-hidden />}\n {item.label}\n </Link>\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem key={item.label} onSelect={item.onSelect}>\n {Icon && <Icon aria-hidden />}\n {item.label}\n </DropdownMenuItem>\n )\n })}\n </>\n )}\n {showPreferences && <DropdownMenuSeparator />}\n {showTheme && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Sun aria-hidden />\n Tema\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <ModeItems />\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n {showTemplate && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Palette aria-hidden />\n Template\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuLabel>Modelo</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={brand.id} onValueChange={setBrandId}>\n {brands.map((b) => (\n <DropdownMenuRadioItem key={b.id} value={b.id}>\n <span className=\"flex flex-col\">\n <span>{b.productName}</span>\n <span className=\"text-xs text-muted-foreground\">{shapeLabels[b.shape]}</span>\n </span>\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Paleta de cores</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={palette.id}\n onValueChange={(v) => setPaletteId(v === brand.id ? null : v)}\n >\n {palettes.map((b) => (\n <DropdownMenuRadioItem key={b.id} value={b.id}>\n {b.name}\n {b.id === brand.id && (\n <span className=\"ml-auto pl-4 text-xs text-muted-foreground\">do modelo</span>\n )}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n {showLayout && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <LayoutTemplate aria-hidden />\n Layout\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <LayoutItems />\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n <DropdownMenuSeparator />\n <DropdownMenuItem destructive onSelect={() => onLogout?.()}>\n <LogOut aria-hidden />\n Sair\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/**\n * Menu superior. Os itens que não cabem na largura vão para o botão \"Mais\", no fim da\n * barra: o menu nunca passa por cima da busca e dos ícones, com qualquer número de itens.\n */\nfunction TopNav() {\n const pathname = useCurrentPath()\n const Link = useRendraLink()\n const { navigation } = useShell()\n const items = navigation.flatMap((g) => g.items)\n const navRef = useRef<HTMLElement>(null)\n const widths = useRef<number[]>([])\n const [count, setCount] = useState(items.length)\n\n useLayoutEffect(() => {\n const nav = navRef.current\n if (!nav) return\n const measure = () => {\n const lis = [...nav.querySelectorAll<HTMLLIElement>('li[data-item]')]\n // Mede só quando todos estão visíveis (primeira pintura e depois da fonte carregar).\n if (lis.length === items.length && lis.every((li) => li.offsetWidth > 0))\n widths.current = lis.map((li) => li.offsetWidth + 4)\n const avail = nav.clientWidth\n const total = widths.current.reduce((a, b) => a + b, 0)\n if (total <= avail) return setCount(items.length)\n const more = 104 // largura reservada para o botão Mais\n let used = 0\n let n = 0\n for (const w of widths.current) {\n if (used + w > avail - more) break\n used += w\n n++\n }\n setCount(n)\n }\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(nav)\n void document.fonts?.ready.then(() => {\n setCount(items.length)\n requestAnimationFrame(measure)\n })\n return () => ro.disconnect()\n }, [items.length])\n\n const link =\n 'inline-flex h-control-md items-center gap-2 rounded-item px-3 text-sm font-medium whitespace-nowrap transition-colors [&_svg]:size-icon-sm'\n const idle = 'text-muted-foreground hover:bg-accent hover:text-foreground'\n const active = 'bg-primary-soft text-primary-soft-foreground'\n const isActive = (item: (typeof items)[number]) =>\n item.children\n ? item.children.some((c) => pathname.startsWith(c.to))\n : item.to === '/'\n ? pathname === '/'\n : pathname.startsWith(item.to ?? '/')\n const overflow = items.slice(count)\n\n return (\n <nav ref={navRef} aria-label=\"Navegação principal\" className=\"hidden w-full min-w-0 lg:block\">\n <ul className=\"flex items-center justify-center gap-1\">\n {items.map((item, i) => {\n const Icon = item.icon\n const hidden = i >= count\n if (item.children) {\n return (\n <li key={item.title} data-item className={cn(hidden && 'hidden')}>\n <DropdownMenu>\n <DropdownMenuTrigger className={cn(link, isActive(item) ? active : idle)}>\n <Icon aria-hidden />\n {item.title}\n <ChevronDown aria-hidden />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {item.children.map((c) => (\n <DropdownMenuItem key={c.to} asChild>\n <Link to={c.to}>{c.title}</Link>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </li>\n )\n }\n const to = item.to ?? '/'\n return (\n <li key={item.title} data-item className={cn(hidden && 'hidden')}>\n <Link to={to} className={cn(link, isActive(item) ? active : idle)}>\n <Icon aria-hidden />\n {item.title}\n </Link>\n </li>\n )\n })}\n {overflow.length > 0 && (\n <li>\n <DropdownMenu>\n <DropdownMenuTrigger\n className={cn(link, overflow.some(isActive) ? active : idle)}\n aria-label={`Mais ${overflow.length} itens do menu`}\n >\n <MoreHorizontal aria-hidden />\n Mais\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {overflow.flatMap((item) => {\n const Icon = item.icon\n return item.children\n ? item.children.map((c) => (\n <DropdownMenuItem key={c.to} asChild>\n <Link to={c.to}>\n <Icon aria-hidden />\n {c.title}\n </Link>\n </DropdownMenuItem>\n ))\n : [\n <DropdownMenuItem key={item.title} asChild>\n <Link to={item.to ?? '/'}>\n <Icon aria-hidden />\n {item.title}\n </Link>\n </DropdownMenuItem>,\n ]\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </li>\n )}\n </ul>\n </nav>\n )\n}\n\nexport function Header() {\n const {\n layout,\n setLayout,\n setMobileNavOpen,\n setSearchOpen,\n pageHelp,\n homeLabel,\n notifications,\n headerLogo,\n } = useShell()\n const { brand, resolvedMode } = useBrand()\n const Link = useRendraLink()\n const crumbs = useRendraBreadcrumbs()\n // Trilha do header: sempre começa no destino inicial (homeLabel).\n const trail =\n crumbs[0]?.to === '/' || crumbs.length === 0\n ? crumbs\n : [{ label: homeLabel, to: '/' }, ...crumbs]\n const ModeIcon = resolvedMode === 'dark' ? Moon : Sun\n const topbar = layout.navigation === 'topbar'\n const hasParent = Boolean(crumbs.length >= 2 && crumbs[crumbs.length - 2]?.to)\n // No celular, o menu fica no botão central da barra inferior (ou dá lugar à seta de voltar).\n const menuInFooter = layout.bottomNav || hasParent\n // Título e trilha em uma linha cada; se não couber, reticências (nunca quebra linha).\n const pageTitle = (\n <>\n {headerLogo && (\n <span aria-hidden className=\"flex min-w-0 flex-1 items-center md:hidden\">\n {headerLogo}\n </span>\n )}\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-col justify-center',\n headerLogo && 'max-md:flex-none',\n )}\n >\n <span className=\"flex min-w-0 items-center gap-1\">\n <p\n className={cn(\n 'truncate text-sm leading-tight font-semibold md:text-base',\n headerLogo && 'max-md:sr-only',\n )}\n >\n {crumbs[crumbs.length - 1]?.label ?? brand.productName}\n </p>\n {pageHelp && (\n <InfoHint\n title={crumbs[crumbs.length - 1]?.label ?? brand.productName}\n className=\"-my-2\"\n >\n {pageHelp}\n </InfoHint>\n )}\n </span>\n <Breadcrumb items={trail} variant=\"trail\" className={cn(headerLogo && 'max-md:hidden')} />\n </div>\n </>\n )\n const collapsed = layout.sidebar === 'collapsed'\n\n return (\n <header className=\"relative z-30 flex h-header shrink-0 items-center gap-1 border-b bg-card px-2 md:gap-2 md:px-4\">\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Abrir menu\"\n className={cn(topbar ? 'lg:hidden' : 'md:hidden', menuInFooter && 'max-md:hidden')}\n onClick={() => setMobileNavOpen(true)}\n >\n <Menu aria-hidden />\n </Button>\n\n {topbar ? (\n <>\n <Link\n to=\"/\"\n aria-label={`${brand.productName}, ir para o painel`}\n className=\"hidden shrink-0 lg:block\"\n >\n <BrandLogo on=\"surface\" />\n </Link>\n <span className=\"flex min-w-0 flex-1 items-center gap-1 lg:hidden\">\n <BackButton crumbs={crumbs} />\n {pageTitle}\n </span>\n <div className=\"hidden min-w-0 flex-1 lg:flex lg:justify-center\">\n {layout.topbarSubmenu === 'mega' ? <MegaMenu /> : <TopNav />}\n </div>\n </>\n ) : (\n <>\n <Tooltip content={collapsed ? 'Expandir menu' : 'Recolher menu'} side=\"bottom\">\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label={collapsed ? 'Expandir menu' : 'Recolher menu'}\n aria-pressed={!collapsed}\n className=\"hidden md:inline-flex\"\n onClick={() => setLayout('sidebar', collapsed ? 'expanded' : 'collapsed')}\n >\n <PanelLeft aria-hidden />\n </Button>\n </Tooltip>\n <span\n aria-hidden\n className={cn(\n 'mx-1 h-8 w-px shrink-0 bg-border md:mx-2',\n menuInFooter && 'max-md:hidden',\n )}\n />\n <BackButton crumbs={crumbs} />\n {pageTitle}\n </>\n )}\n\n <div className=\"flex shrink-0 items-center gap-1 md:gap-2\">\n {/* Busca: campo no desktop, ícone abaixo disso (abre em tela cheia no mobile) */}\n <button\n type=\"button\"\n onClick={() => setSearchOpen(true)}\n className={cn(\n 'hidden h-control-md items-center gap-2 rounded-control border border-input bg-background px-3 text-sm text-muted-foreground transition-colors hover:border-primary',\n topbar ? '2xl:flex 2xl:w-3xs' : 'lg:flex lg:w-3xs',\n )}\n >\n <Search className=\"size-icon-sm\" aria-hidden />\n <span className=\"flex-1 text-left\">Buscar...</span>\n <kbd className=\"rounded-item border bg-muted px-2 text-xs\">Ctrl K</kbd>\n </button>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Buscar\"\n className={topbar ? '2xl:hidden' : 'lg:hidden'}\n onClick={() => setSearchOpen(true)}\n >\n <Search aria-hidden />\n </Button>\n\n {notifications && <Notifications />}\n\n <DropdownMenu>\n <Tooltip content=\"Tema\" side=\"bottom\">\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" iconOnly aria-label=\"Tema\" className=\"hidden md:inline-flex\">\n <ModeIcon aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n </Tooltip>\n <DropdownMenuContent align=\"end\">\n <ModeItems />\n </DropdownMenuContent>\n </DropdownMenu>\n\n <UserMenu />\n </div>\n </header>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport type { NavGroup, NavItem } from './types'\n\n/*\n * Derivações de exibição do menu (src/config/navigation.ts, ou outro `navigation` passado\n * por prop): barra inferior, lista plana de destinos e destino ativo. Calculadas dentro do\n * AppShell (useMemo, a partir de `navigation`), nunca em @/config.\n */\n\n/** Destino plano da busca global e do cálculo do item ativo. */\nexport interface NavigationTarget {\n title: string\n to: string\n group: string\n icon: LucideIcon\n}\n\n/** Itens marcados `bottomNav`, na ordem do menu. Limite de 4. */\nexport function getBottomNavItems(navigation: NavGroup[]): NavItem[] {\n return navigation\n .flatMap((g) => g.items)\n .filter((i) => i.bottomNav)\n .slice(0, 4)\n}\n\n/** Lista plana de destinos (itens de primeiro nível com rota e filhos de itens com submenu). */\nexport function getNavigationTargets(navigation: NavGroup[]): NavigationTarget[] {\n return navigation.flatMap((g) =>\n g.items.flatMap((i) => [\n ...(i.to ? [{ title: i.title, to: i.to, group: g.title, icon: i.icon }] : []),\n ...(i.children ?? []).map((c) => ({\n title: c.title,\n to: c.to,\n group: i.title,\n icon: i.icon,\n })),\n ]),\n )\n}\n\n/**\n * Destino ativo: o mais específico que combina com o endereço.\n * Ex.: em /clientes/novo fica ativo \"Novo cliente\" (e o grupo Cadastros), não \"Clientes\".\n */\nexport function resolveActiveTo(targets: NavigationTarget[], pathname: string): string | null {\n const matches = targets\n .map((t) => t.to)\n .filter((to) =>\n to === '/' ? pathname === '/' : pathname === to || pathname.startsWith(`${to}/`),\n )\n return matches.sort((a, b) => b.length - a.length)[0] ?? null\n}\n","import { ChevronDown, ChevronRight, LogOut, X } from 'lucide-react'\nimport { Collapsible, Dialog, VisuallyHidden } from 'radix-ui'\nimport { useEffect, useRef, useState } from 'react'\nimport { useBrand } from '@/brand/use-brand'\nimport { useCurrentPath, useRendraLink } from '@/components/rendra-provider'\nimport { Avatar } from '@/components/ui/avatar'\nimport { BrandLogo } from '@/components/ui/brand-logo'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Tooltip } from '@/components/ui/tooltip'\nimport { cn } from '@/lib/cn'\nimport { resolveActiveTo } from './navigation-utils'\nimport { useShell } from './shell-context'\nimport type { NavItem } from './types'\n\n/*\n * Sidebar única, configurada pelo layout do AppShell (prop `layout`):\n * sidebar: collapsed | expanded expandOnHover: abre por cima do conteúdo\n * submenu: panel (segunda barra) | inline (dentro da sidebar)\n * Mobile (< 768px): a mesma navegação reconstruída como gaveta, com submenu inline.\n */\n\nconst itemBase =\n 'group relative flex min-h-touch w-full items-center gap-3 rounded-item px-3 text-sm transition-colors md:min-h-0 md:h-control-md'\nconst itemIdle = 'text-sidebar-foreground hover:bg-sidebar-accent'\nconst itemActive = 'bg-sidebar-active font-medium text-sidebar-active-foreground'\n\nfunction ActiveIndicator() {\n return (\n <span\n aria-hidden\n className=\"absolute inset-y-2 left-0 w-1 rounded-full bg-sidebar-indicator in-data-[shape=pill]:hidden\"\n />\n )\n}\n\nfunction Badge({ value, compact }: { value: number; compact: boolean }) {\n if (compact) {\n return (\n <span\n aria-hidden\n className=\"absolute top-2 right-2 size-2 rounded-full bg-sidebar-indicator\"\n />\n )\n }\n return (\n <span className=\"ml-auto rounded-full bg-sidebar-accent px-2 text-xs font-medium text-sidebar-foreground tabular-nums\">\n {value}\n </span>\n )\n}\n\nfunction useIsActive() {\n const pathname = useCurrentPath()\n const { navigationTargets } = useShell()\n const active = resolveActiveTo(navigationTargets, pathname)\n return (to: string) => to === active\n}\n\ninterface EntryProps {\n item: NavItem\n /** Só ícones (sem rótulos). */\n compact: boolean\n submenu: 'panel' | 'inline'\n /** Sem expansão por hover, o modo compacto usa tooltip e menu suspenso. */\n hoverExpands: boolean\n panelOpenFor: string | null\n onTogglePanel: (item: NavItem) => void\n onNavigate?: () => void\n}\n\nfunction NavEntry({\n item,\n compact,\n submenu,\n hoverExpands,\n panelOpenFor,\n onTogglePanel,\n onNavigate,\n}: EntryProps) {\n const isActive = useIsActive()\n const Link = useRendraLink()\n const Icon = item.icon\n const childActive = item.children?.some((c) => isActive(c.to)) ?? false\n const [open, setOpen] = useState(childActive)\n const label = item.badge ? `${item.title}, ${item.badge} pendentes` : item.title\n\n if (item.children) {\n // Submenu em segunda barra lateral\n if (submenu === 'panel') {\n const panelOpen = panelOpenFor === item.title\n return (\n <Tooltip content={item.title} side=\"right\" disabled={!compact || hoverExpands}>\n <button\n type=\"button\"\n aria-expanded={panelOpen}\n aria-controls=\"submenu-painel\"\n aria-label={compact ? item.title : undefined}\n onClick={() => onTogglePanel(item)}\n className={cn(\n itemBase,\n compact && 'justify-center px-0',\n childActive || panelOpen ? itemActive : itemIdle,\n )}\n >\n {childActive && <ActiveIndicator />}\n <Icon className=\"size-icon-md shrink-0\" aria-hidden />\n {!compact && (\n <>\n <span className=\"truncate\">{item.title}</span>\n <ChevronRight\n aria-hidden\n className={cn(\n 'ml-auto size-icon-sm shrink-0 text-sidebar-muted-foreground transition-transform duration-200',\n panelOpen && 'rotate-180',\n )}\n />\n </>\n )}\n </button>\n </Tooltip>\n )\n }\n\n // Inline, mas compacto e sem expansão por hover: menu suspenso ao lado\n if (compact) {\n return (\n <DropdownMenu>\n <Tooltip content={item.title} side=\"right\">\n <DropdownMenuTrigger\n aria-label={item.title}\n className={cn(itemBase, 'justify-center px-0', childActive ? itemActive : itemIdle)}\n >\n {childActive && <ActiveIndicator />}\n <Icon className=\"size-icon-md shrink-0\" aria-hidden />\n </DropdownMenuTrigger>\n </Tooltip>\n <DropdownMenuContent side=\"right\" align=\"start\">\n <DropdownMenuLabel>{item.title}</DropdownMenuLabel>\n {item.children.map((c) => (\n <DropdownMenuItem key={c.to} asChild>\n <Link to={c.to}>{c.title}</Link>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n }\n\n // Inline expandido dentro da sidebar\n return (\n <Collapsible.Root open={open} onOpenChange={setOpen}>\n <Collapsible.Trigger className={cn(itemBase, childActive && 'font-medium', itemIdle)}>\n <Icon className=\"size-icon-md shrink-0\" aria-hidden />\n <span className=\"truncate\">{item.title}</span>\n <ChevronDown\n aria-hidden\n className=\"ml-auto size-icon-sm shrink-0 text-sidebar-muted-foreground transition-transform duration-200 group-data-[state=open]:rotate-180\"\n />\n </Collapsible.Trigger>\n <Collapsible.Content className=\"overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\">\n <ul className=\"flex flex-col gap-1 pt-1 pl-8\">\n {item.children.map((c) => (\n <li key={c.to}>\n <Link\n to={c.to}\n onClick={onNavigate}\n className={cn(\n itemBase,\n 'md:h-control-sm',\n isActive(c.to) ? itemActive : itemIdle,\n )}\n >\n <span className=\"truncate\">{c.title}</span>\n </Link>\n </li>\n ))}\n </ul>\n </Collapsible.Content>\n </Collapsible.Root>\n )\n }\n\n const to = item.to ?? '/'\n const active = isActive(to)\n return (\n <Tooltip content={item.title} side=\"right\" disabled={!compact || hoverExpands}>\n <Link\n to={to}\n onClick={onNavigate}\n aria-label={compact ? label : undefined}\n className={cn(itemBase, compact && 'justify-center px-0', active ? itemActive : itemIdle)}\n >\n {active && <ActiveIndicator />}\n <Icon className=\"size-icon-md shrink-0\" aria-hidden />\n {!compact && <span className=\"truncate\">{item.title}</span>}\n {item.badge ? <Badge value={item.badge} compact={compact} /> : null}\n </Link>\n </Tooltip>\n )\n}\n\ninterface BodyProps {\n compact: boolean\n submenu: 'panel' | 'inline'\n hoverExpands: boolean\n panelOpenFor?: string | null\n onTogglePanel?: (item: NavItem) => void\n onNavigate?: () => void\n onClose?: () => void\n}\n\nfunction SidebarBody({\n compact,\n submenu,\n hoverExpands,\n panelOpenFor = null,\n onTogglePanel = () => {},\n onNavigate,\n onClose,\n}: BodyProps) {\n const { brand } = useBrand()\n const Link = useRendraLink()\n const { navigation, user, onLogout } = useShell()\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n <div\n className={cn(\n 'flex h-header shrink-0 items-center border-b border-sidebar-border',\n compact ? 'justify-center' : 'justify-between gap-2 px-4',\n )}\n >\n <Link\n to=\"/\"\n onClick={onNavigate}\n aria-label={`${brand.productName}, ir para o painel`}\n className=\"flex min-w-0 items-center\"\n >\n <BrandLogo on=\"sidebar\" symbolOnly={compact} />\n </Link>\n {onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar menu\"\n className=\"-mr-2 flex size-touch items-center justify-center rounded-item text-sidebar-foreground hover:bg-sidebar-accent\"\n >\n <X className=\"size-icon-md\" aria-hidden />\n </button>\n )}\n </div>\n\n {/* A lista só rola sozinha se o menu for maior que a tela. */}\n <nav\n aria-label=\"Navegação principal\"\n className=\"flex min-h-0 flex-1 flex-col gap-6 overflow-x-hidden overflow-y-auto px-3 py-4\"\n >\n {navigation.map((group) => (\n <div key={group.title} className=\"flex flex-col gap-1\">\n {compact ? (\n <span aria-hidden className=\"mx-3 mb-1 h-px bg-sidebar-border\" />\n ) : (\n <span className=\"truncate px-3 pb-1 text-xs font-medium tracking-wide text-sidebar-muted-foreground uppercase\">\n {group.title}\n </span>\n )}\n <ul className=\"flex flex-col gap-1\">\n {group.items.map((item) => (\n <li key={item.title}>\n <NavEntry\n item={item}\n compact={compact}\n submenu={submenu}\n hoverExpands={hoverExpands}\n panelOpenFor={panelOpenFor}\n onTogglePanel={onTogglePanel}\n onNavigate={onNavigate}\n />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n\n <div\n className={cn(\n 'flex shrink-0 items-center gap-3 border-t border-sidebar-border p-3',\n compact && 'flex-col',\n )}\n >\n <Avatar name={user.name} src={user.avatarUrl} />\n {!compact && (\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium\">{user.name}</span>\n {user.email && (\n <span className=\"truncate text-xs text-sidebar-muted-foreground\">{user.email}</span>\n )}\n </div>\n )}\n <Tooltip content=\"Sair\" side=\"right\">\n <button\n type=\"button\"\n aria-label=\"Sair\"\n onClick={() => onLogout?.()}\n className=\"flex size-touch shrink-0 items-center justify-center rounded-item text-sidebar-muted-foreground transition-colors hover:bg-sidebar-accent hover:text-sidebar-foreground md:size-control-md\"\n >\n <LogOut className=\"size-icon-sm\" aria-hidden />\n </button>\n </Tooltip>\n </div>\n </div>\n )\n}\n\n/** Segunda barra lateral com os subitens do item escolhido. */\nfunction SubmenuPanel({ item, onClose }: { item: NavItem; onClose: () => void }) {\n const isActive = useIsActive()\n const Link = useRendraLink()\n return (\n <div\n id=\"submenu-painel\"\n role=\"region\"\n aria-label={`Submenu ${item.title}`}\n className=\"flex h-full w-3xs shrink-0 animate-in flex-col border-r bg-card text-card-foreground shadow-lg fade-in-0\"\n >\n <div className=\"flex h-header shrink-0 items-center justify-between gap-2 border-b pr-2 pl-4\">\n <span className=\"truncate text-sm font-semibold\">{item.title}</span>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar submenu\"\n className=\"flex size-control-md items-center justify-center rounded-item text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n <X className=\"size-icon-sm\" aria-hidden />\n </button>\n </div>\n <ul className=\"flex flex-col gap-1 p-3\">\n {item.children?.map((c) => (\n <li key={c.to}>\n <Link\n to={c.to}\n className={cn(\n 'flex h-control-md items-center rounded-item px-3 text-sm transition-colors',\n isActive(c.to)\n ? 'bg-primary-soft font-medium text-primary-soft-foreground'\n : 'hover:bg-accent hover:text-accent-foreground',\n )}\n >\n <span className=\"truncate\">{c.title}</span>\n </Link>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport function Sidebar() {\n const { layout, mobileNavOpen, setMobileNavOpen } = useShell()\n const pathname = useCurrentPath()\n const close = () => setMobileNavOpen(false)\n\n const collapsed = layout.sidebar === 'collapsed'\n const hoverExpands = collapsed && layout.expandOnHover\n const [peek, setPeek] = useState(false)\n const [panel, setPanel] = useState<NavItem | null>(null)\n const timer = useRef<number | undefined>(undefined)\n const rootRef = useRef<HTMLDivElement>(null)\n const compact = collapsed && !peek\n\n // Fecha a segunda barra ao navegar, com Esc e ao clicar fora.\n useEffect(() => setPanel(null), [pathname])\n useEffect(() => {\n if (!panel) return\n const onKey = (e: KeyboardEvent) => e.key === 'Escape' && setPanel(null)\n const onDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) setPanel(null)\n }\n window.addEventListener('keydown', onKey)\n window.addEventListener('pointerdown', onDown)\n return () => {\n window.removeEventListener('keydown', onKey)\n window.removeEventListener('pointerdown', onDown)\n }\n }, [panel])\n useEffect(() => () => window.clearTimeout(timer.current), [])\n\n const openPeek = () => {\n if (!hoverExpands) return\n window.clearTimeout(timer.current)\n timer.current = window.setTimeout(() => setPeek(true), 120)\n }\n const closePeek = () => {\n window.clearTimeout(timer.current)\n timer.current = window.setTimeout(() => setPeek(false), 200)\n }\n // Só o foco do teclado (Tab) abre a barra e a mantém aberta. Foco de clique, ou o foco que\n // um menu devolve ao fechar, não prende a barra aberta depois que o mouse sai.\n const keyboardFocusInside = () => {\n const el = document.activeElement\n return Boolean(el && rootRef.current?.contains(el) && el.matches(':focus-visible'))\n }\n\n const desktop = layout.navigation === 'sidebar'\n\n return (\n <>\n {desktop && (\n // O aside reserva só a largura recolhida; o painel expandido flutua por cima do conteúdo.\n <aside\n aria-label=\"Menu lateral\"\n className={cn(\n 'relative hidden shrink-0 transition-[width] duration-200 ease-out md:block',\n collapsed ? 'w-sidebar-collapsed' : 'w-sidebar',\n )}\n >\n <div\n ref={rootRef}\n onMouseEnter={openPeek}\n onMouseLeave={() => {\n if (!keyboardFocusInside()) closePeek()\n }}\n onFocus={(e) => {\n if ((e.target as HTMLElement).matches(':focus-visible')) openPeek()\n }}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) closePeek()\n }}\n className=\"absolute inset-y-0 left-0 z-40 flex\"\n >\n <div\n className={cn(\n 'h-full border-r border-sidebar-border bg-sidebar-brand text-sidebar-foreground transition-[width,box-shadow] duration-200 ease-out',\n compact ? 'w-sidebar-collapsed' : 'w-sidebar',\n collapsed && peek && 'shadow-lg',\n )}\n >\n <SidebarBody\n compact={compact}\n submenu={layout.submenu}\n hoverExpands={hoverExpands}\n panelOpenFor={panel?.title ?? null}\n onTogglePanel={(item) => setPanel((p) => (p?.title === item.title ? null : item))}\n />\n </div>\n {panel && <SubmenuPanel item={panel} onClose={() => setPanel(null)} />}\n </div>\n </aside>\n )}\n\n {/* Mobile (e tablet no layout de menu superior): gaveta com submenu inline */}\n <Dialog.Root open={mobileNavOpen} onOpenChange={setMobileNavOpen}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn(\n 'fixed inset-0 z-40 bg-overlay data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0',\n desktop ? 'md:hidden' : 'lg:hidden',\n )}\n />\n <Dialog.Content\n aria-describedby={undefined}\n className={cn(\n 'fixed inset-y-0 left-0 z-50 w-sidebar-drawer bg-sidebar-brand text-sidebar-foreground shadow-lg data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left data-[state=open]:animate-in data-[state=open]:slide-in-from-left',\n desktop ? 'md:hidden' : 'lg:hidden',\n )}\n >\n <VisuallyHidden.Root>\n <Dialog.Title>Menu</Dialog.Title>\n </VisuallyHidden.Root>\n <SidebarBody\n compact={false}\n submenu=\"inline\"\n hoverExpands={false}\n onNavigate={close}\n onClose={close}\n />\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </>\n )\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Menu } from 'lucide-react'\nimport { useCurrentPath, useRendraLink } from '@/components/rendra-provider'\nimport { TooltipProvider } from '@/components/ui/tooltip'\nimport { cn } from '@/lib/cn'\nimport { CommandSearch } from './command-search'\nimport { Header } from './header'\nimport { defaultShellLayout, type ShellLayout } from './layout'\nimport { getBottomNavItems, getNavigationTargets, resolveActiveTo } from './navigation-utils'\nimport { ShellContext, useShell, type ShellContextValue } from './shell-context'\nimport { Sidebar } from './sidebar'\nimport type {\n NavGroup,\n ShellMenuItem,\n ShellNotificationsConfig,\n ShellUser,\n ShellUserMenuConfig,\n ShellWorkspacesConfig,\n} from './types'\n\nconst LAYOUT_KEY = 'ui-shell-layout'\n\nfunction readUserLayout(): Partial<ShellLayout> {\n try {\n return JSON.parse(localStorage.getItem(LAYOUT_KEY) ?? '{}') as Partial<ShellLayout>\n } catch {\n return {}\n }\n}\n\nconst defaultUser: ShellUser = { name: 'Usuário' }\n\n/**\n * Barra inferior do celular: até 4 atalhos e, no centro, o botão redondo do menu, subindo\n * metade acima da linha da barra, ao alcance do polegar. Com ela, o header não precisa do\n * botão de menu e sobra espaço para a seta de voltar.\n */\nfunction BottomNav({ onMenu }: { onMenu: () => void }) {\n const pathname = useCurrentPath()\n const Link = useRendraLink()\n const { bottomNavItems, navigationTargets } = useShell()\n const active = resolveActiveTo(navigationTargets, pathname)\n const item = (entry: (typeof bottomNavItems)[number]) => {\n const to = entry.to ?? entry.children?.[0]?.to ?? '/'\n const Icon = entry.icon\n return (\n <li key={entry.title}>\n <Link\n to={to}\n className={cn(\n 'flex min-h-touch flex-col items-center justify-center gap-1 py-2 text-xs font-medium transition-colors',\n to === active || entry.children?.some((c) => c.to === active)\n ? 'text-primary-text'\n : 'text-muted-foreground active:text-foreground',\n )}\n >\n <Icon className=\"size-icon-md\" aria-hidden />\n <span className=\"max-w-full truncate px-1\">{entry.shortTitle ?? entry.title}</span>\n </Link>\n </li>\n )\n }\n const half = Math.ceil(bottomNavItems.length / 2)\n return (\n <nav\n aria-label=\"Navegação rápida\"\n className=\"relative shrink-0 border-t bg-card pb-safe-inset md:hidden\"\n >\n <ul className=\"grid grid-cols-5 items-end\">\n {bottomNavItems.slice(0, half).map(item)}\n <li className=\"flex justify-center\">\n <button\n type=\"button\"\n onClick={onMenu}\n aria-label=\"Abrir menu\"\n className=\"-mt-6 mb-1 flex size-12 cursor-pointer items-center justify-center rounded-full bg-primary text-primary-foreground shadow-md ring-4 ring-card transition-transform outline-none focus-visible:ring-ring active:scale-95\"\n >\n <Menu className=\"size-icon-lg\" aria-hidden />\n </button>\n </li>\n {bottomNavItems.slice(half).map(item)}\n </ul>\n </nav>\n )\n}\n\nexport interface AppShellProps {\n /** Menu do sistema: sidebar, barra inferior e busca global. Único obrigatório. */\n navigation: NavGroup[]\n /** Sobrescreve o padrão interno (defaultShellLayout), chave a chave. */\n layout?: Partial<ShellLayout>\n /** Usuário exibido no menu do avatar e no rodapé da sidebar. */\n user?: ShellUser\n /** Itens do menu do avatar (ex.: \"Meu perfil\", \"Configurações\"). Padrão: nenhum. */\n userMenuItems?: ShellMenuItem[]\n /** Chamado ao selecionar \"Sair\", na sidebar e no menu do avatar. */\n onLogout?: () => void\n /** Rótulo do destino inicial na trilha do header. */\n homeLabel?: string\n /** Ações rápidas da busca global (Ctrl+K), além do atalho de tema. Padrão: nenhuma. */\n quickActions?: ShellMenuItem[]\n /** Notificações do sino do header. Sem esta prop, o sino não aparece. */\n notifications?: ShellNotificationsConfig\n /**\n * Quais submenus o menu do avatar mostra: `theme` (Tema), `template` (Template) e\n * `layout` (Layout). Todos `true` por padrão; `{ theme: false }` esconde só o Tema.\n * É o caminho para tirar essas escolhas do usuário (`userConfigurable` não faz isso).\n */\n userMenu?: ShellUserMenuConfig\n /**\n * Seletor de espaço (empresa, unidade, workspace) no topo do menu do avatar, logo depois\n * do usuário: um item de rádio por espaço, o de `activeId` marcado. `onSelect` recebe o\n * `id` escolhido. Sem esta prop, o menu é o de sempre.\n */\n workspaces?: ShellWorkspacesConfig\n /**\n * Logo do header no celular (abaixo de `md`): ocupa o lugar do título e da trilha. O título\n * continua anunciado ao leitor de tela (só some do visual), o botão de voltar e o ícone de\n * ajuda da tela ficam, e a trilha sai do header. A partir de `md` nada muda. O contêiner é\n * `aria-hidden`: o logo é decorativo para o leitor, então o nó **não pode ser interativo**\n * (um link ali dentro reprova `aria-hidden-focus` no axe).\n */\n headerLogo?: ReactNode\n /**\n * Permite que o usuário troque o layout pelo menu do avatar (guardado no navegador).\n * Desligue em produção se o layout do projeto for fixo.\n */\n userConfigurable?: boolean\n /** Tela atual. O boilerplate passa o <Outlet /> do react-router. */\n children?: ReactNode\n}\n\n/**\n * Estrutura da aplicação. Uma única área de rolagem: o <main>.\n * Nunca importa @/config nem um roteador: recebe o menu, o layout, o usuário e as\n * notificações por prop; quem navega é o RendraProvider (useCurrentPath/useRendraLink).\n * Título da aba e meta description (SEO) não são responsabilidade do AppShell: o\n * boilerplate (src/app/app-layout.tsx) aplica isso com useRouteMeta, que lê @/config/seo.\n */\nexport function AppShell({\n navigation,\n layout: layoutProp,\n user = defaultUser,\n userMenuItems = [],\n onLogout,\n homeLabel = 'Início',\n quickActions = [],\n notifications,\n userMenu,\n workspaces,\n headerLogo,\n userConfigurable = true,\n children,\n}: AppShellProps) {\n const [userLayout, setUserLayout] = useState<Partial<ShellLayout>>(() =>\n userConfigurable ? readUserLayout() : {},\n )\n const [mobileNavOpen, setMobileNavOpen] = useState(false)\n const [searchOpen, setSearchOpen] = useState(false)\n const [footerSlot, setFooterSlot] = useState<HTMLElement | null>(null)\n const [pageHelp, setPageHelp] = useState<ReactNode>(null)\n const pathname = useCurrentPath()\n const mainRef = useRef<HTMLElement>(null)\n\n const layoutPropKey = JSON.stringify(layoutProp ?? {})\n const layout = useMemo<ShellLayout>(\n () => ({\n ...defaultShellLayout,\n ...(JSON.parse(layoutPropKey) as Partial<ShellLayout>),\n ...userLayout,\n }),\n [layoutPropKey, userLayout],\n )\n\n const bottomNavItems = useMemo(() => getBottomNavItems(navigation), [navigation])\n const navigationTargets = useMemo(() => getNavigationTargets(navigation), [navigation])\n\n // Troca de tela: fecha a gaveta e volta a rolagem ao topo.\n useEffect(() => {\n setMobileNavOpen(false)\n mainRef.current?.scrollTo({ top: 0 })\n }, [pathname])\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') {\n e.preventDefault()\n setSearchOpen((o) => !o)\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [])\n\n const value = useMemo<ShellContextValue>(() => {\n const persist = (next: Partial<ShellLayout>) => {\n setUserLayout(next)\n try {\n localStorage.setItem(LAYOUT_KEY, JSON.stringify(next))\n } catch {\n // segue só em memória\n }\n }\n return {\n layout,\n setLayout: (key, v) => persist({ ...userLayout, [key]: v }),\n applyLayout: (partial) => persist({ ...userLayout, ...partial }),\n resetLayout: () => persist({}),\n mobileNavOpen,\n setMobileNavOpen,\n searchOpen,\n setSearchOpen,\n footerSlot,\n pageHelp,\n setPageHelp,\n navigation,\n bottomNavItems,\n navigationTargets,\n user,\n userMenuItems,\n onLogout,\n homeLabel,\n quickActions,\n notifications,\n userMenu,\n workspaces,\n headerLogo,\n }\n }, [\n layout,\n userLayout,\n mobileNavOpen,\n searchOpen,\n footerSlot,\n pageHelp,\n navigation,\n bottomNavItems,\n navigationTargets,\n user,\n userMenuItems,\n onLogout,\n homeLabel,\n quickActions,\n notifications,\n userMenu,\n workspaces,\n headerLogo,\n ])\n\n return (\n <ShellContext.Provider value={value}>\n <TooltipProvider>\n <div className=\"flex h-dvh overflow-hidden\">\n <a\n href=\"#conteudo\"\n className=\"sr-only z-50 rounded-control bg-primary px-4 py-2 text-primary-foreground focus:not-sr-only focus:fixed focus:top-2 focus:left-2\"\n >\n Pular para o conteúdo\n </a>\n <Sidebar />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <Header />\n <main\n ref={mainRef}\n id=\"conteudo\"\n tabIndex={-1}\n // relative: elementos absolutos do conteúdo (texto só para leitor de tela, inputs\n // ocultos) ficam presos à rolagem do main. Sem isso eles esticam o <html>, e um\n // link com #âncora rola a página inteira, deixando um vão em branco embaixo.\n className=\"relative min-h-0 flex-1 overflow-y-auto overscroll-contain outline-none\"\n >\n {children}\n </main>\n {/* Rodapé fixo das telas de formulário (ActionBar sticky). Vazio, não ocupa espaço. */}\n <div ref={setFooterSlot} className=\"shrink-0 empty:hidden\" />\n {layout.bottomNav && <BottomNav onMenu={() => setMobileNavOpen(true)} />}\n </div>\n </div>\n <CommandSearch />\n </TooltipProvider>\n </ShellContext.Provider>\n )\n}\n","/** Calcula contraste WCAG entre duas cores CSS resolvidas pelo navegador. */\nfunction toRgb(color: string): [number, number, number] | null {\n const probe = document.createElement('span')\n probe.style.color = color\n document.body.appendChild(probe)\n const resolved = getComputedStyle(probe).color\n probe.remove()\n const m = resolved.match(/[\\d.]+/g)\n if (!m || m.length < 3) return null\n return [Number(m[0]), Number(m[1]), Number(m[2])]\n}\n\nfunction luminance([r, g, b]: [number, number, number]) {\n const lin = (c: number) => {\n const s = c / 255\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4\n }\n return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b)\n}\n\nexport function readVar(name: string) {\n return getComputedStyle(document.documentElement).getPropertyValue(name).trim()\n}\n\nexport function contrastRatio(fg: string, bg: string): number | null {\n const a = toRgb(fg)\n const b = toRgb(bg)\n if (!a || !b) return null\n const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x) as [number, number]\n return (hi + 0.05) / (lo + 0.05)\n}\n","import { z } from 'zod'\n\n/*\n * Validadores brasileiros e esquemas Zod prontos, com mensagens em português.\n * Use nos formulários com React Hook Form: resolver: zodResolver(schema).\n */\n\nconst digits = (v: string) => v.replace(/\\D/g, '')\n\nexport function isValidCpf(value: string) {\n const cpf = digits(value)\n if (cpf.length !== 11 || /^(\\d)\\1{10}$/.test(cpf)) return false\n const calc = (len: number) => {\n let sum = 0\n for (let i = 0; i < len; i++) sum += Number(cpf[i]) * (len + 1 - i)\n const rest = (sum * 10) % 11\n return rest === 10 ? 0 : rest\n }\n return calc(9) === Number(cpf[9]) && calc(10) === Number(cpf[10])\n}\n\nexport function isValidCnpj(value: string) {\n const cnpj = digits(value)\n if (cnpj.length !== 14 || /^(\\d)\\1{13}$/.test(cnpj)) return false\n const calc = (len: number) => {\n const weights =\n len === 12 ? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] : [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n const sum = weights.reduce((acc, w, i) => acc + Number(cnpj[i]) * w, 0)\n const rest = sum % 11\n return rest < 2 ? 0 : 11 - rest\n }\n return calc(12) === Number(cnpj[12]) && calc(13) === Number(cnpj[13])\n}\n\nexport function isValidDateBR(value: string) {\n const m = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/)\n if (!m) return false\n const [, d, mo, y] = m.map(Number) as [number, number, number, number]\n const date = new Date(y, mo - 1, d)\n return date.getFullYear() === y && date.getMonth() === mo - 1 && date.getDate() === d\n}\n\nexport const zBR = {\n required: (label = 'Campo') => z.string().trim().min(1, `${label} é obrigatório.`),\n email: () => z.string().trim().min(1, 'E-mail é obrigatório.').email('E-mail inválido.'),\n cpf: () => z.string().refine(isValidCpf, 'CPF inválido.'),\n cnpj: () => z.string().refine(isValidCnpj, 'CNPJ inválido.'),\n cpfCnpj: () =>\n z\n .string()\n .refine(\n (v) => (digits(v).length <= 11 ? isValidCpf(v) : isValidCnpj(v)),\n 'CPF ou CNPJ inválido.',\n ),\n phone: () =>\n z.string().refine((v) => [10, 11].includes(digits(v).length), 'Telefone incompleto.'),\n cep: () => z.string().refine((v) => digits(v).length === 8, 'CEP incompleto.'),\n dateBR: () => z.string().refine(isValidDateBR, 'Data inválida.'),\n}\n","/*\n * APLICAÇÃO NO DOM\n * -------------------------------------------------------------------------\n * applyTheme injeta no DOM o resultado (puro) de createTheme. Sem `target`, reproduz\n * exatamente applyPalette hoje: um <style> em document.head com o claro e o escuro do\n * tema, selecionados por :root[data-palette='<id>'] (quem liga o atributo é o BrandProvider,\n * como já acontece). Com `target`, aplica num contêiner próprio: marca\n * [data-rendra-root='<id>'] nele e escopa o <style> por esse atributo em vez de :root, para\n * um contêiner com tema próprio (não o documento inteiro) ler os mesmos tokens --rendra-*.\n */\nimport type { ThemeResult } from './theme'\n\nexport interface ApplyThemeOptions {\n /** Default: document.documentElement (o próprio <html>, como applyPalette hoje). */\n target?: HTMLElement\n /** Seletor do claro; o escuro é `${selector}.dark`. Default: deriva de target/id. */\n selector?: string\n}\n\nconst block = (selector: string, vars: Record<string, string>) =>\n `${selector} {\\n${Object.entries(vars)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n')}\\n}\\n`\n\n/** Aplica no DOM o resultado de createTheme. Sem opções, reproduz applyPalette(seed) de hoje. */\nexport function applyTheme(\n theme: ThemeResult,\n options: ApplyThemeOptions = {},\n doc: Document = document,\n): void {\n const target = options.target ?? doc.documentElement\n const isRoot = target === doc.documentElement\n if (!isRoot) target.setAttribute('data-rendra-root', theme.id)\n\n const lightSelector =\n options.selector ??\n (isRoot ? `:root[data-palette='${theme.id}']` : `[data-rendra-root='${theme.id}']`)\n const darkSelector = options.selector\n ? `${options.selector}.dark`\n : isRoot\n ? `:root[data-palette='${theme.id}'].dark`\n : `[data-rendra-root='${theme.id}'].dark`\n\n const attr = 'data-theme-runtime'\n let style = doc.head.querySelector<HTMLStyleElement>(`style[${attr}=\"${theme.id}\"]`)\n if (!style) {\n style = doc.createElement('style')\n style.setAttribute(attr, theme.id)\n doc.head.appendChild(style)\n }\n style.textContent = `${block(lightSelector, theme.vars.light)}\\n${block(darkSelector, theme.vars.dark)}`\n}\n","import { useEffect, useMemo, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport { applyTheme } from './apply-theme'\nimport { BrandContext, type BrandContextValue, type ColorMode } from './brand-context'\nimport type { ThemeResult } from './theme'\nimport type { Shape } from '@/lib/shape'\nimport type { BrandConfig, PaletteConfig } from './types'\n\nconst MODE_KEY = 'ui-mode'\nconst BRAND_KEY = 'ui-brand'\nconst PALETTE_KEY = 'ui-palette'\n\n/**\n * Armazenamento plugável: get/set simples, para trocar o localStorage padrão por outra fonte\n * (cookie, backend...), ou desligar com `false`.\n * `remove` é opcional: quando ausente (armazenamento customizado antigo, sem essa peça),\n * `clearKey` cai de volta em `set(key, '')`, para não quebrar quem já implementou só get/set.\n */\nexport interface BrandStorage {\n get(key: string): string | null\n set(key: string, value: string): void\n remove?(key: string): void\n}\n\nconst localStorageAdapter: BrandStorage = {\n get(key) {\n try {\n return localStorage.getItem(key)\n } catch {\n return null\n }\n },\n set(key, value) {\n try {\n localStorage.setItem(key, value)\n } catch {\n // Armazenamento indisponível (aba anônima, bloqueio): segue só em memória.\n }\n },\n remove(key) {\n try {\n localStorage.removeItem(key)\n } catch {\n // Armazenamento indisponível: segue só em memória.\n }\n },\n}\n\nconst noopStorage: BrandStorage = { get: () => null, set: () => {}, remove: () => {} }\n\nfunction resolveStorage(storage: BrandStorage | false | undefined): BrandStorage {\n if (storage === false) return noopStorage\n return storage ?? localStorageAdapter\n}\n\n/** Zera a chave de verdade (removeItem) quando o storage implementa `remove`; senão, `set('')`. */\nfunction clearKey(storage: BrandStorage, key: string) {\n if (storage.remove) storage.remove(key)\n else storage.set(key, '')\n}\n\nconst darkQuery = '(prefers-color-scheme: dark)'\nfunction subscribeSystem(cb: () => void) {\n const mq = matchMedia(darkQuery)\n mq.addEventListener('change', cb)\n return () => mq.removeEventListener('change', cb)\n}\nconst getSystemDark = () => matchMedia(darkQuery).matches\n\ninterface BrandProviderProps {\n brands: BrandConfig[]\n /** Paletas disponíveis. Padrão: uma por modelo. */\n palettes?: PaletteConfig[]\n defaultBrand: BrandConfig\n children: ReactNode\n /**\n * Tema aplicado em tempo de execução (resultado de createTheme, C5). Aplica sem exigir um id\n * cadastrado em palettes.ts: o data-palette (ou data-rendra-root, com `target`) recebe o id\n * do próprio tema.\n */\n theme?: ThemeResult\n /** Força um modo (útil no Storybook e nos testes). */\n forcedMode?: 'light' | 'dark'\n /** Força uma marca pelo id (útil no Storybook e nos testes). */\n forcedBrandId?: string\n /** Força uma paleta pelo id (útil no Storybook). */\n forcedPaletteId?: string\n /** Modo controlado; sem esta prop, o provider guarda o próprio estado (comportamento de hoje). */\n mode?: ColorMode\n onModeChange?(mode: ColorMode): void\n /** Marca controlada; sem esta prop, o provider guarda o próprio estado. */\n brandId?: string\n onBrandIdChange?(id: string): void\n /** Paleta controlada (null volta às cores do próprio modelo); sem esta prop, estado próprio. */\n paletteId?: string | null\n onPaletteIdChange?(id: string | null): void\n /** Armazenamento da preferência; false desliga a persistência. Padrão: localStorage. */\n storage?: BrandStorage | false\n /** Contêiner onde a marca é aplicada (data-*, tema). Padrão: document.documentElement. */\n target?: HTMLElement\n}\n\nexport function BrandProvider({\n brands,\n palettes: palettesProp,\n defaultBrand,\n children,\n theme,\n forcedMode,\n forcedBrandId,\n forcedPaletteId,\n mode: modeProp,\n onModeChange,\n brandId: brandIdProp,\n onBrandIdChange,\n paletteId: paletteIdProp,\n onPaletteIdChange,\n storage: storageProp,\n target,\n}: BrandProviderProps) {\n const storage = useMemo(() => resolveStorage(storageProp), [storageProp])\n const brandControlled = brandIdProp !== undefined\n const modeControlled = modeProp !== undefined\n const paletteControlled = paletteIdProp !== undefined\n\n const [brandIdState, setBrandIdState] = useState(\n () => brandIdProp ?? storage.get(BRAND_KEY) ?? defaultBrand.id,\n )\n const [modeState, setModeState] = useState<ColorMode>(\n () => modeProp ?? (storage.get(MODE_KEY) as ColorMode | null) ?? 'system',\n )\n const [paletteIdState, setPaletteIdState] = useState<string | null>(\n () => paletteIdProp ?? storage.get(PALETTE_KEY) ?? null,\n )\n const systemDark = useSyncExternalStore(subscribeSystem, getSystemDark)\n\n const brandId = brandControlled ? brandIdProp! : brandIdState\n const mode = modeControlled ? modeProp! : modeState\n const paletteId = paletteControlled ? (paletteIdProp ?? null) : paletteIdState\n\n const effectiveBrandId = forcedBrandId ?? brandId\n const brand = brands.find((b) => b.id === effectiveBrandId) ?? defaultBrand\n const shape: Shape = brand.shape\n const palettes = useMemo<PaletteConfig[]>(\n () =>\n palettesProp ??\n brands.map((b) => ({ id: b.id, name: b.productName, sidebarLogo: b.sidebarLogo })),\n [palettesProp, brands],\n )\n // Tema em tempo de execução (C5): quando informado, dita a paleta ativa, sem precisar estar\n // cadastrado em palettes.ts (fallback documentado para paletteId desconhecido, abaixo).\n const themePalette = useMemo<PaletteConfig | null>(\n () => (theme ? { id: theme.id, name: theme.name, sidebarLogo: theme.sidebarLogo } : null),\n [theme],\n )\n const palette = useMemo<PaletteConfig>(() => {\n if (themePalette) return themePalette\n return (\n palettes.find((p) => p.id === (forcedPaletteId ?? paletteId)) ??\n palettes.find((p) => p.id === brand.id) ?? {\n id: brand.id,\n name: brand.productName,\n sidebarLogo: brand.sidebarLogo,\n }\n )\n }, [themePalette, palettes, forcedPaletteId, paletteId, brand])\n const resolvedMode = forcedMode ?? (mode === 'system' ? (systemDark ? 'dark' : 'light') : mode)\n\n useEffect(() => {\n const root = target ?? document.documentElement\n root.dataset.brand = brand.id\n root.dataset.shape = shape\n root.dataset.label = brand.labelStyle ?? 'discreto'\n root.dataset.palette = palette.id\n root.classList.toggle('dark', resolvedMode === 'dark')\n // O favicon é do documento inteiro: só faz sentido quando aplicado à raiz de verdade.\n if (root === document.documentElement) {\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')\n if (!link) {\n link = document.createElement('link')\n link.rel = 'icon'\n document.head.appendChild(link)\n }\n link.href = brand.favicon\n // O título da aba vem de useRouteMeta (tela | produto).\n }\n }, [brand, palette, resolvedMode, shape, target])\n\n // Tema em tempo de execução (C5): injeta/atualiza o <style> do tema sempre que ele mudar.\n useEffect(() => {\n if (!theme) return\n applyTheme(theme, { target })\n }, [theme, target])\n\n const value = useMemo<BrandContextValue>(\n () => ({\n brand,\n brands,\n resolvedMode,\n mode,\n shape,\n palette,\n palettes,\n sidebarLogoVariant:\n palette.sidebarLogo === 'auto'\n ? resolvedMode === 'dark'\n ? 'dark'\n : 'light'\n : palette.sidebarLogo,\n setPaletteId: (id) => {\n if (!paletteControlled) setPaletteIdState(id)\n if (id) storage.set(PALETTE_KEY, id)\n else clearKey(storage, PALETTE_KEY)\n onPaletteIdChange?.(id)\n },\n setMode: (next) => {\n if (!modeControlled) setModeState(next)\n storage.set(MODE_KEY, next)\n onModeChange?.(next)\n },\n // Trocar de modelo volta às cores do próprio modelo. No modo controlado (paletteId\n // informado), quem decide se a paleta some é o dono do estado: aqui só se notifica via\n // onPaletteIdChange, nunca se zera o estado por conta própria.\n setBrandId: (id) => {\n if (!brandControlled) setBrandIdState(id)\n storage.set(BRAND_KEY, id)\n onBrandIdChange?.(id)\n if (!paletteControlled) setPaletteIdState(null)\n clearKey(storage, PALETTE_KEY)\n onPaletteIdChange?.(null)\n },\n }),\n [\n brand,\n brands,\n palette,\n palettes,\n mode,\n resolvedMode,\n shape,\n storage,\n brandControlled,\n modeControlled,\n paletteControlled,\n onModeChange,\n onBrandIdChange,\n onPaletteIdChange,\n ],\n )\n\n return <BrandContext.Provider value={value}>{children}</BrandContext.Provider>\n}\n","/*\n * COR CONTROLADA\n * -------------------------------------------------------------------------------------\n * createTheme(input) é uma função pura (sem tocar o DOM, compatível com SSR) com três modos:\n *\n * - gerado: sementes (4 cores + degradê), passa por createPalette, corrige contraste AA,\n * é o mesmo comportamento de applyPalette hoje, só que exposto por uma API versionada;\n * - explicito: tokens semânticos já prontos, por nome SEM prefixo (primary, primaryForeground,\n * sidebar...), traduzidos aqui para --rendra-*; nada é recalculado, o contraste só é\n * relatado (enforceContrast força o ajuste); dark ausente é derivado, presente é respeitado;\n * - misto: sementes + sobrescritas pontuais, a sobrescrita sempre vence.\n *\n * createPalette/applyPalette/paletteCss continuam intactos: createTheme é construído por cima\n * deles, nunca em paralelo. A saída já nasce com as chaves --rendra-* (decisão 1.8).\n */\nimport { createPalette, contrast, mix, type PaletteSeeds } from './palette'\n\nexport type ThemeMode = 'gerado' | 'explicito' | 'misto'\n\nexport interface ThemeSeedInput {\n /** Hex, rgb(), hsl() ou tripleta HSL solta (\"210 95% 34%\"). */\n primary: string\n primaryHover?: string\n secondary: string\n secondaryHover?: string\n /** Degradê da marca (sidebar, painel do login, destaque): luz, meio e fundo. */\n gradient: [string, string, string]\n onPrimary?: 'auto' | 'light' | 'dark'\n onSecondary?: 'auto' | 'light' | 'dark'\n}\n\n/** Tokens semânticos por nome, sem o prefixo --rendra- (ex.: \"primary\", \"primaryForeground\"). */\nexport type ThemeSemanticTokens = Partial<Record<(typeof TOKEN_KEYS)[number], string>>\n\nexport interface ThemeExplicitInput {\n light: ThemeSemanticTokens\n /** Ausente = derivado do claro; presente = respeitado como está. */\n dark?: ThemeSemanticTokens\n /** Default false: só relata o contraste. true: ajusta os pares que falham AA. */\n enforceContrast?: boolean\n}\n\nexport interface ThemeInput {\n /** Usado em data-palette (ou data-rendra-root) e no BrandProvider. */\n id: string\n /** Nome curto exibido nos seletores. */\n name: string\n mode: ThemeMode\n /** Obrigatório em 'gerado' e 'misto'. */\n seed?: ThemeSeedInput\n /** Obrigatório em 'explicito' e 'misto' (ao menos `light`). */\n explicit?: Partial<ThemeExplicitInput>\n}\n\nexport interface ThemeContrastCheck {\n /** Nome da variável --rendra-* verificada (o papel de preenchimento do par). */\n token: string\n background: string\n foreground: string\n ratio: number\n passesAA: boolean\n mode: 'light' | 'dark'\n}\n\nexport interface ThemeAdjustment {\n token: string\n mode: 'light' | 'dark'\n requested: string\n applied: string\n ratio: number\n}\n\nexport interface ThemeResult {\n id: string\n name: string\n /** Logotipo adequado sobre a sidebar deste tema. */\n sidebarLogo: 'light' | 'dark'\n vars: {\n light: Record<string, string>\n dark: Record<string, string>\n }\n /** Um item por par de contraste conferido. */\n report: ThemeContrastCheck[]\n /** Ajustes aplicados (enforceContrast, ou os já feitos por createPalette no modo gerado). */\n adjustments: ThemeAdjustment[]\n}\n\n/* ------------------------------------------------------------- vocabulário de tokens */\n\n/**\n * Todo nome de token que createPalette emite (light ∪ dark), sem prefixo, em camelCase.\n * É a lista que o modo explícito aceita; qualquer chave fora daqui é ignorada (não é\n * vocabulário de createPalette, não faz parte deste contrato).\n */\nexport const TOKEN_KEYS = [\n 'primary',\n 'primaryForeground',\n 'primaryHover',\n 'primaryHoverForeground',\n 'secondary',\n 'secondaryForeground',\n 'secondaryHover',\n 'secondaryHoverForeground',\n 'primarySoft',\n 'primarySoftForeground',\n 'primaryText',\n 'ring',\n 'accent',\n 'accentForeground',\n 'sidebar',\n 'sidebarImage',\n 'sidebarForeground',\n 'sidebarMutedForeground',\n 'sidebarBorder',\n 'sidebarAccent',\n 'sidebarActive',\n 'sidebarActiveForeground',\n 'sidebarIndicator',\n 'gradientBrand',\n 'gradientBrandForeground',\n 'gradientAccent',\n 'gradientSoft',\n 'chart1',\n 'chart2',\n 'chart3',\n 'chart4',\n 'chart5',\n 'shadowColor',\n 'background',\n 'backgroundImage',\n 'foreground',\n 'card',\n 'cardForeground',\n 'popover',\n 'popoverForeground',\n 'muted',\n 'mutedForeground',\n 'border',\n 'input',\n 'field',\n 'overlay',\n] as const\n\n/** camelCase -> kebab-case (\"primaryForeground\" -> \"primary-foreground\", \"chart1\" -> \"chart-1\"). */\nfunction camelToKebab(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([a-zA-Z])(\\d)/g, '$1-$2')\n .toLowerCase()\n}\n\nconst toVarName = (key: string) => `--rendra-${camelToKebab(key)}`\n\n/* ------------------------------------------------------------------------- cor */\n\nconst WHITE = '#ffffff'\nconst BLACK = '#000000'\nconst INK = '#0b1d37'\n\nfunction isDarkColor(hex: string): boolean {\n return contrast(hex, WHITE) >= contrast(hex, INK)\n}\n\nconst HEX_RE = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i\nconst RGB_RE =\n /^rgba?\\(\\s*([\\d.]+)\\s*[,\\s]\\s*([\\d.]+)\\s*[,\\s]\\s*([\\d.]+)(?:\\s*[,/]\\s*[\\d.%]+)?\\s*\\)$/i\nconst HSL_RE =\n /^hsla?\\(\\s*([\\d.]+)(?:deg)?\\s*[,\\s]\\s*([\\d.]+)%\\s*[,\\s]\\s*([\\d.]+)%(?:\\s*[,/]\\s*[\\d.%]+)?\\s*\\)$/i\nconst HSL_TRIPLET_RE = /^([\\d.]+)\\s+([\\d.]+)%\\s+([\\d.]+)%$/\n\nfunction toHex2(n: number): string {\n return Math.round(Math.min(255, Math.max(0, n)))\n .toString(16)\n .padStart(2, '0')\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`\n}\n\n/** HSL (h em graus, s/l em 0..100) para hex. */\nfunction hslToHex(h: number, s: number, l: number): string {\n const sN = s / 100\n const lN = l / 100\n const k = (n: number) => (n + h / 30) % 12\n const a = sN * Math.min(lN, 1 - lN)\n const f = (n: number) => lN - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)))\n return rgbToHex(255 * f(0), 255 * f(8), 255 * f(4))\n}\n\n/**\n * Tenta reconhecer `value` como cor (hex, rgb(), hsl() ou tripleta HSL solta, \"210 95% 34%\") e\n * devolve o hex normalizado em minúsculas. Devolve null quando não é um formato de cor\n * reconhecido (gradiente, palavra-chave, \"none\"...), para o chamador decidir o que fazer.\n */\nexport function tryParseColorToHex(value: string): string | null {\n const v = value.trim()\n if (HEX_RE.test(v)) {\n let h = v.slice(1)\n if (h.length === 3)\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n return `#${h.toLowerCase()}`\n }\n const rgb = RGB_RE.exec(v)\n if (rgb) return rgbToHex(Number(rgb[1]), Number(rgb[2]), Number(rgb[3]))\n const hsl = HSL_RE.exec(v)\n if (hsl) return hslToHex(Number(hsl[1]), Number(hsl[2]), Number(hsl[3]))\n const triplet = HSL_TRIPLET_RE.exec(v)\n if (triplet) return hslToHex(Number(triplet[1]), Number(triplet[2]), Number(triplet[3]))\n return null\n}\n\n/** Como tryParseColorToHex, mas lança quando o valor precisa ser uma cor (sementes). */\nfunction parseColorToHex(value: string, label: string): string {\n const hex = tryParseColorToHex(value)\n if (!hex)\n throw new Error(`Cor inválida em ${label}: ${value} (use hex, rgb(), hsl() ou \"H S% L%\")`)\n return hex\n}\n\n/** rgb(var(--x) / a) precisa da tripleta \"r g b\"; aceita hex ou já-tripleta. */\nfunction toRgbTriplet(value: string): string {\n const hex = tryParseColorToHex(value)\n if (hex) {\n const h = hex.slice(1)\n const n = (i: number) => parseInt(h.slice(i, i + 2), 16)\n return `${n(0)} ${n(2)} ${n(4)}`\n }\n return value.trim()\n}\n\n/* --------------------------------------------------------------- modo explícito/misto */\n\n/** Traduz tokens semânticos sem prefixo para --rendra-*, normalizando cor quando reconhecida. */\nfunction translateExplicit(tokens: ThemeSemanticTokens): Record<string, string> {\n const out: Record<string, string> = {}\n for (const key of TOKEN_KEYS) {\n const value = tokens[key]\n if (value == null) continue\n const varName = toVarName(key)\n if (key === 'shadowColor') {\n out[varName] = toRgbTriplet(value)\n continue\n }\n out[varName] = tryParseColorToHex(value) ?? value\n }\n return out\n}\n\n/**\n * Derivação simples do escuro a partir do claro, só usada no modo explícito sem sementes e sem\n * `dark` informado (documentada aqui, não é a mesma qualidade AA de createPalette): papéis de\n * texto (*Foreground) clareiam, preenchimentos e fundos escurecem. Quem quiser o escuro fino\n * deve informar `explicit.dark` ou usar sementes (modo gerado/misto).\n */\nfunction deriveSimpleDark(light: Record<string, string>): Record<string, string> {\n const dark: Record<string, string> = {}\n for (const [varName, value] of Object.entries(light)) {\n const hex = tryParseColorToHex(value)\n if (!hex) {\n dark[varName] = value\n continue\n }\n const isForeground = /-foreground$/.test(varName)\n dark[varName] = isForeground ? mix(hex, WHITE, 0.4) : mix(hex, BLACK, 0.5)\n }\n return dark\n}\n\n/* ------------------------------------------------------------------- relatório de contraste */\n\n/** Pares (preenchimento, texto) conferidos no relatório, pelo nome do token (sem prefixo). */\nconst CONTRAST_PAIRS: [fill: string, foreground: string][] = [\n ['primary', 'primaryForeground'],\n ['primaryHover', 'primaryHoverForeground'],\n ['secondary', 'secondaryForeground'],\n ['secondaryHover', 'secondaryHoverForeground'],\n ['primarySoft', 'primarySoftForeground'],\n ['accent', 'accentForeground'],\n ['sidebar', 'sidebarForeground'],\n ['card', 'cardForeground'],\n ['popover', 'popoverForeground'],\n ['muted', 'mutedForeground'],\n ['background', 'foreground'],\n]\n\nconst AA = 4.5\n\n/** Constrói o relatório e, se enforceContrast, ajusta os pares que falham (mutando `vars`). */\nfunction buildReport(\n vars: { light: Record<string, string>; dark: Record<string, string> },\n enforceContrast: boolean,\n): { report: ThemeContrastCheck[]; adjustments: ThemeAdjustment[] } {\n const report: ThemeContrastCheck[] = []\n const adjustments: ThemeAdjustment[] = []\n for (const mode of ['light', 'dark'] as const) {\n const map = vars[mode]\n for (const [fillKey, fgKey] of CONTRAST_PAIRS) {\n const fillVar = toVarName(fillKey)\n const fgVar = toVarName(fgKey)\n const fillValue = map[fillVar]\n const fgValue = map[fgVar]\n if (!fillValue || !fgValue) continue\n const fillHex = tryParseColorToHex(fillValue)\n const fgHex = tryParseColorToHex(fgValue)\n if (!fillHex || !fgHex) continue\n const ratio = contrast(fillHex, fgHex)\n const passesAA = ratio >= AA\n report.push({\n token: fillVar,\n background: fillHex,\n foreground: fgHex,\n ratio,\n passesAA,\n mode,\n })\n if (!passesAA && enforceContrast) {\n const towardBlack = isDarkColor(fillHex) ? false : true\n let applied = fgHex\n for (let t = 0; t <= 1.0001; t += 0.02) {\n const candidate = mix(fgHex, towardBlack ? BLACK : WHITE, t)\n if (contrast(fillHex, candidate) >= AA) {\n applied = candidate\n break\n }\n applied = towardBlack ? BLACK : WHITE\n }\n const finalRatio = contrast(fillHex, applied)\n map[fgVar] = applied\n adjustments.push({\n token: fgVar,\n mode,\n requested: fgHex,\n applied,\n ratio: finalRatio,\n })\n }\n }\n }\n return { report, adjustments }\n}\n\n/* ------------------------------------------------------------------------------- createTheme */\n\n/**\n * Ajustes do modo gerado/misto: compara a cor pedida na semente (primary, primaryHover,\n * secondary, secondaryHover, já normalizadas para hex por seedToPaletteSeeds) com a cor que\n * createPalette de fato aplicou em cada preenchimento, claro e escuro. Diferença = ajuste (seja\n * para passar AA com o texto, no claro, seja para ficar visível sobre o card escuro, no escuro;\n * os dois casos hoje ficam só em nota de texto dentro de createPalette, e o escuro é descartado\n * — aqui os dois viram registro estruturado).\n */\nfunction seedAdjustments(\n seedHexes: Pick<PaletteSeeds, 'primary' | 'primaryHover' | 'secondary' | 'secondaryHover'>,\n vars: { light: Record<string, string>; dark: Record<string, string> },\n): ThemeAdjustment[] {\n const out: ThemeAdjustment[] = []\n for (const key of ['primary', 'primaryHover', 'secondary', 'secondaryHover'] as const) {\n const requested = seedHexes[key]\n const varName = toVarName(key)\n for (const mode of ['light', 'dark'] as const) {\n const applied = vars[mode][varName]\n if (!applied || applied.toLowerCase() === requested.toLowerCase()) continue\n const fgVar = toVarName(`${key}Foreground`)\n const fg = vars[mode][fgVar]\n const fgHex = fg ? tryParseColorToHex(fg) : null\n out.push({\n token: varName,\n mode,\n requested,\n applied,\n ratio: fgHex ? contrast(applied, fgHex) : 0,\n })\n }\n }\n return out\n}\n\nfunction seedToPaletteSeeds(id: string, name: string, seed: ThemeSeedInput): PaletteSeeds {\n return {\n id,\n name,\n primary: parseColorToHex(seed.primary, 'seed.primary'),\n primaryHover: parseColorToHex(seed.primaryHover ?? seed.primary, 'seed.primaryHover'),\n secondary: parseColorToHex(seed.secondary, 'seed.secondary'),\n secondaryHover: parseColorToHex(seed.secondaryHover ?? seed.secondary, 'seed.secondaryHover'),\n gradient: seed.gradient.map((c, i) => parseColorToHex(c, `seed.gradient[${i}]`)) as [\n string,\n string,\n string,\n ],\n onPrimary: seed.onPrimary,\n onSecondary: seed.onSecondary,\n }\n}\n\nfunction sidebarLogoFrom(vars: { light: Record<string, string>; dark: Record<string, string> }) {\n const sidebar = vars.light['--rendra-sidebar'] ?? vars.dark['--rendra-sidebar']\n const hex = sidebar ? tryParseColorToHex(sidebar) : null\n return hex && isDarkColor(hex) ? 'dark' : 'light'\n}\n\n/**\n * Função pura, sem DOM, compatível com SSR. As chaves de vars.light/vars.dark já nascem\n * prefixadas (--rendra-primary, --rendra-shadow-color...), no mesmo formato que\n * applyTheme/BrandProvider esperam para injetar no DOM sem reprocessar nada.\n */\nexport function createTheme(input: ThemeInput): ThemeResult {\n const { id, name, mode } = input\n\n if (mode === 'gerado') {\n if (!input.seed) throw new Error('createTheme: modo \"gerado\" exige seed.')\n const paletteSeeds = seedToPaletteSeeds(id, name, input.seed)\n const palette = createPalette(paletteSeeds)\n const vars = { light: { ...palette.light }, dark: { ...palette.dark } }\n // createPalette já corrige AA na geração; o relatório aqui só confirma (sem reajustar).\n const { report } = buildReport(vars, false)\n // Reaproveita os hexes já normalizados por seedToPaletteSeeds, sem reanalisar a semente.\n const adjustments = seedAdjustments(paletteSeeds, vars)\n return { id, name, sidebarLogo: palette.sidebarLogo, vars, report, adjustments }\n }\n\n if (mode === 'explicito') {\n const explicit = input.explicit\n if (!explicit?.light) throw new Error('createTheme: modo \"explicito\" exige explicit.light.')\n const light = translateExplicit(explicit.light)\n const dark = explicit.dark ? translateExplicit(explicit.dark) : deriveSimpleDark(light)\n const vars = { light, dark }\n const { report, adjustments } = buildReport(vars, explicit.enforceContrast ?? false)\n return { id, name, sidebarLogo: sidebarLogoFrom(vars), vars, report, adjustments }\n }\n\n // misto: sementes geram a base; sobrescritas do explicit vencem por cima.\n if (!input.seed) throw new Error('createTheme: modo \"misto\" exige seed.')\n const paletteSeeds = seedToPaletteSeeds(id, name, input.seed)\n const palette = createPalette(paletteSeeds)\n const vars = { light: { ...palette.light }, dark: { ...palette.dark } }\n // Reaproveita os hexes já normalizados por seedToPaletteSeeds, sem reanalisar a semente.\n const fromSeed = seedAdjustments(paletteSeeds, vars)\n const overrides = input.explicit\n if (overrides?.light) Object.assign(vars.light, translateExplicit(overrides.light))\n if (overrides?.dark) Object.assign(vars.dark, translateExplicit(overrides.dark))\n const { report, adjustments: overrideAdjustments } = buildReport(\n vars,\n overrides?.enforceContrast ?? false,\n )\n return {\n id,\n name,\n sidebarLogo: sidebarLogoFrom(vars),\n vars,\n report,\n adjustments: [...fromSeed, ...overrideAdjustments],\n }\n}\n"],"mappings":"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CD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,IAAI;EACF,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EAC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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/lib/motion/reorder.ts","../src/lib/motion/count.ts","../src/components/ui/accordion.tsx","../src/lib/initials.ts","../src/components/ui/avatar.tsx","../src/components/ui/badge.tsx","../src/components/ui/brand-logo.tsx","../src/components/ui/breadcrumb.tsx","../src/components/ui/button-group.tsx","../src/components/ui/card.tsx","../src/components/ui/calendar.tsx","../src/components/ui/popover.tsx","../src/assets/channels/facebook.png","../src/assets/channels/google.png","../src/assets/channels/instagram.png","../src/assets/channels/reclameaqui.png","../src/assets/channels/tiktok.png","../src/assets/channels/whatsapp-web.png","../src/assets/channels/whatsapp.png","../src/components/ui/chat.tsx","../src/components/ui/checklist.tsx","../src/brand/palette.ts","../src/components/ui/color-picker.tsx","../src/components/ui/switch.tsx","../src/components/ui/data-toolbar.tsx","../src/components/ui/date-picker.tsx","../src/components/ui/error-page.tsx","../src/components/ui/form.tsx","../src/components/ui/slider.tsx","../src/lib/sortable.ts","../src/components/ui/image-cropper.tsx","../src/components/ui/image-viewer.tsx","../src/components/ui/kanban.tsx","../src/components/ui/sortable-handle.tsx","../src/components/ui/list.tsx","../src/components/ui/otp-input.tsx","../src/components/ui/pagination.tsx","../src/components/ui/progress.tsx","../src/lib/qr-encode.ts","../src/components/ui/qr-code.tsx","../src/components/ui/rating.tsx","../src/components/ui/rendra-credit.tsx","../src/components/ui/repeatable-field.tsx","../src/components/ui/separator.tsx","../src/components/ui/skeleton.tsx","../src/components/ui/stat-card.tsx","../src/hooks/use-debounced-value.ts","../src/components/ui/table.tsx","../src/components/ui/upload.tsx","../src/components/ui/wizard.tsx","../src/components/layout/primitives.tsx","../src/components/layout/page-header.tsx","../src/components/app-shell/command-search.tsx","../src/lib/shape.ts","../src/components/app-shell/layout.ts","../src/components/app-shell/mega-menu.tsx","../src/components/app-shell/notifications.tsx","../src/components/app-shell/header.tsx","../src/components/app-shell/navigation-utils.ts","../src/components/app-shell/sidebar.tsx","../src/components/app-shell/app-shell.tsx","../src/lib/contrast.ts","../src/lib/validators.ts","../src/brand/apply-theme.ts","../src/brand/brand-provider.tsx","../src/brand/theme.ts"],"sourcesContent":["import type { MotionMode } from './motion-context'\n\n/*\n * Regra de reordenação (kanban, list, upload): o `layout` do Motion só fica ligado quando\n * não há arraste em curso. Sob o dedo ou o ponteiro a ordem muda a cada passo, e animar cada\n * passo atrasaria o item atrás do cursor; ao soltar (ou pelo teclado/menu) a ordem muda de uma\n * vez, e aí o layout anima o resultado.\n */\nexport function layoutEnabled({\n mode,\n ready,\n dragging,\n}: {\n mode: MotionMode\n /** O chunk do `domMax` já chegou (`useLayoutReady`). Antes disso `layout` não faz nada. */\n ready: boolean\n dragging: boolean\n}) {\n return mode === 'on' && ready && !dragging\n}\n","import type { ReactNode } from 'react'\n\n/*\n * Contador do StatCard: lê o `value` (número, ou texto com número em pt-BR, como\n * \"R$ 1.234,50\", \"98%\" ou \"12,5 mil\"), preserva prefixo, sufixo, casas decimais e agrupamento,\n * e reescreve o número durante a contagem. O que não for número devolve null (só aparece, sem\n * contar). No fim da contagem o texto é exatamente o `value` original.\n */\n\nexport interface ParsedNumber {\n /** Tudo antes do número (inclui o sinal de menos). */\n prefix: string\n /** Tudo depois do número. */\n suffix: string\n /** Valor numérico (sem sinal no `prefix`: o sinal já está aqui). */\n value: number\n decimals: number\n /** Separador de milhar \".\" (texto pt-BR que o usava). */\n grouping: boolean\n /** Separador decimal: \",\" no texto pt-BR, \".\" no número do JavaScript. */\n decimalSeparator: ',' | '.'\n}\n\n// prefixo sem dígito nem sinal, sinal opcional, inteiro (com milhar \".\" ou sem), decimais, sufixo sem dígito.\nconst PT_BR = /^([^\\d-]*)(-?)(\\d{1,3}(?:\\.\\d{3})+|\\d+)(?:,(\\d+))?([^\\d]*)$/\n\nexport function parseLocaleNumber(value: ReactNode): ParsedNumber | null {\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) return null\n const text = String(Math.abs(value))\n if (/e/i.test(text)) return null\n const decimals = text.includes('.') ? text.split('.')[1]!.length : 0\n return {\n prefix: value < 0 ? '-' : '',\n suffix: '',\n value: Math.abs(value),\n decimals,\n grouping: false,\n decimalSeparator: '.',\n }\n }\n if (typeof value !== 'string') return null\n const match = PT_BR.exec(value)\n if (!match) return null\n const [, prefix = '', sign = '', integer = '', fraction = '', suffix = ''] = match\n const grouping = integer.includes('.')\n const n = Number(`${integer.replace(/\\./g, '')}${fraction ? `.${fraction}` : ''}`)\n if (!Number.isFinite(n)) return null\n return {\n prefix: `${prefix}${sign}`,\n suffix,\n value: n,\n decimals: fraction.length,\n grouping,\n decimalSeparator: ',',\n }\n}\n\n/** Escreve `n` com o mesmo formato do valor original. */\nexport function formatLike(parsed: ParsedNumber, n: number): string {\n const [int = '0', frac = ''] = Math.abs(n).toFixed(parsed.decimals).split('.')\n const grouped = parsed.grouping ? int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.') : int\n const number = frac ? `${grouped}${parsed.decimalSeparator}${frac}` : grouped\n return `${parsed.prefix}${number}${parsed.suffix}`\n}\n","import { ChevronDown } from 'lucide-react'\nimport { Accordion as A } from 'radix-ui'\nimport { useState, type ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface AccordionItem {\n value: string\n title: ReactNode\n content: ReactNode\n disabled?: boolean\n}\n\nexport interface AccordionProps {\n items: AccordionItem[]\n /** Permite abrir vários ao mesmo tempo. */\n multiple?: boolean\n defaultValue?: string[]\n className?: string\n}\n\n/** Accordion único, com animação de altura e área de toque de 44px no mobile. */\nexport function Accordion({ items, multiple, defaultValue, className }: AccordionProps) {\n const lib = useMotionLib()\n const presets = useMotionPresets()\n // Só em `on`: o valor aberto é espelhado aqui, para o conteúdo continuar montado durante a\n // saída animada. Sempre uma lista; no modo único tem no máximo um item.\n const [open, setOpen] = useState<string[]>(\n multiple ? (defaultValue ?? []) : defaultValue?.[0] ? [defaultValue[0]] : [],\n )\n\n if (lib) {\n const rootProps = multiple\n ? ({ type: 'multiple', value: open, onValueChange: setOpen } as const)\n : ({\n type: 'single',\n collapsible: true,\n value: open[0] ?? '',\n onValueChange: (v: string) => setOpen(v ? [v] : []),\n } as const)\n return (\n <A.Root {...rootProps} data-rendra=\"ACRN-001\" className={cn('flex flex-col', className)}>\n {items.map((it) => {\n const isOpen = open.includes(it.value)\n return (\n <A.Item\n key={it.value}\n value={it.value}\n disabled={it.disabled}\n className=\"border-b last:border-b-0\"\n >\n <A.Header>\n <A.Trigger className=\"group flex min-h-touch w-full cursor-pointer items-center justify-between gap-4 py-4 text-left text-sm font-medium transition-colors hover:text-primary-text disabled:cursor-not-allowed disabled:opacity-50 md:min-h-0\">\n {it.title}\n <lib.m.span\n aria-hidden\n className=\"flex shrink-0\"\n animate={{ rotate: isOpen ? 180 : 0 }}\n transition={presets.fade.transition}\n >\n <ChevronDown className=\"size-icon-sm text-muted-foreground\" />\n </lib.m.span>\n </A.Trigger>\n </A.Header>\n <lib.AnimatePresence initial={false}>\n {isOpen && (\n <A.Content forceMount asChild>\n <lib.m.div\n className=\"overflow-hidden text-sm wrap-break-word text-muted-foreground\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={presets.fade.transition}\n >\n <div className=\"pb-4\">{it.content}</div>\n </lib.m.div>\n </A.Content>\n )}\n </lib.AnimatePresence>\n </A.Item>\n )\n })}\n </A.Root>\n )\n }\n\n const content = items.map((it) => (\n <A.Item\n key={it.value}\n value={it.value}\n disabled={it.disabled}\n className=\"border-b last:border-b-0\"\n >\n <A.Header>\n <A.Trigger className=\"group flex min-h-touch w-full cursor-pointer items-center justify-between gap-4 py-4 text-left text-sm font-medium transition-colors hover:text-primary-text disabled:cursor-not-allowed disabled:opacity-50 md:min-h-0\">\n {it.title}\n <ChevronDown\n aria-hidden\n className=\"size-icon-sm shrink-0 text-muted-foreground transition-transform duration-(--rendra-duration-base) ease-move group-data-[state=open]:rotate-180\"\n />\n </A.Trigger>\n </A.Header>\n <A.Content className=\"overflow-hidden text-sm wrap-break-word text-muted-foreground data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\">\n <div className=\"pb-4\">{it.content}</div>\n </A.Content>\n </A.Item>\n ))\n return multiple ? (\n <A.Root\n type=\"multiple\"\n defaultValue={defaultValue}\n data-rendra=\"ACRN-001\"\n className={cn('flex flex-col', className)}\n >\n {content}\n </A.Root>\n ) : (\n <A.Root\n type=\"single\"\n collapsible\n defaultValue={defaultValue?.[0]}\n data-rendra=\"ACRN-001\"\n className={cn('flex flex-col', className)}\n >\n {content}\n </A.Root>\n )\n}\n","/** Iniciais de um nome: primeira letra do primeiro e do último nome, em maiúsculas. */\nexport function initials(name: string) {\n const parts = name.trim().split(/\\s+/)\n const first = parts[0]?.charAt(0) ?? ''\n const last = parts.length > 1 ? (parts[parts.length - 1]?.charAt(0) ?? '') : ''\n return (first + last).toUpperCase()\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { Avatar as A } from 'radix-ui'\nimport { cn } from '@/lib/cn'\nimport { initials } from '@/lib/initials'\n\nconst avatarVariants = cva(\n 'relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-avatar bg-primary-soft font-medium text-primary-soft-foreground select-none',\n {\n variants: {\n size: {\n sm: 'size-6 text-xs',\n md: 'size-8 text-xs',\n lg: 'size-12 text-base',\n },\n },\n defaultVariants: { size: 'md' },\n },\n)\n\nexport interface AvatarProps extends VariantProps<typeof avatarVariants> {\n name: string\n src?: string\n className?: string\n}\n\nexport function Avatar({ name, src, size, className }: AvatarProps) {\n return (\n <A.Root data-rendra=\"AVT-001\" className={cn(avatarVariants({ size }), className)}>\n {src && <A.Image src={src} alt={name} className=\"size-full object-cover\" />}\n <A.Fallback delayMs={src ? 400 : 0} aria-label={name}>\n {initials(name)}\n </A.Fallback>\n </A.Root>\n )\n}\n\nexport interface AvatarGroupProps {\n people: { name: string; src?: string }[]\n /** Máximo visível antes de \"+N\". */\n max?: number\n size?: AvatarProps['size']\n className?: string\n}\n\n/** Avatares sobrepostos, com contador do excedente. */\nexport function AvatarGroup({ people, max = 4, size = 'md', className }: AvatarGroupProps) {\n const visible = people.slice(0, max)\n const rest = people.length - visible.length\n return (\n <div\n className={cn('flex items-center -space-x-2', className)}\n aria-label={people.map((p) => p.name).join(', ')}\n role=\"group\"\n data-rendra=\"AVT-002\"\n >\n {visible.map((p) => (\n <Avatar key={p.name} name={p.name} src={p.src} size={size} className=\"ring-2 ring-card\" />\n ))}\n {rest > 0 && (\n <span\n className={cn(\n avatarVariants({ size }),\n 'bg-muted text-muted-foreground tabular-nums ring-2 ring-card',\n )}\n >\n +{rest}\n </span>\n )}\n </div>\n )\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport type { HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\n\nconst badgeVariants = cva(\n 'inline-flex max-w-full shrink-0 items-center gap-1 rounded-item border px-2 py-1 text-xs leading-none font-medium whitespace-nowrap [&_svg]:size-3',\n {\n variants: {\n tone: {\n neutral: 'border-transparent bg-muted text-foreground',\n primary: 'border-transparent bg-primary-soft text-primary-soft-foreground',\n success: 'border-transparent bg-success-soft text-success-soft-foreground',\n warning: 'border-transparent bg-warning-soft text-warning-soft-foreground',\n error: 'border-transparent bg-destructive-soft text-destructive-soft-foreground',\n info: 'border-transparent bg-info-soft text-info-soft-foreground',\n outline: 'border-border bg-card text-foreground',\n },\n solid: { true: '', false: '' },\n },\n compoundVariants: [\n { tone: 'primary', solid: true, className: 'bg-primary text-primary-foreground' },\n { tone: 'success', solid: true, className: 'bg-success text-success-foreground' },\n { tone: 'warning', solid: true, className: 'bg-warning text-warning-foreground' },\n { tone: 'error', solid: true, className: 'bg-destructive text-destructive-foreground' },\n { tone: 'info', solid: true, className: 'bg-info text-info-foreground' },\n ],\n defaultVariants: { tone: 'neutral', solid: false },\n },\n)\n\nexport interface BadgeProps\n extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {\n /** Ícone antes do texto (fica fora do corte com reticências). */\n icon?: ReactNode\n /** Bolinha de status à esquerda. */\n dot?: boolean\n}\n\n/** Badge único: tom semântico, suave ou sólido, com bolinha opcional. */\nexport function Badge({ tone, solid, dot, icon, className, children, ...props }: BadgeProps) {\n return (\n <span\n data-rendra=\"BDG-001\"\n className={cn(badgeVariants({ tone, solid }), className)}\n {...props}\n >\n {dot && <span aria-hidden className=\"size-2 shrink-0 rounded-full bg-current\" />}\n {icon && (\n <span aria-hidden className=\"flex shrink-0\">\n {icon}\n </span>\n )}\n <span className=\"truncate\">{children}</span>\n </span>\n )\n}\n","import { cva } from 'class-variance-authority'\nimport { useBrand } from '@/brand/use-brand'\nimport { cn } from '@/lib/cn'\n\n/*\n * Logotipo da marca, montado com o símbolo do modelo e as cores da paleta ativa.\n * Assim o logo acompanha o tema: forma e símbolo vêm do modelo; cores, da paleta.\n * Com logoMode: 'image' no brand.config, usa os SVGs oficiais sem recolorir.\n *\n * on=\"sidebar\" sobre a sidebar colorida\n * on=\"surface\" sobre fundo claro ou escuro comum (header, telas de login no mobile)\n * on=\"brand\" sobre o degradê forte (painel do login)\n */\n\nconst tile = cva('flex shrink-0 items-center justify-center rounded-control', {\n variants: {\n on: {\n sidebar: 'bg-sidebar-indicator text-sidebar',\n surface: 'bg-primary text-primary-foreground',\n brand: 'bg-gradient-brand-foreground text-sidebar',\n },\n size: { sm: 'size-6 p-1', md: 'size-8 p-1' },\n },\n defaultVariants: { on: 'surface', size: 'md' },\n})\n\nconst word = {\n sidebar: ['text-sidebar-foreground', 'text-sidebar-muted-foreground'],\n surface: ['text-foreground', 'text-muted-foreground'],\n brand: ['text-gradient-brand-foreground', 'text-gradient-brand-foreground opacity-80'],\n} as const\n\nexport interface BrandLogoProps {\n on?: 'sidebar' | 'surface' | 'brand'\n /** Só o selo com o símbolo (sidebar recolhida, favicon). */\n symbolOnly?: boolean\n size?: 'sm' | 'md'\n className?: string\n}\n\nexport function BrandLogo({ on = 'surface', symbolOnly, size = 'md', className }: BrandLogoProps) {\n const { brand, resolvedMode, sidebarLogoVariant } = useBrand()\n\n // Arte oficial: usa os SVGs como estão.\n if (brand.logoMode === 'image' && !symbolOnly) {\n const variant =\n on === 'sidebar'\n ? sidebarLogoVariant\n : on === 'brand' || resolvedMode === 'dark'\n ? 'dark'\n : 'light'\n const Logo = brand.logo[variant]\n return (\n // Wrapper sem layout próprio (display: contents): só para carregar o data-rendra,\n // já que o SVG da arte oficial não repassa atributos que não conhece.\n <span className=\"contents\" data-rendra=\"LOGO-001\">\n <Logo className={cn('h-8 w-auto', className)} role=\"img\" aria-label={brand.productName} />\n </span>\n )\n }\n\n const Symbol = brand.symbol\n const [first, ...rest] = brand.productName.split(' ')\n const [strong, soft] = word[on]\n return (\n <span data-rendra=\"LOGO-001\" className={cn('flex min-w-0 items-center gap-3', className)}>\n <span aria-hidden className={tile({ on, size })}>\n <Symbol className=\"size-full\" />\n </span>\n {!symbolOnly && (\n <span className=\"truncate text-lg leading-none tracking-tight\">\n <span className={cn('font-semibold', strong)}>{first}</span>\n {/* O espaço fica fora dos spans: o axe apara o espaço da ponta de cada um e juntaria\n \"RendraSafira\", que o nome acessível do link não contém (WCAG 2.5.3). */}\n {rest.length > 0 && ' '}\n {rest.length > 0 && <span className={cn('font-normal', soft)}>{rest.join(' ')}</span>}\n </span>\n )}\n {symbolOnly && <span className=\"sr-only\">{brand.productName}</span>}\n </span>\n )\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { useRendraLink } from '@/components/rendra-provider'\nimport { cn } from '@/lib/cn'\n\nexport interface BreadcrumbItem {\n label: string\n to?: string\n}\n\ninterface BreadcrumbProps {\n items: BreadcrumbItem[]\n /**\n * responsive: trilha no desktop e botão voltar no mobile (padrão, dentro das páginas).\n * trail: sempre a trilha, em texto pequeno (usado no header, abaixo do título).\n */\n variant?: 'responsive' | 'trail'\n className?: string\n}\n\n/**\n * Breadcrumb único. No desktop mostra a trilha completa. No mobile vira botão\n * voltar para o nível anterior com o nome da tela atual (mesmo componente, mesma API).\n */\nexport function Breadcrumb({ items, variant = 'responsive', className }: BreadcrumbProps) {\n const Link = useRendraLink()\n if (items.length === 0) return null\n const code = resolveCatalogCode('Breadcrumb', { variant })\n if (variant === 'trail') {\n return (\n <nav data-rendra={code} aria-label=\"Trilha de navegação\" className={cn('min-w-0', className)}>\n <ol className=\"flex min-w-0 items-center gap-1 overflow-hidden text-xs text-muted-foreground\">\n {items.map((item, i) => {\n const last = i === items.length - 1\n return (\n <li\n key={`${item.label}-${i}`}\n className={cn(\n 'flex min-w-0 items-center gap-1',\n !last && 'shrink-0 max-sm:max-w-24',\n )}\n >\n {item.to && !last ? (\n <>\n {/* Links só a partir de md; no celular a trilha é informativa (toque de 44px) */}\n <Link\n to={item.to}\n className=\"hidden truncate rounded-item transition-colors hover:text-primary-text md:inline\"\n >\n {item.label}\n </Link>\n <span className=\"truncate md:hidden\">{item.label}</span>\n </>\n ) : (\n <span aria-current={last ? 'page' : undefined} className=\"truncate\">\n {item.label}\n </span>\n )}\n {!last && <ChevronRight className=\"size-3 shrink-0\" aria-hidden />}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n }\n const current = items[items.length - 1]\n const parent = [...items.slice(0, -1)].reverse().find((i) => i.to)\n\n return (\n <nav data-rendra={code} aria-label=\"Trilha de navegação\" className={cn('min-w-0', className)}>\n {/* Mobile: voltar + tela atual */}\n <div className=\"flex min-w-0 items-center gap-1 md:hidden\">\n {parent?.to ? (\n <Link\n to={parent.to}\n aria-label={`Voltar para ${parent.label}`}\n className=\"-ml-2 flex min-h-touch min-w-0 items-center gap-1 rounded-item pr-2 text-base font-medium text-foreground active:bg-accent\"\n >\n <ChevronLeft className=\"size-icon-md shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"truncate\">{current?.label}</span>\n </Link>\n ) : (\n <span className=\"truncate text-base font-medium\">{current?.label}</span>\n )}\n </div>\n\n {/* Desktop: trilha completa */}\n <ol className=\"hidden min-w-0 items-center gap-1 text-sm md:flex\">\n {items.map((item, i) => {\n const last = i === items.length - 1\n return (\n <li key={`${item.label}-${i}`} className=\"flex min-w-0 items-center gap-1\">\n {last || !item.to ? (\n <span\n aria-current={last ? 'page' : undefined}\n className={cn(\n 'truncate',\n last ? 'font-medium text-foreground' : 'text-muted-foreground',\n )}\n >\n {item.label}\n </span>\n ) : (\n <Link\n to={item.to}\n className=\"truncate rounded-item text-muted-foreground transition-colors hover:text-foreground\"\n >\n {item.label}\n </Link>\n )}\n {!last && (\n <ChevronRight className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import type { ReactNode } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { cn } from '@/lib/cn'\n\ninterface ButtonGroupProps {\n /** Botões encostados, com borda compartilhada. */\n children?: ReactNode\n /**\n * Modo seleção (segmentado): passe options, value e onChange.\n * Se as opções não couberem, o grupo quebra linha em vez de rolar.\n */\n options?: { value: string; label: ReactNode; icon?: ReactNode; disabled?: boolean }[]\n value?: string\n onChange?: (value: string) => void\n size?: 'sm' | 'md'\n fullWidth?: boolean\n /**\n * Só no modo agrupado (`children`); o segmentado (`options`) ignora. `horizontal` (padrão):\n * botões lado a lado. `vertical`: empilhados, na largura do grupo, com as bordas unidas.\n * `responsive`: vertical abaixo de `md` e horizontal a partir dele (para três botões largos\n * que não cabem em 360 px).\n */\n orientation?: 'horizontal' | 'vertical' | 'responsive'\n 'aria-label'?: string\n className?: string\n}\n\n/**\n * ButtonGroup único: agrupa botões de ação (children) ou funciona como controle\n * segmentado de escolha única (options + value).\n */\nexport function ButtonGroup({\n children,\n options,\n value,\n onChange,\n size = 'md',\n fullWidth,\n orientation = 'horizontal',\n className,\n ...aria\n}: ButtonGroupProps) {\n if (options) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={aria['aria-label']}\n data-rendra={resolveCatalogCode('ButtonGroup', { orientation: 'horizontal' })}\n className={cn(\n 'inline-flex max-w-full flex-wrap gap-1 rounded-control border bg-muted p-1',\n fullWidth && 'flex w-full',\n className,\n )}\n >\n {options.map((o) => {\n const active = o.value === value\n return (\n <button\n key={o.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n disabled={o.disabled}\n onClick={() => onChange?.(o.value)}\n className={cn(\n 'inline-flex min-h-touch flex-1 cursor-pointer items-center justify-center gap-2 rounded-item px-3 text-sm font-medium whitespace-nowrap transition-colors md:min-h-0 [&_svg]:size-icon-sm',\n size === 'sm' ? 'md:h-8' : 'md:h-8',\n active\n ? 'bg-card text-foreground shadow-sm'\n : 'text-muted-foreground hover:bg-card/60 hover:text-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n {o.icon}\n {o.label}\n </button>\n )\n })}\n </div>\n )\n }\n const vertical = orientation === 'vertical'\n const responsive = orientation === 'responsive'\n return (\n <div\n role=\"group\"\n aria-label={aria['aria-label']}\n data-rendra={resolveCatalogCode('ButtonGroup', { orientation })}\n className={cn(\n 'inline-flex max-w-full',\n '[&>*]:rounded-none [&>*]:shadow-none [&>*:focus-visible]:z-10',\n orientation === 'horizontal' &&\n '[&>*:first-child]:rounded-l-control [&>*:last-child]:rounded-r-control [&>*:not(:first-child)]:-ml-px',\n vertical &&\n 'flex-col [&>*]:w-full [&>*:first-child]:rounded-t-control [&>*:last-child]:rounded-b-control [&>*:not(:first-child)]:-mt-px',\n // Vertical abaixo de md; de md em diante volta a linha e zera o que a vertical pôs\n // (o canto superior direito do primeiro, o inferior esquerdo do último e o -mt-px).\n responsive &&\n 'flex-col md:flex-row [&>*]:w-full md:[&>*]:w-auto [&>*:first-child]:rounded-t-control md:[&>*:first-child]:rounded-l-control md:[&>*:first-child]:rounded-tr-none [&>*:last-child]:rounded-b-control md:[&>*:last-child]:rounded-r-control md:[&>*:last-child]:rounded-bl-none [&>*:not(:first-child)]:-mt-px md:[&>*:not(:first-child)]:mt-0 md:[&>*:not(:first-child)]:-ml-px',\n fullWidth && (vertical ? 'flex w-full' : 'flex w-full [&>*]:flex-1'),\n className,\n )}\n >\n {children}\n </div>\n )\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { InfoHint } from '@/components/ui/info-hint'\nimport { cn } from '@/lib/cn'\n\n/**\n * Card: agrupa conteúdo de página. Borda de 1px, sem sombra pesada.\n * Nunca aninhe Card dentro de Card: para hierarquia interna use Separator ou título de seção.\n * Nunca coloque rolagem dentro de Card.\n */\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Uso interno: quando outro componente catalogado (Calendar, FormSection, StatCard,\n * Table) usa o Card como o próprio elemento raiz, ele passa o seu código aqui para que\n * o data-rendra mostre a variante certa, não CARD-001. Sem essa prop, o Card se\n * identifica como CARD-001, o próprio código dele no catálogo.\n */\n 'data-rendra'?: string\n}\n\nexport function Card({ className, 'data-rendra': dataRendra, ...props }: CardProps) {\n return (\n <div\n data-slot=\"card\"\n data-rendra={dataRendra ?? 'CARD-001'}\n className={cn(\n 'flex min-w-0 flex-col rounded-surface border bg-card text-card-foreground',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Ações do card, no canto do cabeçalho (ex.: Ligar, Restaurar padrão). É o lugar das ações\n * de um card: nunca um botão solto no meio do conteúdo.\n */\n actions?: ReactNode\n}\n\nexport function CardHeader({ className, actions, children, ...props }: CardHeaderProps) {\n if (!actions)\n return (\n <div\n data-slot=\"card-header\"\n className={cn('flex flex-col gap-1 p-4 md:p-6', className)}\n {...props}\n >\n {children}\n </div>\n )\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n 'flex flex-wrap items-start justify-between gap-x-4 gap-y-3 p-4 md:p-6',\n className,\n )}\n {...props}\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">{children}</div>\n <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>\n </div>\n )\n}\n\nexport interface CardTitleProps extends HTMLAttributes<HTMLHeadingElement> {\n /** Texto orientativo da seção: ícone de informação ao lado do título, que abre um modal. */\n help?: ReactNode\n}\n\nexport function CardTitle({ className, children, help, ...props }: CardTitleProps) {\n const heading = (\n <h3 data-slot=\"card-title\" className={cn('text-lg font-semibold', className)} {...props}>\n {children}\n </h3>\n )\n if (!help) return heading\n return (\n <div className=\"flex min-w-0 items-center gap-1\">\n {heading}\n <InfoHint title={typeof children === 'string' ? children : 'Sobre esta seção'}>\n {help}\n </InfoHint>\n </div>\n )\n}\n\nexport function CardDescription({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p\n data-slot=\"card-description\"\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\nexport function CardContent({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn('p-4 md:p-6 [[data-slot=card-header]+&]:pt-0', className)}\n {...props}\n />\n )\n}\n\nexport function CardFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn('flex items-center gap-3 border-t px-4 py-3 md:px-6', className)}\n {...props}\n />\n )\n}\n","import {\n addDays,\n addMonths,\n addWeeks,\n differenceInMinutes,\n endOfMonth,\n endOfWeek,\n format,\n isSameDay,\n isSameMonth,\n isToday,\n startOfDay,\n startOfMonth,\n startOfWeek,\n} from 'date-fns'\nimport { ptBR } from 'date-fns/locale'\nimport { ChevronLeft, ChevronRight, Clock, MapPin } from 'lucide-react'\nimport { useMemo, useState, type CSSProperties } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { ButtonGroup } from '@/components/ui/button-group'\nimport { Card } from '@/components/ui/card'\nimport { EmptyState } from '@/components/ui/empty-state'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\n\n/*\n * Calendário único do sistema: mês, semana, dia e agenda (lista) são a prop view,\n * nunca componentes separados. Os eventos vêm por props; criar e editar ficam com a tela\n * (onDateClick e onEventClick abrem um Drawer, por exemplo).\n *\n * Mobile (< 768px), sem rolagem lateral:\n * month vira um mês compacto com pontos nos dias e a lista do dia tocado embaixo;\n * week vira o dia, com uma faixa dos 7 dias para trocar;\n * day e agenda seguem iguais, na largura da tela.\n */\n\nexport type CalendarView = 'month' | 'week' | 'day' | 'agenda'\nexport type CalendarTone = 'primary' | 'success' | 'warning' | 'error' | 'info' | 'neutral'\n\nexport interface CalendarEvent {\n id: string\n title: string\n start: Date\n /** Fim. Sem valor, o evento dura 1 hora. */\n end?: Date\n /** Dia inteiro: aparece no topo do dia, sem horário. */\n allDay?: boolean\n tone?: CalendarTone\n description?: string\n location?: string\n}\n\nexport interface CalendarProps {\n events: CalendarEvent[]\n view?: CalendarView\n defaultView?: CalendarView\n onViewChange?: (view: CalendarView) => void\n /** Visões oferecidas no seletor. Padrão: todas. */\n views?: CalendarView[]\n /** Data em foco (mês, semana ou dia mostrado). */\n date?: Date\n defaultDate?: Date\n onDateChange?: (date: Date) => void\n onEventClick?: (event: CalendarEvent) => void\n /** Clique em um dia ou horário vazio (ex.: abrir o cadastro de evento já com a data). */\n onDateClick?: (date: Date) => void\n /** Faixa de horas da semana e do dia. Padrão: 7h às 21h. */\n hours?: [number, number]\n 'aria-label'?: string\n className?: string\n}\n\nconst viewLabels: Record<CalendarView, string> = {\n month: 'Mês',\n week: 'Semana',\n day: 'Dia',\n agenda: 'Agenda',\n}\n\nconst toneChip: Record<CalendarTone, string> = {\n primary: 'bg-primary-soft text-primary-soft-foreground',\n success: 'bg-success-soft text-success-soft-foreground',\n warning: 'bg-warning-soft text-warning-soft-foreground',\n error: 'bg-destructive-soft text-destructive-soft-foreground',\n info: 'bg-info-soft text-info-soft-foreground',\n neutral: 'bg-muted text-foreground',\n}\nconst toneDot: Record<CalendarTone, string> = {\n primary: 'bg-primary',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-destructive',\n info: 'bg-info',\n neutral: 'bg-muted-foreground',\n}\n\nconst WEEK = { weekStartsOn: 0 as const, locale: ptBR }\nconst endOf = (e: CalendarEvent) => e.end ?? new Date(e.start.getTime() + 60 * 60 * 1000)\nconst hhmm = (d: Date) => format(d, 'HH:mm')\nconst timeRange = (e: CalendarEvent) =>\n e.allDay ? 'Dia inteiro' : `${hhmm(e.start)} às ${hhmm(endOf(e))}`\nconst capital = (s: string) => s.charAt(0).toUpperCase() + s.slice(1)\n\nfunction sortByStart(list: CalendarEvent[]) {\n return [...list].sort(\n (a, b) => Number(Boolean(b.allDay)) - Number(Boolean(a.allDay)) || +a.start - +b.start,\n )\n}\n\n/** Botão de evento em formato de chip (mês, lista do dia, topo \"dia inteiro\"). */\nfunction EventChip({\n event,\n onClick,\n compact,\n}: {\n event: CalendarEvent\n onClick?: (e: CalendarEvent) => void\n compact?: boolean\n}) {\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n className={cn(\n 'flex w-full min-w-0 cursor-pointer items-center gap-1 rounded-item px-2 text-left text-xs font-medium transition-[filter] outline-none hover:brightness-95 focus-visible:ring-2 focus-visible:ring-ring',\n compact ? 'py-1' : 'min-h-touch py-2 md:min-h-0 md:py-1',\n toneChip[event.tone ?? 'primary'],\n )}\n >\n {!event.allDay && (\n <span className=\"shrink-0 font-normal tabular-nums\">{hhmm(event.start)}</span>\n )}\n <span className=\"truncate\">{event.title}</span>\n </button>\n )\n}\n\n/** Lista de eventos de um dia (mobile do mês e visão agenda). */\nfunction DayList({\n events,\n onEventClick,\n}: {\n events: CalendarEvent[]\n onEventClick?: (e: CalendarEvent) => void\n}) {\n return (\n <ul className=\"flex flex-col gap-2\">\n {events.map((e) => (\n <li key={e.id}>\n <button\n type=\"button\"\n onClick={() => onEventClick?.(e)}\n className=\"flex w-full cursor-pointer items-stretch gap-3 rounded-block border bg-card p-3 text-left transition-colors outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span\n aria-hidden\n className={cn('w-1 shrink-0 rounded-full', toneDot[e.tone ?? 'primary'])}\n />\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"truncate text-sm font-medium\">{e.title}</span>\n <span className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"size-3\" aria-hidden />\n {timeRange(e)}\n </span>\n {e.location && (\n <span className=\"inline-flex min-w-0 items-center gap-1\">\n <MapPin className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"truncate\">{e.location}</span>\n </span>\n )}\n </span>\n </span>\n </button>\n </li>\n ))}\n </ul>\n )\n}\n\nexport function Calendar({\n events,\n view: viewProp,\n defaultView = 'month',\n onViewChange,\n views = ['month', 'week', 'day', 'agenda'],\n date: dateProp,\n defaultDate,\n onDateChange,\n onEventClick,\n onDateClick,\n hours = [7, 21],\n className,\n ...aria\n}: CalendarProps) {\n const { isMobile } = useBreakpoint()\n const [innerView, setInnerView] = useState<CalendarView>(defaultView)\n const [innerDate, setInnerDate] = useState<Date>(() => startOfDay(defaultDate ?? new Date()))\n const view = viewProp ?? innerView\n const date = dateProp ?? innerDate\n // No celular a semana vira o dia (com a faixa dos 7 dias para trocar).\n const shown: CalendarView = isMobile && view === 'week' ? 'day' : view\n const mobileViews = views.filter((v) => v !== 'week')\n\n const setView = (v: CalendarView) => {\n setInnerView(v)\n onViewChange?.(v)\n }\n const setDate = (d: Date) => {\n setInnerDate(startOfDay(d))\n onDateChange?.(startOfDay(d))\n }\n\n const byDay = useMemo(() => {\n const map = new Map<string, CalendarEvent[]>()\n for (const e of sortByStart(events)) {\n const key = format(e.start, 'yyyy-MM-dd')\n map.set(key, [...(map.get(key) ?? []), e])\n }\n return map\n }, [events])\n const eventsOn = (d: Date) => byDay.get(format(d, 'yyyy-MM-dd')) ?? []\n\n const step = (dir: 1 | -1) => {\n if (shown === 'month' || shown === 'agenda') setDate(addMonths(date, dir))\n else if (shown === 'week') setDate(addWeeks(date, dir))\n else setDate(addDays(date, dir))\n }\n\n const title =\n shown === 'day'\n ? capital(format(date, \"EEEE, d 'de' MMMM\", { locale: ptBR }))\n : shown === 'week'\n ? `${format(startOfWeek(date, WEEK), 'd MMM', { locale: ptBR })} a ${format(endOfWeek(date, WEEK), \"d MMM 'de' yyyy\", { locale: ptBR })}`\n : capital(format(date, \"MMMM 'de' yyyy\", { locale: ptBR }))\n\n /* ---------------------------------------------------------------- barra */\n const toolbar = (\n <div className=\"flex flex-col gap-3 border-b p-4 md:flex-row md:items-center\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <h2\n className=\"order-first w-full min-w-0 truncate text-base font-semibold md:order-last md:w-auto\"\n aria-live=\"polite\"\n >\n {title}\n </h2>\n <Button variant=\"outline\" onClick={() => setDate(new Date())}>\n Hoje\n </Button>\n <Button variant=\"ghost\" iconOnly aria-label=\"Anterior\" onClick={() => step(-1)}>\n <ChevronLeft />\n </Button>\n <Button variant=\"ghost\" iconOnly aria-label=\"Próximo\" onClick={() => step(1)}>\n <ChevronRight />\n </Button>\n </div>\n {(isMobile ? mobileViews : views).length > 1 && (\n <ButtonGroup\n fullWidth={isMobile}\n aria-label=\"Visão do calendário\"\n className=\"md:ml-auto\"\n value={shown}\n onChange={(v) => setView(v as CalendarView)}\n options={(isMobile ? mobileViews : views).map((v) => ({\n value: v,\n label: viewLabels[v],\n }))}\n />\n )}\n </div>\n )\n\n /* ---------------------------------------------------------------- mês */\n const monthDays = () => {\n const start = startOfWeek(startOfMonth(date), WEEK)\n const end = endOfWeek(endOfMonth(date), WEEK)\n const days: Date[] = []\n for (let d = start; d <= end; d = addDays(d, 1)) days.push(d)\n return days\n }\n const weekdayNames = Array.from({ length: 7 }, (_, i) =>\n format(addDays(startOfWeek(date, WEEK), i), isMobile ? 'EEEEE' : 'EEE', { locale: ptBR }),\n )\n\n const month = () => {\n const days = monthDays()\n if (isMobile) {\n const list = eventsOn(date)\n return (\n <div className=\"flex flex-col\">\n <div className=\"grid grid-cols-week px-2 pt-2 text-center text-xs font-medium text-muted-foreground uppercase\">\n {weekdayNames.map((n, i) => (\n <span key={i} className=\"py-2\">\n {n}\n </span>\n ))}\n </div>\n <div className=\"grid grid-cols-week px-2 pb-2\">\n {days.map((d) => {\n const evs = eventsOn(d)\n const selected = isSameDay(d, date)\n return (\n <button\n key={d.toISOString()}\n type=\"button\"\n onClick={() => setDate(d)}\n aria-pressed={selected}\n aria-label={`${format(d, \"d 'de' MMMM\", { locale: ptBR })}${evs.length ? `, ${evs.length} ${evs.length === 1 ? 'evento' : 'eventos'}` : ''}`}\n className={cn(\n 'flex min-h-touch cursor-pointer flex-col items-center justify-center gap-1 rounded-item text-sm tabular-nums outline-none focus-visible:ring-2 focus-visible:ring-ring',\n !isSameMonth(d, date) && 'text-muted-foreground',\n selected && 'bg-primary font-semibold text-primary-foreground',\n !selected && isToday(d) && 'font-semibold text-primary-text',\n )}\n >\n {format(d, 'd')}\n <span className=\"flex h-1 gap-1\" aria-hidden>\n {evs.slice(0, 3).map((e) => (\n <span\n key={e.id}\n className={cn(\n 'size-1 rounded-full',\n selected ? 'bg-primary-foreground' : toneDot[e.tone ?? 'primary'],\n )}\n />\n ))}\n </span>\n </button>\n )\n })}\n </div>\n <div className=\"flex flex-col gap-3 border-t p-4\">\n <p className=\"text-sm font-semibold\">\n {capital(format(date, \"EEEE, d 'de' MMMM\", { locale: ptBR }))}\n </p>\n {list.length ? (\n <DayList events={list} onEventClick={onEventClick} />\n ) : (\n <p className=\"text-sm text-muted-foreground\">Nenhum evento neste dia.</p>\n )}\n {onDateClick && (\n <Button variant=\"outline\" fullWidth onClick={() => onDateClick(date)}>\n Novo evento neste dia\n </Button>\n )}\n </div>\n </div>\n )\n }\n return (\n <div className=\"flex flex-col\">\n <div className=\"grid grid-cols-week border-b bg-muted/50 text-xs font-medium text-muted-foreground\">\n {weekdayNames.map((n, i) => (\n <span key={i} className=\"px-2 py-2 capitalize\">\n {n.replace('.', '')}\n </span>\n ))}\n </div>\n <div className=\"grid grid-cols-week\">\n {days.map((d) => {\n const evs = eventsOn(d)\n const extra = evs.length - 3\n return (\n <div\n key={d.toISOString()}\n className={cn(\n 'flex min-h-24 min-w-0 flex-col gap-1 border-r border-b p-1 nth-[7n]:border-r-0',\n !isSameMonth(d, date) && 'bg-muted/30',\n )}\n >\n <button\n type=\"button\"\n onClick={() => (onDateClick ? onDateClick(d) : (setDate(d), setView('day')))}\n aria-label={\n onDateClick\n ? `Novo evento em ${format(d, \"d 'de' MMMM\", { locale: ptBR })}`\n : `Ver ${format(d, \"d 'de' MMMM\", { locale: ptBR })}`\n }\n className={cn(\n 'flex size-8 cursor-pointer items-center justify-center self-start rounded-item text-sm tabular-nums transition-colors outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring',\n !isSameMonth(d, date) && 'text-muted-foreground',\n isToday(d) &&\n 'bg-primary font-semibold text-primary-foreground hover:bg-primary-hover hover:text-primary-hover-foreground',\n )}\n >\n {format(d, 'd')}\n </button>\n {evs.slice(0, 3).map((e) => (\n <EventChip key={e.id} event={e} onClick={onEventClick} compact />\n ))}\n {extra > 0 && (\n <button\n type=\"button\"\n onClick={() => {\n setDate(d)\n setView('day')\n }}\n className=\"cursor-pointer self-start rounded-item px-2 text-xs font-medium text-muted-foreground hover:text-foreground\"\n >\n +{extra} {extra === 1 ? 'evento' : 'eventos'}\n </button>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n }\n\n /* ---------------------------------------------------------------- semana e dia */\n const [h0, h1] = hours\n const hourList = Array.from({ length: h1 - h0 }, (_, i) => h0 + i)\n const now = new Date()\n\n const timeGrid = (days: Date[]) => (\n <div className=\"flex flex-col\">\n {/* Faixa dos 7 dias no celular: troca o dia mostrado. */}\n {isMobile && (\n <div className=\"grid grid-cols-week gap-1 border-b p-2\">\n {Array.from({ length: 7 }, (_, i) => addDays(startOfWeek(date, WEEK), i)).map((d) => {\n const selected = isSameDay(d, date)\n return (\n <button\n key={d.toISOString()}\n type=\"button\"\n onClick={() => setDate(d)}\n aria-pressed={selected}\n aria-label={format(d, \"EEEE, d 'de' MMMM\", { locale: ptBR })}\n className={cn(\n 'flex min-h-touch cursor-pointer flex-col items-center justify-center rounded-item text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected ? 'bg-primary text-primary-foreground' : 'text-muted-foreground',\n )}\n >\n <span className=\"uppercase\">{format(d, 'EEEEE', { locale: ptBR })}</span>\n <span className=\"text-sm font-semibold tabular-nums\">{format(d, 'd')}</span>\n </button>\n )\n })}\n </div>\n )}\n {/* Cabeçalho dos dias e eventos de dia inteiro. */}\n <div\n className=\"grid grid-cols-week-time border-b\"\n style={{ '--days': days.length } as CSSProperties}\n >\n <span className=\"border-r\" />\n {days.map((d) => {\n const allDay = eventsOn(d).filter((e) => e.allDay)\n return (\n <div\n key={d.toISOString()}\n className=\"flex min-w-0 flex-col gap-1 border-r p-2 last:border-r-0\"\n >\n {!isMobile && (\n <span\n className={cn(\n 'text-xs text-muted-foreground capitalize',\n isToday(d) && 'font-semibold text-primary-text',\n )}\n >\n {format(d, 'EEE d', { locale: ptBR }).replace('.', '')}\n </span>\n )}\n {allDay.map((e) => (\n <EventChip key={e.id} event={e} onClick={onEventClick} compact />\n ))}\n </div>\n )\n })}\n </div>\n <div className=\"grid grid-cols-week-time\" style={{ '--days': days.length } as CSSProperties}>\n <div className=\"border-r\">\n {hourList.map((h) => (\n <div\n key={h}\n className=\"h-12 pr-2 text-right text-xs text-muted-foreground tabular-nums\"\n >\n <span className=\"relative -top-2\">{String(h).padStart(2, '0')}:00</span>\n </div>\n ))}\n </div>\n {days.map((d) => {\n const timed = eventsOn(d).filter((e) => !e.allDay)\n const showNow = isToday(d) && now.getHours() >= h0 && now.getHours() < h1\n return (\n <div key={d.toISOString()} className=\"relative min-w-0 border-r last:border-r-0\">\n {hourList.map((h) => (\n <button\n key={h}\n type=\"button\"\n tabIndex={onDateClick ? 0 : -1}\n aria-label={`Novo evento em ${format(d, \"d 'de' MMMM\", { locale: ptBR })} às ${String(h).padStart(2, '0')}:00`}\n onClick={() =>\n onDateClick?.(new Date(d.getFullYear(), d.getMonth(), d.getDate(), h))\n }\n className={cn(\n 'block h-12 w-full border-b border-dashed outline-none focus-visible:bg-accent',\n onDateClick ? 'cursor-pointer hover:bg-accent/60' : 'cursor-default',\n )}\n />\n ))}\n {showNow && (\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-x-0 calendar-now z-10 h-0 border-t-2 border-destructive\"\n style={\n {\n '--from': (now.getHours() - h0 + now.getMinutes() / 60).toFixed(3),\n } as CSSProperties\n }\n />\n )}\n {timed.map((e) => {\n const from = Math.max(0, e.start.getHours() - h0 + e.start.getMinutes() / 60)\n const span = Math.max(0.5, differenceInMinutes(endOf(e), e.start) / 60)\n return (\n <button\n key={e.id}\n type=\"button\"\n onClick={() => onEventClick?.(e)}\n style={\n {\n '--from': from.toFixed(3),\n '--span': Math.min(span, h1 - h0 - from).toFixed(3),\n } as CSSProperties\n }\n className={cn(\n 'absolute inset-x-1 calendar-event z-20 flex cursor-pointer flex-col overflow-hidden rounded-item px-2 text-left text-xs outline-none hover:brightness-95 focus-visible:ring-2 focus-visible:ring-ring',\n span < 0.75 ? 'justify-center' : 'py-1',\n toneChip[e.tone ?? 'primary'],\n )}\n >\n {span < 0.75 ? (\n <span className=\"truncate font-medium\">\n <span className=\"font-normal tabular-nums\">{hhmm(e.start)}</span> {e.title}\n </span>\n ) : (\n <>\n <span className=\"truncate font-medium\">{e.title}</span>\n <span className=\"truncate font-normal tabular-nums\">{timeRange(e)}</span>\n </>\n )}\n </button>\n )\n })}\n </div>\n )\n })}\n </div>\n </div>\n )\n\n /* ---------------------------------------------------------------- agenda */\n const agenda = () => {\n const days: Date[] = []\n for (let d = startOfMonth(date); d <= endOfMonth(date); d = addDays(d, 1)) days.push(d)\n const withEvents = days.filter((d) => eventsOn(d).length)\n if (!withEvents.length)\n return (\n <EmptyState\n size=\"compact\"\n title=\"Nenhum evento neste mês\"\n description=\"Use as setas para ver outros meses.\"\n />\n )\n return (\n <ol className=\"flex flex-col divide-y\">\n {withEvents.map((d) => (\n <li key={d.toISOString()} className=\"flex flex-col gap-3 p-4 md:flex-row md:gap-6\">\n <div className=\"flex shrink-0 items-baseline gap-2 md:w-24 md:flex-col md:gap-0\">\n <span\n className={cn(\n 'text-2xl font-semibold tabular-nums',\n isToday(d) && 'text-primary-text',\n )}\n >\n {format(d, 'd')}\n </span>\n <span className=\"text-sm text-muted-foreground capitalize\">\n {format(d, 'EEEE', { locale: ptBR })}\n </span>\n </div>\n <div className=\"min-w-0 flex-1\">\n <DayList events={eventsOn(d)} onEventClick={onEventClick} />\n </div>\n </li>\n ))}\n </ol>\n )\n }\n\n const weekDays = Array.from({ length: 7 }, (_, i) => addDays(startOfWeek(date, WEEK), i))\n\n return (\n <Card\n data-rendra=\"CAL-001\"\n className={cn('overflow-hidden', className)}\n aria-label={aria['aria-label'] ?? 'Calendário'}\n role=\"region\"\n >\n {toolbar}\n {shown === 'month' && month()}\n {shown === 'week' && timeGrid(weekDays)}\n {shown === 'day' && timeGrid([date])}\n {shown === 'agenda' && agenda()}\n </Card>\n )\n}\n","import { Popover as P } from 'radix-ui'\nimport { createContext, useContext, useState, type ComponentProps } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionMode, useMotionPresets } from '@/lib/motion'\n\n/*\n * Em `on` o Popover precisa saber se está aberto para manter o conteúdo montado durante a\n * saída animada. O Root vira um wrapper com exatamente os mesmos tipos do Radix\n * (`ComponentProps<typeof P.Root>`) que espelha o estado (controlado ou não) num contexto.\n * Em `off` é o `P.Root` de sempre, sem estado nem contexto novos.\n */\nconst PopoverOpenContext = createContext<boolean | null>(null)\n\nfunction AnimatedRoot({ open, defaultOpen, onOpenChange, ...rest }: ComponentProps<typeof P.Root>) {\n const [inner, setInner] = useState(defaultOpen ?? false)\n const current = open ?? inner\n return (\n <PopoverOpenContext.Provider value={current}>\n <P.Root\n {...rest}\n open={current}\n onOpenChange={(next) => {\n setInner(next)\n onOpenChange?.(next)\n }}\n />\n </PopoverOpenContext.Provider>\n )\n}\n\nexport function Popover(props: ComponentProps<typeof P.Root>) {\n return useMotionMode() === 'on' ? <AnimatedRoot {...props} /> : <P.Root {...props} />\n}\nexport const PopoverTrigger = P.Trigger\nexport const PopoverClose = P.Close\nexport const PopoverAnchor = P.Anchor\n\ninterface PopoverContentProps extends ComponentProps<typeof P.Content> {\n /** Largura: sm (16rem) ou md (22rem). Sempre limitada à tela menos 32px. */\n width?: 'sm' | 'md'\n}\n\nexport function PopoverContent({\n className,\n align = 'center',\n sideOffset = 8,\n width = 'md',\n children,\n asChild,\n ...props\n}: PopoverContentProps) {\n const open = useContext(PopoverOpenContext)\n const lib = useMotionLib()\n const presets = useMotionPresets()\n // O popover nasce do gatilho, não do centro (W6): a origem vem do Radix.\n const base = cn(\n 'z-50 origin-(--radix-popover-content-transform-origin) rounded-surface border bg-popover text-popover-foreground shadow-md outline-none',\n width === 'sm' ? 'w-popover-sm' : 'w-popover',\n )\n\n if (lib && open !== null && !asChild) {\n return (\n <lib.AnimatePresence>\n {open && (\n <P.Portal forceMount key=\"popover\">\n <P.Content\n forceMount\n asChild\n align={align}\n sideOffset={sideOffset}\n collisionPadding={16}\n data-rendra=\"POP-001\"\n className={cn(base, className)}\n {...props}\n >\n <lib.m.div {...presets.open()}>{children}</lib.m.div>\n </P.Content>\n </P.Portal>\n )}\n </lib.AnimatePresence>\n )\n }\n\n return (\n <P.Portal>\n <P.Content\n align={align}\n sideOffset={sideOffset}\n collisionPadding={16}\n data-rendra=\"POP-001\"\n className={cn(\n base,\n // A saída é mais curta que a entrada (W5): o usuário já decidiu fechar.\n 'animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n className,\n )}\n asChild={asChild}\n {...props}\n >\n {children}\n </P.Content>\n </P.Portal>\n )\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAQAElEQVR4AexdB1wU19a/O4CgUkSUGkCaLIggVSJBlKqoscRuNLHEXmOLChrjy4vxGY2K/fPDz857VpBirKCIghURRAERkF6kSt/vHvIWEVjYMrs7s8z+OM6dO/ee+z//89+Z2bkzI4Fk8MPhcNRLyj+6vUzJW33v8buTQWGJT0+FJKXtDHyQt+nPqLI1O+9Urdx+u27RtpscMChDHWyDNtAW+kBf8FFQUu4GPmWQKiQTAsgrqvCOepRx4NjF569wIqs95gQVj5x/+c7czbd3rvkj5tvdp+IHBZx9bnT+errmzdhslXtPcrs/iM+Tf5pUgMCgDHWwDdpAW+gDfcHHmMVX74BP8A1jwFjZeR+8ZUEQtBMA/iYqfaio9rod9+7QnhOP0sYuvdQ4dmnItXW77i86ej7JHCdSsaoGp4bFwv+Q9Id9gU/wDWPAWBNWhl+DsQEDCOJDxUcPwEbSiBJzQwsBYGKJotKKEWFRaSHLf71ZOmL+pb827I5ZcDYixSivuIaFcIIkxhh3IDwmjA0YQBAj5l++AdjCItOCMVYfwMxtSuUlZQUABGJzu/voXdCGXVGVoxdfDf/lUOzouMTCbgixEPU+LATYfjkcOwZjjQDMgB3H4IqNsjxTElhJWeW4U1dfJvsuvHhn7a6YyXce5yhxONRLOS9EgBUwA3YcQ9Tpqy9fFZdVjuHVXpr1lBEA/pbI5eaXzdl76lHumCUhl/afTTAtKa+TJjekjA0xBJxNMPt6SUjwvpOPcnLyy76HWElxToITSgigoLhy9L4zT3ImrAo9diYsRau+gYTIKOYCYjodnqL9zarQQIgVYpYmRO7YUhVATU0N+0xo4vNvVl0NORP6pm8jh4rHdi5V5CwhRoj175gTn1dXVxuT41k4L1IRAN4F4t/imacn/hiWuPd0vHVtHY0O8MLx3KYXxAyxT1kTnnLvSeZR4KRNIwlUSFQAOEiisLh80aY9d/PX7IyeXlCCf8JJIEgqD5FXXMPCXMwDTvBhYQFwJEm8EhMADkzrRszbp5PXRBy4FZutJMkg6TAWcDJlTdihG9FpTzFX6pLCLBEB4Ovyw7cdjH7rHxBrXVUtg2d4JGULuPE/EGf9j8P3M6qqageT5LZDN2IVAFYyKyWj+B/z/K/fDLuX1b1DJMzGZgZCozKVZ226FpOSWbyuuVJMBbEJACdf7vbD9EvzNt/Y9D6/SvZP70lOUFZeJWuu343fbz14exm4JNl9szuxCAAD7nYq5GXcxr0Px1bXNjYPxhQEY6CmrhEBh8AlcCpY7/Zbt64lXQAYqNqfJx8n7T+XYNt6MGZdOAaAS+AUc9tDOA+8e5EqAAyw7+aA6NSgiBSpXtzgHS59twCnvxy4nwYckxkFaQKoqqrSX/evO6nXY7I0yATI+PrEQHh0ptbanXdSgetPtaKVSBEAVmVvv30Pku4+y1MRDQ7TuzMG7j3NU9m090EicN5ZW362iywADER56/7oxPvP83vyMyDTRnQGYuLzlbcERIMIlEX1JpIAcPLl/jge9yLifpaWqECY/oIx8FdMltbO43HxkAPBen7eWmgB4IFZJ668uHv+elq/z13K6Brc5YFg0gr/rOVgaypLN9YL19OM/u9KfCTkQlgkQgvgZkz6oYNBL78UdmCq9mOxOGigqTqa4mOC/ObbowN+buji7hEo5sxUFHMabBouY2sqT8F1U9D1I2PRme0e6OgWN3QQtw/YNAytn2OD5k+0QLPHWSB3R22x3cR2KCjRBXLRGZ+8tgslgOT04pE/H4z9AbFk5wKfk1UftGWhI4o4NA4d2eqNVs5yQKPcTJGthTbS0VTjxV9TvXJPJWSk3wdZ9ddGg3B7e0stNM6DjWaPt0bzJ1mjX1e6IYTENAeCcwC5wDnxxYMI/EcI2qOigqO1eV90cH2DLNy9wUEjhnyBgv7lg/Zs8EAjXI2RqrKSoJRIvT3kwn9f9BXIjaBgBBIAHGt2nbwf9y6nUl7QgajWvr+hKgrc5om2LHFBBrq9qAZPYDwZOCe7TtyPgxwJ0lkgAVy9k3Iy7G6mviADULHtDF9TdGybD2Ib96EiPKExhd3L1A+NSjkqiAO+BZCeVfTlzsCn0wVxTrW2BD5l2fSDPVo6wx7Jy/EdOtXC6BDPjmNP5qS8L3bpsFGLjXyxgHcrxMFzCSE19Y2Ywha9aVXkoC2LHNHoYaa0Qi0o2Np6DuvIuRcwhcxXbvlqFB6VuiPySY6GoGCo1H7FDGvk7dI15qiiHuf0ibiXupUf/jsVQFlZmca+My9+5McZVdt8NUgTTfW1pCo8seA6FJSwEeeuT2fOOxXA2Yi04JJy+t69q9ZTAfkvGtIZDzK3Pa+4msC5u9JZYB0KIOVt0YjAy0m0Zm/2eDb+ba/YGQ8yuR1y9zq1YHRHwXUogNPhyYEI0fe8T1tDCU30ZqOu+2GhsxHJHf4s5CmAxNcFo8LvZWjTmbxJ3mZITo5niHQOjW/s4dFZ2ompBaN4deDJzsVbb/bx6kSHegJP6ox2M6YDVLFjvHiddy7bFcCrd8UuV6MyaT3N6zhAE6mq0O+6vjjUALlMflf8VXu+2xXAjfvpexGi92SPm+MX7cXbRes4rOv33u5pL/g2AigsLGOfC3tj215jOtUNMO0tNrhZuaUoLiEXBd9KRievvEDHL8XztMCL8Sjw4nOEWG2oRuL8tPYdFJFqW1hYbtG6vg2qu89y18P0YuuGdFrvhucq+/cjd6KntLwaHf73MzRq0QU0aXU4Wv5bJPrt2DN04N+J6PD5JJ525EISOnLhFeJIeYda19DIuvssu82jZm0EEBr1djKdkt0eVktTcpOfmlGCvv0pHB2/koyKy+rxkPT8aRwa2Ta3nwngRVLekISUkh44Qlr/qfWUIw1/ZVUtWvn7HVT4oZY0n9JylJD6oQfkuOX4nwkgLinPr+VGupaN9cmbtwoKfyUTyefmsnWOmwWAp3zlQyPTZeL1p/IE3L3LDVm0ZUR0umgOKNY7NCrdqyWkZgEkvMkb8b6girx9Z8tRJFyWJymK6po6lJn3UcLoxTvc+/wq+edJuc3vLGwhgOIp4h1act4Vu5GjgDfpRZIDLcGREtOKm0/0mwXwODHfU4IYxDoUi6ST9Dox3cktzuD58f04Ma85100CwMf/bg9fFDCPd7VmjywltfYr5fWHLwq1cM6b5sibBBD7LNO3rr6BpO+NlKMjdXjZpARyjXM+EqhqEkBKVtm3sMJY12Eg9X35RIi2SQDxr4vcYYWxrsMAPhEcDtES+FhAxDzLof+jMRANY3wzEPU4WwfnXo7Iyiozrm2g8X1ffIfMNGzJQG0dh4Vzb0QUlH7sWvdLt2Shi5ch90R2YfngLs6DTIQvTBA5RRXWxIfyOmthOjN96M9AaXkNm8jKLTOlfyhMBMIwkJVfbk1UVjeqC9OZ6UN/Bqo+cnoTyeklqlQLBa6/2VloImFNS4OcN9ap9FDAGPqKbH3VqXl38uuMD2pEfUMjOVNnJKqIYDWi/X7DhTY3J3LuaDczVMcY3EW2/gYqJLJDnqvqmvpuRNXHesoJgLwQqeGptLKBGkBaoairbySI2rrGpsvBrbYxqyQyQNX7CurqGlkEVgGJoTKuWjMAdxXV1MNZTest5KyL4qXyYz3BfPtFYZCPvqkZxXy0kl4Tomd3eXjvqfQQyPjIJeV1lI0Qck8oKJB4Cy1lQ5UeMCrvASD3hII8wewBxKiPDxTeA0DuCSVFefo/8iLGBIrqOi3zg6guxNYfck+oqyhWim0ExjEqKq2hLAta6t3LiX66ylmURSgDwNLfl1I2Ch3NHtlELxWFNMoipDmwktIqJK6XqpNBjTrOPaGloZpAhjPGR1sG3uWU4UpqXgTCwJB2X5U4QlVFLg5WGCOfgfyiKvKdkuhRrYdiLKGl0zuWRJ+MqxYMvM+n9vl1X121BMLiC9WiHkoK5D1P3YKArl7MKaigLAW9VBQbIPdNcwEDTHoVUhYpjYFl51P3EGBmoNo0SfG3AEx7R1KJ50a8P+rozVudbXv9lhw95xVWoL/f8hUv1PLtezgJpBKzn7AM+G/OmwTQT0/tP582Sb/EQQTPt24d7uCNXNxtz17lkRLE+4Iq9PdbvuBNX4JbcRl1L7Jyc94kAHM9o2AFeTn8vSOFN8aJGBkgwzXkGnIOvpoEYGTEqu5vqFoCFYzJPgPmRqolkHOItEkAUHAYoHUblozJPgP2Fp9y3SwAtrHGZdkPnYkQGDA36XUWlmDNAhjm+MU5PD3InAcAKzJsasoKjcMdDK9wQ2wWAIvFqvd01n3O3cAsZZMBNwe9OMg1N7pmAUCFs43er7BkTHYZcLLW2dkyus8E4OlseF5bozt172JsiZwpC8yADs4t5Lhlx88EABt8XQ2ajw+wzhg1GCADhbeLfnBrP20E4Gyj748QizkZRLL2YXEcLbXbvAy8jQCszfu88nLWfS1r4Xf1eIY5aqc4WOu+as1DGwFAAy9ngyWI2Qsg2fmwOF5DDBe2F0+7AhjqZHjT3rJPfnsdmDr6MTDYSjPLY3C/W+0hb1cA0HCUq+EKWDJGfwZ8XA3xHr39OHgKwNfNNMi6f2/qPtXQfjxMbSsGBrE1inxdjUNaVTev8hQAtJjibbYYlozRl4EJHibTO0LfoQA8hhidHe7I/CLoiEBxbxPF/3AnvZfeLsZ/deSjQwFAx7E+7NHdFeWZ6wJABo2sezc5znhP8+b/GIIX9E4F4Gyp+Wail/E5Xg6YemoyMNHHONDJSjO3M3SdCgAcLJ5m+72Jvqps/e9JEJiMmqFOz5rFU+1+4Cc8vgSApw9r54wfsIAfh0wb6TMwdxx7Js5ZIz9I+BIAOPJwNjz5jYdxDJQZoy4DEzwMI71dzfi+y5tvAUDIa+Y4DrUw7kXdm90BZBc2dj/V8rVznDs98WtJkUACwLuV+sWTBjopd5fja/fSciCmLF4GlHvIN84bz3aEHAkykkACAMeONnrJS6cNWAZlxsTHgKCeF3zDXvaVo3GyoP0EFgAMMM7T8sDUEUbtTi7AdsYkywAc9yeNtDogzKhCCQAGWjHTyfsrG80MKDMmPQZcbbUz8HHfQ1gEQgsAH2salkw2Mh9oqk7dl+AIywpN+uHJusLFEw3NIRfCQhZaADCgkZFR9bqZ1mam+srMRSIgRIJm3k+tfO0MexPIgSjDiiQAGNjMTKfgp/l2bH2tntR9FBaAypDp9e1Rt2iauZmZmYbIP8lFFgDwamWim/HTHPtBmupK1HwxPoCUEdPCHG+c52DjPNCYlGfgSREAcGs/UDfp52V2BsyFImBDPNbfUK3cf8kgfeCarBFIEwAAsmMbZK+eaqdnb6FRAOuMCc4Arx52Fhq5q6fa6jhY9svh1UaYelIFAACsrDQrVk7tp+/upCvwRQnoz1hbBlzttFL3+3nq2dhok/7aMdIFAPDx2UnNrytcLab6mPyHYNH4IROOCmdlsgAAAyZJREFUdO+DAe4mextf2LF6mBn+qSeWy+9iEQCIAAPmrPzOcfKaWQOnq6t2k+jJoYI8SW/n5EgUNtDWbL1UFBuWz7Ca+eP3ThOBy+YNJBfEJgAuzgk+luc2zrMxtjZTb3otGbdenEuCpPyLE2NHvgexNfLWzrIxmeo74HRH7cjYJnYBAEhXB5OMwz97a05wN/gLMU8cIV4fAh8uJ3kaXTro76nj4WL8jlc7MuslIgAAjHdjDevmDfHZssBmnJm+KuknMzAGnc1EX6Vq01yb8avnDJ6AuZLYyYfEBMBNzkg3dvCJ7SNVvxtjerSHEnO3MXAw3df0+Kntviqj3NkSfzRf4gIAIWCFNy6a5jB/29IhRi6DNFOhrusZizPMXifRf5m98fJvHWYDJ9LgQCoC4AbqYqf77o917qa/LHT0dLDUIPUCB3cMKi5t+vfO959v67N9tduA4bZG6dLEKFUBcAP3HmpyM8DPS9dv3qCxdmyNTu9l5/aj2xISv36O9fjDP3trjRrW/zoV8FNCAFwiRruzgw9s9tLBJ0NfO1rKzuVkW3ONwk3zbb6GxI/3tKTU+xgpJQCuEMZ4WITs8/PS3L1+yNhRX+llIo5YLoJxhxPTkoPcHbWzt69wnnBwi1ffMcMseD6hKyYAfLmlpAC4yL+0MQj2X+xqEHNmmuK676x/HDpIM11ejrr/0ym8hHmonWbq+tk2y05udVD656phesMG97uEKPyhtAC4vOEz5Fp8RXH3jnXuRoGbPXptmGuzbMxQ/VjN3kr13DbSWvZVV6of5aoft3Gu3fL/9XfvtWONu+l4L4sAmA+RFiZBxqWFAFoGBHfBjPWwCNi00GVwcMA4hT9Xf+mwYobVfncnnQxFefHP3ijKI85wR52MZdOs9u/ZMMQxZP84Bf9FLk5fe/TfB9haYqVDmXYCaE2qs73h42mjrJb+c6WbYeSJacTJrcNNnW0NPHC7mdj8sP0PtmvYHmJ7gQ2uO8BPzpY3s0IZ6mAbtIG219SUu52dNcYk6Ke5dn6/rXAYf+p3d7PIE1OJ31a5Gc4YY7V08ECDR9ifSH/S7vz/AAAA//9/nzVCAAAABklEQVQDAKxeUrp0xKstAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import { format, isToday, isYesterday } from 'date-fns'\nimport { ptBR } from 'date-fns/locale'\nimport {\n Bot,\n MoreHorizontal,\n Reply,\n Pencil,\n Pause,\n Download,\n Check,\n CheckCheck,\n FileText,\n Film,\n Globe,\n ImagePlus,\n Mail,\n MessageCircle,\n MessagesSquare,\n Mic,\n Play,\n Paperclip,\n Search,\n Send,\n Smartphone,\n Smile,\n Trash2,\n X,\n ArrowLeft,\n EllipsisVertical,\n Zap,\n type LucideIcon,\n} from 'lucide-react'\nimport { ContextMenu } from 'radix-ui'\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ClipboardEvent,\n type DragEvent,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { Avatar } from '@/components/ui/avatar'\nimport { Badge, type BadgeProps } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Input } from '@/components/ui/input'\nimport { Popover, PopoverClose, PopoverContent, PopoverTrigger } from '@/components/ui/popover'\nimport logoFacebook from '@/assets/channels/facebook.png'\nimport logoGoogle from '@/assets/channels/google.png'\nimport logoInstagram from '@/assets/channels/instagram.png'\nimport logoReclameAqui from '@/assets/channels/reclameaqui.png'\nimport logoTiktok from '@/assets/channels/tiktok.png'\nimport logoWhatsappWeb from '@/assets/channels/whatsapp-web.png'\nimport logoWhatsapp from '@/assets/channels/whatsapp.png'\nimport { cn } from '@/lib/cn'\n\n/*\n * Chat de atendimento: três peças que as telas combinam.\n * ConversationList lista de conversas (canal, última mensagem, espera, não lidas)\n * ChatThread mensagens do cliente, do atendente, do robô (URA/IA) e do sistema\n * ChatComposer campo de mensagem: textarea de 2 linhas que cresce, anexos por botão,\n * arrastar e soltar ou colar (Ctrl+V de arquivo, print ou imagem)\n * Selo do canal sobre a foto do contato com o logotipo (src/assets/channels); site, e-mail\n * e SMS com ícone. A etiqueta do canal (ChannelBadge) usa sempre o ícone e o nome.\n */\n\nexport type ChatChannel =\n | 'whatsapp'\n | 'whatsapp-web'\n | 'instagram'\n | 'facebook'\n | 'tiktok'\n | 'google'\n | 'reclameaqui'\n | 'site'\n | 'email'\n | 'sms'\n\nexport const chatChannels: Record<\n ChatChannel,\n {\n label: string\n icon: LucideIcon\n /** Logotipo do canal (imagem redonda); sem ele, vale o ícone. */\n logo?: string\n tone: NonNullable<BadgeProps['tone']>\n }\n> = {\n whatsapp: { label: 'WhatsApp', icon: MessageCircle, logo: logoWhatsapp, tone: 'success' },\n 'whatsapp-web': {\n label: 'WhatsApp Web',\n icon: MessageCircle,\n logo: logoWhatsappWeb,\n tone: 'info',\n },\n instagram: { label: 'Instagram', icon: MessagesSquare, logo: logoInstagram, tone: 'error' },\n facebook: { label: 'Facebook', icon: MessagesSquare, logo: logoFacebook, tone: 'info' },\n tiktok: { label: 'TikTok', icon: MessagesSquare, logo: logoTiktok, tone: 'neutral' },\n google: { label: 'Google Meu Negócio', icon: Globe, logo: logoGoogle, tone: 'info' },\n reclameaqui: {\n label: 'Reclame Aqui',\n icon: MessagesSquare,\n logo: logoReclameAqui,\n tone: 'success',\n },\n site: { label: 'Chat do site', icon: Globe, tone: 'primary' },\n email: { label: 'E-mail', icon: Mail, tone: 'neutral' },\n sms: { label: 'SMS', icon: Smartphone, tone: 'warning' },\n}\n\n/** Logotipo do canal em círculo (selo sobre a foto do contato), ou o ícone sem logotipo. */\nfunction ChannelMark({ channel, className }: { channel: ChatChannel; className?: string }) {\n const c = chatChannels[channel]\n if (c.logo) return <img src={c.logo} alt=\"\" className={cn('shrink-0 rounded-full', className)} />\n return <c.icon className={className} aria-hidden />\n}\n\nexport function ChannelBadge({ channel }: { channel: ChatChannel }) {\n const c = chatChannels[channel]\n return (\n <Badge tone={c.tone} icon={<c.icon />}>\n {c.label}\n </Badge>\n )\n}\n\nexport interface ChatAttachment {\n name: string\n /** Endereço do arquivo (ou blob: local, para prévia antes de enviar). */\n url?: string\n type?: string\n size?: number\n /** Duração em segundos (áudio e vídeo). */\n duration?: number\n}\n\nexport interface ChatMessage {\n id: string\n /** Foto de quem enviou (cliente ou atendente). */\n avatar?: string\n /** Quem enviou: o cliente, o atendente, o robô (URA/IA) ou um aviso do sistema. */\n from: 'contact' | 'agent' | 'bot' | 'system'\n text?: string\n time: Date\n /** Nome de quem enviou (atendente ou robô). */\n author?: string\n /** Resposta a outra mensagem: mostra a citação acima do texto. */\n /** Mensagem citada. Com o id, clicar na citação leva até a original. */\n replyTo?: { id?: string; author?: string; text?: string }\n /** Reações com emoji. */\n reactions?: string[]\n /** Excluída: continua no chat, riscada e em vermelho claro. */\n deleted?: boolean\n /** Texto antes da edição: a mensagem mostra o novo e o original. */\n editedFrom?: string\n /** Situação da mensagem enviada: enviada, entregue, lida. */\n status?: 'sent' | 'delivered' | 'read'\n attachments?: ChatAttachment[]\n}\n\nexport interface Conversation {\n id: string\n name: string\n /** Foto do contato. */\n avatar?: string\n channel: ChatChannel\n /** Conta ou número do canal que recebeu (ex.: \"Comercial\"). */\n account?: string\n /** Departamento ou fila (ex.: \"Suporte\"). */\n department?: string\n lastMessage: string\n time: Date\n unread?: number\n /** Esperando desde (fila): mostra o tempo de espera. */\n waitingSince?: Date\n assignee?: string\n}\n\nconst hhmm = (d: Date) => format(d, 'HH:mm')\nconst secs = (n: number) => `${Math.floor(n / 60)}:${String(n % 60).padStart(2, '0')}`\nconst stamp = (d: Date) => (isToday(d) ? hhmm(d) : format(d, 'dd/MM/yyyy HH:mm'))\nconst channelText: Record<ChatChannel, string> = {\n whatsapp: 'text-success-soft-foreground',\n 'whatsapp-web': 'text-info-soft-foreground',\n tiktok: 'text-foreground',\n google: 'text-info-soft-foreground',\n reclameaqui: 'text-success-soft-foreground',\n instagram: 'text-destructive-soft-foreground',\n facebook: 'text-info-soft-foreground',\n site: 'text-primary-text',\n email: 'text-muted-foreground',\n sms: 'text-warning-soft-foreground',\n}\nconst dayLabel = (d: Date) =>\n isToday(d) ? 'Hoje' : isYesterday(d) ? 'Ontem' : format(d, \"d 'de' MMMM\", { locale: ptBR })\nconst sizeLabel = (n?: number) =>\n n == null\n ? ''\n : n < 1024 * 1024\n ? `${Math.max(1, Math.round(n / 1024))} KB`\n : `${(n / 1024 / 1024).toFixed(1).replace('.', ',')} MB`\nconst waited = (since: Date, now = new Date()) => {\n const min = Math.max(0, Math.round((now.getTime() - since.getTime()) / 60000))\n return min < 60 ? `${min} min` : `${Math.floor(min / 60)} h ${min % 60} min`\n}\n\n/* ================================================================ lista */\n\nexport interface ConversationListProps {\n items: Conversation[]\n activeId?: string | null\n onSelect: (id: string) => void\n /** Texto quando não há conversas (ex.: com os filtros aplicados). */\n empty?: string\n className?: string\n}\n\nexport function ConversationList({\n items,\n activeId,\n onSelect,\n empty = 'Nenhuma conversa aqui.',\n className,\n}: ConversationListProps) {\n if (!items.length) return <p className=\"p-6 text-center text-sm text-muted-foreground\">{empty}</p>\n return (\n <ul data-rendra=\"CHAT-001\" className={cn('flex flex-col gap-1 p-2', className)}>\n {items.map((c) => {\n const active = c.id === activeId\n return (\n <li key={c.id}>\n <button\n type=\"button\"\n onClick={() => onSelect(c.id)}\n aria-current={active || undefined}\n className={cn(\n 'flex w-full cursor-pointer items-start gap-3 rounded-item px-3 py-3 text-left transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring',\n active ? 'bg-primary-soft' : 'hover:bg-accent',\n )}\n >\n <span className=\"relative shrink-0\">\n <Avatar name={c.name} src={c.avatar} size=\"lg\" />\n <span\n className=\"absolute -right-1 -bottom-1 flex size-6 items-center justify-center rounded-full bg-card text-muted-foreground ring-2 ring-card\"\n title={chatChannels[c.channel].label}\n >\n <ChannelMark\n channel={c.channel}\n className={chatChannels[c.channel].logo ? 'size-6' : 'size-3'}\n />\n </span>\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"flex items-baseline gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-semibold\">{c.name}</span>\n <span className=\"shrink-0 text-xs text-muted-foreground tabular-nums\">\n {stamp(c.time)}\n </span>\n </span>\n <span className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted-foreground\">\n {[c.department, c.assignee].filter(Boolean).join(' · ') || c.lastMessage}\n </span>\n {c.unread ? (\n <span className=\"flex min-w-6 shrink-0 items-center justify-center rounded-full bg-primary px-1 text-xs font-semibold text-primary-foreground tabular-nums\">\n {c.unread}\n </span>\n ) : null}\n </span>\n <span className=\"flex min-w-0 items-center gap-1 text-xs\">\n <span className={cn('shrink-0 font-semibold', channelText[c.channel])}>\n {chatChannels[c.channel].label}\n {c.account ? ':' : ''}\n </span>\n {c.account && <span className=\"truncate text-muted-foreground\">{c.account}</span>}\n </span>\n {c.waitingSince && (\n <span className=\"text-xs font-medium text-warning-soft-foreground\">\n Esperando há {waited(c.waitingSince)}\n </span>\n )}\n </span>\n </button>\n </li>\n )\n })}\n </ul>\n )\n}\n\n/* ================================================================ mensagens */\n\nexport interface ChatThreadProps {\n messages: ChatMessage[]\n /** Responder (citar) uma mensagem: a tela mostra a citação no campo de mensagem. */\n onReply?: (message: ChatMessage) => void\n /** Reagir com emoji (clicar de novo na mesma reação a remove). */\n onReact?: (message: ChatMessage, emoji: string) => void\n /** Editar uma mensagem do atendente. */\n onEdit?: (message: ChatMessage) => void\n /** Excluir uma mensagem do atendente (continua no chat, riscada). */\n onDelete?: (message: ChatMessage) => void\n className?: string\n}\n\nconst REACTIONS = ['👍', '❤️', '😂', '😮', '🙏', '✅']\nconst SPEEDS = [1, 1.5, 2] as const\n\n/** Tocador de áudio: tocar e pausar, progresso, velocidade 1x, 1,5x e 2x, e baixar. */\nfunction AudioPlayer({ file, mine }: { file: ChatAttachment; mine: boolean }) {\n const total = Math.max(1, file.duration ?? 8)\n const [playing, setPlaying] = useState(false)\n const [pos, setPos] = useState(0)\n const [speed, setSpeed] = useState<(typeof SPEEDS)[number]>(1)\n const audio = useRef<HTMLAudioElement>(null)\n // Sem arquivo de verdade (demo), o progresso é simulado no ritmo da velocidade escolhida.\n useEffect(() => {\n if (!playing || file.url) return\n const t = window.setInterval(() => {\n setPos((p) => {\n const next = p + 0.1 * speed\n if (next >= total) {\n setPlaying(false)\n return 0\n }\n return next\n })\n }, 100)\n return () => window.clearInterval(t)\n }, [playing, speed, total, file.url])\n useEffect(() => {\n if (audio.current) audio.current.playbackRate = speed\n }, [speed])\n const toggle = () => {\n if (file.url && audio.current) {\n if (playing) audio.current.pause()\n else void audio.current.play()\n }\n setPlaying((v) => !v)\n }\n const progress = Math.min(1, pos / total)\n return (\n <span\n className={cn(\n 'flex min-w-0 items-center gap-2 rounded-full py-1 pr-1 pl-1 text-xs md:min-w-3xs',\n mine ? 'bg-primary-foreground/15' : 'bg-muted',\n )}\n >\n {file.url && (\n <audio\n ref={audio}\n src={file.url}\n onTimeUpdate={(e) => setPos(e.currentTarget.currentTime)}\n onEnded={() => {\n setPlaying(false)\n setPos(0)\n }}\n >\n <track kind=\"captions\" />\n </audio>\n )}\n <Button\n size=\"sm\"\n iconOnly\n variant={mine ? 'secondary' : 'primary'}\n aria-label={playing ? 'Pausar áudio' : 'Tocar áudio'}\n onClick={toggle}\n className=\"rounded-full\"\n >\n {playing ? <Pause /> : <Play />}\n </Button>\n <span className=\"relative h-1 min-w-12 flex-1 overflow-hidden rounded-full bg-current/25\">\n <span\n aria-hidden\n className=\"absolute inset-y-0 left-0 w-progress rounded-full bg-current\"\n style={{ '--progress': `${(progress * 100).toFixed(1)}%` } as CSSProperties}\n />\n </span>\n <span className=\"shrink-0 tabular-nums\">{secs(Math.round(playing ? pos : total))}</span>\n <button\n type=\"button\"\n onClick={() => setSpeed((s) => SPEEDS[(SPEEDS.indexOf(s) + 1) % SPEEDS.length] ?? 1)}\n aria-label={`Velocidade ${String(speed).replace('.', ',')}x. Trocar velocidade`}\n className=\"flex h-6 min-w-12 shrink-0 cursor-pointer items-center justify-center rounded-full bg-current/15 px-2 font-semibold tabular-nums max-md:h-touch\"\n >\n {String(speed).replace('.', ',')}x\n </button>\n <a\n href={file.url ?? '#'}\n download={file.name}\n aria-label={`Baixar ${file.name}`}\n onClick={(e) => !file.url && e.preventDefault()}\n className=\"flex size-8 shrink-0 items-center justify-center rounded-full hover:bg-current/15 max-md:size-touch\"\n >\n <Download className=\"size-icon-sm\" aria-hidden />\n </a>\n </span>\n )\n}\n\nfunction Attachments({ files, mine }: { files: ChatAttachment[]; mine: boolean }) {\n return (\n <span className=\"flex flex-col gap-2\">\n {files.map((f, i) => {\n if (f.type?.startsWith('audio/')) return <AudioPlayer key={i} file={f} mine={mine} />\n const media = f.url && (f.type?.startsWith('image/') || f.type?.startsWith('video/'))\n return media ? (\n <span key={i} className=\"relative flex flex-col gap-1\">\n {f.type?.startsWith('video/') ? (\n <video src={f.url} controls className=\"max-h-chart-sm max-w-full rounded-item\">\n <track kind=\"captions\" />\n </video>\n ) : (\n <img\n src={f.url}\n alt={f.name}\n className=\"max-h-chart-sm max-w-full rounded-item object-cover\"\n />\n )}\n <a\n href={f.url}\n download={f.name}\n className=\"flex items-center gap-1 self-start text-xs underline-offset-4 hover:underline max-md:min-h-touch\"\n >\n <Download className=\"size-3\" aria-hidden />\n Baixar\n <span className=\"sr-only\">{f.name}</span>\n </a>\n </span>\n ) : (\n <a\n key={i}\n href={f.url}\n download={f.name}\n className={cn(\n 'flex min-w-0 items-center gap-2 rounded-item px-2 py-2 text-xs underline-offset-4 hover:underline',\n mine ? 'bg-primary-foreground/15' : 'bg-muted',\n )}\n >\n <FileText className=\"size-icon-sm shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate\">{f.name}</span>\n {f.size != null && <span className=\"shrink-0\">{sizeLabel(f.size)}</span>}\n <Download className=\"size-icon-sm shrink-0\" aria-label=\"Baixar\" />\n </a>\n )\n })}\n </span>\n )\n}\n\n/** Ações da mensagem: no botão direito (ContextMenu) e no botão \"…\" (toque e teclado). */\nfunction MessageActions({\n m,\n mine,\n onReply,\n onReact,\n onEdit,\n onDelete,\n kind,\n}: {\n m: ChatMessage\n mine: boolean\n kind: 'context' | 'dropdown'\n} & Pick<ChatThreadProps, 'onReply' | 'onReact' | 'onEdit' | 'onDelete'>) {\n const Item = kind === 'context' ? ContextMenu.Item : DropdownMenuItem\n const itemClass =\n kind === 'context'\n ? 'flex min-h-touch cursor-pointer items-center gap-2 rounded-item px-3 text-sm outline-none select-none data-[highlighted]:bg-accent md:min-h-0 md:py-2 [&_svg]:size-icon-sm'\n : undefined\n return (\n <>\n <div role=\"group\" aria-label=\"Reagir\" className=\"flex gap-1 p-1\">\n {REACTIONS.map((e) => (\n <Item\n key={e}\n onSelect={() => onReact?.(m, e)}\n aria-label={`Reagir com ${e}`}\n className={cn(\n 'flex size-touch cursor-pointer items-center justify-center rounded-item text-lg outline-none data-[highlighted]:bg-accent md:size-8',\n )}\n >\n {e}\n </Item>\n ))}\n </div>\n <Item className={itemClass} onSelect={() => onReply?.(m)}>\n <Reply aria-hidden /> Responder\n </Item>\n {mine && !m.deleted && (\n <>\n <Item className={itemClass} onSelect={() => onEdit?.(m)}>\n <Pencil aria-hidden /> Editar\n </Item>\n <Item\n className={cn(itemClass, kind === 'context' && 'text-destructive-soft-foreground')}\n {...(kind === 'dropdown' ? { destructive: true } : {})}\n onSelect={() => onDelete?.(m)}\n >\n <Trash2 aria-hidden /> Excluir\n </Item>\n </>\n )}\n </>\n )\n}\n\nexport function ChatThread({\n messages,\n onReply,\n onReact,\n onEdit,\n onDelete,\n className,\n}: ChatThreadProps) {\n const endRef = useRef<HTMLDivElement>(null)\n // Sempre mostra a mensagem mais nova.\n useEffect(() => {\n endRef.current?.scrollIntoView({ block: 'end' })\n }, [messages.length])\n\n const groups = useMemo(() => {\n const out: { day: string; items: ChatMessage[] }[] = []\n for (const m of messages) {\n const day = dayLabel(m.time)\n const last = out[out.length - 1]\n if (last?.day === day) last.items.push(m)\n else out.push({ day, items: [m] })\n }\n return out\n }, [messages])\n const actionsOn = Boolean(onReply || onReact || onEdit || onDelete)\n const logRef = useRef<HTMLDivElement>(null)\n const [flash, setFlash] = useState<string | null>(null)\n useEffect(() => {\n if (!flash) return\n const t = window.setTimeout(() => setFlash(null), 1600)\n return () => window.clearTimeout(t)\n }, [flash])\n // Leva até a mensagem citada e a destaca por um instante.\n const goTo = (id: string) => {\n const el = logRef.current?.querySelector<HTMLElement>(`[data-message-id=\"${CSS.escape(id)}\"]`)\n if (!el) return\n const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n el.scrollIntoView({ behavior: reduce ? 'auto' : 'smooth', block: 'center' })\n setFlash(id)\n }\n\n return (\n <div\n ref={logRef}\n role=\"log\"\n // Área rolável focável: dá para rolar as mensagens pelo teclado (WCAG, axe\n // scrollable-region-focusable). O log não é interativo, mas precisa receber foco.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n aria-live=\"polite\"\n aria-label=\"Mensagens da conversa\"\n data-rendra=\"CHAT-002\"\n className={cn(\n 'flex min-h-0 flex-1 scrollbar-subtle flex-col gap-3 overflow-y-auto overscroll-contain bg-muted/40 p-4',\n className,\n )}\n >\n {groups.map((g) => (\n <section key={g.day} className=\"flex flex-col gap-3\" aria-label={g.day}>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\" aria-hidden>\n <span className=\"h-px flex-1 bg-border\" />\n {g.day}\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n {g.items.map((m) => {\n if (m.from === 'system')\n return (\n <p key={m.id} className=\"self-center text-center text-xs text-muted-foreground\">\n {m.text} · {hhmm(m.time)}\n </p>\n )\n const mine = m.from === 'agent'\n const bot = m.from === 'bot'\n const who = m.author ?? (bot ? 'Assistente virtual' : undefined)\n const bubble = (\n <div\n className={cn(\n 'group/msg relative flex min-w-0 flex-col gap-2 rounded-surface px-3 py-2 text-sm wrap-anywhere shadow-sm transition-shadow',\n flash === m.id && 'ring-4 ring-ring/60',\n mine && !m.deleted && 'bg-primary text-primary-foreground',\n bot && 'border border-dashed bg-card',\n m.from === 'contact' && !m.deleted && 'border bg-card',\n m.deleted &&\n 'border border-destructive/30 bg-destructive-soft text-destructive-soft-foreground',\n )}\n >\n <span\n className={cn(\n 'flex items-center gap-2 text-xs',\n mine && !m.deleted\n ? 'flex-row-reverse text-primary-foreground'\n : 'text-muted-foreground',\n m.deleted && 'text-destructive-soft-foreground',\n )}\n >\n {bot ? (\n <Bot className=\"size-icon-sm\" aria-hidden />\n ) : (\n <Avatar name={who ?? '?'} src={m.avatar} size=\"sm\" />\n )}\n {who && <span className=\"font-semibold\">{who}</span>}\n <span className={cn('tabular-nums', mine ? 'mr-auto' : 'ml-auto')}>\n {format(m.time, 'dd/MM/yyyy HH:mm')}\n </span>\n {actionsOn && (\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label=\"Ações da mensagem\"\n className=\"-my-1 flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-item opacity-70 outline-none hover:opacity-100 focus-visible:ring-2 focus-visible:ring-ring max-md:size-touch\"\n >\n <MoreHorizontal className=\"size-icon-sm\" aria-hidden />\n </DropdownMenuTrigger>\n <DropdownMenuContent align={mine ? 'end' : 'start'}>\n <MessageActions\n kind=\"dropdown\"\n m={m}\n mine={mine}\n onReply={onReply}\n onReact={onReact}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </span>\n {m.replyTo &&\n (() => {\n const quoteClass = cn(\n 'flex flex-col rounded-block border-l-4 px-2 py-1 text-left text-xs',\n mine && !m.deleted\n ? 'border-primary-foreground/60 bg-primary-foreground/15'\n : 'border-primary bg-muted',\n )\n const body = (\n <>\n <span className=\"font-semibold\">{m.replyTo.author}</span>\n <span className=\"line-clamp-2\">{m.replyTo.text}</span>\n </>\n )\n const target = m.replyTo.id\n return target ? (\n <button\n type=\"button\"\n onClick={() => goTo(target)}\n aria-label={`Ir para a mensagem citada de ${m.replyTo.author ?? 'contato'}`}\n className={cn(\n quoteClass,\n 'cursor-pointer outline-none hover:opacity-90 focus-visible:ring-2 focus-visible:ring-ring',\n )}\n >\n {body}\n </button>\n ) : (\n <span className={quoteClass}>{body}</span>\n )\n })()}\n {m.attachments?.length && !m.deleted ? (\n <Attachments files={m.attachments} mine={mine} />\n ) : null}\n {m.deleted ? (\n <p className=\"line-through\">\n {m.text || 'Anexo'}\n <span className=\"sr-only\"> (mensagem excluída)</span>\n </p>\n ) : (\n m.text && <p className=\"wrap-anywhere whitespace-pre-wrap\">{m.text}</p>\n )}\n {m.editedFrom && !m.deleted && (\n <p\n className={cn(\n 'border-t pt-1 text-xs',\n mine\n ? 'border-primary-foreground/30 text-primary-foreground'\n : 'text-muted-foreground',\n )}\n >\n Editada. Antes: <span className=\"line-through\">{m.editedFrom}</span>\n </p>\n )}\n {(m.deleted || (mine && m.status)) && (\n <span className=\"flex items-center justify-end gap-1 text-xs\">\n {m.deleted && <span className=\"font-semibold\">Mensagem excluída</span>}\n {mine && !m.deleted && m.status === 'sent' && (\n <Check className=\"size-3\" aria-label=\"Enviada\" />\n )}\n {mine && !m.deleted && m.status && m.status !== 'sent' && (\n <CheckCheck\n className=\"size-3\"\n aria-label={m.status === 'read' ? 'Lida' : 'Entregue'}\n />\n )}\n </span>\n )}\n </div>\n )\n return (\n <div\n key={m.id}\n data-message-id={m.id}\n className={cn(\n 'flex max-w-full flex-col gap-1 md:max-w-4/5',\n mine ? 'items-end self-end' : 'items-start self-start',\n )}\n >\n {actionsOn ? (\n <ContextMenu.Root>\n <ContextMenu.Trigger asChild>{bubble}</ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content className=\"z-50 min-w-3xs rounded-surface border bg-popover p-1 text-popover-foreground shadow-md\">\n <MessageActions\n kind=\"context\"\n m={m}\n mine={mine}\n onReply={onReply}\n onReact={onReact}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n ) : (\n bubble\n )}\n {m.reactions && m.reactions.length > 0 && (\n <span className=\"-mt-2 flex gap-1 px-2\" aria-label=\"Reações\">\n {[...new Set(m.reactions)].map((e) => (\n <button\n key={e}\n type=\"button\"\n onClick={() => onReact?.(m, e)}\n aria-label={`Reação ${e}. Remover`}\n className=\"flex h-6 cursor-pointer items-center gap-1 rounded-full border bg-card px-2 text-xs shadow-sm max-md:h-touch\"\n >\n {e}\n {m.reactions!.filter((x) => x === e).length > 1 && (\n <span className=\"tabular-nums\">\n {m.reactions!.filter((x) => x === e).length}\n </span>\n )}\n </button>\n ))}\n </span>\n )}\n </div>\n )\n })}\n </section>\n ))}\n <div ref={endRef} />\n </div>\n )\n}\n\n/* ================================================================ campo de mensagem */\n\nconst EMOJIS = [\n '😀',\n '😂',\n '😊',\n '😍',\n '🤔',\n '😅',\n '😉',\n '🙏',\n '👍',\n '👏',\n '🙌',\n '💪',\n '🎉',\n '✅',\n '❤️',\n '🔥',\n '👀',\n '🚀',\n '📎',\n '📅',\n '💬',\n '⏰',\n '📞',\n '🤝',\n]\n\nexport interface QuickReply {\n id: string\n /** Nome curto na lista (ex.: \"Saudação\"). */\n title: string\n text: string\n}\n\nexport interface ChatComposerProps {\n /** files inclui o áudio gravado (tipo audio/*), com a duração em segundos. */\n onSend: (message: { text: string; files: File[]; audioSeconds?: number }) => void\n placeholder?: string\n disabled?: boolean\n /** Motivo de estar desativado, mostrado no lugar do campo (ex.: \"Assuma a conversa\"). */\n disabledHint?: string\n /** Ação mostrada junto do motivo (ex.: botão \"Assumir atendimento\"). */\n disabledAction?: ReactNode\n /** Tipos aceitos no botão de arquivo. Padrão: qualquer arquivo. */\n accept?: string\n /**\n * Mensagens rápidas cadastradas. Com elas, o raio ao lado do microfone abre a lista (com\n * busca); a escolhida vai para o campo, para revisar antes de enviar.\n */\n quickReplies?: QuickReply[]\n /** Mensagem sendo respondida: aparece citada acima do campo. */\n quote?: { author?: string; text?: string } | null\n onCancelQuote?: () => void\n /** Mensagem sendo editada: o campo vem com o texto dela. */\n editing?: { id: string; text?: string } | null\n onCancelEdit?: () => void\n className?: string\n}\n\n/**\n * Campo de mensagem. Esquerda: arquivo, imagem ou vídeo e emoji. Centro: textarea de 2\n * linhas que cresce com o texto (Enter envia, Shift+Enter quebra a linha); aceita arrastar e\n * soltar e colar arquivos, prints e imagens. Direita: mensagens rápidas (quando cadastradas),\n * gravar áudio (a gravação é simulada no demo: contador, ondas e ponto pulsando; cancelar ou\n * enviar) e enviar.\n */\nexport function ChatComposer({\n onSend,\n placeholder = 'Escreva uma mensagem',\n disabled,\n disabledHint,\n disabledAction,\n accept,\n quickReplies,\n quote,\n onCancelQuote,\n editing,\n onCancelEdit,\n className,\n}: ChatComposerProps) {\n const [text, setText] = useState('')\n const [files, setFiles] = useState<File[]>([])\n const [drag, setDrag] = useState(false)\n const [recording, setRecording] = useState(false)\n // Menu de ações da conversa estreita: lista, emojis ou mensagens rápidas.\n const [menu, setMenu] = useState<'menu' | 'emoji' | 'quick' | null>(null)\n const [seconds, setSeconds] = useState(0)\n const fileInput = useRef<HTMLInputElement>(null)\n const mediaInput = useRef<HTMLInputElement>(null)\n const area = useRef<HTMLTextAreaElement>(null)\n // Safari e Firefox não têm field-sizing: mede a altura do texto para o campo crescer.\n useLayoutEffect(() => {\n const el = area.current\n if (!el || CSS.supports('field-sizing', 'content')) return\n el.style.removeProperty('--autosize-h')\n el.style.setProperty('--autosize-h', `${el.scrollHeight + el.offsetHeight - el.clientHeight}px`)\n }, [text])\n const previews = useMemo(\n () => files.map((f) => (f.type.startsWith('image/') ? URL.createObjectURL(f) : null)),\n [files],\n )\n useEffect(() => () => previews.forEach((u) => u && URL.revokeObjectURL(u)), [previews])\n // Editar: o campo recebe o texto da mensagem escolhida.\n useEffect(() => {\n if (!editing) return\n setText(editing.text ?? '')\n window.requestAnimationFrame(() => area.current?.focus())\n }, [editing])\n useEffect(() => {\n if (quote) area.current?.focus()\n }, [quote])\n useEffect(() => {\n if (!recording) return\n const t = window.setInterval(() => setSeconds((n) => n + 1), 1000)\n return () => window.clearInterval(t)\n }, [recording])\n\n const add = (list: FileList | File[] | null | undefined) => {\n const next = [...(list ?? [])]\n if (next.length) setFiles((f) => [...f, ...next])\n }\n const send = () => {\n if (disabled || (!text.trim() && !files.length)) return\n onSend({ text: text.trim(), files })\n setText('')\n setFiles([])\n }\n const insertEmoji = (emoji: string) => {\n const el = area.current\n const start = el?.selectionStart ?? text.length\n const end = el?.selectionEnd ?? text.length\n setText(text.slice(0, start) + emoji + text.slice(end))\n window.requestAnimationFrame(() => {\n el?.focus()\n el?.setSelectionRange(start + emoji.length, start + emoji.length)\n })\n }\n const insertQuickReply = (t: string) => {\n setText((cur) => (cur.trim() ? `${cur.trimEnd()} ${t}` : t))\n window.requestAnimationFrame(() => area.current?.focus())\n }\n const startRecording = () => {\n setSeconds(0)\n setRecording(true)\n }\n const stopRecording = (keep: boolean) => {\n setRecording(false)\n if (keep && seconds > 0) {\n const audio = new File(\n [new Blob([], { type: 'audio/webm' })],\n `Áudio ${secs(seconds)}.webm`,\n {\n type: 'audio/webm',\n },\n )\n onSend({ text: '', files: [audio], audioSeconds: seconds })\n }\n setSeconds(0)\n }\n const onPaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n // Colar arquivo, print ou imagem copiada vira anexo; texto segue normal.\n if (e.clipboardData.files.length) {\n e.preventDefault()\n add(e.clipboardData.files)\n }\n }\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDrag(false)\n if (!disabled) add(e.dataTransfer.files)\n }\n\n if (disabled && disabledHint)\n return (\n <div\n className={cn(\n 'flex flex-col items-center gap-3 border-t bg-card p-4 pb-safe text-center text-sm text-muted-foreground md:pb-4',\n className,\n )}\n >\n {disabledHint}\n {disabledAction}\n </div>\n )\n\n return (\n <div\n onDragOver={(e) => {\n e.preventDefault()\n if (!disabled) setDrag(true)\n }}\n onDragLeave={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setDrag(false)\n }}\n onDrop={onDrop}\n data-rendra=\"CHAT-003\"\n className={cn(\n '@container relative flex flex-col gap-2 border-t bg-card p-3 pb-safe md:pb-3',\n className,\n )}\n >\n {drag && (\n <div className=\"pointer-events-none absolute inset-2 z-10 flex items-center justify-center rounded-control border-2 border-dashed border-primary bg-primary-soft text-sm font-medium text-primary-soft-foreground\">\n Solte para anexar\n </div>\n )}\n {(quote || editing) && (\n <div className=\"flex items-start gap-2 rounded-block border-l-4 border-primary bg-muted px-3 py-2 text-xs\">\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"font-semibold\">\n {editing ? 'Editando mensagem' : `Respondendo a ${quote?.author ?? 'mensagem'}`}\n </span>\n {!editing && <span className=\"line-clamp-2 text-muted-foreground\">{quote?.text}</span>}\n </span>\n <button\n type=\"button\"\n aria-label={editing ? 'Cancelar edição' : 'Cancelar resposta'}\n onClick={() => {\n if (editing) {\n setText('')\n onCancelEdit?.()\n } else onCancelQuote?.()\n }}\n className=\"flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-card hover:text-foreground max-md:size-touch\"\n >\n <X className=\"size-3\" aria-hidden />\n </button>\n </div>\n )}\n {files.length > 0 && (\n <ul className=\"flex flex-wrap gap-2\" aria-label=\"Anexos\">\n {files.map((f, i) => (\n <li\n key={`${f.name}-${i}`}\n className=\"flex max-w-full items-center gap-2 rounded-item border bg-muted py-1 pr-1 pl-1 text-xs\"\n >\n {previews[i] ? (\n <img src={previews[i] ?? ''} alt=\"\" className=\"size-8 rounded-item object-cover\" />\n ) : f.type.startsWith('video/') ? (\n <Film className=\"ml-1 size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n ) : (\n <FileText\n className=\"ml-1 size-icon-sm shrink-0 text-muted-foreground\"\n aria-hidden\n />\n )}\n <span className=\"max-w-3xs truncate\">{f.name}</span>\n <span className=\"text-muted-foreground\">{sizeLabel(f.size)}</span>\n <button\n type=\"button\"\n aria-label={`Remover ${f.name}`}\n onClick={() => setFiles((l) => l.filter((_, j) => j !== i))}\n className=\"flex size-6 cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-card hover:text-foreground max-md:size-touch\"\n >\n <X className=\"size-3\" aria-hidden />\n </button>\n </li>\n ))}\n </ul>\n )}\n {/*\n * Conversa larga: arquivo, imagem, emoji | campo | mensagens rápidas, áudio, enviar.\n * Conversa estreita (celular ou três colunas): campo, enviar e o botão de ações, que abre\n * as outras opções.\n */}\n <div className=\"flex items-end gap-1\">\n {recording ? (\n /* Gravação simulada: ponto pulsando, tempo e ondas no lugar do campo. */\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"flex h-control-md min-w-0 flex-1 items-center gap-3 rounded-control border border-destructive/40 bg-destructive-soft px-3 text-destructive-soft-foreground\"\n >\n <span\n aria-hidden\n className=\"size-3 shrink-0 animate-pulse rounded-full bg-destructive\"\n />\n <span className=\"shrink-0 text-sm font-semibold tabular-nums\">{secs(seconds)}</span>\n <span className=\"sr-only\">Gravando áudio</span>\n <span\n aria-hidden\n className=\"flex h-6 min-w-0 flex-1 items-center gap-1 overflow-hidden\"\n >\n {Array.from({ length: 28 }, (_, i) => (\n <span\n key={i}\n className=\"h-full w-1 shrink-0 wave-bar rounded-full bg-destructive\"\n style={{ '--delay': `${(i * 83) % 900}ms` } as CSSProperties}\n />\n ))}\n </span>\n </div>\n ) : (\n <>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Anexar arquivo\"\n disabled={disabled}\n onClick={() => fileInput.current?.click()}\n className=\"@max-xl:hidden\"\n >\n <Paperclip />\n </Button>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Enviar imagem ou vídeo\"\n disabled={disabled}\n onClick={() => mediaInput.current?.click()}\n className=\"@max-xl:hidden\"\n >\n <ImagePlus />\n </Button>\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Emoji\"\n disabled={disabled}\n className=\"@max-xl:hidden\"\n >\n <Smile />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" side=\"top\" className=\"w-auto p-2\">\n <EmojiGrid onPick={insertEmoji} />\n </PopoverContent>\n </Popover>\n <textarea\n ref={area}\n rows={2}\n value={text}\n disabled={disabled}\n onChange={(e) => setText(e.target.value)}\n onPaste={onPaste}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n send()\n }\n }}\n placeholder={placeholder}\n aria-label=\"Mensagem\"\n className=\"field-sizing-content h-autosize max-h-chart-sm min-h-control-md min-w-0 flex-1 resize-none rounded-control border border-input bg-field px-3 py-2 text-base wrap-break-word text-foreground outline-none placeholder:text-muted-foreground focus:border-ring focus:bg-card focus:ring-2 focus:ring-ring/25 disabled:opacity-60 md:text-sm\"\n />\n {quickReplies?.length ? (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Mensagens rápidas\"\n disabled={disabled}\n className=\"@max-xl:hidden\"\n >\n <Zap />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" side=\"top\" className=\"flex flex-col gap-2 p-2\">\n <QuickReplyList items={quickReplies} onPick={insertQuickReply} />\n </PopoverContent>\n </Popover>\n ) : null}\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Gravar áudio\"\n disabled={disabled}\n onClick={startRecording}\n className=\"@max-xl:hidden\"\n >\n <Mic />\n </Button>\n </>\n )}\n {recording ? (\n <>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Cancelar gravação\"\n onClick={() => stopRecording(false)}\n >\n <Trash2 />\n </Button>\n <Button iconOnly aria-label=\"Enviar áudio\" onClick={() => stopRecording(true)}>\n <Send />\n </Button>\n </>\n ) : (\n <>\n <Button\n iconOnly\n aria-label=\"Enviar\"\n disabled={disabled || (!text.trim() && !files.length)}\n onClick={send}\n >\n <Send />\n </Button>\n {/* Conversa estreita: as outras opções num só botão. */}\n <Popover open={menu !== null} onOpenChange={(v) => setMenu(v ? 'menu' : null)}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Mais ações da mensagem\"\n disabled={disabled}\n className=\"@xl:hidden\"\n >\n <EllipsisVertical />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" side=\"top\" className=\"flex flex-col gap-1 p-2\">\n {menu === 'menu' && (\n <ul className=\"flex flex-col gap-1\" aria-label=\"Ações da mensagem\">\n {[\n {\n label: 'Anexar arquivo',\n icon: Paperclip,\n run: () => {\n setMenu(null)\n fileInput.current?.click()\n },\n },\n {\n label: 'Imagem ou vídeo',\n icon: ImagePlus,\n run: () => {\n setMenu(null)\n mediaInput.current?.click()\n },\n },\n { label: 'Emoji', icon: Smile, run: () => setMenu('emoji') },\n ...(quickReplies?.length\n ? [{ label: 'Mensagens rápidas', icon: Zap, run: () => setMenu('quick') }]\n : []),\n {\n label: 'Gravar áudio',\n icon: Mic,\n run: () => {\n setMenu(null)\n startRecording()\n },\n },\n ].map((a) => (\n <li key={a.label}>\n <button\n type=\"button\"\n onClick={a.run}\n className=\"flex min-h-touch w-full cursor-pointer items-center gap-3 rounded-item px-3 text-left text-sm outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <a.icon className=\"size-icon-sm text-muted-foreground\" aria-hidden />\n {a.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n {menu && menu !== 'menu' && (\n <button\n type=\"button\"\n onClick={() => setMenu('menu')}\n className=\"flex min-h-touch cursor-pointer items-center gap-2 rounded-item px-2 text-left text-xs font-semibold outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ArrowLeft className=\"size-icon-sm\" aria-hidden />\n Voltar\n </button>\n )}\n {menu === 'emoji' && (\n <EmojiGrid\n onPick={(em) => {\n insertEmoji(em)\n setMenu(null)\n }}\n />\n )}\n {menu === 'quick' && quickReplies && (\n <QuickReplyList\n items={quickReplies}\n onPick={(t) => {\n insertQuickReply(t)\n setMenu(null)\n }}\n />\n )}\n </PopoverContent>\n </Popover>\n </>\n )}\n </div>\n <p className=\"hidden text-xs text-muted-foreground md:block\">\n Enter envia, Shift+Enter quebra a linha. Arraste ou cole arquivos e prints no campo.\n </p>\n <input\n ref={fileInput}\n type=\"file\"\n multiple\n hidden\n accept={accept}\n onChange={(e) => {\n add(e.target.files)\n e.target.value = ''\n }}\n />\n <input\n ref={mediaInput}\n type=\"file\"\n multiple\n hidden\n accept=\"image/*,video/*\"\n onChange={(e) => {\n add(e.target.files)\n e.target.value = ''\n }}\n />\n </div>\n )\n}\n\n/** Grade de emojis do campo de mensagem. */\nfunction EmojiGrid({ onPick }: { onPick: (emoji: string) => void }) {\n return (\n <div role=\"group\" aria-label=\"Emojis\" className=\"grid grid-cols-6 gap-1\">\n {EMOJIS.map((em) => (\n <button\n key={em}\n type=\"button\"\n onClick={() => onPick(em)}\n aria-label={`Inserir ${em}`}\n className=\"flex size-touch cursor-pointer items-center justify-center rounded-item text-xl hover:bg-accent md:size-control-md\"\n >\n {em}\n </button>\n ))}\n </div>\n )\n}\n\n/** Lista de mensagens rápidas, com busca pelo nome ou pelo texto. */\nfunction QuickReplyList({\n items,\n onPick,\n}: {\n items: QuickReply[]\n onPick: (text: string) => void\n}) {\n const [q, setQ] = useState('')\n const term = q.trim().toLowerCase()\n const list = term\n ? items.filter((i) => `${i.title} ${i.text}`.toLowerCase().includes(term))\n : items\n return (\n <>\n <span className=\"px-2 pt-1 text-xs font-semibold\">Mensagens rápidas</span>\n <Input\n icon={<Search />}\n type=\"search\"\n value={q}\n onChange={setQ}\n placeholder=\"Buscar mensagem\"\n aria-label=\"Buscar mensagem rápida\"\n />\n <ul className=\"flex max-h-chart-sm scrollbar-subtle flex-col gap-1 overflow-y-auto\">\n {list.map((i) => (\n <li key={i.id}>\n <PopoverClose asChild>\n <button\n type=\"button\"\n onClick={() => onPick(i.text)}\n className=\"flex min-h-touch w-full cursor-pointer flex-col gap-1 rounded-item px-2 py-2 text-left outline-none hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <span className=\"text-sm font-semibold\">{i.title}</span>\n <span className=\"line-clamp-2 text-xs text-muted-foreground\">{i.text}</span>\n </button>\n </PopoverClose>\n </li>\n ))}\n {!list.length && (\n <li className=\"px-2 py-4 text-center text-xs text-muted-foreground\">\n Nenhuma mensagem com essa busca.\n </li>\n )}\n </ul>\n </>\n )\n}\n","import { Plus, Trash2 } from 'lucide-react'\nimport { useEffect, useId, useRef } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { Input } from '@/components/ui/input'\nimport { cn } from '@/lib/cn'\n\n/*\n * Lista de verificação editável: cada item é uma caixa de seleção mais um campo de texto (o\n * próprio nome do item), então criar, renomear, marcar e remover são todos operáveis só de\n * teclado, sem gesto especial.\n */\n\nexport interface ChecklistItem {\n id: string\n label: string\n checked: boolean\n}\n\nexport interface ChecklistProps {\n value: ChecklistItem[]\n onChange: (value: ChecklistItem[]) => void\n addLabel?: string\n disabled?: boolean\n id?: string\n className?: string\n 'aria-label'?: string\n}\n\n/** Uma lista de verificação por finalidade: itens de um checklist usam este componente. */\nexport function Checklist({\n value,\n onChange,\n addLabel = 'Adicionar item',\n disabled = false,\n id,\n className,\n ...aria\n}: ChecklistProps) {\n // Id de verdade, não crypto.randomUUID(): esse método só existe em contexto seguro\n // (HTTPS ou localhost) e quebra em produção atrás de HTTP puro.\n const baseId = useId()\n const nextIndex = useRef(0)\n const pendingFocusId = useRef<string | null>(null)\n\n useEffect(() => {\n if (!pendingFocusId.current) return\n const el = document.getElementById(`${pendingFocusId.current}-label`)\n el?.focus()\n pendingFocusId.current = null\n })\n\n const updateLabel = (itemId: string, label: string) =>\n onChange(value.map((item) => (item.id === itemId ? { ...item, label } : item)))\n\n const toggle = (itemId: string) =>\n onChange(value.map((item) => (item.id === itemId ? { ...item, checked: !item.checked } : item)))\n\n const remove = (itemId: string) => onChange(value.filter((item) => item.id !== itemId))\n\n const add = () => {\n nextIndex.current += 1\n const newId = `${baseId}item${nextIndex.current}`\n pendingFocusId.current = newId\n onChange([...value, { id: newId, label: '', checked: false }])\n }\n\n return (\n <div\n id={id}\n data-rendra=\"CKLT-001\"\n role=\"group\"\n aria-label={aria['aria-label']}\n className={cn('flex flex-col gap-2', className)}\n >\n {value.map((item, index) => (\n <div key={item.id} className=\"flex min-h-touch items-center gap-2 md:min-h-0\">\n <Checkbox\n checked={item.checked}\n onCheckedChange={() => toggle(item.id)}\n disabled={disabled}\n aria-label={item.label ? `Marcar ${item.label}` : `Marcar item ${index + 1}`}\n />\n <Input\n id={`${item.id}-label`}\n value={item.label}\n onChange={(v) => updateLabel(item.id, v)}\n placeholder=\"Descreva o item\"\n disabled={disabled}\n aria-label={`Nome do item ${index + 1}`}\n className=\"flex-1\"\n inputClassName={cn(item.checked && 'text-muted-foreground line-through')}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n icon={<Trash2 />}\n aria-label={`Remover item ${index + 1}`}\n disabled={disabled}\n onClick={() => remove(item.id)}\n />\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n icon={<Plus />}\n disabled={disabled}\n onClick={add}\n >\n {addLabel}\n </Button>\n </div>\n )\n}\n","/*\n * PALETA A PARTIR DE SEMENTES\n * ---------------------------\n * Uma paleta é só a cor da marca: 4 cores (primária e hover, secundária e hover) e o degradê\n * da marca (3 paradas, da luz ao fundo). Todo o resto é gerado aqui, com contraste WCAG AA\n * conferido e ajustado na geração: texto sobre cada cor, fundo suave, primária como texto,\n * foco, sidebar, degradês, gráficos, sombra e as superfícies do modo escuro.\n *\n * O que NÃO é da paleta (fica fixo em src/styles/theme.css, igual para todas):\n * - neutros do modo claro (fundo #f5f6f7, card branco, borda, texto);\n * - cores de sistema: sucesso, alerta, erro e informação;\n * - fonte e raio, que são do modelo (Safira, Equilíbrio ou Aurora).\n *\n * Usos:\n * - build: scripts/build-palettes.mjs gera src/styles/palettes.css com as paletas prontas\n * (src/brand/palettes.ts);\n * - tempo de execução (white label): applyPalette(sementes) injeta a paleta de um cliente\n * sem build, com o mesmo resultado.\n *\n * Este arquivo não importa nada: o script de build o lê direto com o Node.\n */\n\nexport interface PaletteSeeds {\n /** Identificador usado em data-palette no <html> (ex.: \"safira\", \"cliente-42\"). */\n id: string\n /** Nome curto exibido nos seletores. */\n name: string\n primary: string\n primaryHover: string\n secondary: string\n secondaryHover: string\n /** Degradê da marca (sidebar, painel do login, destaque): luz, meio e fundo. */\n gradient: [string, string, string]\n /**\n * Texto sobre a primária e a secundária. 'auto' (padrão) escolhe o que passa AA (branco\n * ou escuro); 'light' força texto branco e escurece a cor até passar; 'dark', o contrário.\n */\n onPrimary?: TextOn\n onSecondary?: TextOn\n}\n\nexport type TextOn = 'auto' | 'light' | 'dark'\nexport type PaletteVars = Record<string, string>\n\nexport interface Palette {\n seeds: PaletteSeeds\n light: PaletteVars\n dark: PaletteVars\n /** Logotipo adequado sobre a sidebar desta paleta. */\n sidebarLogo: 'light' | 'dark'\n /** Ajustes feitos para passar AA (ex.: \"secundária escurecida de #EA600D para #C94F0A\"). */\n adjustments: string[]\n}\n\n/* ------------------------------------------------------------------ cor */\n\ntype Rgb = [number, number, number]\n\n/**\n * Branco e tinta escura de referência. Exportados para o ColorPicker (A1) escolher, por\n * contraste, a cor do check sobre uma amostra livre do usuário (que não é do tema, então\n * não tem um par claro/escuro pronto): nenhum componente de fora de src/brand pode ter um\n * hexadecimal literal, então a comparação usa estas constantes em vez de repetir a cor.\n * O mesmo par vive em CSS como --rendra-swatch-check-light e --rendra-swatch-check-dark\n * (src/styles/globals.css); mude os dois lados juntos.\n */\nexport const WHITE = '#ffffff'\nconst BLACK = '#000000'\n/** Texto escuro padrão (o mesmo --foreground do theme.css). */\nexport const INK = '#0b1d37'\n/** Neutros fixos do modo claro, contra os quais a paleta é conferida. */\nconst LIGHT = { background: '#f5f6f7', card: '#ffffff' }\n/** Texto claro padrão do modo escuro. */\nconst INK_DARK = '#e8eff8'\n\nfunction toRgb(hex: string): Rgb {\n let h = hex.trim().replace('#', '')\n if (h.length === 3)\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n if (!/^[0-9a-f]{6}$/i.test(h)) throw new Error(`Cor inválida: ${hex} (use #RRGGBB)`)\n return [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16)) as Rgb\n}\n\nfunction toHex([r, g, b]: Rgb) {\n return `#${[r, g, b]\n .map((c) =>\n Math.round(Math.min(255, Math.max(0, c)))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`\n}\n\n/** Mistura em sRGB, como color-mix(in srgb): t = quanto de b entra (0 a 1). */\nexport function mix(a: string, b: string, t: number) {\n const x = toRgb(a)\n const y = toRgb(b)\n return toHex([0, 1, 2].map((i) => x[i]! + (y[i]! - x[i]!) * t) as Rgb)\n}\n\n/**\n * Amostras padrão do ColorPicker (A1): um ponto de partida variado, sem relação com a\n * paleta da marca. Hexadecimal fixo só pode existir aqui dentro (src/brand); o componente\n * (fora daqui) sempre recebe a lista por import, nunca com a cor escrita nele.\n */\nexport const COLOR_PICKER_SWATCHES: string[] = [\n '#0ea5e9',\n '#6366f1',\n '#8b5cf6',\n '#ec4899',\n '#ef4444',\n '#f97316',\n '#f59e0b',\n '#84cc16',\n '#10b981',\n '#14b8a6',\n '#64748b',\n '#0f172a',\n]\n\nfunction luminance(hex: string) {\n const lin = (c: number) => {\n const s = c / 255\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4\n }\n const [r, g, b] = toRgb(hex)\n return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b)\n}\n\n/** Contraste WCAG entre duas cores #RRGGBB. */\nexport function contrast(a: string, b: string) {\n const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x) as [number, number]\n return (hi + 0.05) / (lo + 0.05)\n}\n\nconst isDark = (hex: string) => contrast(hex, WHITE) >= contrast(hex, INK)\n\n/**\n * Leva `fg` em direção ao preto (toward 'dark') ou ao branco ('light') até ter `min` de\n * contraste com `bg`. Devolve a própria cor se já passar.\n */\nfunction reach(fg: string, bg: string, min: number, toward: 'dark' | 'light') {\n const end = toward === 'dark' ? BLACK : WHITE\n for (let t = 0; t <= 1.0001; t += 0.02) {\n const c = mix(fg, end, t)\n if (contrast(c, bg) >= min) return c\n }\n return end\n}\n\nconst rgbTriplet = (hex: string) => toRgb(hex).join(' ')\nconst alpha = (hex: string, a: number) => `rgb(${rgbTriplet(hex)} / ${a})`\n\n/* ------------------------------------------------------------------ geração */\n\n/** Cor de preenchimento com o texto por cima, ajustando a cor quando o texto é forçado. */\nfunction fill(color: string, on: TextOn, label: string, notes: string[]) {\n const base = color.toLowerCase()\n if (on === 'auto') {\n const text = isDark(base) ? WHITE : INK\n if (contrast(text, base) >= 4.5) return { fill: base, text }\n // Nenhum dos dois passa: escurece a cor para o branco passar.\n on = 'light'\n }\n const text = on === 'light' ? WHITE : INK\n const adjusted = reach(base, text, 4.5, on === 'light' ? 'dark' : 'light')\n if (adjusted !== base)\n notes.push(\n `${label}: ${base.toUpperCase()} ajustada para ${adjusted.toUpperCase()} (AA com texto ${on === 'light' ? 'branco' : 'escuro'})`,\n )\n return { fill: adjusted, text }\n}\n\n/** Gera as duas versões (claro e escuro) da paleta a partir das sementes. */\nexport function createPalette(seeds: PaletteSeeds): Palette {\n const notes: string[] = []\n const [g0, g1, g2] = seeds.gradient.map((c) => c.toLowerCase()) as [string, string, string]\n const P = seeds.primary.toLowerCase()\n const S = seeds.secondary.toLowerCase()\n\n const primary = fill(P, seeds.onPrimary ?? 'auto', 'Primária', notes)\n const primaryHover = fill(\n seeds.primaryHover,\n seeds.onPrimary ?? 'auto',\n 'Hover da primária',\n notes,\n )\n const secondary = fill(S, seeds.onSecondary ?? 'auto', 'Secundária', notes)\n const secondaryHover = fill(\n seeds.secondaryHover,\n seeds.onSecondary ?? 'auto',\n 'Hover da secundária',\n notes,\n )\n\n // Sidebar e degradê da marca: sempre coloridos, texto claro ou escuro conforme o fundo.\n const sidebarDark = isDark(g1)\n const sidebarText = sidebarDark ? mix(WHITE, g0, 0.06) : INK\n const sidebarFg = reach(sidebarText, g0, 7, sidebarDark ? 'light' : 'dark')\n const sidebarMuted = reach(mix(sidebarFg, g1, 0.3), g0, 4.5, sidebarDark ? 'light' : 'dark')\n // Item ativo: a primária, se ela aparece sobre a sidebar; senão, a secundária.\n // Indicador: a secundária, se ela aparece; senão, a primária.\n const active = contrast(P, g1) >= 2 ? P : S\n const indicator = reach(contrast(S, g1) >= 3 ? S : P, g1, 3, sidebarDark ? 'light' : 'dark')\n const brandGradient = `radial-gradient(120% 120% at 80% 0%, ${g0} 0%, ${g1} 45%, ${g2} 100%)`\n const onBrand = sidebarDark ? WHITE : INK\n\n const sidebar = {\n '--rendra-sidebar': g1,\n '--rendra-sidebar-image': brandGradient,\n '--rendra-sidebar-foreground': sidebarFg,\n '--rendra-sidebar-muted-foreground': sidebarMuted,\n '--rendra-sidebar-border': alpha(sidebarDark ? WHITE : INK, 0.14),\n '--rendra-sidebar-accent': alpha(sidebarDark ? WHITE : INK, 0.08),\n '--rendra-sidebar-active': alpha(active, 0.24),\n '--rendra-sidebar-active-foreground': onBrand,\n '--rendra-sidebar-indicator': indicator,\n '--rendra-gradient-brand': brandGradient,\n '--rendra-gradient-brand-foreground': onBrand,\n '--rendra-gradient-accent': `linear-gradient(90deg, ${P} 0%, ${S} 100%)`,\n }\n const brand = {\n '--rendra-primary': primary.fill,\n '--rendra-primary-foreground': primary.text,\n '--rendra-primary-hover': primaryHover.fill,\n '--rendra-primary-hover-foreground': primaryHover.text,\n '--rendra-secondary': secondary.fill,\n '--rendra-secondary-foreground': secondary.text,\n '--rendra-secondary-hover': secondaryHover.fill,\n '--rendra-secondary-hover-foreground': secondaryHover.text,\n }\n\n /* ---------- claro: sobre os neutros fixos (fundo #f5f6f7, card branco) */\n const softL = mix(P, WHITE, 0.9)\n const textL = reach(P, LIGHT.background, 4.5, 'dark')\n const light: PaletteVars = {\n ...brand,\n '--rendra-primary-soft': softL,\n '--rendra-primary-soft-foreground': reach(P, softL, 4.5, 'dark'),\n '--rendra-primary-text': textL,\n '--rendra-ring': textL,\n '--rendra-accent': mix(P, WHITE, 0.94),\n '--rendra-accent-foreground': INK,\n ...sidebar,\n '--rendra-gradient-soft': `linear-gradient(135deg, ${softL} 0%, ${LIGHT.card} 65%)`,\n '--rendra-chart-1': P,\n '--rendra-chart-2': S,\n '--rendra-chart-3': mix(P, WHITE, 0.45),\n '--rendra-chart-4': mix(P, BLACK, 0.35),\n '--rendra-chart-5': mix(S, BLACK, 0.3),\n '--rendra-shadow-color': rgbTriplet(g2),\n }\n\n /* ---------- escuro: superfícies tiradas do fundo do degradê, texto claro */\n // O brilho de cada superfície fica numa faixa fixa (contraste com o branco), para qualquer\n // degradê dar um escuro na medida: a cor vem do degradê, a luminosidade é sempre a mesma.\n const bgD = reach(g2, WHITE, 17.5, 'dark')\n const cardD = reach(mix(g2, g0, 0.14), WHITE, 15.5, 'dark')\n const popD = reach(mix(g2, g0, 0.2), WHITE, 14.5, 'dark')\n const mutedD = reach(mix(g2, g0, 0.26), WHITE, 13.5, 'dark')\n // Botões no escuro: a cor que some no fundo (menos de 3:1 com o card) fica mais clara,\n // e o texto por cima volta a ser escolhido para passar AA.\n const onDark = (color: string, label: string) => {\n if (contrast(color, cardD) >= 3) return fill(color, 'auto', label, [])\n return fill(reach(color, cardD, 3, 'light'), 'auto', label, [])\n }\n const pD = onDark(primary.fill, 'Primária')\n const phD = onDark(primaryHover.fill, 'Hover da primária')\n const sD = onDark(secondary.fill, 'Secundária')\n const shD = onDark(secondaryHover.fill, 'Hover da secundária')\n const brandDark = {\n '--rendra-primary': pD.fill,\n '--rendra-primary-foreground': pD.text,\n '--rendra-primary-hover': phD.fill,\n '--rendra-primary-hover-foreground': phD.text,\n '--rendra-secondary': sD.fill,\n '--rendra-secondary-foreground': sD.text,\n '--rendra-secondary-hover': shD.fill,\n '--rendra-secondary-hover-foreground': shD.text,\n }\n const softD = mix(cardD, P, 0.28)\n const textD = reach(mix(P, WHITE, 0.2), cardD, 4.5, 'light')\n const fgD = reach(INK_DARK, popD, 12, 'light')\n const dark: PaletteVars = {\n '--rendra-background': bgD,\n '--rendra-background-image': `radial-gradient(120% 80% at 80% 0%, ${reach(mix(g0, bgD, 0.45), WHITE, 12, 'dark')} 0%, ${reach(mix(g1, bgD, 0.4), WHITE, 16, 'dark')} 40%, ${bgD} 100%)`,\n '--rendra-foreground': fgD,\n '--rendra-card': cardD,\n '--rendra-card-foreground': fgD,\n '--rendra-popover': popD,\n '--rendra-popover-foreground': fgD,\n '--rendra-muted': mutedD,\n '--rendra-muted-foreground': reach(mix(fgD, mutedD, 0.35), mutedD, 4.5, 'light'),\n '--rendra-border': mix(cardD, WHITE, 0.12),\n '--rendra-input': reach(mix(cardD, WHITE, 0.32), cardD, 3, 'light'),\n '--rendra-field': mix(g2, BLACK, 0.1),\n '--rendra-overlay': alpha(mix(g2, BLACK, 0.6), 0.7),\n ...brandDark,\n '--rendra-primary-soft': softD,\n '--rendra-primary-soft-foreground': reach(mix(P, WHITE, 0.45), softD, 4.5, 'light'),\n '--rendra-primary-text': textD,\n '--rendra-ring': textD,\n '--rendra-accent': mix(cardD, WHITE, 0.06),\n '--rendra-accent-foreground': fgD,\n ...sidebar,\n '--rendra-sidebar': mix(g2, BLACK, 0.1),\n '--rendra-gradient-soft': `linear-gradient(135deg, ${softD} 0%, ${cardD} 65%)`,\n '--rendra-chart-1': reach(P, cardD, 3, 'light'),\n '--rendra-chart-2': reach(S, cardD, 3, 'light'),\n '--rendra-chart-3': mix(P, WHITE, 0.45),\n '--rendra-chart-4': mix(P, WHITE, 0.72),\n '--rendra-chart-5': reach(mix(S, WHITE, 0.3), cardD, 3, 'light'),\n '--rendra-shadow-color': '0 0 0',\n }\n\n return { seeds, light, dark, sidebarLogo: sidebarDark ? 'dark' : 'light', adjustments: notes }\n}\n\n/* ------------------------------------------------------------------ CSS */\n\nconst block = (selector: string, vars: PaletteVars) =>\n `${selector} {\\n${Object.entries(vars)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n')}\\n}\\n`\n\n/**\n * CSS da paleta. `isDefault` também aplica a paleta quando o <html> ainda não tem\n * data-palette (primeira pintura).\n */\nexport function paletteCss(palette: Palette, isDefault = false) {\n const id = palette.seeds.id\n const light = isDefault\n ? `:root:not([data-palette]),\\n:root[data-palette='${id}']`\n : `:root[data-palette='${id}']`\n const dark = isDefault\n ? `:root:not([data-palette]).dark,\\n:root[data-palette='${id}'].dark`\n : `:root[data-palette='${id}'].dark`\n const notes = palette.adjustments.length\n ? `/* Ajustes de contraste: ${palette.adjustments.join('; ')}. */\\n`\n : ''\n return `/* ${palette.seeds.name} */\\n${notes}${block(light, palette.light)}\\n${block(dark, palette.dark)}`\n}\n\n/**\n * White label em tempo de execução: gera a paleta de um cliente e a injeta na página\n * (um <style> por paleta), sem build. Depois é só usar data-palette com o id dela.\n * Devolve a paleta gerada, com os ajustes de contraste feitos.\n */\nexport function applyPalette(seeds: PaletteSeeds, doc: Document = document) {\n const palette = createPalette(seeds)\n const attr = 'data-palette-runtime'\n let style = doc.head.querySelector<HTMLStyleElement>(`style[${attr}=\"${seeds.id}\"]`)\n if (!style) {\n style = doc.createElement('style')\n style.setAttribute(attr, seeds.id)\n doc.head.appendChild(style)\n }\n style.textContent = paletteCss(palette)\n return palette\n}\n","import { Check } from 'lucide-react'\nimport { forwardRef, useEffect, useState, type CSSProperties } from 'react'\nimport { COLOR_PICKER_SWATCHES, contrast, INK, WHITE } from '@/brand/palette'\nimport { Input } from '@/components/ui/input'\nimport { PickerPanel } from '@/components/ui/picker-panel'\nimport { cn } from '@/lib/cn'\nimport { controlFrame } from '@/lib/control'\n\n/*\n * Seletor de cor único do sistema (A1 do plano da v2). Amostras fixas com padrão de marca\n * e uma cor livre por campo hexadecimal, no mesmo painel do Select e do DatePicker\n * (PickerPanel): popover no desktop, bottom sheet no mobile.\n */\n\nconst HEX_PATTERN = /^#?[0-9a-f]{6}$/i\n\n/**\n * #rrggbb minúsculo, ou null quando o texto não é um hexadecimal válido de 6 dígitos.\n * Aceita com ou sem o \"#\" na frente (o campo livre também aceita \"0ea5e9\").\n */\nfunction normalizeHex(value: string): string | null {\n const v = value.trim()\n if (!HEX_PATTERN.test(v)) return null\n const digits = v.startsWith('#') ? v.slice(1) : v\n return `#${digits.toLowerCase()}`\n}\n\nexport interface ColorPickerProps {\n /** Cor atual, #rrggbb. */\n value?: string\n /** Só chama com hexadecimal válido, sempre em minúsculas. */\n onChange?: (hex: string) => void\n /** Amostras fixas oferecidas antes da cor livre. */\n swatches?: string[]\n disabled?: boolean\n /** Nome acessível do grupo de amostras e do campo. */\n 'aria-label'?: string\n className?: string\n}\n\n/**\n * Amostra de cor: quadrado com a cor via variável CSS (a única forma de estilo inline\n * permitida) e, quando selecionada, um anel e um check cuja cor (clara ou escura) segue o\n * contraste da própria amostra, nunca um tom fixo do tema.\n */\nfunction Swatch({\n hex,\n selected,\n disabled,\n onSelect,\n}: {\n hex: string\n selected: boolean\n disabled?: boolean\n onSelect: () => void\n}) {\n const useLightCheck = contrast(hex, WHITE) >= contrast(hex, INK)\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onSelect}\n aria-pressed={selected}\n aria-label={hex}\n style={{ '--rendra-swatch': hex } as CSSProperties}\n className={cn(\n 'relative size-touch shrink-0 rounded-item border bg-swatch transition-shadow outline-none',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-popover',\n selected && 'ring-2 ring-primary ring-offset-2 ring-offset-popover',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {selected && (\n <Check\n aria-hidden\n className={cn(\n 'absolute inset-0 m-auto size-icon-sm',\n useLightCheck ? 'swatch-check-light' : 'swatch-check-dark',\n )}\n />\n )}\n </button>\n )\n}\n\nexport const ColorPicker = forwardRef<HTMLButtonElement, ColorPickerProps>(function ColorPicker(\n {\n value,\n onChange,\n swatches = COLOR_PICKER_SWATCHES,\n disabled,\n 'aria-label': ariaLabel = 'Cor',\n className,\n },\n ref,\n) {\n const [open, setOpen] = useState(false)\n const [draft, setDraft] = useState(value ?? '')\n\n useEffect(() => setDraft(value ?? ''), [value])\n\n const current = value ? normalizeHex(value) : null\n\n const pick = (hex: string) => {\n const n = normalizeHex(hex)\n if (!n) return\n onChange?.(n)\n setOpen(false)\n }\n\n const trigger = (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel}\n data-rendra=\"COR-001\"\n className={cn(\n controlFrame({ size: 'md' }),\n 'cursor-pointer justify-start disabled:cursor-not-allowed disabled:opacity-60',\n className,\n )}\n >\n <span\n aria-hidden\n className=\"size-icon-md shrink-0 rounded-item border bg-swatch\"\n style={current ? ({ '--rendra-swatch': current } as CSSProperties) : undefined}\n />\n <span className=\"truncate font-mono text-sm\">{current ?? 'Selecione uma cor'}</span>\n </button>\n )\n\n return (\n <PickerPanel\n open={open}\n onOpenChange={(o) => setOpen(o && !disabled)}\n trigger={trigger}\n title={ariaLabel}\n >\n <div className=\"flex flex-col gap-4 p-2\">\n <div role=\"group\" aria-label={ariaLabel} className=\"flex flex-wrap gap-2\">\n {swatches.map((hex) => {\n const n = normalizeHex(hex) ?? hex.toLowerCase()\n return (\n <Swatch\n key={n}\n hex={n}\n selected={current === n}\n disabled={disabled}\n onSelect={() => pick(n)}\n />\n )\n })}\n </div>\n <Input\n aria-label={`${ariaLabel}: cor livre (hexadecimal)`}\n placeholder=\"Hexadecimal (ex.: 0ea5e9)\"\n value={draft}\n disabled={disabled}\n onChange={(v) => {\n setDraft(v)\n const n = normalizeHex(v)\n if (n) onChange?.(n)\n }}\n />\n </div>\n </PickerPanel>\n )\n})\n","import { Switch as S } from 'radix-ui'\nimport { useId, type ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface SwitchProps {\n checked?: boolean\n defaultChecked?: boolean\n onCheckedChange?: (checked: boolean) => void\n label?: ReactNode\n description?: ReactNode\n disabled?: boolean\n id?: string\n name?: string\n className?: string\n 'aria-label'?: string\n}\n\n/** Switch único, com rótulo e descrição à esquerda e a chave à direita. */\nexport function Switch({\n checked,\n defaultChecked,\n onCheckedChange,\n label,\n description,\n disabled,\n id,\n name,\n className,\n ...aria\n}: SwitchProps) {\n const auto = useId()\n const sid = id ?? `sw${auto}`\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const rootCls =\n 'relative inline-flex h-6 w-12 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent bg-input transition-colors disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary max-md:before:absolute max-md:before:-inset-3'\n const thumbBase =\n 'pointer-events-none block size-icon-md rounded-full bg-card shadow-sm duration-(--rendra-duration-base) ease-move data-[state=checked]:translate-x-6'\n // `off`: o CSS anima tudo (deslocamento e escala do toque). `on`: o CSS só transiciona\n // `translate`; o `transform` é do Motion, e uma transição de CSS nele (W1) faria cada quadro\n // gravado virar uma transição de 200 ms e o toque chegaria mole.\n const thumbCls = cn(thumbBase, lib ? 'transition-[translate]' : 'transition-transform')\n // `on`: o toque fica no Root (o polegar tem pointer-events-none, então um whileTap nele nunca\n // dispararia) e chega ao polegar por variants. O deslocamento é a propriedade CSS `translate`\n // (Tailwind v4) e o Motion grava `transform`: as duas se compõem, não se anulam.\n const tap = presets.tap\n const control = lib ? (\n <S.Root\n asChild\n id={sid}\n name={name}\n checked={checked}\n defaultChecked={defaultChecked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n aria-label={aria['aria-label']}\n data-touch=\"expanded\"\n data-rendra=\"SWT-001\"\n >\n <lib.m.button\n type=\"button\"\n className={rootCls}\n initial=\"rest\"\n animate=\"rest\"\n whileTap={tap ? 'tap' : undefined}\n >\n <S.Thumb asChild>\n <lib.m.span\n className={thumbCls}\n variants={{ rest: { scale: 1 }, tap: { scale: tap ? 1.15 : 1 } }}\n transition={presets.press.transition}\n />\n </S.Thumb>\n </lib.m.button>\n </S.Root>\n ) : (\n <S.Root\n id={sid}\n name={name}\n checked={checked}\n defaultChecked={defaultChecked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n aria-label={aria['aria-label']}\n data-touch=\"expanded\"\n data-rendra=\"SWT-001\"\n className={rootCls}\n >\n <S.Thumb className={thumbCls} />\n </S.Root>\n )\n if (!label) return control\n return (\n <label\n htmlFor={sid}\n className={cn(\n 'flex min-h-touch cursor-pointer items-center justify-between gap-4 py-3 md:min-h-0 md:py-2',\n disabled && 'cursor-not-allowed opacity-60',\n className,\n )}\n >\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"text-sm font-medium\">{label}</span>\n {description && <span className=\"text-sm text-muted-foreground\">{description}</span>}\n </span>\n {control}\n </label>\n )\n}\n","import { Columns3, Filter, Search, X } from 'lucide-react'\nimport { useState, type ReactNode } from 'react'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Button } from '@/components/ui/button'\nimport { Drawer } from '@/components/ui/drawer'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Input } from '@/components/ui/input'\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'\nimport { Switch } from '@/components/ui/switch'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\n\n/*\n * Barra de ferramentas de listagem. Fica dentro do mesmo card do conteúdo, acima dele.\n * Ordem: busca à esquerda; à direita, ações secundárias, Colunas, Filtros e, por último,\n * a ação principal (Novo). Abaixo, chips dos filtros. A ação principal da listagem mora\n * aqui, nunca solta acima do card.\n * Mobile: busca na largura total; embaixo, Filtros (30%) e a ação principal (70%).\n * Filtros, ordenação e colunas viram um único botão com contador, que abre um drawer.\n */\n\nexport interface FilterChip {\n id: string\n label: string\n onRemove: () => void\n}\n\nexport interface ToolbarColumn {\n id: string\n label: string\n visible: boolean\n onToggle: (visible: boolean) => void\n}\n\nexport interface DataToolbarProps {\n search?: { value: string; onChange: (v: string) => void; placeholder?: string }\n /** Conteúdo dos filtros: popover no desktop, drawer em tela cheia no mobile. */\n filters?: ReactNode\n /** Quantos filtros estão aplicados (contador no botão). */\n filterCount?: number\n onClearFilters?: () => void\n /** Chips dos filtros aplicados. */\n chips?: FilterChip[]\n /** Ordenação (vai para o drawer no mobile). */\n sort?: ReactNode\n /** Colunas que o usuário pode mostrar ou ocultar. */\n columns?: ToolbarColumn[]\n /** Ações secundárias à direita (exportar etc.). No mobile, numa linha abaixo. */\n actions?: ReactNode\n /**\n * Resumo logo depois da busca (ex.: totais de um quadro). No desktop fica entre a busca e as\n * ações; no mobile, numa linha própria abaixo da busca. Sem ele, nada é desenhado.\n */\n summary?: ReactNode\n /** Ação principal da listagem (ex.: Novo cliente). Sempre a última à direita. */\n primaryAction?: ReactNode\n /** Substitui a barra quando há itens selecionados (ações em massa, só desktop). */\n selectionBar?: ReactNode\n}\n\nexport function DataToolbar({\n search,\n filters,\n filterCount = 0,\n onClearFilters,\n chips = [],\n sort,\n columns,\n actions,\n summary,\n primaryAction,\n selectionBar,\n}: DataToolbarProps) {\n const { isMobile } = useBreakpoint()\n const [drawer, setDrawer] = useState(false)\n const hasPanel = Boolean(filters || sort || columns?.length)\n\n const columnsMenu = columns?.length ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" icon={<Columns3 />}>\n Colunas\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Colunas visíveis</DropdownMenuLabel>\n {columns.map((c) => (\n <DropdownMenuCheckboxItem\n key={c.id}\n checked={c.visible}\n onCheckedChange={(v) => c.onToggle(v === true)}\n onSelect={(e) => e.preventDefault()}\n >\n {c.label}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null\n\n const filterButton = (onClick?: () => void) => (\n <Button variant=\"outline\" icon={<Filter />} onClick={onClick}>\n Filtros\n {filterCount > 0 && (\n <span className=\"rounded-full bg-primary px-2 text-xs text-primary-foreground tabular-nums\">\n {filterCount}\n </span>\n )}\n </Button>\n )\n\n return (\n <div data-rendra=\"DTB-001\" className=\"flex flex-col gap-3 border-b p-4\">\n {selectionBar && !isMobile ? (\n <div className=\"flex min-h-control-md flex-wrap items-center gap-3\">{selectionBar}</div>\n ) : (\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center\">\n {search && (\n <Input\n icon={<Search />}\n clearable\n value={search.value}\n onChange={search.onChange}\n placeholder={search.placeholder ?? 'Buscar'}\n aria-label={search.placeholder ?? 'Buscar'}\n type=\"search\"\n className=\"md:w-3xs lg:w-sm\"\n />\n )}\n\n {summary && (\n <div data-toolbar-summary className=\"flex flex-col gap-1 text-sm\">\n {summary}\n </div>\n )}\n\n {isMobile ? (\n <>\n {(hasPanel || primaryAction) && (\n <div\n className={cn(\n 'grid gap-3',\n hasPanel && primaryAction ? 'grid-actions-2' : 'grid-cols-1',\n )}\n >\n {hasPanel && filterButton(() => setDrawer(true))}\n {primaryAction}\n </div>\n )}\n {actions && <div className=\"flex flex-wrap gap-3 *:flex-1\">{actions}</div>}\n </>\n ) : (\n <div className=\"flex flex-wrap items-center gap-2 md:ml-auto\">\n {actions}\n {columnsMenu}\n {sort}\n {filters && (\n <Popover>\n <PopoverTrigger asChild>{filterButton()}</PopoverTrigger>\n <PopoverContent align=\"end\" className=\"flex flex-col\">\n <div className=\"max-h-command overflow-y-auto p-4\">{filters}</div>\n {onClearFilters && filterCount > 0 && (\n <div className=\"border-t p-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onClearFilters}>\n Limpar filtros\n </Button>\n </div>\n )}\n </PopoverContent>\n </Popover>\n )}\n {primaryAction}\n </div>\n )}\n </div>\n )}\n\n {chips.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {chips.map((c) => (\n <span\n key={c.id}\n className=\"inline-flex items-center gap-1 rounded-item border bg-muted py-1 pr-1 pl-2 text-xs font-medium\"\n >\n {c.label}\n <button\n type=\"button\"\n onClick={c.onRemove}\n aria-label={`Remover filtro ${c.label}`}\n className=\"flex size-6 cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-card hover:text-foreground max-md:-my-3 max-md:size-touch\"\n >\n <X className=\"size-3\" aria-hidden />\n </button>\n </span>\n ))}\n {onClearFilters && (\n <Button variant=\"link\" size=\"sm\" onClick={onClearFilters}>\n Limpar filtros\n </Button>\n )}\n </div>\n )}\n\n {isMobile && hasPanel && (\n <Drawer\n open={drawer}\n onOpenChange={setDrawer}\n title=\"Filtros\"\n icon={<Filter />}\n size=\"full\"\n footer={\n <ActionBar\n cancel={onClearFilters ? { label: 'Limpar', onClick: onClearFilters } : undefined}\n primary={{ label: 'Ver resultados', onClick: () => setDrawer(false) }}\n />\n }\n >\n <div className=\"flex flex-col gap-8\">\n {filters && <div className=\"flex flex-col gap-4\">{filters}</div>}\n {sort && (\n <div className=\"flex flex-col gap-3\">\n <p className=\"text-sm font-semibold\">Ordenar por</p>\n {sort}\n </div>\n )}\n {columns?.length ? (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-sm font-semibold\">Campos no card</p>\n {columns.map((c) => (\n <Switch\n key={c.id}\n label={c.label}\n checked={c.visible}\n onCheckedChange={c.onToggle}\n />\n ))}\n </div>\n ) : null}\n </div>\n </Drawer>\n )}\n </div>\n )\n}\n","import { format } from 'date-fns'\nimport { CalendarDays, X } from 'lucide-react'\nimport { forwardRef, useState } from 'react'\nimport { DayPicker, type DateRange } from 'react-day-picker'\nimport { ptBR } from 'react-day-picker/locale'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/field'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\nimport {\n controlAdornmentButton,\n controlAdornmentSpace,\n controlFrame,\n type ControlSize,\n} from '@/lib/control'\nimport { PickerPanel } from './picker-panel'\n\nexport type { DateRange }\n\ninterface BaseProps {\n placeholder?: string\n /** Título do painel no mobile. */\n label?: string\n size?: ControlSize\n invalid?: boolean\n disabled?: boolean\n /** Com horário (campo HH:MM no painel). */\n time?: boolean\n minDate?: Date\n maxDate?: Date\n /**\n * Seletores de mês e ano no topo do calendário (padrão: ligado), para chegar rápido\n * a datas distantes, como data de nascimento, sem voltar mês a mês.\n */\n dropdowns?: boolean\n clearable?: boolean\n id?: string\n className?: string\n 'aria-describedby'?: string\n}\ninterface SingleProps extends BaseProps {\n range?: false\n value?: Date | null\n onChange?: (value: Date | null) => void\n}\ninterface RangeProps extends BaseProps {\n /** Seleção de período (início e fim). */\n range: true\n value?: DateRange | null\n onChange?: (value: DateRange | null) => void\n}\nexport type DatePickerProps = SingleProps | RangeProps\n\nconst fmtDate = (d: Date) => format(d, 'dd/MM/yyyy')\nconst fmtTime = (d: Date) => format(d, 'HH:mm')\n\nfunction withTime(d: Date | undefined, hhmm: string) {\n if (!d) return d\n const [h, m] = hhmm.split(':').map(Number)\n const n = new Date(d)\n n.setHours(Number.isFinite(h) ? (h ?? 0) : 0, Number.isFinite(m) ? (m ?? 0) : 0, 0, 0)\n return n\n}\n\n/**\n * DatePicker único em pt-BR: data, período (range) e horário (time) são props.\n * Desktop: calendário em popover (dois meses no período). Mobile: bottom sheet.\n */\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(\n function DatePicker(props, ref) {\n const {\n placeholder = props.range ? 'Selecione o período' : 'Selecione a data',\n label,\n size,\n invalid,\n disabled,\n time,\n minDate,\n maxDate,\n dropdowns = true,\n clearable,\n id,\n className,\n } = props\n const { isMobile } = useBreakpoint()\n const [open, setOpen] = useState(false)\n const [inner, setInner] = useState<Date | DateRange | null>(null)\n const committed = (props.value !== undefined ? props.value : inner) ?? null\n const [draft, setDraft] = useState<Date | DateRange | undefined>(undefined)\n const [t1, setT1] = useState('09:00')\n const [t2, setT2] = useState('18:00')\n\n const commit = (v: Date | DateRange | null) => {\n setInner(v)\n if (props.range) props.onChange?.(v as DateRange | null)\n else props.onChange?.(v as Date | null)\n }\n\n const onOpenChange = (o: boolean) => {\n setOpen(o)\n if (o) {\n setDraft(committed ?? undefined)\n if (committed instanceof Date) setT1(fmtTime(committed))\n else if (committed && 'from' in committed) {\n if (committed.from) setT1(fmtTime(committed.from))\n if (committed.to) setT2(fmtTime(committed.to))\n }\n }\n }\n\n const apply = () => {\n if (props.range) {\n const r = draft as DateRange | undefined\n commit(\n r?.from\n ? {\n from: time ? withTime(r.from, t1) : r.from,\n to: time ? withTime(r.to, t2) : r.to,\n }\n : null,\n )\n } else {\n const d = draft as Date | undefined\n commit(d ? (time ? (withTime(d, t1) ?? null) : d) : null)\n }\n setOpen(false)\n }\n\n // Texto do campo\n let text: string | null = null\n if (committed instanceof Date) {\n text = fmtDate(committed) + (time ? ` ${fmtTime(committed)}` : '')\n } else if (committed?.from) {\n const a = fmtDate(committed.from) + (time ? ` ${fmtTime(committed.from)}` : '')\n const b = committed.to\n ? fmtDate(committed.to) + (time ? ` ${fmtTime(committed.to)}` : '')\n : '...'\n text = `${a} a ${b}`\n }\n\n const disabledDays = [\n ...(minDate ? [{ before: minDate }] : []),\n ...(maxDate ? [{ after: maxDate }] : []),\n ]\n const immediate = !props.range && !time && !isMobile\n\n // Faixa dos seletores de ano: de 1900 (ou minDate) até 10 anos à frente (ou maxDate).\n const navigation = dropdowns\n ? {\n captionLayout: 'dropdown' as const,\n startMonth: minDate ?? new Date(1900, 0, 1),\n endMonth: maxDate ?? new Date(new Date().getFullYear() + 10, 11, 31),\n }\n : {}\n\n const classNames = {\n root: 'relative p-2',\n dropdowns: 'flex items-center gap-2',\n dropdown_root:\n 'relative inline-flex h-control-sm items-center rounded-item border border-input bg-field px-2 text-sm font-medium focus-within:ring-2 focus-within:ring-ring',\n // Fundo e texto explícitos: a lista nativa não herda o fundo transparente do tema escuro.\n dropdown:\n 'absolute inset-0 w-full cursor-pointer bg-popover text-popover-foreground opacity-0 [&_option]:bg-popover [&_option]:text-popover-foreground',\n caption_label: 'inline-flex items-center gap-1 capitalize [&>svg]:size-icon-sm',\n months: 'flex flex-col gap-6 md:flex-row',\n month: 'flex flex-col gap-3',\n month_caption:\n 'flex h-control-sm items-center justify-center text-sm font-semibold capitalize',\n nav: 'absolute inset-x-2 top-2 flex justify-between',\n button_previous:\n 'flex size-control-sm cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-40',\n button_next:\n 'flex size-control-sm cursor-pointer items-center justify-center rounded-item text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-40',\n chevron: 'size-icon-sm fill-current',\n month_grid: 'border-collapse',\n weekdays: 'flex',\n weekday:\n 'w-touch py-1 text-center text-xs font-medium text-muted-foreground capitalize md:w-control-md',\n week: 'mt-1 flex',\n day: 'p-0 text-center',\n day_button:\n 'size-touch cursor-pointer rounded-item text-sm tabular-nums transition-colors hover:bg-accent disabled:cursor-not-allowed md:size-control-md',\n selected:\n '[&>button]:bg-primary [&>button]:font-medium [&>button]:text-primary-foreground [&>button]:hover:bg-primary-hover [&>button]:hover:text-primary-hover-foreground',\n range_start: '[&>button]:bg-primary [&>button]:text-primary-foreground',\n range_end: '[&>button]:bg-primary [&>button]:text-primary-foreground',\n range_middle:\n '[&>button]:rounded-none [&>button]:bg-primary-soft [&>button]:text-primary-soft-foreground [&>button]:hover:bg-primary-soft',\n today: '[&>button]:font-semibold [&>button]:text-primary-text',\n outside: 'opacity-40',\n disabled: 'opacity-30',\n }\n\n const calendar = props.range ? (\n <DayPicker\n mode=\"range\"\n locale={ptBR}\n selected={draft as DateRange | undefined}\n onSelect={(r) => setDraft(r)}\n numberOfMonths={isMobile ? 1 : 2}\n defaultMonth={(draft as DateRange | undefined)?.from}\n disabled={disabledDays}\n showOutsideDays\n classNames={classNames}\n {...navigation}\n />\n ) : (\n <DayPicker\n mode=\"single\"\n locale={ptBR}\n selected={draft as Date | undefined}\n onSelect={(d) => {\n setDraft(d)\n if (immediate) {\n commit(d ?? null)\n setOpen(false)\n }\n }}\n defaultMonth={draft as Date | undefined}\n disabled={disabledDays}\n showOutsideDays\n classNames={classNames}\n {...navigation}\n />\n )\n\n const showClear = clearable && !!text && !disabled\n const clear = showClear ? (\n <button\n type=\"button\"\n aria-label=\"Limpar data\"\n className={cn(\n controlAdornmentButton,\n 'absolute top-1/2 right-1 mr-0 -translate-y-1/2 md:right-2 md:mr-0',\n )}\n onClick={() => commit(null)}\n >\n <X aria-hidden />\n </button>\n ) : undefined\n\n const trigger = (\n <button\n ref={ref}\n id={id}\n type=\"button\"\n data-rendra=\"DTP-001\"\n disabled={disabled}\n data-invalid={invalid || undefined}\n aria-describedby={props['aria-describedby']}\n aria-haspopup=\"dialog\"\n className={cn(\n controlFrame({ size, invalid }),\n 'cursor-pointer text-left disabled:cursor-not-allowed disabled:opacity-60',\n className,\n )}\n >\n <CalendarDays className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n <span\n className={cn('min-w-0 flex-1 truncate tabular-nums', !text && 'text-muted-foreground')}\n >\n {text ?? placeholder}\n </span>\n {showClear && <span aria-hidden className={cn(controlAdornmentSpace, '-mr-2 md:-mr-1')} />}\n </button>\n )\n\n const footer = immediate ? undefined : (\n <div className=\"flex flex-col gap-3\">\n {time && (\n <div className={cn('grid gap-3', props.range ? 'grid-cols-2' : 'grid-cols-1')}>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor={`${id ?? 'data'}-hora-1`}>\n {props.range ? 'Hora inicial' : 'Horário'}\n </Label>\n <Input\n id={`${id ?? 'data'}-hora-1`}\n mask=\"time\"\n value={t1}\n onChange={setT1}\n size=\"sm\"\n />\n </div>\n {props.range && (\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor={`${id ?? 'data'}-hora-2`}>Hora final</Label>\n <Input\n id={`${id ?? 'data'}-hora-2`}\n mask=\"time\"\n value={t2}\n onChange={setT2}\n size=\"sm\"\n />\n </div>\n )}\n </div>\n )}\n <div className=\"grid grid-actions-2 gap-3\">\n <Button variant=\"outline\" onClick={() => setDraft(undefined)}>\n Limpar\n </Button>\n <Button onClick={apply}>Aplicar</Button>\n </div>\n </div>\n )\n\n return (\n <PickerPanel\n open={open}\n onOpenChange={onOpenChange}\n trigger={trigger}\n adornment={clear}\n title={label ?? placeholder}\n footer={footer}\n width=\"auto\"\n >\n <div className=\"flex justify-center\">{calendar}</div>\n </PickerPanel>\n )\n },\n)\n","import { ArrowLeft, Home, RotateCw } from 'lucide-react'\nimport { useRendraLink, useRendraNavigate } from '@/components/rendra-provider'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@/lib/cn'\n\nconst content = {\n 404: {\n type: 'warning' as const,\n title: 'Página não encontrada',\n description:\n 'O endereço pode ter mudado ou a página foi removida. Confira o link ou volte ao painel.',\n },\n 500: {\n type: 'error' as const,\n title: 'Algo deu errado do nosso lado',\n description: 'Não foi possível carregar esta tela agora. Tente de novo em instantes.',\n },\n}\n\nexport interface ErrorPageProps {\n code: 404 | 500\n /** Título próprio no lugar do padrão. */\n title?: string\n description?: string\n /** Ocupa a tela inteira (fora do AppShell). */\n fullScreen?: boolean\n /**\n * Mostra o botão Voltar (padrão). Com `false` só a ação principal é desenhada, na largura\n * toda (regra \"um botão = 100%\").\n */\n back?: boolean\n}\n\n/**\n * Tela de erro única (404 e 500), com o ícone de feedback da marca animado.\n * Ações seguem a regra 30/70: secundária à esquerda, principal à direita.\n */\nexport function ErrorPage({\n code,\n title,\n description,\n fullScreen = false,\n back = true,\n}: ErrorPageProps) {\n const Link = useRendraLink()\n const { goBack } = useRendraNavigate()\n const c = content[code]\n // Sem o Voltar, a ação principal é o único botão: 100% da largura.\n const principal = back ? 'col-span-7' : 'col-span-10'\n\n return (\n <div\n data-rendra=\"ERRO-001\"\n className={cn(\n 'flex w-full items-center justify-center px-4 py-12',\n fullScreen ? 'min-h-dvh' : 'min-h-full',\n )}\n >\n <div className=\"flex w-full max-w-md flex-col items-center gap-6 text-center\">\n <div className=\"relative flex items-center justify-center\">\n <span aria-hidden className=\"absolute size-24 rounded-full bg-gradient-soft\" />\n <BrandFeedbackIcon type={c.type} size=\"2xl\" animated className=\"relative\" />\n </div>\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-sm font-medium tracking-wide text-muted-foreground tabular-nums\">\n Erro {code}\n </p>\n <h1 className=\"text-2xl md:text-3xl\">{title ?? c.title}</h1>\n <p className=\"text-base text-muted-foreground\">{description ?? c.description}</p>\n </div>\n <div className=\"grid w-full grid-cols-10 gap-3\">\n {back && (\n <Button\n variant=\"outline\"\n icon={<ArrowLeft />}\n className=\"col-span-3\"\n onClick={goBack}\n aria-label=\"Voltar\"\n >\n <span className=\"hidden sm:inline\">Voltar</span>\n </Button>\n )}\n {code === 500 ? (\n <Button icon={<RotateCw />} className={principal} onClick={() => location.reload()}>\n Tentar de novo\n </Button>\n ) : (\n <Button asChild className={principal}>\n <Link to=\"/\">\n <Home aria-hidden />\n Ir para o painel\n </Link>\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n FormProvider,\n useController,\n useFormContext,\n type FieldPath,\n type FieldValues,\n type SubmitHandler,\n type UseFormReturn,\n} from 'react-hook-form'\nimport { fieldGridClass, gapClass } from '@/components/layout/tokens'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Field, type FieldProps } from '@/components/ui/field'\nimport { cn } from '@/lib/cn'\n\n/*\n * Integração com React Hook Form + Zod.\n * const form = useForm({ resolver: zodResolver(schema), mode: 'onTouched' })\n * <Form form={form} onSubmit={salvar}>\n * <FormSection title=\"Dados principais\">\n * <FormField name=\"nome\" label=\"Nome\" required render={(f) => <Input {...f} />} />\n * </FormSection>\n * <ActionBar sticky primary={{ label: 'Salvar', type: 'submit', loading: isSubmitting }} />\n * </Form>\n */\n\ninterface FormProps<T extends FieldValues> {\n form: UseFormReturn<T>\n onSubmit: SubmitHandler<T>\n children: ReactNode\n id?: string\n className?: string\n}\n\nexport function Form<T extends FieldValues>({\n form,\n onSubmit,\n children,\n id,\n className,\n}: FormProps<T>) {\n return (\n <FormProvider {...form}>\n <form\n id={id}\n noValidate\n onSubmit={form.handleSubmit(onSubmit)}\n data-rendra=\"FORM-001\"\n className={cn('flex min-w-0 flex-col gap-8 md:gap-12', className)}\n >\n {children}\n </form>\n </FormProvider>\n )\n}\n\n/** Props que o render recebe: prontas para espalhar em Input, Select, DatePicker etc. */\nexport interface FormControlProps<V = unknown> {\n name: string\n value: V\n onChange: (value: V) => void\n onBlur: () => void\n invalid: boolean\n ref: (el: unknown) => void\n}\n\ninterface FormFieldProps<T extends FieldValues> extends Omit<FieldProps, 'children' | 'error'> {\n name: FieldPath<T>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n render: (field: FormControlProps<any>) => ReactNode\n}\n\nexport function FormField<T extends FieldValues>({\n name,\n render,\n ...fieldProps\n}: FormFieldProps<T>) {\n const { control } = useFormContext<T>()\n const { field, fieldState } = useController({ name, control })\n return (\n <Field {...fieldProps} error={fieldState.error?.message}>\n {render({\n name: field.name,\n value: field.value,\n onChange: field.onChange,\n onBlur: field.onBlur,\n invalid: Boolean(fieldState.error),\n ref: field.ref,\n })}\n </Field>\n )\n}\n\ninterface FormSectionProps {\n title: ReactNode\n /** Subtítulo curto da seção. Instrução de uso vai em `help`. */\n description?: ReactNode\n /** Texto orientativo: ícone de informação ao lado do título, que abre um modal. */\n help?: ReactNode\n /**\n * 1: todos os campos em largura total (texto longo, cartões de seleção, anexos).\n * Sem valor: grade de formulário, com a largura de cada campo no span do Field.\n */\n columns?: 1 | 2\n children: ReactNode\n id?: string\n}\n\n/** Seção de formulário: card com título e a grade de formulário (3 campos por linha no largo). */\nexport function FormSection({ title, description, help, columns, children, id }: FormSectionProps) {\n return (\n <Card id={id} data-rendra=\"FORM-002\" className=\"scroll-mt-6\">\n <CardHeader>\n <CardTitle help={help}>{title}</CardTitle>\n {description && <CardDescription>{description}</CardDescription>}\n </CardHeader>\n <CardContent>\n <div className={columns === 1 ? undefined : '@container'}>\n <div className={cn(columns === 1 ? 'grid grid-cols-1' : fieldGridClass, gapClass.fields)}>\n {children}\n </div>\n </div>\n </CardContent>\n </Card>\n )\n}\n","import { Slider as S } from 'radix-ui'\nimport { cn } from '@/lib/cn'\n\nexport interface SliderProps {\n /** Um número, ou dois para faixa (mínimo e máximo). */\n value?: number[]\n defaultValue?: number[]\n onChange?: (value: number[]) => void\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n /** Mostra o valor atual acima da trilha. */\n showValue?: boolean\n formatValue?: (n: number) => string\n id?: string\n 'aria-label'?: string\n 'aria-describedby'?: string\n}\n\n/** Slider único: valor simples ou faixa. Alça com área de toque de 44px. */\nexport function Slider({\n value,\n defaultValue = [50],\n onChange,\n min = 0,\n max = 100,\n step = 1,\n disabled,\n showValue,\n formatValue = (n) => n.toLocaleString('pt-BR'),\n id,\n ...aria\n}: SliderProps) {\n const current = value ?? defaultValue\n return (\n <div data-rendra=\"SLD-001\" className=\"flex flex-col gap-3\">\n {showValue && (\n <div className=\"flex justify-between text-sm font-medium tabular-nums\">\n <span>{formatValue(current[0] ?? min)}</span>\n {current.length > 1 && <span>{formatValue(current[1] ?? max)}</span>}\n </div>\n )}\n <S.Root\n id={id}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onChange}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n className={cn(\n 'relative flex h-touch w-full touch-none items-center select-none md:h-6',\n disabled && 'opacity-50',\n )}\n >\n <S.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-muted\">\n <S.Range className=\"absolute h-full bg-primary\" />\n </S.Track>\n {current.map((_, i) => (\n <S.Thumb\n key={i}\n aria-label={\n aria['aria-label'] ??\n (current.length > 1 ? (i === 0 ? 'Mínimo' : 'Máximo') : undefined)\n }\n aria-describedby={aria['aria-describedby']}\n data-touch=\"expanded\"\n className=\"relative block size-icon-md cursor-grab rounded-full border-2 border-primary bg-card shadow-sm transition-transform before:absolute before:-inset-3 hover:scale-110 active:cursor-grabbing\"\n />\n ))}\n </S.Root>\n </div>\n )\n}\n","import {\n useCallback,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\n\n/**\n * Motor de reordenação por pointer events (etapa A6 do plano da v2), reaproveitado pela\n * List (arraste da alça) e pelo Kanban (arraste do card no toque, que o HTML5 drag and\n * drop nativo não cobre). Pointer events funcionam iguais para mouse, caneta e toque, com\n * setPointerCapture mantendo os eventos de mover e soltar no mesmo elemento que começou o\n * arraste, mesmo que o ponteiro saia dele no meio do gesto.\n */\n\n/** Item de uma lista reordenável: id estável e o dado original associado. */\nexport interface SortableItem<T = unknown> {\n id: string\n data: T\n}\n\nexport interface UseSortableOptions<T> {\n items: SortableItem<T>[]\n /** Chamado com a lista já reordenada. Sem ela, o motor não reordena nada. */\n onReorder?: (items: SortableItem<T>[]) => void\n}\n\nexport interface UseSortableResult {\n /** Id do item sendo arrastado no momento, ou null fora de um arraste. */\n draggingId: string | null\n /**\n * Espalhe no elemento (um <button>) que serve de alça do arraste: pointer down inicia o\n * arraste (mouse e toque) e as setas ↑/↓ movem uma posição pelo teclado. Usada pelo\n * componente SortableHandle (src/components/ui/sortable-handle.tsx), reaproveitado pela\n * List e pelo Upload, para não duplicar a alça inteira em cada um.\n */\n handleProps: (id: string) => {\n onPointerDown: (e: ReactPointerEvent<HTMLElement>) => void\n onKeyDown: (e: ReactKeyboardEvent<HTMLElement>) => void\n className: string\n }\n /** Espalhe no elemento da linha, para o motor localizar o alvo do arraste sob o ponteiro. */\n itemProps: (id: string) => Record<string, string>\n /** Move o item uma posição para cima (-1) ou para baixo (1); usado pelo teclado (setas). */\n moveBy: (id: string, delta: -1 | 1) => void\n}\n\nconst DEFAULT_ATTR = 'data-sortable-id'\n\n/**\n * Acha, sob o ponto x,y da tela, o elemento mais próximo com o atributo dado (o motor da\n * List usa \"data-sortable-id\"; o Kanban passa o atributo dele, por coluna ou por card) e\n * se o ponto está antes ou depois do meio dele. Sem elemento sob o ponto, devolve null.\n */\nexport function findDragTarget(\n x: number,\n y: number,\n attr: string = DEFAULT_ATTR,\n): { id: string; before: boolean } | null {\n const el = document.elementFromPoint(x, y)\n const target = el?.closest(`[${attr}]`)\n const id = target?.getAttribute(attr)\n if (!target || !id) return null\n const rect = target.getBoundingClientRect()\n const before = y < rect.top + rect.height / 2\n return { id, before }\n}\n\n/**\n * A partir do resultado de findDragTarget (id do alvo e se o ponto está antes do meio\n * dele), calcula a posição de inserção numa lista de ids na mesma ordem em que aparecem\n * na tela. Usada pelo useSortable (List e Upload) e diretamente pelo Kanban, para os dois\n * nunca recalcularem essa conta cada um do seu jeito.\n */\nexport function resolveDropIndex(\n ids: string[],\n found: { id: string; before: boolean } | null,\n): number {\n if (!found) return ids.length\n const at = ids.indexOf(found.id)\n if (at === -1) return ids.length\n return found.before ? at : at + 1\n}\n\n/**\n * Inicia um arraste por pointer events num nó já capturado (setPointerCapture): entrega a\n * posição do ponteiro a cada movimento e avisa quando solta, sem depender de um item\n * específico. Usado tanto pelo useSortable quanto diretamente pelo Kanban.\n */\nexport function bindPointerDrag(\n node: HTMLElement,\n e: ReactPointerEvent<HTMLElement> | PointerEvent,\n handlers: { onMove: (x: number, y: number) => void; onEnd: () => void },\n): void {\n const pointerId = e.pointerId\n try {\n node.setPointerCapture(pointerId)\n } catch {\n // Ambiente sem suporte (jsdom em alguns testes): segue sem captura, ainda funcional.\n }\n const onMove = (ev: PointerEvent) => handlers.onMove(ev.clientX, ev.clientY)\n const onUp = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return\n try {\n node.releasePointerCapture(pointerId)\n } catch {\n // Idem: sem captura, nada para liberar.\n }\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onUp)\n handlers.onEnd()\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n window.addEventListener('pointercancel', onUp)\n}\n\n/**\n * Motor de reordenação de uma lista única por alça: arraste (pointer events, mouse e\n * toque) e teclado (setas, uma posição por vez). Sem onReorder, a lista é só leitura e o\n * motor não inicia arraste nenhum (quem decide se a alça aparece é o componente que usa o\n * hook, como a List).\n */\nexport function useSortable<T>({ items, onReorder }: UseSortableOptions<T>): UseSortableResult {\n const [draggingId, setDraggingId] = useState<string | null>(null)\n const itemsRef = useRef(items)\n itemsRef.current = items\n\n const reorderTo = useCallback(\n (id: string, targetId: string, before: boolean) => {\n if (id === targetId) return\n const list = [...itemsRef.current]\n const from = list.findIndex((i) => i.id === id)\n if (from === -1) return\n const [moved] = list.splice(from, 1)\n if (!moved) return\n const to = resolveDropIndex(\n list.map((i) => i.id),\n { id: targetId, before },\n )\n list.splice(to, 0, moved)\n onReorder?.(list)\n },\n [onReorder],\n )\n\n const moveBy = useCallback(\n (id: string, delta: -1 | 1) => {\n const list = [...itemsRef.current]\n const from = list.findIndex((i) => i.id === id)\n if (from === -1) return\n const to = from + delta\n if (to < 0 || to >= list.length) return\n const [moved] = list.splice(from, 1)\n if (!moved) return\n list.splice(to, 0, moved)\n onReorder?.(list)\n },\n [onReorder],\n )\n\n const handleProps = useCallback(\n (id: string) => ({\n className: 'touch-none',\n onPointerDown: (e: ReactPointerEvent<HTMLElement>) => {\n if (!onReorder) return\n const node = e.currentTarget\n setDraggingId(id)\n bindPointerDrag(node, e, {\n onMove: (x, y) => {\n const found = findDragTarget(x, y)\n if (found) reorderTo(id, found.id, found.before)\n },\n onEnd: () => setDraggingId(null),\n })\n },\n onKeyDown: (e: ReactKeyboardEvent<HTMLElement>) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n moveBy(id, -1)\n } else if (e.key === 'ArrowDown') {\n e.preventDefault()\n moveBy(id, 1)\n }\n },\n }),\n [onReorder, reorderTo, moveBy],\n )\n\n const itemProps = useCallback((id: string) => ({ [DEFAULT_ATTR]: id }), [])\n\n return { draggingId, handleProps, itemProps, moveBy }\n}\n","import { useEffect, useMemo, useRef, useState, type CSSProperties } from 'react'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Alert } from '@/components/ui/alert'\nimport { Slider } from '@/components/ui/slider'\nimport { Tabs } from '@/components/ui/tabs'\nimport { cn } from '@/lib/cn'\nimport { bindPointerDrag } from '@/lib/sortable'\n\n/**\n * Recorte de imagem (etapa A2 do plano da v2): entra um File, sai um File novo, na\n * resolução original (ou até maxOutputWidth). A geometria é uma função pura, testada por\n * proporção, para o arraste e o zoom nunca descolarem a imagem da moldura.\n */\n\nexport interface ImageCropperAspect {\n id: string\n label: string\n /** Largura dividida pela altura (1 = quadrado, 16/9 = paisagem). */\n ratio: number\n}\n\nexport interface ImageCropperProps {\n file: File\n aspects: ImageCropperAspect[]\n /** Teto de largura da saída, em pixels. Sem ele, sai na resolução original do recorte. */\n maxOutputWidth?: number\n /** Chamado só quando o recorte deu certo, com o File novo. */\n onConfirm: (file: File) => void\n onCancel: () => void\n className?: string\n}\n\nexport interface CropGeometryInput {\n imageWidth: number\n imageHeight: number\n frameWidth: number\n frameHeight: number\n /** 1 = ajuste mínimo para cobrir a moldura; maior aproxima (zoom). */\n zoom: number\n /** Deslocamento desejado do centro da imagem, em pixels de tela. */\n offsetX: number\n offsetY: number\n}\n\nexport interface CropGeometryResult {\n /** Pixels de tela por pixel da imagem original. */\n scale: number\n /** Deslocamento realmente aplicado: nunca deixa a imagem descolar da moldura. */\n offsetX: number\n offsetY: number\n /** Retângulo de origem, em pixels da imagem original, que cai dentro da moldura. */\n source: { x: number; y: number; width: number; height: number }\n}\n\n/**\n * Geometria pura do recorte: a imagem sempre cobre a moldura (escala mínima = \"cover\"\n * vezes o zoom) e o arraste é limitado à sobra, para nunca abrir vão entre a imagem e a\n * moldura. Devolve também o retângulo de origem na resolução original da imagem, pronto\n * para desenhar num canvas do tamanho da moldura (ou maior, mantendo a proporção).\n */\nexport function computeCropGeometry({\n imageWidth,\n imageHeight,\n frameWidth,\n frameHeight,\n zoom,\n offsetX,\n offsetY,\n}: CropGeometryInput): CropGeometryResult {\n const coverScale = Math.max(frameWidth / imageWidth, frameHeight / imageHeight)\n const scale = coverScale * Math.max(1, zoom)\n const scaledWidth = imageWidth * scale\n const scaledHeight = imageHeight * scale\n const maxOffsetX = Math.max(0, (scaledWidth - frameWidth) / 2)\n const maxOffsetY = Math.max(0, (scaledHeight - frameHeight) / 2)\n const clampedX = Math.min(maxOffsetX, Math.max(-maxOffsetX, offsetX))\n const clampedY = Math.min(maxOffsetY, Math.max(-maxOffsetY, offsetY))\n const centerX = imageWidth / 2 - clampedX / scale\n const centerY = imageHeight / 2 - clampedY / scale\n const sourceWidth = frameWidth / scale\n const sourceHeight = frameHeight / scale\n return {\n scale,\n offsetX: clampedX,\n offsetY: clampedY,\n source: {\n x: centerX - sourceWidth / 2,\n y: centerY - sourceHeight / 2,\n width: sourceWidth,\n height: sourceHeight,\n },\n }\n}\n\n/** document.createElement('canvas').getContext('2d') existe? Sem ele, o recorte é impossível. */\nfunction detectCanvasSupport(): boolean {\n try {\n return Boolean(document.createElement('canvas').getContext('2d'))\n } catch {\n return false\n }\n}\n\n/** Recorte único: entra um File, sai um File novo na resolução original (ou maxOutputWidth). */\nexport function ImageCropper({\n file,\n aspects,\n maxOutputWidth,\n onConfirm,\n onCancel,\n className,\n}: ImageCropperProps) {\n const canvasSupported = useMemo(detectCanvasSupport, [])\n // toBlob pode devolver null (rarissimo, mas acontece): a falha entra aqui e vira a\n // mesma tela declarada de \"não é possível recortar\", em vez de sair calada.\n const [blobFailed, setBlobFailed] = useState(false)\n const [aspectId, setAspectId] = useState(aspects[0]?.id ?? '')\n const aspect = aspects.find((a) => a.id === aspectId) ?? aspects[0]\n const [zoom, setZoom] = useState(1)\n const [offset, setOffset] = useState({ x: 0, y: 0 })\n const [frameSize, setFrameSize] = useState({ width: 0, height: 0 })\n const [natural, setNatural] = useState<{ width: number; height: number } | null>(null)\n const [url, setUrl] = useState('')\n const frameRef = useRef<HTMLDivElement>(null)\n const imgRef = useRef<HTMLImageElement>(null)\n\n useEffect(() => {\n const objectUrl = URL.createObjectURL(file)\n setUrl(objectUrl)\n return () => URL.revokeObjectURL(objectUrl)\n }, [file])\n\n useEffect(() => {\n const el = frameRef.current\n if (!el) return\n const measure = () => setFrameSize({ width: el.clientWidth, height: el.clientHeight })\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(el)\n return () => ro.disconnect()\n }, [aspect?.id])\n\n // Trocar a proporção começa um recorte novo, sem herdar arraste e zoom da anterior.\n useEffect(() => {\n setZoom(1)\n setOffset({ x: 0, y: 0 })\n }, [aspectId])\n\n if (!canvasSupported || blobFailed) {\n return (\n <div data-rendra=\"CROP-001\" className={cn('flex flex-col gap-4', className)}>\n <Alert\n type=\"error\"\n title=\"Não é possível recortar aqui\"\n description=\"Este navegador não tem suporte ao recorte de imagem. Envie o arquivo sem recortar ou tente em outro navegador.\"\n />\n <ActionBar primary={{ label: 'Fechar', onClick: onCancel }} />\n </div>\n )\n }\n\n const geometry =\n natural && frameSize.width > 0\n ? computeCropGeometry({\n imageWidth: natural.width,\n imageHeight: natural.height,\n frameWidth: frameSize.width,\n frameHeight: frameSize.height,\n zoom,\n offsetX: offset.x,\n offsetY: offset.y,\n })\n : null\n\n const confirm = () => {\n const img = imgRef.current\n if (!img || !natural || !geometry) return\n const canvas = document.createElement('canvas')\n let outWidth = Math.round(geometry.source.width)\n let outHeight = Math.round(geometry.source.height)\n if (maxOutputWidth && outWidth > maxOutputWidth) {\n const shrink = maxOutputWidth / outWidth\n outWidth = Math.round(outWidth * shrink)\n outHeight = Math.round(outHeight * shrink)\n }\n canvas.width = Math.max(1, outWidth)\n canvas.height = Math.max(1, outHeight)\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n ctx.drawImage(\n img,\n geometry.source.x,\n geometry.source.y,\n geometry.source.width,\n geometry.source.height,\n 0,\n 0,\n canvas.width,\n canvas.height,\n )\n const type = file.type || 'image/png'\n canvas.toBlob((blob) => {\n if (!blob) {\n setBlobFailed(true)\n return\n }\n onConfirm(new File([blob], file.name, { type }))\n }, type)\n }\n\n return (\n <div data-rendra=\"CROP-001\" className={cn('flex flex-col gap-4', className)}>\n {aspects.length > 1 && (\n <Tabs\n aria-label=\"Proporção do recorte\"\n variant=\"pill\"\n value={aspectId}\n onChange={setAspectId}\n items={aspects.map((a) => ({ value: a.id, label: a.label, content: null }))}\n />\n )}\n <div\n ref={frameRef}\n onPointerDown={(e) => {\n if (!natural) return\n const start = { x: e.clientX, y: e.clientY, base: offset }\n bindPointerDrag(e.currentTarget, e, {\n onMove: (x, y) => {\n const candidate = {\n x: start.base.x + (x - start.x),\n y: start.base.y + (y - start.y),\n }\n const clamped = computeCropGeometry({\n imageWidth: natural.width,\n imageHeight: natural.height,\n frameWidth: frameSize.width,\n frameHeight: frameSize.height,\n zoom,\n offsetX: candidate.x,\n offsetY: candidate.y,\n })\n setOffset({ x: clamped.offsetX, y: clamped.offsetY })\n },\n onEnd: () => {},\n })\n }}\n style={{ '--crop-ratio': aspect?.ratio ?? 1 } as CSSProperties}\n className=\"relative aspect-crop w-full touch-none overflow-hidden rounded-control bg-muted\"\n >\n {url && (\n <img\n ref={imgRef}\n src={url}\n alt=\"\"\n aria-hidden\n onLoad={(e) =>\n setNatural({\n width: e.currentTarget.naturalWidth,\n height: e.currentTarget.naturalHeight,\n })\n }\n style={\n {\n '--crop-x': `${geometry?.offsetX ?? 0}px`,\n '--crop-y': `${geometry?.offsetY ?? 0}px`,\n '--crop-scale': geometry?.scale ?? 1,\n } as CSSProperties\n }\n className=\"absolute top-1/2 left-1/2 max-w-none origin-center cropper-image select-none\"\n draggable={false}\n />\n )}\n </div>\n <Slider\n aria-label=\"Zoom\"\n value={[zoom]}\n onChange={([z]) => setZoom(z ?? 1)}\n min={1}\n max={3}\n step={0.1}\n showValue\n formatValue={(n) => `${n.toFixed(1)}x`}\n />\n <ActionBar\n cancel={{ label: 'Cancelar', onClick: onCancel }}\n primary={{ label: 'Recortar', onClick: confirm, disabled: !geometry }}\n />\n </div>\n )\n}\n","import { ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport { Dialog } from 'radix-ui'\nimport { useRef } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@/lib/cn'\n\n/*\n * Visualizador de imagens (lightbox). Abre por cima da tela, sem sair da página.\n * Tela inteira em qualquer largura: legenda e fechar no topo, imagem no meio e\n * anterior / contador / próxima embaixo, ao alcance do polegar no celular.\n * Teclado: setas trocam de imagem e Esc fecha. No toque, arraste para o lado; pinça amplia.\n */\n\nexport interface ViewerImage {\n src: string\n /** Texto alternativo: o que a imagem mostra. */\n alt: string\n /** Legenda visível. Padrão: o alt. */\n caption?: string\n}\n\nexport interface ImageViewerProps {\n images: ViewerImage[]\n /** Imagem aberta; null fecha o visualizador. */\n index: number | null\n onIndexChange: (index: number | null) => void\n}\n\nconst SWIPE = 48\n\nexport function ImageViewer({ images, index, onIndexChange }: ImageViewerProps) {\n const start = useRef<number | null>(null)\n const open = index !== null && images[index] !== undefined\n const current = open ? images[index] : undefined\n const total = images.length\n const go = (step: number) => {\n if (index === null || total === 0) return\n onIndexChange((index + step + total) % total)\n }\n\n return (\n <Dialog.Root open={open} onOpenChange={(o) => !o && onIndexChange(null)}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-50 bg-overlay data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\" />\n <Dialog.Content\n aria-describedby={undefined}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') go(1)\n if (e.key === 'ArrowLeft') go(-1)\n }}\n data-rendra=\"IMG-001\"\n className=\"fixed inset-0 z-50 flex h-dvh flex-col bg-background text-foreground outline-none data-[state=open]:animate-in data-[state=open]:fade-in-0 md:inset-6 md:h-auto md:rounded-surface md:border md:shadow-lg\"\n >\n <div className=\"flex shrink-0 items-center gap-3 border-b pt-safe pr-2 pb-2 pl-4 md:pt-2 md:pr-3 md:pl-6\">\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-base font-semibold\">\n {current?.caption ?? current?.alt}\n </Dialog.Title>\n <Dialog.Close asChild>\n <Button variant=\"ghost\" iconOnly aria-label=\"Fechar\" icon={<X />} />\n </Dialog.Close>\n </div>\n\n <div\n className=\"flex min-h-0 flex-1 touch-pan-y touch-pinch-zoom items-center justify-center overflow-hidden bg-muted p-2 md:p-6\"\n onPointerDown={(e) => (start.current = e.clientX)}\n onPointerUp={(e) => {\n if (start.current === null) return\n const dx = e.clientX - start.current\n start.current = null\n if (Math.abs(dx) >= SWIPE) go(dx < 0 ? 1 : -1)\n }}\n >\n {current && (\n <img\n key={current.src}\n src={current.src}\n alt={current.alt}\n draggable={false}\n className=\"max-h-full max-w-full rounded-item object-contain shadow-md select-none\"\n />\n )}\n </div>\n\n <div\n className={cn(\n 'flex shrink-0 items-center justify-between gap-3 border-t px-4 pt-3 pb-safe md:px-6 md:pb-3',\n total < 2 && 'hidden',\n )}\n >\n <Button variant=\"outline\" icon={<ChevronLeft />} onClick={() => go(-1)}>\n Anterior\n </Button>\n <span className=\"text-sm text-muted-foreground tabular-nums\" aria-live=\"polite\">\n {index !== null ? index + 1 : 0} de {total}\n </span>\n <Button variant=\"outline\" iconRight={<ChevronRight />} onClick={() => go(1)}>\n Próxima\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import { differenceInCalendarDays, format } from 'date-fns'\nimport {\n ArrowRightLeft,\n CalendarClock,\n CalendarDays,\n CalendarX2,\n GripVertical,\n Mail,\n MoreHorizontal,\n Phone,\n Plus,\n Settings2,\n User,\n} from 'lucide-react'\nimport {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type DragEvent as ReactDragEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Avatar } from '@/components/ui/avatar'\nimport { Badge, type BadgeProps } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { DataToolbar } from '@/components/ui/data-toolbar'\nimport { Drawer } from '@/components/ui/drawer'\nimport { Field } from '@/components/ui/field'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Modal } from '@/components/ui/modal'\nimport { Popover, PopoverAnchor, PopoverContent } from '@/components/ui/popover'\nimport { Select } from '@/components/ui/select'\nimport { Tabs } from '@/components/ui/tabs'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { useFillHeight } from '@/hooks/use-fill-height'\nimport { cn } from '@/lib/cn'\nimport {\n layoutEnabled,\n useLayoutReady,\n useMotionLib,\n useMotionMode,\n useMotionPresets,\n} from '@/lib/motion'\nimport { bindPointerDrag, findDragTarget, resolveDropIndex } from '@/lib/sortable'\n\n/*\n * Kanban único: colunas e cards por props; a tela guarda o estado e recebe onCardMove.\n * Desktop: colunas lado a lado; arraste o card para outra coluna ou outra posição.\n * Toque e teclado: o menu do card tem \"Mover para\" (arrastar nunca é o único caminho).\n * Mobile (< 768px): uma coluna por vez, escolhida pelas abas com contador, sem rolagem\n * lateral; os cards mudam de coluna pelo mesmo menu.\n * Altura: o quadro ocupa o que sobra da tela abaixo dele e nunca passa disso; cada etapa rola\n * por dentro e vai mostrando mais cards ao chegar no fim (rolagem infinita).\n */\n\n/** Marca o fim da lista: ao aparecer na rolagem da etapa, pede mais cards. */\nfunction LoadMore({ onVisible }: { onVisible: () => void }) {\n const ref = useRef<HTMLLIElement>(null)\n const cb = useRef(onVisible)\n cb.current = onVisible\n useEffect(() => {\n const el = ref.current\n if (!el) return\n const io = new IntersectionObserver(\n (entries) => entries.some((e) => e.isIntersecting) && cb.current(),\n { root: el.closest('[data-kanban-scroll]'), rootMargin: '120px' },\n )\n io.observe(el)\n return () => io.disconnect()\n }, [])\n return (\n <li ref={ref} className=\"py-2 text-center text-xs text-muted-foreground\">\n Carregando mais cards...\n </li>\n )\n}\n\nexport interface KanbanColumn {\n id: string\n title: string\n /** Cor do marcador da coluna. */\n tone?: BadgeProps['tone']\n /** Limite de cards (WIP). Passando dele, o contador fica em alerta. */\n limit?: number\n /**\n * Dias máximos de um card nesta etapa. Passando disso (pela `enteredColumnAt` do card), a\n * cadência está vencida. Sem ela, a etapa nunca vence. Aparece no cabeçalho da coluna.\n */\n cadenceDays?: number\n}\n\n/** Contador de quadros, só para o `layoutId` dos cards em `on` (um prefixo por instância). */\nlet boardsCreated = 0\n\n/** Próxima atividade agendada do card: tipo, data com hora e com quem. */\nexport interface KanbanActivity {\n /** Ex.: \"Reunião\", \"Ligação\". Só aparece no hint do calendário. */\n type: string\n /** Data e hora da atividade. */\n at: Date\n /** Com quem (pessoa de contato). */\n with?: string\n}\n\nexport interface KanbanCard {\n id: string\n columnId: string\n /** Empresa ou pessoa. */\n title: string\n /** Linha abaixo do título: CNPJ da empresa ou CPF da pessoa. */\n subtitle?: string\n description?: string\n /** Pessoa de contato: nome, telefone e e-mail. */\n contact?: { name?: string; phone?: string; email?: string }\n tags?: { label: string; tone?: BadgeProps['tone'] }[]\n /** Nome do responsável (vira avatar com iniciais). */\n assignee?: string\n dueDate?: Date\n /** Valor ou informação curta à direita do rodapé (ex.: \"R$ 12.500,00\"). */\n meta?: string\n /** Valores numéricos do card, pelas chaves de valueFields (ex.: { ps: 4800, mrr: 590 }). */\n values?: Record<string, number>\n /**\n * Próxima atividade. Com ela (ou com `cadenceDays` em alguma etapa) o quadro passa a\n * colorir o card pela situação e a mostrar o calendário no lugar do `dueDate`.\n */\n activity?: KanbanActivity\n /**\n * Quando o card entrou na etapa atual. Quem usa o componente atualiza esta data ao mover\n * o card, para a contagem da cadência recomeçar.\n */\n enteredColumnAt?: Date\n}\n\n/** Valor somado no cabeçalho da coluna e mostrado no card (ex.: P&S e MRR). */\nexport interface KanbanValueField {\n key: string\n label: string\n}\n\n/** Confirmação opcional de um destino de arraste: abre um modal antes de agir. */\nexport interface KanbanDropConfirm {\n title: string\n description: string\n /** Texto do botão. Padrão: o `label` do destino. */\n confirmLabel?: string\n /** Botão destrutivo (ex.: Perder). */\n destructive?: boolean\n /** Motivos a escolher; o escolhido chega como terceiro argumento de `onDropTarget`. */\n reasons?: { value: string; label: string }[]\n}\n\n/**\n * Destino de arraste (etapa A14): uma ação para onde o card vai, diferente de \"outra\n * coluna\" (ex.: \"Marcar como ganho\", \"Arquivar\"). Aparece numa barra durante o arraste e\n * como opção do menu \"Mover para\" (equivalente por teclado, sempre disponível).\n */\nexport interface KanbanDropTarget {\n id: string\n label: string\n /** Texto curto de apoio, mostrado abaixo do rótulo na barra. */\n hint?: string\n icon?: ReactNode\n tone?: BadgeProps['tone']\n disabled?: boolean\n /** Motivo mostrado quando desabilitado; o destino recusa o solto. */\n disabledReason?: string\n /** Sem ela, o destino age na hora. Com ela, abre a confirmação (mouse, toque e menu). */\n confirm?: KanbanDropConfirm\n}\n\nexport interface KanbanProps {\n columns: KanbanColumn[]\n cards: KanbanCard[]\n /** Card movido: coluna de destino e posição dentro dela (0 = topo). */\n onCardMove?: (cardId: string, toColumnId: string, toIndex: number) => void\n onCardClick?: (card: KanbanCard) => void\n /** Botão (+) no título de cada etapa. */\n onAddCard?: (columnId: string) => void\n /** Cards mostrados por vez em cada etapa; ao rolar até o fim, mostra mais. Padrão: 20. */\n pageSize?: number\n /**\n * Busca mais cards no servidor quando a etapa chega ao fim do que já foi carregado.\n * Sem ela, a rolagem infinita só vai revelando os cards recebidos em cards.\n */\n onLoadMore?: (columnId: string) => void\n /** A etapa ainda tem cards no servidor (usado com onLoadMore). */\n hasMore?: (columnId: string) => boolean\n /** Etapas visíveis por vez no desktop; as demais pela rolagem lateral. Padrão: 5. */\n visibleColumns?: number\n /** Conteúdo próprio do card, no lugar do padrão (substitui também calendário e valores). */\n renderCard?: (card: KanbanCard) => ReactNode\n /**\n * Valores do card (até 2, empilhados no rodapé) e o total de cada um na coluna, com o\n * percentual sobre o total do quadro. Ex.: [{ key: 'ps', label: 'P&S' }, { key: 'mrr', label: 'MRR' }].\n */\n valueFields?: KanbanValueField[]\n /** Formato dos valores. Padrão: moeda (R$ 1.250,00). */\n formatValue?: (n: number) => string\n /**\n * Destinos de arraste além das colunas (ex.: \"Marcar como ganho\"). Com eles, mostra uma\n * barra durante o arraste e o menu \"Mover para\" passa a listar estes destinos.\n */\n dropTargets?: KanbanDropTarget[]\n /**\n * Card solto num destino da barra (ou escolhido no menu \"Mover para\"). `reason` é o motivo\n * escolhido na confirmação (destinos com `confirm.reasons`).\n */\n onDropTarget?: (cardId: string, targetId: string, reason?: string) => void\n /** Data de hoje, para o status e a cadência (injetável em teste). Padrão: agora. */\n referenceDate?: Date\n /** Liga a barra do quadro: busca, filtros, totais, Customizar e Novo card. */\n toolbar?: boolean\n /** \"Novo card\" da barra do quadro (sem coluna; o (+) da coluna segue com `onAddCard`). */\n onNewCard?: () => void\n /**\n * Chave do `localStorage` em que o Customizar guarda os campos escondidos (por navegador).\n * Sem ela, a escolha vale só enquanto o quadro está montado.\n */\n storageKey?: string\n 'aria-label'?: string\n className?: string\n}\n\nconst dotTone: Record<NonNullable<BadgeProps['tone']>, string> = {\n neutral: 'bg-muted-foreground',\n primary: 'bg-primary',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-destructive',\n info: 'bg-info',\n outline: 'bg-border',\n}\n\nconst targetIconTone: Record<NonNullable<BadgeProps['tone']>, string> = {\n neutral: 'text-muted-foreground',\n primary: 'text-primary-text',\n success: 'text-success',\n warning: 'text-warning',\n error: 'text-destructive',\n info: 'text-info',\n outline: 'text-foreground',\n}\n\n/** Fundo claro de cada destino do rodapé flutuante, pela cor da ação. */\nconst targetSoft: Record<NonNullable<BadgeProps['tone']>, string> = {\n neutral: 'bg-muted',\n primary: 'bg-primary-soft',\n success: 'bg-success-soft',\n warning: 'bg-warning-soft',\n error: 'bg-destructive-soft',\n info: 'bg-info-soft',\n outline: 'bg-card',\n}\n\n/** Destino realçado (card por cima): fundo forte com o `-foreground` dele em tudo. */\nconst targetStrong: Record<NonNullable<BadgeProps['tone']>, string> = {\n neutral: 'bg-muted text-foreground',\n primary: 'bg-primary text-primary-foreground',\n success: 'bg-success text-success-foreground',\n warning: 'bg-warning text-warning-foreground',\n error: 'bg-destructive text-destructive-foreground',\n info: 'bg-info text-info-foreground',\n outline: 'bg-muted text-foreground',\n}\n\n// ---------------------------------------------------------------- status do card\n\nexport interface KanbanCardStatus {\n /** Fundo do card: crítico, cadência vencida, sem atividade ou normal. */\n background: 'critical' | 'cadenceOverdue' | 'noActivity' | 'normal'\n /** Situação do calendário: em dia, vence hoje, atrasada ou sem atividade. */\n activity: 'onTime' | 'today' | 'late' | 'none'\n /** Dias de calendário na etapa; `null` sem `enteredColumnAt`. */\n daysInColumn: number | null\n /** Dias de atraso da atividade (0 fora de `late`). */\n daysLate: number\n}\n\n/**\n * Situação do card a partir da próxima atividade e da cadência da etapa. Compara por dia de\n * calendário; `referenceDate` é o \"hoje\" (injetável para teste).\n */\nexport function getKanbanCardStatus(\n card: KanbanCard,\n column: KanbanColumn | undefined,\n referenceDate: Date,\n): KanbanCardStatus {\n const daysInColumn = card.enteredColumnAt\n ? differenceInCalendarDays(referenceDate, card.enteredColumnAt)\n : null\n const cadenceOverdue =\n column?.cadenceDays !== undefined && daysInColumn !== null && daysInColumn > column.cadenceDays\n const ahead = card.activity ? differenceInCalendarDays(card.activity.at, referenceDate) : null\n const activity = ahead === null ? 'none' : ahead < 0 ? 'late' : ahead === 0 ? 'today' : 'onTime'\n const background =\n cadenceOverdue && (activity === 'late' || activity === 'none')\n ? 'critical'\n : cadenceOverdue\n ? 'cadenceOverdue'\n : activity === 'none'\n ? 'noActivity'\n : 'normal'\n return {\n background,\n activity,\n daysInColumn,\n daysLate: ahead !== null && ahead < 0 ? -ahead : 0,\n }\n}\n\n/** Classes literais completas (nada de classe montada por string). */\nconst statusBackground: Record<KanbanCardStatus['background'], string> = {\n critical: 'bg-critical-soft',\n cadenceOverdue: 'bg-destructive-soft',\n noActivity: 'bg-warning-soft',\n normal: 'bg-card',\n}\n\nconst activityIcon: Record<\n KanbanCardStatus['activity'],\n { icon: typeof CalendarDays; circle: string }\n> = {\n onTime: { icon: CalendarDays, circle: 'bg-info-soft text-info-soft-foreground' },\n today: { icon: CalendarClock, circle: 'bg-warning-mid text-warning-mid-foreground' },\n late: { icon: CalendarX2, circle: 'bg-destructive text-destructive-foreground' },\n none: {\n icon: CalendarDays,\n circle: 'border border-dashed border-muted-foreground text-muted-foreground',\n },\n}\n\nfunction plural(n: number, one: string, many: string) {\n return `${n} ${n === 1 ? one : many}`\n}\n\nfunction situationText(status: KanbanCardStatus) {\n if (status.activity === 'onTime') return 'Em dia'\n if (status.activity === 'today') return 'Vence hoje'\n if (status.activity === 'late') {\n return `Atrasada há ${plural(status.daysLate, 'dia', 'dias')}`\n }\n return 'Sem atividade agendada'\n}\n\n/** Texto para o leitor de tela: a cor do fundo nunca é a única informação. */\nfunction backgroundLabel(status: KanbanCardStatus) {\n if (status.background === 'critical') {\n return `Situação: crítico, cadência vencida e ${\n status.activity === 'late' ? 'atividade atrasada' : 'sem próxima atividade'\n }`\n }\n if (status.background === 'cadenceOverdue') return 'Situação: cadência vencida'\n if (status.background === 'noActivity') return 'Situação: sem atividade'\n return null\n}\n\nfunction whenText(at: Date, status: KanbanCardStatus) {\n return status.activity === 'today'\n ? `Hoje às ${format(at, 'HH:mm')}`\n : `${format(at, 'dd/MM/yyyy')} às ${format(at, 'HH:mm')}`\n}\n\n// ---------------------------------------------------------------- campos do Customizar\n\nconst baseFields = [\n { id: 'tags', label: 'Tags' },\n { id: 'document', label: 'CNPJ ou CPF' },\n { id: 'description', label: 'Descrição' },\n { id: 'contact', label: 'Contato' },\n { id: 'phone', label: 'Telefone' },\n { id: 'email', label: 'E-mail' },\n { id: 'activity', label: 'Atividade' },\n { id: 'assignee', label: 'Responsável' },\n] as const\n\ntype HiddenFields = Record<string, boolean>\n\n/** Lê os campos escondidos; qualquer falha do armazenamento cai no padrão (tudo visível). */\nfunction readHidden(storageKey?: string): HiddenFields {\n if (!storageKey) return {}\n try {\n const raw = localStorage.getItem(storageKey)\n const list: unknown = raw ? JSON.parse(raw) : []\n return Array.isArray(list)\n ? Object.fromEntries(list.filter((f) => typeof f === 'string').map((f) => [f, true]))\n : {}\n } catch {\n return {}\n }\n}\n\nfunction writeHidden(storageKey: string | undefined, hidden: HiddenFields) {\n if (!storageKey) return\n try {\n localStorage.setItem(storageKey, JSON.stringify(Object.keys(hidden).filter((k) => hidden[k])))\n } catch {\n // Armazenamento indisponível: a escolha segue só em memória.\n }\n}\n\n// ---------------------------------------------------------------- calendário com hint\n\nconst HINT_CLOSE_DELAY = 150\n\n/**\n * Calendário do card: ícone de situação, data ao lado e hint (tipo, quando, com quem,\n * responsável e situação). Abre por clique, toque, foco por teclado e mouse; o gatilho é um\n * botão fora do botão de clique do card.\n */\nfunction ActivityHint({ card, status }: { card: KanbanCard; status: KanbanCardStatus }) {\n const [open, setOpen] = useState(false)\n const pressed = useRef(false)\n // Botão do mouse (ou dedo) apertado no gatilho: nada fecha o hint até soltar. Sem isso, um\n // fechamento atrasado (timer de saída, clique \"fora\" do Radix, foco) que cai no meio do\n // aperto fecha o hint debaixo do dedo, e o clique seguinte o reabre (pisca).\n const holding = useRef(false)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const lastPointer = useRef('')\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const { icon: Icon, circle } = activityIcon[status.activity]\n const activity = card.activity\n const visible = activity\n ? status.activity === 'today'\n ? `Hoje ${format(activity.at, 'HH:mm')}`\n : format(activity.at, 'dd/MM/yyyy')\n : 'Sem atividade'\n const cancelClose = () => clearTimeout(timer.current)\n const scheduleClose = () => {\n cancelClose()\n timer.current = setTimeout(() => {\n if (!holding.current) setOpen(false)\n }, HINT_CLOSE_DELAY)\n }\n useEffect(() => cancelClose, [])\n return (\n <Popover open={open} onOpenChange={(next) => !next && !holding.current && setOpen(false)}>\n {/* Âncora, não `PopoverTrigger`: o Radix alternaria o hint a cada clique, e quem abre e\n fecha aqui é o hover, o foco e o clique, cada um com a sua regra. */}\n <PopoverAnchor asChild>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={`${visible}. ${situationText(status)}`}\n className=\"relative z-10 -ml-1 inline-flex cursor-pointer items-center gap-1 rounded-item px-1 tabular-nums outline-none focus-visible:ring-2 focus-visible:ring-ring max-md:min-h-touch\"\n onPointerDown={(e) => {\n cancelClose()\n pressed.current = true\n holding.current = true\n window.addEventListener('pointerup', () => (holding.current = false), { once: true })\n window.addEventListener('pointercancel', () => (holding.current = false), {\n once: true,\n })\n lastPointer.current = e.pointerType\n }}\n onPointerEnter={(e) => {\n if (e.pointerType !== 'mouse') return\n cancelClose()\n setOpen(true)\n }}\n onPointerLeave={(e) => e.pointerType === 'mouse' && scheduleClose()}\n onFocus={() => {\n if (!pressed.current) setOpen(true)\n }}\n onBlur={() => {\n pressed.current = false\n if (!holding.current) setOpen(false)\n }}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n pressed.current = false\n // Mouse: o hover já abriu; o clique não fecha. Toque e teclado alternam. O ponteiro é\n // lido antes do `setOpen`: a função dele roda depois, já com o ref limpo.\n const byMouse = lastPointer.current === 'mouse'\n lastPointer.current = ''\n setOpen((o) => byMouse || !o)\n }}\n >\n <span\n aria-hidden\n className={cn('flex size-6 shrink-0 items-center justify-center rounded-full', circle)}\n >\n <Icon className=\"size-3\" />\n </span>\n {visible}\n </button>\n </PopoverAnchor>\n <PopoverContent\n width=\"sm\"\n align=\"start\"\n className=\"flex flex-col gap-1 p-3 text-xs\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n // Apertar ou focar o próprio gatilho não é \"fora\" do hint.\n onInteractOutside={(e) => {\n if (triggerRef.current?.contains(e.target as Node)) e.preventDefault()\n }}\n onPointerEnter={cancelClose}\n onPointerLeave={scheduleClose}\n >\n {activity ? (\n <>\n <p className=\"text-sm font-medium\">\n {activity.type} · {whenText(activity.at, status)}\n </p>\n {activity.with && <p>Com: {activity.with}</p>}\n </>\n ) : null}\n {card.assignee && <p>Responsável: {card.assignee}</p>}\n <p className=\"font-medium\">{situationText(status)}</p>\n </PopoverContent>\n </Popover>\n )\n}\n\n// ---------------------------------------------------------------- corpo e rodapé do card\n\nfunction CardBody({\n card,\n show,\n withHandle,\n}: {\n card: KanbanCard\n /** Campo visível? (o Customizar esconde; Empresa fica sempre). */\n show: (field: string) => boolean\n /** Reserva o espaço da alça de arraste no toque, à esquerda do título. */\n withHandle?: boolean\n}) {\n return (\n <>\n {show('tags') && card.tags && card.tags.length > 0 && (\n <span className=\"flex flex-wrap gap-1\">\n {card.tags.map((t) => (\n <Badge key={t.label} tone={t.tone ?? 'neutral'}>\n {t.label}\n </Badge>\n ))}\n </span>\n )}\n {/* Só o título reserva o espaço do botão de ações (e da alça, no toque). */}\n <span className={cn('flex flex-col pr-8', withHandle && 'pl-8')}>\n <span className=\"line-clamp-2 text-sm font-medium\">{card.title}</span>\n {show('document') && card.subtitle && (\n <span className=\"text-xs text-muted-foreground tabular-nums\">{card.subtitle}</span>\n )}\n </span>\n {show('description') && card.description && (\n <span className=\"line-clamp-2 text-xs text-muted-foreground\">{card.description}</span>\n )}\n {card.contact && (\n <span className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n {show('contact') && card.contact.name && (\n <span className=\"flex min-w-0 items-center gap-1 text-foreground\">\n <User className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"truncate\">{card.contact.name}</span>\n </span>\n )}\n {show('phone') && card.contact.phone && (\n <span className=\"flex min-w-0 items-center gap-1 tabular-nums\">\n <Phone className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"truncate\">{card.contact.phone}</span>\n </span>\n )}\n {show('email') && card.contact.email && (\n <span className=\"flex min-w-0 items-center gap-1\">\n <Mail className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"truncate\">{card.contact.email}</span>\n </span>\n )}\n </span>\n )}\n </>\n )\n}\n\n/**\n * Rodapé do card, fora do botão de clique: linha de calendário, meta e responsável e, depois\n * de uma divisória, os valores empilhados. Sem `renderCard` apenas.\n */\nfunction cardFooter({\n card,\n status,\n show,\n valueFields,\n formatValue,\n}: {\n card: KanbanCard\n /** `null` quando o quadro não traz atividade nem cadência: o card fica como sempre foi. */\n status: KanbanCardStatus | null\n show: (field: string) => boolean\n valueFields: KanbanValueField[]\n formatValue: (n: number) => string\n}): ReactNode {\n const calendar = show('activity') ? (\n status ? (\n <ActivityHint card={card} status={status} />\n ) : (\n card.dueDate && (\n <span className=\"inline-flex items-center gap-1 tabular-nums\">\n <CalendarDays className=\"size-3\" aria-hidden />\n {format(card.dueDate, 'dd/MM/yyyy')}\n </span>\n )\n )\n ) : null\n const assignee = show('assignee') ? card.assignee : undefined\n const values = valueFields.slice(0, 2).filter((f) => show(`value:${f.key}`))\n const hasRow = Boolean(calendar || assignee || card.meta)\n if (!hasRow && values.length === 0) return null\n return (\n <>\n {hasRow && (\n <span className=\"flex items-center gap-2 border-t pt-2 text-xs text-muted-foreground\">\n {calendar}\n {card.meta && (\n <span className=\"font-medium text-foreground tabular-nums\">{card.meta}</span>\n )}\n {assignee && (\n <span className=\"ml-auto\" title={assignee}>\n <Avatar name={assignee} size=\"sm\" />\n </span>\n )}\n </span>\n )}\n {values.length > 0 && (\n <span className=\"flex flex-col gap-1 border-t pt-2 text-xs\">\n {values.map((f) => (\n <span key={f.key} className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-muted-foreground\">{f.label}:</span>\n <span className=\"truncate font-semibold text-foreground tabular-nums\">\n {formatValue(card.values?.[f.key] ?? 0)}\n </span>\n </span>\n ))}\n </span>\n )}\n </>\n )\n}\n\n/** Sem acento e sem diferença de maiúscula, para a busca. */\nfunction normalize(text: string) {\n const marks = new RegExp(`[${String.fromCharCode(0x300)}-${String.fromCharCode(0x36f)}]`, 'g')\n return text.normalize('NFD').replace(marks, '').toLowerCase()\n}\n\n/**\n * Posição, na lista completa da coluna, de um índice da lista desenhada (que pode ser só uma\n * parte dela, por busca, filtro ou paginação). Fim da lista desenhada = logo depois do último\n * card desenhado; sem card desenhado = fim da lista completa.\n */\nfunction toFullIndex(full: KanbanCard[], drawn: KanbanCard[], drawnIndex: number) {\n if (drawn.length === 0) return full.length\n if (drawnIndex < drawn.length) return full.indexOf(drawn[drawnIndex]!)\n return full.indexOf(drawn[drawn.length - 1]!) + 1\n}\n\nconst situationOptions = [\n { value: 'critical', label: 'Crítico' },\n { value: 'cadenceOverdue', label: 'Cadência vencida' },\n { value: 'noActivity', label: 'Sem atividade' },\n { value: 'late', label: 'Atividade atrasada' },\n]\n\nexport function Kanban({\n columns,\n cards,\n onCardMove,\n onCardClick,\n onAddCard,\n renderCard,\n valueFields,\n formatValue = (n) => n.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' }),\n pageSize = 20,\n visibleColumns = 5,\n onLoadMore,\n hasMore,\n dropTargets,\n onDropTarget,\n referenceDate,\n toolbar,\n onNewCard,\n storageKey,\n className,\n ...aria\n}: KanbanProps) {\n const code = resolveCatalogCode('Kanban', { hasDropTargets: Boolean(dropTargets?.length) })\n const { isMobile } = useBreakpoint()\n const motion = useMotionMode()\n const lib = useMotionLib()\n const ready = useLayoutReady()\n const presets = useMotionPresets()\n // Prefixo do layoutId dos cards: dois quadros na mesma tela não trocam cards entre si. Sem\n // `useId`, que consumiria a sequência de ids do React também em `off`.\n const [boardId] = useState(() => `rendra-kanban-${++boardsCreated}`)\n const boardRef = useFillHeight()\n // Touchpad: o gesto lateral leva o quadro para o mesmo lado dos dedos (esquerda move o\n // quadro para a esquerda). A rolagem vertical segue normal dentro de cada etapa.\n useEffect(() => {\n const el = boardRef.current\n if (!el || isMobile) return\n const onWheel = (e: WheelEvent) => {\n if (Math.abs(e.deltaX) <= Math.abs(e.deltaY)) return\n e.preventDefault()\n el.scrollLeft -= e.deltaX\n }\n el.addEventListener('wheel', onWheel, { passive: false })\n return () => el.removeEventListener('wheel', onWheel)\n }, [boardRef, isMobile])\n const [shown, setShown] = useState<Record<string, number>>({})\n const limitOf = (id: string) => shown[id] ?? pageSize\n const [active, setActive] = useState(columns[0]?.id ?? '')\n const [dragging, setDragging] = useState<string | null>(null)\n const [over, setOver] = useState<{ column: string; index: number } | null>(null)\n // Destino da barra sob o mouse (o do toque vem de `touchDrag.overTargetId`).\n const [overTarget, setOverTarget] = useState<string | null>(null)\n // Arraste por toque (motor de src/lib/sortable.ts): reordena dentro da coluna sem\n // dropTargets, ou solta num destino da barra quando dropTargets está presente.\n const [touchDrag, setTouchDrag] = useState<{\n cardId: string\n overTargetId: string | null\n } | null>(null)\n // Destino com `confirm`: o card volta ao lugar e o modal espera a decisão.\n const [pendingDrop, setPendingDrop] = useState<{ cardId: string; targetId: string } | null>(null)\n const [reason, setReason] = useState('')\n\n // Barra do quadro: busca, filtros e Customizar. Sem `toolbar`, nada disso é usado.\n const [query, setQuery] = useState('')\n const [assigneeFilter, setAssigneeFilter] = useState<string | null>(null)\n const [situationFilter, setSituationFilter] = useState<string | null>(null)\n const [customizing, setCustomizing] = useState(false)\n // Por que não `boardId`: ele muda a cada montagem (F24) e não serve de chave guardada.\n const [hidden, setHidden] = useState<HiddenFields>(() => readHidden(storageKey))\n const changeHidden = (next: HiddenFields) => {\n setHidden(next)\n writeHidden(storageKey, next)\n }\n const show = (field: string) => !hidden[field]\n\n const today = referenceDate ?? new Date()\n const statusEnabled =\n columns.some((c) => c.cadenceDays !== undefined) || cards.some((c) => c.activity)\n const statusOf = (card: KanbanCard) =>\n statusEnabled\n ? getKanbanCardStatus(\n card,\n columns.find((c) => c.id === card.columnId),\n today,\n )\n : null\n\n const filtering = toolbar && (query.trim() !== '' || assigneeFilter || situationFilter)\n const matches = (card: KanbanCard) => {\n const q = normalize(query.trim())\n if (\n q &&\n ![card.title, card.subtitle, card.contact?.name].some((t) => t && normalize(t).includes(q))\n )\n return false\n if (assigneeFilter && card.assignee !== assigneeFilter) return false\n if (situationFilter) {\n const status = statusOf(card)\n if (!status) return false\n if (\n situationFilter === 'late'\n ? status.activity !== 'late'\n : status.background !== situationFilter\n )\n return false\n }\n return true\n }\n const visibleCards = filtering ? cards.filter(matches) : cards\n\n /** Lista completa da coluna: a única fonte do índice que sai em `onCardMove`. */\n const inColumn = (id: string) => cards.filter((c) => c.columnId === id)\n /** Lista visível (busca e filtros): cards desenhados, contagem, totais, paginação e abas. */\n const visibleInColumn = (id: string) => visibleCards.filter((c) => c.columnId === id)\n\n const drop = (columnId: string, index: number) => {\n if (dragging) {\n // O mouse trabalha com o índice da lista desenhada; `onCardMove` quer o da completa.\n const drawn = visibleInColumn(columnId).slice(0, limitOf(columnId))\n onCardMove?.(dragging, columnId, toFullIndex(inColumn(columnId), drawn, index))\n }\n setDragging(null)\n setOver(null)\n setOverTarget(null)\n }\n\n const draggingCardId = dragging ?? touchDrag?.cardId ?? null\n const showTargetBar = Boolean(dropTargets?.length) && draggingCardId !== null\n\n const dropOnTarget = (cardId: string, targetId: string) => {\n const target = dropTargets?.find((t) => t.id === targetId)\n if (!target || target.disabled) return\n if (target.confirm) {\n setReason(target.confirm.reasons?.[0]?.value ?? '')\n setPendingDrop({ cardId, targetId })\n return\n }\n onDropTarget?.(cardId, targetId)\n }\n\n const startTouchDrag = (card: KanbanCard, e: ReactPointerEvent<HTMLElement>) => {\n const hasTargets = Boolean(dropTargets?.length && onDropTarget)\n if (!onCardMove && !hasTargets) return\n // Variável comum (não estado): guarda o destino sob o dedo para o onEnd ler direto,\n // sem efeito colateral dentro do updater do setState (StrictMode chamaria duas vezes).\n let overTargetId: string | null = null\n setTouchDrag({ cardId: card.id, overTargetId: null })\n bindPointerDrag(e.currentTarget, e, {\n onMove: (x, y) => {\n // A barra de destinos continua reconhecendo colunas por baixo: o toque só usa\n // a barra quando o dedo está de fato sobre ela, nunca no lugar da coluna.\n const targetHit = hasTargets ? findDragTarget(x, y, 'data-kanban-target') : null\n overTargetId = targetHit?.id ?? null\n if (targetHit) {\n setTouchDrag({ cardId: card.id, overTargetId: targetHit.id })\n return\n }\n if (hasTargets) setTouchDrag({ cardId: card.id, overTargetId: null })\n if (!onCardMove) return\n const found = findDragTarget(x, y, 'data-kanban-card')\n if (found && found.id !== card.id) {\n // O alvo achado na tela já dá o índice da lista completa (ids de `inColumn`).\n const list = inColumn(card.columnId)\n const toIndex = resolveDropIndex(\n list.map((c) => c.id),\n found,\n )\n onCardMove(card.id, card.columnId, toIndex)\n }\n },\n onEnd: () => {\n setTouchDrag(null)\n if (overTargetId) dropOnTarget(card.id, overTargetId)\n },\n })\n }\n\n const moveMenu = (card: KanbanCard) => {\n const hasTargets = Boolean(dropTargets?.length && onDropTarget)\n const otherColumns = onCardMove ? columns.filter((c) => c.id !== card.columnId) : []\n if (otherColumns.length === 0 && !hasTargets) return null\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Ações do card ${card.title}`}\n className=\"shrink-0\"\n >\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {otherColumns.length > 0 && (\n <>\n <DropdownMenuLabel>Mover para</DropdownMenuLabel>\n {otherColumns.map((c) => (\n <DropdownMenuItem\n key={c.id}\n onSelect={() => onCardMove?.(card.id, c.id, inColumn(c.id).length)}\n >\n <ArrowRightLeft />\n {c.title}\n </DropdownMenuItem>\n ))}\n </>\n )}\n {otherColumns.length > 0 && hasTargets && <DropdownMenuSeparator />}\n {hasTargets &&\n dropTargets!.map((t) => (\n <DropdownMenuItem\n key={t.id}\n disabled={t.disabled}\n onSelect={() => dropOnTarget(card.id, t.id)}\n >\n {t.icon ?? <ArrowRightLeft />}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate\">{t.label}</span>\n {t.disabled && t.disabledReason && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {t.disabledReason}\n </span>\n )}\n </span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n }\n\n /** Rodapé flutuante de destinos, mostrado durante o arraste (mouse ou toque). */\n const highlightedTarget = overTarget ?? touchDrag?.overTargetId ?? null\n const targetBar = showTargetBar && (\n <div\n aria-label=\"Soltar em\"\n className=\"fixed inset-x-4 bottom-4 z-30 grid grid-cols-2 gap-2 rounded-surface border bg-card p-2 shadow-lg md:flex md:justify-center md:overflow-x-auto\"\n >\n {dropTargets!.map((t) => {\n const tone = t.tone ?? 'neutral'\n const highlighted = !t.disabled && highlightedTarget === t.id\n return (\n <div\n key={t.id}\n data-kanban-target={t.id}\n data-over={highlighted ? 'true' : undefined}\n onDragEnter={() => {\n if (dragging && !t.disabled) setOverTarget(t.id)\n }}\n onDragOver={(e) => {\n if (dragging && !t.disabled) {\n e.preventDefault()\n setOverTarget(t.id)\n }\n }}\n onDragLeave={(e) => {\n // Passar do chip para o ícone ou o texto dentro dele não é sair do chip.\n if (e.relatedTarget instanceof Node && e.currentTarget.contains(e.relatedTarget))\n return\n setOverTarget((id) => (id === t.id ? null : id))\n }}\n onDrop={(e) => {\n e.preventDefault()\n setOverTarget(null)\n if (dragging) {\n dropOnTarget(dragging, t.id)\n setDragging(null)\n }\n }}\n className={cn(\n 'flex min-w-24 flex-col items-center gap-1 rounded-block border p-2 text-center text-xs transition-colors',\n t.disabled\n ? 'cursor-not-allowed bg-muted opacity-50'\n : highlighted\n ? cn(targetStrong[tone], 'ring-2 ring-ring')\n : targetSoft[tone],\n )}\n >\n {t.icon && (\n <span aria-hidden className={highlighted ? undefined : targetIconTone[tone]}>\n {t.icon}\n </span>\n )}\n <span className=\"font-medium\">{t.label}</span>\n {t.hint && !t.disabled && (\n <span className={highlighted ? undefined : 'text-muted-foreground'}>{t.hint}</span>\n )}\n {t.disabled && t.disabledReason && (\n <span className=\"text-muted-foreground\">{t.disabledReason}</span>\n )}\n </div>\n )\n })}\n </div>\n )\n\n const canTouchDrag = Boolean(onCardMove) || Boolean(dropTargets?.length && onDropTarget)\n const showHandle = isMobile && canTouchDrag\n\n const cardItem = (card: KanbanCard, index: number) => {\n const dragStart = (dataTransfer: DataTransfer | null) => {\n setDragging(card.id)\n if (!dataTransfer) return\n dataTransfer.effectAllowed = 'move'\n dataTransfer.setData('text/plain', card.id)\n }\n const dragEnd = () => {\n setDragging(null)\n setOver(null)\n setOverTarget(null)\n }\n const status = statusOf(card)\n const label = status && backgroundLabel(status)\n const common = {\n 'data-kanban-card': card.id,\n draggable: !isMobile && Boolean(onCardMove),\n onDragOver: (e: ReactDragEvent<HTMLLIElement>) => {\n if (!dragging) return\n e.preventDefault()\n e.stopPropagation()\n const r = e.currentTarget.getBoundingClientRect()\n const after = e.clientY > r.top + r.height / 2\n setOver({ column: card.columnId, index: index + (after ? 1 : 0) })\n },\n onDrop: (e: ReactDragEvent<HTMLLIElement>) => {\n e.preventDefault()\n e.stopPropagation()\n if (over) drop(over.column, over.index)\n },\n className: cn(\n 'relative flex rounded-block border',\n status ? statusBackground[status.background] : 'bg-card',\n 'p-3 shadow-sm transition-[box-shadow,opacity]',\n !isMobile && onCardMove && 'cursor-grab active:cursor-grabbing',\n (dragging === card.id || touchDrag?.cardId === card.id) && 'opacity-50',\n over?.column === card.columnId &&\n over.index === index &&\n dragging !== card.id &&\n 'ring-2 ring-ring ring-offset-2 ring-offset-muted',\n ),\n }\n const content = renderCard ? (\n renderCard(card)\n ) : (\n <CardBody card={card} show={show} withHandle={showHandle} />\n )\n // Sem rodapé (card só com título, descrição e contato), a estrutura é a de sempre; com\n // rodapé, o corpo e o rodapé viram irmãos num envoltório (o calendário é um botão e não\n // pode ficar dentro do botão de clique do card).\n const footer = renderCard\n ? null\n : cardFooter({\n card,\n status,\n show,\n valueFields: valueFields ?? [],\n formatValue,\n })\n const main = onCardClick ? (\n <button\n type=\"button\"\n onClick={() => onCardClick(card)}\n className={\n footer\n ? 'flex min-w-0 cursor-pointer flex-col gap-2 rounded-block text-left outline-none after:absolute after:inset-0 focus-visible:ring-2 focus-visible:ring-ring'\n : 'flex min-w-0 flex-1 cursor-pointer flex-col gap-2 rounded-block text-left outline-none after:absolute after:inset-0 focus-visible:ring-2 focus-visible:ring-ring'\n }\n >\n {content}\n </button>\n ) : (\n <div\n className={footer ? 'flex min-w-0 flex-col gap-2' : 'flex min-w-0 flex-1 flex-col gap-2'}\n >\n {content}\n </div>\n )\n const body = (\n <>\n {footer ? (\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n {main}\n {footer}\n </div>\n ) : (\n main\n )}\n {label && <span className=\"sr-only\">{label}</span>}\n {showHandle && (\n <button\n type=\"button\"\n aria-label={`Arrastar ${card.title}`}\n className=\"absolute top-2 left-2 z-10 flex size-touch touch-none items-center justify-center rounded-item text-muted-foreground active:cursor-grabbing\"\n onPointerDown={(e) => startTouchDrag(card, e)}\n >\n <GripVertical className=\"size-icon-sm\" aria-hidden />\n </button>\n )}\n <span className=\"absolute top-2 right-2 z-10\">{moveMenu(card)}</span>\n </>\n )\n\n if (lib) {\n const layout = layoutEnabled({ mode: motion, ready, dragging: touchDrag !== null })\n // O Motion toma `onDragStart`/`onDragEnd` para o gesto de arraste dele e os tira do DOM.\n // O arraste nativo (HTML5) do desktop segue por ouvintes `dragstart`/`dragend` ligados\n // direto no elemento; o layout só liga fora do arraste por toque (o arraste nativo não\n // muda a ordem até soltar, e ao soltar o layout anima o resultado).\n return (\n <lib.m.li\n key={card.id}\n ref={(el) => {\n if (!el) return\n const onStart = (e: DragEvent) => dragStart(e.dataTransfer)\n el.addEventListener('dragstart', onStart)\n el.addEventListener('dragend', dragEnd)\n return () => {\n el.removeEventListener('dragstart', onStart)\n el.removeEventListener('dragend', dragEnd)\n }\n }}\n layout={layout}\n layoutId={layout ? `${boardId}-${card.id}` : undefined}\n transition={presets.settle}\n {...common}\n >\n {body}\n </lib.m.li>\n )\n }\n return (\n <li\n key={card.id}\n onDragStart={(e) => dragStart(e.dataTransfer)}\n onDragEnd={dragEnd}\n {...common}\n >\n {body}\n </li>\n )\n }\n\n const totalFields = (valueFields ?? []).slice(0, 2)\n const sumOf = (list: KanbanCard[], key: string) =>\n list.reduce((sum, c) => sum + (c.values?.[key] ?? 0), 0)\n // Total do quadro visível: só os cards de etapas que o quadro mostra.\n const boardCards = visibleCards.filter((c) => columns.some((col) => col.id === c.columnId))\n const totals = (col: KanbanColumn) =>\n totalFields.map((f) => {\n const total = sumOf(visibleInColumn(col.id), f.key)\n const board = sumOf(boardCards, f.key)\n return { ...f, total, percent: board === 0 ? 0 : Math.round((total / board) * 100) }\n })\n\n const columnHeader = (col: KanbanColumn, count: number) => (\n <div className=\"flex flex-col gap-2 px-1\">\n <div className=\"flex items-center gap-2\">\n <span aria-hidden className={cn('size-2 rounded-full', dotTone[col.tone ?? 'neutral'])} />\n <h3 className=\"min-w-0 flex-1 truncate text-sm font-semibold\">{col.title}</h3>\n <Badge tone={col.limit && count > col.limit ? 'warning' : 'neutral'}>\n {col.limit ? `${count}/${col.limit}` : count}\n </Badge>\n {onAddCard && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Adicionar card em ${col.title}`}\n onClick={() => onAddCard(col.id)}\n className=\"-my-1 -mr-1 rounded-full\"\n >\n <Plus />\n </Button>\n )}\n </div>\n {col.cadenceDays !== undefined && (\n <p className=\"text-xs text-muted-foreground\">\n Cadência: {plural(col.cadenceDays, 'dia', 'dias')}\n </p>\n )}\n {valueFields && valueFields.length > 0 && (\n <div className=\"grid grid-cols-2 divide-x rounded-block bg-card text-xs\">\n {totals(col).map((t) => (\n <span key={t.key} className=\"flex min-w-0 flex-col px-2 py-1\">\n <span className=\"text-muted-foreground\">Total {t.label}</span>\n <span className=\"truncate font-semibold tabular-nums\">{formatValue(t.total)}</span>\n <span className=\"text-muted-foreground tabular-nums\">({t.percent}%)</span>\n </span>\n ))}\n </div>\n )}\n </div>\n )\n\n const columnList = (col: KanbanColumn) => {\n const all = visibleInColumn(col.id)\n const list = all.slice(0, limitOf(col.id))\n const more = all.length > list.length || Boolean(hasMore?.(col.id))\n return (\n <div\n data-kanban-scroll\n className=\"min-h-0 flex-1 scrollbar-subtle overflow-y-auto overscroll-y-contain\"\n >\n <ol\n // Remonta uma vez quando o domMax chega: o layout só vale para cards criados depois.\n key={String(ready)}\n aria-label={`Cards em ${col.title}`}\n onDragOver={(e) => {\n if (!dragging) return\n e.preventDefault()\n setOver({ column: col.id, index: list.length })\n }}\n onDrop={(e) => {\n e.preventDefault()\n drop(col.id, over?.column === col.id ? over.index : list.length)\n }}\n className={cn(\n 'flex min-h-24 flex-col gap-2 rounded-surface p-2 transition-colors',\n over?.column === col.id && 'bg-primary-soft/60',\n )}\n >\n {list.map((c, i) => cardItem(c, i))}\n {list.length === 0 && (\n <li className=\"flex min-h-16 items-center justify-center rounded-item border border-dashed text-xs text-muted-foreground\">\n Nenhum card\n </li>\n )}\n {more && (\n <LoadMore\n onVisible={() => {\n if (all.length > list.length)\n setShown((s) => ({ ...s, [col.id]: limitOf(col.id) + pageSize }))\n else onLoadMore?.(col.id)\n }}\n />\n )}\n </ol>\n </div>\n )\n }\n\n // ------------------------------------------------------------ barra do quadro\n\n const assignees = [...new Set(cards.map((c) => c.assignee).filter((a): a is string => !!a))].sort(\n (a, b) => a.localeCompare(b, 'pt-BR'),\n )\n const filterCount = (assigneeFilter ? 1 : 0) + (situationFilter ? 1 : 0)\n const hasFilters = assignees.length > 0 || statusEnabled\n const toolbarNode = toolbar && (\n <DataToolbar\n search={{ value: query, onChange: setQuery, placeholder: 'Buscar card' }}\n filters={\n hasFilters ? (\n <div className=\"flex flex-col gap-4\">\n {assignees.length > 0 && (\n <Field label=\"Responsável\" span=\"full\">\n <Select\n placeholder=\"Todos\"\n clearable\n options={assignees.map((a) => ({ value: a, label: a }))}\n value={assigneeFilter}\n onChange={setAssigneeFilter}\n />\n </Field>\n )}\n {statusEnabled && (\n <Field label=\"Situação\" span=\"full\">\n <Select\n placeholder=\"Todas\"\n clearable\n options={situationOptions}\n value={situationFilter}\n onChange={setSituationFilter}\n />\n </Field>\n )}\n </div>\n ) : undefined\n }\n filterCount={filterCount}\n onClearFilters={() => {\n setAssigneeFilter(null)\n setSituationFilter(null)\n }}\n summary={\n totalFields.length > 0\n ? totalFields.map((f) => (\n <span key={f.key} className=\"flex items-baseline gap-1\">\n <span className=\"text-muted-foreground\">Total {f.label}:</span>\n <span className=\"font-semibold tabular-nums\">\n {formatValue(sumOf(boardCards, f.key))}\n </span>\n </span>\n ))\n : undefined\n }\n actions={\n <Button variant=\"outline\" icon={<Settings2 />} onClick={() => setCustomizing(true)}>\n Customizar\n </Button>\n }\n primaryAction={\n onNewCard ? (\n <Button icon={<Plus />} onClick={() => onNewCard()}>\n Novo card\n </Button>\n ) : undefined\n }\n />\n )\n\n const customizeFields = [\n ...baseFields.map((f) => ({ id: f.id as string, label: f.label as string })),\n ...totalFields.map((f) => ({ id: `value:${f.key}`, label: f.label })),\n ]\n const customizeDrawer = toolbar && (\n <Drawer\n open={customizing}\n onOpenChange={setCustomizing}\n title=\"Customizar\"\n icon={<Settings2 />}\n footer={\n <ActionBar\n cancel={{ label: 'Restaurar', onClick: () => changeHidden({}) }}\n primary={{ label: 'Pronto', onClick: () => setCustomizing(false) }}\n />\n }\n >\n <div className=\"flex flex-col gap-1\">\n {customizeFields.map((f) => (\n <Checkbox\n key={f.id}\n label={f.label}\n checked={show(f.id)}\n onCheckedChange={(checked) => changeHidden({ ...hidden, [f.id]: !checked })}\n />\n ))}\n </div>\n </Drawer>\n )\n\n // ------------------------------------------------------------ confirmação do destino\n\n const pendingTarget = pendingDrop && dropTargets?.find((t) => t.id === pendingDrop.targetId)\n const pendingCard = pendingDrop && cards.find((c) => c.id === pendingDrop.cardId)\n // O card saiu do quadro por outro caminho com o modal aberto: fecha sem agir.\n useEffect(() => {\n if (pendingDrop && !pendingCard) setPendingDrop(null)\n }, [pendingDrop, pendingCard])\n const confirmation =\n pendingDrop && pendingTarget?.confirm && pendingCard ? (\n <Modal\n open\n onOpenChange={(next) => !next && setPendingDrop(null)}\n type={pendingTarget.confirm.destructive ? 'destructive' : 'confirm'}\n title={pendingTarget.confirm.title}\n description={pendingTarget.confirm.description}\n confirmLabel={pendingTarget.confirm.confirmLabel ?? pendingTarget.label}\n onConfirm={() =>\n onDropTarget?.(pendingDrop.cardId, pendingDrop.targetId, reason || undefined)\n }\n >\n <dl className=\"flex w-full flex-col gap-1 rounded-block bg-muted p-3 text-left text-sm\">\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-muted-foreground\">Empresa</dt>\n <dd className=\"font-medium\">{pendingCard.title}</dd>\n </div>\n {pendingCard.subtitle && (\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-muted-foreground\">Documento</dt>\n <dd className=\"tabular-nums\">{pendingCard.subtitle}</dd>\n </div>\n )}\n <div className=\"flex justify-between gap-2\">\n <dt className=\"text-muted-foreground\">Etapa</dt>\n <dd>{columns.find((c) => c.id === pendingCard.columnId)?.title}</dd>\n </div>\n {totalFields.map((f) => (\n <div key={f.key} className=\"flex justify-between gap-2\">\n <dt className=\"text-muted-foreground\">{f.label}:</dt>\n <dd className=\"font-semibold tabular-nums\">\n {formatValue(pendingCard.values?.[f.key] ?? 0)}\n </dd>\n </div>\n ))}\n </dl>\n {pendingTarget.confirm.reasons && (\n <div className=\"flex w-full flex-col gap-1 text-left\">\n <span className=\"text-sm font-medium\">Motivo</span>\n <Select\n label=\"Motivo\"\n options={pendingTarget.confirm.reasons}\n value={reason}\n onChange={(value) => setReason(value ?? '')}\n />\n </div>\n )}\n </Modal>\n ) : null\n\n if (isMobile) {\n const board = (\n <div\n ref={boardRef}\n className={cn('flex h-board min-w-0 flex-col gap-3', className)}\n aria-label={aria['aria-label']}\n data-rendra={code}\n >\n {targetBar}\n <Tabs\n variant=\"pill\"\n aria-label=\"Colunas\"\n value={active}\n onChange={setActive}\n items={columns.map((col) => ({\n value: col.id,\n label: col.title,\n count: visibleInColumn(col.id).length,\n content: null,\n }))}\n />\n {columns\n .filter((col) => col.id === active)\n .map((col) => (\n <div\n key={col.id}\n className=\"flex min-h-0 flex-1 flex-col gap-2 rounded-surface bg-muted p-2\"\n >\n {columnHeader(col, visibleInColumn(col.id).length)}\n {columnList(col)}\n </div>\n ))}\n </div>\n )\n return (\n <>\n {toolbar ? (\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"rounded-surface border bg-card\">{toolbarNode}</div>\n {board}\n </div>\n ) : (\n board\n )}\n {customizeDrawer}\n {confirmation}\n </>\n )\n }\n\n const board = (\n <section\n ref={boardRef}\n aria-label={aria['aria-label'] ?? 'Quadro kanban'}\n data-rendra={code}\n data-allow-overflow\n style={{ '--kanban-cols': Math.min(visibleColumns, columns.length) } as CSSProperties}\n className={cn('flex h-board min-w-0 scrollbar-subtle gap-4 overflow-x-auto', className)}\n >\n {targetBar}\n {columns.map((col) => (\n <div\n key={col.id}\n className=\"flex min-h-0 w-kanban-col flex-col gap-2 rounded-surface bg-muted p-2\"\n >\n <div className=\"pt-1\">{columnHeader(col, visibleInColumn(col.id).length)}</div>\n {columnList(col)}\n </div>\n ))}\n </section>\n )\n return (\n <>\n {toolbar ? (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <div className=\"rounded-surface border bg-card\">{toolbarNode}</div>\n {board}\n </div>\n ) : (\n board\n )}\n {customizeDrawer}\n {confirmation}\n </>\n )\n}\n\n/** Move um card na lista (para usar no onCardMove): devolve a lista nova. */\nexport function moveKanbanCard(\n cards: KanbanCard[],\n cardId: string,\n toColumnId: string,\n toIndex: number,\n) {\n const card = cards.find((c) => c.id === cardId)\n if (!card) return cards\n const rest = cards.filter((c) => c.id !== cardId)\n const target = rest.filter((c) => c.columnId === toColumnId)\n const before = target[Math.min(toIndex, target.length)]\n const moved = { ...card, columnId: toColumnId }\n if (!before) {\n const lastIndex = rest.map((c) => c.columnId).lastIndexOf(toColumnId)\n const at = lastIndex === -1 ? rest.length : lastIndex + 1\n return [...rest.slice(0, at), moved, ...rest.slice(at)]\n }\n const at = rest.indexOf(before)\n return [...rest.slice(0, at), moved, ...rest.slice(at)]\n}\n","import { GripVertical } from 'lucide-react'\nimport { cn } from '@/lib/cn'\nimport type { UseSortableResult } from '@/lib/sortable'\n\nexport interface SortableHandleProps {\n id: string\n /** Nome acessível da alça (ex.: \"Reordenar Cliente A\"). */\n label: string\n /** O resultado de useSortable (motor de src/lib/sortable.ts). */\n sortable: Pick<UseSortableResult, 'handleProps'>\n className?: string\n}\n\n/**\n * Alça de arraste única, reaproveitada pela List e pelo Upload (o Kanban tem alça própria,\n * por ser posicionada dentro do card e não ter movimento por seta): pointer down inicia o\n * arraste (mouse e toque) e as setas ↑/↓ movem uma posição pelo teclado, tudo vindo do\n * motor (useSortable), sem duplicar aqui a lógica de mover.\n */\nexport function SortableHandle({ id, label, sortable, className }: SortableHandleProps) {\n const handle = sortable.handleProps(id)\n return (\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n 'flex size-touch shrink-0 cursor-grab items-center justify-center rounded-item text-muted-foreground active:cursor-grabbing',\n handle.className,\n className,\n )}\n onPointerDown={handle.onPointerDown}\n onKeyDown={handle.onKeyDown}\n >\n <GripVertical className=\"size-icon-sm\" aria-hidden />\n </button>\n )\n}\n","import { ChevronRight } from 'lucide-react'\nimport type { ElementType, ReactNode } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { useRendraLink } from '@/components/rendra-provider'\nimport { Badge } from '@/components/ui/badge'\nimport { SortableHandle } from '@/components/ui/sortable-handle'\nimport { cn } from '@/lib/cn'\nimport {\n layoutEnabled,\n useLayoutReady,\n useMotionLib,\n useMotionMode,\n useMotionPresets,\n} from '@/lib/motion'\nimport { useSortable } from '@/lib/sortable'\n\nexport interface ListItem {\n id: string\n title: ReactNode\n description?: ReactNode\n /** Avatar, ícone ou imagem à esquerda. */\n leading?: ReactNode\n /** Valor, badge ou ação à direita. */\n trailing?: ReactNode\n /** Torna a linha navegável. */\n to?: string\n onClick?: () => void\n /** Selo textual de status da linha, com contraste AA (nunca só cor). */\n tone?: 'success' | 'error' | 'warning' | 'neutral'\n}\n\nexport interface ListProps {\n items: ListItem[]\n /** Linhas separadas por borda (padrão) ou sem divisória. */\n divided?: boolean\n empty?: ReactNode\n className?: string\n /**\n * Reordena os itens por arraste (mouse e toque) e por teclado (setas ↑/↓ na alça).\n * Sem ela a lista é só leitura e a alça de arraste não aparece.\n */\n onReorder?: (items: ListItem[]) => void\n /** Nome acessível de cada item para a alça de arraste (ex.: \"Cliente A\"). Padrão: o título, em texto. */\n itemLabel?: (item: ListItem) => string\n}\n\nconst toneLabel: Record<NonNullable<ListItem['tone']>, string> = {\n success: 'Sucesso',\n warning: 'Atenção',\n error: 'Erro',\n neutral: 'Neutro',\n}\n\nconst toneBadge: Record<\n NonNullable<ListItem['tone']>,\n 'success' | 'warning' | 'error' | 'neutral'\n> = {\n success: 'success',\n warning: 'warning',\n error: 'error',\n neutral: 'neutral',\n}\n\nfunction defaultItemLabel(item: ListItem): string {\n return typeof item.title === 'string' ? item.title : item.id\n}\n\n/** Lista única: linhas com início, título, descrição e fim; navegável por prop; reordenável por prop. */\nexport function List({\n items,\n divided = true,\n empty,\n className,\n onReorder,\n itemLabel = defaultItemLabel,\n}: ListProps) {\n const Link = useRendraLink()\n const sortable = useSortable<ListItem>({\n items: items.map((it) => ({ id: it.id, data: it })),\n onReorder: onReorder && ((sorted) => onReorder(sorted.map((s) => s.data))),\n })\n const sortableEnabled = Boolean(onReorder)\n const motion = useMotionMode()\n const lib = useMotionLib()\n const ready = useLayoutReady()\n const presets = useMotionPresets()\n // Em `on` o item anima o layout, mas só fora do arraste: sob o ponteiro a ordem muda a cada\n // passo e animar atrasaria a linha atrás do cursor. Pelo teclado (moveBy) o layout anima.\n const Item: ElementType = lib ? lib.m.li : 'li'\n const itemMotion =\n motion === 'on'\n ? {\n layout: layoutEnabled({ mode: motion, ready, dragging: sortable.draggingId !== null }),\n transition: presets.move,\n }\n : {}\n const code = resolveCatalogCode('List', { sortable: sortableEnabled })\n\n if (items.length === 0 && empty) return <>{empty}</>\n return (\n <ul\n // Remonta uma vez quando o domMax chega: o layout só vale para itens criados depois disso.\n key={String(ready)}\n data-rendra={code}\n className={cn('flex w-full min-w-0 flex-col', divided && 'divide-y', className)}\n >\n {items.map((it) => {\n const interactive = Boolean(it.to || it.onClick)\n const body = (\n <>\n {it.leading && <span className=\"flex shrink-0\">{it.leading}</span>}\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"truncate text-sm font-medium\">{it.title}</span>\n {it.description && (\n <span className=\"line-clamp-2 text-sm text-muted-foreground\">{it.description}</span>\n )}\n </span>\n {it.tone && (\n <Badge tone={toneBadge[it.tone]} className=\"shrink-0\">\n {toneLabel[it.tone]}\n </Badge>\n )}\n {it.trailing && <span className=\"flex shrink-0 items-center\">{it.trailing}</span>}\n {interactive && (\n <ChevronRight className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n )}\n </>\n )\n const cls = cn(\n 'flex min-h-touch w-full min-w-0 items-center gap-3 py-3 text-left',\n interactive && '-mx-2 rounded-item px-2 transition-colors hover:bg-accent',\n )\n const label = itemLabel(it)\n const handle = sortableEnabled && (\n <SortableHandle id={it.id} label={`Reordenar ${label}`} sortable={sortable} />\n )\n return (\n <Item\n key={it.id}\n {...(sortableEnabled ? sortable.itemProps(it.id) : {})}\n {...itemMotion}\n className={cn(\n 'flex min-w-0 items-center gap-1',\n sortable.draggingId === it.id && 'opacity-50',\n )}\n >\n {handle}\n {it.to ? (\n <Link to={it.to} className={cls}>\n {body}\n </Link>\n ) : it.onClick ? (\n <button type=\"button\" onClick={it.onClick} className={cls}>\n {body}\n </button>\n ) : (\n <div className={cls}>{body}</div>\n )}\n </Item>\n )\n })}\n </ul>\n )\n}\n","import {\n useRef,\n type ClipboardEvent,\n type CSSProperties,\n type ElementType,\n type KeyboardEvent,\n} from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface OtpInputProps {\n /** Quantidade de dígitos. Padrão 6. */\n length?: number\n value: string\n onChange: (value: string) => void\n /** Chamado quando todos os dígitos foram preenchidos. */\n onComplete?: (value: string) => void\n invalid?: boolean\n disabled?: boolean\n id?: string\n 'aria-describedby'?: string\n}\n\n/**\n * Código de verificação (2FA, confirmação de e-mail). Uma caixa por dígito, aceita colar\n * o código inteiro, teclado numérico no celular e preenchimento automático por SMS.\n */\nexport function OtpInput({\n length = 6,\n value,\n onChange,\n onComplete,\n invalid,\n disabled,\n id,\n ...aria\n}: OtpInputProps) {\n const refs = useRef<(HTMLInputElement | null)[]>([])\n const lib = useMotionLib()\n const on = lib !== null\n const presets = useMotionPresets()\n // Em `on` a célula que recebe um dígito faz um salto curto de escala.\n const Cell: ElementType = on ? lib.m.input : 'input'\n const digits = Array.from({ length }, (_, i) => value[i] ?? '')\n\n const set = (next: string) => {\n const clean = next.replace(/\\D/g, '').slice(0, length)\n onChange(clean)\n if (clean.length === length) onComplete?.(clean)\n }\n\n const onKey = (i: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !digits[i] && i > 0) refs.current[i - 1]?.focus()\n if (e.key === 'ArrowLeft' && i > 0) refs.current[i - 1]?.focus()\n if (e.key === 'ArrowRight' && i < length - 1) refs.current[i + 1]?.focus()\n }\n\n const onPaste = (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length)\n set(pasted)\n refs.current[Math.min(pasted.length, length - 1)]?.focus()\n }\n\n return (\n <div\n id={id}\n role=\"group\"\n aria-label=\"Código de verificação\"\n aria-describedby={aria['aria-describedby']}\n data-rendra=\"OTP-001\"\n // gap-1 no celular: 6 casas com 44px de toque mesmo dentro de um card em 360px.\n className=\"grid w-full max-w-sm grid-cols-otp gap-1 sm:gap-2\"\n style={{ '--otp': length } as CSSProperties}\n >\n {digits.map((d, i) => (\n <Cell\n key={i}\n {...(on ? { animate: d ? presets.bump : undefined } : {})}\n ref={(el) => {\n refs.current[i] = el\n }}\n value={d}\n disabled={disabled}\n inputMode=\"numeric\"\n autoComplete={i === 0 ? 'one-time-code' : 'off'}\n maxLength={1}\n aria-label={`Dígito ${i + 1} de ${length}`}\n aria-invalid={invalid || undefined}\n onPaste={onPaste}\n onKeyDown={(e) => onKey(i, e)}\n onFocus={(e) => e.target.select()}\n onChange={(e) => {\n const ch = e.target.value.replace(/\\D/g, '').slice(-1)\n const arr = digits.slice()\n arr[i] = ch\n set(arr.join(''))\n if (ch && i < length - 1) refs.current[i + 1]?.focus()\n }}\n className={cn(\n 'h-control-lg w-full min-w-0 rounded-control border border-input bg-field text-center text-xl font-semibold tabular-nums transition-[border-color,box-shadow] outline-none focus:border-ring focus:ring-2 focus:ring-ring/25 disabled:opacity-60',\n d && 'border-primary',\n invalid && 'border-destructive focus:border-destructive focus:ring-destructive/25',\n )}\n />\n ))}\n </div>\n )\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { Button } from '@/components/ui/button'\nimport { Select } from '@/components/ui/select'\nimport { cn } from '@/lib/cn'\n\nexport interface PaginationProps {\n /** Página atual, começando em 1. */\n page: number\n pageSize: number\n total: number\n onPageChange: (page: number) => void\n onPageSizeChange?: (size: number) => void\n pageSizes?: number[]\n /**\n * Mobile: 'pages' mostra anterior e próxima com \"Página 2 de 25\";\n * 'loadMore' troca por um botão \"Carregar mais\".\n */\n mobileMode?: 'pages' | 'loadMore'\n loading?: boolean\n className?: string\n}\n\nfunction range(page: number, pages: number): (number | '...')[] {\n if (pages <= 7) return Array.from({ length: pages }, (_, i) => i + 1)\n if (page <= 4) return [1, 2, 3, 4, 5, '...', pages]\n if (page >= pages - 3) return [1, '...', pages - 4, pages - 3, pages - 2, pages - 1, pages]\n return [1, '...', page - 1, page, page + 1, '...', pages]\n}\n\n/** Paginação única: completa no desktop, compacta ou \"carregar mais\" no mobile. */\nexport function Pagination({\n page,\n pageSize,\n total,\n onPageChange,\n onPageSizeChange,\n pageSizes = [15, 30, 50],\n mobileMode = 'pages',\n loading,\n className,\n}: PaginationProps) {\n const pages = Math.max(1, Math.ceil(total / pageSize))\n const from = total === 0 ? 0 : (page - 1) * pageSize + 1\n const to = Math.min(total, page * pageSize)\n const fmt = (n: number) => n.toLocaleString('pt-BR')\n\n return (\n <nav\n aria-label=\"Paginação\"\n data-rendra=\"PAG-001\"\n className={cn('flex min-w-0 flex-col gap-3', className)}\n >\n {/* Mobile */}\n <div className=\"flex flex-col gap-3 md:hidden\">\n {mobileMode === 'loadMore' ? (\n page < pages && (\n <Button\n variant=\"outline\"\n fullWidth\n loading={loading}\n onClick={() => onPageChange(page + 1)}\n >\n Carregar mais\n </Button>\n )\n ) : (\n <div className=\"grid grid-cols-2 gap-3\">\n <Button\n variant=\"outline\"\n icon={<ChevronLeft />}\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n >\n Anterior\n </Button>\n <Button\n variant=\"outline\"\n iconRight={<ChevronRight />}\n disabled={page >= pages}\n onClick={() => onPageChange(page + 1)}\n >\n Próxima\n </Button>\n </div>\n )}\n <p className=\"text-center text-xs text-muted-foreground tabular-nums\">\n {mobileMode === 'loadMore'\n ? `${fmt(to)} de ${fmt(total)}`\n : `Página ${fmt(page)} de ${fmt(pages)}`}\n </p>\n </div>\n\n {/* Desktop */}\n <div className=\"hidden items-center justify-between gap-4 md:flex\">\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground\">\n <span className=\"tabular-nums\">\n {fmt(from)} a {fmt(to)} de {fmt(total)}\n </span>\n {onPageSizeChange && (\n <div className=\"w-3xs\">\n <Select\n size=\"sm\"\n label=\"Itens por página\"\n value={String(pageSize)}\n onChange={(v) => v && onPageSizeChange(Number(v))}\n options={pageSizes.map((s) => ({ value: String(s), label: `${s} por página` }))}\n />\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label=\"Página anterior\"\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n >\n <ChevronLeft />\n </Button>\n {range(page, pages).map((p, i) =>\n p === '...' ? (\n <span key={`e${i}`} className=\"px-2 text-sm text-muted-foreground\" aria-hidden>\n ...\n </span>\n ) : (\n <Button\n key={p}\n size=\"sm\"\n variant={p === page ? 'secondary' : 'ghost'}\n aria-current={p === page ? 'page' : undefined}\n aria-label={`Página ${p}`}\n onClick={() => onPageChange(p)}\n className=\"min-w-8 px-2 tabular-nums\"\n >\n {p}\n </Button>\n ),\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label=\"Próxima página\"\n disabled={page >= pages}\n onClick={() => onPageChange(page + 1)}\n >\n <ChevronRight />\n </Button>\n </div>\n </div>\n </nav>\n )\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { Progress as P } from 'radix-ui'\nimport type { CSSProperties } from 'react'\nimport { cn } from '@/lib/cn'\n\nconst bar = cva(\n 'h-full rounded-full transition-[width] duration-(--rendra-duration-base) ease-linear',\n {\n variants: {\n tone: {\n primary: 'bg-primary',\n brand: 'bg-gradient-accent',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-destructive',\n },\n },\n defaultVariants: { tone: 'primary' },\n },\n)\n\nexport interface ProgressProps extends VariantProps<typeof bar> {\n /** 0 a 100. Sem valor: indeterminado (animado). */\n value?: number | null\n size?: 'sm' | 'md'\n /** Mostra o percentual à direita. */\n showValue?: boolean\n label?: string\n className?: string\n}\n\n/** Barra de progresso única. tone=\"brand\" usa o degradê de detalhe do template. */\nexport function Progress({ value, size = 'md', tone, showValue, label, className }: ProgressProps) {\n const indeterminate = value == null\n return (\n <div data-rendra=\"PROG-001\" className={cn('flex min-w-0 items-center gap-3', className)}>\n <P.Root\n value={indeterminate ? null : value}\n aria-label={label}\n // A barra indeterminada corre além do trilho e o trilho a recorta (overflow-hidden):\n // a auditoria de layout não deve tratá-la como elemento fora da tela.\n data-allow-overflow\n className={cn(\n 'relative w-full overflow-hidden rounded-full bg-muted',\n size === 'sm' ? 'h-1' : 'h-2',\n )}\n >\n <P.Indicator\n className={cn(\n bar({ tone }),\n indeterminate ? 'absolute inset-y-0 left-0 w-1/3 progress-slide' : 'w-progress',\n )}\n style={\n indeterminate\n ? undefined\n : ({ '--progress': `${Math.min(100, Math.max(0, value))}%` } as CSSProperties)\n }\n />\n </P.Root>\n {showValue && !indeterminate && (\n <span className=\"w-12 shrink-0 text-right text-xs font-medium text-muted-foreground tabular-nums\">\n {Math.round(value)}%\n </span>\n )}\n </div>\n )\n}\n","/**\n * Codificador de QR Code próprio, sem biblioteca externa. Modo byte (qualquer texto,\n * inclusive acentos, via UTF-8), versões 1 a 10, as quatro correções de erro (L, M, Q, H),\n * Reed-Solomon em GF(256), as 8 máscaras com penalidade (ISO/IEC 18004) e informação de\n * formato (e de versão, a partir da versão 7). Cada etapa segue o algoritmo publicado do\n * padrão; as tabelas de capacidade, os coeficientes do Reed-Solomon e as posições de\n * alinhamento vêm da própria especificação.\n */\n\nexport type ErrorCorrectionLevel = 'low' | 'medium' | 'quartile' | 'high'\n\nexport interface QrMatrix {\n version: number\n size: number\n /** modules[linha][coluna]; true é módulo escuro. */\n modules: boolean[][]\n}\n\n/** Valor grande demais (ou codificação impossível) até a versão 10 no nível pedido. */\nexport class QrEncodingError extends Error {}\n\nconst LEVEL_LETTER: Record<ErrorCorrectionLevel, 'L' | 'M' | 'Q' | 'H'> = {\n low: 'L',\n medium: 'M',\n quartile: 'Q',\n high: 'H',\n}\n\n// Indicador de 2 bits do nível de correção de erro, usado na informação de formato.\nconst LEVEL_BITS: Record<ErrorCorrectionLevel, number> = { low: 1, medium: 0, quartile: 3, high: 2 }\n\ninterface BlockInfo {\n totalDataCodewords: number\n ecCodewordsPerBlock: number\n group1Blocks: number\n group1DataPerBlock: number\n group2Blocks: number\n group2DataPerBlock: number\n}\n\n// Tabela de blocos (ISO/IEC 18004), versões 1 a 10, quatro níveis de correção.\nconst CAPACITY: Record<number, Record<'L' | 'M' | 'Q' | 'H', BlockInfo>> = {\n 1: {\n L: {\n totalDataCodewords: 19,\n ecCodewordsPerBlock: 7,\n group1Blocks: 1,\n group1DataPerBlock: 19,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 16,\n ecCodewordsPerBlock: 10,\n group1Blocks: 1,\n group1DataPerBlock: 16,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 13,\n ecCodewordsPerBlock: 13,\n group1Blocks: 1,\n group1DataPerBlock: 13,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 9,\n ecCodewordsPerBlock: 17,\n group1Blocks: 1,\n group1DataPerBlock: 9,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 2: {\n L: {\n totalDataCodewords: 34,\n ecCodewordsPerBlock: 10,\n group1Blocks: 1,\n group1DataPerBlock: 34,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 28,\n ecCodewordsPerBlock: 16,\n group1Blocks: 1,\n group1DataPerBlock: 28,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 22,\n ecCodewordsPerBlock: 22,\n group1Blocks: 1,\n group1DataPerBlock: 22,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 16,\n ecCodewordsPerBlock: 28,\n group1Blocks: 1,\n group1DataPerBlock: 16,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 3: {\n L: {\n totalDataCodewords: 55,\n ecCodewordsPerBlock: 15,\n group1Blocks: 1,\n group1DataPerBlock: 55,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 44,\n ecCodewordsPerBlock: 26,\n group1Blocks: 1,\n group1DataPerBlock: 44,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 34,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 17,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 26,\n ecCodewordsPerBlock: 22,\n group1Blocks: 2,\n group1DataPerBlock: 13,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 4: {\n L: {\n totalDataCodewords: 80,\n ecCodewordsPerBlock: 20,\n group1Blocks: 1,\n group1DataPerBlock: 80,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 64,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 32,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 48,\n ecCodewordsPerBlock: 26,\n group1Blocks: 2,\n group1DataPerBlock: 24,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 36,\n ecCodewordsPerBlock: 16,\n group1Blocks: 4,\n group1DataPerBlock: 9,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 5: {\n L: {\n totalDataCodewords: 108,\n ecCodewordsPerBlock: 26,\n group1Blocks: 1,\n group1DataPerBlock: 108,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 86,\n ecCodewordsPerBlock: 24,\n group1Blocks: 2,\n group1DataPerBlock: 43,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 62,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 15,\n group2Blocks: 2,\n group2DataPerBlock: 16,\n },\n H: {\n totalDataCodewords: 46,\n ecCodewordsPerBlock: 22,\n group1Blocks: 2,\n group1DataPerBlock: 11,\n group2Blocks: 2,\n group2DataPerBlock: 12,\n },\n },\n 6: {\n L: {\n totalDataCodewords: 136,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 68,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 108,\n ecCodewordsPerBlock: 16,\n group1Blocks: 4,\n group1DataPerBlock: 27,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 76,\n ecCodewordsPerBlock: 24,\n group1Blocks: 4,\n group1DataPerBlock: 19,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n H: {\n totalDataCodewords: 60,\n ecCodewordsPerBlock: 28,\n group1Blocks: 4,\n group1DataPerBlock: 15,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n },\n 7: {\n L: {\n totalDataCodewords: 156,\n ecCodewordsPerBlock: 20,\n group1Blocks: 2,\n group1DataPerBlock: 78,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 124,\n ecCodewordsPerBlock: 18,\n group1Blocks: 4,\n group1DataPerBlock: 31,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n Q: {\n totalDataCodewords: 88,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 14,\n group2Blocks: 4,\n group2DataPerBlock: 15,\n },\n H: {\n totalDataCodewords: 66,\n ecCodewordsPerBlock: 26,\n group1Blocks: 4,\n group1DataPerBlock: 13,\n group2Blocks: 1,\n group2DataPerBlock: 14,\n },\n },\n 8: {\n L: {\n totalDataCodewords: 194,\n ecCodewordsPerBlock: 24,\n group1Blocks: 2,\n group1DataPerBlock: 97,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 154,\n ecCodewordsPerBlock: 22,\n group1Blocks: 2,\n group1DataPerBlock: 38,\n group2Blocks: 2,\n group2DataPerBlock: 39,\n },\n Q: {\n totalDataCodewords: 110,\n ecCodewordsPerBlock: 22,\n group1Blocks: 4,\n group1DataPerBlock: 18,\n group2Blocks: 2,\n group2DataPerBlock: 19,\n },\n H: {\n totalDataCodewords: 86,\n ecCodewordsPerBlock: 26,\n group1Blocks: 4,\n group1DataPerBlock: 14,\n group2Blocks: 2,\n group2DataPerBlock: 15,\n },\n },\n 9: {\n L: {\n totalDataCodewords: 232,\n ecCodewordsPerBlock: 30,\n group1Blocks: 2,\n group1DataPerBlock: 116,\n group2Blocks: 0,\n group2DataPerBlock: 0,\n },\n M: {\n totalDataCodewords: 182,\n ecCodewordsPerBlock: 22,\n group1Blocks: 3,\n group1DataPerBlock: 36,\n group2Blocks: 2,\n group2DataPerBlock: 37,\n },\n Q: {\n totalDataCodewords: 132,\n ecCodewordsPerBlock: 20,\n group1Blocks: 4,\n group1DataPerBlock: 16,\n group2Blocks: 4,\n group2DataPerBlock: 17,\n },\n H: {\n totalDataCodewords: 100,\n ecCodewordsPerBlock: 24,\n group1Blocks: 4,\n group1DataPerBlock: 12,\n group2Blocks: 4,\n group2DataPerBlock: 13,\n },\n },\n 10: {\n L: {\n totalDataCodewords: 274,\n ecCodewordsPerBlock: 18,\n group1Blocks: 2,\n group1DataPerBlock: 68,\n group2Blocks: 2,\n group2DataPerBlock: 69,\n },\n M: {\n totalDataCodewords: 216,\n ecCodewordsPerBlock: 26,\n group1Blocks: 4,\n group1DataPerBlock: 43,\n group2Blocks: 1,\n group2DataPerBlock: 44,\n },\n Q: {\n totalDataCodewords: 154,\n ecCodewordsPerBlock: 24,\n group1Blocks: 6,\n group1DataPerBlock: 19,\n group2Blocks: 2,\n group2DataPerBlock: 20,\n },\n H: {\n totalDataCodewords: 122,\n ecCodewordsPerBlock: 28,\n group1Blocks: 6,\n group1DataPerBlock: 15,\n group2Blocks: 2,\n group2DataPerBlock: 16,\n },\n },\n}\n\nexport const QR_MAX_VERSION = 10\n\n// Coordenadas candidatas do padrão de alinhamento (linha ou coluna), por versão. A versão 1\n// não tem padrão de alinhamento. Os módulos reais são o produto cartesiano da lista consigo\n// mesma, menos os três cantos que colidiriam com os localizadores.\nconst ALIGNMENT_COORDS: Record<number, number[]> = {\n 1: [],\n 2: [6, 18],\n 3: [6, 22],\n 4: [6, 26],\n 5: [6, 30],\n 6: [6, 34],\n 7: [6, 22, 38],\n 8: [6, 24, 42],\n 9: [6, 26, 46],\n 10: [6, 28, 50],\n}\n\n/* --------------------------------------------------------------- Reed-Solomon em GF(256) */\n\n// Multiplicação em GF(2^8) com o polinômio primitivo 0x11D (x^8 + x^4 + x^3 + x^2 + 1).\nexport function reedSolomonMultiply(x: number, y: number): number {\n let z = 0\n for (let i = 7; i >= 0; i--) {\n z = (z << 1) ^ ((z >>> 7) * 0x11d)\n z ^= ((y >>> i) & 1) * x\n }\n return z & 0xff\n}\n\n/** Polinômio gerador de grau `degree` (produto de (x - 2^i) para i de 0 a degree-1). */\nexport function reedSolomonComputeDivisor(degree: number): number[] {\n const result: number[] = new Array(degree - 1).fill(0)\n result.push(1)\n let root = 1\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = reedSolomonMultiply(result[j] as number, root)\n if (j + 1 < result.length) result[j] = (result[j] as number) ^ (result[j + 1] as number)\n }\n root = reedSolomonMultiply(root, 0x02)\n }\n return result\n}\n\n/** Resto da divisão polinomial de `data` pelo `divisor`: os codewords de correção de erro. */\nexport function reedSolomonComputeRemainder(data: number[], divisor: number[]): number[] {\n const result = divisor.map(() => 0)\n for (const b of data) {\n const factor = b ^ (result.shift() as number)\n result.push(0)\n divisor.forEach((coef, i) => {\n result[i] = (result[i] as number) ^ reedSolomonMultiply(coef, factor)\n })\n }\n return result\n}\n\n/** Codewords de correção de erro para `data`, com `ecLength` codewords de saída. */\nexport function reedSolomonEncode(data: number[], ecLength: number): number[] {\n return reedSolomonComputeRemainder(data, reedSolomonComputeDivisor(ecLength))\n}\n\n/* --------------------------------------------------------------------- Dados (modo byte) */\n\nfunction pushBits(bits: number[], value: number, length: number): void {\n for (let i = length - 1; i >= 0; i--) bits.push((value >>> i) & 1)\n}\n\n/** Exportada só para teste direto (isola a montagem dos codewords de dados do resto do pipeline). */\nexport function buildDataCodewords(\n bytes: Uint8Array,\n version: number,\n totalDataCodewords: number,\n): number[] {\n const bits: number[] = []\n pushBits(bits, 0b0100, 4) // indicador de modo: byte\n const countBits = version <= 9 ? 8 : 16\n pushBits(bits, bytes.length, countBits)\n for (const b of bytes) pushBits(bits, b, 8)\n\n const capacityBits = totalDataCodewords * 8\n const terminator = Math.min(4, Math.max(0, capacityBits - bits.length))\n for (let i = 0; i < terminator; i++) bits.push(0)\n while (bits.length % 8 !== 0) bits.push(0)\n\n const codewords: number[] = []\n for (let i = 0; i < bits.length; i += 8) {\n let byte = 0\n for (let j = 0; j < 8; j++) byte = (byte << 1) | (bits[i + j] as number)\n codewords.push(byte)\n }\n const pad = [0xec, 0x11]\n let p = 0\n while (codewords.length < totalDataCodewords) {\n codewords.push(pad[p % 2] as number)\n p++\n }\n return codewords\n}\n\n/** Separa em blocos, aplica Reed-Solomon por bloco e intercala dados e correção. */\nfunction structureCodewords(dataCodewords: number[], info: BlockInfo): number[] {\n const blocks: number[][] = []\n let offset = 0\n for (let i = 0; i < info.group1Blocks; i++) {\n blocks.push(dataCodewords.slice(offset, offset + info.group1DataPerBlock))\n offset += info.group1DataPerBlock\n }\n for (let i = 0; i < info.group2Blocks; i++) {\n blocks.push(dataCodewords.slice(offset, offset + info.group2DataPerBlock))\n offset += info.group2DataPerBlock\n }\n const ecBlocks = blocks.map((block) => reedSolomonEncode(block, info.ecCodewordsPerBlock))\n\n const result: number[] = []\n const maxDataLen = Math.max(info.group1DataPerBlock, info.group2DataPerBlock)\n for (let i = 0; i < maxDataLen; i++) {\n for (const block of blocks) if (i < block.length) result.push(block[i] as number)\n }\n for (let i = 0; i < info.ecCodewordsPerBlock; i++) {\n for (const ec of ecBlocks) result.push(ec[i] as number)\n }\n return result\n}\n\nfunction codewordsToBits(codewords: number[]): number[] {\n const bits: number[] = []\n for (const b of codewords) for (let i = 7; i >= 0; i--) bits.push((b >>> i) & 1)\n return bits\n}\n\n/* --------------------------------------------------------------- Informação de formato e versão */\n\nfunction getBit(value: number, index: number): boolean {\n return ((value >>> index) & 1) !== 0\n}\n\n/** BCH(15,5) da informação de formato: nível (2 bits) + máscara (3 bits), com a máscara fixa 0x5412. */\nexport function computeFormatBits(levelBits: number, mask: number): number {\n const data = (levelBits << 3) | mask\n let rem = data\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >>> 9) * 0x537)\n return ((data << 10) | rem) ^ 0x5412\n}\n\n/** BCH(18,6) da informação de versão (só usada a partir da versão 7). */\nexport function computeVersionBits(version: number): number {\n let rem = version\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25)\n return (version << 12) | rem\n}\n\n/** Escreve (e reserva) os 15 módulos de formato, nas duas cópias, mais o módulo escuro fixo. */\nfunction drawFormatBits(\n matrix: boolean[][],\n reserved: boolean[][],\n size: number,\n bits: number,\n): void {\n const set = (col: number, row: number, dark: boolean) => {\n ;(matrix[row] as boolean[])[col] = dark\n ;(reserved[row] as boolean[])[col] = true\n }\n for (let i = 0; i <= 5; i++) set(8, i, getBit(bits, i))\n set(8, 7, getBit(bits, 6))\n set(8, 8, getBit(bits, 7))\n set(7, 8, getBit(bits, 8))\n for (let i = 9; i < 15; i++) set(14 - i, 8, getBit(bits, i))\n for (let i = 0; i <= 7; i++) set(size - 1 - i, 8, getBit(bits, i))\n for (let i = 8; i < 15; i++) set(8, size - 15 + i, getBit(bits, i))\n set(8, size - 8, true) // módulo escuro, sempre fixo\n}\n\n/** Escreve os dois blocos (3x6 e 6x3) da informação de versão, a partir da versão 7. */\nfunction drawVersionBits(matrix: boolean[][], size: number, version: number, bits: number): void {\n if (version < 7) return\n for (let i = 0; i < 18; i++) {\n const bit = getBit(bits, i)\n const a = size - 11 + (i % 3)\n const b = Math.floor(i / 3)\n ;(matrix[b] as boolean[])[a] = bit\n ;(matrix[a] as boolean[])[b] = bit\n }\n}\n\n/* ------------------------------------------------------------------------ Padrões fixos */\n\ninterface Template {\n matrix: boolean[][]\n reserved: boolean[][]\n size: number\n}\n\nfunction buildTemplate(version: number): Template {\n const size = version * 4 + 17\n const matrix: boolean[][] = Array.from(\n { length: size },\n () => new Array(size).fill(false) as boolean[],\n )\n const reserved: boolean[][] = Array.from(\n { length: size },\n () => new Array(size).fill(false) as boolean[],\n )\n\n const drawFinder = (cx: number, cy: number) => {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const x = cx + dx\n const y = cy + dy\n if (x < 0 || x >= size || y < 0 || y >= size) continue\n const dist = Math.max(Math.abs(dx), Math.abs(dy))\n ;(reserved[y] as boolean[])[x] = true\n ;(matrix[y] as boolean[])[x] = dist !== 2 && dist !== 4\n }\n }\n }\n drawFinder(3, 3)\n drawFinder(size - 4, 3)\n drawFinder(3, size - 4)\n\n const drawAlignment = (cx: number, cy: number) => {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++) {\n const x = cx + dx\n const y = cy + dy\n ;(reserved[y] as boolean[])[x] = true\n ;(matrix[y] as boolean[])[x] = Math.max(Math.abs(dx), Math.abs(dy)) !== 1\n }\n }\n }\n const coords = ALIGNMENT_COORDS[version] ?? []\n const first = coords[0]\n const last = coords[coords.length - 1]\n for (const r of coords) {\n for (const c of coords) {\n if (\n (r === first && c === first) ||\n (r === first && c === last) ||\n (r === last && c === first)\n )\n continue\n drawAlignment(c, r)\n }\n }\n\n for (let i = 8; i < size - 8; i++) {\n ;(reserved[6] as boolean[])[i] = true\n ;(matrix[6] as boolean[])[i] = i % 2 === 0\n ;(reserved[i] as boolean[])[6] = true\n ;(matrix[i] as boolean[])[6] = i % 2 === 0\n }\n\n // Reserva a área da informação de formato (o conteúdo real entra depois da máscara escolhida).\n drawFormatBits(matrix, reserved, size, 0)\n\n if (version >= 7) {\n for (let i = 0; i < 18; i++) {\n const a = size - 11 + (i % 3)\n const b = Math.floor(i / 3)\n ;(reserved[b] as boolean[])[a] = true\n ;(reserved[a] as boolean[])[b] = true\n }\n }\n\n return { matrix, reserved, size }\n}\n\n/** Zigue-zague clássico: de baixo para cima e de cima para baixo, colunas de 2 em 2,\n * da direita para a esquerda, pulando a coluna do padrão de tempo vertical. */\nfunction placeDataBits(\n matrix: boolean[][],\n reserved: boolean[][],\n size: number,\n bits: number[],\n): void {\n let bitIndex = 0\n let upward = true\n for (let colRight = size - 1; colRight >= 1; colRight -= 2) {\n if (colRight === 6) colRight--\n for (let vert = 0; vert < size; vert++) {\n const row = upward ? size - 1 - vert : vert\n for (const col of [colRight, colRight - 1]) {\n if ((reserved[row] as boolean[])[col]) continue\n const bit = bitIndex < bits.length ? bits[bitIndex] : 0\n ;(matrix[row] as boolean[])[col] = bit === 1\n bitIndex++\n }\n }\n upward = !upward\n }\n}\n\n/* ------------------------------------------------------------------------------ Máscaras */\n\nconst MASK_FNS: ((r: number, c: number) => boolean)[] = [\n (r, c) => (r + c) % 2 === 0,\n (r) => r % 2 === 0,\n (_r, c) => c % 3 === 0,\n (r, c) => (r + c) % 3 === 0,\n (r, c) => (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0,\n (r, c) => ((r * c) % 2) + ((r * c) % 3) === 0,\n (r, c) => (((r * c) % 2) + ((r * c) % 3)) % 2 === 0,\n (r, c) => (((r + c) % 2) + ((r * c) % 3)) % 2 === 0,\n]\n\nfunction applyMask(\n matrix: boolean[][],\n reserved: boolean[][],\n size: number,\n maskId: number,\n): boolean[][] {\n const fn = MASK_FNS[maskId] as (r: number, c: number) => boolean\n const out: boolean[][] = []\n for (let r = 0; r < size; r++) {\n const row: boolean[] = []\n for (let c = 0; c < size; c++) {\n const v = (matrix[r] as boolean[])[c] as boolean\n row.push((reserved[r] as boolean[])[c] ? v : v !== fn(r, c))\n }\n out.push(row)\n }\n return out\n}\n\nfunction runPenalty(bits: boolean[]): number {\n let total = 0\n let runLen = 1\n for (let i = 1; i <= bits.length; i++) {\n if (i < bits.length && bits[i] === bits[i - 1]) {\n runLen++\n continue\n }\n if (runLen >= 5) total += 3 + (runLen - 5)\n runLen = 1\n }\n return total\n}\n\nconst FINDER_LIKE_PATTERN = [true, false, true, true, true, false, true]\n\nfunction finderLikeCount(bits: boolean[]): number {\n let count = 0\n for (let i = 0; i + 7 <= bits.length; i++) {\n let matches = true\n for (let k = 0; k < 7; k++) {\n if (bits[i + k] !== FINDER_LIKE_PATTERN[k]) {\n matches = false\n break\n }\n }\n if (!matches) continue\n const before = i >= 4 && bits.slice(i - 4, i).every((b) => !b)\n const after = i + 11 <= bits.length && bits.slice(i + 7, i + 11).every((b) => !b)\n if (before || after) count++\n }\n return count\n}\n\n/** As quatro regras de penalidade da máscara (ISO/IEC 18004: 3, 3, 40 e a proporção de módulos escuros). */\nexport function computeMaskPenalty(matrix: boolean[][], size: number): number {\n let penalty = 0\n for (let r = 0; r < size; r++) penalty += runPenalty(matrix[r] as boolean[])\n for (let c = 0; c < size; c++) penalty += runPenalty(matrix.map((row) => row[c] as boolean))\n\n for (let r = 0; r < size - 1; r++) {\n for (let c = 0; c < size - 1; c++) {\n const v = (matrix[r] as boolean[])[c]\n if (\n v === (matrix[r] as boolean[])[c + 1] &&\n v === (matrix[r + 1] as boolean[])[c] &&\n v === (matrix[r + 1] as boolean[])[c + 1]\n ) {\n penalty += 3\n }\n }\n }\n\n for (let r = 0; r < size; r++) penalty += finderLikeCount(matrix[r] as boolean[]) * 40\n for (let c = 0; c < size; c++)\n penalty += finderLikeCount(matrix.map((row) => row[c] as boolean)) * 40\n\n const total = size * size\n const dark = matrix.reduce((sum, row) => sum + row.filter(Boolean).length, 0)\n const percent = (dark * 100) / total\n const a = Math.floor(percent / 5) * 5\n const b = a + 5\n penalty += (Math.min(Math.abs(a - 50), Math.abs(b - 50)) / 5) * 10\n\n return penalty\n}\n\n/* --------------------------------------------------------------------------- API pública */\n\n/**\n * Codifica `value` (modo byte, UTF-8) num QR Code, escolhendo a menor versão (1 a 10) que\n * comporta o valor no nível de correção pedido. Lança QrEncodingError se não couber em\n * nenhuma versão suportada.\n */\nexport function encodeQrMatrix(value: string, level: ErrorCorrectionLevel = 'medium'): QrMatrix {\n const bytes = new TextEncoder().encode(value)\n const letter = LEVEL_LETTER[level]\n\n let chosenVersion: number | null = null\n let info: BlockInfo | null = null\n for (let version = 1; version <= QR_MAX_VERSION; version++) {\n const candidate = (CAPACITY[version] as Record<'L' | 'M' | 'Q' | 'H', BlockInfo>)[letter]\n const countBits = version <= 9 ? 8 : 16\n const needed = 4 + countBits + bytes.length * 8\n if (needed <= candidate.totalDataCodewords * 8) {\n chosenVersion = version\n info = candidate\n break\n }\n }\n if (chosenVersion === null || info === null) {\n throw new QrEncodingError(\n `Valor grande demais para um QR Code até a versão ${QR_MAX_VERSION} neste nível de correção.`,\n )\n }\n\n const dataCodewords = buildDataCodewords(bytes, chosenVersion, info.totalDataCodewords)\n const allCodewords = structureCodewords(dataCodewords, info)\n const dataBits = codewordsToBits(allCodewords)\n\n const { matrix, reserved, size } = buildTemplate(chosenVersion)\n placeDataBits(matrix, reserved, size, dataBits)\n\n let bestMask = 0\n let bestPenalty = Number.POSITIVE_INFINITY\n let bestMatrix = matrix\n for (let maskId = 0; maskId < 8; maskId++) {\n const masked = applyMask(matrix, reserved, size, maskId)\n const penalty = computeMaskPenalty(masked, size)\n if (penalty < bestPenalty) {\n bestPenalty = penalty\n bestMask = maskId\n bestMatrix = masked\n }\n }\n\n const formatBits = computeFormatBits(LEVEL_BITS[level], bestMask)\n drawFormatBits(bestMatrix, reserved, size, formatBits)\n if (chosenVersion >= 7) {\n drawVersionBits(bestMatrix, size, chosenVersion, computeVersionBits(chosenVersion))\n }\n\n return { version: chosenVersion, size, modules: bestMatrix }\n}\n\n/**\n * Só para teste: relê os codewords (dados + correção de erro) de um QrMatrix já pronto,\n * redescobrindo a máscara pela informação de formato armazenada. Serve para comparar a\n * saída do codificador com um valor publicado, sem repetir a tabela de máscaras aqui.\n */\nexport function readCodewordsForTest(matrix: QrMatrix, level: ErrorCorrectionLevel): number[] {\n const { reserved, size } = buildTemplate(matrix.version)\n\n let maskId = 0\n for (let candidate = 0; candidate < 8; candidate++) {\n const bits = computeFormatBits(LEVEL_BITS[level], candidate)\n const scratch: boolean[][] = Array.from(\n { length: size },\n () => new Array(size).fill(false) as boolean[],\n )\n const scratchReserved: boolean[][] = Array.from(\n { length: size },\n () => new Array(size).fill(false) as boolean[],\n )\n drawFormatBits(scratch, scratchReserved, size, bits)\n let allMatch = true\n for (let r = 0; r < size && allMatch; r++) {\n for (let c = 0; c < size; c++) {\n if (\n (scratchReserved[r] as boolean[])[c] &&\n (scratch[r] as boolean[])[c] !== (matrix.modules[r] as boolean[])[c]\n ) {\n allMatch = false\n break\n }\n }\n }\n if (allMatch) {\n maskId = candidate\n break\n }\n }\n\n const fn = MASK_FNS[maskId] as (r: number, c: number) => boolean\n const bits: number[] = []\n let upward = true\n for (let colRight = size - 1; colRight >= 1; colRight -= 2) {\n if (colRight === 6) colRight--\n for (let vert = 0; vert < size; vert++) {\n const row = upward ? size - 1 - vert : vert\n for (const col of [colRight, colRight - 1]) {\n if ((reserved[row] as boolean[])[col]) continue\n const masked = (matrix.modules[row] as boolean[])[col] as boolean\n bits.push(masked !== fn(row, col) ? 1 : 0)\n }\n }\n upward = !upward\n }\n const codewords: number[] = []\n for (let i = 0; i + 8 <= bits.length; i += 8) {\n let byte = 0\n for (let j = 0; j < 8; j++) byte = (byte << 1) | (bits[i + j] as number)\n codewords.push(byte)\n }\n return codewords\n}\n\n/** Um único `<path>` com todos os módulos escuros, para `fill=\"currentColor\"` no SVG. */\nexport function qrMatrixToSvgPath(matrix: QrMatrix): string {\n let d = ''\n for (let r = 0; r < matrix.size; r++) {\n for (let c = 0; c < matrix.size; c++) {\n if ((matrix.modules[r] as boolean[])[c]) d += `M${c} ${r}h1v1h-1z`\n }\n }\n return d\n}\n","import { TriangleAlert } from 'lucide-react'\nimport { useMemo, type CSSProperties } from 'react'\nimport { EmptyState } from '@/components/ui/empty-state'\nimport { cn } from '@/lib/cn'\nimport {\n encodeQrMatrix,\n QrEncodingError,\n qrMatrixToSvgPath,\n type ErrorCorrectionLevel,\n} from '@/lib/qr-encode'\n\n/*\n * QR Code gerado por um codificador próprio (src/lib/qr-encode.ts), sem biblioteca externa.\n * value vazio é o estado vazio legítimo; valor grande demais para caber até a versão 10 no\n * nível de correção pedido nunca quebra a tela, mostra um ícone com a falha declarada.\n */\n\nexport interface QrCodeProps {\n value: string\n /** Lado do quadrado, em pixels. */\n size?: number\n errorCorrection?: ErrorCorrectionLevel\n className?: string\n 'aria-label'?: string\n emptyLabel?: string\n errorLabel?: string\n}\n\n/** Um único QR Code por tela; nunca crie um segundo componente parecido para outro tamanho. */\nexport function QrCode({\n value,\n size = 160,\n errorCorrection = 'medium',\n className,\n emptyLabel = 'Nenhum valor para gerar o QR Code.',\n errorLabel = 'Não foi possível gerar o QR Code: o valor é grande demais.',\n ...aria\n}: QrCodeProps) {\n const result = useMemo(() => {\n if (!value) return { status: 'empty' as const, matrix: null }\n try {\n return { status: 'ready' as const, matrix: encodeQrMatrix(value, errorCorrection) }\n } catch (e) {\n if (e instanceof QrEncodingError) return { status: 'error' as const, matrix: null }\n throw e\n }\n }, [value, errorCorrection])\n\n if (result.status === 'empty') {\n return (\n <div\n data-rendra=\"QRC-001\"\n style={{ '--size': `${size}px` } as CSSProperties}\n className={cn('flex size-var items-center justify-center', className)}\n >\n <EmptyState size=\"compact\" title={emptyLabel} />\n </div>\n )\n }\n\n if (result.status === 'error') {\n return (\n <div\n data-rendra=\"QRC-001\"\n role=\"img\"\n aria-label={errorLabel}\n style={{ '--size': `${size}px` } as CSSProperties}\n className={cn(\n 'flex size-var flex-col items-center justify-center gap-2 rounded-control border border-dashed border-input p-2 text-center text-muted-foreground',\n className,\n )}\n >\n <TriangleAlert className=\"size-icon-lg\" aria-hidden />\n <span className=\"text-xs\">{errorLabel}</span>\n </div>\n )\n }\n\n const path = qrMatrixToSvgPath(result.matrix)\n return (\n <svg\n data-rendra=\"QRC-001\"\n role=\"img\"\n aria-label={aria['aria-label'] ?? `Código QR de ${value}`}\n viewBox={`0 0 ${result.matrix.size} ${result.matrix.size}`}\n style={{ '--size': `${size}px` } as CSSProperties}\n className={cn('size-var text-foreground', className)}\n >\n <path d={path} fill=\"currentColor\" />\n </svg>\n )\n}\n","import { Star } from 'lucide-react'\nimport { useRef, useState, type KeyboardEvent } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { cn } from '@/lib/cn'\n\n/*\n * Avaliação: estrelas (1 a max, padrão 5) ou escala numérica (min a max, padrão 1 a 10).\n * value null é \"sem resposta ainda\", nunca 0: clicar de novo na opção marcada desmarca e\n * devolve null. Semântica de radiogroup, com as setas trocando (e marcando) a opção.\n */\n\nexport interface RatingProps {\n variant?: 'stars' | 'scale'\n value: number | null\n onChange?: (value: number | null) => void\n /** stars: total de estrelas (padrão 5). scale: valor máximo (padrão 10, até 10). */\n max?: number\n /** Só a escala: valor mínimo (padrão 1). */\n min?: number\n /** Só a escala: rótulo da ponta de baixo. */\n lowLabel?: string\n /** Só a escala: rótulo da ponta de cima. */\n highLabel?: string\n disabled?: boolean\n invalid?: boolean\n id?: string\n 'aria-label'?: string\n 'aria-describedby'?: string\n}\n\nfunction toneClass(ratio: number): string {\n if (ratio <= 1 / 3)\n return 'data-[state=checked]:border-destructive data-[state=checked]:bg-destructive-soft data-[state=checked]:text-destructive-soft-foreground'\n if (ratio <= 2 / 3)\n return 'data-[state=checked]:border-warning data-[state=checked]:bg-warning-soft data-[state=checked]:text-warning-soft-foreground'\n return 'data-[state=checked]:border-success data-[state=checked]:bg-success-soft data-[state=checked]:text-success-soft-foreground'\n}\n\nexport function Rating({\n variant = 'stars',\n value,\n onChange,\n max,\n min = 1,\n lowLabel,\n highLabel,\n disabled,\n invalid,\n id,\n ...aria\n}: RatingProps) {\n const groupRef = useRef<HTMLDivElement>(null)\n const [focusIndex, setFocusIndex] = useState(0)\n const effectiveMax = max ?? (variant === 'stars' ? 5 : 10)\n const options =\n variant === 'stars'\n ? Array.from({ length: effectiveMax }, (_, i) => i + 1)\n : Array.from({ length: Math.max(0, effectiveMax - min + 1) }, (_, i) => i + min)\n\n const selectedIndex = value !== null ? options.indexOf(value) : -1\n const activeIndex = selectedIndex >= 0 ? selectedIndex : focusIndex\n\n const select = (n: number) => {\n if (disabled) return\n onChange?.(value === n ? null : n)\n }\n\n const focusOption = (index: number) => {\n setFocusIndex(index)\n const el = groupRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]')[index]\n el?.focus()\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>, index: number) => {\n const map: Record<string, number> = {\n ArrowRight: index + 1,\n ArrowDown: index + 1,\n ArrowLeft: index - 1,\n ArrowUp: index - 1,\n Home: 0,\n End: options.length - 1,\n }\n if (!(event.key in map)) return\n event.preventDefault()\n const next = Math.min(options.length - 1, Math.max(0, map[event.key] as number))\n focusOption(next)\n select(options[next] as number)\n }\n\n const code = resolveCatalogCode('Rating', { variant })\n\n if (variant === 'stars') {\n return (\n <div\n ref={groupRef}\n id={id}\n role=\"radiogroup\"\n aria-label={aria['aria-label']}\n aria-describedby={aria['aria-describedby']}\n aria-invalid={invalid || undefined}\n data-rendra={code}\n className=\"inline-flex gap-1\"\n >\n {options.map((n, index) => {\n const filled = value !== null && n <= value\n return (\n <button\n key={n}\n type=\"button\"\n role=\"radio\"\n aria-checked={n === value}\n aria-label={`${n} ${n === 1 ? 'estrela' : 'estrelas'}`}\n tabIndex={index === activeIndex ? 0 : -1}\n disabled={disabled}\n onClick={() => select(n)}\n onKeyDown={(e) => onKeyDown(e, index)}\n onFocus={() => setFocusIndex(index)}\n className={cn(\n 'flex min-h-touch min-w-touch items-center justify-center rounded-control text-muted-foreground transition-colors focus-visible:focus-ring md:size-control-sm md:min-h-0 md:min-w-0',\n filled && 'text-warning',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n <Star className={cn('size-icon-lg', filled && 'fill-current')} aria-hidden />\n </button>\n )\n })}\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div\n ref={groupRef}\n id={id}\n role=\"radiogroup\"\n aria-label={aria['aria-label']}\n aria-describedby={aria['aria-describedby']}\n aria-invalid={invalid || undefined}\n data-rendra={code}\n className=\"grid grid-cols-5 gap-2 sm:flex sm:flex-wrap\"\n >\n {options.map((n, index) => {\n const ratio = options.length > 1 ? (n - min) / (effectiveMax - min) : 1\n return (\n <button\n key={n}\n type=\"button\"\n role=\"radio\"\n aria-checked={n === value}\n aria-label={`Nota ${n}`}\n tabIndex={index === activeIndex ? 0 : -1}\n disabled={disabled}\n data-state={n === value ? 'checked' : undefined}\n onClick={() => select(n)}\n onKeyDown={(e) => onKeyDown(e, index)}\n onFocus={() => setFocusIndex(index)}\n className={cn(\n 'flex aspect-square min-h-touch items-center justify-center rounded-control border border-input bg-card text-sm font-medium tabular-nums transition-colors focus-visible:focus-ring sm:flex-1',\n 'hover:border-primary',\n toneClass(ratio),\n invalid && 'border-destructive',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {n}\n </button>\n )\n })}\n </div>\n {(lowLabel || highLabel) && (\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>{lowLabel}</span>\n <span>{highLabel}</span>\n </div>\n )}\n </div>\n )\n}\n","import { cn } from '@/lib/cn'\n\n/*\n * Crédito discreto \"Feito com Rendra\", para o rodapé da tela de login (nunca na sidebar).\n * Ligado por padrão; some com credit={false}. Texto e link são substituíveis por prop.\n * Abre em nova aba, com alvo de toque de 44px no celular e texto de apoio em cor muted.\n *\n * Remover o crédito da interface é permitido: a licença MIT pede que o aviso de copyright\n * e o arquivo LICENSE fiquem no código e nas cópias, não que haja crédito visível na tela.\n */\n\nexport const RENDRA_CREDIT_TEXT = 'Feito com Rendra'\nexport const RENDRA_CREDIT_HREF = 'https://github.com/bsmagalhaes/rendra-ui-web'\n\nexport interface RendraCreditProps {\n /** Padrão true; false remove o crédito. */\n credit?: boolean\n /** Padrão \"Feito com Rendra\". */\n text?: string\n /** Padrão: o repositório do Rendra Design System. */\n href?: string\n className?: string\n}\n\nexport function RendraCredit({\n credit = true,\n text = RENDRA_CREDIT_TEXT,\n href = RENDRA_CREDIT_HREF,\n className,\n}: RendraCreditProps) {\n if (!credit) return null\n return (\n <a\n data-rendra=\"CRED-001\"\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'inline-flex min-h-touch items-center self-center rounded-item px-2 text-xs text-muted-foreground transition-colors hover:text-primary-text hover:underline md:min-h-0 md:py-1',\n className,\n )}\n >\n {text} <span className=\"sr-only\">(abre em nova aba)</span>\n </a>\n )\n}\n","import { Star, Trash2 } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { cn } from '@/lib/cn'\n\n/*\n * Campo repetível: uma lista de itens do mesmo formulário (telefones, e-mails, endereços...),\n * cada um desenhado por renderField. Marcar um como principal desmarca os outros; remover o\n * principal passa o papel para o primeiro item restante. Tudo dentro do próprio componente,\n * sem botão solto na tela.\n */\n\nexport interface RepeatableItem {\n id: string\n isPrimary?: boolean\n}\n\nexport interface RepeatableFieldProps<T extends RepeatableItem> {\n items: T[]\n onChange: (items: T[]) => void\n /** Cria um item novo (com id próprio) quando a pessoa clica em \"Adicionar\". */\n createItem: () => T\n /** Desenha os campos de um item; update aplica um patch parcial nesse item. */\n renderField: (item: T, update: (patch: Partial<T>) => void, index: number) => ReactNode\n /** Mostra o controle de \"marcar como principal\" em cada item. */\n showPrimary?: boolean\n maxItems?: number\n addLabel?: string\n emptyLabel?: string\n disabled?: boolean\n className?: string\n}\n\n/** Uma lista repetível por finalidade: telefones, e-mails, endereços e afins usam este componente. */\nexport function RepeatableField<T extends RepeatableItem>({\n items,\n onChange,\n createItem,\n renderField,\n showPrimary = false,\n maxItems,\n addLabel = 'Adicionar',\n emptyLabel = 'Nenhum item adicionado ainda.',\n disabled = false,\n className,\n}: RepeatableFieldProps<T>) {\n const update = (id: string, patch: Partial<T>) =>\n onChange(items.map((item) => (item.id === id ? { ...item, ...patch } : item)))\n\n const setPrimary = (id: string) =>\n onChange(items.map((item) => ({ ...item, isPrimary: item.id === id })))\n\n const remove = (id: string) => {\n const removedWasPrimary = items.find((item) => item.id === id)?.isPrimary\n const rest = items.filter((item) => item.id !== id)\n if (\n removedWasPrimary &&\n showPrimary &&\n rest.length > 0 &&\n !rest.some((item) => item.isPrimary)\n ) {\n rest[0] = { ...(rest[0] as T), isPrimary: true }\n }\n onChange(rest)\n }\n\n const add = () => onChange([...items, createItem()])\n\n const reachedMax = maxItems !== undefined && items.length >= maxItems\n\n return (\n <div data-rendra=\"REP-001\" className={cn('flex flex-col gap-4', className)}>\n {items.length === 0 && <p className=\"text-sm text-muted-foreground\">{emptyLabel}</p>}\n {items.map((item, index) => (\n <div key={item.id} className=\"flex flex-col gap-3 rounded-control border bg-card p-4\">\n <div className=\"flex flex-wrap items-start gap-3\">\n {/* min-w-24: piso de largura para o campo nunca ficar espremido pelas ações ao\n lado (ex.: telefone com o seletor de DDI); sem espaço, as ações quebram a linha. */}\n <div className=\"min-w-24 flex-1\">\n {renderField(item, (patch) => update(item.id, patch), index)}\n </div>\n <div className=\"flex shrink-0 items-center gap-1 pt-1\">\n {showPrimary && (\n <Button\n type=\"button\"\n variant={item.isPrimary ? 'secondary' : 'ghost'}\n size=\"sm\"\n icon={<Star className={item.isPrimary ? 'fill-current' : undefined} />}\n aria-pressed={item.isPrimary}\n disabled={disabled}\n onClick={() => setPrimary(item.id)}\n >\n {item.isPrimary ? 'Principal' : 'Tornar principal'}\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n icon={<Trash2 />}\n aria-label={`Remover item ${index + 1}`}\n disabled={disabled}\n onClick={() => remove(item.id)}\n />\n </div>\n </div>\n </div>\n ))}\n <Button type=\"button\" variant=\"outline\" disabled={disabled || reachedMax} onClick={add}>\n {addLabel}\n </Button>\n </div>\n )\n}\n","import { cn } from '@/lib/cn'\n\n/** Separador: hierarquia dentro de um card (no lugar de card dentro de card). */\nexport function Separator({\n orientation = 'horizontal',\n label,\n className,\n}: {\n orientation?: 'horizontal' | 'vertical'\n /** Texto no meio da linha (ex.: \"ou\"). */\n label?: string\n className?: string\n}) {\n if (label) {\n return (\n <div\n role=\"separator\"\n data-rendra=\"SEP-001\"\n className={cn('flex items-center gap-3', className)}\n >\n <span className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs text-muted-foreground\">{label}</span>\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n )\n }\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n data-rendra=\"SEP-001\"\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-px w-full' : 'w-px self-stretch',\n className,\n )}\n />\n )\n}\n","import type { HTMLAttributes } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionMode } from '@/lib/motion'\n\n/**\n * Bloco de carregamento. Monte o skeleton com a mesma estrutura do conteúdo final. Em `off` pulsa\n * (animate-pulse do Tailwind); em `on` um brilho suave cruza o bloco (skeleton-shimmer, em\n * globals.css: transform, tempo e curva pelos tokens, parado com \"reduzir movimento\").\n */\nexport function Skeleton({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n const on = useMotionMode() === 'on'\n return (\n <div\n aria-hidden\n data-slot=\"skeleton\"\n data-rendra=\"SKEL-001\"\n className={cn(on ? 'skeleton-shimmer' : 'animate-pulse', 'rounded-block bg-muted', className)}\n {...props}\n />\n )\n}\n","import { ArrowDownRight, ArrowUpRight, Minus } from 'lucide-react'\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { Card } from '@/components/ui/card'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { cn } from '@/lib/cn'\nimport { useMotionAdopted, useMotionLib, useMotionOn, useMotionPresets } from '@/lib/motion'\nimport { formatLike, parseLocaleNumber, type ParsedNumber } from '@/lib/motion/count'\n\nexport interface StatCardProps {\n label: string\n value: ReactNode\n /** Variação em %, positiva ou negativa. */\n change?: number\n /** Texto ao lado da variação (ex.: \"vs. mês anterior\"). */\n changeLabel?: string\n /** Quando cair é bom (ex.: custo), inverte as cores da variação. */\n inverse?: boolean\n icon?: ReactNode\n /** Destaque com o degradê suave do template. Use em no máximo um card por tela. */\n highlight?: boolean\n loading?: boolean\n /** Conteúdo extra no rodapé (ex.: mini gráfico). */\n footer?: ReactNode\n className?: string\n}\n\n/** Contagem de 0 até o valor, com o formato do texto original; no fim mostra o `value` exato. */\nfunction Counter({ parsed, value }: { parsed: ParsedNumber; value: ReactNode }) {\n const { animate, m, useMotionValue, useTransform } = useMotionOn()\n const presets = useMotionPresets()\n // Montado na troca tardia do `off` para o `on`: o número já estava na tela com o valor final,\n // então aparece direto, sem voltar a 0 para contar de novo.\n const [skip] = useState(useMotionAdopted())\n const progress = useMotionValue(skip ? parsed.value : 0)\n const text = useTransform(progress, (n) => formatLike(parsed, n))\n const [done, setDone] = useState(skip)\n useEffect(() => {\n if (skip) return\n const controls = animate(progress, parsed.value, {\n duration: presets.tokens.reveal.count,\n ease: presets.tokens.ease.out,\n onComplete: () => setDone(true),\n })\n return () => controls.stop()\n }, [animate, progress, parsed.value, presets.tokens, skip])\n return <m.span {...presets.fade}>{done ? value : text}</m.span>\n}\n\n/**\n * O valor do card. Em `off`, o valor como sempre veio. Em `on`, número (ou texto pt-BR com\n * número) conta até o valor; qualquer outra coisa só aparece com fade. Com \"reduzir movimento\"\n * o valor final aparece direto.\n */\nfunction StatValue({ value }: { value: ReactNode }) {\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const parsed = useMemo(() => parseLocaleNumber(value), [value])\n if (!lib) return <>{value}</>\n if (!parsed || presets.reduced) return <lib.m.span {...presets.fade}>{value}</lib.m.span>\n return <Counter key={String(value)} parsed={parsed} value={value} />\n}\n\n/** Card de indicador. Em grid: 1 coluna no mobile, 2 para cards pequenos. */\nexport function StatCard({\n label,\n value,\n change,\n changeLabel,\n inverse,\n icon,\n highlight,\n loading,\n footer,\n className,\n}: StatCardProps) {\n const up = (change ?? 0) > 0\n const flat = !change\n const good = inverse ? !up : up\n const TrendIcon = flat ? Minus : up ? ArrowUpRight : ArrowDownRight\n\n return (\n <Card\n data-rendra=\"STAT-001\"\n className={cn('@container gap-3 p-4 md:p-6', highlight && 'bg-gradient-soft', className)}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n {icon && (\n <span\n aria-hidden\n className=\"flex size-8 shrink-0 items-center justify-center rounded-control bg-primary-soft text-primary-soft-foreground [&_svg]:size-icon-sm\"\n >\n {icon}\n </span>\n )}\n </div>\n {loading ? (\n <>\n <Skeleton className=\"h-8 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </>\n ) : (\n <>\n <span className=\"text-2xl font-semibold tracking-tight tabular-nums @xs:text-3xl\">\n <StatValue value={value} />\n </span>\n {change !== undefined && (\n <span className=\"flex flex-wrap items-center gap-1 text-xs\">\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-item px-1 font-medium tabular-nums',\n flat\n ? 'bg-muted text-muted-foreground'\n : good\n ? 'bg-success-soft text-success-soft-foreground'\n : 'bg-destructive-soft text-destructive-soft-foreground',\n )}\n >\n <TrendIcon className=\"size-3\" aria-hidden />\n {change > 0 ? '+' : ''}\n {change.toLocaleString('pt-BR', { maximumFractionDigits: 1 })}%\n </span>\n {changeLabel && <span className=\"text-muted-foreground\">{changeLabel}</span>}\n </span>\n )}\n </>\n )}\n {footer}\n </Card>\n )\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Devolve o valor só depois que ele para de mudar por `delay` ms.\n * Usado na busca da Table remota: uma requisição por pausa na digitação, não por tecla.\n */\nexport function useDebouncedValue<T>(value: T, delay = 300): T {\n const [debounced, setDebounced] = useState(value)\n useEffect(() => {\n const t = window.setTimeout(() => setDebounced(value), delay)\n return () => window.clearTimeout(t)\n }, [value, delay])\n return debounced\n}\n","import {\n columnFilteringFeature,\n columnVisibilityFeature,\n createExpandedRowModel,\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n filterFn_includesString,\n globalFilteringFeature,\n rowExpandingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n sortFn_alphanumeric,\n sortFn_basic,\n tableFeatures,\n useTable,\n type ColumnDef,\n type ColumnVisibilityState,\n type RowData,\n type RowSelectionState,\n type SortingState,\n} from '@tanstack/react-table'\nimport { format } from 'date-fns'\nimport {\n ArrowDown,\n ArrowUp,\n ChevronDown,\n ChevronsUpDown,\n MoreHorizontal,\n RotateCw,\n} from 'lucide-react'\nimport { Collapsible } from 'radix-ui'\nimport { Fragment, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { useRendraLink } from '@/components/rendra-provider'\nimport { Badge, type BadgeProps } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card } from '@/components/ui/card'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { DataToolbar, type DataToolbarProps } from '@/components/ui/data-toolbar'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { EmptyState } from '@/components/ui/empty-state'\nimport { Pagination } from '@/components/ui/pagination'\nimport { Select } from '@/components/ui/select'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { Tooltip } from '@/components/ui/tooltip'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { useDebouncedValue } from '@/hooks/use-debounced-value'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\nimport { formatCurrency } from '@/lib/masks'\n\n/* ================================================================ tipos */\n\nexport interface TableColumn<T> {\n id: string\n header: string\n /** Valor da célula (para ordenar, buscar e formatar). */\n accessor: (row: T) => unknown\n /** Renderização própria da célula. */\n cell?: (row: T) => ReactNode\n /**\n * Linhas extras abaixo do valor, em texto menor (ex.: razão social e CNPJ abaixo do nome;\n * e-mail abaixo do telefone). Valores vazios são ignorados.\n */\n details?: (row: T) => (ReactNode | null | undefined)[]\n /** O valor vira link para esta rota (ex.: abrir o cadastro), com hover de clicável. */\n href?: (row: T) => string\n /**\n * Formato automático: number e currency alinham à direita; date vira DD/MM/AAAA;\n * badge usa badgeTone para escolher a cor.\n */\n kind?: 'text' | 'number' | 'currency' | 'date' | 'badge'\n badgeTone?: (row: T) => BadgeProps['tone']\n align?: 'left' | 'right' | 'center'\n sortable?: boolean\n /** Pode ser ocultada pelo menu Colunas. */\n hideable?: boolean\n /** Começa oculta (o usuário mostra pelo menu Colunas). */\n hidden?: boolean\n /** Linhas máximas do texto antes das reticências (máximo 3). */\n lines?: 1 | 2 | 3\n /**\n * No mobile, a tabela vira cards:\n * primary no topo do card (até 3; o primeiro é o título)\n * secondary recolhido em \"Ver detalhes\"\n * hidden não aparece no card\n */\n mobile?: 'primary' | 'secondary' | 'hidden'\n /** Largura mínima no desktop. */\n width?: 'sm' | 'md' | 'lg'\n}\n\nexport interface RowAction<T> {\n label: string\n icon?: ReactNode\n onClick: (row: T) => void\n destructive?: boolean\n hidden?: (row: T) => boolean\n}\n\n/** O que a Table pede ao servidor em cada carregamento (modo remoto, prop source). */\nexport interface TableQuery {\n /** Página, começando em 1. */\n page: number\n pageSize: number\n /** Texto da busca, aplicado pelo servidor a todos os registros (não só à página). */\n search: string\n sort: { id: string; desc: boolean } | null\n /** Cancela a requisição quando o usuário muda de página ou digita de novo. */\n signal: AbortSignal\n}\n\n/** Resposta do servidor: os registros da página e o total que atende à busca e aos filtros. */\nexport interface TablePage<T> {\n rows: T[]\n total: number\n}\n\n/** Registros por página em todas as tabelas do sistema. */\nexport const TABLE_PAGE_SIZE = 15\n\nexport interface TableProps<T> {\n /** Dados já carregados (modo local). Com source, é ignorado. */\n data?: T[]\n /**\n * Modo remoto: a Table pede ao servidor só a página visível. Busca, ordenação e\n * filtros são enviados na requisição e valem para todos os registros. A função precisa\n * ser estável (definida fora do componente ou com useCallback).\n */\n source?: (query: TableQuery) => Promise<TablePage<T>>\n /** Mude este valor quando filtros externos mudarem: a Table recarrega a partir da página 1. */\n queryKey?: string\n columns: TableColumn<T>[]\n getRowId: (row: T) => string\n /** Seleção por checkbox (primeira coluna; no mobile, no topo do card). */\n selectable?: boolean\n /** Conteúdo expandido da linha. */\n expandable?: (row: T) => ReactNode\n /** Ordenação por clique no cabeçalho (padrão por coluna: sortable). */\n sortable?: boolean\n /** Busca global: texto aplicado a todas as colunas. */\n globalFilter?: string\n /** Menu Colunas na barra de ferramentas. */\n columnVisibility?: boolean\n /** Ações em massa para os selecionados (botões). No mobile, barra fixa no rodapé da tela. */\n bulkActions?: (selected: T[], clear: () => void) => ReactNode\n /** Mais ações em massa, no menu de três pontinhos ao lado dos botões. */\n bulkMenu?: {\n label: string\n icon?: ReactNode\n destructive?: boolean\n onClick: (selected: T[], clear: () => void) => void\n }[]\n /** Ações por linha. Até 2 visíveis como ícone; acima disso, menu. */\n rowActions?: RowAction<T>[]\n density?: 'compact' | 'default' | 'comfortable'\n loading?: boolean\n error?: string | null\n onRetry?: () => void\n /** Estado vazio. */\n empty?: { title: string; description?: string; action?: ReactNode }\n /** Itens por página. Padrão: 15 (TABLE_PAGE_SIZE). Use 0 para mostrar tudo sem paginação. */\n pageSize?: number\n /** No mobile: \"anterior e próxima\" ou \"carregar mais\". */\n mobilePagination?: 'pages' | 'loadMore'\n /** Barra de ferramentas no mesmo card, acima da tabela. */\n toolbar?: Omit<DataToolbarProps, 'columns' | 'selectionBar' | 'sort'>\n /**\n * Colunas de situação (kind: 'badge') vão para o fim, logo antes das ações.\n * Padrão true; use false para manter a ordem exata de columns.\n */\n statusLast?: boolean\n /** Rótulo da tabela para leitores de tela. */\n 'aria-label': string\n}\n\n/* ================================================================ utilidades */\n\nconst densityRow = { compact: 'py-2', default: 'py-3', comfortable: 'py-4' } as const\nconst clamp = { 1: 'line-clamp-1', 2: 'line-clamp-2', 3: 'line-clamp-3' } as const\nconst minWidth = { sm: 'min-w-24', md: 'min-w-3xs', lg: 'min-w-sm' } as const\n\nfunction formatValue<T>(col: TableColumn<T>, row: T): ReactNode {\n if (col.cell) return col.cell(row)\n const v = col.accessor(row)\n if (v == null || v === '') return <span className=\"text-muted-foreground\">-</span>\n switch (col.kind) {\n case 'number':\n return Number(v).toLocaleString('pt-BR')\n case 'currency':\n return formatCurrency(Number(v))\n case 'date':\n return format(v instanceof Date ? v : new Date(String(v)), 'dd/MM/yyyy')\n case 'badge':\n return <Badge tone={col.badgeTone?.(row) ?? 'neutral'}>{String(v)}</Badge>\n default:\n return String(v)\n }\n}\n\n/** Valor da célula com link (href) e linhas extras (details), igual no desktop e no card. */\nfunction CellContent<T>({ col, row, title }: { col: TableColumn<T>; row: T; title?: boolean }) {\n const Link = useRendraLink()\n const main = formatValue(col, row)\n const extra = (col.details?.(row) ?? []).filter((d) => d != null && d !== '')\n const value = col.href ? (\n <Link\n to={col.href(row)}\n className={cn(\n 'rounded-item font-medium text-foreground underline-offset-4 transition-colors outline-none hover:text-primary-text hover:underline focus-visible:ring-2 focus-visible:ring-ring',\n title && 'inline-flex min-h-touch items-center md:min-h-0',\n )}\n >\n {main}\n </Link>\n ) : (\n main\n )\n if (!extra.length) return <>{value}</>\n return (\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"min-w-0\">{value}</span>\n {extra.map((d, i) => (\n <span key={i} className=\"truncate text-xs font-normal text-muted-foreground\">\n {d}\n </span>\n ))}\n </span>\n )\n}\n\nconst alignOf = <T,>(c: TableColumn<T>) =>\n c.align ?? (c.kind === 'number' || c.kind === 'currency' ? 'right' : 'left')\n\nfunction RowActions<T>({\n row,\n actions,\n mobile,\n}: {\n row: T\n actions: RowAction<T>[]\n mobile?: boolean\n}) {\n const list = actions.filter((a) => !a.hidden?.(row))\n const visible = list.length <= 2 ? list : list.slice(0, 1)\n const rest = list.length <= 2 ? [] : list.slice(1)\n return (\n <div\n className={cn('flex items-center gap-1', mobile ? 'w-full justify-end gap-2' : 'justify-end')}\n >\n {visible.map((a) =>\n mobile ? (\n <Button\n key={a.label}\n variant={a.destructive ? 'ghost' : 'outline'}\n size=\"sm\"\n icon={a.icon}\n onClick={() => a.onClick(row)}\n className={cn('flex-1', a.destructive && 'text-destructive')}\n >\n {a.label}\n </Button>\n ) : (\n <Tooltip key={a.label} content={a.label}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={a.label}\n onClick={() => a.onClick(row)}\n className={cn(\n a.destructive &&\n 'text-destructive hover:bg-destructive-soft hover:text-destructive-soft-foreground',\n )}\n >\n {a.icon}\n </Button>\n </Tooltip>\n ),\n )}\n {rest.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" iconOnly aria-label=\"Mais ações\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {rest.map((a) => (\n <DropdownMenuItem\n key={a.label}\n destructive={a.destructive}\n onSelect={() => a.onClick(row)}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )\n}\n\n/*\n * Features do TanStack Table 9, só as que o componente usa. Constante de módulo:\n * criada uma única vez, nunca a cada render. columnFilteringFeature é pré-requisito\n * técnico de globalFilteringFeature (sem UI de filtro de coluna).\n */\nconst tableFeatureSet = tableFeatures({\n rowSortingFeature,\n columnFilteringFeature,\n globalFilteringFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n columnVisibilityFeature,\n sortedRowModel: createSortedRowModel(),\n filteredRowModel: createFilteredRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n sortFns: { basic: sortFn_basic, alphanumeric: sortFn_alphanumeric },\n filterFns: { includesString: filterFn_includesString },\n})\n\n/* ================================================================ componente */\n\n/**\n * Table única do sistema (TanStack Table). Tudo é prop: seleção, expansão, ordenação,\n * busca, colunas visíveis, ações em massa e por linha, densidade e estados.\n * Mobile (< 768px): a mesma tabela vira lista de cards, sem rolagem horizontal.\n * Desktop: tabela larga rola na horizontal só dentro do próprio contêiner.\n */\n/**\n * Bloco \"Ver detalhes\" do card no celular. Em `on` a altura abre e fecha pelos presets e o\n * conteúdo fechado sai do DOM; em `off` é o Collapsible de sempre, com as animações em CSS.\n */\nfunction MobileDetails({ children }: { children: ReactNode }) {\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const [open, setOpen] = useState(false)\n const trigger = (\n <Collapsible.Trigger className=\"group flex min-h-touch cursor-pointer items-center gap-1 text-sm font-medium text-primary-text\">\n <span className=\"group-data-[state=open]:hidden\">Ver detalhes</span>\n <span className=\"hidden group-data-[state=open]:inline\">Ocultar detalhes</span>\n <ChevronDown\n className=\"size-icon-sm transition-transform duration-(--rendra-duration-base) ease-move group-data-[state=open]:rotate-180\"\n aria-hidden\n />\n </Collapsible.Trigger>\n )\n if (lib) {\n return (\n <Collapsible.Root open={open} onOpenChange={setOpen}>\n {trigger}\n <lib.AnimatePresence initial={false}>\n {open && (\n <Collapsible.Content forceMount asChild>\n <lib.m.div\n className=\"overflow-hidden\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={presets.fade.transition}\n >\n {children}\n </lib.m.div>\n </Collapsible.Content>\n )}\n </lib.AnimatePresence>\n </Collapsible.Root>\n )\n }\n return (\n <Collapsible.Root>\n {trigger}\n <Collapsible.Content className=\"overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\">\n {children}\n </Collapsible.Content>\n </Collapsible.Root>\n )\n}\n\nexport function Table<T>({\n data: dataProp,\n source,\n queryKey = '',\n columns: columnsProp,\n statusLast = true,\n getRowId,\n selectable,\n expandable,\n sortable = true,\n globalFilter,\n columnVisibility,\n bulkActions,\n bulkMenu,\n rowActions,\n density = 'default',\n loading,\n error,\n onRetry,\n empty,\n pageSize: pageSizeProp = TABLE_PAGE_SIZE,\n mobilePagination = 'pages',\n toolbar,\n ...aria\n}: TableProps<T>) {\n const { isMobile } = useBreakpoint()\n const lib = useMotionLib()\n const on = lib !== null\n const presets = useMotionPresets()\n // Linhas e cards NÃO animam a entrada, em nenhum modo (W3): a tabela é tela de dezenas de\n // vezes por dia, e a cascata a cada página, filtro ou ordenação a faria parecer lenta. O que\n // anima aqui é só a expansão da linha (altura e opacidade), que explica uma mudança de estado.\n const columns = useMemo(\n () =>\n statusLast\n ? [\n ...columnsProp.filter((c) => c.kind !== 'badge'),\n ...columnsProp.filter((c) => c.kind === 'badge'),\n ]\n : columnsProp,\n [columnsProp, statusLast],\n )\n const [sorting, setSorting] = useState<SortingState>([])\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({})\n const [visibility, setVisibility] = useState<ColumnVisibilityState>(() =>\n Object.fromEntries(columnsProp.filter((c) => c.hidden).map((c) => [c.id, false])),\n )\n const [expanded, setExpanded] = useState<Record<string, boolean>>({})\n const pageSize = pageSizeProp || undefined\n const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: pageSize ?? 0 })\n const [mobilePage, setMobilePage] = useState(1)\n\n /* ---------------- modo remoto: uma requisição por página */\n const remote = Boolean(source)\n const search = useDebouncedValue(globalFilter?.trim() ?? '', 300)\n const sortKey = sorting[0] ? `${sorting[0].id}:${sorting[0].desc ? 'desc' : 'asc'}` : ''\n // Busca, ordenação ou filtros novos voltam para a página 1 no mesmo render (sem pedir a\n // página antiga com a busca nova).\n const resetKey = `${search}|${sortKey}|${queryKey}`\n const [lastResetKey, setLastResetKey] = useState(resetKey)\n if (remote && resetKey !== lastResetKey) {\n setLastResetKey(resetKey)\n setPagination((p) => ({ ...p, pageIndex: 0 }))\n setMobilePage(1)\n }\n const [reload, setReload] = useState(0)\n const [server, setServer] = useState<{\n rows: T[]\n total: number\n loading: boolean\n error: string | null\n }>({ rows: [], total: 0, loading: remote, error: null })\n const page = isMobile ? mobilePage : pagination.pageIndex + 1\n const size = (isMobile ? pageSize : pagination.pageSize) || TABLE_PAGE_SIZE\n // No mobile com \"carregar mais\", cada página nova soma às anteriores.\n const append = isMobile && mobilePagination === 'loadMore' && page > 1\n\n useEffect(() => {\n if (!source) return\n const controller = new AbortController()\n setServer((s) => ({ ...s, loading: true, error: null }))\n const [sortId, sortDir] = sortKey.split(':')\n source({\n page,\n pageSize: size,\n search,\n sort: sortId ? { id: sortId, desc: sortDir === 'desc' } : null,\n signal: controller.signal,\n })\n .then((res) => {\n if (controller.signal.aborted) return\n setServer((s) => ({\n rows: append ? [...s.rows, ...res.rows] : res.rows,\n total: res.total,\n loading: false,\n error: null,\n }))\n })\n .catch((e: unknown) => {\n if (controller.signal.aborted) return\n setServer((s) => ({\n ...s,\n loading: false,\n error: e instanceof Error ? e.message : 'Erro ao carregar os dados.',\n }))\n })\n return () => controller.abort()\n }, [source, page, size, search, sortKey, queryKey, reload, append])\n\n const data = remote ? server.rows : (dataProp ?? [])\n\n const defs = useMemo<ColumnDef<typeof tableFeatureSet, T & RowData>[]>(\n () =>\n columns.map((c) => ({\n id: c.id,\n header: c.header,\n accessorFn: (row: T & RowData) => {\n const v = c.accessor(row)\n return v instanceof Date ? v.getTime() : v\n },\n enableSorting: sortable && c.sortable !== false,\n enableHiding: c.hideable !== false,\n sortFn:\n c.kind === 'number' || c.kind === 'currency' || c.kind === 'date'\n ? 'basic'\n : 'alphanumeric',\n })),\n [columns, sortable],\n )\n\n const table = useTable({\n features: tableFeatureSet,\n data: data as (T & RowData)[],\n columns: defs,\n getRowId: (r) => getRowId(r),\n state: {\n sorting,\n rowSelection,\n columnVisibility: visibility,\n globalFilter,\n expanded,\n pagination,\n },\n onSortingChange: setSorting,\n onRowSelectionChange: setRowSelection,\n onColumnVisibilityChange: setVisibility,\n onExpandedChange: (u) =>\n setExpanded((prev) =>\n typeof u === 'function'\n ? (u(prev) as Record<string, boolean>)\n : (u as Record<string, boolean>),\n ),\n onPaginationChange: setPagination,\n enableRowSelection: Boolean(selectable),\n getRowCanExpand: () => Boolean(expandable),\n globalFilterFn: 'includesString',\n // Os quatro modelos ficam sempre registrados (features é constante de módulo); a\n // alternância local ou remoto é só pelas flags manual* e por rowCount, como na v8.\n manualSorting: remote,\n manualFiltering: remote,\n // Mobile fatia as linhas na mão (rows, mais abaixo); sem pageSize não pagina.\n manualPagination: remote || !pageSize || isMobile,\n ...(remote ? { rowCount: server.total } : { autoResetPageIndex: true }),\n })\n\n const colById = (id: string) => columns.find((c) => c.id === id)!\n const visibleCols = table.getVisibleLeafColumns().map((c) => colById(c.id))\n const selectedRows = table.getSelectedRowModel().rows.map((r) => r.original)\n const clearSelection = () => setRowSelection({})\n const bulkMenuButton =\n bulkMenu && bulkMenu.length > 0 ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" iconOnly aria-label=\"Mais ações para os selecionados\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {bulkMenu.map((a) => (\n <DropdownMenuItem\n key={a.label}\n destructive={a.destructive}\n onSelect={() => a.onClick(selectedRows, clearSelection)}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null\n const filteredCount = remote ? server.total : table.getFilteredRowModel().rows.length\n const allRows = table.getRowModel().rows\n const isLoading = Boolean(loading) || (remote && server.loading && !append)\n const loadError = error ?? (remote ? server.error : null)\n const retry = onRetry ?? (remote ? () => setReload((n) => n + 1) : undefined)\n const rows =\n !isMobile || !pageSize || remote\n ? allRows\n : mobilePagination === 'loadMore'\n ? allRows.slice(0, mobilePage * pageSize)\n : allRows.slice((mobilePage - 1) * pageSize, mobilePage * pageSize)\n const pad = densityRow[density]\n\n /* ---------------- barra de ferramentas */\n const hideableCols = columns.filter((c) => c.hideable !== false)\n const sortControl =\n isMobile && sortable ? (\n <Select\n label=\"Ordenar por\"\n placeholder=\"Ordem padrão\"\n clearable\n value={sorting[0] ? `${sorting[0].id}:${sorting[0].desc ? 'desc' : 'asc'}` : null}\n onChange={(v) => {\n if (!v) return setSorting([])\n const [id, dir] = v.split(':')\n setSorting([{ id: id ?? '', desc: dir === 'desc' }])\n }}\n options={columns\n .filter((c) => c.sortable !== false)\n .flatMap((c) => [\n { value: `${c.id}:asc`, label: `${c.header} (crescente)` },\n { value: `${c.id}:desc`, label: `${c.header} (decrescente)` },\n ])}\n />\n ) : undefined\n\n const selectionBar =\n selectable && selectedRows.length > 0 ? (\n <>\n <span className=\"text-sm font-medium tabular-nums\">\n {selectedRows.length} {selectedRows.length === 1 ? 'selecionado' : 'selecionados'}\n </span>\n <div className=\"flex flex-wrap items-center gap-2\">\n {bulkActions?.(selectedRows, clearSelection)}\n {bulkMenuButton}\n </div>\n <Button variant=\"ghost\" className=\"ml-auto\" onClick={clearSelection}>\n Limpar seleção\n </Button>\n </>\n ) : undefined\n\n const showToolbar = toolbar || columnVisibility || (isMobile && sortable)\n\n /* ---------------- estados */\n const state = (() => {\n if (loadError)\n return (\n <EmptyState\n type=\"error\"\n size=\"compact\"\n title=\"Não foi possível carregar\"\n description={loadError}\n actions={\n retry && (\n <Button variant=\"outline\" icon={<RotateCw />} onClick={retry}>\n Tentar de novo\n </Button>\n )\n }\n />\n )\n if (!isLoading && filteredCount === 0)\n return (\n <EmptyState\n size=\"compact\"\n title={globalFilter ? 'Nenhum resultado' : (empty?.title ?? 'Nada por aqui ainda')}\n description={\n globalFilter ? 'Tente outros termos ou limpe os filtros.' : empty?.description\n }\n actions={!globalFilter && empty?.action}\n />\n )\n return null\n })()\n\n /* ---------------- mobile: cards */\n const mobileBody = () => {\n const primary = visibleCols.filter((c) => (c.mobile ?? 'secondary') === 'primary').slice(0, 3)\n const secondary = visibleCols.filter((c) => (c.mobile ?? 'secondary') === 'secondary')\n if (isLoading)\n return (\n <ul className=\"flex flex-col divide-y\">\n {Array.from({ length: 4 }, (_, i) => (\n <li key={i} className=\"flex flex-col gap-3 p-4\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-3 w-1/2\" />\n <Skeleton className=\"h-3 w-1/3\" />\n </li>\n ))}\n </ul>\n )\n return (\n <ul className=\"flex flex-col divide-y\">\n {rows.map((r) => {\n const row = r.original\n const [title, ...others] = primary\n return (\n <li\n key={r.id}\n className={cn('flex flex-col gap-3 p-4', r.getIsSelected() && 'bg-primary-soft/50')}\n >\n <div className=\"flex items-start gap-3\">\n {selectable && (\n <Checkbox\n checked={r.getIsSelected()}\n onCheckedChange={(v) => r.toggleSelected(v)}\n aria-label=\"Selecionar linha\"\n />\n )}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n {title && (\n <span className=\"line-clamp-2 text-base font-semibold\">\n <CellContent col={title} row={row} title />\n </span>\n )}\n {others.map((c) => (\n <span\n key={c.id}\n className=\"flex flex-wrap items-center gap-2 text-sm text-muted-foreground\"\n >\n <span className=\"sr-only\">{c.header}: </span>\n <CellContent col={c} row={row} />\n </span>\n ))}\n </div>\n </div>\n {(secondary.length > 0 || expandable) && (\n <MobileDetails>\n <dl className=\"grid grid-cols-1 gap-3 pt-2 sm:grid-cols-2\">\n {secondary.map((c) => (\n <div key={c.id} className=\"flex flex-col gap-1\">\n <dt className=\"text-xs text-muted-foreground\">{c.header}</dt>\n <dd className=\"text-sm\">\n <CellContent col={c} row={row} />\n </dd>\n </div>\n ))}\n </dl>\n {expandable && <div className=\"pt-3\">{expandable(row)}</div>}\n </MobileDetails>\n )}\n {rowActions && rowActions.length > 0 && (\n <div className=\"border-t pt-3\">\n <RowActions row={row} actions={rowActions} mobile />\n </div>\n )}\n </li>\n )\n })}\n </ul>\n )\n }\n\n /* ---------------- desktop: tabela */\n const desktopBody = () => (\n <div className=\"scrollbar-subtle overflow-x-auto\" data-allow-overflow>\n <table className=\"w-full border-collapse text-sm\" aria-label={aria['aria-label']}>\n <thead className=\"border-b bg-muted/50\">\n <tr>\n {selectable && (\n <th scope=\"col\" className=\"w-12 pr-2 pl-4\">\n <Checkbox\n aria-label=\"Selecionar todas as linhas da página\"\n checked={\n table.getIsAllPageRowsSelected()\n ? true\n : table.getIsSomePageRowsSelected()\n ? 'indeterminate'\n : false\n }\n onCheckedChange={(v) => table.toggleAllPageRowsSelected(v)}\n />\n </th>\n )}\n {expandable && <th scope=\"col\" className=\"w-12\" aria-label=\"Expandir\" />}\n {table.getVisibleLeafColumns().map((tc) => {\n const c = colById(tc.id)\n const sorted = tc.getIsSorted()\n const align = alignOf(c)\n return (\n <th\n key={tc.id}\n scope=\"col\"\n aria-sort={\n sorted === 'asc' ? 'ascending' : sorted === 'desc' ? 'descending' : undefined\n }\n className={cn(\n 'px-4 py-3 text-xs font-medium whitespace-nowrap text-muted-foreground',\n align === 'right'\n ? 'text-right'\n : align === 'center'\n ? 'text-center'\n : 'text-left',\n c.width && minWidth[c.width],\n )}\n >\n {tc.getCanSort() ? (\n <button\n type=\"button\"\n onClick={tc.getToggleSortingHandler()}\n className={cn(\n 'inline-flex cursor-pointer items-center gap-1 rounded-item hover:text-foreground',\n align === 'right' && 'flex-row-reverse',\n sorted && 'text-foreground',\n )}\n >\n {c.header}\n {sorted === 'asc' ? (\n <ArrowUp className=\"size-3\" aria-hidden />\n ) : sorted === 'desc' ? (\n <ArrowDown className=\"size-3\" aria-hidden />\n ) : (\n <ChevronsUpDown className=\"size-3 opacity-50\" aria-hidden />\n )}\n </button>\n ) : (\n c.header\n )}\n </th>\n )\n })}\n {rowActions && (\n <th\n scope=\"col\"\n className=\"sticky right-0 w-24 bg-muted px-4 text-right text-xs font-medium text-muted-foreground\"\n >\n <span className=\"sr-only\">Ações</span>\n </th>\n )}\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {isLoading\n ? Array.from({ length: 5 }, (_, i) => (\n <tr key={i}>\n {selectable && (\n <td className=\"pr-2 pl-4\">\n <Skeleton className=\"size-icon-md\" />\n </td>\n )}\n {expandable && <td />}\n {visibleCols.map((c) => (\n <td key={c.id} className={cn('px-4', pad)}>\n <Skeleton\n className={cn('h-3', alignOf(c) === 'right' ? 'ml-auto w-16' : 'w-3/4')}\n />\n </td>\n ))}\n {rowActions && (\n <td className=\"px-4\">\n <Skeleton className=\"ml-auto h-6 w-16\" />\n </td>\n )}\n </tr>\n ))\n : rows.map((r) => {\n const row = r.original\n return (\n <Fragment key={r.id}>\n <tr\n data-state={r.getIsSelected() ? 'selected' : undefined}\n className=\"group/row transition-colors hover:bg-muted/40 data-[state=selected]:bg-primary-soft/60\"\n >\n {selectable && (\n <td className=\"pr-2 pl-4\">\n <Checkbox\n aria-label=\"Selecionar linha\"\n checked={r.getIsSelected()}\n onCheckedChange={(v) => r.toggleSelected(v)}\n />\n </td>\n )}\n {expandable && (\n <td className=\"px-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={r.getIsExpanded() ? 'Recolher linha' : 'Expandir linha'}\n aria-expanded={r.getIsExpanded()}\n onClick={() => r.toggleExpanded()}\n >\n <ChevronDown\n className={cn(\n 'transition-transform',\n r.getIsExpanded() && 'rotate-180',\n )}\n />\n </Button>\n </td>\n )}\n {visibleCols.map((c) => {\n const align = alignOf(c)\n return (\n <td\n key={c.id}\n className={cn(\n 'px-4 align-middle',\n pad,\n align === 'right'\n ? 'text-right tabular-nums'\n : align === 'center'\n ? 'text-center'\n : 'text-left',\n c.width && minWidth[c.width],\n )}\n >\n <div\n className={cn(clamp[c.lines ?? 2], align === 'right' && 'ml-auto')}\n >\n <CellContent col={c} row={row} />\n </div>\n </td>\n )\n })}\n {rowActions && (\n <td className=\"sticky right-0 w-24 bg-card px-4 group-hover/row:bg-muted group-data-[state=selected]/row:bg-primary-soft\">\n <RowActions row={row} actions={rowActions} />\n </td>\n )}\n </tr>\n {expandable && !on && r.getIsExpanded() && (\n <tr className=\"bg-muted/30\">\n <td\n colSpan={\n visibleCols.length + (selectable ? 1 : 0) + 1 + (rowActions ? 1 : 0)\n }\n className=\"px-4 py-4\"\n >\n {expandable(row)}\n </td>\n </tr>\n )}\n {expandable && on && (\n <lib.AnimatePresence initial={false}>\n {r.getIsExpanded() && (\n <tr key=\"expanded\" className=\"bg-muted/30\">\n <td\n colSpan={\n visibleCols.length + (selectable ? 1 : 0) + 1 + (rowActions ? 1 : 0)\n }\n className=\"px-4\"\n >\n <lib.m.div\n className=\"overflow-hidden\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: 'auto', opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={presets.fade.transition}\n >\n <div className=\"py-4\">{expandable(row)}</div>\n </lib.m.div>\n </td>\n </tr>\n )}\n </lib.AnimatePresence>\n )}\n </Fragment>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n\n const total = filteredCount\n return (\n <Card\n data-rendra=\"TAB-001\"\n className=\"overflow-hidden\"\n aria-busy={isLoading || server.loading || undefined}\n // Marca a carga remota (os testes esperam a primeira página chegar).\n data-remote-loading={(remote && server.loading) || undefined}\n >\n {showToolbar && (\n <DataToolbar\n {...toolbar}\n sort={sortControl}\n selectionBar={selectionBar}\n columns={\n columnVisibility\n ? hideableCols.map((c) => ({\n id: c.id,\n label: c.header,\n visible: table.getColumn(c.id)?.getIsVisible() ?? true,\n onToggle: (v) => table.getColumn(c.id)?.toggleVisibility(v),\n }))\n : undefined\n }\n />\n )}\n\n {state ?? (isMobile ? mobileBody() : desktopBody())}\n\n {pageSize && !state && (!isLoading || remote) && total > 0 && (\n <div className=\"flex justify-end border-t p-4\">\n <Pagination\n className=\"w-full\"\n page={isMobile ? mobilePage : pagination.pageIndex + 1}\n pageSize={isMobile ? pageSize : pagination.pageSize}\n total={total}\n mobileMode={mobilePagination}\n loading={remote && server.loading}\n onPageChange={(p) =>\n isMobile ? setMobilePage(p) : setPagination((s) => ({ ...s, pageIndex: p - 1 }))\n }\n onPageSizeChange={(s) => setPagination({ pageIndex: 0, pageSize: s })}\n />\n </div>\n )}\n\n {/* Mobile: ações em massa em barra fixa no rodapé da tela */}\n {isMobile && selectable && selectedRows.length > 0 && (\n <div className=\"fixed inset-x-0 bottom-0 z-40 flex flex-col gap-3 border-t bg-card px-4 pt-3 pb-safe shadow-lg\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium tabular-nums\">\n {selectedRows.length} {selectedRows.length === 1 ? 'selecionado' : 'selecionados'}\n </span>\n <Button variant=\"ghost\" size=\"sm\" onClick={clearSelection}>\n Limpar\n </Button>\n </div>\n <div className={cn('grid gap-3', bulkMenuButton ? 'grid-actions-3' : 'grid-cols-2')}>\n {bulkMenuButton}\n {bulkActions?.(selectedRows, clearSelection)}\n </div>\n </div>\n )}\n </Card>\n )\n}\n","import { FileText, ImageIcon, RotateCw, Trash2, UploadCloud, VideoIcon } from 'lucide-react'\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type DragEvent,\n type ElementType,\n type ReactNode,\n} from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { Button } from '@/components/ui/button'\nimport { ImageCropper, type ImageCropperAspect } from '@/components/ui/image-cropper'\nimport { Progress } from '@/components/ui/progress'\nimport { SortableHandle } from '@/components/ui/sortable-handle'\nimport { cn } from '@/lib/cn'\nimport {\n layoutEnabled,\n useLayoutReady,\n useMotionLib,\n useMotionMode,\n useMotionPresets,\n} from '@/lib/motion'\nimport { useSortable } from '@/lib/sortable'\n\nexport interface UploadItem {\n id: string\n file: File\n progress: number\n status: 'uploading' | 'done' | 'error'\n error?: string\n /** URL local (miniatura) para imagem ou vídeo; revogada ao remover ou desmontar. */\n previewUrl?: string\n /** Espelha progress (0-100), lido pelo layout \"gallery\". */\n progressPercent?: number\n /** Espelha error, lido pelo layout \"gallery\". */\n errorMessage?: string\n kind?: 'image' | 'video' | 'other'\n}\n\nexport interface UploadProps {\n /** Tipos aceitos, como no input file (ex.: \"image/*,.pdf\"). */\n accept?: string\n multiple?: boolean\n /** Tamanho máximo por arquivo, em MB. */\n maxSizeMb?: number\n /** Envia o arquivo; chame onProgress(0..100). Rejeite a promessa em caso de erro. */\n onUpload?: (file: File, onProgress: (pct: number) => void) => Promise<void>\n onChange?: (items: UploadItem[]) => void\n hint?: string\n disabled?: boolean\n invalid?: boolean\n id?: string\n /** Lista (padrão) ou galeria com miniaturas. */\n layout?: 'list' | 'gallery'\n /** Total de arquivos permitido; passando dele, a área de soltar arquivo some. */\n maxItems?: number\n /** Além da remoção interna, avisa quem usa o Upload (ex.: para apagar no servidor). */\n onRemove?: (id: string) => void\n /** Além da tentativa interna, avisa quem usa o Upload que o arquivo tentou de novo. */\n onRetry?: (id: string) => void\n /** Reordena os arquivos (motor de src/lib/sortable.ts, o mesmo da List e do Kanban). */\n onReorder?: (ids: string[]) => void\n /**\n * Com ela, toda imagem passa pelo recorte antes de virar arquivo enviado: o arquivo só é\n * entregue (a onUpload e a onChange) depois de confirmado no recorte.\n */\n crop?: { aspects: ImageCropperAspect[]; maxOutputWidth?: number }\n 'aria-describedby'?: string\n}\n\nconst formatSize = (b: number) =>\n b < 1024 * 1024\n ? `${Math.max(1, Math.round(b / 1024))} KB`\n : `${(b / 1024 / 1024).toLocaleString('pt-BR', { maximumFractionDigits: 1 })} MB`\n\nfunction kindOf(file: File): NonNullable<UploadItem['kind']> {\n if (file.type.startsWith('image/')) return 'image'\n if (file.type.startsWith('video/')) return 'video'\n return 'other'\n}\n\n/** Upload único: arrastar e soltar ou tocar para escolher, em lista ou em galeria. */\nexport function Upload({\n accept,\n multiple = true,\n maxSizeMb = 10,\n onUpload,\n onChange,\n hint,\n disabled,\n invalid,\n id,\n layout = 'list',\n maxItems,\n onRemove,\n onRetry,\n onReorder,\n crop,\n ...aria\n}: UploadProps) {\n const auto = useId()\n const inputId = id ?? `upload${auto}`\n const inputRef = useRef<HTMLInputElement>(null)\n const [drag, setDrag] = useState(false)\n const [items, setItems] = useState<UploadItem[]>([])\n const [pendingCrop, setPendingCrop] = useState<File[]>([])\n const code = resolveCatalogCode('Upload', { layout })\n\n const itemsRef = useRef<UploadItem[]>([])\n itemsRef.current = items\n useEffect(\n () => () => {\n // Revoga toda miniatura ao desmontar: object URL nunca sobrevive à tela.\n itemsRef.current.forEach((it) => it.previewUrl && URL.revokeObjectURL(it.previewUrl))\n },\n [],\n )\n\n const update = (fn: (all: UploadItem[]) => UploadItem[]) =>\n setItems((all) => {\n const next = fn(all)\n onChange?.(next)\n return next\n })\n\n const patch = (id: string, changes: Partial<UploadItem>) =>\n update((all) =>\n all.map((i) => {\n if (i.id !== id) return i\n const merged = { ...i, ...changes }\n if ('progress' in changes) merged.progressPercent = merged.progress\n if ('error' in changes) merged.errorMessage = merged.error\n return merged\n }),\n )\n\n /**\n * Acrescenta os itens novos (multiple) ou substitui o que já existia (multiple=false),\n * revogando a miniatura do que sai: o object URL nunca fica pendurado sem tela nenhuma\n * usando ele.\n */\n const insertItems = (created: UploadItem[]) =>\n update((all) => {\n if (multiple) return [...all, ...created]\n all.forEach((it) => it.previewUrl && URL.revokeObjectURL(it.previewUrl))\n return created\n })\n\n const send = (item: UploadItem) => {\n if (!onUpload) {\n patch(item.id, { progress: 100, status: 'done' })\n return\n }\n onUpload(item.file, (pct) => patch(item.id, { progress: pct }))\n .then(() => patch(item.id, { progress: 100, status: 'done' }))\n .catch((e: unknown) =>\n patch(item.id, {\n status: 'error',\n error: e instanceof Error ? e.message : 'Falha no envio.',\n }),\n )\n }\n\n const createItem = (file: File): UploadItem => {\n const tooBig = file.size > maxSizeMb * 1024 * 1024\n const kind = kindOf(file)\n return {\n id: `${file.name}-${file.size}-${crypto.randomUUID()}`,\n file,\n progress: 0,\n progressPercent: 0,\n status: tooBig ? 'error' : 'uploading',\n error: tooBig ? `Arquivo maior que ${maxSizeMb} MB.` : undefined,\n errorMessage: tooBig ? `Arquivo maior que ${maxSizeMb} MB.` : undefined,\n previewUrl: kind !== 'other' ? URL.createObjectURL(file) : undefined,\n kind,\n }\n }\n\n const acceptFiles = (files: File[]) => {\n const room = maxItems ? Math.max(0, maxItems - items.length - pendingCrop.length) : undefined\n const limited = room !== undefined ? files.slice(0, room) : files\n if (limited.length === 0) return\n if (crop) {\n const toCrop = limited.filter((f) => kindOf(f) === 'image')\n const rest = limited.filter((f) => kindOf(f) !== 'image')\n if (toCrop.length > 0) setPendingCrop((q) => [...q, ...toCrop])\n if (rest.length > 0) {\n const created = rest.map(createItem)\n insertItems(created)\n created.filter((c) => c.status === 'uploading').forEach(send)\n }\n return\n }\n const created = limited.map(createItem)\n insertItems(created)\n created.filter((c) => c.status === 'uploading').forEach(send)\n }\n\n const add = (files: FileList | null) => {\n if (!files) return\n acceptFiles(Array.from(files).slice(0, multiple ? undefined : 1))\n }\n\n const onDrop = (e: DragEvent) => {\n e.preventDefault()\n setDrag(false)\n if (!disabled) add(e.dataTransfer.files)\n }\n\n const remove = (removeId: string) => {\n update((all) => {\n const removed = all.find((i) => i.id === removeId)\n if (removed?.previewUrl) URL.revokeObjectURL(removed.previewUrl)\n return all.filter((i) => i.id !== removeId)\n })\n onRemove?.(removeId)\n }\n\n const retry = (it: UploadItem) => {\n patch(it.id, { status: 'uploading', progress: 0, error: undefined })\n send({ ...it, status: 'uploading', progress: 0 })\n onRetry?.(it.id)\n }\n\n const sortable = useSortable<UploadItem>({\n items: items.map((it) => ({ id: it.id, data: it })),\n onReorder: (sorted) => {\n update(() => sorted.map((s) => s.data))\n onReorder?.(sorted.map((s) => s.id))\n },\n })\n const motion = useMotionMode()\n const lib = useMotionLib()\n const ready = useLayoutReady()\n const presets = useMotionPresets()\n // Em `on` cada item entra e sai animado (a saída segura o item até terminar) e reordena com\n // layout, pela mesma regra da List: sem layout durante o arraste.\n const Item: ElementType = lib ? lib.m.li : 'li'\n const itemMotion =\n motion === 'on'\n ? {\n ...presets.fade,\n layout: layoutEnabled({ mode: motion, ready, dragging: sortable.draggingId !== null }),\n transition: { ...presets.fade.transition, layout: presets.move },\n }\n : {}\n const animated = (nodes: ReactNode) =>\n lib ? (\n <lib.AnimatePresence mode=\"popLayout\" initial={false}>\n {nodes}\n </lib.AnimatePresence>\n ) : (\n nodes\n )\n\n const reachedLimit = maxItems !== undefined && items.length + pendingCrop.length >= maxItems\n\n const dropzone = !reachedLimit && (\n <label\n htmlFor={inputId}\n onDragOver={(e) => {\n e.preventDefault()\n if (!disabled) setDrag(true)\n }}\n onDragLeave={() => setDrag(false)}\n onDrop={onDrop}\n className={cn(\n 'flex cursor-pointer flex-col items-center justify-center gap-3 rounded-control border-2 border-dashed border-input bg-card px-4 py-8 text-center transition-colors',\n 'hover:border-primary hover:bg-primary-soft/40 has-[:focus-visible]:focus-ring',\n drag && 'border-primary bg-primary-soft',\n invalid && 'border-destructive',\n disabled && 'pointer-events-none opacity-60',\n )}\n >\n <span className=\"flex size-12 items-center justify-center rounded-full bg-primary-soft text-primary-soft-foreground\">\n <UploadCloud className=\"size-icon-lg\" aria-hidden />\n </span>\n <span className=\"flex flex-col gap-1\">\n <span className=\"text-sm font-medium\">\n <span className=\"text-primary-text\">Toque para escolher</span>\n <span className=\"hidden md:inline\"> ou arraste arquivos até aqui</span>\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {hint ?? `Até ${maxSizeMb} MB por arquivo.`}\n </span>\n </span>\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n aria-describedby={aria['aria-describedby']}\n className=\"sr-only\"\n onChange={(e) => {\n add(e.target.files)\n e.target.value = ''\n }}\n />\n </label>\n )\n\n const handle = (it: UploadItem) =>\n onReorder && (\n <SortableHandle id={it.id} label={`Reordenar ${it.file.name}`} sortable={sortable} />\n )\n\n const listView = items.length > 0 && (\n <ul\n key={String(ready)}\n className=\"flex flex-col divide-y rounded-control border bg-card\"\n aria-live=\"polite\"\n >\n {animated(\n items.map((it) => (\n <Item\n key={it.id}\n {...(onReorder ? sortable.itemProps(it.id) : {})}\n {...itemMotion}\n className={cn(\n 'flex items-center gap-3 p-3',\n sortable.draggingId === it.id && 'opacity-50',\n )}\n >\n {handle(it)}\n <span className=\"flex size-control-sm shrink-0 items-center justify-center rounded-item bg-muted text-muted-foreground md:size-control-md\">\n {it.kind === 'image' ? (\n <ImageIcon className=\"size-icon-md\" aria-hidden />\n ) : it.kind === 'video' ? (\n <VideoIcon className=\"size-icon-md\" aria-hidden />\n ) : (\n <FileText className=\"size-icon-md\" aria-hidden />\n )}\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{it.file.name}</span>\n {it.status === 'done' && (\n <BrandFeedbackIcon type=\"success\" size=\"sm\" animated label=\"Enviado\" />\n )}\n {it.status === 'error' && <BrandFeedbackIcon type=\"error\" size=\"sm\" label=\"Erro\" />}\n </div>\n {it.status === 'error' ? (\n <span className=\"text-xs font-medium text-destructive\">{it.error}</span>\n ) : it.status === 'uploading' ? (\n <Progress\n value={it.progress}\n size=\"sm\"\n showValue\n label={`Enviando ${it.file.name}`}\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">{formatSize(it.file.size)}</span>\n )}\n </div>\n {it.status === 'error' && !it.error?.startsWith('Arquivo maior') && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Tentar enviar ${it.file.name} de novo`}\n onClick={() => retry(it)}\n >\n <RotateCw />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Remover ${it.file.name}`}\n onClick={() => remove(it.id)}\n >\n <Trash2 />\n </Button>\n </Item>\n )),\n )}\n </ul>\n )\n\n const galleryView = items.length > 0 && (\n <ul key={String(ready)} className=\"grid grid-cols-2 gap-3 md:grid-cols-3\">\n {animated(\n items.map((it) => (\n <Item\n key={it.id}\n {...(onReorder ? sortable.itemProps(it.id) : {})}\n {...itemMotion}\n className={cn(\n 'relative flex aspect-square flex-col overflow-hidden rounded-control border bg-card',\n sortable.draggingId === it.id && 'opacity-50',\n )}\n >\n {it.previewUrl && it.kind === 'image' ? (\n <img\n src={it.previewUrl}\n alt=\"\"\n className=\"size-full object-cover\"\n draggable={false}\n />\n ) : (\n <span className=\"flex flex-1 items-center justify-center text-muted-foreground\">\n {it.kind === 'video' ? (\n <VideoIcon className=\"size-icon-lg\" aria-hidden />\n ) : (\n <FileText className=\"size-icon-lg\" aria-hidden />\n )}\n </span>\n )}\n <span className=\"truncate bg-card/90 px-2 py-1 text-xs font-medium\">\n {it.file.name}\n </span>\n {it.status === 'uploading' && (\n <span className=\"absolute inset-x-2 bottom-8\">\n <Progress\n value={it.progressPercent ?? 0}\n size=\"sm\"\n label={`Enviando ${it.file.name}`}\n />\n </span>\n )}\n {it.status === 'error' && (\n <span className=\"absolute inset-x-2 bottom-8 truncate rounded-item bg-destructive-soft px-2 py-1 text-xs font-medium text-destructive-soft-foreground\">\n {it.errorMessage}\n </span>\n )}\n <span className=\"absolute top-1 right-1 flex gap-1\">\n {it.status === 'error' && !it.error?.startsWith('Arquivo maior') && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Tentar enviar ${it.file.name} de novo`}\n className=\"bg-card/90\"\n onClick={() => retry(it)}\n >\n <RotateCw />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Remover ${it.file.name}`}\n className=\"bg-card/90\"\n onClick={() => remove(it.id)}\n >\n <Trash2 />\n </Button>\n </span>\n <span className=\"absolute top-1 left-1 flex items-center gap-1\">\n {handle(it)}\n {it.status === 'done' && (\n <BrandFeedbackIcon type=\"success\" size=\"sm\" animated label=\"Enviado\" />\n )}\n </span>\n </Item>\n )),\n )}\n </ul>\n )\n\n return (\n <div data-rendra={code} className=\"flex min-w-0 flex-col gap-3\">\n {pendingCrop[0] && (\n <ImageCropper\n file={pendingCrop[0]}\n aspects={crop?.aspects ?? [{ id: 'livre', label: 'Livre', ratio: 1 }]}\n maxOutputWidth={crop?.maxOutputWidth}\n onCancel={() => setPendingCrop((q) => q.slice(1))}\n onConfirm={(cropped) => {\n setPendingCrop((q) => q.slice(1))\n const created = createItem(cropped)\n insertItems([created])\n if (created.status === 'uploading') send(created)\n }}\n />\n )}\n {dropzone}\n {layout === 'gallery' ? galleryView : listView}\n </div>\n )\n}\n","import { ArrowLeft, ArrowRight, Check, X } from 'lucide-react'\nimport { useRef, useState, type ReactNode } from 'react'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Progress } from '@/components/ui/progress'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface WizardStep {\n id: string\n title: string\n description?: string\n}\n\nexport type StepStatus = 'complete' | 'current' | 'pending' | 'error'\n\nexport interface StepperProps {\n steps: WizardStep[]\n /** Índice da etapa atual (0 é a primeira). */\n current: number\n /** Etapas com erro de validação (índices). */\n errors?: number[]\n orientation?: 'horizontal' | 'vertical'\n /** Permite voltar clicando em etapas concluídas. */\n onStepClick?: (index: number) => void\n className?: string\n}\n\nfunction statusOf(i: number, current: number, errors: number[]): StepStatus {\n if (errors.includes(i)) return 'error'\n if (i < current) return 'complete'\n if (i === current) return 'current'\n return 'pending'\n}\n\nconst statusLabel: Record<StepStatus, string> = {\n complete: 'concluída',\n current: 'atual',\n pending: 'pendente',\n error: 'com erro',\n}\n\n/**\n * Indicador de etapas. Desktop: todas as etapas (horizontal ou vertical).\n * Mobile: reconstruído como \"Etapa 2 de 5\", barra de progresso e nome da etapa.\n */\nexport function Stepper({\n steps,\n current,\n errors = [],\n orientation = 'horizontal',\n onStepClick,\n className,\n}: StepperProps) {\n const step = steps[current]\n const lib = useMotionLib()\n const presets = useMotionPresets()\n return (\n <div data-rendra=\"WIZ-002\" className={cn('min-w-0', className)}>\n {/* Mobile: indicador compacto */}\n <div className=\"flex flex-col gap-2 md:hidden\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <span className=\"text-xs font-medium text-muted-foreground tabular-nums\">\n Etapa {current + 1} de {steps.length}\n </span>\n {errors.includes(current) && (\n <span className=\"text-xs font-medium text-destructive\">Revise esta etapa</span>\n )}\n </div>\n <Progress\n value={((current + 1) / steps.length) * 100}\n size=\"sm\"\n tone=\"brand\"\n label=\"Progresso\"\n />\n <p className=\"text-base font-semibold\">{step?.title}</p>\n </div>\n\n {/* Desktop */}\n <ol\n className={cn(\n 'hidden md:flex',\n orientation === 'horizontal' ? 'items-start gap-2' : 'flex-col gap-1',\n )}\n >\n {steps.map((s, i) => {\n const st = statusOf(i, current, errors)\n const clickable = onStepClick && st === 'complete'\n const circle = (\n <span\n className={cn(\n 'flex size-8 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold tabular-nums transition-colors',\n st === 'complete' && 'border-primary bg-primary text-primary-foreground',\n st === 'current' && 'border-primary bg-card text-primary-text',\n st === 'pending' && 'border-border bg-card text-muted-foreground',\n st === 'error' && 'border-destructive bg-destructive text-destructive-foreground',\n )}\n >\n {st === 'complete' ? (\n lib ? (\n // O check da etapa concluída entra com o pop.\n <lib.m.span className=\"flex\" {...presets.pop}>\n <Check className=\"size-icon-sm\" strokeWidth={3} aria-hidden />\n </lib.m.span>\n ) : (\n <Check className=\"size-icon-sm\" strokeWidth={3} aria-hidden />\n )\n ) : st === 'error' ? (\n <X className=\"size-icon-sm\" strokeWidth={3} aria-hidden />\n ) : (\n i + 1\n )}\n </span>\n )\n const text = (\n <span className=\"flex min-w-0 flex-col gap-1 text-left\">\n <span\n className={cn(\n 'text-sm font-medium',\n st === 'pending' && 'text-muted-foreground',\n st === 'error' && 'text-destructive',\n )}\n >\n {s.title}\n </span>\n {s.description && (\n <span className=\"text-xs text-muted-foreground\">{s.description}</span>\n )}\n </span>\n )\n const inner = (\n <span className=\"flex items-start gap-3\">\n {circle}\n <span className=\"pt-1\">{text}</span>\n </span>\n )\n return (\n <li\n key={s.id}\n aria-current={st === 'current' ? 'step' : undefined}\n className={cn(\n 'flex min-w-0',\n orientation === 'horizontal' ? 'flex-1 flex-col gap-3' : 'flex-col',\n )}\n >\n <div\n className={cn('flex items-center gap-2', orientation === 'horizontal' && 'w-full')}\n >\n {clickable ? (\n <button\n type=\"button\"\n onClick={() => onStepClick(i)}\n className=\"cursor-pointer rounded-item text-left hover:opacity-80\"\n >\n {inner}\n </button>\n ) : (\n inner\n )}\n <span className=\"sr-only\">, {statusLabel[st]}</span>\n {orientation === 'horizontal' && i < steps.length - 1 && (\n <span\n aria-hidden\n className={cn(\n 'mt-4 h-px min-w-4 flex-1 self-start',\n i < current ? 'bg-primary' : 'bg-border',\n )}\n />\n )}\n </div>\n {orientation === 'vertical' && i < steps.length - 1 && (\n <span\n aria-hidden\n className={cn('ml-4 h-6 w-px', i < current ? 'bg-primary' : 'bg-border')}\n />\n )}\n </li>\n )\n })}\n </ol>\n </div>\n )\n}\n\nexport interface WizardProps {\n steps: WizardStep[]\n /** Conteúdo de cada etapa, na mesma ordem. */\n children: ReactNode[]\n /** Valida a etapa antes de avançar. Retorne false para bloquear (e marcar erro). */\n onValidateStep?: (index: number) => boolean | Promise<boolean>\n onFinish?: () => void | Promise<void>\n onCancel?: () => void\n /** Rótulo do cancelar da primeira etapa (só aparece com `onCancel`). Padrão: \"Cancelar\". */\n cancelLabel?: string\n /** Rótulo do voltar das etapas seguintes. Padrão: \"Voltar\". */\n backLabel?: string\n /** Rótulo do avançar (todas as etapas menos a última). Padrão: \"Avançar\". */\n nextLabel?: string\n finishLabel?: string\n /**\n * Torna a etapa opcional: \"Pular\" aparece no menu \"Mais ações\" da barra de ações (nunca na\n * última etapa), avança **sem validar** e limpa o erro da etapa. Sem esta prop não há menu.\n */\n onSkip?: () => void\n /** Rótulo do item de pular. Padrão: \"Pular\". */\n skipLabel?: string\n orientation?: 'horizontal' | 'vertical'\n /** Botões no rodapé fixo da tela. Padrão: não, seguem junto do card do wizard. */\n stickyFooter?: boolean\n}\n\n/** Cadastro em etapas, com validação por etapa e rodapé Voltar / Avançar. */\nexport function Wizard({\n steps,\n children,\n onValidateStep,\n onFinish,\n onCancel,\n cancelLabel = 'Cancelar',\n backLabel = 'Voltar',\n nextLabel = 'Avançar',\n finishLabel = 'Concluir',\n onSkip,\n skipLabel = 'Pular',\n orientation = 'horizontal',\n stickyFooter = false,\n}: WizardProps) {\n const [current, setCurrent] = useState(0)\n const [errors, setErrors] = useState<number[]>([])\n const [busy, setBusy] = useState(false)\n const last = current === steps.length - 1\n\n const next = async () => {\n setBusy(true)\n try {\n const ok = onValidateStep ? await onValidateStep(current) : true\n if (!ok) {\n setErrors((e) => [...new Set([...e, current])])\n return\n }\n setErrors((e) => e.filter((x) => x !== current))\n if (last) await onFinish?.()\n else setCurrent((c) => c + 1)\n } finally {\n setBusy(false)\n }\n }\n\n // Pular não passa pela validação: a etapa opcional fica em branco de propósito.\n const skip = () => {\n setErrors((e) => e.filter((x) => x !== current))\n setCurrent((c) => c + 1)\n onSkip?.()\n }\n\n const lib = useMotionLib()\n const presets = useMotionPresets()\n // Direção do passo (1 avança, -1 volta), guardada para a saída usar o sentido certo.\n const previous = useRef(current)\n const direction = current >= previous.current ? 1 : -1\n previous.current = current\n const body = lib ? (\n // `on`: a etapa nova entra de 8 px na direção do passo e a antiga sai por opacidade com\n // blur de 2 px, sem esperar (popLayout tira a que sai do fluxo: nada empurra a que entra).\n // A chave por etapa remonta o corpo: o estado local de campos não controlados se perde\n // (os campos do formulário do projeto são controlados, então o valor volta igual).\n <div className=\"relative flex min-w-0 flex-col gap-6\">\n <lib.AnimatePresence mode=\"popLayout\" initial={false}>\n <lib.m.div\n key={current}\n {...presets.swap(direction)}\n className=\"flex min-w-0 flex-col gap-6\"\n >\n {children[current]}\n </lib.m.div>\n </lib.AnimatePresence>\n </div>\n ) : (\n <div className=\"flex min-w-0 flex-col gap-6\">{children[current]}</div>\n )\n\n return (\n <div\n data-rendra=\"WIZ-001\"\n className={cn(\n 'flex min-w-0 flex-col gap-8',\n orientation === 'vertical' && 'md:flex-row md:gap-12',\n )}\n >\n <Stepper\n steps={steps}\n current={current}\n errors={errors}\n orientation={orientation}\n onStepClick={setCurrent}\n className={cn(orientation === 'vertical' && 'md:w-3xs md:shrink-0')}\n />\n <div className=\"flex min-w-0 flex-1 flex-col gap-8\">\n {body}\n <ActionBar\n sticky={stickyFooter}\n cancel={\n current > 0\n ? { label: backLabel, icon: <ArrowLeft />, onClick: () => setCurrent((c) => c - 1) }\n : onCancel\n ? { label: cancelLabel, onClick: onCancel }\n : undefined\n }\n secondary={onSkip && !last ? [{ label: skipLabel, onClick: skip }] : undefined}\n primary={{\n label: last ? finishLabel : nextLabel,\n icon: last ? <Check /> : <ArrowRight />,\n onClick: next,\n loading: busy,\n loadingLabel: last ? 'Concluindo...' : 'Validando...',\n }}\n />\n </div>\n </div>\n )\n}\n","import { Slot } from 'radix-ui'\nimport type { ElementType, HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport {\n alignClass,\n fieldGridClass,\n gapClass,\n justifyClass,\n type Align,\n type Justify,\n type Space,\n} from './tokens'\n\n/*\n * Primitivas de layout. Toda tela é composta por elas; classes de layout soltas\n * (flex, grid, gap, padding de página) nas telas são erro de revisão.\n */\n\ninterface BaseProps extends HTMLAttributes<HTMLElement> {\n as?: ElementType\n asChild?: boolean\n}\n\nfunction Box({ as: As = 'div', asChild, ...props }: BaseProps) {\n const Comp: ElementType = asChild ? Slot.Root : As\n return <Comp {...props} />\n}\n\n// ---------------------------------------------------------------- Container\n\nconst containerSize = {\n narrow: 'max-w-3xl',\n // Largura toda da área de conteúdo, com o mesmo respiro em todos os lados (16px/24px).\n default: 'max-w-none',\n full: 'max-w-none',\n} as const\n\nexport interface ContainerProps extends BaseProps {\n /** narrow: leitura e formulários; default: telas de sistema; full: sem limite. */\n size?: keyof typeof containerSize\n /** Respiro vertical de página (topo e base). Use no contêiner raiz de cada tela. */\n padded?: boolean\n}\n\n/** Largura máxima e padding lateral de página: 16px no mobile, 24px no tablet, 32px no desktop. */\nexport function Container({\n size = 'default',\n padded = false,\n className,\n ...props\n}: ContainerProps) {\n return (\n <Box\n className={cn(\n 'mx-auto w-full min-w-0 px-4 md:px-6',\n // Respiro igual em todos os lados: 16px no celular e 24px a partir do tablet.\n padded && 'py-4 md:py-6',\n containerSize[size],\n className,\n )}\n {...props}\n />\n )\n}\n\n// ---------------------------------------------------------------- Stack\n\nexport interface StackProps extends BaseProps {\n gap?: Space\n align?: Align\n}\n\n/** Empilha na vertical. gap=\"section\" para separar seções de página. */\nexport function Stack({ gap = '4', align = 'stretch', className, ...props }: StackProps) {\n return (\n <Box\n className={cn('flex min-w-0 flex-col', gapClass[gap], alignClass[align], className)}\n {...props}\n />\n )\n}\n\n// ---------------------------------------------------------------- Inline\n\nconst smAlignClass: Record<Align, string> = {\n start: 'sm:items-start',\n center: 'sm:items-center',\n end: 'sm:items-end',\n stretch: 'sm:items-stretch',\n baseline: 'sm:items-baseline',\n}\n\nexport interface InlineProps extends BaseProps {\n gap?: Space\n align?: Align\n justify?: Justify\n /** Quebra linha quando falta espaço (padrão). Com false, os filhos precisam poder encolher. */\n wrap?: boolean\n /** Empilha no mobile e alinha em linha a partir de sm. */\n stackOnMobile?: boolean\n}\n\n/** Alinha na horizontal, quebrando linha por padrão para nunca estourar a largura. */\nexport function Inline({\n gap = '2',\n align = 'center',\n justify = 'start',\n wrap = true,\n stackOnMobile = false,\n className,\n ...props\n}: InlineProps) {\n return (\n <Box\n className={cn(\n 'flex min-w-0',\n stackOnMobile ? 'flex-col items-stretch sm:flex-row' : 'flex-row',\n stackOnMobile ? smAlignClass[align] : alignClass[align],\n wrap && 'flex-wrap',\n gapClass[gap],\n justifyClass[justify],\n className,\n )}\n {...props}\n />\n )\n}\n\n// ---------------------------------------------------------------- Grid\n\ntype Cols = 1 | 2 | 3 | 4 | 6\nconst colsBase: Record<Cols, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n 6: 'grid-cols-6',\n}\nconst colsSm: Record<Cols, string> = {\n 1: 'sm:grid-cols-1',\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-3',\n 4: 'sm:grid-cols-4',\n 6: 'sm:grid-cols-6',\n}\nconst colsMd: Record<Cols, string> = {\n 1: 'md:grid-cols-1',\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-4',\n 6: 'md:grid-cols-6',\n}\nconst colsLg: Record<Cols, string> = {\n 1: 'lg:grid-cols-1',\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n 6: 'lg:grid-cols-6',\n}\nconst colsXl: Record<Cols, string> = {\n 1: 'xl:grid-cols-1',\n 2: 'xl:grid-cols-2',\n 3: 'xl:grid-cols-3',\n 4: 'xl:grid-cols-4',\n 6: 'xl:grid-cols-6',\n}\n// Container queries: a grade responde à largura do bloco onde está, não da tela.\nconst colsCqSm: Record<Cols, string> = {\n 1: '@sm:grid-cols-1',\n 2: '@sm:grid-cols-2',\n 3: '@sm:grid-cols-3',\n 4: '@sm:grid-cols-4',\n 6: '@sm:grid-cols-6',\n}\nconst colsCqMd: Record<Cols, string> = {\n 1: '@2xl:grid-cols-1',\n 2: '@2xl:grid-cols-2',\n 3: '@2xl:grid-cols-3',\n 4: '@2xl:grid-cols-4',\n 6: '@2xl:grid-cols-6',\n}\nconst colsCqLg: Record<Cols, string> = {\n 1: '@4xl:grid-cols-1',\n 2: '@4xl:grid-cols-2',\n 3: '@4xl:grid-cols-3',\n 4: '@4xl:grid-cols-4',\n 6: '@4xl:grid-cols-6',\n}\nconst colsCqXl: Record<Cols, string> = {\n 1: '@6xl:grid-cols-1',\n 2: '@6xl:grid-cols-2',\n 3: '@6xl:grid-cols-3',\n 4: '@6xl:grid-cols-4',\n 6: '@6xl:grid-cols-6',\n}\n\nexport interface GridProps extends BaseProps {\n /** Colunas por faixa. O padrão no mobile é sempre 1. */\n cols?: { base?: Cols; sm?: Cols; md?: Cols; lg?: Cols; xl?: Cols }\n gap?: Space\n /**\n * 'container' faz as colunas reagirem à largura do próprio bloco (@container),\n * útil dentro de drawers, cards laterais e colunas estreitas.\n */\n responsive?: 'screen' | 'container'\n /**\n * Grade de formulário: 12 colunas pela largura do bloco, com a largura de cada Field no\n * span (padrão 3 por linha). Ignora cols e responsive; o gap padrão vira \"fields\".\n */\n form?: boolean\n}\n\nexport function Grid({\n cols = { base: 1 },\n gap = '4',\n responsive = 'screen',\n form,\n className,\n children,\n ...props\n}: GridProps) {\n if (form) {\n return (\n <Box className={cn('@container min-w-0', className)} {...props}>\n <div className={cn(fieldGridClass, gapClass[gap === '4' ? 'fields' : gap])}>{children}</div>\n </Box>\n )\n }\n const cq = responsive === 'container'\n const grid = cn(\n 'grid min-w-0',\n colsBase[cols.base ?? 1],\n cols.sm && (cq ? colsCqSm : colsSm)[cols.sm],\n cols.md && (cq ? colsCqMd : colsMd)[cols.md],\n cols.lg && (cq ? colsCqLg : colsLg)[cols.lg],\n cols.xl && (cq ? colsCqXl : colsXl)[cols.xl],\n gapClass[gap],\n )\n if (cq) {\n return (\n <Box className={cn('@container min-w-0', className)} {...props}>\n <div className={grid}>{children}</div>\n </Box>\n )\n }\n return (\n <Box className={cn(grid, className)} {...props}>\n {children}\n </Box>\n )\n}\n\n// ---------------------------------------------------------------- Section\n\nexport interface SectionProps extends Omit<BaseProps, 'title'> {\n title?: ReactNode\n description?: ReactNode\n /** Ações do cabeçalho da seção, à direita no desktop e abaixo do título no mobile. */\n actions?: ReactNode\n /** Nível do título. Padrão h2. */\n level?: 2 | 3\n gap?: Space\n}\n\n/** Seção de página com título, descrição e ações. Espaço interno padrão de 16px. */\nexport function Section({\n title,\n description,\n actions,\n level = 2,\n gap = '4',\n className,\n children,\n id,\n ...props\n}: SectionProps) {\n const H = level === 2 ? 'h2' : 'h3'\n const titleId = id ? `${id}-titulo` : undefined\n return (\n <Box\n as=\"section\"\n id={id}\n aria-labelledby={title ? titleId : undefined}\n className={cn('flex min-w-0 scroll-mt-6 flex-col', gapClass[gap], className)}\n {...props}\n >\n {(title || actions) && (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between sm:gap-4\">\n <div className=\"flex min-w-0 flex-col gap-1\">\n {title && (\n <H id={titleId} className={level === 2 ? 'text-xl' : 'text-lg'}>\n {title}\n </H>\n )}\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 flex-wrap gap-2\">{actions}</div>}\n </div>\n )}\n {children}\n </Box>\n )\n}\n","import { useContext, useEffect, type ReactNode } from 'react'\nimport { ShellContext } from '@/components/app-shell/shell-context'\nimport { Breadcrumb, type BreadcrumbItem } from '@/components/ui/breadcrumb'\nimport { InfoHint } from '@/components/ui/info-hint'\nimport { cn } from '@/lib/cn'\n\nexport interface PageHeaderProps {\n /** Título da página. Dentro do AppShell ele já aparece no header, então aqui fica oculto. */\n title: ReactNode\n /**\n * Mostra o título no corpo da página. Use só quando o título do corpo for diferente\n * do header (ex.: no detalhe, o nome do cliente em vez de \"Detalhe do cliente\"),\n * ou em telas fora do AppShell.\n */\n showTitle?: boolean\n /**\n * Dado curto sobre o conteúdo (status, segmento, cidade). Nunca instrução de uso: texto\n * orientativo vai em `help`.\n */\n description?: ReactNode\n /**\n * Texto orientativo da tela (como usar, o que cada parte faz). Vira um ícone de informação\n * ao lado do título, no header fixo, que abre um modal. Nunca um parágrafo no corpo.\n */\n help?: ReactNode\n /** Trilha própria. Dentro do AppShell a trilha já aparece no header, abaixo do título. */\n breadcrumb?: BreadcrumbItem[]\n /**\n * Ação principal (e no máximo uma secundária). No mobile ficam abaixo da descrição,\n * dividindo a largura; no desktop ficam à direita, com largura automática.\n */\n actions?: ReactNode\n /**\n * Título discreto no topo do corpo quando o cabeçalho do shell esconde o título (no celular,\n * com `headerLogo`): `text-base` abaixo de `md` e só de leitor de tela a partir dele.\n * `showTitle` vence. Padrão: `false`.\n */\n bodyTitle?: boolean\n /**\n * `reserve` (padrão): o bloco do título ocupa lugar mesmo quando o título é só de leitor de\n * tela (o vão de 16 px acima das ações no celular). `none`: sem título visível e sem\n * `description`, o bloco não é desenhado e o vão some; o `h1` segue no DOM para o leitor.\n */\n titleSpace?: 'reserve' | 'none'\n /** Conteúdo abaixo, como abas ou metadados. */\n children?: ReactNode\n /**\n * Classes extras, que vencem as do componente. Para zerar a margem negativa de baixo (que\n * aproxima o cabeçalho do conteúdo) use `className=\"mb-0 md:mb-0\"`.\n */\n className?: string\n}\n\n/**\n * Cabeçalho de conteúdo: descrição e ações da tela, logo abaixo do header.\n * O título fica no header (com a trilha); aqui ele só é lido por leitores de tela,\n * para que cada página tenha um único título principal (h1).\n */\nexport function PageHeader({\n title,\n showTitle = false,\n description,\n help,\n breadcrumb,\n actions,\n bodyTitle = false,\n titleSpace = 'reserve',\n children,\n className,\n}: PageHeaderProps) {\n const shell = useContext(ShellContext)\n const setPageHelp = shell?.setPageHelp\n // Dentro do AppShell, o ícone de ajuda vai para o header, ao lado do título da tela.\n useEffect(() => {\n if (!setPageHelp) return\n setPageHelp(help ?? null)\n return () => setPageHelp(null)\n }, [help, setPageHelp])\n const inlineHelp = help && !shell\n const visible =\n showTitle || bodyTitle || description || actions || breadcrumb || children || inlineHelp\n // Sem título visível e sem descrição, o bloco do título só carregaria o h1 sr-only (que não\n // ocupa lugar); com titleSpace=\"none\" ele nem é desenhado e o vão acima das ações some.\n const titleOnlyForReader = !showTitle && !bodyTitle && !inlineHelp\n const collapseTitle = titleSpace === 'none' && titleOnlyForReader && !description\n const titleClass =\n showTitle || inlineHelp\n ? 'text-2xl md:text-3xl'\n : bodyTitle\n ? 'text-base md:sr-only'\n : 'sr-only'\n return (\n <header\n className={cn('-mb-2 flex min-w-0 flex-col gap-4 md:-mb-4', !visible && 'sr-only', className)}\n >\n {breadcrumb && <Breadcrumb items={breadcrumb} />}\n <div className=\"flex min-w-0 flex-col gap-4 md:flex-row md:items-center md:justify-between md:gap-6\">\n {collapseTitle ? (\n <h1 className=\"sr-only\">{title}</h1>\n ) : (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <h1 className={titleClass}>{title}</h1>\n {inlineHelp && (\n <InfoHint title={typeof title === 'string' ? title : 'Sobre esta tela'}>\n {help}\n </InfoHint>\n )}\n </div>\n {description && (\n <p className=\"text-sm text-muted-foreground md:text-base\">{description}</p>\n )}\n </div>\n )}\n {actions && (\n <div className=\"flex w-full shrink-0 gap-3 md:ml-auto md:w-auto [&>*]:flex-1 md:[&>*]:flex-none\">\n {actions}\n </div>\n )}\n </div>\n {children}\n </header>\n )\n}\n","import { Command } from 'cmdk'\nimport { Moon, Search, Sun, X } from 'lucide-react'\nimport { Dialog, VisuallyHidden } from 'radix-ui'\nimport { useBrand } from '@/brand/use-brand'\nimport { useRendraNavigate } from '@/components/rendra-provider'\nimport { cn } from '@/lib/cn'\nimport { useShell } from './shell-context'\n\n/*\n * Busca global (Ctrl+K / Cmd+K). Desktop: painel centralizado.\n * Mobile: tela cheia, com o campo no topo e a lista ocupando o resto.\n */\n\nconst itemClass =\n 'flex min-h-touch cursor-pointer items-center gap-3 rounded-item px-3 text-sm outline-none select-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground md:min-h-0 md:h-control-md [&_svg]:size-icon-sm [&_svg]:shrink-0 [&_svg]:text-muted-foreground'\n\nconst groupClass =\n '[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-2 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground'\n\nexport function CommandSearch() {\n const { searchOpen, setSearchOpen, navigationTargets, quickActions } = useShell()\n const { resolvedMode, setMode } = useBrand()\n const { navigate } = useRendraNavigate()\n\n const run = (fn: () => void) => {\n setSearchOpen(false)\n fn()\n }\n\n const groups = navigationTargets.reduce<Record<string, typeof navigationTargets>>((acc, t) => {\n ;(acc[t.group] ??= []).push(t)\n return acc\n }, {})\n\n return (\n <Dialog.Root open={searchOpen} onOpenChange={setSearchOpen}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-40 bg-overlay data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\" />\n <Dialog.Content\n aria-describedby={undefined}\n className={cn(\n 'fixed inset-0 z-50 flex flex-col bg-popover text-popover-foreground outline-none',\n 'md:inset-auto md:top-24 md:left-1/2 md:w-full md:max-w-xl md:-translate-x-1/2 md:rounded-surface md:border md:shadow-lg',\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0 md:data-[state=open]:zoom-in-95',\n )}\n >\n <VisuallyHidden.Root>\n <Dialog.Title>Busca global</Dialog.Title>\n </VisuallyHidden.Root>\n <Command label=\"Busca global\" className=\"flex min-h-0 flex-1 flex-col\" loop>\n <div className=\"flex shrink-0 items-center gap-2 border-b px-4 pt-safe md:pt-0\">\n <Search className=\"size-icon-md shrink-0 text-muted-foreground\" aria-hidden />\n <Command.Input\n autoFocus\n placeholder=\"Buscar telas e ações...\"\n className=\"h-control-lg min-w-0 flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n />\n <Dialog.Close\n aria-label=\"Fechar busca\"\n className=\"-mr-2 flex size-touch shrink-0 items-center justify-center rounded-item text-muted-foreground hover:bg-accent md:hidden\"\n >\n <X className=\"size-icon-md\" aria-hidden />\n </Dialog.Close>\n <kbd className=\"hidden rounded-item border bg-muted px-2 text-xs text-muted-foreground md:inline\">\n Esc\n </kbd>\n </div>\n <Command.List className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2 md:max-h-command md:flex-none\">\n <Command.Empty className=\"px-3 py-8 text-center text-sm text-muted-foreground\">\n Nada encontrado para essa busca.\n </Command.Empty>\n <Command.Group heading=\"Ações\" className={groupClass}>\n {quickActions.map((action) => {\n const Icon = action.icon\n return (\n <Command.Item\n key={action.label}\n className={itemClass}\n onSelect={() =>\n run(() => (action.to ? navigate(action.to) : action.onSelect?.()))\n }\n >\n {Icon && <Icon aria-hidden />}\n {action.label}\n </Command.Item>\n )\n })}\n <Command.Item\n className={itemClass}\n onSelect={() => run(() => setMode(resolvedMode === 'dark' ? 'light' : 'dark'))}\n >\n {resolvedMode === 'dark' ? <Sun aria-hidden /> : <Moon aria-hidden />}\n {resolvedMode === 'dark' ? 'Usar modo claro' : 'Usar modo escuro'}\n </Command.Item>\n </Command.Group>\n {Object.entries(groups).map(([group, targets]) => (\n <Command.Group key={group} heading={group} className={groupClass}>\n {targets.map((t) => {\n const Icon = t.icon\n return (\n <Command.Item\n key={t.to}\n value={`${t.title} ${group}`}\n className={itemClass}\n onSelect={() => run(() => navigate(t.to))}\n >\n <Icon aria-hidden />\n {t.title}\n </Command.Item>\n )\n })}\n </Command.Group>\n ))}\n </Command.List>\n </Command>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","/**\n * Formato visual do template. Cada template tem o seu, fixo, definido em brand.config.ts:\n * Safira: square (pedra lapidada) Equilíbrio: rounded (meio-termo) Aurora: pill (100% arredondado)\n * Os componentes não recebem formato por prop: usam rounded-control, rounded-surface,\n * rounded-item e rounded-avatar, que obedecem ao formato do template ativo.\n */\nexport type Shape = 'square' | 'rounded' | 'pill'\n\nexport const shapeLabels: Record<Shape, string> = {\n square: 'Quadrado',\n rounded: 'Meio-termo',\n pill: '100% arredondado',\n}\n","/*\n * LAYOUT DO APPSHELL\n * Tipo do layout e padrão interno do componente. O projeto escolhe os valores no\n * briefing e passa como prop `layout` (Partial<ShellLayout>) ao <AppShell>; sem a prop\n * (ou faltando alguma chave), vale o padrão abaixo. src/config/layout.ts reexporta este\n * módulo para o boilerplate e para as predefinições de src/config/presets.ts.\n * No mobile (< 768px) a navegação é sempre gaveta + barra inferior, qualquer que seja o layout.\n */\n\nexport interface ShellLayout {\n /** Menu lateral (sidebar) ou superior (topbar, no header). */\n navigation: 'sidebar' | 'topbar'\n /** Sidebar recolhida (só ícones) ou expandida (ícones e rótulos). */\n sidebar: 'collapsed' | 'expanded'\n /** Com a sidebar recolhida, abre por cima do conteúdo ao passar o mouse ou focar pelo teclado. */\n expandOnHover: boolean\n /**\n * Como abrir itens com submenu:\n * panel abre uma segunda barra lateral com os subitens\n * inline expande os subitens dentro da própria sidebar\n */\n submenu: 'panel' | 'inline'\n /**\n * Submenu do menu superior:\n * dropdown lista suspensa navegável por item\n * mega mega menu com seções (grupos do navigation.ts) e menus com descrição\n */\n topbarSubmenu: 'dropdown' | 'mega'\n /** Barra de navegação inferior no mobile (até 4 itens marcados em navigation.ts). */\n bottomNav: boolean\n}\n\nexport const defaultShellLayout: ShellLayout = {\n navigation: 'sidebar',\n sidebar: 'collapsed',\n expandOnHover: true,\n submenu: 'panel',\n topbarSubmenu: 'dropdown',\n bottomNav: true,\n}\n\nexport const layoutOptions = {\n navigation: [\n { value: 'sidebar', label: 'Menu lateral' },\n { value: 'topbar', label: 'Menu superior' },\n ],\n sidebar: [\n { value: 'collapsed', label: 'Recolhida (só ícones)' },\n { value: 'expanded', label: 'Expandida' },\n ],\n submenu: [\n { value: 'panel', label: 'Submenu em segunda barra' },\n { value: 'inline', label: 'Submenu dentro da sidebar' },\n ],\n topbarSubmenu: [\n { value: 'dropdown', label: 'Submenu navegável' },\n { value: 'mega', label: 'Mega menu' },\n ],\n} as const\n","import { ChevronDown } from 'lucide-react'\nimport { NavigationMenu as N } from 'radix-ui'\nimport { useCurrentPath, useRendraLink } from '@/components/rendra-provider'\nimport { cn } from '@/lib/cn'\nimport { useShell } from './shell-context'\nimport type { NavItem } from './types'\n\n/*\n * Mega menu do layout topbar (a partir de 1024px). Cada seção é um grupo do `navigation`\n * (prop do AppShell); o painel abre abaixo do header, na largura do conteúdo, com os menus\n * e seus subitens. Abre por clique, toque ou teclado (Radix NavigationMenu); o hover só\n * antecipa.\n */\n\nconst trigger =\n 'group inline-flex h-control-md items-center gap-1 rounded-item px-3 text-sm font-medium whitespace-nowrap transition-colors outline-none focus-visible:focus-ring data-[state=open]:bg-accent data-[state=open]:text-foreground'\n\nfunction isActive(pathname: string, to: string) {\n return to === '/' ? pathname === '/' : pathname === to || pathname.startsWith(`${to}/`)\n}\n\nfunction MegaItem({ item }: { item: NavItem }) {\n const pathname = useCurrentPath()\n const Link = useRendraLink()\n const Icon = item.icon\n const active = item.to ? isActive(pathname, item.to) : false\n const head = (\n <>\n <span\n className={cn(\n 'flex size-control-md shrink-0 items-center justify-center rounded-control transition-colors',\n active\n ? 'bg-primary text-primary-foreground'\n : 'bg-primary-soft text-primary-soft-foreground group-hover/item:bg-primary group-hover/item:text-primary-foreground',\n )}\n >\n <Icon className=\"size-icon-md\" aria-hidden />\n </span>\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"text-sm font-semibold\">{item.title}</span>\n {item.description && (\n <span className=\"text-sm text-muted-foreground\">{item.description}</span>\n )}\n </span>\n </>\n )\n return (\n <li className=\"flex flex-col gap-2\">\n {item.to ? (\n <N.Link asChild active={active}>\n <Link\n to={item.to}\n className=\"group/item flex items-start gap-3 rounded-item p-3 transition-colors hover:bg-accent\"\n >\n {head}\n </Link>\n </N.Link>\n ) : (\n <div className=\"group/item flex items-start gap-3 p-3\">{head}</div>\n )}\n {item.children && (\n <ul className=\"flex flex-col gap-1 pl-16\">\n {item.children.map((c) => (\n <li key={c.to}>\n <N.Link asChild active={isActive(pathname, c.to)}>\n <Link\n to={c.to}\n className=\"flex flex-col gap-1 rounded-item px-3 py-2 transition-colors hover:bg-accent data-[active]:bg-primary-soft data-[active]:text-primary-soft-foreground\"\n >\n <span className=\"text-sm font-medium\">{c.title}</span>\n {c.description && (\n <span className=\"text-xs text-muted-foreground\">{c.description}</span>\n )}\n </Link>\n </N.Link>\n </li>\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nexport function MegaMenu() {\n const pathname = useCurrentPath()\n const { navigation } = useShell()\n return (\n <N.Root className=\"hidden lg:block\" delayDuration={150}>\n <N.List className=\"flex items-center gap-1\">\n {navigation.map((group) => {\n const groupActive = group.items.some(\n (i) =>\n (i.to && isActive(pathname, i.to)) ||\n i.children?.some((c) => isActive(pathname, c.to)),\n )\n return (\n <N.Item key={group.title} value={group.title}>\n <N.Trigger\n className={cn(\n trigger,\n groupActive\n ? 'bg-primary-soft text-primary-soft-foreground'\n : 'text-muted-foreground hover:bg-accent hover:text-foreground',\n )}\n >\n {group.title}\n <ChevronDown\n aria-hidden\n className=\"size-icon-sm transition-transform duration-200 group-data-[state=open]:rotate-180\"\n />\n </N.Trigger>\n <N.Content className=\"w-full data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in-0 data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out-0\">\n <div className=\"grid w-full gap-6 p-6 lg:grid-cols-4\">\n <div className=\"flex flex-col gap-2 border-r pr-6\">\n <span className=\"text-xs font-medium tracking-wide text-muted-foreground uppercase\">\n Seção\n </span>\n <span className=\"text-xl font-semibold\">{group.title}</span>\n {group.description && (\n <p className=\"text-sm text-muted-foreground\">{group.description}</p>\n )}\n <div className=\"mt-2 h-1 w-12 rounded-full bg-gradient-accent\" />\n </div>\n <ul className=\"grid gap-2 lg:col-span-3 lg:grid-cols-3\">\n {group.items.map((item) => (\n <MegaItem key={item.title} item={item} />\n ))}\n </ul>\n </div>\n </N.Content>\n </N.Item>\n )\n })}\n </N.List>\n {/* Painel na largura do header, logo abaixo dele */}\n <div className=\"absolute inset-x-0 top-full z-40\">\n <N.Viewport className=\"w-full overflow-hidden border-b bg-popover text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\" />\n </div>\n </N.Root>\n )\n}\n","import { Bell } from 'lucide-react'\nimport { useState } from 'react'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { Button } from '@/components/ui/button'\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'\nimport { cn } from '@/lib/cn'\nimport { useShell } from './shell-context'\n\n/**\n * Sino de notificações. Renderizado só quando o AppShell recebe a prop `notifications`;\n * os itens e os dois retornos de chamada (marcar todas como lidas, marcar uma como lida)\n * vêm dessa prop, nunca de um mock interno.\n */\nexport function Notifications() {\n const { notifications } = useShell()\n const [items, setItems] = useState(() => notifications?.items ?? [])\n const unread = items.filter((n) => !n.read).length\n\n if (!notifications) return null\n\n const markAllRead = () => {\n setItems((all) => all.map((n) => ({ ...n, read: true })))\n notifications.onMarkAllRead?.()\n }\n const markRead = (id: string) => {\n setItems((all) => all.map((n) => (n.id === id ? { ...n, read: true } : n)))\n notifications.onItemClick?.(id)\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label={unread ? `Notificações, ${unread} não lidas` : 'Notificações'}\n className=\"relative\"\n >\n <Bell aria-hidden />\n {unread > 0 && (\n <span\n aria-hidden\n className=\"absolute top-1 right-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-xs leading-none font-medium text-destructive-foreground tabular-nums\"\n >\n {unread}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"flex flex-col\">\n <div className=\"flex items-center justify-between gap-2 border-b py-2 pr-2 pl-4\">\n <span className=\"text-sm font-semibold\">Notificações</span>\n <Button variant=\"ghost\" size=\"sm\" disabled={!unread} onClick={markAllRead}>\n Marcar como lidas\n </Button>\n </div>\n <ul className=\"flex flex-col p-2\">\n {items.map((n) => (\n <li key={n.id}>\n <button\n type=\"button\"\n onClick={() => markRead(n.id)}\n className=\"flex w-full items-start gap-3 rounded-item p-2 text-left transition-colors hover:bg-accent\"\n >\n <BrandFeedbackIcon type={n.type} size=\"md\" className=\"mt-px\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className={cn('text-sm', !n.read && 'font-medium')}>{n.title}</span>\n <span className=\"text-xs text-muted-foreground\">{n.time}</span>\n </span>\n {!n.read && (\n <span className=\"mt-2 size-2 shrink-0 rounded-full bg-primary\">\n <span className=\"sr-only\">Não lida</span>\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n </PopoverContent>\n </Popover>\n )\n}\n","import {\n ArrowLeft,\n ChevronDown,\n LayoutTemplate,\n LogOut,\n Menu,\n Monitor,\n MoreHorizontal,\n Moon,\n PanelLeft,\n Palette,\n Search,\n Sun,\n} from 'lucide-react'\nimport { useLayoutEffect, useRef, useState } from 'react'\nimport { useBrand } from '@/brand/use-brand'\nimport type { ColorMode } from '@/brand/brand-context'\nimport { useCurrentPath, useRendraBreadcrumbs, useRendraLink } from '@/components/rendra-provider'\nimport { Avatar } from '@/components/ui/avatar'\nimport { BrandLogo } from '@/components/ui/brand-logo'\nimport { Breadcrumb, type BreadcrumbItem } from '@/components/ui/breadcrumb'\nimport { Button } from '@/components/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { InfoHint } from '@/components/ui/info-hint'\nimport { Tooltip } from '@/components/ui/tooltip'\nimport { cn } from '@/lib/cn'\nimport { initials } from '@/lib/initials'\nimport { shapeLabels } from '@/lib/shape'\nimport { layoutOptions, type ShellLayout } from './layout'\nimport { MegaMenu } from './mega-menu'\nimport { Notifications } from './notifications'\nimport { useShell } from './shell-context'\n\n/**\n * Voltar das telas de segundo nível (ex.: Novo cliente, Detalhe do cliente): leva à tela-pai\n * da trilha, não ao histórico, para ser previsível mesmo quando a pessoa chegou por um link.\n */\nfunction BackButton({ crumbs }: { crumbs: BreadcrumbItem[] }) {\n const Link = useRendraLink()\n const parent = crumbs.length >= 2 ? crumbs[crumbs.length - 2] : undefined\n if (!parent?.to) return null\n return (\n <Tooltip content={`Voltar para ${parent.label}`} side=\"bottom\">\n <Button variant=\"ghost\" iconOnly asChild className=\"shrink-0\">\n <Link to={parent.to} aria-label={`Voltar para ${parent.label}`}>\n <ArrowLeft aria-hidden />\n </Link>\n </Button>\n </Tooltip>\n )\n}\n\nconst modes: { value: ColorMode; label: string; icon: typeof Sun }[] = [\n { value: 'light', label: 'Claro', icon: Sun },\n { value: 'dark', label: 'Escuro', icon: Moon },\n { value: 'system', label: 'Sistema', icon: Monitor },\n]\n\nfunction ModeItems() {\n const { mode, setMode } = useBrand()\n return (\n <DropdownMenuRadioGroup value={mode} onValueChange={(v) => setMode(v as ColorMode)}>\n {modes.map((m) => (\n <DropdownMenuRadioItem key={m.value} value={m.value}>\n <m.icon aria-hidden />\n {m.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n )\n}\n\nfunction LayoutItems() {\n const { layout, setLayout, resetLayout } = useShell()\n const radio = <K extends 'navigation' | 'sidebar' | 'submenu' | 'topbarSubmenu'>(\n key: K,\n title: string,\n ) => (\n <>\n <DropdownMenuLabel>{title}</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={layout[key]}\n onValueChange={(v) => setLayout(key, v as ShellLayout[K])}\n >\n {layoutOptions[key].map((o) => (\n <DropdownMenuRadioItem key={o.value} value={o.value}>\n {o.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </>\n )\n const sidebar = layout.navigation === 'sidebar'\n return (\n <>\n {radio('navigation', 'Posição do menu')}\n {!sidebar && (\n <>\n <DropdownMenuSeparator />\n {radio('topbarSubmenu', 'Submenu')}\n </>\n )}\n {sidebar && (\n <>\n <DropdownMenuSeparator />\n {radio('sidebar', 'Sidebar')}\n <DropdownMenuCheckboxItem\n checked={layout.expandOnHover}\n disabled={layout.sidebar !== 'collapsed'}\n onCheckedChange={(v) => setLayout('expandOnHover', v === true)}\n onSelect={(e) => e.preventDefault()}\n >\n Abrir ao passar o mouse\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n {radio('submenu', 'Submenu')}\n </>\n )}\n <DropdownMenuSeparator />\n <DropdownMenuCheckboxItem\n checked={layout.bottomNav}\n onCheckedChange={(v) => setLayout('bottomNav', v === true)}\n onSelect={(e) => e.preventDefault()}\n >\n Barra inferior no celular\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onSelect={resetLayout}>Voltar ao padrão do projeto</DropdownMenuItem>\n </>\n )\n}\n\nfunction UserMenu() {\n const Link = useRendraLink()\n const { user, userMenuItems, onLogout, userMenu, workspaces } = useShell()\n const { brand, brands, setBrandId, palette, palettes, setPaletteId } = useBrand()\n const showTheme = userMenu?.theme !== false\n const showTemplate = userMenu?.template !== false\n const showLayout = userMenu?.layout !== false\n // O separador antes do grupo só existe se ao menos um dos submenus existir.\n const showPreferences = showTheme || showTemplate || showLayout\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label={`${initials(user.name)}, menu de ${user.name}`}\n >\n <Avatar name={user.name} src={user.avatarUrl} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel className=\"flex flex-col gap-1\">\n <span className=\"text-sm font-medium text-foreground\">{user.name}</span>\n {user.email && <span className=\"font-normal\">{user.email}</span>}\n </DropdownMenuLabel>\n {workspaces && workspaces.items.length > 0 && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>{workspaces.label ?? 'Espaço'}</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={workspaces.activeId} onValueChange={workspaces.onSelect}>\n {workspaces.items.map((w) => (\n <DropdownMenuRadioItem key={w.id} value={w.id}>\n {w.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </>\n )}\n {userMenuItems.length > 0 && (\n <>\n <DropdownMenuSeparator />\n {userMenuItems.map((item) => {\n const Icon = item.icon\n return item.to ? (\n <DropdownMenuItem key={item.label} asChild>\n <Link to={item.to}>\n {Icon && <Icon aria-hidden />}\n {item.label}\n </Link>\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem key={item.label} onSelect={item.onSelect}>\n {Icon && <Icon aria-hidden />}\n {item.label}\n </DropdownMenuItem>\n )\n })}\n </>\n )}\n {showPreferences && <DropdownMenuSeparator />}\n {showTheme && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Sun aria-hidden />\n Tema\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <ModeItems />\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n {showTemplate && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Palette aria-hidden />\n Template\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuLabel>Modelo</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={brand.id} onValueChange={setBrandId}>\n {brands.map((b) => (\n <DropdownMenuRadioItem key={b.id} value={b.id}>\n <span className=\"flex flex-col\">\n <span>{b.productName}</span>\n <span className=\"text-xs text-muted-foreground\">{shapeLabels[b.shape]}</span>\n </span>\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Paleta de cores</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={palette.id}\n onValueChange={(v) => setPaletteId(v === brand.id ? null : v)}\n >\n {palettes.map((b) => (\n <DropdownMenuRadioItem key={b.id} value={b.id}>\n {b.name}\n {b.id === brand.id && (\n <span className=\"ml-auto pl-4 text-xs text-muted-foreground\">do modelo</span>\n )}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n {showLayout && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <LayoutTemplate aria-hidden />\n Layout\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <LayoutItems />\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n <DropdownMenuSeparator />\n <DropdownMenuItem destructive onSelect={() => onLogout?.()}>\n <LogOut aria-hidden />\n Sair\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/**\n * Menu superior. Os itens que não cabem na largura vão para o botão \"Mais\", no fim da\n * barra: o menu nunca passa por cima da busca e dos ícones, com qualquer número de itens.\n */\nfunction TopNav() {\n const pathname = useCurrentPath()\n const Link = useRendraLink()\n const { navigation } = useShell()\n const items = navigation.flatMap((g) => g.items)\n const navRef = useRef<HTMLElement>(null)\n const widths = useRef<number[]>([])\n const [count, setCount] = useState(items.length)\n\n useLayoutEffect(() => {\n const nav = navRef.current\n if (!nav) return\n const measure = () => {\n const lis = [...nav.querySelectorAll<HTMLLIElement>('li[data-item]')]\n // Mede só quando todos estão visíveis (primeira pintura e depois da fonte carregar).\n if (lis.length === items.length && lis.every((li) => li.offsetWidth > 0))\n widths.current = lis.map((li) => li.offsetWidth + 4)\n const avail = nav.clientWidth\n const total = widths.current.reduce((a, b) => a + b, 0)\n if (total <= avail) return setCount(items.length)\n const more = 104 // largura reservada para o botão Mais\n let used = 0\n let n = 0\n for (const w of widths.current) {\n if (used + w > avail - more) break\n used += w\n n++\n }\n setCount(n)\n }\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(nav)\n void document.fonts?.ready.then(() => {\n setCount(items.length)\n requestAnimationFrame(measure)\n })\n return () => ro.disconnect()\n }, [items.length])\n\n const link =\n 'inline-flex h-control-md items-center gap-2 rounded-item px-3 text-sm font-medium whitespace-nowrap transition-colors [&_svg]:size-icon-sm'\n const idle = 'text-muted-foreground hover:bg-accent hover:text-foreground'\n const active = 'bg-primary-soft text-primary-soft-foreground'\n const isActive = (item: (typeof items)[number]) =>\n item.children\n ? item.children.some((c) => pathname.startsWith(c.to))\n : item.to === '/'\n ? pathname === '/'\n : pathname.startsWith(item.to ?? '/')\n const overflow = items.slice(count)\n\n return (\n <nav ref={navRef} aria-label=\"Navegação principal\" className=\"hidden w-full min-w-0 lg:block\">\n <ul className=\"flex items-center justify-center gap-1\">\n {items.map((item, i) => {\n const Icon = item.icon\n const hidden = i >= count\n if (item.children) {\n return (\n <li key={item.title} data-item className={cn(hidden && 'hidden')}>\n <DropdownMenu>\n <DropdownMenuTrigger className={cn(link, isActive(item) ? active : idle)}>\n <Icon aria-hidden />\n {item.title}\n <ChevronDown aria-hidden />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {item.children.map((c) => (\n <DropdownMenuItem key={c.to} asChild>\n <Link to={c.to}>{c.title}</Link>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </li>\n )\n }\n const to = item.to ?? '/'\n return (\n <li key={item.title} data-item className={cn(hidden && 'hidden')}>\n <Link to={to} className={cn(link, isActive(item) ? active : idle)}>\n <Icon aria-hidden />\n {item.title}\n </Link>\n </li>\n )\n })}\n {overflow.length > 0 && (\n <li>\n <DropdownMenu>\n <DropdownMenuTrigger\n className={cn(link, overflow.some(isActive) ? active : idle)}\n aria-label={`Mais ${overflow.length} itens do menu`}\n >\n <MoreHorizontal aria-hidden />\n Mais\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {overflow.flatMap((item) => {\n const Icon = item.icon\n return item.children\n ? item.children.map((c) => (\n <DropdownMenuItem key={c.to} asChild>\n <Link to={c.to}>\n <Icon aria-hidden />\n {c.title}\n </Link>\n </DropdownMenuItem>\n ))\n : [\n <DropdownMenuItem key={item.title} asChild>\n <Link to={item.to ?? '/'}>\n <Icon aria-hidden />\n {item.title}\n </Link>\n </DropdownMenuItem>,\n ]\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </li>\n )}\n </ul>\n </nav>\n )\n}\n\nexport function Header() {\n const {\n layout,\n setLayout,\n setMobileNavOpen,\n setSearchOpen,\n pageHelp,\n homeLabel,\n notifications,\n headerLogo,\n } = useShell()\n const { brand, resolvedMode } = useBrand()\n const Link = useRendraLink()\n const crumbs = useRendraBreadcrumbs()\n // Trilha do header: sempre começa no destino inicial (homeLabel).\n const trail =\n crumbs[0]?.to === '/' || crumbs.length === 0\n ? crumbs\n : [{ label: homeLabel, to: '/' }, ...crumbs]\n const ModeIcon = resolvedMode === 'dark' ? Moon : Sun\n const topbar = layout.navigation === 'topbar'\n const hasParent = Boolean(crumbs.length >= 2 && crumbs[crumbs.length - 2]?.to)\n // No celular, o menu fica no botão central da barra inferior (ou dá lugar à seta de voltar).\n const menuInFooter = layout.bottomNav || hasParent\n // Título e trilha em uma linha cada; se não couber, reticências (nunca quebra linha).\n const pageTitle = (\n <>\n {headerLogo && (\n <span aria-hidden className=\"flex min-w-0 flex-1 items-center md:hidden\">\n {headerLogo}\n </span>\n )}\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-col justify-center',\n headerLogo && 'max-md:flex-none',\n )}\n >\n <span className=\"flex min-w-0 items-center gap-1\">\n <p\n className={cn(\n 'truncate text-sm leading-tight font-semibold md:text-base',\n headerLogo && 'max-md:sr-only',\n )}\n >\n {crumbs[crumbs.length - 1]?.label ?? brand.productName}\n </p>\n {pageHelp && (\n <InfoHint\n title={crumbs[crumbs.length - 1]?.label ?? brand.productName}\n className=\"-my-2\"\n >\n {pageHelp}\n </InfoHint>\n )}\n </span>\n <Breadcrumb items={trail} variant=\"trail\" className={cn(headerLogo && 'max-md:hidden')} />\n </div>\n </>\n )\n const collapsed = layout.sidebar === 'collapsed'\n\n return (\n <header className=\"relative z-30 flex h-header shrink-0 items-center gap-1 border-b bg-card px-2 md:gap-2 md:px-4\">\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Abrir menu\"\n className={cn(topbar ? 'lg:hidden' : 'md:hidden', menuInFooter && 'max-md:hidden')}\n onClick={() => setMobileNavOpen(true)}\n >\n <Menu aria-hidden />\n </Button>\n\n {topbar ? (\n <>\n <Link\n to=\"/\"\n aria-label={`${brand.productName}, ir para o painel`}\n className=\"hidden shrink-0 lg:block\"\n >\n <BrandLogo on=\"surface\" />\n </Link>\n <span className=\"flex min-w-0 flex-1 items-center gap-1 lg:hidden\">\n <BackButton crumbs={crumbs} />\n {pageTitle}\n </span>\n <div className=\"hidden min-w-0 flex-1 lg:flex lg:justify-center\">\n {layout.topbarSubmenu === 'mega' ? <MegaMenu /> : <TopNav />}\n </div>\n </>\n ) : (\n <>\n <Tooltip content={collapsed ? 'Expandir menu' : 'Recolher menu'} side=\"bottom\">\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label={collapsed ? 'Expandir menu' : 'Recolher menu'}\n aria-pressed={!collapsed}\n className=\"hidden md:inline-flex\"\n onClick={() => setLayout('sidebar', collapsed ? 'expanded' : 'collapsed')}\n >\n <PanelLeft aria-hidden />\n </Button>\n </Tooltip>\n <span\n aria-hidden\n className={cn(\n 'mx-1 h-8 w-px shrink-0 bg-border md:mx-2',\n menuInFooter && 'max-md:hidden',\n )}\n />\n <BackButton crumbs={crumbs} />\n {pageTitle}\n </>\n )}\n\n <div className=\"flex shrink-0 items-center gap-1 md:gap-2\">\n {/* Busca: campo no desktop, ícone abaixo disso (abre em tela cheia no mobile) */}\n <button\n type=\"button\"\n onClick={() => setSearchOpen(true)}\n className={cn(\n 'hidden h-control-md items-center gap-2 rounded-control border border-input bg-background px-3 text-sm text-muted-foreground transition-colors hover:border-primary',\n topbar ? '2xl:flex 2xl:w-3xs' : 'lg:flex lg:w-3xs',\n )}\n >\n <Search className=\"size-icon-sm\" aria-hidden />\n <span className=\"flex-1 text-left\">Buscar...</span>\n <kbd className=\"rounded-item border bg-muted px-2 text-xs\">Ctrl K</kbd>\n </button>\n <Button\n variant=\"ghost\"\n iconOnly\n aria-label=\"Buscar\"\n className={topbar ? '2xl:hidden' : 'lg:hidden'}\n onClick={() => setSearchOpen(true)}\n >\n <Search aria-hidden />\n </Button>\n\n {notifications && <Notifications />}\n\n <DropdownMenu>\n <Tooltip content=\"Tema\" side=\"bottom\">\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" iconOnly aria-label=\"Tema\" className=\"hidden md:inline-flex\">\n <ModeIcon aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n </Tooltip>\n <DropdownMenuContent align=\"end\">\n <ModeItems />\n </DropdownMenuContent>\n </DropdownMenu>\n\n <UserMenu />\n </div>\n </header>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport type { NavGroup, NavItem } from './types'\n\n/*\n * Derivações de exibição do menu (src/config/navigation.ts, ou outro `navigation` passado\n * por prop): barra inferior, lista plana de destinos e destino ativo. Calculadas dentro do\n * AppShell (useMemo, a partir de `navigation`), nunca em @/config.\n */\n\n/** Destino plano da busca global e do cálculo do item ativo. */\nexport interface NavigationTarget {\n title: string\n to: string\n group: string\n icon: LucideIcon\n}\n\n/** Itens marcados `bottomNav`, na ordem do menu. Limite de 4. */\nexport function getBottomNavItems(navigation: NavGroup[]): NavItem[] {\n return navigation\n .flatMap((g) => g.items)\n .filter((i) => i.bottomNav)\n .slice(0, 4)\n}\n\n/** Lista plana de destinos (itens de primeiro nível com rota e filhos de itens com submenu). */\nexport function getNavigationTargets(navigation: NavGroup[]): NavigationTarget[] {\n return navigation.flatMap((g) =>\n g.items.flatMap((i) => [\n ...(i.to ? [{ title: i.title, to: i.to, group: g.title, icon: i.icon }] : []),\n ...(i.children ?? []).map((c) => ({\n title: c.title,\n to: c.to,\n group: i.title,\n icon: i.icon,\n })),\n ]),\n )\n}\n\n/**\n * Destino ativo: o mais específico que combina com o endereço.\n * Ex.: em /clientes/novo fica ativo \"Novo cliente\" (e o grupo Cadastros), não \"Clientes\".\n */\nexport function resolveActiveTo(targets: NavigationTarget[], pathname: string): string | null {\n const matches = targets\n .map((t) => t.to)\n .filter((to) =>\n to === '/' ? pathname === '/' : pathname === to || pathname.startsWith(`${to}/`),\n )\n return matches.sort((a, b) => b.length - a.length)[0] ?? null\n}\n","import { ChevronDown, ChevronRight, LogOut, X } from 'lucide-react'\nimport { Collapsible, Dialog, VisuallyHidden } from 'radix-ui'\nimport { useEffect, useRef, useState } from 'react'\nimport { useBrand } from '@/brand/use-brand'\nimport { useCurrentPath, useRendraLink } from '@/components/rendra-provider'\nimport { Avatar } from '@/components/ui/avatar'\nimport { BrandLogo } from '@/components/ui/brand-logo'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Tooltip } from '@/components/ui/tooltip'\nimport { cn } from '@/lib/cn'\nimport { resolveActiveTo } from './navigation-utils'\nimport { useShell } from './shell-context'\nimport type { NavItem } from './types'\n\n/*\n * Sidebar única, configurada pelo layout do AppShell (prop `layout`):\n * sidebar: collapsed | expanded expandOnHover: abre por cima do conteúdo\n * submenu: panel (segunda barra) | inline (dentro da sidebar)\n * Mobile (< 768px): a mesma navegação reconstruída como gaveta, com submenu inline.\n */\n\nconst itemBase =\n 'group relative flex min-h-touch w-full items-center gap-3 rounded-item px-3 text-sm transition-colors md:min-h-0 md:h-control-md'\nconst itemIdle = 'text-sidebar-foreground hover:bg-sidebar-accent'\nconst itemActive = 'bg-sidebar-active font-medium text-sidebar-active-foreground'\n\nfunction ActiveIndicator() {\n return (\n <span\n aria-hidden\n className=\"absolute inset-y-2 left-0 w-1 rounded-full bg-sidebar-indicator in-data-[shape=pill]:hidden\"\n />\n )\n}\n\nfunction Badge({ value, compact }: { value: number; compact: boolean }) {\n if (compact) {\n return (\n <span\n aria-hidden\n className=\"absolute top-2 right-2 size-2 rounded-full bg-sidebar-indicator\"\n />\n )\n }\n return (\n <span className=\"ml-auto rounded-full bg-sidebar-accent px-2 text-xs font-medium text-sidebar-foreground tabular-nums\">\n {value}\n </span>\n )\n}\n\nfunction useIsActive() {\n const pathname = useCurrentPath()\n const { navigationTargets } = useShell()\n const active = resolveActiveTo(navigationTargets, pathname)\n return (to: string) => to === active\n}\n\ninterface EntryProps {\n item: NavItem\n /** Só ícones (sem rótulos). */\n compact: boolean\n submenu: 'panel' | 'inline'\n /** Sem expansão por hover, o modo compacto usa tooltip e menu suspenso. */\n hoverExpands: boolean\n panelOpenFor: string | null\n onTogglePanel: (item: NavItem) => void\n onNavigate?: () => void\n}\n\nfunction NavEntry({\n item,\n compact,\n submenu,\n hoverExpands,\n panelOpenFor,\n onTogglePanel,\n onNavigate,\n}: EntryProps) {\n const isActive = useIsActive()\n const Link = useRendraLink()\n const Icon = item.icon\n const childActive = item.children?.some((c) => isActive(c.to)) ?? false\n const [open, setOpen] = useState(childActive)\n const label = item.badge ? `${item.title}, ${item.badge} pendentes` : item.title\n\n if (item.children) {\n // Submenu em segunda barra lateral\n if (submenu === 'panel') {\n const panelOpen = panelOpenFor === item.title\n return (\n <Tooltip content={item.title} side=\"right\" disabled={!compact || hoverExpands}>\n <button\n type=\"button\"\n aria-expanded={panelOpen}\n aria-controls=\"submenu-painel\"\n aria-label={compact ? item.title : undefined}\n onClick={() => onTogglePanel(item)}\n className={cn(\n itemBase,\n compact && 'justify-center px-0',\n childActive || panelOpen ? itemActive : itemIdle,\n )}\n >\n {childActive && <ActiveIndicator />}\n <Icon className=\"size-icon-md shrink-0\" aria-hidden />\n {!compact && (\n <>\n <span className=\"truncate\">{item.title}</span>\n <ChevronRight\n aria-hidden\n className={cn(\n 'ml-auto size-icon-sm shrink-0 text-sidebar-muted-foreground transition-transform duration-200',\n panelOpen && 'rotate-180',\n )}\n />\n </>\n )}\n </button>\n </Tooltip>\n )\n }\n\n // Inline, mas compacto e sem expansão por hover: menu suspenso ao lado\n if (compact) {\n return (\n <DropdownMenu>\n <Tooltip content={item.title} side=\"right\">\n <DropdownMenuTrigger\n aria-label={item.title}\n className={cn(itemBase, 'justify-center px-0', childActive ? itemActive : itemIdle)}\n >\n {childActive && <ActiveIndicator />}\n <Icon className=\"size-icon-md shrink-0\" aria-hidden />\n </DropdownMenuTrigger>\n </Tooltip>\n <DropdownMenuContent side=\"right\" align=\"start\">\n <DropdownMenuLabel>{item.title}</DropdownMenuLabel>\n {item.children.map((c) => (\n <DropdownMenuItem key={c.to} asChild>\n <Link to={c.to}>{c.title}</Link>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n }\n\n // Inline expandido dentro da sidebar\n return (\n <Collapsible.Root open={open} onOpenChange={setOpen}>\n <Collapsible.Trigger className={cn(itemBase, childActive && 'font-medium', itemIdle)}>\n <Icon className=\"size-icon-md shrink-0\" aria-hidden />\n <span className=\"truncate\">{item.title}</span>\n <ChevronDown\n aria-hidden\n className=\"ml-auto size-icon-sm shrink-0 text-sidebar-muted-foreground transition-transform duration-200 group-data-[state=open]:rotate-180\"\n />\n </Collapsible.Trigger>\n <Collapsible.Content className=\"overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down\">\n <ul className=\"flex flex-col gap-1 pt-1 pl-8\">\n {item.children.map((c) => (\n <li key={c.to}>\n <Link\n to={c.to}\n onClick={onNavigate}\n className={cn(\n itemBase,\n 'md:h-control-sm',\n isActive(c.to) ? itemActive : itemIdle,\n )}\n >\n <span className=\"truncate\">{c.title}</span>\n </Link>\n </li>\n ))}\n </ul>\n </Collapsible.Content>\n </Collapsible.Root>\n )\n }\n\n const to = item.to ?? '/'\n const active = isActive(to)\n return (\n <Tooltip content={item.title} side=\"right\" disabled={!compact || hoverExpands}>\n <Link\n to={to}\n onClick={onNavigate}\n aria-label={compact ? label : undefined}\n className={cn(itemBase, compact && 'justify-center px-0', active ? itemActive : itemIdle)}\n >\n {active && <ActiveIndicator />}\n <Icon className=\"size-icon-md shrink-0\" aria-hidden />\n {!compact && <span className=\"truncate\">{item.title}</span>}\n {item.badge ? <Badge value={item.badge} compact={compact} /> : null}\n </Link>\n </Tooltip>\n )\n}\n\ninterface BodyProps {\n compact: boolean\n submenu: 'panel' | 'inline'\n hoverExpands: boolean\n panelOpenFor?: string | null\n onTogglePanel?: (item: NavItem) => void\n onNavigate?: () => void\n onClose?: () => void\n}\n\nfunction SidebarBody({\n compact,\n submenu,\n hoverExpands,\n panelOpenFor = null,\n onTogglePanel = () => {},\n onNavigate,\n onClose,\n}: BodyProps) {\n const { brand } = useBrand()\n const Link = useRendraLink()\n const { navigation, user, onLogout } = useShell()\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n <div\n className={cn(\n 'flex h-header shrink-0 items-center border-b border-sidebar-border',\n compact ? 'justify-center' : 'justify-between gap-2 px-4',\n )}\n >\n <Link\n to=\"/\"\n onClick={onNavigate}\n aria-label={`${brand.productName}, ir para o painel`}\n className=\"flex min-w-0 items-center\"\n >\n <BrandLogo on=\"sidebar\" symbolOnly={compact} />\n </Link>\n {onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar menu\"\n className=\"-mr-2 flex size-touch items-center justify-center rounded-item text-sidebar-foreground hover:bg-sidebar-accent\"\n >\n <X className=\"size-icon-md\" aria-hidden />\n </button>\n )}\n </div>\n\n {/* A lista só rola sozinha se o menu for maior que a tela. */}\n <nav\n aria-label=\"Navegação principal\"\n className=\"flex min-h-0 flex-1 flex-col gap-6 overflow-x-hidden overflow-y-auto px-3 py-4\"\n >\n {navigation.map((group) => (\n <div key={group.title} className=\"flex flex-col gap-1\">\n {compact ? (\n <span aria-hidden className=\"mx-3 mb-1 h-px bg-sidebar-border\" />\n ) : (\n <span className=\"truncate px-3 pb-1 text-xs font-medium tracking-wide text-sidebar-muted-foreground uppercase\">\n {group.title}\n </span>\n )}\n <ul className=\"flex flex-col gap-1\">\n {group.items.map((item) => (\n <li key={item.title}>\n <NavEntry\n item={item}\n compact={compact}\n submenu={submenu}\n hoverExpands={hoverExpands}\n panelOpenFor={panelOpenFor}\n onTogglePanel={onTogglePanel}\n onNavigate={onNavigate}\n />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n\n <div\n className={cn(\n 'flex shrink-0 items-center gap-3 border-t border-sidebar-border p-3',\n compact && 'flex-col',\n )}\n >\n <Avatar name={user.name} src={user.avatarUrl} />\n {!compact && (\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium\">{user.name}</span>\n {user.email && (\n <span className=\"truncate text-xs text-sidebar-muted-foreground\">{user.email}</span>\n )}\n </div>\n )}\n <Tooltip content=\"Sair\" side=\"right\">\n <button\n type=\"button\"\n aria-label=\"Sair\"\n onClick={() => onLogout?.()}\n className=\"flex size-touch shrink-0 items-center justify-center rounded-item text-sidebar-muted-foreground transition-colors hover:bg-sidebar-accent hover:text-sidebar-foreground md:size-control-md\"\n >\n <LogOut className=\"size-icon-sm\" aria-hidden />\n </button>\n </Tooltip>\n </div>\n </div>\n )\n}\n\n/** Segunda barra lateral com os subitens do item escolhido. */\nfunction SubmenuPanel({ item, onClose }: { item: NavItem; onClose: () => void }) {\n const isActive = useIsActive()\n const Link = useRendraLink()\n return (\n <div\n id=\"submenu-painel\"\n role=\"region\"\n aria-label={`Submenu ${item.title}`}\n className=\"flex h-full w-3xs shrink-0 animate-in flex-col border-r bg-card text-card-foreground shadow-lg fade-in-0\"\n >\n <div className=\"flex h-header shrink-0 items-center justify-between gap-2 border-b pr-2 pl-4\">\n <span className=\"truncate text-sm font-semibold\">{item.title}</span>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar submenu\"\n className=\"flex size-control-md items-center justify-center rounded-item text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n <X className=\"size-icon-sm\" aria-hidden />\n </button>\n </div>\n <ul className=\"flex flex-col gap-1 p-3\">\n {item.children?.map((c) => (\n <li key={c.to}>\n <Link\n to={c.to}\n className={cn(\n 'flex h-control-md items-center rounded-item px-3 text-sm transition-colors',\n isActive(c.to)\n ? 'bg-primary-soft font-medium text-primary-soft-foreground'\n : 'hover:bg-accent hover:text-accent-foreground',\n )}\n >\n <span className=\"truncate\">{c.title}</span>\n </Link>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport function Sidebar() {\n const { layout, mobileNavOpen, setMobileNavOpen } = useShell()\n const pathname = useCurrentPath()\n const close = () => setMobileNavOpen(false)\n\n const collapsed = layout.sidebar === 'collapsed'\n const hoverExpands = collapsed && layout.expandOnHover\n const [peek, setPeek] = useState(false)\n const [panel, setPanel] = useState<NavItem | null>(null)\n const timer = useRef<number | undefined>(undefined)\n const rootRef = useRef<HTMLDivElement>(null)\n const compact = collapsed && !peek\n\n // Fecha a segunda barra ao navegar, com Esc e ao clicar fora.\n useEffect(() => setPanel(null), [pathname])\n useEffect(() => {\n if (!panel) return\n const onKey = (e: KeyboardEvent) => e.key === 'Escape' && setPanel(null)\n const onDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) setPanel(null)\n }\n window.addEventListener('keydown', onKey)\n window.addEventListener('pointerdown', onDown)\n return () => {\n window.removeEventListener('keydown', onKey)\n window.removeEventListener('pointerdown', onDown)\n }\n }, [panel])\n useEffect(() => () => window.clearTimeout(timer.current), [])\n\n const openPeek = () => {\n if (!hoverExpands) return\n window.clearTimeout(timer.current)\n timer.current = window.setTimeout(() => setPeek(true), 120)\n }\n const closePeek = () => {\n window.clearTimeout(timer.current)\n timer.current = window.setTimeout(() => setPeek(false), 200)\n }\n // Só o foco do teclado (Tab) abre a barra e a mantém aberta. Foco de clique, ou o foco que\n // um menu devolve ao fechar, não prende a barra aberta depois que o mouse sai.\n const keyboardFocusInside = () => {\n const el = document.activeElement\n return Boolean(el && rootRef.current?.contains(el) && el.matches(':focus-visible'))\n }\n\n const desktop = layout.navigation === 'sidebar'\n\n return (\n <>\n {desktop && (\n // O aside reserva só a largura recolhida; o painel expandido flutua por cima do conteúdo.\n <aside\n aria-label=\"Menu lateral\"\n className={cn(\n 'relative hidden shrink-0 transition-[width] duration-200 ease-out md:block',\n collapsed ? 'w-sidebar-collapsed' : 'w-sidebar',\n )}\n >\n <div\n ref={rootRef}\n onMouseEnter={openPeek}\n onMouseLeave={() => {\n if (!keyboardFocusInside()) closePeek()\n }}\n onFocus={(e) => {\n if ((e.target as HTMLElement).matches(':focus-visible')) openPeek()\n }}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) closePeek()\n }}\n className=\"absolute inset-y-0 left-0 z-40 flex\"\n >\n <div\n className={cn(\n 'h-full border-r border-sidebar-border bg-sidebar-brand text-sidebar-foreground transition-[width,box-shadow] duration-200 ease-out',\n compact ? 'w-sidebar-collapsed' : 'w-sidebar',\n collapsed && peek && 'shadow-lg',\n )}\n >\n <SidebarBody\n compact={compact}\n submenu={layout.submenu}\n hoverExpands={hoverExpands}\n panelOpenFor={panel?.title ?? null}\n onTogglePanel={(item) => setPanel((p) => (p?.title === item.title ? null : item))}\n />\n </div>\n {panel && <SubmenuPanel item={panel} onClose={() => setPanel(null)} />}\n </div>\n </aside>\n )}\n\n {/* Mobile (e tablet no layout de menu superior): gaveta com submenu inline */}\n <Dialog.Root open={mobileNavOpen} onOpenChange={setMobileNavOpen}>\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn(\n 'fixed inset-0 z-40 bg-overlay data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0',\n desktop ? 'md:hidden' : 'lg:hidden',\n )}\n />\n <Dialog.Content\n aria-describedby={undefined}\n className={cn(\n 'fixed inset-y-0 left-0 z-50 w-sidebar-drawer bg-sidebar-brand text-sidebar-foreground shadow-lg data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left data-[state=open]:animate-in data-[state=open]:slide-in-from-left',\n desktop ? 'md:hidden' : 'lg:hidden',\n )}\n >\n <VisuallyHidden.Root>\n <Dialog.Title>Menu</Dialog.Title>\n </VisuallyHidden.Root>\n <SidebarBody\n compact={false}\n submenu=\"inline\"\n hoverExpands={false}\n onNavigate={close}\n onClose={close}\n />\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n </>\n )\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Menu } from 'lucide-react'\nimport { useCurrentPath, useRendraLink } from '@/components/rendra-provider'\nimport { TooltipProvider } from '@/components/ui/tooltip'\nimport { cn } from '@/lib/cn'\nimport { CommandSearch } from './command-search'\nimport { Header } from './header'\nimport { defaultShellLayout, type ShellLayout } from './layout'\nimport { getBottomNavItems, getNavigationTargets, resolveActiveTo } from './navigation-utils'\nimport { ShellContext, useShell, type ShellContextValue } from './shell-context'\nimport { Sidebar } from './sidebar'\nimport type {\n NavGroup,\n ShellMenuItem,\n ShellNotificationsConfig,\n ShellUser,\n ShellUserMenuConfig,\n ShellWorkspacesConfig,\n} from './types'\n\nconst LAYOUT_KEY = 'ui-shell-layout'\n\nfunction readUserLayout(): Partial<ShellLayout> {\n try {\n return JSON.parse(localStorage.getItem(LAYOUT_KEY) ?? '{}') as Partial<ShellLayout>\n } catch {\n return {}\n }\n}\n\nconst defaultUser: ShellUser = { name: 'Usuário' }\n\n/**\n * Barra inferior do celular: até 4 atalhos e, no centro, o botão redondo do menu, subindo\n * metade acima da linha da barra, ao alcance do polegar. Com ela, o header não precisa do\n * botão de menu e sobra espaço para a seta de voltar.\n */\nfunction BottomNav({ onMenu }: { onMenu: () => void }) {\n const pathname = useCurrentPath()\n const Link = useRendraLink()\n const { bottomNavItems, navigationTargets } = useShell()\n const active = resolveActiveTo(navigationTargets, pathname)\n const item = (entry: (typeof bottomNavItems)[number]) => {\n const to = entry.to ?? entry.children?.[0]?.to ?? '/'\n const Icon = entry.icon\n return (\n <li key={entry.title}>\n <Link\n to={to}\n className={cn(\n 'flex min-h-touch flex-col items-center justify-center gap-1 py-2 text-xs font-medium transition-colors',\n to === active || entry.children?.some((c) => c.to === active)\n ? 'text-primary-text'\n : 'text-muted-foreground active:text-foreground',\n )}\n >\n <Icon className=\"size-icon-md\" aria-hidden />\n <span className=\"max-w-full truncate px-1\">{entry.shortTitle ?? entry.title}</span>\n </Link>\n </li>\n )\n }\n const half = Math.ceil(bottomNavItems.length / 2)\n return (\n <nav\n aria-label=\"Navegação rápida\"\n className=\"relative shrink-0 border-t bg-card pb-safe-inset md:hidden\"\n >\n <ul className=\"grid grid-cols-5 items-end\">\n {bottomNavItems.slice(0, half).map(item)}\n <li className=\"flex justify-center\">\n <button\n type=\"button\"\n onClick={onMenu}\n aria-label=\"Abrir menu\"\n className=\"-mt-6 mb-1 flex size-12 cursor-pointer items-center justify-center rounded-full bg-primary text-primary-foreground shadow-md ring-4 ring-card transition-transform outline-none focus-visible:ring-ring active:scale-95\"\n >\n <Menu className=\"size-icon-lg\" aria-hidden />\n </button>\n </li>\n {bottomNavItems.slice(half).map(item)}\n </ul>\n </nav>\n )\n}\n\nexport interface AppShellProps {\n /** Menu do sistema: sidebar, barra inferior e busca global. Único obrigatório. */\n navigation: NavGroup[]\n /** Sobrescreve o padrão interno (defaultShellLayout), chave a chave. */\n layout?: Partial<ShellLayout>\n /** Usuário exibido no menu do avatar e no rodapé da sidebar. */\n user?: ShellUser\n /** Itens do menu do avatar (ex.: \"Meu perfil\", \"Configurações\"). Padrão: nenhum. */\n userMenuItems?: ShellMenuItem[]\n /** Chamado ao selecionar \"Sair\", na sidebar e no menu do avatar. */\n onLogout?: () => void\n /** Rótulo do destino inicial na trilha do header. */\n homeLabel?: string\n /** Ações rápidas da busca global (Ctrl+K), além do atalho de tema. Padrão: nenhuma. */\n quickActions?: ShellMenuItem[]\n /** Notificações do sino do header. Sem esta prop, o sino não aparece. */\n notifications?: ShellNotificationsConfig\n /**\n * Quais submenus o menu do avatar mostra: `theme` (Tema), `template` (Template) e\n * `layout` (Layout). Todos `true` por padrão; `{ theme: false }` esconde só o Tema.\n * É o caminho para tirar essas escolhas do usuário (`userConfigurable` não faz isso).\n */\n userMenu?: ShellUserMenuConfig\n /**\n * Seletor de espaço (empresa, unidade, workspace) no topo do menu do avatar, logo depois\n * do usuário: um item de rádio por espaço, o de `activeId` marcado. `onSelect` recebe o\n * `id` escolhido. Sem esta prop, o menu é o de sempre.\n */\n workspaces?: ShellWorkspacesConfig\n /**\n * Logo do header no celular (abaixo de `md`): ocupa o lugar do título e da trilha. O título\n * continua anunciado ao leitor de tela (só some do visual), o botão de voltar e o ícone de\n * ajuda da tela ficam, e a trilha sai do header. A partir de `md` nada muda. O contêiner é\n * `aria-hidden`: o logo é decorativo para o leitor, então o nó **não pode ser interativo**\n * (um link ali dentro reprova `aria-hidden-focus` no axe).\n */\n headerLogo?: ReactNode\n /**\n * Permite que o usuário troque o layout pelo menu do avatar (guardado no navegador).\n * Desligue em produção se o layout do projeto for fixo.\n */\n userConfigurable?: boolean\n /** Tela atual. O boilerplate passa o <Outlet /> do react-router. */\n children?: ReactNode\n}\n\n/**\n * Estrutura da aplicação. Uma única área de rolagem: o <main>.\n * Nunca importa @/config nem um roteador: recebe o menu, o layout, o usuário e as\n * notificações por prop; quem navega é o RendraProvider (useCurrentPath/useRendraLink).\n * Título da aba e meta description (SEO) não são responsabilidade do AppShell: o\n * boilerplate (src/app/app-layout.tsx) aplica isso com useRouteMeta, que lê @/config/seo.\n */\nexport function AppShell({\n navigation,\n layout: layoutProp,\n user = defaultUser,\n userMenuItems = [],\n onLogout,\n homeLabel = 'Início',\n quickActions = [],\n notifications,\n userMenu,\n workspaces,\n headerLogo,\n userConfigurable = true,\n children,\n}: AppShellProps) {\n const [userLayout, setUserLayout] = useState<Partial<ShellLayout>>(() =>\n userConfigurable ? readUserLayout() : {},\n )\n const [mobileNavOpen, setMobileNavOpen] = useState(false)\n const [searchOpen, setSearchOpen] = useState(false)\n const [footerSlot, setFooterSlot] = useState<HTMLElement | null>(null)\n const [pageHelp, setPageHelp] = useState<ReactNode>(null)\n const pathname = useCurrentPath()\n const mainRef = useRef<HTMLElement>(null)\n\n const layoutPropKey = JSON.stringify(layoutProp ?? {})\n const layout = useMemo<ShellLayout>(\n () => ({\n ...defaultShellLayout,\n ...(JSON.parse(layoutPropKey) as Partial<ShellLayout>),\n ...userLayout,\n }),\n [layoutPropKey, userLayout],\n )\n\n const bottomNavItems = useMemo(() => getBottomNavItems(navigation), [navigation])\n const navigationTargets = useMemo(() => getNavigationTargets(navigation), [navigation])\n\n // Troca de tela: fecha a gaveta e volta a rolagem ao topo.\n useEffect(() => {\n setMobileNavOpen(false)\n mainRef.current?.scrollTo({ top: 0 })\n }, [pathname])\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') {\n e.preventDefault()\n setSearchOpen((o) => !o)\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [])\n\n const value = useMemo<ShellContextValue>(() => {\n const persist = (next: Partial<ShellLayout>) => {\n setUserLayout(next)\n try {\n localStorage.setItem(LAYOUT_KEY, JSON.stringify(next))\n } catch {\n // segue só em memória\n }\n }\n return {\n layout,\n setLayout: (key, v) => persist({ ...userLayout, [key]: v }),\n applyLayout: (partial) => persist({ ...userLayout, ...partial }),\n resetLayout: () => persist({}),\n mobileNavOpen,\n setMobileNavOpen,\n searchOpen,\n setSearchOpen,\n footerSlot,\n pageHelp,\n setPageHelp,\n navigation,\n bottomNavItems,\n navigationTargets,\n user,\n userMenuItems,\n onLogout,\n homeLabel,\n quickActions,\n notifications,\n userMenu,\n workspaces,\n headerLogo,\n }\n }, [\n layout,\n userLayout,\n mobileNavOpen,\n searchOpen,\n footerSlot,\n pageHelp,\n navigation,\n bottomNavItems,\n navigationTargets,\n user,\n userMenuItems,\n onLogout,\n homeLabel,\n quickActions,\n notifications,\n userMenu,\n workspaces,\n headerLogo,\n ])\n\n return (\n <ShellContext.Provider value={value}>\n <TooltipProvider>\n <div className=\"flex h-dvh overflow-hidden\">\n <a\n href=\"#conteudo\"\n className=\"sr-only z-50 rounded-control bg-primary px-4 py-2 text-primary-foreground focus:not-sr-only focus:fixed focus:top-2 focus:left-2\"\n >\n Pular para o conteúdo\n </a>\n <Sidebar />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <Header />\n <main\n ref={mainRef}\n id=\"conteudo\"\n tabIndex={-1}\n // relative: elementos absolutos do conteúdo (texto só para leitor de tela, inputs\n // ocultos) ficam presos à rolagem do main. Sem isso eles esticam o <html>, e um\n // link com #âncora rola a página inteira, deixando um vão em branco embaixo.\n className=\"relative min-h-0 flex-1 overflow-y-auto overscroll-contain outline-none\"\n >\n {children}\n </main>\n {/* Rodapé fixo das telas de formulário (ActionBar sticky). Vazio, não ocupa espaço. */}\n <div ref={setFooterSlot} className=\"shrink-0 empty:hidden\" />\n {layout.bottomNav && <BottomNav onMenu={() => setMobileNavOpen(true)} />}\n </div>\n </div>\n <CommandSearch />\n </TooltipProvider>\n </ShellContext.Provider>\n )\n}\n","/** Calcula contraste WCAG entre duas cores CSS resolvidas pelo navegador. */\nfunction toRgb(color: string): [number, number, number] | null {\n const probe = document.createElement('span')\n probe.style.color = color\n document.body.appendChild(probe)\n const resolved = getComputedStyle(probe).color\n probe.remove()\n const m = resolved.match(/[\\d.]+/g)\n if (!m || m.length < 3) return null\n return [Number(m[0]), Number(m[1]), Number(m[2])]\n}\n\nfunction luminance([r, g, b]: [number, number, number]) {\n const lin = (c: number) => {\n const s = c / 255\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4\n }\n return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b)\n}\n\nexport function readVar(name: string) {\n return getComputedStyle(document.documentElement).getPropertyValue(name).trim()\n}\n\nexport function contrastRatio(fg: string, bg: string): number | null {\n const a = toRgb(fg)\n const b = toRgb(bg)\n if (!a || !b) return null\n const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x) as [number, number]\n return (hi + 0.05) / (lo + 0.05)\n}\n","import { z } from 'zod'\n\n/*\n * Validadores brasileiros e esquemas Zod prontos, com mensagens em português.\n * Use nos formulários com React Hook Form: resolver: zodResolver(schema).\n */\n\nconst digits = (v: string) => v.replace(/\\D/g, '')\n\nexport function isValidCpf(value: string) {\n const cpf = digits(value)\n if (cpf.length !== 11 || /^(\\d)\\1{10}$/.test(cpf)) return false\n const calc = (len: number) => {\n let sum = 0\n for (let i = 0; i < len; i++) sum += Number(cpf[i]) * (len + 1 - i)\n const rest = (sum * 10) % 11\n return rest === 10 ? 0 : rest\n }\n return calc(9) === Number(cpf[9]) && calc(10) === Number(cpf[10])\n}\n\nexport function isValidCnpj(value: string) {\n const cnpj = digits(value)\n if (cnpj.length !== 14 || /^(\\d)\\1{13}$/.test(cnpj)) return false\n const calc = (len: number) => {\n const weights =\n len === 12 ? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] : [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n const sum = weights.reduce((acc, w, i) => acc + Number(cnpj[i]) * w, 0)\n const rest = sum % 11\n return rest < 2 ? 0 : 11 - rest\n }\n return calc(12) === Number(cnpj[12]) && calc(13) === Number(cnpj[13])\n}\n\nexport function isValidDateBR(value: string) {\n const m = value.match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/)\n if (!m) return false\n const [, d, mo, y] = m.map(Number) as [number, number, number, number]\n const date = new Date(y, mo - 1, d)\n return date.getFullYear() === y && date.getMonth() === mo - 1 && date.getDate() === d\n}\n\nexport const zBR = {\n required: (label = 'Campo') => z.string().trim().min(1, `${label} é obrigatório.`),\n email: () => z.string().trim().min(1, 'E-mail é obrigatório.').email('E-mail inválido.'),\n cpf: () => z.string().refine(isValidCpf, 'CPF inválido.'),\n cnpj: () => z.string().refine(isValidCnpj, 'CNPJ inválido.'),\n cpfCnpj: () =>\n z\n .string()\n .refine(\n (v) => (digits(v).length <= 11 ? isValidCpf(v) : isValidCnpj(v)),\n 'CPF ou CNPJ inválido.',\n ),\n phone: () =>\n z.string().refine((v) => [10, 11].includes(digits(v).length), 'Telefone incompleto.'),\n cep: () => z.string().refine((v) => digits(v).length === 8, 'CEP incompleto.'),\n dateBR: () => z.string().refine(isValidDateBR, 'Data inválida.'),\n}\n","/*\n * APLICAÇÃO NO DOM\n * -------------------------------------------------------------------------\n * applyTheme injeta no DOM o resultado (puro) de createTheme. Sem `target`, reproduz\n * exatamente applyPalette hoje: um <style> em document.head com o claro e o escuro do\n * tema, selecionados por :root[data-palette='<id>'] (quem liga o atributo é o BrandProvider,\n * como já acontece). Com `target`, aplica num contêiner próprio: marca\n * [data-rendra-root='<id>'] nele e escopa o <style> por esse atributo em vez de :root, para\n * um contêiner com tema próprio (não o documento inteiro) ler os mesmos tokens --rendra-*.\n */\nimport type { ThemeResult } from './theme'\n\nexport interface ApplyThemeOptions {\n /** Default: document.documentElement (o próprio <html>, como applyPalette hoje). */\n target?: HTMLElement\n /** Seletor do claro; o escuro é `${selector}.dark`. Default: deriva de target/id. */\n selector?: string\n}\n\nconst block = (selector: string, vars: Record<string, string>) =>\n `${selector} {\\n${Object.entries(vars)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n')}\\n}\\n`\n\n/** Aplica no DOM o resultado de createTheme. Sem opções, reproduz applyPalette(seed) de hoje. */\nexport function applyTheme(\n theme: ThemeResult,\n options: ApplyThemeOptions = {},\n doc: Document = document,\n): void {\n const target = options.target ?? doc.documentElement\n const isRoot = target === doc.documentElement\n if (!isRoot) target.setAttribute('data-rendra-root', theme.id)\n\n const lightSelector =\n options.selector ??\n (isRoot ? `:root[data-palette='${theme.id}']` : `[data-rendra-root='${theme.id}']`)\n const darkSelector = options.selector\n ? `${options.selector}.dark`\n : isRoot\n ? `:root[data-palette='${theme.id}'].dark`\n : `[data-rendra-root='${theme.id}'].dark`\n\n const attr = 'data-theme-runtime'\n let style = doc.head.querySelector<HTMLStyleElement>(`style[${attr}=\"${theme.id}\"]`)\n if (!style) {\n style = doc.createElement('style')\n style.setAttribute(attr, theme.id)\n doc.head.appendChild(style)\n }\n style.textContent = `${block(lightSelector, theme.vars.light)}\\n${block(darkSelector, theme.vars.dark)}`\n}\n","import { useEffect, useMemo, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport { applyTheme } from './apply-theme'\nimport { BrandContext, type BrandContextValue, type ColorMode } from './brand-context'\nimport type { ThemeResult } from './theme'\nimport type { Shape } from '@/lib/shape'\nimport type { BrandConfig, PaletteConfig } from './types'\n\nconst MODE_KEY = 'ui-mode'\nconst BRAND_KEY = 'ui-brand'\nconst PALETTE_KEY = 'ui-palette'\n\n/**\n * Armazenamento plugável: get/set simples, para trocar o localStorage padrão por outra fonte\n * (cookie, backend...), ou desligar com `false`.\n * `remove` é opcional: quando ausente (armazenamento customizado antigo, sem essa peça),\n * `clearKey` cai de volta em `set(key, '')`, para não quebrar quem já implementou só get/set.\n */\nexport interface BrandStorage {\n get(key: string): string | null\n set(key: string, value: string): void\n remove?(key: string): void\n}\n\nconst localStorageAdapter: BrandStorage = {\n get(key) {\n try {\n return localStorage.getItem(key)\n } catch {\n return null\n }\n },\n set(key, value) {\n try {\n localStorage.setItem(key, value)\n } catch {\n // Armazenamento indisponível (aba anônima, bloqueio): segue só em memória.\n }\n },\n remove(key) {\n try {\n localStorage.removeItem(key)\n } catch {\n // Armazenamento indisponível: segue só em memória.\n }\n },\n}\n\nconst noopStorage: BrandStorage = { get: () => null, set: () => {}, remove: () => {} }\n\nfunction resolveStorage(storage: BrandStorage | false | undefined): BrandStorage {\n if (storage === false) return noopStorage\n return storage ?? localStorageAdapter\n}\n\n/** Zera a chave de verdade (removeItem) quando o storage implementa `remove`; senão, `set('')`. */\nfunction clearKey(storage: BrandStorage, key: string) {\n if (storage.remove) storage.remove(key)\n else storage.set(key, '')\n}\n\nconst darkQuery = '(prefers-color-scheme: dark)'\nfunction subscribeSystem(cb: () => void) {\n const mq = matchMedia(darkQuery)\n mq.addEventListener('change', cb)\n return () => mq.removeEventListener('change', cb)\n}\nconst getSystemDark = () => matchMedia(darkQuery).matches\n\ninterface BrandProviderProps {\n brands: BrandConfig[]\n /** Paletas disponíveis. Padrão: uma por modelo. */\n palettes?: PaletteConfig[]\n defaultBrand: BrandConfig\n children: ReactNode\n /**\n * Tema aplicado em tempo de execução (resultado de createTheme, C5). Aplica sem exigir um id\n * cadastrado em palettes.ts: o data-palette (ou data-rendra-root, com `target`) recebe o id\n * do próprio tema.\n */\n theme?: ThemeResult\n /** Força um modo (útil no Storybook e nos testes). */\n forcedMode?: 'light' | 'dark'\n /** Força uma marca pelo id (útil no Storybook e nos testes). */\n forcedBrandId?: string\n /** Força uma paleta pelo id (útil no Storybook). */\n forcedPaletteId?: string\n /** Modo controlado; sem esta prop, o provider guarda o próprio estado (comportamento de hoje). */\n mode?: ColorMode\n onModeChange?(mode: ColorMode): void\n /** Marca controlada; sem esta prop, o provider guarda o próprio estado. */\n brandId?: string\n onBrandIdChange?(id: string): void\n /** Paleta controlada (null volta às cores do próprio modelo); sem esta prop, estado próprio. */\n paletteId?: string | null\n onPaletteIdChange?(id: string | null): void\n /** Armazenamento da preferência; false desliga a persistência. Padrão: localStorage. */\n storage?: BrandStorage | false\n /** Contêiner onde a marca é aplicada (data-*, tema). Padrão: document.documentElement. */\n target?: HTMLElement\n}\n\nexport function BrandProvider({\n brands,\n palettes: palettesProp,\n defaultBrand,\n children,\n theme,\n forcedMode,\n forcedBrandId,\n forcedPaletteId,\n mode: modeProp,\n onModeChange,\n brandId: brandIdProp,\n onBrandIdChange,\n paletteId: paletteIdProp,\n onPaletteIdChange,\n storage: storageProp,\n target,\n}: BrandProviderProps) {\n const storage = useMemo(() => resolveStorage(storageProp), [storageProp])\n const brandControlled = brandIdProp !== undefined\n const modeControlled = modeProp !== undefined\n const paletteControlled = paletteIdProp !== undefined\n\n const [brandIdState, setBrandIdState] = useState(\n () => brandIdProp ?? storage.get(BRAND_KEY) ?? defaultBrand.id,\n )\n const [modeState, setModeState] = useState<ColorMode>(\n () => modeProp ?? (storage.get(MODE_KEY) as ColorMode | null) ?? 'system',\n )\n const [paletteIdState, setPaletteIdState] = useState<string | null>(\n () => paletteIdProp ?? storage.get(PALETTE_KEY) ?? null,\n )\n const systemDark = useSyncExternalStore(subscribeSystem, getSystemDark)\n\n const brandId = brandControlled ? brandIdProp! : brandIdState\n const mode = modeControlled ? modeProp! : modeState\n const paletteId = paletteControlled ? (paletteIdProp ?? null) : paletteIdState\n\n const effectiveBrandId = forcedBrandId ?? brandId\n const brand = brands.find((b) => b.id === effectiveBrandId) ?? defaultBrand\n const shape: Shape = brand.shape\n const palettes = useMemo<PaletteConfig[]>(\n () =>\n palettesProp ??\n brands.map((b) => ({ id: b.id, name: b.productName, sidebarLogo: b.sidebarLogo })),\n [palettesProp, brands],\n )\n // Tema em tempo de execução (C5): quando informado, dita a paleta ativa, sem precisar estar\n // cadastrado em palettes.ts (fallback documentado para paletteId desconhecido, abaixo).\n const themePalette = useMemo<PaletteConfig | null>(\n () => (theme ? { id: theme.id, name: theme.name, sidebarLogo: theme.sidebarLogo } : null),\n [theme],\n )\n const palette = useMemo<PaletteConfig>(() => {\n if (themePalette) return themePalette\n return (\n palettes.find((p) => p.id === (forcedPaletteId ?? paletteId)) ??\n palettes.find((p) => p.id === brand.id) ?? {\n id: brand.id,\n name: brand.productName,\n sidebarLogo: brand.sidebarLogo,\n }\n )\n }, [themePalette, palettes, forcedPaletteId, paletteId, brand])\n const resolvedMode = forcedMode ?? (mode === 'system' ? (systemDark ? 'dark' : 'light') : mode)\n\n useEffect(() => {\n const root = target ?? document.documentElement\n root.dataset.brand = brand.id\n root.dataset.shape = shape\n root.dataset.label = brand.labelStyle ?? 'discreto'\n root.dataset.palette = palette.id\n root.classList.toggle('dark', resolvedMode === 'dark')\n // O favicon é do documento inteiro: só faz sentido quando aplicado à raiz de verdade.\n if (root === document.documentElement) {\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]')\n if (!link) {\n link = document.createElement('link')\n link.rel = 'icon'\n document.head.appendChild(link)\n }\n link.href = brand.favicon\n // O título da aba vem de useRouteMeta (tela | produto).\n }\n }, [brand, palette, resolvedMode, shape, target])\n\n // Tema em tempo de execução (C5): injeta/atualiza o <style> do tema sempre que ele mudar.\n useEffect(() => {\n if (!theme) return\n applyTheme(theme, { target })\n }, [theme, target])\n\n const value = useMemo<BrandContextValue>(\n () => ({\n brand,\n brands,\n resolvedMode,\n mode,\n shape,\n palette,\n palettes,\n sidebarLogoVariant:\n palette.sidebarLogo === 'auto'\n ? resolvedMode === 'dark'\n ? 'dark'\n : 'light'\n : palette.sidebarLogo,\n setPaletteId: (id) => {\n if (!paletteControlled) setPaletteIdState(id)\n if (id) storage.set(PALETTE_KEY, id)\n else clearKey(storage, PALETTE_KEY)\n onPaletteIdChange?.(id)\n },\n setMode: (next) => {\n if (!modeControlled) setModeState(next)\n storage.set(MODE_KEY, next)\n onModeChange?.(next)\n },\n // Trocar de modelo volta às cores do próprio modelo. No modo controlado (paletteId\n // informado), quem decide se a paleta some é o dono do estado: aqui só se notifica via\n // onPaletteIdChange, nunca se zera o estado por conta própria.\n setBrandId: (id) => {\n if (!brandControlled) setBrandIdState(id)\n storage.set(BRAND_KEY, id)\n onBrandIdChange?.(id)\n if (!paletteControlled) setPaletteIdState(null)\n clearKey(storage, PALETTE_KEY)\n onPaletteIdChange?.(null)\n },\n }),\n [\n brand,\n brands,\n palette,\n palettes,\n mode,\n resolvedMode,\n shape,\n storage,\n brandControlled,\n modeControlled,\n paletteControlled,\n onModeChange,\n onBrandIdChange,\n onPaletteIdChange,\n ],\n )\n\n return <BrandContext.Provider value={value}>{children}</BrandContext.Provider>\n}\n","/*\n * COR CONTROLADA\n * -------------------------------------------------------------------------------------\n * createTheme(input) é uma função pura (sem tocar o DOM, compatível com SSR) com três modos:\n *\n * - gerado: sementes (4 cores + degradê), passa por createPalette, corrige contraste AA,\n * é o mesmo comportamento de applyPalette hoje, só que exposto por uma API versionada;\n * - explicito: tokens semânticos já prontos, por nome SEM prefixo (primary, primaryForeground,\n * sidebar...), traduzidos aqui para --rendra-*; nada é recalculado, o contraste só é\n * relatado (enforceContrast força o ajuste); dark ausente é derivado, presente é respeitado;\n * - misto: sementes + sobrescritas pontuais, a sobrescrita sempre vence.\n *\n * createPalette/applyPalette/paletteCss continuam intactos: createTheme é construído por cima\n * deles, nunca em paralelo. A saída já nasce com as chaves --rendra-* (decisão 1.8).\n */\nimport { createPalette, contrast, mix, type PaletteSeeds } from './palette'\n\nexport type ThemeMode = 'gerado' | 'explicito' | 'misto'\n\nexport interface ThemeSeedInput {\n /** Hex, rgb(), hsl() ou tripleta HSL solta (\"210 95% 34%\"). */\n primary: string\n primaryHover?: string\n secondary: string\n secondaryHover?: string\n /** Degradê da marca (sidebar, painel do login, destaque): luz, meio e fundo. */\n gradient: [string, string, string]\n onPrimary?: 'auto' | 'light' | 'dark'\n onSecondary?: 'auto' | 'light' | 'dark'\n}\n\n/** Tokens semânticos por nome, sem o prefixo --rendra- (ex.: \"primary\", \"primaryForeground\"). */\nexport type ThemeSemanticTokens = Partial<Record<(typeof TOKEN_KEYS)[number], string>>\n\nexport interface ThemeExplicitInput {\n light: ThemeSemanticTokens\n /** Ausente = derivado do claro; presente = respeitado como está. */\n dark?: ThemeSemanticTokens\n /** Default false: só relata o contraste. true: ajusta os pares que falham AA. */\n enforceContrast?: boolean\n}\n\nexport interface ThemeInput {\n /** Usado em data-palette (ou data-rendra-root) e no BrandProvider. */\n id: string\n /** Nome curto exibido nos seletores. */\n name: string\n mode: ThemeMode\n /** Obrigatório em 'gerado' e 'misto'. */\n seed?: ThemeSeedInput\n /** Obrigatório em 'explicito' e 'misto' (ao menos `light`). */\n explicit?: Partial<ThemeExplicitInput>\n}\n\nexport interface ThemeContrastCheck {\n /** Nome da variável --rendra-* verificada (o papel de preenchimento do par). */\n token: string\n background: string\n foreground: string\n ratio: number\n passesAA: boolean\n mode: 'light' | 'dark'\n}\n\nexport interface ThemeAdjustment {\n token: string\n mode: 'light' | 'dark'\n requested: string\n applied: string\n ratio: number\n}\n\nexport interface ThemeResult {\n id: string\n name: string\n /** Logotipo adequado sobre a sidebar deste tema. */\n sidebarLogo: 'light' | 'dark'\n vars: {\n light: Record<string, string>\n dark: Record<string, string>\n }\n /** Um item por par de contraste conferido. */\n report: ThemeContrastCheck[]\n /** Ajustes aplicados (enforceContrast, ou os já feitos por createPalette no modo gerado). */\n adjustments: ThemeAdjustment[]\n}\n\n/* ------------------------------------------------------------- vocabulário de tokens */\n\n/**\n * Todo nome de token que createPalette emite (light ∪ dark), sem prefixo, em camelCase.\n * É a lista que o modo explícito aceita; qualquer chave fora daqui é ignorada (não é\n * vocabulário de createPalette, não faz parte deste contrato).\n */\nexport const TOKEN_KEYS = [\n 'primary',\n 'primaryForeground',\n 'primaryHover',\n 'primaryHoverForeground',\n 'secondary',\n 'secondaryForeground',\n 'secondaryHover',\n 'secondaryHoverForeground',\n 'primarySoft',\n 'primarySoftForeground',\n 'primaryText',\n 'ring',\n 'accent',\n 'accentForeground',\n 'sidebar',\n 'sidebarImage',\n 'sidebarForeground',\n 'sidebarMutedForeground',\n 'sidebarBorder',\n 'sidebarAccent',\n 'sidebarActive',\n 'sidebarActiveForeground',\n 'sidebarIndicator',\n 'gradientBrand',\n 'gradientBrandForeground',\n 'gradientAccent',\n 'gradientSoft',\n 'chart1',\n 'chart2',\n 'chart3',\n 'chart4',\n 'chart5',\n 'shadowColor',\n 'background',\n 'backgroundImage',\n 'foreground',\n 'card',\n 'cardForeground',\n 'popover',\n 'popoverForeground',\n 'muted',\n 'mutedForeground',\n 'border',\n 'input',\n 'field',\n 'overlay',\n] as const\n\n/** camelCase -> kebab-case (\"primaryForeground\" -> \"primary-foreground\", \"chart1\" -> \"chart-1\"). */\nfunction camelToKebab(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([a-zA-Z])(\\d)/g, '$1-$2')\n .toLowerCase()\n}\n\nconst toVarName = (key: string) => `--rendra-${camelToKebab(key)}`\n\n/* ------------------------------------------------------------------------- cor */\n\nconst WHITE = '#ffffff'\nconst BLACK = '#000000'\nconst INK = '#0b1d37'\n\nfunction isDarkColor(hex: string): boolean {\n return contrast(hex, WHITE) >= contrast(hex, INK)\n}\n\nconst HEX_RE = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i\nconst RGB_RE =\n /^rgba?\\(\\s*([\\d.]+)\\s*[,\\s]\\s*([\\d.]+)\\s*[,\\s]\\s*([\\d.]+)(?:\\s*[,/]\\s*[\\d.%]+)?\\s*\\)$/i\nconst HSL_RE =\n /^hsla?\\(\\s*([\\d.]+)(?:deg)?\\s*[,\\s]\\s*([\\d.]+)%\\s*[,\\s]\\s*([\\d.]+)%(?:\\s*[,/]\\s*[\\d.%]+)?\\s*\\)$/i\nconst HSL_TRIPLET_RE = /^([\\d.]+)\\s+([\\d.]+)%\\s+([\\d.]+)%$/\n\nfunction toHex2(n: number): string {\n return Math.round(Math.min(255, Math.max(0, n)))\n .toString(16)\n .padStart(2, '0')\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`\n}\n\n/** HSL (h em graus, s/l em 0..100) para hex. */\nfunction hslToHex(h: number, s: number, l: number): string {\n const sN = s / 100\n const lN = l / 100\n const k = (n: number) => (n + h / 30) % 12\n const a = sN * Math.min(lN, 1 - lN)\n const f = (n: number) => lN - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)))\n return rgbToHex(255 * f(0), 255 * f(8), 255 * f(4))\n}\n\n/**\n * Tenta reconhecer `value` como cor (hex, rgb(), hsl() ou tripleta HSL solta, \"210 95% 34%\") e\n * devolve o hex normalizado em minúsculas. Devolve null quando não é um formato de cor\n * reconhecido (gradiente, palavra-chave, \"none\"...), para o chamador decidir o que fazer.\n */\nexport function tryParseColorToHex(value: string): string | null {\n const v = value.trim()\n if (HEX_RE.test(v)) {\n let h = v.slice(1)\n if (h.length === 3)\n h = h\n .split('')\n .map((c) => c + c)\n .join('')\n return `#${h.toLowerCase()}`\n }\n const rgb = RGB_RE.exec(v)\n if (rgb) return rgbToHex(Number(rgb[1]), Number(rgb[2]), Number(rgb[3]))\n const hsl = HSL_RE.exec(v)\n if (hsl) return hslToHex(Number(hsl[1]), Number(hsl[2]), Number(hsl[3]))\n const triplet = HSL_TRIPLET_RE.exec(v)\n if (triplet) return hslToHex(Number(triplet[1]), Number(triplet[2]), Number(triplet[3]))\n return null\n}\n\n/** Como tryParseColorToHex, mas lança quando o valor precisa ser uma cor (sementes). */\nfunction parseColorToHex(value: string, label: string): string {\n const hex = tryParseColorToHex(value)\n if (!hex)\n throw new Error(`Cor inválida em ${label}: ${value} (use hex, rgb(), hsl() ou \"H S% L%\")`)\n return hex\n}\n\n/** rgb(var(--x) / a) precisa da tripleta \"r g b\"; aceita hex ou já-tripleta. */\nfunction toRgbTriplet(value: string): string {\n const hex = tryParseColorToHex(value)\n if (hex) {\n const h = hex.slice(1)\n const n = (i: number) => parseInt(h.slice(i, i + 2), 16)\n return `${n(0)} ${n(2)} ${n(4)}`\n }\n return value.trim()\n}\n\n/* --------------------------------------------------------------- modo explícito/misto */\n\n/** Traduz tokens semânticos sem prefixo para --rendra-*, normalizando cor quando reconhecida. */\nfunction translateExplicit(tokens: ThemeSemanticTokens): Record<string, string> {\n const out: Record<string, string> = {}\n for (const key of TOKEN_KEYS) {\n const value = tokens[key]\n if (value == null) continue\n const varName = toVarName(key)\n if (key === 'shadowColor') {\n out[varName] = toRgbTriplet(value)\n continue\n }\n out[varName] = tryParseColorToHex(value) ?? value\n }\n return out\n}\n\n/**\n * Derivação simples do escuro a partir do claro, só usada no modo explícito sem sementes e sem\n * `dark` informado (documentada aqui, não é a mesma qualidade AA de createPalette): papéis de\n * texto (*Foreground) clareiam, preenchimentos e fundos escurecem. Quem quiser o escuro fino\n * deve informar `explicit.dark` ou usar sementes (modo gerado/misto).\n */\nfunction deriveSimpleDark(light: Record<string, string>): Record<string, string> {\n const dark: Record<string, string> = {}\n for (const [varName, value] of Object.entries(light)) {\n const hex = tryParseColorToHex(value)\n if (!hex) {\n dark[varName] = value\n continue\n }\n const isForeground = /-foreground$/.test(varName)\n dark[varName] = isForeground ? mix(hex, WHITE, 0.4) : mix(hex, BLACK, 0.5)\n }\n return dark\n}\n\n/* ------------------------------------------------------------------- relatório de contraste */\n\n/** Pares (preenchimento, texto) conferidos no relatório, pelo nome do token (sem prefixo). */\nconst CONTRAST_PAIRS: [fill: string, foreground: string][] = [\n ['primary', 'primaryForeground'],\n ['primaryHover', 'primaryHoverForeground'],\n ['secondary', 'secondaryForeground'],\n ['secondaryHover', 'secondaryHoverForeground'],\n ['primarySoft', 'primarySoftForeground'],\n ['accent', 'accentForeground'],\n ['sidebar', 'sidebarForeground'],\n ['card', 'cardForeground'],\n ['popover', 'popoverForeground'],\n ['muted', 'mutedForeground'],\n ['background', 'foreground'],\n]\n\nconst AA = 4.5\n\n/** Constrói o relatório e, se enforceContrast, ajusta os pares que falham (mutando `vars`). */\nfunction buildReport(\n vars: { light: Record<string, string>; dark: Record<string, string> },\n enforceContrast: boolean,\n): { report: ThemeContrastCheck[]; adjustments: ThemeAdjustment[] } {\n const report: ThemeContrastCheck[] = []\n const adjustments: ThemeAdjustment[] = []\n for (const mode of ['light', 'dark'] as const) {\n const map = vars[mode]\n for (const [fillKey, fgKey] of CONTRAST_PAIRS) {\n const fillVar = toVarName(fillKey)\n const fgVar = toVarName(fgKey)\n const fillValue = map[fillVar]\n const fgValue = map[fgVar]\n if (!fillValue || !fgValue) continue\n const fillHex = tryParseColorToHex(fillValue)\n const fgHex = tryParseColorToHex(fgValue)\n if (!fillHex || !fgHex) continue\n const ratio = contrast(fillHex, fgHex)\n const passesAA = ratio >= AA\n report.push({\n token: fillVar,\n background: fillHex,\n foreground: fgHex,\n ratio,\n passesAA,\n mode,\n })\n if (!passesAA && enforceContrast) {\n const towardBlack = isDarkColor(fillHex) ? false : true\n let applied = fgHex\n for (let t = 0; t <= 1.0001; t += 0.02) {\n const candidate = mix(fgHex, towardBlack ? BLACK : WHITE, t)\n if (contrast(fillHex, candidate) >= AA) {\n applied = candidate\n break\n }\n applied = towardBlack ? BLACK : WHITE\n }\n const finalRatio = contrast(fillHex, applied)\n map[fgVar] = applied\n adjustments.push({\n token: fgVar,\n mode,\n requested: fgHex,\n applied,\n ratio: finalRatio,\n })\n }\n }\n }\n return { report, adjustments }\n}\n\n/* ------------------------------------------------------------------------------- createTheme */\n\n/**\n * Ajustes do modo gerado/misto: compara a cor pedida na semente (primary, primaryHover,\n * secondary, secondaryHover, já normalizadas para hex por seedToPaletteSeeds) com a cor que\n * createPalette de fato aplicou em cada preenchimento, claro e escuro. Diferença = ajuste (seja\n * para passar AA com o texto, no claro, seja para ficar visível sobre o card escuro, no escuro;\n * os dois casos hoje ficam só em nota de texto dentro de createPalette, e o escuro é descartado\n * — aqui os dois viram registro estruturado).\n */\nfunction seedAdjustments(\n seedHexes: Pick<PaletteSeeds, 'primary' | 'primaryHover' | 'secondary' | 'secondaryHover'>,\n vars: { light: Record<string, string>; dark: Record<string, string> },\n): ThemeAdjustment[] {\n const out: ThemeAdjustment[] = []\n for (const key of ['primary', 'primaryHover', 'secondary', 'secondaryHover'] as const) {\n const requested = seedHexes[key]\n const varName = toVarName(key)\n for (const mode of ['light', 'dark'] as const) {\n const applied = vars[mode][varName]\n if (!applied || applied.toLowerCase() === requested.toLowerCase()) continue\n const fgVar = toVarName(`${key}Foreground`)\n const fg = vars[mode][fgVar]\n const fgHex = fg ? tryParseColorToHex(fg) : null\n out.push({\n token: varName,\n mode,\n requested,\n applied,\n ratio: fgHex ? contrast(applied, fgHex) : 0,\n })\n }\n }\n return out\n}\n\nfunction seedToPaletteSeeds(id: string, name: string, seed: ThemeSeedInput): PaletteSeeds {\n return {\n id,\n name,\n primary: parseColorToHex(seed.primary, 'seed.primary'),\n primaryHover: parseColorToHex(seed.primaryHover ?? seed.primary, 'seed.primaryHover'),\n secondary: parseColorToHex(seed.secondary, 'seed.secondary'),\n secondaryHover: parseColorToHex(seed.secondaryHover ?? seed.secondary, 'seed.secondaryHover'),\n gradient: seed.gradient.map((c, i) => parseColorToHex(c, `seed.gradient[${i}]`)) as [\n string,\n string,\n string,\n ],\n onPrimary: seed.onPrimary,\n onSecondary: seed.onSecondary,\n }\n}\n\nfunction sidebarLogoFrom(vars: { light: Record<string, string>; dark: Record<string, string> }) {\n const sidebar = vars.light['--rendra-sidebar'] ?? vars.dark['--rendra-sidebar']\n const hex = sidebar ? tryParseColorToHex(sidebar) : null\n return hex && isDarkColor(hex) ? 'dark' : 'light'\n}\n\n/**\n * Função pura, sem DOM, compatível com SSR. As chaves de vars.light/vars.dark já nascem\n * prefixadas (--rendra-primary, --rendra-shadow-color...), no mesmo formato que\n * applyTheme/BrandProvider esperam para injetar no DOM sem reprocessar nada.\n */\nexport function createTheme(input: ThemeInput): ThemeResult {\n const { id, name, mode } = input\n\n if (mode === 'gerado') {\n if (!input.seed) throw new Error('createTheme: modo \"gerado\" exige seed.')\n const paletteSeeds = seedToPaletteSeeds(id, name, input.seed)\n const palette = createPalette(paletteSeeds)\n const vars = { light: { ...palette.light }, dark: { ...palette.dark } }\n // createPalette já corrige AA na geração; o relatório aqui só confirma (sem reajustar).\n const { report } = buildReport(vars, false)\n // Reaproveita os hexes já normalizados por seedToPaletteSeeds, sem reanalisar a semente.\n const adjustments = seedAdjustments(paletteSeeds, vars)\n return { id, name, sidebarLogo: palette.sidebarLogo, vars, report, adjustments }\n }\n\n if (mode === 'explicito') {\n const explicit = input.explicit\n if (!explicit?.light) throw new Error('createTheme: modo \"explicito\" exige explicit.light.')\n const light = translateExplicit(explicit.light)\n const dark = explicit.dark ? translateExplicit(explicit.dark) : deriveSimpleDark(light)\n const vars = { light, dark }\n const { report, adjustments } = buildReport(vars, explicit.enforceContrast ?? false)\n return { id, name, sidebarLogo: sidebarLogoFrom(vars), vars, report, adjustments }\n }\n\n // misto: sementes geram a base; sobrescritas do explicit vencem por cima.\n if (!input.seed) throw new Error('createTheme: modo \"misto\" exige seed.')\n const paletteSeeds = seedToPaletteSeeds(id, name, input.seed)\n const palette = createPalette(paletteSeeds)\n const vars = { light: { ...palette.light }, dark: { ...palette.dark } }\n // Reaproveita os hexes já normalizados por seedToPaletteSeeds, sem reanalisar a semente.\n const fromSeed = seedAdjustments(paletteSeeds, vars)\n const overrides = input.explicit\n if (overrides?.light) Object.assign(vars.light, translateExplicit(overrides.light))\n if (overrides?.dark) Object.assign(vars.dark, translateExplicit(overrides.dark))\n const { report, adjustments: overrideAdjustments } = buildReport(\n vars,\n overrides?.enforceContrast ?? false,\n )\n return {\n id,\n name,\n sidebarLogo: sidebarLogoFrom(vars),\n vars,\n report,\n adjustments: [...fromSeed, ...overrideAdjustments],\n }\n}\n"],"mappings":"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qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;CACF;CACA,GAAG;EACD,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oBAAoB;EACtB;EACA,GAAG;GACD,oBAAoB;GACpB,qBAAqB;GACrB,cAAc;GACd,oBAAoB;GACpB,cAAc;GACd,oB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"}
|