@rendra-ui/web 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +11 -2
  2. package/dist/base.css +1 -1
  3. package/dist/{button-BzJgR2gH.js → button-B6-644xP.js} +7 -7
  4. package/dist/button-B6-644xP.js.map +1 -0
  5. package/dist/chart.js +15 -13
  6. package/dist/chart.js.map +1 -1
  7. package/dist/cli/auditar.js +1 -1
  8. package/dist/cli/codigos.js +2 -2
  9. package/dist/cli/executar-auditar.js +1 -1
  10. package/dist/cli/help.js +1 -1
  11. package/dist/cli/trocar.js +2 -2
  12. package/dist/cli/typescript-loader.js +1 -1
  13. package/dist/{cn-Cw7M5kEP.js → cn-TBlI6-gS.js} +2 -2
  14. package/dist/{cn-Cw7M5kEP.js.map → cn-TBlI6-gS.js.map} +1 -1
  15. package/dist/{components-DkpspH9h.js → components-Btk1cUg2.js} +2 -2
  16. package/dist/{components-DkpspH9h.js.map → components-Btk1cUg2.js.map} +1 -1
  17. package/dist/components.css +1 -1
  18. package/dist/document-viewer.js +4 -4
  19. package/dist/{empty-state-Cdb1vkMT.js → empty-state-DrQjqxvp.js} +11 -11
  20. package/dist/{empty-state-Cdb1vkMT.js.map → empty-state-DrQjqxvp.js.map} +1 -1
  21. package/dist/{features-max--5VEt6M7.js → features-max-CC6CorTg.js} +1 -1
  22. package/dist/index.js +90 -77
  23. package/dist/index.js.map +1 -1
  24. package/dist/motion-context-BL545cb6.js +222 -0
  25. package/dist/motion-context-BL545cb6.js.map +1 -0
  26. package/dist/motion-on-DMoTsWrG.js +29 -0
  27. package/dist/motion-on-DMoTsWrG.js.map +1 -0
  28. package/dist/motion.js +3 -0
  29. package/dist/{rendra-provider-CRe0XdOU.js → rendra-provider-CeCkPafT.js} +3 -3
  30. package/dist/rendra-provider-CeCkPafT.js.map +1 -0
  31. package/dist/rich-text-editor.js +3 -3
  32. package/dist/router-bridge.js +2 -2
  33. package/dist/router-bridge.js.map +1 -1
  34. package/dist/tokens.css +1 -1
  35. package/dist/{tooltip-BAMSaGbS.js → tooltip-kgsorOg6.js} +15 -15
  36. package/dist/tooltip-kgsorOg6.js.map +1 -0
  37. package/dist/types/components/rendra-provider.d.ts +7 -2
  38. package/dist/types/components/rendra-router-bridge.d.ts +2 -1
  39. package/dist/types/index.d.ts +1 -0
  40. package/dist/types/lib/motion/index.d.ts +1 -1
  41. package/dist/types/lib/motion/motion-context.d.ts +21 -6
  42. package/dist/types/lib/motion/motion-on.d.ts +12 -0
  43. package/dist/types/motion.d.ts +1 -0
  44. package/dist/{use-breakpoint-O9eqFmsF.js → use-breakpoint-CNxDwEpc.js} +2 -2
  45. package/dist/{use-breakpoint-O9eqFmsF.js.map → use-breakpoint-CNxDwEpc.js.map} +1 -1
  46. package/dist/{use-motion-presets-BrkgL8lG.js → use-motion-presets-DCJPBfNJ.js} +3 -3
  47. package/dist/{use-motion-presets-BrkgL8lG.js.map → use-motion-presets-DCJPBfNJ.js.map} +1 -1
  48. package/dist/widget-grid.js +2 -2
  49. package/package.json +8 -1
  50. package/dist/button-BzJgR2gH.js.map +0 -1
  51. package/dist/motion-context-5BRIQAJm.js +0 -107
  52. package/dist/motion-context-5BRIQAJm.js.map +0 -1
  53. package/dist/rendra-provider-CRe0XdOU.js.map +0 -1
  54. package/dist/tooltip-BAMSaGbS.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/components/app-shell/shell-context.ts","../src/components/ui/action-bar.tsx","../src/components/ui/alert.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/overlay-shell.tsx","../src/components/ui/modal.tsx","../src/components/ui/info-hint.tsx","../src/components/ui/card.tsx","../src/components/ui/calendar.tsx","../src/lib/lookup.ts","../src/hooks/use-lookup.ts","../src/lib/control.ts","../src/lib/masks.ts","../src/components/ui/input.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/picker-panel.tsx","../src/components/ui/color-picker.tsx","../src/components/ui/drawer.tsx","../src/components/ui/switch.tsx","../src/components/ui/data-toolbar.tsx","../src/components/layout/tokens.ts","../src/components/ui/field.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/select.tsx","../src/components/ui/tabs.tsx","../src/lib/sortable.ts","../src/components/ui/image-cropper.tsx","../src/components/ui/image-viewer.tsx","../src/hooks/use-fill-height.ts","../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/timeline.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 { AnimatePresence, m } from 'motion/react'\nimport { Accordion as A } from 'radix-ui'\nimport { useState, type ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionMode, 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 motion = useMotionMode()\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 (motion === 'on') {\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 <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 </m.span>\n </A.Trigger>\n </A.Header>\n <AnimatePresence initial={false}>\n {isOpen && (\n <A.Content forceMount asChild>\n <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 </m.div>\n </A.Content>\n )}\n </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","import { createContext, useContext, type ReactNode } from 'react'\nimport type { ShellLayout } from './layout'\nimport type { NavigationTarget } from './navigation-utils'\nimport type {\n NavGroup,\n NavItem,\n ShellMenuItem,\n ShellNotificationsConfig,\n ShellUser,\n ShellUserMenuConfig,\n ShellWorkspacesConfig,\n} from './types'\n\nexport interface ShellContextValue {\n /** Layout efetivo: padrão interno + prop `layout` do AppShell + escolha do usuário. */\n layout: ShellLayout\n /** Altera uma opção de layout (guardada no navegador do usuário). */\n setLayout: <K extends keyof ShellLayout>(key: K, value: ShellLayout[K]) => void\n /** Altera várias opções de uma vez (ex.: um código de menu M1 a M6). */\n applyLayout: (partial: Partial<ShellLayout>) => void\n /** Volta ao layout padrão do projeto. */\n resetLayout: () => void\n /** Gaveta de navegação aberta no mobile. */\n mobileNavOpen: boolean\n setMobileNavOpen: (open: boolean) => void\n /**\n * Espaço do rodapé fixo da página, entre o conteúdo e a barra inferior. A ActionBar\n * sticky é desenhada aqui: fica sempre colada embaixo, na largura inteira.\n */\n footerSlot: HTMLElement | null\n /** Texto orientativo da tela (PageHeader help): o header mostra o ícone ao lado do título. */\n pageHelp: ReactNode\n setPageHelp: (help: ReactNode) => void\n /** Busca global (Ctrl+K). */\n searchOpen: boolean\n setSearchOpen: (open: boolean) => void\n /** Menu do sistema, recebido pela prop `navigation` do AppShell (obrigatória). */\n navigation: NavGroup[]\n /** Até 4 itens marcados `bottomNav`, calculados a partir de `navigation`. */\n bottomNavItems: NavItem[]\n /** Lista plana de destinos: busca global e cálculo do item ativo. */\n navigationTargets: NavigationTarget[]\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\"). */\n userMenuItems: ShellMenuItem[]\n /** Chamado ao selecionar \"Sair\". Sem ele, o botão não faz nada. */\n onLogout?: () => void\n /** Rótulo do destino inicial na trilha do header. */\n homeLabel: string\n /** Ações rápidas da busca global (ex.: \"Novo cliente\"). */\n quickActions: ShellMenuItem[]\n /** Notificações do sino do header. Sem esta prop, o sino não aparece. */\n notifications?: ShellNotificationsConfig\n /** Submenus Tema, Template e Layout do menu do avatar. Sem esta prop, os três aparecem. */\n userMenu?: ShellUserMenuConfig\n /** Seletor de espaço no topo do menu do avatar. Sem esta prop, não aparece. */\n workspaces?: ShellWorkspacesConfig\n /** Logo que ocupa o lugar do título e da trilha no header, abaixo de `md`. */\n headerLogo?: ReactNode\n}\n\nexport const ShellContext = createContext<ShellContextValue | null>(null)\n\nexport function useShell() {\n const ctx = useContext(ShellContext)\n if (!ctx) throw new Error('useShell precisa estar dentro de <AppShell>.')\n return ctx\n}\n","import { MoreHorizontal } from 'lucide-react'\nimport { useContext, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { ShellContext } from '@/components/app-shell/shell-context'\nimport { Button } from '@/components/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { cn } from '@/lib/cn'\n\nexport interface ActionBarAction {\n label: string\n onClick?: () => void\n icon?: ReactNode\n disabled?: boolean\n destructive?: boolean\n}\n\nexport interface ActionBarProps {\n /** Ação principal: sempre primária (ou destrutiva), 70% da largura. */\n primary: ActionBarAction & {\n type?: 'button' | 'submit'\n form?: string\n loading?: boolean\n loadingLabel?: string\n }\n /** Cancelar: sempre outline, 30% à esquerda. Sem ele, a principal ocupa 100%. */\n cancel?: ActionBarAction\n /** A partir da terceira ação: vão para o menu de três pontinhos. */\n secondary?: ActionBarAction[]\n /**\n * sticky: rodapé fixo das telas de formulário. Fica sempre colado embaixo, na largura\n * inteira, fora da área rolável (nunca sobe, mesmo com formulário curto). Em drawer e\n * modal o rodapé já é fixo; no wizard os botões seguem junto do card. Como o botão fica\n * fora do <form>, use primary.form com o id do formulário para enviar.\n */\n sticky?: boolean\n className?: string\n}\n\n/**\n * Barra de ações única, com a regra de botões do sistema:\n * 1 botão = 100%; 2 botões = cancelar 30% + principal 70%; 3 ou mais = extras no menu.\n * Vale para drawer, modal e formulário em página, em qualquer tamanho de tela.\n */\nexport function ActionBar({ primary, cancel, secondary, sticky, className }: ActionBarProps) {\n const slot = useContext(ShellContext)?.footerSlot\n const hasMenu = Boolean(secondary?.length)\n const layout = cancel\n ? hasMenu\n ? 'grid-actions-3'\n : 'grid-actions-2'\n : hasMenu\n ? 'grid-actions-3'\n : ''\n\n const bar = (\n <div\n data-rendra=\"ACB-001\"\n className={cn(\n sticky && 'border-t bg-card px-4 pt-4 pb-safe md:px-6',\n // Fora do AppShell (Storybook, telas soltas): fixo no fim da área rolável.\n sticky && !slot && 'sticky bottom-0 z-20',\n className,\n )}\n >\n <div className={cn('grid gap-3', layout || 'grid-cols-1', sticky && 'w-full')}>\n {hasMenu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" iconOnly aria-label=\"Mais ações\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" side=\"top\">\n {secondary!.map((a) => (\n <DropdownMenuItem\n key={a.label}\n onSelect={a.onClick}\n disabled={a.disabled}\n destructive={a.destructive}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {cancel ? (\n <Button\n variant=\"outline\"\n icon={cancel.icon}\n onClick={cancel.onClick}\n disabled={cancel.disabled || primary.loading}\n fullWidth\n >\n {cancel.label}\n </Button>\n ) : hasMenu ? (\n <span aria-hidden />\n ) : null}\n <Button\n type={primary.type ?? 'button'}\n form={primary.form}\n variant={primary.destructive ? 'destructive' : 'primary'}\n icon={primary.icon}\n onClick={primary.onClick}\n disabled={primary.disabled}\n loading={primary.loading}\n fullWidth\n >\n {primary.loading ? (primary.loadingLabel ?? 'Salvando...') : primary.label}\n </Button>\n </div>\n </div>\n )\n return sticky && slot ? createPortal(bar, slot) : bar\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { X } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { useBrand } from '@/brand/use-brand'\nimport type { FeedbackType } from '@/brand/types'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { cn } from '@/lib/cn'\n\n/**\n * Alert único do sistema: ícone da marca à esquerda, título em destaque e descrição.\n * O tipo é prop; o formato vem do template ativo (quadrado, meio-termo ou arredondado).\n */\nconst alertVariants = cva('flex w-full min-w-0 items-start gap-3 rounded-control border', {\n variants: {\n type: {\n success: 'border-success/25 bg-success-soft text-success-soft-foreground',\n error: 'border-destructive/25 bg-destructive-soft text-destructive-soft-foreground',\n warning: 'border-warning/25 bg-warning-soft text-warning-soft-foreground',\n info: 'border-info/25 bg-info-soft text-info-soft-foreground',\n },\n },\n defaultVariants: { type: 'info' },\n})\n\nexport interface AlertProps extends VariantProps<typeof alertVariants> {\n type: FeedbackType\n /** Título curto, em negrito. */\n title: ReactNode\n /** Texto de apoio abaixo do título. */\n description?: ReactNode\n /** Ação opcional à direita (ex.: botão \"Desfazer\"). */\n action?: ReactNode\n /** Mostra botão de fechar. */\n onDismiss?: () => void\n /** Anima o ícone na entrada (check se formando, X se riscando). */\n animated?: boolean\n className?: string\n}\n\nexport function Alert({\n type,\n title,\n description,\n action,\n onDismiss,\n animated = false,\n className,\n}: AlertProps) {\n const { shape } = useBrand()\n const pill = shape === 'pill'\n return (\n <div\n role={type === 'error' || type === 'warning' ? 'alert' : 'status'}\n data-rendra=\"ALRT-001\"\n className={cn(\n alertVariants({ type }),\n pill ? 'items-center py-3 pr-4 pl-4 md:pr-6' : 'p-4',\n className,\n )}\n >\n <BrandFeedbackIcon\n type={type}\n size=\"lg\"\n animated={animated}\n className={cn(!pill && 'mt-px')}\n />\n <div className={cn('flex min-w-0 flex-1 flex-col', !pill && 'gap-1')}>\n <p className=\"text-sm font-semibold\">{title}</p>\n {description && <p className=\"text-sm opacity-90\">{description}</p>}\n </div>\n {action && <div className=\"shrink-0 self-center\">{action}</div>}\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Fechar aviso\"\n className={cn(\n 'flex size-touch shrink-0 items-center justify-center rounded-full transition-colors hover:bg-card/60 md:size-8',\n pill ? '-my-2' : '-mt-2 -mr-2',\n )}\n >\n <X className=\"size-icon-sm\" aria-hidden />\n </button>\n )}\n </div>\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 { X } from 'lucide-react'\nimport { Dialog } from 'radix-ui'\nimport type { ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\n\n/*\n * Estrutura interna de Drawer e Modal (não usar direto nas telas):\n * header fixo (ícone, título, descrição, fechar), body como única área rolável\n * e footer fixo com borda superior, respeitando a área segura do aparelho.\n */\n\ninterface OverlayShellProps {\n title: ReactNode\n description?: ReactNode\n icon?: ReactNode\n children: ReactNode\n footer?: ReactNode\n /** Esconde o header visualmente (o título continua para leitores de tela). */\n hideHeader?: boolean\n onRequestClose: () => void\n bodyClassName?: string\n}\n\nexport function OverlayShell({\n title,\n description,\n icon,\n children,\n footer,\n hideHeader,\n onRequestClose,\n bodyClassName,\n}: OverlayShellProps) {\n const closeButton = (\n <button\n type=\"button\"\n onClick={onRequestClose}\n aria-label=\"Fechar\"\n className={cn(\n '-mt-1 -mr-2 flex size-touch shrink-0 cursor-pointer items-center justify-center rounded-item text-muted-foreground transition-colors hover:bg-accent hover:text-foreground md:size-control-md',\n // Sem cabeçalho visível, o botão sai do header oculto e fica invisível (sem clip, para\n // receber clique e foco), aparecendo só com foco de teclado.\n hideHeader &&\n 'pointer-events-auto m-0 cursor-default opacity-0 focus-visible:cursor-pointer focus-visible:opacity-100',\n )}\n >\n <X className=\"size-icon-md\" aria-hidden />\n </button>\n )\n\n return (\n <>\n {hideHeader && (\n <div className=\"pointer-events-none absolute inset-x-0 top-0 z-10 flex justify-end px-2 pt-safe md:px-4 md:pt-4\">\n {closeButton}\n </div>\n )}\n <header\n className={cn(\n 'flex shrink-0 items-start gap-3 border-b px-4 pt-safe pb-4 md:px-6 md:pt-6',\n hideHeader && 'sr-only',\n )}\n >\n {icon && (\n <span\n aria-hidden\n className=\"flex size-control-md shrink-0 items-center justify-center rounded-control bg-primary-soft text-primary-soft-foreground [&_svg]:size-icon-md\"\n >\n {icon}\n </span>\n )}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1 pt-1\">\n <Dialog.Title className=\"text-lg font-semibold wrap-break-word\">{title}</Dialog.Title>\n {description ? (\n <Dialog.Description className=\"text-sm wrap-break-word text-muted-foreground\">\n {description}\n </Dialog.Description>\n ) : (\n <Dialog.Description className=\"sr-only\">{title}</Dialog.Description>\n )}\n </div>\n {!hideHeader && closeButton}\n </header>\n <div\n className={cn(\n 'min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 py-6 md:px-6',\n bodyClassName,\n )}\n >\n {children}\n </div>\n {footer && (\n <footer className=\"shrink-0 border-t bg-card px-4 pt-4 pb-safe md:px-6 md:pb-6\">\n {footer}\n </footer>\n )}\n </>\n )\n}\n","import { AnimatePresence, m } from 'motion/react'\nimport { Dialog } from 'radix-ui'\nimport { useState, type ReactNode } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { cn } from '@/lib/cn'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { useMotionMode, useMotionPresets } from '@/lib/motion'\nimport { OverlayShell } from './overlay-shell'\n\n/*\n * Modal único. Só para confirmações, mensagens e formulários de até 3 campos simples.\n * Mais que isso vai em Drawer (até ~12 campos) ou em página inteira. Nunca modal dentro de modal.\n * type confirm pergunta com ícone de info e ação principal primária\n * type destructive ação irreversível: ícone de erro e ação principal destrutiva\n * type info só informa: um botão de largura total\n * type form até 3 campos no body, ações no rodapé\n */\n\nexport type ModalType = 'confirm' | 'destructive' | 'info' | 'form'\n\nconst sizes = { sm: 'md:max-w-sm', md: 'md:max-w-lg', lg: 'md:max-w-2xl' } as const\n\nexport interface ModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: string\n description?: ReactNode\n type?: ModalType\n size?: keyof typeof sizes\n /** Conteúdo do body (em form, os campos). */\n children?: ReactNode\n confirmLabel?: string\n /**\n * Rótulo do botão de cancelar. Em `confirm` e `destructive` o padrão é \"Cancelar\". Em `info`\n * não há botão de cancelar: o segundo botão só aparece quando `cancelLabel` é passado.\n */\n cancelLabel?: string\n /** Pode ser assíncrono: o botão mostra carregamento até terminar. */\n onConfirm?: () => void | Promise<void>\n /** id do <form> quando type=\"form\" (o botão principal vira submit dele). */\n formId?: string\n /** Estado de envio controlado de fora (ex.: isSubmitting do React Hook Form). */\n loading?: boolean\n}\n\n// Classes do Tailwind do caminho `off`; em `on` o Motion anima e `tw-animate-css` sai.\nconst overlayCls = 'fixed inset-0 z-50 bg-overlay'\nconst overlayOffCls = cn(\n overlayCls,\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0',\n)\nconst contentCls = cn(\n // Mobile: tela inteira. Desktop: centralizado.\n 'fixed inset-0 z-50 flex h-dvh flex-col bg-card text-card-foreground outline-none',\n 'md:inset-auto md:top-1/2 md:left-1/2 md:h-auto md:max-h-sheet md:w-full md:-translate-x-1/2 md:-translate-y-1/2 md:rounded-surface md:border md:shadow-lg',\n)\n\nconst feedback = { confirm: 'info', destructive: 'error', info: 'info' } as const\n\nexport function Modal({\n open,\n onOpenChange,\n title,\n description,\n type = 'confirm',\n size = 'sm',\n children,\n confirmLabel = type === 'destructive' ? 'Excluir' : type === 'info' ? 'Entendi' : 'Confirmar',\n cancelLabel,\n onConfirm,\n formId,\n loading,\n}: ModalProps) {\n const [busy, setBusy] = useState(false)\n const close = () => onOpenChange(false)\n const confirm = async () => {\n if (!onConfirm) return close()\n try {\n setBusy(true)\n await onConfirm()\n close()\n } finally {\n setBusy(false)\n }\n }\n const isForm = type === 'form'\n const motion = useMotionMode()\n const presets = useMotionPresets()\n const { isMobile } = useBreakpoint()\n\n // destructive tem o mesmo formato do confirm (só muda a cor): mesmo código, MOD-001.\n // O desvio fica explícito de propósito: sem ele, destructive só cairia em MOD-001\n // pelo fallback de resolveCatalogCode (o primeiro código do Modal no catálogo), ou\n // seja, dependeria da ordem das entradas em src/catalog/components.ts.\n const code = resolveCatalogCode('Modal', {\n type: type === 'destructive' ? 'confirm' : type,\n })\n const sizeCls = sizes[size]\n const shell = (\n <OverlayShell\n title={title}\n description={isForm ? description : undefined}\n hideHeader={!isForm}\n onRequestClose={close}\n bodyClassName={cn(!isForm && 'flex flex-col items-center justify-center gap-4 text-center')}\n footer={\n <ActionBar\n primary={{\n label: confirmLabel,\n destructive: type === 'destructive',\n loading: busy || loading,\n loadingLabel: `${confirmLabel}...`,\n type: isForm && formId ? 'submit' : 'button',\n form: isForm ? formId : undefined,\n onClick: isForm && formId ? undefined : confirm,\n }}\n cancel={\n type === 'info' && cancelLabel === undefined\n ? undefined\n : { label: cancelLabel ?? 'Cancelar', onClick: close }\n }\n />\n }\n >\n {!isForm && (\n <>\n <BrandFeedbackIcon type={feedback[type as keyof typeof feedback]} size=\"2xl\" animated />\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-lg font-semibold wrap-anywhere\">{title}</p>\n {description && (\n <p className=\"text-sm wrap-anywhere text-muted-foreground\">{description}</p>\n )}\n </div>\n {children}\n </>\n )}\n {isForm && <div className=\"flex flex-col gap-2\">{children}</div>}\n </OverlayShell>\n )\n\n // `on`: o conteúdo só existe enquanto aberto ou saindo (AnimatePresence); o Radix fica com\n // forceMount e o `m.div` entra por asChild, preservando data-rendra e o foco do Dialog.\n if (motion === 'on') {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <AnimatePresence>\n {open && (\n <Dialog.Portal forceMount key=\"modal\">\n <Dialog.Overlay forceMount asChild>\n <m.div className={overlayCls} {...presets.fade} />\n </Dialog.Overlay>\n <Dialog.Content\n forceMount\n asChild\n data-rendra={code}\n className={cn(contentCls, sizeCls)}\n >\n {/* Em tela cheia (celular) a escala do centro perde o sentido: entra de baixo, 8 px. */}\n <m.div {...presets.open(isMobile ? { y: 8 } : undefined)}>{shell}</m.div>\n </Dialog.Content>\n </Dialog.Portal>\n )}\n </AnimatePresence>\n </Dialog.Root>\n )\n }\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className={overlayOffCls} />\n <Dialog.Content\n data-rendra={code}\n className={cn(\n contentCls,\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0 md:data-[state=open]:zoom-in-95',\n sizeCls,\n )}\n >\n {shell}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import { Info } from 'lucide-react'\nimport { useState, type ReactNode } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { Modal } from '@/components/ui/modal'\nimport { cn } from '@/lib/cn'\n\n/*\n * Texto orientativo (como usar a tela, o que um campo faz, de onde vem um número). Nunca fica\n * solto no corpo da tela nem num botão \"Saiba mais\" avulso: é um ícone de informação discreto,\n * ao lado do título a que se refere, que abre um Modal informativo.\n * Onde aparece: PageHeader help (ao lado do título da tela, no header fixo), CardTitle help e\n * FormSection help (ao lado do título do card). Use direto só quando nenhum desses servir.\n */\n\nexport interface InfoHintProps {\n /** Título do modal (em geral, o título da tela ou da seção). */\n title: string\n /** O texto orientativo. Pode ter parágrafos e listas. */\n children: ReactNode\n className?: string\n}\n\nexport function InfoHint({ title, children, className }: InfoHintProps) {\n const [open, setOpen] = useState(false)\n return (\n // Wrapper sem layout próprio (display: contents): o botão é o único elemento sempre\n // presente (o Modal só monta o próprio conteúdo quando aberto), então o data-rendra\n // do InfoHint vive aqui, não no botão (que já carrega o código do Button).\n <span className=\"contents\" data-rendra=\"INFO-001\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Sobre: ${title}`}\n onClick={() => setOpen(true)}\n className={cn(\n 'shrink-0 text-muted-foreground hover:text-primary-text max-md:size-touch',\n className,\n )}\n >\n <Info aria-hidden />\n </Button>\n <Modal open={open} onOpenChange={setOpen} type=\"info\" title={title} size=\"md\">\n <div className=\"flex flex-col gap-3 text-sm text-muted-foreground\">{children}</div>\n </Modal>\n </span>\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","/*\n * Buscas que preenchem o formulário, direto do navegador (APIs públicas e gratuitas, com\n * CORS liberado, sem backend):\n * CEP ViaCEP https://viacep.com.br\n * CNPJ BrasilAPI https://brasilapi.com.br\n * Regra de tela: o campo que faz a busca vem primeiro (25% da linha) e os campos que ele\n * preenche ficam abaixo, para a pessoa saber da busca antes de digitar o resto.\n */\n\nconst digits = (v: string) => v.replace(/\\D/g, '')\n\nexport interface Address {\n cep: string\n logradouro: string\n complemento: string\n bairro: string\n cidade: string\n uf: string\n}\n\n/** Endereço do CEP (8 dígitos). null se não existir; lança erro se a busca falhar. */\nexport async function lookupCep(cep: string, signal?: AbortSignal): Promise<Address | null> {\n const d = digits(cep)\n if (d.length !== 8) return null\n const res = await fetch(`https://viacep.com.br/ws/${d}/json/`, { signal })\n if (!res.ok) throw new Error('Não foi possível buscar o CEP agora.')\n const data = (await res.json()) as Record<string, string | boolean>\n if (data.erro) return null\n return {\n cep: String(data.cep ?? ''),\n logradouro: String(data.logradouro ?? ''),\n complemento: String(data.complemento ?? ''),\n bairro: String(data.bairro ?? ''),\n cidade: String(data.localidade ?? ''),\n uf: String(data.uf ?? ''),\n }\n}\n\nexport interface Company {\n razaoSocial: string\n nomeFantasia: string\n email: string\n telefone: string\n situacao: string\n endereco: Address & { numero: string }\n}\n\n/** Dados públicos do CNPJ (14 dígitos). null se não existir; lança erro se a busca falhar. */\nexport async function lookupCnpj(cnpj: string, signal?: AbortSignal): Promise<Company | null> {\n const d = digits(cnpj)\n if (d.length !== 14) return null\n const res = await fetch(`https://brasilapi.com.br/api/cnpj/v1/${d}`, { signal })\n if (res.status === 404) return null\n if (!res.ok) throw new Error('Não foi possível buscar o CNPJ agora.')\n const data = (await res.json()) as Record<string, string | number | null>\n const s = (k: string) => (data[k] == null ? '' : String(data[k]))\n const fone = digits(s('ddd_telefone_1'))\n return {\n razaoSocial: s('razao_social'),\n nomeFantasia: s('nome_fantasia'),\n email: s('email').toLowerCase(),\n telefone:\n fone.length >= 10 ? `(${fone.slice(0, 2)}) ${fone.slice(2, -4)}-${fone.slice(-4)}` : '',\n situacao: s('descricao_situacao_cadastral'),\n endereco: {\n cep: s('cep'),\n logradouro: [s('descricao_tipo_de_logradouro'), s('logradouro')].filter(Boolean).join(' '),\n numero: s('numero'),\n complemento: s('complemento'),\n bairro: s('bairro'),\n cidade: s('municipio'),\n uf: s('uf'),\n },\n }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { lookupCep, lookupCnpj, type Address, type Company } from '@/lib/lookup'\n\n/** Resultado da busca embutida no Input (CEP e CNPJ). */\nexport type LookupResult =\n | { status: 'loading'; kind: 'cep' | 'cnpj' }\n | { status: 'found'; kind: 'cep'; data: Address; message: string }\n | { status: 'found'; kind: 'cnpj'; data: Company; message: string }\n | { status: 'not-found'; kind: 'cep' | 'cnpj'; message: string }\n | { status: 'error'; kind: 'cep' | 'cnpj'; message: string }\n\n/**\n * Busca CEP (8 dígitos) ou CNPJ (14 dígitos) assim que o valor fica completo. Cancela a\n * busca anterior quando o valor muda. `kind` 'auto' decide pelo tamanho (CPF ou CNPJ: só\n * o CNPJ busca). Sem `onResult`, não faz nada.\n */\nexport function useLookup(\n kind: 'cep' | 'cnpj' | 'auto' | undefined,\n value: string,\n onResult: ((r: LookupResult) => void) | undefined,\n) {\n const [loading, setLoading] = useState(false)\n const cb = useRef(onResult)\n cb.current = onResult\n const digits = value.replace(/\\D/g, '')\n const target =\n kind === 'cep' && digits.length === 8\n ? 'cep'\n : (kind === 'cnpj' || kind === 'auto') && digits.length === 14\n ? 'cnpj'\n : null\n const enabled = Boolean(onResult) && target !== null\n\n useEffect(() => {\n if (!enabled || !target) return\n const ctrl = new AbortController()\n const send = (r: LookupResult) => {\n if (!ctrl.signal.aborted) cb.current?.(r)\n }\n setLoading(true)\n send({ status: 'loading', kind: target })\n const run =\n target === 'cep'\n ? lookupCep(digits, ctrl.signal).then((data) =>\n data\n ? send({\n status: 'found',\n kind: 'cep',\n data,\n message: 'Endereço preenchido pelo CEP.',\n })\n : send({\n status: 'not-found',\n kind: 'cep',\n message: 'CEP não encontrado. Preencha o endereço.',\n }),\n )\n : lookupCnpj(digits, ctrl.signal).then((data) =>\n data\n ? send({\n status: 'found',\n kind: 'cnpj',\n data,\n message: `${data.situacao ? `Situação: ${data.situacao}. ` : ''}Dados preenchidos pelo CNPJ.`,\n })\n : send({\n status: 'not-found',\n kind: 'cnpj',\n message: 'CNPJ não encontrado. Preencha os dados abaixo.',\n }),\n )\n run\n .catch((e: unknown) =>\n send({\n status: 'error',\n kind: target,\n message: e instanceof Error ? e.message : 'Não foi possível buscar agora.',\n }),\n )\n .finally(() => {\n if (!ctrl.signal.aborted) setLoading(false)\n })\n return () => {\n ctrl.abort()\n setLoading(false)\n }\n }, [enabled, target, digits])\n\n return loading\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\n\n/**\n * Moldura única dos campos (Input, Select, DatePicker, Textarea). Mesma altura dos botões\n * em cada tamanho; fonte de 16px no mobile para o iOS não dar zoom ao focar.\n */\n/** Marque o elemento com data-slot=\"control\": o teste de toque mede a moldura, não o input. */\nexport const controlFrame = cva(\n 'group/control flex w-full min-w-0 items-center gap-2 rounded-control border border-input bg-field text-base text-foreground transition-[border-color,box-shadow] duration-150 focus-within:border-ring focus-within:bg-card focus-within:ring-2 focus-within:ring-ring/25 hover:border-foreground/40 has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-60 has-[:disabled]:hover:border-input md:text-sm',\n {\n variants: {\n size: {\n sm: 'h-control-sm px-3',\n md: 'h-control-md px-3',\n lg: 'h-control-lg px-4',\n },\n invalid: {\n true: 'border-destructive focus-within:border-destructive focus-within:ring-destructive/25 hover:border-destructive',\n false: '',\n },\n },\n defaultVariants: { size: 'md', invalid: false },\n },\n)\n\nexport type ControlSize = NonNullable<VariantProps<typeof controlFrame>['size']>\n\n/** Classe do <input> nativo dentro da moldura. */\nexport const controlInput =\n 'h-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed'\n\n/** Botão pequeno dentro da moldura (limpar, mostrar senha). */\nexport const controlAdornmentButton =\n '-mr-2 flex size-control-sm shrink-0 cursor-pointer items-center justify-center rounded-item text-muted-foreground transition-colors outline-none hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring md:-mr-1 md:size-8 [&_svg]:size-icon-sm'\n\n/**\n * Reserva, dentro de um gatilho, o espaço do botão sobreposto (limpar do Select e do\n * DatePicker), para o texto não passar por baixo dele.\n */\nexport const controlAdornmentSpace = 'size-control-sm shrink-0 md:size-8'\n","import type { FactoryArg } from 'imask'\n\n/** Máscaras disponíveis na prop mask do Input. Cada uma já define o teclado certo no mobile. */\nexport type MaskName =\n 'cpf' | 'cnpj' | 'cpfCnpj' | 'phone' | 'cep' | 'date' | 'time' | 'currency' | 'percent'\n\ntype InputMode = 'numeric' | 'tel' | 'decimal'\n\nconst numberBlock = (scale: number, max?: number) => ({\n mask: Number,\n scale,\n thousandsSeparator: '.',\n radix: ',',\n mapToRadix: ['.'],\n padFractionalZeros: true,\n normalizeZeros: true,\n min: 0,\n ...(max !== undefined ? { max } : {}),\n})\n\nexport const masks: Record<\n MaskName,\n { options: FactoryArg; inputMode: InputMode; placeholder: string }\n> = {\n cpf: { options: { mask: '000.000.000-00' }, inputMode: 'numeric', placeholder: '000.000.000-00' },\n cnpj: {\n options: { mask: '00.000.000/0000-00' },\n inputMode: 'numeric',\n placeholder: '00.000.000/0000-00',\n },\n // CPF até 11 dígitos, CNPJ a partir do 12º: a máscara troca sozinha.\n cpfCnpj: {\n options: { mask: [{ mask: '000.000.000-00' }, { mask: '00.000.000/0000-00' }] },\n inputMode: 'numeric',\n placeholder: 'CPF ou CNPJ',\n },\n phone: {\n options: { mask: [{ mask: '(00) 0000-0000' }, { mask: '(00) 00000-0000' }] },\n inputMode: 'tel',\n placeholder: '(00) 00000-0000',\n },\n cep: { options: { mask: '00000-000' }, inputMode: 'numeric', placeholder: '00000-000' },\n date: { options: { mask: '00/00/0000' }, inputMode: 'numeric', placeholder: 'DD/MM/AAAA' },\n time: { options: { mask: '00:00' }, inputMode: 'numeric', placeholder: '00:00' },\n currency: {\n options: { mask: 'R$ num', lazy: false, blocks: { num: numberBlock(2) } } as FactoryArg,\n inputMode: 'decimal',\n placeholder: 'R$ 0,00',\n },\n percent: {\n options: { mask: 'num %', lazy: false, blocks: { num: numberBlock(2, 100) } } as FactoryArg,\n inputMode: 'decimal',\n placeholder: '0,00 %',\n },\n}\n\n/** Máscara de percentual com teto configurável (padrão 100), para o Input com unidades (A9). */\nexport function percentMask(max = 100) {\n return {\n options: { mask: 'num %', lazy: false, blocks: { num: numberBlock(2, max) } } as FactoryArg,\n inputMode: 'decimal' as InputMode,\n placeholder: '0,00 %',\n }\n}\n\n/** País para o seletor de DDI do telefone. */\nexport interface PhoneCountry {\n /** DDI sem o \"+\", ex.: \"55\". */\n ddi: string\n /** Nome em português, mostrado na lista. */\n name: string\n}\n\n/** DDI padrão do campo de telefone. */\nexport const DEFAULT_DDI = '55'\n\n/** Lista padrão do seletor de DDI (Brasil primeiro). Troque com a prop ddiOptions do Input. */\nexport const phoneCountries: PhoneCountry[] = [\n { ddi: '55', name: 'Brasil' },\n { ddi: '54', name: 'Argentina' },\n { ddi: '56', name: 'Chile' },\n { ddi: '57', name: 'Colômbia' },\n { ddi: '595', name: 'Paraguai' },\n { ddi: '598', name: 'Uruguai' },\n { ddi: '52', name: 'México' },\n { ddi: '1', name: 'Estados Unidos e Canadá' },\n { ddi: '351', name: 'Portugal' },\n { ddi: '34', name: 'Espanha' },\n { ddi: '33', name: 'França' },\n { ddi: '39', name: 'Itália' },\n { ddi: '49', name: 'Alemanha' },\n { ddi: '44', name: 'Reino Unido' },\n]\n\n/** Máscara do número fora do Brasil: só dígitos, em grupos, até 15 (limite do padrão E.164). */\nexport const internationalPhoneMask = {\n options: { mask: '000 000 000 000 000' } as FactoryArg,\n inputMode: 'tel' as InputMode,\n placeholder: 'Número com DDD',\n}\n\n/** Número completo no padrão internacional: toE164(\"55\", \"(11) 91234-5678\") = \"+5511912345678\". */\nexport function toE164(ddi: string, national: string) {\n const digits = national.replace(/\\D/g, '')\n return digits ? `+${ddi}${digits}` : ''\n}\n\n/** Converte \"R$ 1.250,00\" ou \"12,5 %\" em número. */\nexport function parseLocaleNumber(masked: string): number | null {\n const clean = masked.replace(/[^\\d,-]/g, '').replace(',', '.')\n if (!clean) return null\n const n = Number(clean)\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * Moeda em centavos inteiros, sem erro de arredondamento de ponto flutuante:\n * \"R$ 1.250,50\" -> 125050. Vazio -> null. Use centavos para guardar e somar dinheiro.\n */\nexport function toCents(masked: string): number | null {\n const d = masked.replace(/\\D/g, '')\n if (!d) return null\n const hasDecimals = /,\\d{1,2}\\s*$/.test(masked.replace(/\\s*%$/, ''))\n if (!hasDecimals) return Number(d) * 100\n const [int = '', dec = ''] = masked.replace(/[^\\d,]/g, '').split(',')\n return Number(int || '0') * 100 + Number(dec.padEnd(2, '0').slice(0, 2))\n}\n\n/** Centavos para o texto do campo de moeda: 125050 -> \"R$ 1.250,50\". */\nexport function formatCents(cents: number) {\n return formatCurrency(cents / 100)\n}\n\n/** Formata número como moeda brasileira: 1250 -> \"R$ 1.250,00\". */\nexport function formatCurrency(value: number) {\n return value.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' })\n}\n","import IMask, { type FactoryArg, type InputMask } from 'imask'\nimport { ChevronDown, Eye, EyeOff, X } from 'lucide-react'\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ChangeEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { Button } from '@/components/ui/button'\nimport { Spinner } from '@/components/ui/spinner'\nimport { useLookup, type LookupResult } from '@/hooks/use-lookup'\nimport { cn } from '@/lib/cn'\nimport { controlAdornmentButton, controlFrame, controlInput, type ControlSize } from '@/lib/control'\nimport {\n DEFAULT_DDI,\n internationalPhoneMask,\n masks,\n percentMask,\n phoneCountries,\n toCents,\n type MaskName,\n type PhoneCountry,\n} from '@/lib/masks'\n\n/** Uma unidade do seletor embutido do Input (A9). */\nexport interface InputUnitOption {\n /** \"percent\" e \"currency\" ligam a máscara de percentual e de moeda automaticamente. */\n id: string\n label: string\n}\n\nexport interface InputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'onChange'\n> {\n size?: ControlSize\n /** Máscara brasileira. Define também o teclado do celular (inputMode). */\n mask?: MaskName\n /** Ícone à esquerda. */\n icon?: ReactNode\n /** Conteúdo fixo à direita (ex.: \"kg\", \"dias\"). Ignorado quando `units` está presente. */\n suffix?: ReactNode\n /** Mostra botão para limpar quando há valor. */\n clearable?: boolean\n /** Estado de erro (normalmente vem do Field). */\n invalid?: boolean\n value?: string\n /** Recebe o valor como aparece no campo (com máscara). */\n onChange?: (value: string) => void\n /** Recebe o valor sem máscara (só dígitos, ou número para moeda e percentual). */\n onValueChange?: (unmasked: string, masked: string) => void\n /**\n * Telefone (mask=\"phone\"): DDI escolhido no seletor embutido à esquerda, sem o \"+\".\n * Padrão \"55\". Com +55 a máscara é a brasileira; com outro DDI, só dígitos.\n * O valor do campo continua sendo o número nacional; o completo sai de toE164(ddi, valor).\n */\n ddi?: string\n onDdiChange?: (ddi: string) => void\n /** Países do seletor de DDI. Padrão: phoneCountries (Brasil primeiro). */\n ddiOptions?: PhoneCountry[]\n /** Esconde o seletor de DDI do telefone (só números brasileiros). */\n hideDdi?: boolean\n /**\n * Moeda (mask=\"currency\"): recebe o valor em centavos inteiros (R$ 1.250,50 -> 125050),\n * ou null quando vazio. Guarde e some dinheiro sempre em centavos.\n */\n onCentsChange?: (cents: number | null) => void\n /**\n * CEP, CNPJ e CPF ou CNPJ (mask=\"cep\", \"cnpj\" ou \"cpfCnpj\"): busca os dados assim que o\n * campo fica completo (ViaCEP e BrasilAPI), mostra o carregamento no campo e entrega o\n * resultado. A tela decide o que preencher; use `result.message` como ajuda do Field.\n */\n onLookup?: (result: LookupResult) => void\n /**\n * Unidades (A9): seletor embutido à direita, no mesmo padrão do seletor de DDI. O id\n * \"percent\" liga a máscara de percentual (teto configurável por `percentMax`); \"currency\"\n * liga a máscara de moeda (R$ 1.250,00). Qualquer outro id não aplica máscara, só rótulo.\n * Trocar de unidade sempre limpa o valor do campo.\n */\n units?: InputUnitOption[]\n /** Unidade escolhida (controlada). Sem ela, usa a primeira de `units`. */\n unit?: string\n onUnitChange?: (unit: string) => void\n /** Teto do percentual quando a unidade escolhida é \"percent\". Padrão 100. */\n percentMax?: number\n /**\n * Variante de valor guardado (A10): mostra `maskedHint` no lugar do valor real, que nunca\n * chega a existir no DOM. \"Trocar\" abre um campo vazio (`isEditing`); cancelar volta à\n * máscara. O componente é controlado pela tela: `isEditing`, `onStartEdit`, `onCancelEdit`.\n */\n variant?: 'secret'\n /** Há um valor salvo (mesmo sem mostrá-lo). */\n hasValue?: boolean\n /** Texto mascarado mostrado no lugar do valor, ex.: \"••••••a1b2c3\". */\n maskedHint?: string\n /** Campo aberto para digitar um valor novo. */\n isEditing?: boolean\n onStartEdit?: () => void\n onCancelEdit?: () => void\n /** Remove o valor salvo. Sem essa prop, o botão \"Remover\" não aparece. */\n onRemove?: () => void\n /** Remoção em andamento: desabilita e mostra o carregamento no botão \"Remover\". */\n removing?: boolean\n className?: string\n /**\n * Classe extra no próprio elemento `<input>` (className vai no quadro em volta). Uso raro:\n * hoje só o texto riscado de um item marcado no Checklist.\n */\n inputClassName?: string\n}\n\n/**\n * Input único. Tipos, máscaras, ícone, limpar, senha, unidades e valor guardado são props:\n * nunca crie InputCPF, InputTelefone, InputSenha ou InputSegredo.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n size,\n mask,\n icon,\n suffix,\n clearable,\n invalid,\n type = 'text',\n value,\n defaultValue,\n onChange,\n onValueChange,\n disabled,\n className,\n inputClassName,\n inputMode,\n placeholder,\n ddi: ddiProp,\n onDdiChange,\n ddiOptions = phoneCountries,\n hideDdi,\n onCentsChange,\n onLookup,\n units,\n unit: unitProp,\n onUnitChange,\n percentMax,\n variant,\n hasValue,\n maskedHint,\n isEditing,\n onStartEdit,\n onCancelEdit,\n onRemove,\n removing,\n ...props\n },\n ref,\n) {\n const inputRef = useRef<HTMLInputElement>(null)\n useImperativeHandle(ref, () => inputRef.current as HTMLInputElement)\n const maskRef = useRef<InputMask<FactoryArg> | null>(null)\n const [showPassword, setShowPassword] = useState(false)\n const [inner, setInner] = useState(String(value ?? defaultValue ?? ''))\n const current = value ?? inner\n // variant=\"secret\" em edição: o campo nunca deriva de `value` do consumidor (o valor salvo\n // não pode aparecer nem acionar o \"Limpar campo\"); o rascunho é próprio e abre vazio.\n const [secretDraft, setSecretDraft] = useState('')\n const [lastIsEditing, setLastIsEditing] = useState(isEditing)\n if (isEditing !== lastIsEditing) {\n setLastIsEditing(isEditing)\n if (isEditing) setSecretDraft('')\n }\n const cb = useRef({ onChange, onValueChange, onCentsChange })\n cb.current = { onChange, onValueChange, onCentsChange }\n const lookupKind =\n mask === 'cep' ? 'cep' : mask === 'cnpj' ? 'cnpj' : mask === 'cpfCnpj' ? 'auto' : undefined\n const searching = useLookup(lookupKind, current, onLookup)\n\n // Telefone: seletor de DDI embutido. Controlado pela prop ddi ou interno.\n const isPhone = mask === 'phone'\n const [innerDdi, setInnerDdi] = useState(ddiProp ?? DEFAULT_DDI)\n const ddi = ddiProp ?? innerDdi\n const showDdi = isPhone && !hideDdi\n const intl = isPhone && ddi !== DEFAULT_DDI\n\n // Unidades (A9): seletor embutido à direita. A unidade escolhida decide a máscara.\n const hasUnits = Boolean(units && units.length > 0)\n const [innerUnit, setInnerUnit] = useState(unitProp ?? units?.[0]?.id ?? '')\n const unit = hasUnits ? (unitProp ?? innerUnit) : undefined\n const unitMaskName = unit === 'percent' ? 'percent' : unit === 'currency' ? 'currency' : undefined\n\n const def = intl\n ? internationalPhoneMask\n : hasUnits\n ? unitMaskName === 'percent'\n ? percentMask(percentMax)\n : unitMaskName === 'currency'\n ? masks.currency\n : undefined\n : mask\n ? masks[mask]\n : undefined\n const maskKey = !def\n ? undefined\n : intl\n ? 'phone-intl'\n : hasUnits\n ? `unit-${unitMaskName}-${percentMax ?? ''}`\n : mask\n\n // Máscara: criada uma vez por tipo de máscara, sincronizada com o valor controlado.\n useEffect(() => {\n if (!maskKey || !def || !inputRef.current) return\n const m = IMask(inputRef.current, def.options)\n maskRef.current = m\n m.on('accept', () => {\n setInner(m.value)\n cb.current.onChange?.(m.value)\n cb.current.onValueChange?.(m.unmaskedValue, m.value)\n if (mask === 'currency' || unitMaskName === 'currency')\n cb.current.onCentsChange?.(toCents(m.value))\n })\n return () => {\n m.destroy()\n maskRef.current = null\n }\n // A máscara só muda com o tipo (maskKey); def acompanha o maskKey.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [maskKey])\n\n useEffect(() => {\n const m = maskRef.current\n if (m && value !== undefined && value !== m.value) m.value = value\n }, [value])\n\n const isPassword = type === 'password'\n const country = ddiOptions.find((c) => c.ddi === ddi)\n const isSecret = variant === 'secret'\n // id e aria-* que o Field injeta no controle (não removidos de props: o <input> normal\n // continua recebendo pelo {...props}). No modo leitura do secret não há <input>; sem\n // repassar para o botão Trocar, o Label do Field fica apontando para um id inexistente.\n const {\n id: fieldId,\n 'aria-describedby': fieldDescribedBy,\n 'aria-required': fieldRequired,\n } = props\n\n // Esvazia o valor (máscara, estado interno e os callbacks): usado por \"Limpar campo\" e\n // por trocar de unidade, que nunca deve carregar o número de uma unidade para outra.\n const resetValue = () => {\n if (maskRef.current) maskRef.current.value = ''\n setInner('')\n setSecretDraft('')\n onChange?.('')\n onValueChange?.('', '')\n onCentsChange?.(null)\n }\n\n const clear = () => {\n resetValue()\n inputRef.current?.focus()\n }\n\n // Trocar de unidade sempre limpa o valor (a máscara muda junto).\n const changeUnit = (id: string) => {\n setInnerUnit(id)\n onUnitChange?.(id)\n resetValue()\n }\n\n // ---------------------------------------------------------------- variant=\"secret\" (A10)\n if (isSecret && !isEditing) {\n return (\n <div\n data-slot=\"control\"\n data-rendra=\"CAMP-001\"\n className={cn(controlFrame({ size, invalid }), className)}\n >\n <span className=\"min-w-0 flex-1 truncate font-mono text-sm text-muted-foreground\">\n {hasValue ? (maskedHint ?? '••••••••') : 'Nenhum valor salvo'}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onStartEdit}\n disabled={disabled}\n id={fieldId}\n aria-describedby={fieldDescribedBy}\n aria-required={fieldRequired}\n >\n Trocar\n </Button>\n {hasValue && onRemove && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n disabled={disabled || removing}\n loading={removing}\n >\n Remover\n </Button>\n )}\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"control\"\n data-rendra=\"CAMP-001\"\n className={cn(controlFrame({ size, invalid }), className)}\n >\n {showDdi && (\n // Seletor nativo transparente sobre o \"+55\": no celular abre a lista do sistema.\n <span className=\"relative -ml-1 flex h-full min-w-touch shrink-0 items-center gap-1 border-r pr-2 text-sm font-medium\">\n <span aria-hidden>+{ddi}</span>\n <ChevronDown className=\"size-icon-sm text-muted-foreground\" aria-hidden />\n <select\n aria-label={`Código do país (DDI): ${country?.name ?? ''} +${ddi}`}\n value={ddi}\n disabled={disabled}\n onChange={(e) => {\n setInnerDdi(e.target.value)\n onDdiChange?.(e.target.value)\n }}\n className=\"absolute inset-0 cursor-pointer bg-popover text-popover-foreground opacity-0 disabled:cursor-not-allowed\"\n >\n {ddiOptions.map((c) => (\n <option key={c.ddi} value={c.ddi} className=\"bg-popover text-popover-foreground\">\n {c.name} (+{c.ddi})\n </option>\n ))}\n </select>\n </span>\n )}\n {icon && (\n <span className=\"flex shrink-0 text-muted-foreground [&_svg]:size-icon-sm\" aria-hidden>\n {icon}\n </span>\n )}\n <input\n key={hasUnits ? `unit-${unit}` : undefined}\n ref={inputRef}\n type={\n isSecret\n ? showPassword\n ? 'text'\n : 'password'\n : isPassword && showPassword\n ? 'text'\n : type\n }\n inputMode={inputMode ?? def?.inputMode}\n placeholder={placeholder ?? def?.placeholder}\n disabled={disabled}\n aria-invalid={invalid || undefined}\n aria-busy={searching || undefined}\n className={cn(controlInput, inputClassName)}\n {...(isSecret\n ? {\n // \"Trocar\" sempre abre vazio: o valor salvo nunca chega a existir no DOM.\n value: secretDraft,\n onChange: (e: ChangeEvent<HTMLInputElement>) => {\n setSecretDraft(e.target.value)\n onChange?.(e.target.value)\n onValueChange?.(e.target.value, e.target.value)\n },\n }\n : maskKey\n ? { defaultValue: current }\n : {\n value: current,\n onChange: (e: ChangeEvent<HTMLInputElement>) => {\n setInner(e.target.value)\n onChange?.(e.target.value)\n onValueChange?.(e.target.value, e.target.value)\n },\n })}\n {...props}\n />\n {searching && (\n <Spinner size=\"sm\" label=\"Buscando…\" className=\"shrink-0 text-muted-foreground\" />\n )}\n {hasUnits && (\n // Mesmo padrão do seletor de DDI, à direita: rótulo visível e select nativo por cima.\n <span className=\"relative -mr-1 flex h-full min-w-touch shrink-0 items-center gap-1 border-l pl-2 text-sm font-medium\">\n <span aria-hidden>{units?.find((u) => u.id === unit)?.label ?? unit}</span>\n <ChevronDown className=\"size-icon-sm text-muted-foreground\" aria-hidden />\n <select\n aria-label={`Unidade: ${units?.find((u) => u.id === unit)?.label ?? unit}`}\n value={unit}\n disabled={disabled}\n onChange={(e) => changeUnit(e.target.value)}\n className=\"absolute inset-0 cursor-pointer bg-popover text-popover-foreground opacity-0 disabled:cursor-not-allowed\"\n >\n {units?.map((u) => (\n <option key={u.id} value={u.id} className=\"bg-popover text-popover-foreground\">\n {u.label}\n </option>\n ))}\n </select>\n </span>\n )}\n {!hasUnits && suffix && (\n <span className=\"shrink-0 text-sm text-muted-foreground\">{suffix}</span>\n )}\n {clearable && (isSecret ? secretDraft : current) && !disabled && (\n <button\n type=\"button\"\n onClick={clear}\n aria-label=\"Limpar campo\"\n className={controlAdornmentButton}\n >\n <X aria-hidden />\n </button>\n )}\n {(isPassword || isSecret) && (\n <button\n type=\"button\"\n onClick={() => setShowPassword((s) => !s)}\n aria-label={showPassword ? 'Ocultar senha' : 'Mostrar senha'}\n aria-pressed={showPassword}\n className={controlAdornmentButton}\n >\n {showPassword ? <EyeOff aria-hidden /> : <Eye aria-hidden />}\n </button>\n )}\n {isSecret && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancelEdit} disabled={disabled}>\n Cancelar\n </Button>\n )}\n </div>\n )\n})\n","import { AnimatePresence, m } from 'motion/react'\nimport { Popover as P } from 'radix-ui'\nimport { createContext, useContext, useState, type ComponentProps } from 'react'\nimport { cn } from '@/lib/cn'\nimport { 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 motion = useMotionMode()\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 (motion === 'on' && open !== null && !asChild) {\n return (\n <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 <m.div {...presets.open()}>{children}</m.div>\n </P.Content>\n </P.Portal>\n )}\n </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,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAQAElEQVR4AexdB2AcxdX+Zveq7nTqvdmybMld7gWMTTPVNs000zsECJAQINQEAyaGEAgk8AMhCUnoBBJqKKYZDNgY9y6r95N0/U5X9n9vbQm1k+6kkzEk6x3tzsybN2/mffPmzczdWcKP8FIUZaS3veGqVvvWv9Y1f7xub92Ljdsq/uDYsPsez7rtN7av2Xpl4LMN54VWrTtZWbXuJIXf12y5MrB2243tG3Yv92wtf9RRVvt8Y23zB+tabJv+SryuUBTPyB9hV+FHAQC3t/r6xtbPV+2sftr69dbrAh99c3LZ6o0XP7Z+103nbqt4YOre2mfT6prfNlttaww213at21MttwdahYIAFATB78RDtru3a622Lw311nfN5XV/T9te8bup3+7+5bnE64+rvjmz7Mut1wZ2VD5hrW/5ZJXNvfe6HwMgfnAAUJTWRLe37mdNrV9+tKvyqdbVm84PfbH58t9uLrtvQXXDa8kOzx6ZlSqEiJl+hGBeIbg8e+WapjeSt+5duWDt1qsf+nTDstD2isdaG1s/W+V0V1+nkGwxq/QAMfpBAIBMusbprvlFnfXjbRt3P2L9auvVD2wqWz6/qun1RF97ixDiwDeD6/QH7KK2+Z3EzWX3L/hq21UPfbNzpZWmja1Od+XPWeYDpMMhVXPgey5CcbkDne6qnza0fL5xa/mD3m92/vx+GnklVvtaKaS0R8jlQJIpsDk3SdvKHxq7dvsNKzfuucdbb/14o8tb+RNuy4GUJJq6DkoAOFx7flXR8Jp1S/kDv9tavnJiQ8vHciDoBA31aNr2vdCyjCHFB/IlZALDxI277320vP7FZptr5+3fi0ADVHrQAIBGic7h2vXYnuq/eDbvXXnHnuqnLS5PGRQlMEATDt5s9kU8vhqU1TybsHnPfb/eVfWku9Wx+ffc1oNF6oMCAG2unbfuqHrcvrFsxVUVDS8ZuNN4JEXSSdSZCIRC5MkH4PH74PR5YPO60epxwupyoNll7xU4vdXthM3jgoPo3e0+eAN+BIJBApyihkjqjpSG2+LzN6Oq8XUj+QtXb6942N7i2HRrpOWHg66D5/cKAJe37ri9dc83bt37wPLaprf0vvZGkos9bnqEuYOhILz+dthJyc1OO+odbai3t6Le2YZGp42U7VAV30IKZhC0kZJ7Bk7nfCvRMECaqFwj8alztKKOeDURaLgMA8O/HxRhxIkyWcAfaEOd9X391r0PLt9T85dGh6dqfpRMYkr+vQDA5XJl11tXrd+059dvlte9kOb11YVtVEgJwRdoByuElVPVZt2nJFJ+KynX4fPATSOfQeELBNAeDJBFCCJIViGkKAgXgsQ3QGBiBfuoDFsADwHL2e5VLQMDo55AUWOzosbWogKLAREkvmGFjThDoN1vRUX9q2mb9/x6VU3j26tdrqbsiIvHkPCAAoDMtcbpqXimrOGRyu2Vfyh1e6uF0sccT3SkdD9ayITXtLWgWlWAXTXXrGA/KY4VqNA2Tgz7opOVQm8hAk+A6uH63ASwVppS9gGwGQ1kbZw+rwoylpXIB3mH4PHVi13VT87dWfNwZatz69PETzNIZoMqdsAAoCi+iXUtHzWt33nrBU2ta+RQyNNLYO50Nu3VNOoq25phdTvgodEfpFHHeb0KHMAEUgwYdAwIm8etWqGqtia00DTCVmQoooRoWdvq2Chv3HXXReQnNCmKt3Ao/KIpe0AA4PU2X7ut4o/rt5c/mOgP2Ei+EAWhOlusWB85YE1k0vc014HNrodMMXc4j0QiPChvtj7t5B9YCaR7WxpQS1bK5fPSlBNS28X5kQvOfo+CIA2K3dVPJW7a8+AOp6fugsjLD55yWAFASpScnsp3vt1z2+/qrR/IADcUagfxqOZ5lx2wytYm1Ws/mBWOAS72HWrsLaq/wO/cPmo/TVLRtkqg2bZGs2HnLX9qc+x4YYBqh5w9bACgxuut9m+2rN12wzFub42qeUojlIfUJRcvxXjU2Mibj7aLhtzqYWTA1otXJXW2VjAQAsGQCvhoq/QFrOKbnb84vY62v6nf9NGWj5R+WABAAsfXNL1bsXH3nSUh2hWjOEI0j3v9fnVeZ2eqzetCkDzxSAX9IdExoNl3aaBVBFs4FQjkUHI/RNeOELaVrywpr3+pQlGa4qMr2zd1z9SYA0BRWvJpaVexu/rJDJDJ50azk9RGI73JZVOXcwHqDPzILo0kQSvLkLscTLF/w8pvctpVZ5GnPO4PRHUJlNf+PWN39WsVDkddWlRFIyCWIqCJmMThqxu3s+rFHRX1LyeFyLPlxqodQBsrbPK5AyJm9gMiNOn0SDVZkGZKQKrZgiSjCTpZ09kCBnwb7VmwNeDlJMc7MyN4URBCdeObSZVNz5c5HBXjIigSMUnMAOBub55ZW//a+rrm9wwhMvs86q37Fe+izRWF3KGIpfqBESYb42ExxMGsNyCBnslx8UihYNTqurWEB0ALLRubaX+D+6db5gARBUE0tn5sLm98br3bXTVzAPKIs2MCAK+3saiy7sXP6ltW6YKkfDftrbO5byXUt9MuW8TS/EAJdRpNN8llSVLBkBxnhqEHCPQaLeIoTRKqX4xoLgZBs+1L3Z66v39m81YVRVM2HO2QAUBbmFkVja9/S8s8rT/oVud4Vj7vlLEzFK7iH1O6lzarerZHCEGK1iOerIK83y/Q07SQbk5AvMEIWRpc1yu0c0og0NbUvrze5SrP6llvtPHBSbG/Fprj9Y1tH26ta37H5A96ydFxUHDSNm5gP8V/x6ORnLwQbR33bK0QggBghH6/hUjY7xsIco570kYTVwgEDW2fmGtbP9jMOoimbE/aQQOAKpZrre/vqGh4MdEXcNNhiV0d/UFa7vWs5Mce99M010gnikoffg6PflmiPTDqBJ1GQ39jczMIqhvfSK5seHUr62KwXAcNgDbnZtL+wwVeUn4TjQAbLfNCfYyCwQr2QyvHZxi8+RPsMQBIOejol6GO/J59opAl2FPzTGFT6+r3e+b1jIeLDwoAbm/tTzfuuXs+H782k6fPS71wFfw3pXM/VNIBES/5+HyDg5XOCviDKtwPPcHBaUMPAlvKH5jf6txx/WB4RQ0An+IYv7Xi4QddPrvgkc/O3mAq/rGW8dMBUSNNBxWtTeDAKyFF2ecOMxD2vcW29YoSFDsqHl7p89WNj5ZzVACghshV1a981tS2QeY1vpvOyaOt8L+NnvcC4vVGdWPI7vOoH1YZjj5we6vksrqXP2UdRcM/KgBYbV9/trv2+cQW2sxw0Vo/mor+W2l5lzAjPhG8UyiR98++AilpWLqjzvpuUr11VVT+gBSpJB5f7bIt5Y/MstKc5iAkR1ruv52ON8XYUuppA0iWJLS6XXD6vIM6IRy4LwV2VP5+vs25+7yBafdRRAQAQqx2b90rT9TbqoWDhN9X9H9/I+kBt78dVpeTgh3sH/BSsdltBwNjOPyBkBIQFXUv/kFRFG0k8kUEgMa2L1/cUfOWqc3rjITn/2h69ADvFPL8H9x//M1AYEvqosFEiupB3XeU6SJdRVjtX5nqrO//uW9O3VMHBADv82/a+6clVpd1mMxWd4H+W2LegF/dPGslf2ogxbLy+UyFHe/QfhD11098ZlDZ8MqZdu+eMf3Rcd6AAKi2fvp2Tes2EfgRnuFzB3yfgZXKy0ReNrJTHU65bDma6QTRQb6XzeOOaCC6vXVSk/WLNwdqX78AsLn3/HRjxYtFHr97ID7/yx9kD7ByWbH8MTL++HsbnaDyBpKftpcZIE6fB1VtVrjoSD1I+wl2invIrxi4uhBqm98tsto3/Lw/2n4BsLP67eXNjr39lf9fXox6IEim3UuKbaJNpMq2ZnUTiT8sW2dvI+fxu8M1BgeDxE8bTgNV7Q+0oaFl1Z390YUFgNW567o9DR+YQ0qwv/L/y4txD/DKQKGRHtofeNXQswoXbcDZva6IpgJr29fmVtvmsL9mEhYAlQ2rb21zVfas+3/xg6AHGCBO2ojjqYDf+xPJH7Sh2fHVreFo+gRAq63s3N31b6eEK/S/9O+/B3gqYN+Bp47+pRFobP0kxebc0efmUJ8AqLNvWG517Bb9M/5f7vfdA+wYutvbB5wKvL5m0eLYcHdf8vYCQJuzduHOmn/n9UV8oNIkoYFG0kMrG6HXxiNOn6YGgzYBWk0cZMkAIfjDFTxjHiipwtcjCS00sgE6ks2oS4HJkAGTPh0GXaIqr0bSQxIsL/OIncyBUEj9wqyflug9pwKuqSMIIdBg/TDP6d17TEdax7MXAOye8luaHTsO6OgXENR5ZqRZxqMk92RMGrEMk0eeh1IKUwovxLRRl1C4FFMKL6K08ynvXEwuOBtjshchyTwK3PkdDToQTyEk6AmMmUmlGJd7KiaPOIfCPnmnjrpYlXVqEct7Icl7HiaPPFdt01hqW5plgtpWAQmxuNzkEPLqYSBYuX11wuEsv7lnnb2kKG/8eG4g2Pubuz0LxiIu0chJiS/B9KIrMLf4Bswt+Zn6nDXmGkq7HFNHXYrJI87DuLxTKZyiduLUwosxo+hyzCq+Zh89lZlTfD3lL6WRlw5B/zAslwJJyEhPGI8pIy/aV3fxzzCn5AbMHPMTkvcyAuglmJB/OsbmnoRxpOxJBcswtfASyrsCM0dfjTkdbSSZOZ6eMAGSpB2StDzybV63eszc14rhO+YhNLWtmftdfN9bNwA43DVn7G34UAcIDOclqCPTLOMwa8zV1JE3qIodk7MImUmToNUYI6xa0CiMR27KTOrwk6mjL8KhY28iC3ISpSdGyCNSMoFEUyHVcTEp8XoC5TkYnXUc0hLGQiPrI2IihFDbxm0sprZOHHGWyovBm5U0DZLomCIiYteNiC0AB1o5dkvvGWmxf6NzuPee0TVd6hqxOvfc5Glv6ZoU83ejLhkT8s9UlTU29xRkJ0+FRjZACDHouoSQaPSnoSDtMBqFF2Pe2JuRmTgFAt2ah+gvHvUa4nsoDhv/S0woOBOZZPZ1WjOEGLy8LIcsaYnXZJTkLFEHwVSa3uINg/uUN5t/tgIh2kxi3uECf/3c7t51U9f8zh4iU2LcWfv25K6ZsX0XSI0vwWHjbgXPk2kJ46CNeLRHJokQAvHGTIzMWIDDJ96FnJQZpCg5ssJ9UGlkE1mn8zBv3C3ITCwly2JBrC+2IKmWYkwkv+fwSXeTRZs9KJk9tIvIVgD9XEII1LesmkS67kRvJwBcnobLa5q/6Iz3wyfqLEEjMYtG+pGT70Ne2lwYtBZqZKcMiPUlSRoCQjaB4NfUobOI/WDqUmjevoosyvlkXci3oM4jRsN26zQmZCROxIKJd6IocyFkiWZiRHfZvAP7bnbHVtnlKf9pB2ep46XNXb7EF7B3RGP4FMhKmoqjJ9+PhLhcapg2hrzDsxJCgKebowh0lrjoTWvpiIvAzicrJnwtsc1hJzNOl4rDxt+K0dnHQyInOZoaeF9g9zlEwgAAEABJREFUoDMCPip2eCuWdPDtBEBty7elgECsr2Raph039XekjEQIEXv+/ckrhAAr8IxDXqGnpT/SLnkK+SXTMav4qgMG1i6Vq33EPtH88bdhRPphBAJN1+wB3/mMoH8igVb7JtL1PiqJHzQnxO9teC+B32MZ4vRpOGH6o9BoDLFkGzUvSdJi6SHPk0L1A5Y16JJwdOn9RCcofL/3kZPuQSY5ndFI0eZxd34RJVw5q+2LBEVpUfWtAsDuqbu4xbknpi3WaeIxf/wdiNOnhpPjgKabDekYn3cKaN80bL1CyDhy0n1kLeLD0hzIDEnSQJ3CjDkRV8tnA/x5w/4KtPttwu5qvJBpVADYnHvPEEJ95bQhBwEJxbTWzU+bg4PpmkobSyZDRliRMhMnIyV+FCSaOsISHeAMI1mkabTxpZWNEdfsbO/fGWRdu721qh+gar3O9u1kIHYGIMlciIn5Z+FguzTUiePzTyMjwCvnHtLRLspE2l7WaxMoI3Z9QcyGfBdmHIERGQuITx9yU2rP20VHxfybTD3Tu8Ztzq2lHJdo/tdWNX0es0lalnS0YXIWjPpk5n9QBUlokJ92GHhU9RQsjfYlLHE5EDG0hD3rGGyc+5S3leNohRAJj1BIgSfg75fUal9LfoCiJwsQmGV3V8cM8snxReRFTwUL3a8E30OmEAIm8knG5JzYq/YiWnZZaK4VEL3yvu8EQaC0GHNRSPsD5MQMKA6fCbjpkKg/Qp+/VQQCjhmSx++e3h6I1ef9hbpHHqdLgRAHX0dyh+hpEyoneWavaSDekAmeIpjmYAwa2jUtzDgcOo05IvE8tDNI1j0sraIEQSCYLnl9jTP6IwzLoY+MOBpd6QkTDuqOBAQYBCbDd7+4xo5fnJ5Bi4P24k0iszELfHral5A90wLBAPr7KL8QAr721gmSw9MwVojYjNaU+NHg+VWI2PDr2ahYxIUQ4CVhfuphnezyUufBEpdP8YNXbhKOttATkEOnnwpCHO038KBuDwT6pfEFmkdJTm9DZr9UEWYqdBKVSSdwRrICOMgvoy4FOcnTOqVMiMujzo10p7Cz2AF/0chGpFrGQCubBqybIeIjK9AfodfXVCg5PfXx/RFFmqelwwxLXDYJF7MFRaRVR00nJAmSrCU/IKQGmhUAsgw4yC8hBHSk/Dj9wCsshZa17QOsBLz+RovkaW+TY9Funle1hNBY8IqEh9/vR2trC8rLy7B27ddobGxEe3tk/52cAP9jf5oAwOaUOmtfSv81B4NBOJ1O1NXV4Ztv1qGsbA9cLieBKLL1ef/cI8uVZT30Gt6rGJh+oM8K0ipAI7UHWmMCAK0cB5mEG1isoVM0NzfhxRefw6GHzsTixcfh6qsvx733/grr16+PmLlOY4ZJn0FedTw0JPtABV0uFz777BNcdtkFWLhwPs4//yxce+2VeOWVFwcqGtN8LQ2yuAgsAFfKVqA/R7Dd36aTPP6WmABAIxsgi+jPsFnQaILT6cBjjz2CBx+8H7IsQyJzPnPmbIo/jFmz+Ow/Mm4G2mLluT9On0rzf0K/hdiyfPLJR7jvvl9j8+ZNEEIgISERK1Y8iHPOuUCN98sghpmypIVWExcRxxBZNj4bCEfsD7okqd3vlsIRRJMuSzpIdHgRTZloaUOhEN5889949923Edjv4ep0OowePZrAoImKnY4Oq0y09jdqE6HT9r+2rqqqxBtvvI6amprOOg499DBkZWVRm2PSfZ18B3wh8PGScEA6IlCgIEh9Rq993sGQR0ghxd9nZvSJXN3wzoU85//978/C4bB3ikcgJzCwz9uZRC8KvF4vgv14wVoypUayArKshyy0VKbv2+fz4euvv1TNvxCik8hPGy0MyM4EemGT6yffhF6H7VZCQQSCvk7+/b1w3/QHgEDQRvazPw5R5AVD7VBC/a87o2DXJ+lXX32pKl+I7xTRTgcfmzZ9i9ra2s4yLS0teO+9d9HQ0NCZ1vOFrZVMyu+Z3jPe0mLF++//B6zcrnnr1q3F7t270GGJguQgbtz4Lb76ak1Xspi/+0n5nnZbRHxZ5v4AwEwkjRzXc/hwetTBH3DTzlNkyIyaORUIkSn7+OMPVc+fop03p2/fvg3Ll99Jc/JyPPDACtx99514/PFHCQD1nXQ9XyShgUbSqYrtz245HA5s2NDbuWRg/OEPv1fr+uMff4+77roN999/D15//VWVZ8/6YhUPBD3w+tsiYsc2mf2AcMQa2RKSdLKxv/aHK9sr3R9wkckdPgDwSLPZ2jpHXIcAQghamjlUE/3SSy/ghRf+gQ8+eI8sQg3JEx7bCi3/FNq88gcZuN4Odr2eCtlRrrtXBiUwMFjhf/vbX/Cvf/0TmzZtpCVibS8ZiTRmNwPA44v8o/shamO4ymUpTpF0Wkv4XgpXso90RqXP7yD0x4RdrxpCNPcBAkIIhLv8NC/znM35Qgii5be+g0IWJRjyw+1rpj1xW99EEaSyBWIrwUBhco5z4PdYB5bX4a2PwgKA3MDwUrD1l+J0qZHtnoTno+aElACa7NtJuO8cNDUjRn9kmb38EAEsMoOlEPIVGr3hqg+Sz8Kj3+Wtg8ff/4jqh0039lxfIBCEJoa/Ct61Aq/fhqrmL6gPIhxkCpXuR3idNqldMupSvEQWk7veth4eGlExYdaDCXdqVlYO9Hp9j5y+owaDsV9F+AJ2ODzsONIyjjpKCTNWhBDQasOvErrWzkvSkpKSYVsatvvtqG9dT5ZNdK120O96bYpXMhnSI/MoBqxGoM1ZThbARgilHh2QPjoCIQSOOOJoJCcPvA/OnKdPn4m0tO+OfDmta/D4rGhz7aXOJABwRpiREh9vxqRJE5hiwGA2x+OYY44nnrFRUNcK/eT8VTR9Ck+7tWvykN4NmuQ2yWxIrx4Sly6F2axur34tpkJ2YY/S0ilITU0bsIPZShx77PHIzs7tWrzznU21h8y+jQDAifVtG+H0NvJrr5CRkYWzzjoPPLp7ZfZISE5OIhmn9kgdepTldXkbsKWSt533gSsirkxKAyccrV6fVi3F6ZP3cAXhiKJNr2z+HDZ3FUJKMNqiA9LzCDvttNNhsSSEpRVCYNq0GSgsHNUvUBRFUL5O5VPe+JFqDRSlt+Xirea8vAKUlk4leqHS9/XHZDLjoosuQ1xcZNu0ffEIlxYIerG54kUCafhlbV9lWVoB0VeWmqbVJm6S4gwZa8KTqHRR/fGRo7Kx/O/wtsdoZulR+5Ilp+L4409EfHzvU2xZllFSMg7nnHO++uxRtDPaHnDC5iqHEPtazjI7PHW0bdreSdP1ZcyYYjoEugpjx46DLO+fMroQmEwmnHjiYpxwwuIuqbF7raJBta36VWK4T156ifgO9xF3Brtem7FaMmgT3qOlYMQMIyGsbPoMFY2fREIaNQ07gz//+c1kls/F4YcfiZycXJoWUlXlsBKuvfZ6zJ17aKdy0eNSyNmze2qwq+6tbjl76t8jp7CuT/9FCIHp02fghht+oSp5/PgJap1c94IFR6iy3HTTrQQOuRvPWETqW7/FFzseIosa/S6rgIAkegMWdAkhw2xMXkMAERXJ5lG9bR8RDfYO0ZLwm7KnyWPdMFgW/ZZjr/yqq67BbbfdhSuvvIZG55W4/vobccstd6jKl/rZ4VZoeeii+b51//zfUVFNy5eobVlLHe3vSOr2ZJ4zZszCL395h1rXZZddhauuuha33/4rXHPNdf2uOLoxChNRaPrxBxywu3bBaluH5ravUNfyCb7Z81jUpr+jCiEEZEmgr8tkzAsKYaxQ4ZGbOnvwOyF9cac0J21YfLH9t2i276BY7G+JlJyWlo7Fi0/CmWeeg9mz56rzrxB9N3ifBApt/DSBzamA2nR0XILiWypfomWstU8rALqEEFSHCXz8fOaZy7Bo0RJaaaRDiP7qpIJhbla6l7z66sY3safmGeyqfqpb2F31FJRAFfj/GkyJi4dZF92nrVgsWerezg5REuLGOvhdzc1InPht/3tGTBp9aLRvwZc7H0WrsyL6wsNQgjvc6thNmymr++Te4tytmlvebu2TIIaJQdqIqqh/GbuqHkd5/QuoavwX/6wrWhybYXWUocFWhmZnDdqDfkikSaNWh+Q4M9JMFvB7JKJIENBIcp+kCeaxpHNA4lxLXP7roWHw2pl3TctX+GrX78FLLY5/n6Gd9v3X7X6i3xFe1rAKn29/gDyFmM6K3ZrNZn7r3gdI6a+hqe1LWjU1oNHRilpbC+rtreBfD+f/T6DF7QAHq8uBJpcdnMaf92elxmn1pN5ubHtFhBCQ+/ABFJoG4wzZr4OufQAwGp5JMY8elhYrBCx2Cldv+w121nZ3vKj+A3grWLXpdtqu3jZAnQrJ+Tbe/eZ6AkqEW64DcOyaXdXwb2zZu5IUvwZWZz2q25pR72iDzeuCs90L/h9G2oP7PtPPvwPIgT/b5wv4wd/5YxoX0XF8IIVJDIA+pgBa/ikWU/ozLJcKACGSbaMyj7ZxwnCEEDmFdtcebKt4Eut3/wa1ze/D7i4Lu+waDhnW7Pg9qpo+j4h1SPGjkvbc31x7FS1nY9ctlQ2vkrl/npagVahsa1JHtSfQTsfoQbI4EYmmEoXIYezvo15MJOiPjs5PhOA3inS5UxNm21jnnKQCgF8yk6Z8G2s/gBGYZUlCUWomRiSnwaIPos3+GXZUPoJ126/DZxuX4dudt8Pra6LRNhCeWcrBBAUfbboLG8r/Sh5+MGIGClmuGloVPPfpSfim7BkqG4q4bF+E9dZVqGr4F2paq1BByucRHCJF9kUbizQhBHQabZ+ski3s8+3LkvY9gART/gc6jaUjOqSngECS0YxRKZkwkefK7QzSca7PT2bM54WTAs9l7QE3rRLW4/Mtl5JZfAABmqMVJh5S7VxYQSgUUEfvm2uvxo7aNzHYqz3gwNpdf8Q/PjkR63b/H1y0hGwPuEhWH4E2RKE3cLkNCs2zQTpu9tMevsNdjQpS/l7rLth87n5FkSUdks2jYNKnE52gMLhbkA7YAvQuLWA2FKjzP+d1AsBsyHgwJ2U6tYZuzhlk4FHP/09eUpwJ/INFLeTAlLc0oszaoCK/xt6CWgpVNPdx2l7Kq7M3k3n+EGu2XEvnCI2q8gZTvULgCQR9tNSzYnfdu3jtywtRbf2KWA2tTQpCquLX7vk/PP/pySrfL3f+nvYNvqGprFrdQHJ46unJoY6eteRr7MC2qn9i1cY78PGmn2Jn/VfqHE7CdLtZZpCytLIJiaYRmFtyAxbNeEIFAYZwCSGg02h6cUgwjwuZjCOe6MiQOl6EEJ7i7BP3gITBIC+JPE7+DxI15Hg0O+2oaG1Ei8cJnq/CqSBEI4UtAs+Juxo3kTX4Bcoa3kdd67dosm1VO5hHXIhMskIK7ioax0M00t10ssfLu/q2b7Gl6iW8te5afLzlbvKuK4k8XM2UNYg7EPLRsrYMmyufx7/XXoYXVp+GF+cvY9wAABAASURBVD47DS+uXrovfLaU4qfin2vOxert96PG+ika7dXk3PnQ9WLZBSSYDOnITp6OGaOvxOKZT6I4+yTUNVTB5mzEUKZkHW2La3osAbnOrOQF21nXxFy9OwHAsaT4oseMumR+jToIKmHS6VWT2OBsA//fNtF2fXswiLLmrfh0y114i0z3+xtupnX577C16hUCxQeooOPQCt5m7gyfYHf9f7Ce5uiPN/8Kb5Pi1+x4mNbROxEix5NEGtZbQKL2BhEkUATI1Ksh5O1St6B1fADsxaPbJZBqGQP+FbDpoy7D0aUrMCH/DCCoV79x9I+XHiIQ7O1WIpqIIGIjLRPp0e2WJQNMptFPdk3sBgCLMefhkemH+weDPEabQiO0lUY8m/6ulXS8cz6HjnhfT85vV5dBXtg9tShvXIU1Ox/GBxtuxXvf3rQ/3ExPDjeBl3abK58jk7uNphz+bZxoYdeXFMOTZtKnoSBtHopzTsSckp+pP2Q5Nu9k0HkM+EOm7733H/zmN/eivG4tZF3kDmtvaQV4n6BnerJlit9iLHy4a3o3AJBpUEZkLFitkY1daSJ6D5Hy3X4fLWnCecsCSeaRGEONT4kvhizpaPQoEfAWNCkJolNoZPnV0RakUcYhpI5yzuNAJAfRrVB/cDAZ0kFLbJSOOA8zx1yDeeNuxfzxtyGHzL5WE6f2AX/H8Omnn8Bjjz2M7du3w5Qg0HMAR9M0rSxD32P+F5CQljx3NesYXa5uAOD0JHPeXSnx0W8K8TzPIGAe4UKcPhXj85di1phrMZvCtFGXoiTnJLDXKwktdUY48ITjeHCls8IlIRPQR2Fs7knqvD57zE/peRWmFV2O0VnH0ZyfCkE0LDl/eeXzzz/DI4/8Fq+++rL6ieKEFAFLsoAkCQz2iqOpmM9KupY3GjIUk7Hgjq5p/N4LAPHGvI+Lc0+qEhCcH8OgwO6uotOuauSlzsK4/NNRWngBdc4V6og4avK9WDDhLhUcY7IXkUdcCCH2zbHcsTEUJGasFCVEoA0gLWEcJhWcS6P7Zhw56R61PTPIqSsdeR6N/oVIiMuDRtaDRl9n3fwt49/9biVWrrwXH330Idxut5qXO1qGJUUiWjU6qD/xekO3cgpZo4zko6vI/H/aLYMiEoVed1b8pNuS42N7RMyVuMlb/+jzl/Dppx/B3+6HVjaArUJ64kSMSJ+P0dnHqb/PO6PoCurIu3H8tEdxzJQHCRh3YkbRT1CUeTSSTCOpXBxC5P0rpAAcgKujHoM2CZmJk0nZZ5Oyb8HC0pU4ccbjWDD+DpSOPBfFOYswMuMIZFB74sjayTTNCSF6SfjOO2/i+uuvxmuvvYqysjJqy3eWLyldhtHUu0wvJmESdLT7p9fouuUa9WlKQvyEW7ol7o/0CYCkhMJnizKPj92nD/dXFqI52+rahD+/sBzXXXcVVq36AB4PO24gxEuQJS10GhPMxgykkJeckzyDnKbDUJR1DCbQ1DG7+AYsJEAsnvkUTpnzV5w4/Q8UfwBHTLyb1s83YkrhxaSExchPPURVQkJcAajxxFdHQUP+g6szKEo7pXF9ZpgNmUiOH03LsakozDiaFHwuWaJrVL4LVSX/ESfN+hNOnPFH1XGbUngRxmSfoII2J3kWlS2iepKhIUAL0WeXgq+ysj244YZraNTfp36FrGPUcx6HpHQJKVkSZA3HBhcSDHGQuoFOQUbSgvpk89h/9MUxrLT5qYfewx3YV6GhpMWnBBHSNOCLNatx000/o7P8U/D00493msAO3gL0jxoiSRrqWD10WjNMhjSaGvJBPgrSEyYiJ2UmRqQdhlFZCzE+71RMG3Wx+h9RHEXLqhOmPaaC5MxDX8K5C96h8B9cfNSaznDhkZ9S2rtYdti/sfSQF3DSzKdx7JSHScF3YuaYKzGx4GyVb0H6YcghIKYnTAT7Kpa4HBh0iSSTASybEAIDXTU11bj99ptx4YXL8OGH76OpqYmmju4OMFlpZBZISCUACDEwz3B1WggAXfO0mkQaTDN6zf0dNGEBkJIw6ncF6Yc5Owhj9dRoBUZN0iC7UILX68HevWV4+OGHcOSR83DJJeeRSdwzYFVCCAjBQaKnBHa8JAKKLOlIMXqaIozQkoet05ig05ih11r2hwR6dg0W6LTxYDot0Ws1RmhkA5iPLGmh8hWyWocQXJ8YULauBLW1Nbjvvrtx2mlL8Prr/0Rra2s3c9+VVmcAkjNlGExS1+So3i16I2Spa3kFaQkz2xIt454Kx6grdS+aMZnHLk80jeiVPtSElEwJaTkyJPk7Ti6Xk8zilzjllBNxwglHqWayoqIcLpcL/AMNoVDoO+KD8E2hIRygI1t27jZt2qBat6VLF+O5556lNgw8jnKLZIwYJxPYBt+4nqNfp0km83/4tf1xlPrLTE0suX9c7kmVsqRDLC9JFhg/W4vskb0bzIquqqrCX//6DE49dRHOPvs0dX28bt3XqnVoaKiHjw6TuMNjKdNgeLEMDNDq6irs3LkDL7zwHJYtW0qm/hy8/fYbcDhY8WJA1jRwkZEvw5LUWx0DFt5PYCYTotdo98f4ISEr9ejdSQkTn+VYuDBgjQUZR5+RrK4IBm5IuEr6SrckSxg5XkMmT/SaD0GXELSN2t6uThF/+tOTuPzyi3DFFRdhxYq78dZbb2D9+nXYsmUTqqoqwaOOlUHFhv32+Xyor6+jDZutYFC+/PILuPnmn+Oii84h2Zar8raT3NEIklkgq9MiD4xoynXQstNnMRjBz440oy5NSUuZe0JHPNxzQAAkxGWumVp4ybta2Ug8ujsulDDom/SL4ulajBgrQ9b0Dy4hBAKBAHV8PT744H3cccctuPLKS9Sl1D33/Ap/+cvT6tez//Ofd2iJ+bEKDva4bTabOn1ECw6m9/v96pzNI5t/IYRXLDyqn3/+b/jtb3+DG2+8Hj/5yWXg3yriH4bgbwgL0X87enYWzRrqAMgv0cCSLPfMjjhuoo0fAy39hNhXvxAy8jOXvm4xjNo5EBNpIALOpzX66YWZR/kEBi8k+rj0BoFJ83Tg5U8f2WGThJDU5WN9fT1Wr/4Ujz/+GO6881b86le34957f03+wwo8+uhDtLp4As8++2cyzf8Aj9TXXnuFnLFX8e9/vwb+zZ+OwHF20jif6V544R/gKeippx5Xd+l4f3758rvUOh588Ddk3t8E+ycdS9iwgg6QIWugev5FkzXo5rsNUK5rtiwkxNMcIkvfqTIpvrQ9O3Xh6V3pwr1/VyocBaULIRylhecvj9OnUiy2dwp5vpMJBATgQTEm2cCBfQeHww5ecm3evBF8sPLMM0+qCly58j71l0NWrlyhPvlXRB544H567xpWqMBhGqbn7VkGAf862I4d22np1kirFq8qI9envgzxT1y8wPiZWtr4iUgNfdbWc/RLQouRWctuJhn9fRbokRhxzUmmEcvnjbtlKxC7aYBlEQIYM0WD6UfqoIRix1sIAUGjo8Oc86YLA4SnBV6O8elbR2htbYHN1kZOm50sixts/rmcEIJFHJYgkTGdMFeLvGINBlsN7/p1H/0KxuRfuT7BPPqhSIWOGADMsCB93vTJBee5Yg0CmXyACXN0KJ1PIIgdBljkgzbkF8sYO0MLbvtghGRomvUGGLRaAhDHgMyUo1xZKUcdEg2/qAAghPBMLjrvmMzEyTFXk94oMPVwHUaX0tCIpgU/QNr4JIHZxxmGZPoNWh3MtPSTyMqBrjh9rpKbvnQh64iiEd9RAYC5xmmTVy8Yf+d9+hh9gJR5dgSjWVI7pnCipiPpR/fkc/4TLjQiOUOikYuwV38ZGnL42PTzup8UTny0GFtw/XJLXM7n/ZXrK0/qK3GgtMT4EbcunPqb9QJiINKo8gWx47PwucfraV3847MEpDcsvsSIZNoJ5bZikJeRUMQAEII6DCGMG3nD+oT4MXcMht2gAMAVZSdNnzNvwu0NEq05Y+kTCCHA5+GHLDKgeJoGbOF4vcx1xiqwg8eB+ckQ0FIlOgp6SQYH9Z3jFDreDV3ymF4WgkpSyyMUjqe4Ey42qjt+QggM9jKS6U+JM0OWJGIhoTDngob0xEMG/f/zMRdiFP0thPCNzZlXPLXwUpesbhXHzi0Q1D/xiTQdHKvHRPKUaZ8jegHDlGCFxtOaM0mjR77BjEOTsnBGZhGuzJuAnxVMxq0jp+HuollYMWZOZ/g1xW8tnI4bR0zBtfmTcH52CY5OyUOhMQHJWgMssg4MEKlLnQwwIQR0Og0SU2UsXGZA7igZQhJdqKJ71RAI+fsWOtryFUJGbtqitoKMI4sF6SI6Tt9RS9+9Rv8mRLJtQt6S0pLck72ypCcGsQMBMYOZQDDjaB2mLNCBpwaJpI1wwHFxNbAiWOkppKhcgxlHJufi0txxuKVwGm4mZZ+dNQbzkrIxzpyMAqMFGfo4JJKJjZO14GCiJ8fTdUbkUfnRpkTMSEjHyemF+MXIKbhj1HT8JH8ijk8tQHFcEtINJqQmpyA3Nw+jiwsx9/AxWHwxxUfLkGSBwV6SEODTPhONBiE0SE+a78pJWTKOdTBYnlxO4j9DCQZD+u4JBefMLc5e5NfEeLuY5TLESerqYN4SPUaM04AcX06OKCRoaFURl4jDk/cp/eYRU3FSRiFKTElI1OohU6dGxCgMEe9bmONMKC4YiVNnH4ZbT1iK28+6GDffcCPuvvc2XHf7IsxdLBCf6oEkDV75XL2ZAJgUZyY+OqQmzPGPyjqt1GRKq+O8oQRpKIU7yiaZctZPGXXh0UWZxwY1koGSY2sJeK1cMFaLQxbxlKBDeh6J3U9/mmQNiknxx6bk4/ycEpycPhIjaXRrJSqH6C62IByo5yGb4mDIzkR88Sgklk5A6tzpyDzmcOSdvhiFFy9DybWXYs7VF2DcITnw6L/E7qaX9n85Jbo6e1KbaNSnmuKhkXVISZgRHJF91tEGQ97unnSDiUffI2FqiTdmfTxtxCWTxuad6hwOEAgBWOgEceYxOsyhVcL4WVokkzfddUogEmTrTTiCRvzpNK/PT84Gm24hOKe74KxUNYRCYB5Cp4Mm3gxdegqM+TmILylC4pSJpOQZSD/iUGQdezhyTjoO+WcsQcG5SzHyorMw6srzkX/WyUg7dBaMI3LQhkpsqXoRX+54GNuqXoXPb8dQL3b6+NtWWrJmGcmHuUaknTkh3pj38VD5dpSPGQCYYXx81tZJuWcXTh11SatGtQScGtsgywK5RRoccqIeh5JFmHOsGccsmYGzz16G85edj5+ccxGWnX42pp14HLKPno+Mo+Z1hsyFC9QRm3X8kchZfAxyTz4eeaTQ/HNOwYjzlmLE+adjxHkU9j9H8pPCyPPPQMGyU5GzaCFSZk1FfNFIGNJTIev1UGgZVtW8But2P4HPtz+IdXueQrNjh5o+mJZ3LcPKTzNZYCCHNS/9pKbcgqUFFsvI7V1phvoeUwCwMASCpimFiwoix/J/AAAHbklEQVQOGfeLCqD3yEOMLq2egDBaQ9vHGkw41IPx89yYd0Ie5iw9CqNOW4TcU07oFXJOOR45pHQeyTlLjkU2BQZC9vFHIePIeepITpleisTxJTAXFsCQmQ5dYgJkgx5CljslZ8thc1Wqo/yzrSvw5c7fY2P5P9DQthHBkK+TbigvBvL0U+LiodNoMCrngqpROefnWESudSg8+yobcwBwJUKkOUpylhQunvHEu0ZtosJpwxGEAGRtEF5UoN71MbY3/wOfVq7A6tqHsN3+FtrkWogEI7RJidAlJ6nK1CVaoLXEQ2M2QWM0QNJqIckyhBBhRWSF+/wO1LWsx/qyP+ODjbdS+CW+3v04tte8DiuN+ECITwrD8wjLvI8MHvmpNPLN+nhlUtHt7+VlnDRCCBHR6V4f7PpNGhYAcI0kcCg7Zdqxi2c+dV128vQgbZlw8rAF/lUPt68RjbbN2FP/Pr4p+xPe33AL/vXVpXjv25vw2baVpLynUVb/ARpaN8LmqoLT2wSPrxXedgfcvhY4PI1oc1ai1roWu2vfxloy659suRfvfHM9/v315fhw0x3YsPev2NvwIZrs2+Fpt5L/EIppm+K0evDIT08YG5wy+v7r0hNn8/5+bCvpIvGwAaCjjqT4kY8cMflXU6YUXtQ23CAA9o3AUMhPDpgNdk8Nmu3bUNH0CbZXv0YA+As+2Xov3v32Z3j960vwzzXn4pU15+CVL87Eq1+cg9co/q+1l+K9jTfjs+0rsaH8b9hZ+waqrF/A6tgJh7cWvoAdISWAfde++va9D/2vqnzy9otyTm0aN+qWKQnxRY8MnWv/HIYdAFy9WZ+5aebon2ScMPXRzw26hGGbEriurkF0AIIUFqS52R90q8DwtLfSyLfSqG+Gy9tAlqABLrIebhrRHp+VLEIb0dnBX/cOhtpplJMBI8Yd/Oi1z5v35/mUrs/MARLNOgOyE7OUacW3vVecd1km99kARWKSfUAAwJLSlNCelz73kJNm/eWKkpzFbkloOfkHGwRJLiDA27PJtEGTFZ8EX9APr7+dciK/JSGQFGfBhLwT3DNLVl6RmTRvWE1+T8kOGAA6Kk405f3f/Al3JCwsXfFyirlIkYSmI2tIT0GltbIMDrKQ0BEk6mAOQggIouFAj4hvphdUknnIxFcjSTDSmpz35LMsici2JIF/D6HO0Yr2QMfUEBl7raxDXnKxcmjJrf+cXHRLgsVU+H+RlYwdlRQ7VpFzEkIERmQsWHpc6SOlM4qurIw35gDUyRjCxfMK/xdpGkkGf0Q6heZSDqm0lGKnKoVGaaLRRHlxYHPL8y1726zMrsFAyuV0E+2+sUlPoDLMJ8OciCxSdpYlGWlmi7o8s3s9qGqzwuHzRCW5IOpEU5Yyp/jK3fMmrSjNST/qFO4TSj7g9/cCgI5Wms0ZG6eMuqBgYen9Z08asazJbMjqyBrUk3+fwEMmuNXjQpPThjZ68g8vMjg0kgZxNM9aDHFIJnCkkxJZqRnxieCQSaOZQxY/yZynk8JTCDwWvRFGWiqSguAL+ImnE/U02hscbeoPOypg7pGKq8BsSMekEWc3LZy0Ytm4/PNGm/V5GyMtPRx00nAwjZZnWsLY5+aWXJ9+TOlvLp1edEVTomlktCx60bNa2oMBVUnNLruqtDp7K1hxjaS8Jqdd/elV/hErBkzXwD/PymUaCUQc6u1tann+uVaHz4v2YDAqtfPqh63c1MKLmo4pXXnpnJKfpScnTHiul9DfQ4L0PdQZtsq0xHFPTS+6NP3oyfddMmvMT9vSLGMhS3pwB9KfId8hJUTKC8BLI9nl96mm2+51w+Z10cj+Ltgojc26m2iYln/kKcQHBlFJoECStEgyF2JG0VVtR09eccnMMVenpyVOCPtFzajYx4j4oAJAR5tSLKOfnlJ4XtIRk+65bt7Ym9sK0ubDoEvuyD7Inwr5BybkpMzGISU/b1tYuuK6aUWXJKUnjnv6YBRcOhiF6pApyVzwcEne4qRjp/42ftH0Jx44fMLddflphyg6TTyRsJGnx0FyayQDcpKnKQsm3Fm1eOaT9504/a748fmnJSWZRz18kIjYpxgHNQA6JCYHzJliKbyxOPf47MOKb8s+ZfZfVhxT+sDWsbmnBszkOO7bmTuQgFDU3UCTPg1jchYHjpx077bT5v7t/sPHLc8uyV2Sn2op/qUQ6c4O+Q/m5w8CAF070GxOr080F9wyMvOI8fMn/FJ78uy/nnD6IS+/dsTE5c3FuYuVZHMRtBqTWkSJ0lVTC/X4wzw48AhPNBWgKOtYZf6EO5uXznnhtVPmPLvoiIl3akdnHzMu0TzyZpatR/GDPvqDA0DPHjUZkt9KtYw+eUzO8WmHT7hTOnnW3+aee/jbVy+b/8bjp8z+83sLJ6/YPnvMdc2TCs51js4+wVuQdog/M2lSMNE0QjHoksi3SAK/ZyROCOanzfGPzj7OO6ngHOes0dc0Hzn53u1LZj31/rJ5bzxxzoJ3rj119t8OPWryPdLY3CVpaYklJ5sMaW9giNf3Xfz/AQAA//9T+F1+AAAABklEQVQDAH8uCHwmhwdRAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAQAElEQVR4AexdB1xURxP/H1iwg70C0hQURMAGKNh7i11jS2Lvvffeu9EYY6+xN+yigCIdpSrYFRRQ7Cgi38zFM8DtOw44lOQLvze8t7Ozs/t2522Zmd3Twr/wLzk5uSLBYILtBL4EzwheE7wn+EjwieAzgeLiZ8ZxHNMwLafhtMxjIBFW/BdWFf4VAkCNM4rgEkEcwSdqqDu+N++tu3Ttds+zHndtDp2PKLHtaHDB1Tv9daavuZJ7/NKL2qMWnJeNXHAB45a5YcJyN9nkVR7a09dezT1rnZvOsj+uFdy416fEn6dDbK74POp541bMr8yTeRNwHpzXSML9469/nABQA+gSjCFwJXhB8JlaYfmFa5HOG/b5Fx296KJ251HHMGWNL6av98PkVdcwdfVVzFp/HUu3+mHr0dvYe/ouDl64j0MX7mGfyy3sOXULO4+HYeuRUGw+fAurdodg8dYbmL3BF+OXu2P0oitoN+wYek9y0Z622q3ojmM3nb1vPlrBeRNwGeQCQc+6VJZ/1PWPEACq2FwE4wlCqXbjCJYSOG09EqzbedQJmUnzLeg7zRXzN/nhwLm78LwZg5A78bgf9QbPnr/Hm3eJ+JSUTEnUvxI/JePlm4948uwtbt2Ph19oDC55P8G2Y7cwZbUXOow6A6t2O2QDZpzWPeByw5k4ryDg3iGEyjmWIBeFc/yVYwWAK5BgBMENqsUEgkWnLoVWXvDbNa12w4/DtPlWTF/rSY39FB8TP1P0t7/iSUBcPB5j9DJvWLbfgZ+nn9PafjTE3D/02RIqTQKXnWAIQY4VhhwpAFRhs6gC+UtfecXnoeWkFZe02ww5jPErvfHr/hD4hTzDh8QkIsk518vXH3Hu6gNMW3MNg+dcRM+JLto0l7C8HnBnLZUylt5pGt1z3JVjBIAqKA/BOoL3VEvTT7mGFe429gSGzrssH7MDwp/j1dtEisrZFw80j2nYuOzzBL/+GYZhCzwxcblbkdCIZ7Pp3d4RrCHIk1PeIkcIAFXIFKqQVwSDT7hG6rQefAiD5nnAI+Ap4l9/QFISVyvFqnHJZIBOXm3oFsqD0sXzwah8YViZFUOjOvro1sIMP7czxfBu5hjXpyqm96+ORaMcMH+EPWYMroUxva3Rs5UxWtergNqWJVDJoAgMyxUmPvnB/PLk1lKjBH+T8NAUHfceu2mS2WrICQyefSbfBY/woUTx6ss70+P3uRS5ZuyNFKk0dKdKaE7wjNjN3XkiNG/XsacwYuEVBN56gWT12xwF8uWChXFRtKhriJ/bV8L43paYO8QGqyfUgevWTjixvh3+mNMYi0bXxYyh9TD2Z3sM+7EWfulsg24tK+PH1ub4+YeqGNHTFvNGOmPd9CbYv6INzm3uiCvbOuG3mQ2xZGxdEhprdG1aEQ7WJVGhVAHk0pZR0dW7EkmIT1x5RPMFLwyadSbv0fOhc/ndCZzU45A9VFrZw1Y1V3rpsgT+RHVy17HAEk36HcLcDV64GhCFxE+fCZ3+lSuXDDWrFMekX2ywZ0lznN7YHhtmNMT0wY74pbMt2jSqgtrVNaO7sa5cEk0dDDGgS3UsHtcAe5a2hseurtg0sz4GdLaEmYEuuOdJv9TAi1cfcdLtEaau9UG/GedLhEQ+5yWkB9VHWXXSa5rmmwoAvSQv57bQSzwgsB650FU2bZ0vwu6+wLsE1t8QVuLiCuYu2KBMIYzra4s7p3/CgVVtMahrdXADSSTLVnTDOhUxpX9NnN/cAdvm1EPnJsYoXCAPcudKv1p5iXnG4z46jT4hW7Pjuj0V9AHVz2aCXPT8za70S6qhotCLWRKrGII+G/cHaNfqtheHzkemuz7XohKaGRRGh0aGWDq6Btx2dMawHtbEJmddzrVNsXS8M4KO9sQ8mlO0cqqIMiXypVvI1zSxXbItCB1GHNc+43HvJ0oQQ3VlRPdvclH1Zn8+9ELDKRd/V8/but3GHieNnD+iYt4SSvri8bVm1VJYMKIOFg63w/IJDdGucVXpBDkopmvzSlg/rQEWj6yJAR3NULZk/nRL5x38DJNWXmWtpS4Rh1Od9aF7tl/ZKgD0EloEp+ktVm7c663dd/oVmtk/w4ePnwklfZUvVRCrJznjwMpWNEmzgF01zYzl0jlmT4xTLRNMGVgXnru7YVDnyuAhTFVOsS/eY/uxUDj02JfLzfvOH1R3+1TRayIu2wSACp+XChhM0HTCssuyZTuCkaSi3bVpRm1qoIuxfarj6q4uaOVsREn/Pdek/g7Yu6g+2jrro7guV430uz18+gZjll2X7XUJ70z1GEqgOoE0q3RjskUAqMCFKOf71OVX7jz6GP48G4mED0mEEl/FdXUwoJMl1k2tj+E/2oiJ/gVYOytDrJnaGLMG26CFYwW5vkLqtaJj32H2r9dpSPCoTDT3v9QpPWbtSpta4wJABdWnTO6TgaTU6GXX4XkjRnKixzN7B+tS2LesBSb+UgOVKxalpP/+q3UDC2yY2QQrxtdDhdIFJV+YjVhspew+7lQpImIhKEF3jV4aFQBqfAsqXfj2o0F68zbfQOyLDxQUX8V0dTCwkwWtqVvB1EBPTPQvx7Z0MsLWuY3gZFcG+XW0hW/7ORlw949CswEH9QKCH975UsdC2swgNSYAVLCaVAD/NTu9dJZt9UdcvLjxeayvZVWKtHKOmNS/Dv7f/0wNi2HHwhYY0qUKWMchVR8hkfEYv8K7oE9QtP+XupYizRBeIwJABTKhXN3nrLuSZ+2eELwgyxiFlS5e2rV1NsCfy1uhib2BUvz/M2JYzxpYTOrmKqbFJKsh7N4LjF7ilsfN56H7lzqXpFU3IssCQAUpQ5kFkOkz9/aTkXgvMdlj7VifNqZYOakhkf93iWqgTrUycPm1HeralIW2lkxEgnuPX2H8co/c7r53uSfguhfSqYvMkgBQ4/PyJGT9Hv8Cm4/cklzfVySL2uwhNTF9SF11y/V/TbdrcXP0bVcZhQrkFtYDm5vHL/MseD3wQdCXNhDSqYPMtABQxjxrCV+3y0t33Z4bePNOrMvXL1MAk/rZokfrKuqU5z+aLzUwfbC9fGnMK6UvqFS3R8/ekebQq+ite/HsgsZtkSpe3UCmBYAyOL/nRKDB+v1heC3R+IVJgucPs0Mzx5yj1Dl8LhgLfvPAwJln0GrIIdQmm4RV+x2o0mY7LAjMW2+DVfvtsO+xBx1HHcPEFe7YfCgI1wKf0Ct/22v4j9Xlk2Wp4SDi4UsqnxtX7vn0SiYVnykBoK9/xOXrEU6/HQgHGzPSMmepNSpXEBum2qNeTZ4fpqX4NuHrAXdx6NwtqiR3NOt/GMbNtmDEIk/8SkJ7yv0RboS/wBOyScTTpPX1u0TqxRLx9v0nxL9OxKOn7+B1Mwa7T4bLPYq7jHFBpVZb0WbIYUxffRlHz4cg/A7btrL3XdiuMH1wLRQtzKOtcl4+ZEMYvuCiE7XJKOXY9DEZFgDKiPvyZat3B8siH70W5lC5oh5mDK4NxxrfvvH9Qx5j1XYv9J50EiMXe2LMEnd5I4bcea62r4HwpQj5PiEJ7Jq29VgEq2oxdP4VjFp0GftOsbMyEWTT1bddFQzuakm6ArGl+LjrPdnsde5LvrRNhkqRIQGgDHisce858aS2b0isMKN8pNAY09sa9Wt9+2Xe+KUXMWyBO9btC8El72g8pnEyiTUpwpJmDcnuXuH34nHwXARmb/BC418OYO3ugKwxVZG6f+dq6NepqpCCXea2n7itfdz1jtuXNhLSiZAZEgBi4L5081Xdyz7RENWrTh5tuZ9dEwceloj6G1whEdGYuOySvHvfe/ouHkS9gSq7Q3YUiedA4fdeYvEfvqjeYRdZ9EKyIxuM6W2L7i0rgZVpaTNggVywyVsv8mF8huYDagsASVaP01fCah04fy9t3vJwfp1c6N/BDD3aVJOHv8W/dXsCMGiOG3a73Mly966p8sa9TMDMdZ5oO+woNh/w0xTbr3wWjnJEw9oVhELwmKyICzb58Hyg19cE6TyoJQDU+Lwg3bjjxB1ZVOx7JZas4WvpZCh3tlSKzAbEgdMhaDv0KJZt9cNdUoxkJgueqLKnb2UjPdSyKg0nu3KoX6McaluVQDUzPVQsWxAFSKgzw5t3IfmHxmLxlhvoOfEU/IKjMsNGMs0v7U1hWqGIUnwyYS55PZRtPxa0/kubEUb1paU6+mvs/u3HQgu4+UUJvXUrli+MZeOcvhJn58PqnX6YuOo6/MNiJa2Movy5wY3KF0KP5kZYNqYG7p/7GTcO98TZ334g1XRL0sc3w7YFzbB/eRscX/8DLm/vgtATvXFpSwcsJRVtxyYmKFk0HzLyx1rRyz5RGDD7ElyuRGYkqUra2taGGP+zjZAm8dNnzFh7vQBFbiVI90pXAEiSTDx877Zd+Lu3kFmRgrkxpZ+4MMIEmUSG332B/jPPy93JeLxLjw37ElYoXQBN7fUxb7g9zm36Aa5bO2PBmPro1NwqveRf440r6KJzMzMsH+8En/3dsXV2XbJiVkLNqsVJIHTU8gZ+GveeVgyXMXPNla98s/rQqE5FjO1jI/QyYsebnhNdulLbmaWXT7oCQAxcVu++KWPbND2nurjr79+hMhrUzt5Jn5vvY97CjbMe91PlLwqwCt3SVA8julfBwhE1sGl2Y/RsYw4zQ82YnBvYm2HyAEccWNkWy8Y6YFAXK5U2fUUZEz8lY/uJCPw05ZQCleU7K4oa1tYX8rkW+FTrxOU7J4WRKZAqBYAkaMQ+l3CTQFKYpEjz9ZEzH9aTrcBfURp/8Ax8jKHzLoJ354pWHikzLKGng4Wj7HHy1x8wqk9t1K1hnDJa489ONQ3ljiweO7vgZxqXeYOKqkx4bnDBKwotBx1WRZahuE6NyqOswPv4Y2ISVm73NaE2HKuKoUoBoIRzj7neEfrsl9DLhx60JCGabLsueT1Er8nnwZspVGXCk7lWdcvD988e6NrCXBVptsXNGFIP2+Y1Rh2aUPKKSCoj3vF08/Zz1Ou1H14Bd6TI1MY3cqiERrXKQou7vjSpbt1/hS0HA2akQacKSgoASc7IQ+cjCnrffJoqgSLQ1NEAzjUrKIIav7tS48+g5VTCh0+SvHliZ2teDNMHWGP9jKaSdN8qoqZVWexb3hLjf7KFsWCWnrIc9568xvzNN+Dpl3UhmDvSGZUMdVOy//q8bl9wQW7Lr4g0D5ICQHRT1tI6O+GjsjOnHuml549wIJLsuYIj4zDr1+ty27eqHDo3NcXhNe3QsZmlKrJvHvfTD1WxamI9WJqq9nFktfKq3cEaKd+0gTUhMho9e54AWjlNkcpEKAAkMT037vUtFnH/pVI67mom/lxdCa9JxMBZ5xBJli4pngXz58KwruZYMraeFMl3x1tVKklzkfZoU99IcqvYZ5rUeAQ8w7ilV7JcXkeb8rTiKSvks3bPzWLUpkLlkFAAiMtc0vjJ6K50Va9cAt1asj1IKUojiCFz95jjcwAAEABJREFUL+L+E+ldQzzeD+lijnG/2Gskv+xmsnZKfXBPpUNqcqm89p2+TRM2L6lotfHtGhiQ1TCPEv3HxE+yDfv85ihFEEJJAEhSmuw5FV7hYfQbik595curjR6tKqdGajC06cBNnL/G+0bFTPNSJY7va40hPWqKCXIodgGpb39srbre+Oyhw2eDsvQGzeqZo6ZlCTmPlP8+fwb2n7lTgdpWaaKkJACUcNIZj3sy0W5dC+Ni6NjElEg0f0U8iMfmQ8GSPoU8vvFhDj+2yVnjvbo1MX1QbbR1lp40sxf1rlOR6rKTpOMVQYF8ymbju49eys55RE5Mm1BJANx97tgH3VY29fLYX6OK6klNWuYZCc/feBV8IpcoDZ/40au1MX5onD3CJ8ozO3BrpjZBE9JMsjCL+PuExGHjfj4TSxSrHq5zCyuYCfZZsHbQxf2x0riZSgCoi+hyLSA6T8yLBKXceONCgxpZdkJV4suIrYf84UomZn4WQR3q1mYNcxJF/eNwQ7pVg2G5wsJy86Rw04Eg3L7/QhivLpJNxiJaF/d7ebiNU8alEgCKmOBKxgtWVtBzqsvBuhRq2xilwmkqsHZvqKRhJz/NO4Z24w1Hmsrt+/Kpbl4Sw7pXkywEn2u4dIuvZLw6EV2aV0K5kvmUSN++TwRNOCekjPgqACQZ+QJCHlQLioxPGS9/Zp1/z1bZ0/2u3ukPtqHLM0rzL08uLcwZVhM1MrA9/NTl2+gx3gUmzbbInUR+GHEUl67dSsP5+wZ5KOvY2FjSkOTh/wQnLoVnqZCdmhgL02/cd8OK2vrrCu+rABD1gMMXH2uJvn4rs2KoV1PMkNJl6TrjflfyFLAGNcugUzMLtfkv3+YrNxW7+T3BRzKLJhL4BMdi/EpfWl2kb0hSOyMNEC6f4IzKFfWEnNjwdvbaE2Gcusi2DSuhWBEdJfKIh/HawRGxIxQRKQWg7XHS+ysiUt6b2JdPGdTY8+7jgbj94JWQXwky7LStbyCMEyE3HwwCj5/xr5T3JD6NeydfYYjSfU9cz9bmQnMu6YfgG/IMgWExmS4em7Grkc5GxODm7bi2CvxXAQgIjbKOjVee/BUme3+tqsprSwWDrNzPez6GSNXM/ZMN6fhb1lfPsOMX8hSLadxkl26p8nCF7j8dJhX9XfA/kgBUNSkmzJv1MFcDMt4LpGRWo2op4TBzLSDKWkEnFwAaEwpd8YsqokCmvFsYFYWtpdjmnJIuM898doAoHW+Jat9A/QnntqMhUGU04jwSPiTh6MWsG16Ylyahrm1poQ6f8zjlJva/5Dh1wFS/EGkG8yqR+ofEFKE2l7e3XACI4ucb4bH84dHj3xcjLE2z5+tftycQb96LLX1VzYqjhbPZ3wVR8RQY+gSB4TFCV7W0ybyCniGrX1VanlkN17ctiXw67G2vzCk4Ig5u3hHKEWpimjgYgQ13acmj497I3Hzu9WW8QgC6RAucPfPp5EIliYkKJ84K7D8tPTPvnAFtY1RcAmIFegtR2T6QZfMP0jaK4r4XzsbSEHWsSgqzZwcSF/eHwjh1kWUFJ5QlfPyMe4/fyOcBcgHwCXpaLS7+vRLPQgXywCgdu7ZSIjUQgWFPJb15ixXJC14mqcFGTvKc5i28rUseUOPfxetZq1A1ssgwCZ+ByL4NooTnsrgasK4kXmmQyV0+D6BlX3LusMhnOs9fKk8AC+TThl2VUqJyZQnnqWKjpXPNchniHf/6vVrdv4Ipf1WkE1cEc8S9hbO5pHbwKdnzfW4+ynQ57aqITcQ0/+J5QF7uAWrdeRQvYxfmtLmIfM3S0mQmHBCubGtQ8KlfI2NLThnYG16RWr17wgdlYVcvZfZROdlJv/ftB+I9mOqUxrmWIbS4ldMQP3n2hqd4NTjKLjr2XZrov4JmBvKJ4l8BDf5//FScX1Hq/k0NdDOUk15hHeFaWopJofy50LpB9vkzSOWbHt6uingewOluPVDWzjJeXTDVV65TXn4HRzy3YwGo8UxiEsUbKdTNRF06NvuypktEr1+6EMyNM7bqKF08P4rpKuu9RfzZKWNY95zX+FxWo3KFwMLJz2nh/uP0e4C0aVKGq5oWTxn8+vwk5nVVFgDzF6/Ev8RR1azMV2JNPTx8HIs37z4K2RXTVfZmERKmQDrXMkLJospr3RQk8kc2wbZrYIiBXe3k4Zz2r6pZSZQpWVBYrOcvlSfoQkIJpEFpZZUwkz6KfmXMAlA67qWy+pQJbCxK802j8OJVglD7x5kULZxxAeB0tpWLSSpTOJ7BykwPi8c682OOhRJ64p6MnXOCIzKvFtYvU0D4zvcevTRiASj06o2yAOjReCxMlUUkv4zU1q4ihTInAE3ty6FIodySJeOv386iuGR8TokoXFDck30g/cX7dH5PQdU76NPQKop/HPOusNbN27HavDRKS1C2hFhq0tJlNMyTj0/snpImITeSyJUpDZkwWMfWGB0aGgrjGMmOFrcljE4cn1NA6v3ZqslCkNly2lkZIG8e/tZTcyDbTy6tx9EvtFOj/wrpkhHoryfN/tfOlQeiUzv40APdwpkXummD68JYX7xq4YWiV1As9rlkz8ENmqohLXwWskpKSsbrN+KVkzCBAFkov3IPGfciIY9W7PN3QgEooCNEC1hnDKWlRXy5RdIkk8lkyJ07VxpsxoKje9mgQD7lF2UuPPT89mfOFoDkZLEAJCcnI/GT8gYdfi91oYDAUfRD4mctrddvE5X7BuLKdgC6afzSooamS4kvv6SoZ1AiVIFo7WyE+jXKCk2gnOz2g5foOfEkP+ZIkHp/mZYMImUOMvCXN4+2EnViYpJMK0Fi7x0f7aqUQgOIPDQWaWtrKXHibi6BTLZKERlE9GxtCj0Vk8krvtEYPu9cBrl+G/KPieKvXJsEIJe2cp1xqdQFUXu+oo9fK3de8RpRRydzM/L0CpSc9FH4e3ss/THPxd5B6fFMGV+nugHG/2wnqR2k3hSn3B9h9vqrKZPliOePn8SNnCe3NvSKiHUE6hY8dy7x8KqVXyePeOABq4rVZa8+Xd48MsnGYcue+pykKbu3NMfAzlY081Xu9jjVx8TP2HXyFmas9eBghoBWTTh0PgIHz97CeY/M2+pFmb56I1aQ6VD3XaiAeIko4iPCsZtZWnzhArk/kwBoCaZkAFdS2gSaCPNsNC9JtIjXcwmFlIg2PdzYvrZoXpcNIWJBZuPXzhO30HfKKfjeuJseO3n84XOhmLDMHVNXX8W0tZ6Yts4bXcccA/s2ygmy+C9WYJJnluwwYm6cNT3Gp0/K33nu3NrJWoUKinsA9iHnzDUNvLmTX0jEl02fInxmcfzLY1WMxfZw5snr6wvXozByqRdcLocySiXM3eSHoIg4UmUnyoEPorwaGIPJa3xIEI6rTJtepPeN+5I/pUdfanrJ041/L5jr5c6l9VlLJ9fnj6LUcfHvROgs4+ysKkKvsFjlGRXzDoFhUVnOIyWDRaMdYKniRxiY9v6TNxi15Dp92W645neXUUrQe5ILYsg2rxRBCN58eTXwGaza78DCTdcIk/Hr3pP38nOKRSnNDIuK0BnCvXytrO0tVCD3Ry3dwnkSRJxiX7wXoTWCMywrntDEv/6I0DtZM32mLWBV05JYOdEJDWqVh2j5qaB/l5CE7cduYdzy6/KTRy94/L0xY9UOf7j6pO+hy+X/dX8Iek86Bf/gBwrWat2v33wmSWduJPYclkwgiHj9Vvk7L66rk6BlW1U/nrVwadNoujtOyV9Vt3zF53FKUo08mxroYcag2nC0KZsuvwfRb7H/7F2MomGh+/hT8gOqNh0MUtvriFcZvNR08XiUbl4pCa74Sr+3hYTreMr0qp5DyJDEv16elqZcqYLxWoR8xOMy3VNdr9+KTcSpiDIZYJ9/WtoKU1/2Tf9LEyZMB1mxfBHsWtQcjWqVU/l7fczmE6le+Wt294vCsUt3ITU7Z1oR8JI27M5LUZQQd+7qPUTHiofc8qUKoLLg5/SEjCSQdyVOUy1fsuAjFoDIkkXzC5N634wS4rOKtLXUh4WxuFtjwdt+LDirWUim/2NeM4zsWR36ZQpJ0mgiIp+OeN0t4r31sPTBEC0cy4uSZAgXEiEeXkrq5b3JAuBZQk8sAHez6ImiqpRdW5hJRu9zuS0Zp4mIwV2ryecFdlVLaYKdEg9W21pXVm/ZdsXrNvzC4pR4MII35U4d5MiPWYJb98TzqlLF8nuwAJwrVVwsAOy+laWcVSTu1cYCfNiTiOTek1c4eVk8GxfRZwZnV6UUDq1shZ/amcrLoWqCmFH+lQz1UKeaet5UF7yiIGXrr2aW9dk/lz1McNgX451rG3pqyWSy+4ZlCiaL1CWik0I4oaagIc3MRbzevEvE0UuRoiiN42YOrYcN0+qBt2uXKSH+EDKSKVvdurcwhbV5+t5UASEPcTXgmfC3F/jrb2JfISNZS9I+jHqrFFehdMEkbnvuAWBYrsDL/AJz4cPorDkjKuWaBlHPpiSZb5XHSp5JewZG4ci57JsLpCxKvRoVsWy8M9ZMckKv1iYoVVRsH0mZRvSsWzAPxvaqit7tLEXRSrirgXG4I/GzO/plCqOunYFSmowiLno+EAqYpVlxeePKBYCkIUC0EuAv8cyV7NtR26m5JSobip04eBa++9S36QUUlVrTqizmjnCC9/4e8tNHzY2KqNQdKNLxvYpxUepJHPBzJ1sOqgWbDgaTnV9ZRSuj7ph39kp586rF/AvRDcF5TxxFAhDAd7kAWJuXOyraRMjbre9HKR8Xxwk1BU52pSHSQzD/6zdjsOVQID9+c/iFGvLMbx1xbG0bjOpVHfbWZWCiXwRliudDSeoh+G5moItGtStgxcR6cNnYHva2RmqXs9+004iLF+rgSFOaF62c9NXmpYowICxWKZrkC4blihzlCC3+R7ClYvnCSkYh9t+LfJS9AjCyd23QHISKoHxxgZbvuAEPv++3n69apRIkADbYu7QF1k2uixUTHLF0rANWjHfE+c0d8MfcJujQKGPH56ze4Y2zntKKn6YO+nCqYQDRX0ZwYZHP8CBK2cSuWyhvcun8RbYwL7kAyGSyl042ZYWai4iH8qGCabMNRv5YVZL3S1IPb9iXtaPTJJlnMMLcpBTsq+vDuaYh7G0y94V6+D/GbpdISc1iyWL5sGh0vQyWTEzO6/+Y58oq/eoWJV7a2RWVt7dcADh5NfMS8jGBn1NC2J0X8AvJHoWQIp+2jSzQrr50hT56+jZL++QV+eSE+6odAZLnIbLb1vi+mtu4EkJtJ9Jimlcs+rWttRSVUqliiQs8rinCijtvveZDlxTh7LrbWhSTZM1zhNxZdImSZP4NI4bOuwTPG9HCHGUywLlGefnP0wgJMoG8ceuFcOushYmefPxnll8FgALLujY342GXHlNfx0kfnhqj+dDxy9LGkypkDMmuMwo1/yZijv1mnMFxiUO4OEUJPR30aKH+JJLTqNfPiLoAABAASURBVIKA0CjcuK184KRu4byfq5uYbFSk/SoAMpns/ajedpH8tSkiFfdbpEm64ivdQAq6zN4veT2AV5B465OMvoxOTStllnWOSDdg1nmcu/pIctzX1pKhf0dz8D5HTRX4NFkj3wl2EznblQurUEH2dWLwVQC+ZLyutpVYg7WZ1qxfaDR+43FRimkty1Jkxi0nFZ2j8cERsfhp2jmcdr8vVMZw4XncH9jFEv0723BQY8B+iyJmbZwMNqXEpxWAVW0aGCeSQKakkT97Bz0FH8YkD2jw3+GzQQiOiBNyzKUtw+AuFsK4nI48cPomxi1zAx9/z5pNUXm5t21b3wgTfq4his40bu0uL6F52VS/SGIjB6NVKRmnEgCZTJZsU7moR1mBTvzd+0QcPve3l0xKJll5Pu/1FB8SlbVhzNOhellosltknt8C5v92DTPW+yHo9nOV2dlVKY6l49Rb8qlklCbyz7P30mD+CtJQ6sFt/Ffor/+pBIBRtBqYaWGslyyjsZfDCmC3Yo+AaPio6UGrSKfq7hfyDCJNFafhH6fo0MSUH4Vw99FLXAt8gpXbfTBi/nnM3+AOD59IIe23Ql64dg8/jDiODftD8PrdJ8lsecy3NS+OP5e3kaTJbMSBs7fxNO7rEP+VjU7eXMn21UtP/4r48qAkADKZ7HKXZiYP8wscGu6S4cLzhniy9oVfhm4XyFDx+KlY02hBM/92DYxT8Tt4JkjudMmTqoGzL6L35LNYvj0Qhy/ex4YD4RizzAsz1l6Ff6jYASIVMw0G/jx1EwNolj9ikRt8glXnnSe3Fn5obILDa+SntGmwFH+xOu1+D6LJX/tGRg+rVSrp9hfV3/+VBICjGjuYTDUoq6wa/vjps7yymUYTcOhCpHByxJVU16Yc+CvfeSwYP091gVOvfZi90R+bDobCxe0+Qu88R9qtZE9i3mHniXAMIuEYPt8V129kj3uZ4t2PnAtDp5FHMff3AJyhWb5I6aKg5TvPaTo3NcOybOj2mT//wqpnYDQ/pgJtLa3kBjX1J6VCfgkIBYB6gR2jelrGiSaDtx+8wppdPl+SZ/62cpsXpL7+JBpv9p0OR8NfDmLyak+c83yCu0/e4MWrj2Q9S1aZKfv6P4l5iyMXI9Fl7Gm0HnIEmw/eQPgdZaOISkYSkdf87mH+xmtw6r0fwxd54HpQrLxcVGSJFH+hC+bPjZ/amWH+yOz7ub2N+wPx6q2y929d27LRzRwNd/9VktT/hQLAJE0dTeZVq1SUH5WAxzj3LBxhygy3HpM+KTQpKRlR9DV/+qS6sZmPKuCDIQLD4zDrV2/8MPIU2g8/hhELzmP5lmvYcdQfpy6Hy4eLsDvPwd5Pt+7GwTvwrnwuwW7hp1xv4cDZW1i5w5/SuaJp/0PoOeUSNvwZAnXd5XLl0gIvrZeOcYAm3Luk3nfHkQC4+0cJo3u0MlMa+xWEkgJAvcDKET2qvuHJmIJYcWfHzS1HbyuCGb4v/t0TmtwGpk4BWKXtGxKDwxfuY9XuEMzbFIgpa7wxZO4lDJh9Af1nnsfAOZfk84jxK70xaY0v9T5emLLqKpZv86N0kTTsvMjQlrk81PiDOlti//KWaOGUej6jTpnVpYl48ALr9oWCN6ikTdPEwSC+maPR72nxirCkADBBgzqmc2tULc6PSuBFmrs/XTJnpbvoLZZUpUyyCcHr8ncJSWSP/4BHNAm9++gV9QAv5XCPhpqH0W9pHf0ez199wPtMblk3N9LFsXVtMO4nu2x6i7/Z/k5KOim38n4/VBn+N6Xyk0oBoF5g0ZBuNg+KFFTeKv7yTSIOnH+gzDEdzIHTQciKq5mMlqekz0YlQz00qFkegztboFtzI5gZFAZ/celkn63RhQrkBnvyzB9pjzO/dYCFcbEs55ceg2MXQknNfB+iOUifdpUjaluX3aGKh0oB4IR1rMt2aeygLxyMvYOeYf4mLyZTG+Li30PKC1aKCTc6++nVr1EGo3paYeUEJ6ybWh9b5zfFxP51sGhMfSwYboexfSxRp1op5M5FUiLFLBvw3PDNHMpj/gh7HFzZCj+2Ms+GXMQstxwNR4zgoM+iRXSSW9U1bClO9TdW6+9H8ZNMJvNcPs7pTEGB0yjvoOGfaTlMyyFxamVscbJ6iXgpU0K+eaN3m8rYONUe7Ke3bUELjOxVAw1qVYAZ9QAp0/APS/EhkPuWtQK7cfVpZ4Hiuplz7kzJV9WzQekCGNLFHMFHe+G3WU3RtoGJKnKNx41dfAF+oXFCvn3aVTpay7r8LWFkCmS6AvCFtvO8YTU+5CUlxpfw11sSzdiX7wjENb87X3GqHjo0tURNy5KpTgnh5WZhGmYqlC5IM+ZSGNO7Og6vagH3HZ0xZ7gDmjll7IuqYlIcs4fWgd+BHlg90QGdmxqhqklRlCtZALqF8kAnjzY4T1XlVMSx1o5dvYuRMPE2LVuL4hjcpSp2L2oCt51dMaGfvYL0m973nryJ/aTy5flM2oyrGhf9OLKnXee0eFFYS4RMi6Ne4HX7JhZzWzpVFFbcI5o0/X44Im0yyfDvc5phSFdzNLUvh+aO5TGipzUWj3HENurS9y9vRWEb2FYpI5k+IxHtGlUmfXt9nNrQHpvnNMLswTYY17sqBnSqjO4tjNGxiQla0Xs1dTBA4zoVwL9UxuVq66yPPm3MaBJni7nD7bF6khN+n+WMw6vbYmK/WnC01YzPfkbeRUF75ko41u8LUQRT3fPl1cb0wXYTqc0SU0VIBLQk8EpoYjh35I82IaIfkGDFjav3Y8zZ4KmUTgoxpm8dbJrdDBtnNsWoXrZoUbciTPR1pcg1grcwLo52jaugXxc7TOrvgIWjnbF8vBPWT2uATbMakYA0wdb5LeTlWjO1MWYPr4vBXauhQ2NT1LUtDwuT0hopR1aZrKPGvy/hrT2ql7V/HWv9FermobYAMEPD8oXtxvS2fcsqTQ6nhERSE286EIytR77NZo6Uef8/PfedfAoB4c+FziUNapZ728rB2iEj9ZEhAaBe4D0NA027tTRL5rFRlNHC332w52SQKOo/XBZrYMLSi7jgJdahlCyaL3lId6smKb191MkuQwLADEkIPOYNd1zQ0smQg0rwLuETVu8OwrGL6s8JlJj8h0DaKpi93gMHSYuZFs9h7pFXTHCaW9Oy3FUOZwQyLADMnIRgytopDfyrVSrOQSV4/PQtJq+6RksU1aZRpYT/IYQ1wL4OW46ES6qhZw+t5V/Prrykvl/I9AsyUwLwJW2dOcPsn/LS7Us41Y2tUr0mnsEJ1+/rpJGqUP/AwOz1bth06JbwgG0Z6bv6dzR/+mPrKnUy+2qZFgCZTPbBunKJSjMG2r7ltbWoACwEczd6Yeexm6Lo/3Dp1MCk5a7447C48Tlpu/rG8VMH2lfituBwZiDTAsCZUcYvmziaWC8eVTtBSgjYSWPBZn9s2Pd9NnlyOf+JMGDmGVL03BXq+Pl9GtfRf7tqsrMFtwGHMwtZEgDOlAoQ0ayeqf28EfaJxYroMEoJ2Hw8f5MP+IRNpcj/EKlqwJM0qi0GHoKL+yPw0jpVJAVk1O0725VL3DynsbVMJhMvCYhO3SvLAsAZUUH8WzsbN54+qHaSbqG8jBLCrpNh6DP5DK54/TcvEFXQ1kN+GLfCC0ERyjt6FPQO1qWSti9s1pjqXCPLLI0IABeOCnS5fSNjq2Vjar8pJvF7Q2w3cPV5jGlrfbDr+H/zAq43BczdcA0rdwbjvuA4FwVNa6eKb3cvaVWV61qBy+pdYwLABaGChTR2NDFaPdHxhX6ZgoxSAnbTYv++Sau8MHGFu1L8/xuCXesa9N2P3w6E4PmrjxC9Pxuuerc1j1k3rYEB1XGYiCazOI0KABeCChhTt4ahwaaZje/bVinJKEnYeyocbYcdxd6T/58TxMW/X8XIJdeh6gwGVvKM61v9IS25y1HdxklWZiYjNC4AXA4q6Gtz46JGh1e1PtOlhVly7lzibNiLxT80FrM3BqDXpJM466ZR4eai5EjYcyoMbYYcpa8+HM+eJ0iWUa9Q3uRfp9U7N6S7jSHVaaIkYRYixC2TBYaKpFTgzwTNloyuO3JoV8skHTJTKuLS3t+8+4TL3tEYvdQLs9b9e4eFG2GPSdBdMH2tJxl0YsH7LNLWhSJcxbhY0p6lzUc2q2vahOrxswKv6Xu2CYCioFT41aP62FX/fXajeDODIpIHQiVTgldvE7H5cDhqdtmNZX9cg1fAHcL+8y+foGhMXeWBDqPOwtX7CT58TJJ8KXZW6dO2UozLxnbVq5gUXy1JqKGIbBcALicJwc16tuVLnd/c8Wr3lpWTC0j8tBvTMkTHvcfavaGYsMoHU1Zelu8BZPw/DY5ejMTQeZcwcPZF7DgeBqlNsIr3MihTMHnVRMdzs4c5luY6U+Cz8/5NBIBfgF7oI4HDvOH2A9dOdnxXpkQ+RktCEk0QIh++xs6TERgw8wK6jD6Jw+c1svSVzFNTEfM2uqN+3/2YQKucY5fu0Dj/XnhUS8r8ujYzeee2o8vAFk7Z2+WnzJOfv5kAcGYMJAS/NaxjVOT6nu4H+nWqkiw6n5DpFMA+b/GvP+LajWiMWHgZNbrswjxaM/sGRylIcsT9pGs4Bs0+C+Nmf2Djn+Fg4X33/pPKsvH5AGb6RZK3zq1/ePFYpyJcNyoTZEPkNxcAfgd60U8EnaYNqG29bX6TB80cykGvcB6OSheexiVgI62Zu8r3/R3F+GWu2LTPB6cvp/+bP+kyV5Pg1v0XuOB5H2t2+qD/9NNw/HEvhsx3x8krD0l9m6wWF4MyhZNnDrKNOP9HR+uGdYx/oPpQLS1qcc040XcRAEUx6aVvVDcvZfDbrGbdN06rG8POmLwzWBGv6s7jaWB4LPa6RGLxtpuYstYPDX/6Ez0nusj3Kuw/cwteGtodfOxCMPjUjbFLXNFx1An5kDR2iTv4EMvTVx/jQfRbiLZlicpfqlg+doCNcdvRqUef9tamXAcium+F+64CoHhJqoQ9dWwqltw0u1m/P5c0ialnW1buui0jw4eCRtX9w8fP8s0RvHP5ss8TsjzexNglbug42gX6jTajSpvtaPLLAfSccBJjl17BnA3XsXyrL1bv9MUSUsYs/M2Dlp9umLTCFSMWuKLHBBc0+OkATFtslacfusATi7fcxP4zkfC6+ZS695eIe5kAVm2rKpcijrt63jwyfWDNGO993ft1a1G5pEwm26OI/573HCEAigqgSvndxrJ8yZ2Lmv+yY379eHbNNi5fSPIHIBXp0rvzxtCwey9x2Tca+0/fxqYDQaR3D8DSrQFYQ6uN9fvDaPl5C7tORuLwhUi4+T5BxIOXULVcSy9Pjue9DrYWJTFnaO344KO9funXyYob/neOyymQowRAUSkkCJtrVzfUWz2l8chLWzvHzx1WB+0aGKFoEbG5WZEuJ9y50zIqVxA9Wphg06yG8YdXtx7Zs00VPX6nnFD1VioEAAABsklEQVS+tGXIkQKgKCRV2ioCvS7NKxVaPbn+0oCDPaIWj7ZPtrMo9t03girKqLjzBtr2DQyS9y9r/NB1W5cFC0Y7FbK3LscNv0pBkxPvOVoAFBVGQvCGYBxB2a4tzMseWt1uYcTpviErx9f+1KmxEapVKgb90n9t+2LjiSJddtxZpV2yaD6YVCgi34hKhppPx9a1Cr15pOeiVZMbla1tbaBP5ZxM8CY78tc0z3+EAKR8aarYaIJJBFU6NK2ae9mE+i2Pr2t3ZPUkh9jJv1gnD+9hhe4tK6FR7QokGMVRvlQB+W8CsUk1JZ/0nnniVrRwXlQsWxDVKxdFw1pl0bttJUwZUCt5/fT6sRe3dDyyb1mr1sN/tM1dvXJpds2aSGWKxj/s7x8nAGnrlyr9FEF726r6Jbq1stIa2cvOfuEox6F/zG2y4fi6tueu7uoaFnKsd+z+pY3e/DHLKWHdNOfEBSMdkib3s0se2s0Kv7Q3w7Bu5skT+lolzRtWI3Hz7EYJR1a1enPu9x9iAw79GHZ5e5fzR9e237hlXvPhc4Y5OvZpa6FVy7JsCc6T4ASy+Pe9k/8PAAD//6AdFT8AAAAGSURBVAMANrv01SxA3wAAAAAASUVORK5CYII=\"","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 { AnimatePresence, m } from 'motion/react'\nimport { Checkbox as C } from 'radix-ui'\nimport { useId, useState, type ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionMode, 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 on = useMotionMode() === 'on'\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 <m.button\n type=\"button\"\n whileTap={presets.press.whileTap}\n transition={presets.press.transition}\n >\n <AnimatePresence initial={false}>\n {state !== false && (\n <C.Indicator forceMount asChild>\n <m.span className=\"flex items-center justify-center\" {...presets.indicator}>\n {mark}\n </m.span>\n </C.Indicator>\n )}\n </AnimatePresence>\n </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 { X } from 'lucide-react'\nimport { AnimatePresence, animate, m, useDragControls } from 'motion/react'\nimport { Dialog, Popover } from 'radix-ui'\nimport { useRef, type ReactNode } from 'react'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\nimport { useLayoutReady, useMotionMode, useMotionPresets } from '@/lib/motion'\n\n/*\n * Painel de escolha usado por Select e DatePicker (não é para uso direto nas telas).\n * Desktop: popover ancorado no campo, na largura dele.\n * Mobile (< 768px): o mesmo conteúdo reconstruído como bottom sheet, com título,\n * área rolável e rodapé fixo que respeita a área segura do aparelho.\n */\n\ninterface PickerPanelProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** O gatilho (renderizado com asChild). */\n trigger: ReactNode\n /** Título do bottom sheet no mobile (normalmente o rótulo do campo). */\n title: string\n /** Topo fixo (ex.: campo de busca). */\n header?: ReactNode\n children: ReactNode\n /** Rodapé fixo (ex.: Limpar / Aplicar). */\n footer?: ReactNode\n /** Largura no desktop: do gatilho ou automática (calendário). */\n width?: 'trigger' | 'auto'\n /**\n * Botão sobreposto ao gatilho (ex.: limpar). Fica como irmão do gatilho, nunca dentro\n * dele: botão dentro de botão é HTML inválido e confunde leitores de tela.\n */\n adornment?: ReactNode\n align?: 'start' | 'center' | 'end'\n}\n\n/** A folha fecha se o arraste passou de 40% da altura ou se foi um arremesso (> 0,11 px/ms). */\nconst DISMISS_FRACTION = 0.4\nconst DISMISS_VELOCITY = 110\n\ninterface MobileSheetProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n trigger: ReactNode\n adornment?: ReactNode\n /** Alça e título: a única área que começa o arraste (o resto rola). */\n head: ReactNode\n /** Busca, lista e rodapé. */\n rest: ReactNode\n}\n\n/**\n * A folha do celular em `on`: entra de baixo, acompanha o dedo (arraste vertical pela alça, com\n * fricção ao puxar para cima), fecha por distância ou por arremesso e, se o dedo solta antes\n * disso, volta à origem com a mola da folha (a velocidade do dedo entra na mola, sem costura). O\n * fundo escurecido acompanha a distância. Só a alça arrasta: o corpo rola sem disputar o gesto.\n * Nenhum valor passa por `style`: o Motion guarda a posição do arraste, e o escurecimento do\n * fundo é gravado direto no elemento (sem render por quadro).\n */\nfunction MobileSheet({ open, onOpenChange, trigger, adornment, head, rest }: MobileSheetProps) {\n const presets = useMotionPresets()\n const ready = useLayoutReady()\n const controls = useDragControls()\n const sheetRef = useRef<HTMLDivElement>(null)\n const dimRef = useRef<HTMLDivElement>(null)\n const height = useRef(1)\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Anchor adornment={adornment}>\n <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>\n </Anchor>\n <AnimatePresence>\n {open && (\n <Dialog.Portal forceMount key=\"sheet\">\n <Dialog.Overlay forceMount asChild>\n <m.div className=\"fixed inset-0 z-40\" {...presets.fade}>\n <div ref={dimRef} className=\"absolute inset-0 bg-overlay\" />\n </m.div>\n </Dialog.Overlay>\n <Dialog.Content\n forceMount\n asChild\n aria-describedby={undefined}\n className=\"fixed inset-x-0 bottom-0 z-50 flex max-h-sheet flex-col rounded-t-surface border-t bg-popover text-popover-foreground shadow-lg outline-none\"\n >\n <m.div\n ref={sheetRef}\n {...presets.sheet('bottom')}\n drag={ready ? 'y' : false}\n dragControls={controls}\n dragListener={false}\n dragConstraints={{ top: 0 }}\n dragElastic={{ top: 0.2, bottom: 0 }}\n dragSnapToOrigin\n dragTransition={presets.sheetBounce}\n onDragStart={() => {\n height.current = sheetRef.current?.offsetHeight || 1\n }}\n onDrag={(_, info) => {\n const dim = dimRef.current\n if (dim)\n dim.style.opacity = String(\n 1 - Math.min(1, Math.max(0, info.offset.y / height.current)),\n )\n }}\n onDragEnd={(_, info) => {\n if (\n info.offset.y > height.current * DISMISS_FRACTION ||\n info.velocity.y > DISMISS_VELOCITY\n ) {\n onOpenChange(false)\n return\n }\n // Soltou antes: o fundo volta a escurecer por inteiro junto com a folha.\n if (dimRef.current) animate(dimRef.current, { opacity: 1 }, presets.springSheet)\n }}\n >\n <div\n data-sheet-handle\n onPointerDown={(e) => controls.start(e)}\n className=\"touch-none\"\n >\n {head}\n </div>\n {rest}\n </m.div>\n </Dialog.Content>\n </Dialog.Portal>\n )}\n </AnimatePresence>\n </Dialog.Root>\n )\n}\n\nfunction Anchor({ adornment, children }: { adornment?: ReactNode; children: ReactNode }) {\n if (!adornment) return children\n return (\n <div className=\"relative w-full min-w-0\">\n {children}\n {adornment}\n </div>\n )\n}\n\nexport function PickerPanel({\n open,\n onOpenChange,\n trigger,\n title,\n header,\n children,\n footer,\n width = 'trigger',\n adornment,\n align = 'start',\n}: PickerPanelProps) {\n const { isMobile } = useBreakpoint()\n const motion = useMotionMode()\n const presets = useMotionPresets()\n const on = motion === 'on'\n\n // Conteúdo interno do sheet (mobile) e do painel (desktop), igual nos dois modos. A alça e o\n // título ficam à parte porque, em `on`, só eles começam o arraste da folha.\n const sheetHead = (\n <>\n <div className=\"flex shrink-0 flex-col items-center pt-2\">\n <span aria-hidden className=\"h-1 w-12 rounded-full bg-border\" />\n </div>\n <div className=\"flex shrink-0 items-center justify-between gap-2 pr-2 pl-4\">\n <Dialog.Title className=\"truncate text-base font-semibold\">{title}</Dialog.Title>\n <Dialog.Close\n aria-label=\"Fechar\"\n className=\"flex size-touch items-center justify-center rounded-item text-muted-foreground hover:bg-accent\"\n >\n <X className=\"size-icon-md\" aria-hidden />\n </Dialog.Close>\n </div>\n </>\n )\n const sheetRest = (\n <>\n {header && <div className=\"shrink-0 border-b px-4 pb-3\">{header}</div>}\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2\">{children}</div>\n {footer && <div className=\"shrink-0 border-t px-4 pt-3 pb-safe\">{footer}</div>}\n </>\n )\n const sheetBody = (\n <>\n {sheetHead}\n {sheetRest}\n </>\n )\n // O painel nasce do campo, não do centro (W6): a origem vem do Radix (é um Popover).\n const panelCls = cn(\n 'z-50 flex max-h-command origin-(--radix-popover-content-transform-origin) flex-col overflow-hidden rounded-surface border bg-popover text-popover-foreground shadow-md outline-none',\n width === 'trigger' ? 'w-trigger max-w-popover' : 'w-auto max-w-popover md:max-w-none',\n )\n const panelBody = (\n <>\n {header && <div className=\"shrink-0 border-b p-2\">{header}</div>}\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-1\">{children}</div>\n {footer && <div className=\"shrink-0 border-t p-2\">{footer}</div>}\n </>\n )\n\n if (on && isMobile) {\n return (\n <MobileSheet\n open={open}\n onOpenChange={onOpenChange}\n trigger={trigger}\n adornment={adornment}\n head={sheetHead}\n rest={sheetRest}\n />\n )\n }\n\n if (on) {\n return (\n <Popover.Root open={open} onOpenChange={onOpenChange}>\n <Anchor adornment={adornment}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n </Anchor>\n <AnimatePresence>\n {open && (\n <Popover.Portal forceMount key=\"panel\">\n <Popover.Content\n forceMount\n asChild\n align={align}\n sideOffset={6}\n collisionPadding={16}\n className={panelCls}\n >\n <m.div {...presets.open()}>{panelBody}</m.div>\n </Popover.Content>\n </Popover.Portal>\n )}\n </AnimatePresence>\n </Popover.Root>\n )\n }\n\n if (isMobile) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Anchor adornment={adornment}>\n <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>\n </Anchor>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-40 bg-overlay data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) 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=\"fixed inset-x-0 bottom-0 z-50 flex max-h-sheet flex-col rounded-t-surface border-t bg-popover text-popover-foreground shadow-lg outline-none data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:slide-out-to-bottom data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom\"\n >\n {sheetBody}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n }\n\n return (\n <Popover.Root open={open} onOpenChange={onOpenChange}>\n <Anchor adornment={adornment}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n </Anchor>\n <Popover.Portal>\n <Popover.Content\n align={align}\n sideOffset={6}\n collisionPadding={16}\n className={cn(\n 'z-50 flex max-h-command origin-(--radix-popover-content-transform-origin) flex-col overflow-hidden rounded-surface border bg-popover text-popover-foreground shadow-md outline-none',\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',\n width === 'trigger' ? 'w-trigger max-w-popover' : 'w-auto max-w-popover md:max-w-none',\n )}\n >\n {panelBody}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\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 { AnimatePresence, m } from 'motion/react'\nimport { Dialog } from 'radix-ui'\nimport { useState, type ReactNode } from 'react'\nimport { Modal } from '@/components/ui/modal'\nimport { cn } from '@/lib/cn'\nimport { useMotionMode, useMotionPresets } from '@/lib/motion'\nimport { OverlayShell } from './overlay-shell'\n\n/*\n * Drawer único, componente central do sistema. Desliza da direita para a esquerda.\n * Para formulários e detalhes de volume médio (até ~12 campos).\n * Header fixo: ícone, título, descrição e fechar.\n * Body: única área com rolagem.\n * Footer fixo: ações (use <ActionBar>), com borda superior.\n * Mobile: tela inteira (100dvh), footer acima da área segura e do teclado.\n * Fecha por Esc e clique fora; com dirty, pede confirmação antes.\n */\n\n/*\n * Largura no desktop, em porcentagem da tela: 30 (padrão), 40, 50 ou 75. Nunca menos que\n * 28rem (para caber o formulário em telas médias); no celular, sempre tela inteira.\n * sm, md, lg e xl são os nomes antigos e valem 30, 30, 50 e 75.\n */\nconst sizes = {\n '30': 'md:w-sheet-30',\n '40': 'md:w-sheet-40',\n '50': 'md:w-sheet-50',\n '75': 'md:w-sheet-75',\n full: 'md:w-full',\n sm: 'md:w-sheet-30',\n md: 'md:w-sheet-30',\n lg: 'md:w-sheet-50',\n xl: 'md:w-sheet-75',\n} as const\n\nconst overlayCls = 'fixed inset-0 z-50 bg-overlay'\nconst panelCls =\n 'fixed inset-y-0 right-0 z-50 flex h-dvh w-full flex-col bg-card text-card-foreground shadow-lg outline-none md:border-l'\n\nexport interface DrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: ReactNode\n description?: ReactNode\n icon?: ReactNode\n size?: keyof typeof sizes\n children: ReactNode\n /** Rodapé fixo. Normalmente um <ActionBar>. */\n footer?: ReactNode\n /** Há alterações não salvas: fechar pede confirmação. */\n dirty?: boolean\n /** Textos da confirmação de descarte. */\n discardTitle?: string\n discardDescription?: string\n}\n\nexport function Drawer({\n open,\n onOpenChange,\n title,\n description,\n icon,\n size = '30',\n children,\n footer,\n dirty,\n discardTitle = 'Descartar alterações?',\n discardDescription = 'As informações preenchidas neste painel serão perdidas.',\n}: DrawerProps) {\n const [confirming, setConfirming] = useState(false)\n const requestClose = () => (dirty ? setConfirming(true) : onOpenChange(false))\n const motion = useMotionMode()\n const presets = useMotionPresets()\n\n const keepOpenIfDirty = (e: { preventDefault: () => void }) => {\n if (dirty) {\n e.preventDefault()\n setConfirming(true)\n }\n }\n const shell = (\n <OverlayShell\n title={title}\n description={description}\n icon={icon}\n footer={footer}\n onRequestClose={requestClose}\n >\n {children}\n </OverlayShell>\n )\n\n return (\n <>\n <Dialog.Root open={open} onOpenChange={(o) => (o ? onOpenChange(true) : requestClose())}>\n {motion === 'on' ? (\n // `on`: o painel só existe enquanto aberto ou saindo; o Radix fica com forceMount.\n <AnimatePresence>\n {open && (\n <Dialog.Portal forceMount key=\"drawer\">\n <Dialog.Overlay forceMount asChild>\n <m.div className={overlayCls} {...presets.fade} />\n </Dialog.Overlay>\n <Dialog.Content\n forceMount\n asChild\n onEscapeKeyDown={keepOpenIfDirty}\n onPointerDownOutside={keepOpenIfDirty}\n data-rendra=\"GAV-001\"\n className={cn(panelCls, sizes[size])}\n >\n <m.div {...presets.sheet('right')}>{shell}</m.div>\n </Dialog.Content>\n </Dialog.Portal>\n )}\n </AnimatePresence>\n ) : (\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn(\n overlayCls,\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0',\n )}\n />\n <Dialog.Content\n onEscapeKeyDown={keepOpenIfDirty}\n onPointerDownOutside={keepOpenIfDirty}\n data-rendra=\"GAV-001\"\n className={cn(\n panelCls,\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:slide-out-to-right data-[state=open]:animate-in data-[state=open]:slide-in-from-right',\n sizes[size],\n )}\n >\n {shell}\n </Dialog.Content>\n </Dialog.Portal>\n )}\n </Dialog.Root>\n <Modal\n open={confirming}\n onOpenChange={setConfirming}\n type=\"destructive\"\n title={discardTitle}\n description={discardDescription}\n confirmLabel=\"Descartar\"\n cancelLabel=\"Continuar editando\"\n onConfirm={() => onOpenChange(false)}\n />\n </>\n )\n}\n","import { m } from 'motion/react'\nimport { Switch as S } from 'radix-ui'\nimport { useId, type ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionMode, 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 motion = useMotionMode()\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(\n thumbBase,\n motion === 'on' ? 'transition-[translate]' : 'transition-transform',\n )\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 =\n motion === 'on' ? (\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 <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 <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 </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 /** 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 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 {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","/**\n * Mapas de classes das primitivas de layout. Classes completas e estáticas,\n * para o Tailwind encontrá-las. Só os degraus da escala permitida.\n */\nexport type Space =\n '0' | '1' | '2' | '3' | '4' | '6' | '8' | '12' | '16' | '24' | 'section' | 'fields'\n\nexport const gapClass: Record<Space, string> = {\n '0': 'gap-0',\n '1': 'gap-1',\n '2': 'gap-2',\n '3': 'gap-3',\n '4': 'gap-4',\n '6': 'gap-6',\n '8': 'gap-8',\n '12': 'gap-12',\n '16': 'gap-16',\n '24': 'gap-24',\n // Espaço entre seções de página: menor no mobile, cheio no desktop.\n section: 'gap-8 md:gap-12',\n // Entre campos de formulário (Field): 16px do fim de um campo ao rótulo do próximo.\n fields: 'gap-x-4 gap-y-4 md:gap-x-6',\n}\n\n/**\n * Grade de formulário, pela largura do próprio bloco (container query), não da tela:\n * 1 coluna estreito, 6 colunas a partir de 28rem, 12 colunas a partir de 48rem.\n * No largo, o padrão é 3 campos por linha (md = 4/12). Nunca 2 por linha por padrão.\n */\nexport const fieldGridClass = 'grid grid-cols-1 @md:grid-cols-6 @3xl:grid-cols-12'\n\n/** Largura do Field na grade de formulário (no largo, em 12 colunas). */\nexport const fieldSpanClass = {\n /** 2/12, cerca de 17%: UF, número, DDD. */\n xs: '@md:col-span-2 @3xl:col-span-2',\n /** 3/12 = 25%: CEP, CNPJ, CPF, datas curtas. */\n sm: '@md:col-span-2 @3xl:col-span-3',\n /** 4/12 = 33%: o padrão, 3 campos por linha. */\n md: '@md:col-span-3 @3xl:col-span-4',\n /** 6/12 = 50%. */\n lg: '@md:col-span-3 @3xl:col-span-6',\n /** 8/12 = 67%: nome, logradouro longo. */\n xl: '@md:col-span-6 @3xl:col-span-8',\n /** Linha inteira. */\n full: '@md:col-span-6 @3xl:col-span-12',\n} as const\n\nexport type FieldSpan = keyof typeof fieldSpanClass\n\nexport const alignClass = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n} as const\n\nexport const justifyClass = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n} as const\n\nexport type Align = keyof typeof alignClass\nexport type Justify = keyof typeof justifyClass\n","import { Label as L } from 'radix-ui'\nimport {\n cloneElement,\n createContext,\n isValidElement,\n useContext,\n useId,\n type ComponentProps,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { fieldSpanClass, type FieldSpan } from '@/components/layout/tokens'\nimport { cn } from '@/lib/cn'\n\n/*\n * Rótulo, ajuda e erro padronizados.\n * Regras: rótulo sempre acima; obrigatório marcado no rótulo; erro abaixo do campo em\n * espaço reservado (a tela não pula quando o erro aparece).\n */\n\nexport function Label({\n className,\n required,\n children,\n ...props\n}: ComponentProps<typeof L.Root> & { required?: boolean }) {\n return (\n <L.Root\n data-rendra=\"FLD-002\"\n className={cn('text-label text-label-foreground label-case', className)}\n {...props}\n >\n {children}\n {required && (\n <span className=\"text-destructive\" aria-hidden>\n {' '}\n *\n </span>\n )}\n {required && <span className=\"sr-only\"> (obrigatório)</span>}\n </L.Root>\n )\n}\n\ninterface FieldContextValue {\n id: string\n describedBy: string\n invalid: boolean\n}\nconst FieldContext = createContext<FieldContextValue | null>(null)\n\n/** Liga um controle ao Field mais próximo (id, aria-describedby, aria-invalid). */\nexport function useFieldControl() {\n return useContext(FieldContext)\n}\n\nexport interface FieldProps {\n label?: ReactNode\n required?: boolean\n /** Texto de ajuda sempre visível (substitui tooltip no mobile). */\n help?: ReactNode\n /** Mensagem de erro, abaixo do controle, no lugar da ajuda. */\n error?: ReactNode\n /**\n * Largura na grade de formulário (Grid form ou FormSection): xs (17%), sm (25%),\n * md (33%, padrão: 3 por linha), lg (50%), xl (67%), full. half é o antigo e vale md.\n */\n span?: FieldSpan | 'half'\n /** Começa uma linha nova (ex.: os campos que vêm depois do CEP ou do CNPJ). */\n newRow?: boolean\n /**\n * Reserva a linha da mensagem mesmo vazia, para o erro não empurrar o que vem abaixo\n * (útil em formulários em grid de 2 colunas com validação ao digitar). Padrão: não\n * reserva, e os campos ficam mais próximos.\n */\n reserveMessage?: boolean\n /** Obsoleto: sem reserva já é o padrão. Mantido para não quebrar telas existentes. */\n compact?: boolean\n /** id do controle; gerado automaticamente se omitido. */\n id?: string\n className?: string\n children: ReactNode\n}\n\nexport function Field({\n label,\n required,\n help,\n error,\n span = 'md',\n newRow,\n reserveMessage = false,\n id,\n className,\n children,\n}: FieldProps) {\n const auto = useId()\n const controlId = id ?? `campo${auto}`\n const messageId = `${controlId}-mensagem`\n const invalid = Boolean(error)\n const message = error ?? help\n\n // Repassa id e acessibilidade ao controle filho quando ele é um elemento simples.\n const child =\n isValidElement(children) && typeof children.type !== 'string'\n ? cloneElement(children as ReactElement<Record<string, unknown>>, {\n id: (children.props as { id?: string }).id ?? controlId,\n // Só repassa invalid quando há erro, para não vazar o atributo em elementos comuns.\n ...(invalid\n ? { invalid: (children.props as { invalid?: boolean }).invalid ?? true }\n : {}),\n 'aria-describedby': message ? messageId : undefined,\n 'aria-required': required || undefined,\n })\n : children\n\n return (\n <FieldContext.Provider\n value={{ id: controlId, describedBy: message ? messageId : '', invalid }}\n >\n <div\n data-slot=\"field\"\n data-rendra=\"FLD-001\"\n className={cn(\n 'flex min-w-0 flex-col gap-2',\n fieldSpanClass[span === 'half' ? 'md' : span],\n newRow && '@md:col-start-1 @3xl:col-start-1',\n className,\n )}\n >\n {label && (\n <Label htmlFor={controlId} required={required}>\n {label}\n </Label>\n )}\n {child}\n {(reserveMessage || message) && (\n <p\n id={messageId}\n role={invalid ? 'alert' : undefined}\n className={cn(\n '-mt-1 min-h-4 text-help',\n invalid ? 'font-medium text-destructive' : 'text-help-foreground',\n )}\n >\n {message}\n </p>\n )}\n </div>\n </FieldContext.Provider>\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 { Command } from 'cmdk'\nimport { Check, ChevronDown, Plus, Search, X } from 'lucide-react'\nimport { forwardRef, useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { Spinner } from '@/components/ui/spinner'\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 interface SelectOption {\n value: string\n label: string\n description?: string\n icon?: ReactNode\n disabled?: boolean\n /** Agrupa opções sob um título. */\n group?: string\n}\n\ninterface BaseProps {\n options?: SelectOption[]\n placeholder?: string\n /**\n * Nome do campo: título do painel no mobile e, quando o Select não está dentro de um\n * Field (sem id ligado a um rótulo visível), nome acessível do gatilho.\n */\n label?: string\n size?: ControlSize\n invalid?: boolean\n disabled?: boolean\n /** Campo de busca no topo da lista. */\n searchable?: boolean\n /** Permite criar uma opção nova a partir do texto buscado. */\n creatable?: boolean\n onCreate?: (label: string) => SelectOption | Promise<SelectOption>\n /** Busca remota: recebe o texto e devolve as opções. Liga a busca automaticamente. */\n loadOptions?: (query: string) => Promise<SelectOption[]>\n /** Mostra indicador de carregamento na lista. */\n loading?: boolean\n /** Botão de limpar no campo. */\n clearable?: boolean\n emptyText?: string\n id?: string\n className?: string\n 'aria-describedby'?: string\n}\n\n/** Acima deste número de opções, o \"Selecionar todos\" aparece sem a prop `selectAll`. */\nconst SELECT_ALL_AUTO_MIN = 5\n\ninterface SingleProps extends BaseProps {\n multiple?: false\n value?: string | null\n onChange?: (value: string | null) => void\n selectAll?: never\n showCount?: never\n maxChips?: never\n}\n\ninterface MultipleProps extends BaseProps {\n /** Seleção múltipla com checkbox e chips. */\n multiple: true\n value?: string[]\n onChange?: (value: string[]) => void\n /**\n * Linha \"Selecionar todos\" no topo da lista (vira \"Desmarcar todos\" com tudo marcado).\n * Padrão: aparece sozinha com mais de 5 opções; `false` desliga, `true` força com 5 ou menos.\n */\n selectAll?: boolean\n /** Mostra \"3 selecionados\" no lugar dos chips. */\n showCount?: boolean\n /** Máximo de chips visíveis antes de \"+N\". */\n maxChips?: number\n}\n\nexport type SelectProps = SingleProps | MultipleProps\n\n/**\n * Select único do sistema. Busca, múltiplo, selecionar todos, contador, criar opção,\n * busca remota e carregamento são props. No mobile abre como bottom sheet.\n */\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(props, ref) {\n const {\n options: staticOptions = [],\n placeholder = 'Selecione',\n label,\n size,\n invalid,\n disabled,\n searchable,\n creatable,\n onCreate,\n loadOptions,\n loading,\n clearable,\n emptyText = 'Nenhuma opção encontrada.',\n id,\n className,\n } = props\n const multiple = props.multiple === true\n const { isMobile } = useBreakpoint()\n const [open, setOpen] = useState(false)\n const listId = `${useId()}-lista`\n const [query, setQuery] = useState('')\n const [remote, setRemote] = useState<SelectOption[] | null>(null)\n const [remoteLoading, setRemoteLoading] = useState(false)\n const [created, setCreated] = useState<SelectOption[]>([])\n const [innerSingle, setInnerSingle] = useState<string | null>(null)\n const [innerMulti, setInnerMulti] = useState<string[]>([])\n // No mobile, o múltiplo só aplica ao confirmar.\n const [draft, setDraft] = useState<string[]>([])\n\n const selectedSingle = multiple ? null : ((props as SingleProps).value ?? innerSingle)\n const selectedMulti = multiple ? ((props as MultipleProps).value ?? innerMulti) : []\n\n // Busca remota com espera curta entre teclas.\n const seq = useRef(0)\n useEffect(() => {\n if (!loadOptions || !open) return\n const n = ++seq.current\n setRemoteLoading(true)\n const t = window.setTimeout(async () => {\n const res = await loadOptions(query)\n if (n === seq.current) {\n setRemote(res)\n setRemoteLoading(false)\n }\n }, 250)\n return () => window.clearTimeout(t)\n }, [loadOptions, query, open])\n\n const all = useMemo(() => {\n const base = remote ?? staticOptions\n const map = new Map<string, SelectOption>()\n ;[...base, ...created].forEach((o) => map.set(o.value, o))\n return [...map.values()]\n }, [remote, staticOptions, created])\n\n const byValue = (v: string) => all.find((o) => o.value === v)\n const isSearchable = searchable || creatable || Boolean(loadOptions)\n const busy = loading || remoteLoading\n const multiValue = isMobile && multiple ? draft : selectedMulti\n\n const commitSingle = (v: string | null) => {\n setInnerSingle(v)\n ;(props as SingleProps).onChange?.(v)\n }\n const commitMulti = (v: string[]) => {\n setInnerMulti(v)\n ;(props as MultipleProps).onChange?.(v)\n }\n\n const toggle = (v: string) => {\n if (!multiple) {\n commitSingle(v)\n setOpen(false)\n return\n }\n const next = multiValue.includes(v) ? multiValue.filter((x) => x !== v) : [...multiValue, v]\n if (isMobile) setDraft(next)\n else commitMulti(next)\n }\n\n const enabled = all.filter((o) => !o.disabled)\n const allSelected = enabled.length > 0 && enabled.every((o) => multiValue.includes(o.value))\n const showSelectAll =\n multiple && ((props as MultipleProps).selectAll ?? all.length > SELECT_ALL_AUTO_MIN)\n const toggleAll = () => {\n const next = allSelected ? [] : enabled.map((o) => o.value)\n if (isMobile) setDraft(next)\n else commitMulti(next)\n }\n\n const create = async () => {\n const text = query.trim()\n if (!text) return\n const opt = onCreate ? await onCreate(text) : { value: text, label: text }\n setCreated((c) => [...c, opt])\n setQuery('')\n toggle(opt.value)\n }\n\n const onOpenChange = (o: boolean) => {\n setOpen(o)\n if (o) setDraft(selectedMulti)\n else setQuery('')\n }\n\n // ------------------------------------------------ gatilho\n const hasValue = multiple ? selectedMulti.length > 0 : selectedSingle != null\n const maxChips = (props as MultipleProps).maxChips ?? 2\n let display: ReactNode = <span className=\"truncate text-muted-foreground\">{placeholder}</span>\n if (!multiple && selectedSingle != null) {\n const o = byValue(selectedSingle)\n display = (\n <span className=\"flex min-w-0 items-center gap-2\">\n {o?.icon}\n <span className=\"truncate\">{o?.label ?? selectedSingle}</span>\n </span>\n )\n } else if (multiple && selectedMulti.length > 0) {\n display = (props as MultipleProps).showCount ? (\n <span className=\"truncate\">\n {selectedMulti.length} {selectedMulti.length === 1 ? 'selecionado' : 'selecionados'}\n </span>\n ) : (\n <span className=\"flex min-w-0 items-center gap-1 overflow-hidden\">\n {selectedMulti.slice(0, maxChips).map((v) => (\n <span\n key={v}\n className=\"max-w-3xs shrink-0 truncate rounded-item bg-primary-soft px-2 py-1 text-xs leading-none font-medium text-primary-soft-foreground\"\n >\n {byValue(v)?.label ?? v}\n </span>\n ))}\n {selectedMulti.length > maxChips && (\n <span className=\"shrink-0 rounded-item bg-muted px-2 py-1 text-xs leading-none font-medium\">\n +{selectedMulti.length - maxChips}\n </span>\n )}\n </span>\n )\n }\n\n const showClear = clearable && hasValue && !disabled\n const clear = showClear ? (\n <button\n type=\"button\"\n aria-label=\"Limpar seleção\"\n className={cn(\n controlAdornmentButton,\n 'absolute top-1/2 right-8 mr-0 -translate-y-1/2 md:mr-0',\n )}\n onClick={() => (multiple ? commitMulti([]) : commitSingle(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 role=\"combobox\"\n aria-expanded={open}\n aria-controls={listId}\n aria-haspopup=\"listbox\"\n aria-invalid={invalid || undefined}\n aria-describedby={props['aria-describedby']}\n aria-label={id ? undefined : label}\n disabled={disabled}\n data-rendra=\"SEL-001\"\n // Teclas no gatilho não chegam à lista (Enter não seleciona opção com o painel fechado).\n onKeyDown={(e) => e.stopPropagation()}\n className={cn(\n controlFrame({ size, invalid }),\n 'cursor-pointer text-left disabled:cursor-not-allowed disabled:opacity-60',\n className,\n )}\n >\n <span className=\"flex min-w-0 flex-1 items-center\">{display}</span>\n {showClear && <span aria-hidden className={cn(controlAdornmentSpace, '-mr-1')} />}\n <ChevronDown\n aria-hidden\n className={cn(\n 'size-icon-sm shrink-0 text-muted-foreground transition-transform duration-(--rendra-duration-base) ease-move',\n open && 'rotate-180',\n )}\n />\n </button>\n )\n\n // ------------------------------------------------ lista\n const groups = all.reduce<Record<string, SelectOption[]>>((acc, o) => {\n ;(acc[o.group ?? ''] ??= []).push(o)\n return acc\n }, {})\n const q = query.trim().toLowerCase()\n const showCreate = creatable && q && !all.some((o) => o.label.toLowerCase() === q)\n\n const itemClass =\n 'relative flex min-h-touch cursor-pointer items-center gap-3 rounded-item px-3 text-sm outline-none select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent md:min-h-0 md:py-2'\n\n const checkbox = (checked: boolean) => (\n <span\n aria-hidden\n className={cn(\n 'flex size-icon-sm shrink-0 items-center justify-center rounded-item border transition-colors',\n checked ? 'border-primary bg-primary text-primary-foreground' : 'border-input bg-card',\n )}\n >\n {checked && <Check className=\"size-3\" strokeWidth={3} />}\n </span>\n )\n\n const list = (\n <Command.List id={listId} aria-label={label ?? placeholder}>\n {busy && (\n <Command.Loading>\n <div className=\"flex items-center gap-2 px-3 py-4 text-sm text-muted-foreground\">\n <Spinner size=\"sm\" />\n Carregando opções...\n </div>\n </Command.Loading>\n )}\n {!busy && (\n <Command.Empty className=\"px-3 py-6 text-center text-sm text-muted-foreground\">\n {emptyText}\n </Command.Empty>\n )}\n {showCreate && (\n <Command.Item value={`__criar__${query}`} onSelect={create} className={itemClass}>\n <Plus className=\"size-icon-sm shrink-0 text-primary-text\" aria-hidden />\n <span className=\"truncate\">\n Criar <strong className=\"font-semibold\">“{query.trim()}”</strong>\n </span>\n </Command.Item>\n )}\n {showSelectAll && !q && enabled.length > 0 && (\n <Command.Item\n value=\"__todos__\"\n onSelect={toggleAll}\n className={cn(itemClass, 'font-medium')}\n >\n {checkbox(allSelected)}\n {allSelected ? 'Desmarcar todos' : 'Selecionar todos'}\n </Command.Item>\n )}\n {Object.entries(groups).map(([group, opts]) => (\n <Command.Group\n key={group || 'sem-grupo'}\n heading={group || undefined}\n className=\"[&_[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 >\n {opts.map((o) => {\n const checked = multiple ? multiValue.includes(o.value) : selectedSingle === o.value\n return (\n <Command.Item\n key={o.value}\n value={`${o.label} ${o.description ?? ''} ${o.value}`}\n disabled={o.disabled}\n onSelect={() => toggle(o.value)}\n aria-selected={checked}\n className={itemClass}\n >\n {multiple && checkbox(checked)}\n {o.icon && <span className=\"flex shrink-0 [&_svg]:size-icon-sm\">{o.icon}</span>}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className={cn('truncate', checked && !multiple && 'font-medium')}>\n {o.label}\n </span>\n {o.description && (\n <span className=\"truncate text-xs text-muted-foreground\">{o.description}</span>\n )}\n </span>\n {!multiple && checked && (\n <Check className=\"size-icon-sm shrink-0 text-primary-text\" aria-hidden />\n )}\n </Command.Item>\n )\n })}\n </Command.Group>\n ))}\n </Command.List>\n )\n\n const search = isSearchable ? (\n <div className={cn(controlFrame({ size: 'md' }), 'bg-background')}>\n <Search className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n <Command.Input\n value={query}\n onValueChange={setQuery}\n placeholder={creatable ? 'Buscar ou criar...' : 'Buscar...'}\n className=\"h-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground\"\n />\n </div>\n ) : null\n\n const count = multiValue.length\n const footer =\n multiple && (isMobile || count > 0) ? (\n <div className=\"grid grid-actions-2 gap-3\">\n <Button\n variant=\"outline\"\n onClick={() => (isMobile ? setDraft([]) : commitMulti([]))}\n disabled={count === 0}\n >\n Limpar\n </Button>\n {isMobile ? (\n <Button\n onClick={() => {\n commitMulti(draft)\n setOpen(false)\n }}\n >\n Aplicar{count ? ` (${count})` : ''}\n </Button>\n ) : (\n <Button variant=\"secondary\" onClick={() => setOpen(false)}>\n Pronto ({count})\n </Button>\n )}\n </div>\n ) : undefined\n\n return (\n <Command shouldFilter={!loadOptions} loop className=\"contents\" label={label ?? placeholder}>\n <PickerPanel\n open={open}\n onOpenChange={onOpenChange}\n trigger={trigger}\n adornment={clear}\n title={label ?? placeholder}\n header={search}\n footer={footer}\n >\n {list}\n </PickerPanel>\n </Command>\n )\n})\n","import { m } from 'motion/react'\nimport { 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, 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\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 = (\n <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 { useLayoutEffect, useRef } from 'react'\n\n/**\n * Mede o espaço que sobra na área de conteúdo (o <main>) abaixo do elemento e grava em\n * --board-h. Com a classe h-board, o elemento ocupa exatamente essa altura: a página não\n * rola e a rolagem acontece dentro dele (kanban, chat).\n */\nexport function useFillHeight<T extends HTMLElement = HTMLDivElement>() {\n const ref = useRef<T>(null)\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const main = el.closest('main')\n const measure = () => {\n // O quadro fica com a altura que sobra na área de conteúdo depois de tudo o que está\n // acima e abaixo dele (título, ações, respiro da página): a página nunca rola por ele.\n // Nunca menos que 20rem, para caber ao menos alguns cards.\n const h = el.getBoundingClientRect().height\n // Altura real do conteúdo da página (o primeiro filho do <main>), não a de rolagem.\n const page = main?.firstElementChild as HTMLElement | null\n const room =\n main && page\n ? main.clientHeight - (page.getBoundingClientRect().height - h)\n : window.innerHeight - el.getBoundingClientRect().top\n el.style.setProperty('--board-h', `${Math.max(320, Math.floor(room))}px`)\n }\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(document.documentElement)\n if (main) ro.observe(main)\n return () => ro.disconnect()\n }, [])\n return ref\n}\n","import { format } from 'date-fns'\nimport { m } from 'motion/react'\nimport {\n ArrowRightLeft,\n CalendarDays,\n GripVertical,\n Mail,\n MoreHorizontal,\n Phone,\n Plus,\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 { 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 DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\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 { layoutEnabled, useLayoutReady, useMotionMode, useMotionPresets } 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\n/** Contador de quadros, só para o `layoutId` dos cards em `on` (um prefixo por instância). */\nlet boardsCreated = 0\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\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/**\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}\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. */\n renderCard?: (card: KanbanCard) => ReactNode\n /**\n * Valores do card (até 2, lado a lado com divisória) e o total de cada um na coluna.\n * 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 /** Card solto num destino da barra (ou escolhido no menu \"Mover para\"). */\n onDropTarget?: (cardId: string, targetId: string) => void\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\nfunction CardBody({\n card,\n valueFields = [],\n formatValue,\n withHandle,\n}: {\n card: KanbanCard\n valueFields?: KanbanValueField[]\n formatValue: (n: number) => string\n /** Reserva o espaço da alça de arraste no toque, à esquerda do título. */\n withHandle?: boolean\n}) {\n const shown = valueFields.slice(0, 2)\n return (\n <>\n {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 {card.subtitle && (\n <span className=\"text-xs text-muted-foreground tabular-nums\">{card.subtitle}</span>\n )}\n </span>\n {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 {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 {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 {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 {shown.length > 0 && (\n <span className=\"grid grid-cols-2 divide-x rounded-block bg-muted text-xs\">\n {shown.map((f) => (\n <span key={f.key} className=\"flex min-w-0 flex-col px-2 py-1\">\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 {(card.assignee || card.dueDate || card.meta) && (\n <span className=\"flex items-center gap-2 border-t pt-2 text-xs text-muted-foreground\">\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 {card.meta && (\n <span className=\"font-medium text-foreground tabular-nums\">{card.meta}</span>\n )}\n {card.assignee && (\n <span className=\"ml-auto\" title={card.assignee}>\n <Avatar name={card.assignee} size=\"sm\" />\n </span>\n )}\n </span>\n )}\n </>\n )\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 className,\n ...aria\n}: KanbanProps) {\n const code = resolveCatalogCode('Kanban', { hasDropTargets: Boolean(dropTargets?.length) })\n const { isMobile } = useBreakpoint()\n const motion = useMotionMode()\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 // 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\n const inColumn = (id: string) => cards.filter((c) => c.columnId === id)\n\n const drop = (columnId: string, index: number) => {\n if (dragging) onCardMove?.(dragging, columnId, index)\n setDragging(null)\n setOver(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 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 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 /** Barra de destinos, mostrada durante o arraste (mouse ou toque) quando há dropTargets. */\n const targetBar = showTargetBar && (\n <div\n aria-label=\"Soltar em\"\n className=\"fixed inset-x-4 bottom-4 z-30 flex justify-center gap-2 overflow-x-auto rounded-surface border bg-card p-2 shadow-lg\"\n >\n {dropTargets!.map((t) => (\n <div\n key={t.id}\n data-kanban-target={t.id}\n onDragOver={(e) => {\n if (dragging && !t.disabled) e.preventDefault()\n }}\n onDrop={(e) => {\n e.preventDefault()\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 opacity-50'\n : touchDrag?.overTargetId === t.id && 'bg-primary-soft/60 ring-2 ring-ring',\n )}\n >\n {t.icon && (\n <span aria-hidden className={targetIconTone[t.tone ?? 'neutral']}>\n {t.icon}\n </span>\n )}\n <span className=\"font-medium\">{t.label}</span>\n {t.hint && !t.disabled && <span className=\"text-muted-foreground\">{t.hint}</span>}\n {t.disabled && t.disabledReason && (\n <span className=\"text-muted-foreground\">{t.disabledReason}</span>\n )}\n </div>\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 }\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 bg-card 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 body = (\n <>\n {onCardClick ? (\n <button\n type=\"button\"\n onClick={() => onCardClick(card)}\n className=\"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 {renderCard ? (\n renderCard(card)\n ) : (\n <CardBody\n card={card}\n valueFields={valueFields}\n formatValue={formatValue}\n withHandle={showHandle}\n />\n )}\n </button>\n ) : (\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n {renderCard ? (\n renderCard(card)\n ) : (\n <CardBody\n card={card}\n valueFields={valueFields}\n formatValue={formatValue}\n withHandle={showHandle}\n />\n )}\n </div>\n )}\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 (motion === 'on') {\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 <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 </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 totals = (col: KanbanColumn) =>\n (valueFields ?? []).slice(0, 2).map((f) => ({\n ...f,\n total: inColumn(col.id).reduce((sum, c) => sum + (c.values?.[f.key] ?? 0), 0),\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 {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>\n ))}\n </div>\n )}\n </div>\n )\n\n const columnList = (col: KanbanColumn) => {\n const all = inColumn(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 if (isMobile) {\n return (\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: inColumn(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, inColumn(col.id).length)}\n {columnList(col)}\n </div>\n ))}\n </div>\n )\n }\n\n return (\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, inColumn(col.id).length)}</div>\n {columnList(col)}\n </div>\n ))}\n </section>\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 { m } from 'motion/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 { layoutEnabled, useLayoutReady, useMotionMode, useMotionPresets } 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 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 = motion === 'on' ? 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 { m } from 'motion/react'\nimport {\n useRef,\n type ClipboardEvent,\n type CSSProperties,\n type ElementType,\n type KeyboardEvent,\n} from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionMode, 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 on = useMotionMode() === 'on'\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 ? 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 { m } from 'motion/react'\nimport { 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 { useMotionMode, 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({ on, children, ...props }: ComponentProps<typeof R.Item> & { on: boolean }) {\n const presets = useMotionPresets()\n if (!on) return <R.Item {...props}>{children}</R.Item>\n return (\n <R.Item asChild {...props}>\n <m.button\n type=\"button\"\n whileTap={presets.press.whileTap}\n transition={presets.press.transition}\n >\n {children}\n </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 on = useMotionMode() === 'on'\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 <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 on={on}\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 on={on}\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 { animate, m, useMotionValue, useTransform } from 'motion/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 { useMotionMode, 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 presets = useMotionPresets()\n const progress = useMotionValue(0)\n const text = useTransform(progress, (n) => formatLike(parsed, n))\n const [done, setDone] = useState(false)\n useEffect(() => {\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 }, [progress, parsed.value, presets.tokens])\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 motion = useMotionMode()\n const presets = useMotionPresets()\n const parsed = useMemo(() => parseLocaleNumber(value), [value])\n if (motion !== 'on') return <>{value}</>\n if (!parsed || presets.reduced) return <m.span {...presets.fade}>{value}</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 { AnimatePresence, m } from 'motion/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 { useMotionMode, 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 motion = useMotionMode()\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 (motion === 'on') {\n return (\n <Collapsible.Root open={open} onOpenChange={setOpen}>\n {trigger}\n <AnimatePresence initial={false}>\n {open && (\n <Collapsible.Content forceMount asChild>\n <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 </m.div>\n </Collapsible.Content>\n )}\n </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 on = useMotionMode() === 'on'\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 <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 <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 </m.div>\n </td>\n </tr>\n )}\n </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 { CheckCircle2, SkipForward, XCircle } from 'lucide-react'\nimport { m } from 'motion/react'\nimport type { ComponentType, ElementType, ReactNode } from 'react'\nimport type { FeedbackType } from '@/brand/types'\nimport { cn } from '@/lib/cn'\nimport { useMotionMode, useMotionPresets } from '@/lib/motion'\n\nexport interface TimelineEvent {\n id: string\n title: ReactNode\n description?: ReactNode\n /** Data em formato curto (ex.: \"22/09/2026 14:30\"). */\n date: string\n tone?: FeedbackType | 'neutral'\n icon?: ReactNode\n /** Resultado do evento: mostrado com ícone e texto, nunca só pela cor. */\n status?: 'succeeded' | 'failed' | 'skipped'\n}\n\nconst dot: Record<NonNullable<TimelineEvent['tone']>, string> = {\n neutral: 'bg-muted text-muted-foreground',\n info: 'bg-info-soft text-info-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}\n\nconst statusTone: Record<\n NonNullable<TimelineEvent['status']>,\n NonNullable<TimelineEvent['tone']>\n> = {\n succeeded: 'success',\n failed: 'error',\n skipped: 'neutral',\n}\n\nconst statusIcon: Record<\n NonNullable<TimelineEvent['status']>,\n ComponentType<{ className?: string }>\n> = {\n succeeded: CheckCircle2,\n failed: XCircle,\n skipped: SkipForward,\n}\n\nconst statusLabel: Record<NonNullable<TimelineEvent['status']>, string> = {\n succeeded: 'Concluído',\n failed: 'Falhou',\n skipped: 'Ignorado',\n}\n\nconst statusTextTone: Record<NonNullable<TimelineEvent['status']>, string> = {\n succeeded: 'text-success-soft-foreground',\n failed: 'text-destructive-soft-foreground',\n skipped: 'text-muted-foreground',\n}\n\n/** Linha do tempo única, com eventos em ordem e tom semântico por evento. */\nexport function Timeline({ events, className }: { events: TimelineEvent[]; className?: string }) {\n const on = useMotionMode() === 'on'\n const presets = useMotionPresets()\n // Em `on` cada evento entra com slide curto e atraso escalonado (no máximo 10 itens).\n const Item: ElementType = on ? m.li : 'li'\n const enter = presets.slide('bottom', 'short')\n return (\n <ol data-rendra=\"TLN-001\" className={cn('@container flex flex-col', className)}>\n {events.map((e, i) => {\n const StatusIcon = e.status ? statusIcon[e.status] : null\n const tone = e.tone ?? (e.status ? statusTone[e.status] : 'neutral')\n return (\n <Item\n key={e.id}\n className=\"relative flex gap-3 pb-6 last:pb-0\"\n {...(on\n ? { ...enter, transition: { ...enter.transition, ...presets.stagger(i) } }\n : {})}\n >\n {i < events.length - 1 && (\n <span\n aria-hidden\n className=\"absolute top-8 bottom-0 left-4 w-px -translate-x-1/2 bg-border\"\n />\n )}\n <span\n aria-hidden\n className={cn(\n 'relative flex size-8 shrink-0 items-center justify-center rounded-full [&_svg]:size-icon-sm',\n dot[tone],\n )}\n >\n {e.icon ?? (StatusIcon && <StatusIcon />) ?? (\n <span className=\"size-2 rounded-full bg-current\" />\n )}\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1 pt-1\">\n <div className=\"flex min-w-0 flex-col gap-1 @sm:flex-row @sm:items-baseline @sm:justify-between @sm:gap-3\">\n <span className=\"text-sm font-medium wrap-break-word\">{e.title}</span>\n <time className=\"shrink-0 text-xs text-muted-foreground tabular-nums\">\n {e.date}\n </time>\n </div>\n {e.description && (\n <p className=\"text-sm wrap-break-word text-muted-foreground\">{e.description}</p>\n )}\n {e.status && StatusIcon && (\n <span\n className={cn(\n 'inline-flex w-fit items-center gap-1 text-xs font-medium [&_svg]:size-icon-sm',\n statusTextTone[e.status],\n )}\n >\n <StatusIcon />\n {statusLabel[e.status]}\n </span>\n )}\n </div>\n </Item>\n )\n })}\n </ol>\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 { AnimatePresence, m } from 'motion/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 { layoutEnabled, useLayoutReady, useMotionMode, useMotionPresets } 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 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 = motion === 'on' ? 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 motion === 'on' ? (\n <AnimatePresence mode=\"popLayout\" initial={false}>\n {nodes}\n </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 { AnimatePresence, m } from 'motion/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 { useMotionMode, 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 motion = useMotionMode()\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 motion === 'on' ? (\n // O check da etapa concluída entra com o pop.\n <m.span className=\"flex\" {...presets.pop}>\n <Check className=\"size-icon-sm\" strokeWidth={3} aria-hidden />\n </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 motion = useMotionMode()\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 =\n motion === 'on' ? (\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 <AnimatePresence mode=\"popLayout\" initial={false}>\n <m.div key={current} {...presets.swap(direction)} className=\"flex min-w-0 flex-col gap-6\">\n {children[current]}\n </m.div>\n </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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BAAqB;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;GACp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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/components/app-shell/shell-context.ts","../src/components/ui/action-bar.tsx","../src/components/ui/alert.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/overlay-shell.tsx","../src/components/ui/modal.tsx","../src/components/ui/info-hint.tsx","../src/components/ui/card.tsx","../src/components/ui/calendar.tsx","../src/lib/lookup.ts","../src/hooks/use-lookup.ts","../src/lib/control.ts","../src/lib/masks.ts","../src/components/ui/input.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/picker-panel.tsx","../src/components/ui/color-picker.tsx","../src/components/ui/drawer.tsx","../src/components/ui/switch.tsx","../src/components/ui/data-toolbar.tsx","../src/components/layout/tokens.ts","../src/components/ui/field.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/select.tsx","../src/components/ui/tabs.tsx","../src/lib/sortable.ts","../src/components/ui/image-cropper.tsx","../src/components/ui/image-viewer.tsx","../src/hooks/use-fill-height.ts","../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/timeline.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","import { createContext, useContext, type ReactNode } from 'react'\nimport type { ShellLayout } from './layout'\nimport type { NavigationTarget } from './navigation-utils'\nimport type {\n NavGroup,\n NavItem,\n ShellMenuItem,\n ShellNotificationsConfig,\n ShellUser,\n ShellUserMenuConfig,\n ShellWorkspacesConfig,\n} from './types'\n\nexport interface ShellContextValue {\n /** Layout efetivo: padrão interno + prop `layout` do AppShell + escolha do usuário. */\n layout: ShellLayout\n /** Altera uma opção de layout (guardada no navegador do usuário). */\n setLayout: <K extends keyof ShellLayout>(key: K, value: ShellLayout[K]) => void\n /** Altera várias opções de uma vez (ex.: um código de menu M1 a M6). */\n applyLayout: (partial: Partial<ShellLayout>) => void\n /** Volta ao layout padrão do projeto. */\n resetLayout: () => void\n /** Gaveta de navegação aberta no mobile. */\n mobileNavOpen: boolean\n setMobileNavOpen: (open: boolean) => void\n /**\n * Espaço do rodapé fixo da página, entre o conteúdo e a barra inferior. A ActionBar\n * sticky é desenhada aqui: fica sempre colada embaixo, na largura inteira.\n */\n footerSlot: HTMLElement | null\n /** Texto orientativo da tela (PageHeader help): o header mostra o ícone ao lado do título. */\n pageHelp: ReactNode\n setPageHelp: (help: ReactNode) => void\n /** Busca global (Ctrl+K). */\n searchOpen: boolean\n setSearchOpen: (open: boolean) => void\n /** Menu do sistema, recebido pela prop `navigation` do AppShell (obrigatória). */\n navigation: NavGroup[]\n /** Até 4 itens marcados `bottomNav`, calculados a partir de `navigation`. */\n bottomNavItems: NavItem[]\n /** Lista plana de destinos: busca global e cálculo do item ativo. */\n navigationTargets: NavigationTarget[]\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\"). */\n userMenuItems: ShellMenuItem[]\n /** Chamado ao selecionar \"Sair\". Sem ele, o botão não faz nada. */\n onLogout?: () => void\n /** Rótulo do destino inicial na trilha do header. */\n homeLabel: string\n /** Ações rápidas da busca global (ex.: \"Novo cliente\"). */\n quickActions: ShellMenuItem[]\n /** Notificações do sino do header. Sem esta prop, o sino não aparece. */\n notifications?: ShellNotificationsConfig\n /** Submenus Tema, Template e Layout do menu do avatar. Sem esta prop, os três aparecem. */\n userMenu?: ShellUserMenuConfig\n /** Seletor de espaço no topo do menu do avatar. Sem esta prop, não aparece. */\n workspaces?: ShellWorkspacesConfig\n /** Logo que ocupa o lugar do título e da trilha no header, abaixo de `md`. */\n headerLogo?: ReactNode\n}\n\nexport const ShellContext = createContext<ShellContextValue | null>(null)\n\nexport function useShell() {\n const ctx = useContext(ShellContext)\n if (!ctx) throw new Error('useShell precisa estar dentro de <AppShell>.')\n return ctx\n}\n","import { MoreHorizontal } from 'lucide-react'\nimport { useContext, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { ShellContext } from '@/components/app-shell/shell-context'\nimport { Button } from '@/components/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { cn } from '@/lib/cn'\n\nexport interface ActionBarAction {\n label: string\n onClick?: () => void\n icon?: ReactNode\n disabled?: boolean\n destructive?: boolean\n}\n\nexport interface ActionBarProps {\n /** Ação principal: sempre primária (ou destrutiva), 70% da largura. */\n primary: ActionBarAction & {\n type?: 'button' | 'submit'\n form?: string\n loading?: boolean\n loadingLabel?: string\n }\n /** Cancelar: sempre outline, 30% à esquerda. Sem ele, a principal ocupa 100%. */\n cancel?: ActionBarAction\n /** A partir da terceira ação: vão para o menu de três pontinhos. */\n secondary?: ActionBarAction[]\n /**\n * sticky: rodapé fixo das telas de formulário. Fica sempre colado embaixo, na largura\n * inteira, fora da área rolável (nunca sobe, mesmo com formulário curto). Em drawer e\n * modal o rodapé já é fixo; no wizard os botões seguem junto do card. Como o botão fica\n * fora do <form>, use primary.form com o id do formulário para enviar.\n */\n sticky?: boolean\n className?: string\n}\n\n/**\n * Barra de ações única, com a regra de botões do sistema:\n * 1 botão = 100%; 2 botões = cancelar 30% + principal 70%; 3 ou mais = extras no menu.\n * Vale para drawer, modal e formulário em página, em qualquer tamanho de tela.\n */\nexport function ActionBar({ primary, cancel, secondary, sticky, className }: ActionBarProps) {\n const slot = useContext(ShellContext)?.footerSlot\n const hasMenu = Boolean(secondary?.length)\n const layout = cancel\n ? hasMenu\n ? 'grid-actions-3'\n : 'grid-actions-2'\n : hasMenu\n ? 'grid-actions-3'\n : ''\n\n const bar = (\n <div\n data-rendra=\"ACB-001\"\n className={cn(\n sticky && 'border-t bg-card px-4 pt-4 pb-safe md:px-6',\n // Fora do AppShell (Storybook, telas soltas): fixo no fim da área rolável.\n sticky && !slot && 'sticky bottom-0 z-20',\n className,\n )}\n >\n <div className={cn('grid gap-3', layout || 'grid-cols-1', sticky && 'w-full')}>\n {hasMenu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" iconOnly aria-label=\"Mais ações\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" side=\"top\">\n {secondary!.map((a) => (\n <DropdownMenuItem\n key={a.label}\n onSelect={a.onClick}\n disabled={a.disabled}\n destructive={a.destructive}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {cancel ? (\n <Button\n variant=\"outline\"\n icon={cancel.icon}\n onClick={cancel.onClick}\n disabled={cancel.disabled || primary.loading}\n fullWidth\n >\n {cancel.label}\n </Button>\n ) : hasMenu ? (\n <span aria-hidden />\n ) : null}\n <Button\n type={primary.type ?? 'button'}\n form={primary.form}\n variant={primary.destructive ? 'destructive' : 'primary'}\n icon={primary.icon}\n onClick={primary.onClick}\n disabled={primary.disabled}\n loading={primary.loading}\n fullWidth\n >\n {primary.loading ? (primary.loadingLabel ?? 'Salvando...') : primary.label}\n </Button>\n </div>\n </div>\n )\n return sticky && slot ? createPortal(bar, slot) : bar\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\nimport { X } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { useBrand } from '@/brand/use-brand'\nimport type { FeedbackType } from '@/brand/types'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { cn } from '@/lib/cn'\n\n/**\n * Alert único do sistema: ícone da marca à esquerda, título em destaque e descrição.\n * O tipo é prop; o formato vem do template ativo (quadrado, meio-termo ou arredondado).\n */\nconst alertVariants = cva('flex w-full min-w-0 items-start gap-3 rounded-control border', {\n variants: {\n type: {\n success: 'border-success/25 bg-success-soft text-success-soft-foreground',\n error: 'border-destructive/25 bg-destructive-soft text-destructive-soft-foreground',\n warning: 'border-warning/25 bg-warning-soft text-warning-soft-foreground',\n info: 'border-info/25 bg-info-soft text-info-soft-foreground',\n },\n },\n defaultVariants: { type: 'info' },\n})\n\nexport interface AlertProps extends VariantProps<typeof alertVariants> {\n type: FeedbackType\n /** Título curto, em negrito. */\n title: ReactNode\n /** Texto de apoio abaixo do título. */\n description?: ReactNode\n /** Ação opcional à direita (ex.: botão \"Desfazer\"). */\n action?: ReactNode\n /** Mostra botão de fechar. */\n onDismiss?: () => void\n /** Anima o ícone na entrada (check se formando, X se riscando). */\n animated?: boolean\n className?: string\n}\n\nexport function Alert({\n type,\n title,\n description,\n action,\n onDismiss,\n animated = false,\n className,\n}: AlertProps) {\n const { shape } = useBrand()\n const pill = shape === 'pill'\n return (\n <div\n role={type === 'error' || type === 'warning' ? 'alert' : 'status'}\n data-rendra=\"ALRT-001\"\n className={cn(\n alertVariants({ type }),\n pill ? 'items-center py-3 pr-4 pl-4 md:pr-6' : 'p-4',\n className,\n )}\n >\n <BrandFeedbackIcon\n type={type}\n size=\"lg\"\n animated={animated}\n className={cn(!pill && 'mt-px')}\n />\n <div className={cn('flex min-w-0 flex-1 flex-col', !pill && 'gap-1')}>\n <p className=\"text-sm font-semibold\">{title}</p>\n {description && <p className=\"text-sm opacity-90\">{description}</p>}\n </div>\n {action && <div className=\"shrink-0 self-center\">{action}</div>}\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Fechar aviso\"\n className={cn(\n 'flex size-touch shrink-0 items-center justify-center rounded-full transition-colors hover:bg-card/60 md:size-8',\n pill ? '-my-2' : '-mt-2 -mr-2',\n )}\n >\n <X className=\"size-icon-sm\" aria-hidden />\n </button>\n )}\n </div>\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 { X } from 'lucide-react'\nimport { Dialog } from 'radix-ui'\nimport type { ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\n\n/*\n * Estrutura interna de Drawer e Modal (não usar direto nas telas):\n * header fixo (ícone, título, descrição, fechar), body como única área rolável\n * e footer fixo com borda superior, respeitando a área segura do aparelho.\n */\n\ninterface OverlayShellProps {\n title: ReactNode\n description?: ReactNode\n icon?: ReactNode\n children: ReactNode\n footer?: ReactNode\n /** Esconde o header visualmente (o título continua para leitores de tela). */\n hideHeader?: boolean\n onRequestClose: () => void\n bodyClassName?: string\n}\n\nexport function OverlayShell({\n title,\n description,\n icon,\n children,\n footer,\n hideHeader,\n onRequestClose,\n bodyClassName,\n}: OverlayShellProps) {\n const closeButton = (\n <button\n type=\"button\"\n onClick={onRequestClose}\n aria-label=\"Fechar\"\n className={cn(\n '-mt-1 -mr-2 flex size-touch shrink-0 cursor-pointer items-center justify-center rounded-item text-muted-foreground transition-colors hover:bg-accent hover:text-foreground md:size-control-md',\n // Sem cabeçalho visível, o botão sai do header oculto e fica invisível (sem clip, para\n // receber clique e foco), aparecendo só com foco de teclado.\n hideHeader &&\n 'pointer-events-auto m-0 cursor-default opacity-0 focus-visible:cursor-pointer focus-visible:opacity-100',\n )}\n >\n <X className=\"size-icon-md\" aria-hidden />\n </button>\n )\n\n return (\n <>\n {hideHeader && (\n <div className=\"pointer-events-none absolute inset-x-0 top-0 z-10 flex justify-end px-2 pt-safe md:px-4 md:pt-4\">\n {closeButton}\n </div>\n )}\n <header\n className={cn(\n 'flex shrink-0 items-start gap-3 border-b px-4 pt-safe pb-4 md:px-6 md:pt-6',\n hideHeader && 'sr-only',\n )}\n >\n {icon && (\n <span\n aria-hidden\n className=\"flex size-control-md shrink-0 items-center justify-center rounded-control bg-primary-soft text-primary-soft-foreground [&_svg]:size-icon-md\"\n >\n {icon}\n </span>\n )}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1 pt-1\">\n <Dialog.Title className=\"text-lg font-semibold wrap-break-word\">{title}</Dialog.Title>\n {description ? (\n <Dialog.Description className=\"text-sm wrap-break-word text-muted-foreground\">\n {description}\n </Dialog.Description>\n ) : (\n <Dialog.Description className=\"sr-only\">{title}</Dialog.Description>\n )}\n </div>\n {!hideHeader && closeButton}\n </header>\n <div\n className={cn(\n 'min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 py-6 md:px-6',\n bodyClassName,\n )}\n >\n {children}\n </div>\n {footer && (\n <footer className=\"shrink-0 border-t bg-card px-4 pt-4 pb-safe md:px-6 md:pb-6\">\n {footer}\n </footer>\n )}\n </>\n )\n}\n","import { Dialog } from 'radix-ui'\nimport { useState, type ReactNode } from 'react'\nimport { resolveCatalogCode } from '@/catalog/components'\nimport { BrandFeedbackIcon } from '@/components/ui/brand-feedback-icon'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { cn } from '@/lib/cn'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\nimport { OverlayShell } from './overlay-shell'\n\n/*\n * Modal único. Só para confirmações, mensagens e formulários de até 3 campos simples.\n * Mais que isso vai em Drawer (até ~12 campos) ou em página inteira. Nunca modal dentro de modal.\n * type confirm pergunta com ícone de info e ação principal primária\n * type destructive ação irreversível: ícone de erro e ação principal destrutiva\n * type info só informa: um botão de largura total\n * type form até 3 campos no body, ações no rodapé\n */\n\nexport type ModalType = 'confirm' | 'destructive' | 'info' | 'form'\n\nconst sizes = { sm: 'md:max-w-sm', md: 'md:max-w-lg', lg: 'md:max-w-2xl' } as const\n\nexport interface ModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: string\n description?: ReactNode\n type?: ModalType\n size?: keyof typeof sizes\n /** Conteúdo do body (em form, os campos). */\n children?: ReactNode\n confirmLabel?: string\n /**\n * Rótulo do botão de cancelar. Em `confirm` e `destructive` o padrão é \"Cancelar\". Em `info`\n * não há botão de cancelar: o segundo botão só aparece quando `cancelLabel` é passado.\n */\n cancelLabel?: string\n /** Pode ser assíncrono: o botão mostra carregamento até terminar. */\n onConfirm?: () => void | Promise<void>\n /** id do <form> quando type=\"form\" (o botão principal vira submit dele). */\n formId?: string\n /** Estado de envio controlado de fora (ex.: isSubmitting do React Hook Form). */\n loading?: boolean\n}\n\n// Classes do Tailwind do caminho `off`; em `on` o Motion anima e `tw-animate-css` sai.\nconst overlayCls = 'fixed inset-0 z-50 bg-overlay'\nconst overlayOffCls = cn(\n overlayCls,\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0',\n)\nconst contentCls = cn(\n // Mobile: tela inteira. Desktop: centralizado.\n 'fixed inset-0 z-50 flex h-dvh flex-col bg-card text-card-foreground outline-none',\n 'md:inset-auto md:top-1/2 md:left-1/2 md:h-auto md:max-h-sheet md:w-full md:-translate-x-1/2 md:-translate-y-1/2 md:rounded-surface md:border md:shadow-lg',\n)\n\nconst feedback = { confirm: 'info', destructive: 'error', info: 'info' } as const\n\nexport function Modal({\n open,\n onOpenChange,\n title,\n description,\n type = 'confirm',\n size = 'sm',\n children,\n confirmLabel = type === 'destructive' ? 'Excluir' : type === 'info' ? 'Entendi' : 'Confirmar',\n cancelLabel,\n onConfirm,\n formId,\n loading,\n}: ModalProps) {\n const [busy, setBusy] = useState(false)\n const close = () => onOpenChange(false)\n const confirm = async () => {\n if (!onConfirm) return close()\n try {\n setBusy(true)\n await onConfirm()\n close()\n } finally {\n setBusy(false)\n }\n }\n const isForm = type === 'form'\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const { isMobile } = useBreakpoint()\n\n // destructive tem o mesmo formato do confirm (só muda a cor): mesmo código, MOD-001.\n // O desvio fica explícito de propósito: sem ele, destructive só cairia em MOD-001\n // pelo fallback de resolveCatalogCode (o primeiro código do Modal no catálogo), ou\n // seja, dependeria da ordem das entradas em src/catalog/components.ts.\n const code = resolveCatalogCode('Modal', {\n type: type === 'destructive' ? 'confirm' : type,\n })\n const sizeCls = sizes[size]\n const shell = (\n <OverlayShell\n title={title}\n description={isForm ? description : undefined}\n hideHeader={!isForm}\n onRequestClose={close}\n bodyClassName={cn(!isForm && 'flex flex-col items-center justify-center gap-4 text-center')}\n footer={\n <ActionBar\n primary={{\n label: confirmLabel,\n destructive: type === 'destructive',\n loading: busy || loading,\n loadingLabel: `${confirmLabel}...`,\n type: isForm && formId ? 'submit' : 'button',\n form: isForm ? formId : undefined,\n onClick: isForm && formId ? undefined : confirm,\n }}\n cancel={\n type === 'info' && cancelLabel === undefined\n ? undefined\n : { label: cancelLabel ?? 'Cancelar', onClick: close }\n }\n />\n }\n >\n {!isForm && (\n <>\n <BrandFeedbackIcon type={feedback[type as keyof typeof feedback]} size=\"2xl\" animated />\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-lg font-semibold wrap-anywhere\">{title}</p>\n {description && (\n <p className=\"text-sm wrap-anywhere text-muted-foreground\">{description}</p>\n )}\n </div>\n {children}\n </>\n )}\n {isForm && <div className=\"flex flex-col gap-2\">{children}</div>}\n </OverlayShell>\n )\n\n // `on`: o conteúdo só existe enquanto aberto ou saindo (AnimatePresence); o Radix fica com\n // forceMount e o `m.div` entra por asChild, preservando data-rendra e o foco do Dialog.\n if (lib) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <lib.AnimatePresence>\n {open && (\n <Dialog.Portal forceMount key=\"modal\">\n <Dialog.Overlay forceMount asChild>\n <lib.m.div className={overlayCls} {...presets.fade} />\n </Dialog.Overlay>\n <Dialog.Content\n forceMount\n asChild\n data-rendra={code}\n className={cn(contentCls, sizeCls)}\n >\n {/* Em tela cheia (celular) a escala do centro perde o sentido: entra de baixo, 8 px. */}\n <lib.m.div {...presets.open(isMobile ? { y: 8 } : undefined)}>{shell}</lib.m.div>\n </Dialog.Content>\n </Dialog.Portal>\n )}\n </lib.AnimatePresence>\n </Dialog.Root>\n )\n }\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className={overlayOffCls} />\n <Dialog.Content\n data-rendra={code}\n className={cn(\n contentCls,\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0 md:data-[state=open]:zoom-in-95',\n sizeCls,\n )}\n >\n {shell}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","import { Info } from 'lucide-react'\nimport { useState, type ReactNode } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { Modal } from '@/components/ui/modal'\nimport { cn } from '@/lib/cn'\n\n/*\n * Texto orientativo (como usar a tela, o que um campo faz, de onde vem um número). Nunca fica\n * solto no corpo da tela nem num botão \"Saiba mais\" avulso: é um ícone de informação discreto,\n * ao lado do título a que se refere, que abre um Modal informativo.\n * Onde aparece: PageHeader help (ao lado do título da tela, no header fixo), CardTitle help e\n * FormSection help (ao lado do título do card). Use direto só quando nenhum desses servir.\n */\n\nexport interface InfoHintProps {\n /** Título do modal (em geral, o título da tela ou da seção). */\n title: string\n /** O texto orientativo. Pode ter parágrafos e listas. */\n children: ReactNode\n className?: string\n}\n\nexport function InfoHint({ title, children, className }: InfoHintProps) {\n const [open, setOpen] = useState(false)\n return (\n // Wrapper sem layout próprio (display: contents): o botão é o único elemento sempre\n // presente (o Modal só monta o próprio conteúdo quando aberto), então o data-rendra\n // do InfoHint vive aqui, não no botão (que já carrega o código do Button).\n <span className=\"contents\" data-rendra=\"INFO-001\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Sobre: ${title}`}\n onClick={() => setOpen(true)}\n className={cn(\n 'shrink-0 text-muted-foreground hover:text-primary-text max-md:size-touch',\n className,\n )}\n >\n <Info aria-hidden />\n </Button>\n <Modal open={open} onOpenChange={setOpen} type=\"info\" title={title} size=\"md\">\n <div className=\"flex flex-col gap-3 text-sm text-muted-foreground\">{children}</div>\n </Modal>\n </span>\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","/*\n * Buscas que preenchem o formulário, direto do navegador (APIs públicas e gratuitas, com\n * CORS liberado, sem backend):\n * CEP ViaCEP https://viacep.com.br\n * CNPJ BrasilAPI https://brasilapi.com.br\n * Regra de tela: o campo que faz a busca vem primeiro (25% da linha) e os campos que ele\n * preenche ficam abaixo, para a pessoa saber da busca antes de digitar o resto.\n */\n\nconst digits = (v: string) => v.replace(/\\D/g, '')\n\nexport interface Address {\n cep: string\n logradouro: string\n complemento: string\n bairro: string\n cidade: string\n uf: string\n}\n\n/** Endereço do CEP (8 dígitos). null se não existir; lança erro se a busca falhar. */\nexport async function lookupCep(cep: string, signal?: AbortSignal): Promise<Address | null> {\n const d = digits(cep)\n if (d.length !== 8) return null\n const res = await fetch(`https://viacep.com.br/ws/${d}/json/`, { signal })\n if (!res.ok) throw new Error('Não foi possível buscar o CEP agora.')\n const data = (await res.json()) as Record<string, string | boolean>\n if (data.erro) return null\n return {\n cep: String(data.cep ?? ''),\n logradouro: String(data.logradouro ?? ''),\n complemento: String(data.complemento ?? ''),\n bairro: String(data.bairro ?? ''),\n cidade: String(data.localidade ?? ''),\n uf: String(data.uf ?? ''),\n }\n}\n\nexport interface Company {\n razaoSocial: string\n nomeFantasia: string\n email: string\n telefone: string\n situacao: string\n endereco: Address & { numero: string }\n}\n\n/** Dados públicos do CNPJ (14 dígitos). null se não existir; lança erro se a busca falhar. */\nexport async function lookupCnpj(cnpj: string, signal?: AbortSignal): Promise<Company | null> {\n const d = digits(cnpj)\n if (d.length !== 14) return null\n const res = await fetch(`https://brasilapi.com.br/api/cnpj/v1/${d}`, { signal })\n if (res.status === 404) return null\n if (!res.ok) throw new Error('Não foi possível buscar o CNPJ agora.')\n const data = (await res.json()) as Record<string, string | number | null>\n const s = (k: string) => (data[k] == null ? '' : String(data[k]))\n const fone = digits(s('ddd_telefone_1'))\n return {\n razaoSocial: s('razao_social'),\n nomeFantasia: s('nome_fantasia'),\n email: s('email').toLowerCase(),\n telefone:\n fone.length >= 10 ? `(${fone.slice(0, 2)}) ${fone.slice(2, -4)}-${fone.slice(-4)}` : '',\n situacao: s('descricao_situacao_cadastral'),\n endereco: {\n cep: s('cep'),\n logradouro: [s('descricao_tipo_de_logradouro'), s('logradouro')].filter(Boolean).join(' '),\n numero: s('numero'),\n complemento: s('complemento'),\n bairro: s('bairro'),\n cidade: s('municipio'),\n uf: s('uf'),\n },\n }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { lookupCep, lookupCnpj, type Address, type Company } from '@/lib/lookup'\n\n/** Resultado da busca embutida no Input (CEP e CNPJ). */\nexport type LookupResult =\n | { status: 'loading'; kind: 'cep' | 'cnpj' }\n | { status: 'found'; kind: 'cep'; data: Address; message: string }\n | { status: 'found'; kind: 'cnpj'; data: Company; message: string }\n | { status: 'not-found'; kind: 'cep' | 'cnpj'; message: string }\n | { status: 'error'; kind: 'cep' | 'cnpj'; message: string }\n\n/**\n * Busca CEP (8 dígitos) ou CNPJ (14 dígitos) assim que o valor fica completo. Cancela a\n * busca anterior quando o valor muda. `kind` 'auto' decide pelo tamanho (CPF ou CNPJ: só\n * o CNPJ busca). Sem `onResult`, não faz nada.\n */\nexport function useLookup(\n kind: 'cep' | 'cnpj' | 'auto' | undefined,\n value: string,\n onResult: ((r: LookupResult) => void) | undefined,\n) {\n const [loading, setLoading] = useState(false)\n const cb = useRef(onResult)\n cb.current = onResult\n const digits = value.replace(/\\D/g, '')\n const target =\n kind === 'cep' && digits.length === 8\n ? 'cep'\n : (kind === 'cnpj' || kind === 'auto') && digits.length === 14\n ? 'cnpj'\n : null\n const enabled = Boolean(onResult) && target !== null\n\n useEffect(() => {\n if (!enabled || !target) return\n const ctrl = new AbortController()\n const send = (r: LookupResult) => {\n if (!ctrl.signal.aborted) cb.current?.(r)\n }\n setLoading(true)\n send({ status: 'loading', kind: target })\n const run =\n target === 'cep'\n ? lookupCep(digits, ctrl.signal).then((data) =>\n data\n ? send({\n status: 'found',\n kind: 'cep',\n data,\n message: 'Endereço preenchido pelo CEP.',\n })\n : send({\n status: 'not-found',\n kind: 'cep',\n message: 'CEP não encontrado. Preencha o endereço.',\n }),\n )\n : lookupCnpj(digits, ctrl.signal).then((data) =>\n data\n ? send({\n status: 'found',\n kind: 'cnpj',\n data,\n message: `${data.situacao ? `Situação: ${data.situacao}. ` : ''}Dados preenchidos pelo CNPJ.`,\n })\n : send({\n status: 'not-found',\n kind: 'cnpj',\n message: 'CNPJ não encontrado. Preencha os dados abaixo.',\n }),\n )\n run\n .catch((e: unknown) =>\n send({\n status: 'error',\n kind: target,\n message: e instanceof Error ? e.message : 'Não foi possível buscar agora.',\n }),\n )\n .finally(() => {\n if (!ctrl.signal.aborted) setLoading(false)\n })\n return () => {\n ctrl.abort()\n setLoading(false)\n }\n }, [enabled, target, digits])\n\n return loading\n}\n","import { cva, type VariantProps } from 'class-variance-authority'\n\n/**\n * Moldura única dos campos (Input, Select, DatePicker, Textarea). Mesma altura dos botões\n * em cada tamanho; fonte de 16px no mobile para o iOS não dar zoom ao focar.\n */\n/** Marque o elemento com data-slot=\"control\": o teste de toque mede a moldura, não o input. */\nexport const controlFrame = cva(\n 'group/control flex w-full min-w-0 items-center gap-2 rounded-control border border-input bg-field text-base text-foreground transition-[border-color,box-shadow] duration-150 focus-within:border-ring focus-within:bg-card focus-within:ring-2 focus-within:ring-ring/25 hover:border-foreground/40 has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-60 has-[:disabled]:hover:border-input md:text-sm',\n {\n variants: {\n size: {\n sm: 'h-control-sm px-3',\n md: 'h-control-md px-3',\n lg: 'h-control-lg px-4',\n },\n invalid: {\n true: 'border-destructive focus-within:border-destructive focus-within:ring-destructive/25 hover:border-destructive',\n false: '',\n },\n },\n defaultVariants: { size: 'md', invalid: false },\n },\n)\n\nexport type ControlSize = NonNullable<VariantProps<typeof controlFrame>['size']>\n\n/** Classe do <input> nativo dentro da moldura. */\nexport const controlInput =\n 'h-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed'\n\n/** Botão pequeno dentro da moldura (limpar, mostrar senha). */\nexport const controlAdornmentButton =\n '-mr-2 flex size-control-sm shrink-0 cursor-pointer items-center justify-center rounded-item text-muted-foreground transition-colors outline-none hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring md:-mr-1 md:size-8 [&_svg]:size-icon-sm'\n\n/**\n * Reserva, dentro de um gatilho, o espaço do botão sobreposto (limpar do Select e do\n * DatePicker), para o texto não passar por baixo dele.\n */\nexport const controlAdornmentSpace = 'size-control-sm shrink-0 md:size-8'\n","import type { FactoryArg } from 'imask'\n\n/** Máscaras disponíveis na prop mask do Input. Cada uma já define o teclado certo no mobile. */\nexport type MaskName =\n 'cpf' | 'cnpj' | 'cpfCnpj' | 'phone' | 'cep' | 'date' | 'time' | 'currency' | 'percent'\n\ntype InputMode = 'numeric' | 'tel' | 'decimal'\n\nconst numberBlock = (scale: number, max?: number) => ({\n mask: Number,\n scale,\n thousandsSeparator: '.',\n radix: ',',\n mapToRadix: ['.'],\n padFractionalZeros: true,\n normalizeZeros: true,\n min: 0,\n ...(max !== undefined ? { max } : {}),\n})\n\nexport const masks: Record<\n MaskName,\n { options: FactoryArg; inputMode: InputMode; placeholder: string }\n> = {\n cpf: { options: { mask: '000.000.000-00' }, inputMode: 'numeric', placeholder: '000.000.000-00' },\n cnpj: {\n options: { mask: '00.000.000/0000-00' },\n inputMode: 'numeric',\n placeholder: '00.000.000/0000-00',\n },\n // CPF até 11 dígitos, CNPJ a partir do 12º: a máscara troca sozinha.\n cpfCnpj: {\n options: { mask: [{ mask: '000.000.000-00' }, { mask: '00.000.000/0000-00' }] },\n inputMode: 'numeric',\n placeholder: 'CPF ou CNPJ',\n },\n phone: {\n options: { mask: [{ mask: '(00) 0000-0000' }, { mask: '(00) 00000-0000' }] },\n inputMode: 'tel',\n placeholder: '(00) 00000-0000',\n },\n cep: { options: { mask: '00000-000' }, inputMode: 'numeric', placeholder: '00000-000' },\n date: { options: { mask: '00/00/0000' }, inputMode: 'numeric', placeholder: 'DD/MM/AAAA' },\n time: { options: { mask: '00:00' }, inputMode: 'numeric', placeholder: '00:00' },\n currency: {\n options: { mask: 'R$ num', lazy: false, blocks: { num: numberBlock(2) } } as FactoryArg,\n inputMode: 'decimal',\n placeholder: 'R$ 0,00',\n },\n percent: {\n options: { mask: 'num %', lazy: false, blocks: { num: numberBlock(2, 100) } } as FactoryArg,\n inputMode: 'decimal',\n placeholder: '0,00 %',\n },\n}\n\n/** Máscara de percentual com teto configurável (padrão 100), para o Input com unidades (A9). */\nexport function percentMask(max = 100) {\n return {\n options: { mask: 'num %', lazy: false, blocks: { num: numberBlock(2, max) } } as FactoryArg,\n inputMode: 'decimal' as InputMode,\n placeholder: '0,00 %',\n }\n}\n\n/** País para o seletor de DDI do telefone. */\nexport interface PhoneCountry {\n /** DDI sem o \"+\", ex.: \"55\". */\n ddi: string\n /** Nome em português, mostrado na lista. */\n name: string\n}\n\n/** DDI padrão do campo de telefone. */\nexport const DEFAULT_DDI = '55'\n\n/** Lista padrão do seletor de DDI (Brasil primeiro). Troque com a prop ddiOptions do Input. */\nexport const phoneCountries: PhoneCountry[] = [\n { ddi: '55', name: 'Brasil' },\n { ddi: '54', name: 'Argentina' },\n { ddi: '56', name: 'Chile' },\n { ddi: '57', name: 'Colômbia' },\n { ddi: '595', name: 'Paraguai' },\n { ddi: '598', name: 'Uruguai' },\n { ddi: '52', name: 'México' },\n { ddi: '1', name: 'Estados Unidos e Canadá' },\n { ddi: '351', name: 'Portugal' },\n { ddi: '34', name: 'Espanha' },\n { ddi: '33', name: 'França' },\n { ddi: '39', name: 'Itália' },\n { ddi: '49', name: 'Alemanha' },\n { ddi: '44', name: 'Reino Unido' },\n]\n\n/** Máscara do número fora do Brasil: só dígitos, em grupos, até 15 (limite do padrão E.164). */\nexport const internationalPhoneMask = {\n options: { mask: '000 000 000 000 000' } as FactoryArg,\n inputMode: 'tel' as InputMode,\n placeholder: 'Número com DDD',\n}\n\n/** Número completo no padrão internacional: toE164(\"55\", \"(11) 91234-5678\") = \"+5511912345678\". */\nexport function toE164(ddi: string, national: string) {\n const digits = national.replace(/\\D/g, '')\n return digits ? `+${ddi}${digits}` : ''\n}\n\n/** Converte \"R$ 1.250,00\" ou \"12,5 %\" em número. */\nexport function parseLocaleNumber(masked: string): number | null {\n const clean = masked.replace(/[^\\d,-]/g, '').replace(',', '.')\n if (!clean) return null\n const n = Number(clean)\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * Moeda em centavos inteiros, sem erro de arredondamento de ponto flutuante:\n * \"R$ 1.250,50\" -> 125050. Vazio -> null. Use centavos para guardar e somar dinheiro.\n */\nexport function toCents(masked: string): number | null {\n const d = masked.replace(/\\D/g, '')\n if (!d) return null\n const hasDecimals = /,\\d{1,2}\\s*$/.test(masked.replace(/\\s*%$/, ''))\n if (!hasDecimals) return Number(d) * 100\n const [int = '', dec = ''] = masked.replace(/[^\\d,]/g, '').split(',')\n return Number(int || '0') * 100 + Number(dec.padEnd(2, '0').slice(0, 2))\n}\n\n/** Centavos para o texto do campo de moeda: 125050 -> \"R$ 1.250,50\". */\nexport function formatCents(cents: number) {\n return formatCurrency(cents / 100)\n}\n\n/** Formata número como moeda brasileira: 1250 -> \"R$ 1.250,00\". */\nexport function formatCurrency(value: number) {\n return value.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' })\n}\n","import IMask, { type FactoryArg, type InputMask } from 'imask'\nimport { ChevronDown, Eye, EyeOff, X } from 'lucide-react'\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ChangeEvent,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { Button } from '@/components/ui/button'\nimport { Spinner } from '@/components/ui/spinner'\nimport { useLookup, type LookupResult } from '@/hooks/use-lookup'\nimport { cn } from '@/lib/cn'\nimport { controlAdornmentButton, controlFrame, controlInput, type ControlSize } from '@/lib/control'\nimport {\n DEFAULT_DDI,\n internationalPhoneMask,\n masks,\n percentMask,\n phoneCountries,\n toCents,\n type MaskName,\n type PhoneCountry,\n} from '@/lib/masks'\n\n/** Uma unidade do seletor embutido do Input (A9). */\nexport interface InputUnitOption {\n /** \"percent\" e \"currency\" ligam a máscara de percentual e de moeda automaticamente. */\n id: string\n label: string\n}\n\nexport interface InputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'onChange'\n> {\n size?: ControlSize\n /** Máscara brasileira. Define também o teclado do celular (inputMode). */\n mask?: MaskName\n /** Ícone à esquerda. */\n icon?: ReactNode\n /** Conteúdo fixo à direita (ex.: \"kg\", \"dias\"). Ignorado quando `units` está presente. */\n suffix?: ReactNode\n /** Mostra botão para limpar quando há valor. */\n clearable?: boolean\n /** Estado de erro (normalmente vem do Field). */\n invalid?: boolean\n value?: string\n /** Recebe o valor como aparece no campo (com máscara). */\n onChange?: (value: string) => void\n /** Recebe o valor sem máscara (só dígitos, ou número para moeda e percentual). */\n onValueChange?: (unmasked: string, masked: string) => void\n /**\n * Telefone (mask=\"phone\"): DDI escolhido no seletor embutido à esquerda, sem o \"+\".\n * Padrão \"55\". Com +55 a máscara é a brasileira; com outro DDI, só dígitos.\n * O valor do campo continua sendo o número nacional; o completo sai de toE164(ddi, valor).\n */\n ddi?: string\n onDdiChange?: (ddi: string) => void\n /** Países do seletor de DDI. Padrão: phoneCountries (Brasil primeiro). */\n ddiOptions?: PhoneCountry[]\n /** Esconde o seletor de DDI do telefone (só números brasileiros). */\n hideDdi?: boolean\n /**\n * Moeda (mask=\"currency\"): recebe o valor em centavos inteiros (R$ 1.250,50 -> 125050),\n * ou null quando vazio. Guarde e some dinheiro sempre em centavos.\n */\n onCentsChange?: (cents: number | null) => void\n /**\n * CEP, CNPJ e CPF ou CNPJ (mask=\"cep\", \"cnpj\" ou \"cpfCnpj\"): busca os dados assim que o\n * campo fica completo (ViaCEP e BrasilAPI), mostra o carregamento no campo e entrega o\n * resultado. A tela decide o que preencher; use `result.message` como ajuda do Field.\n */\n onLookup?: (result: LookupResult) => void\n /**\n * Unidades (A9): seletor embutido à direita, no mesmo padrão do seletor de DDI. O id\n * \"percent\" liga a máscara de percentual (teto configurável por `percentMax`); \"currency\"\n * liga a máscara de moeda (R$ 1.250,00). Qualquer outro id não aplica máscara, só rótulo.\n * Trocar de unidade sempre limpa o valor do campo.\n */\n units?: InputUnitOption[]\n /** Unidade escolhida (controlada). Sem ela, usa a primeira de `units`. */\n unit?: string\n onUnitChange?: (unit: string) => void\n /** Teto do percentual quando a unidade escolhida é \"percent\". Padrão 100. */\n percentMax?: number\n /**\n * Variante de valor guardado (A10): mostra `maskedHint` no lugar do valor real, que nunca\n * chega a existir no DOM. \"Trocar\" abre um campo vazio (`isEditing`); cancelar volta à\n * máscara. O componente é controlado pela tela: `isEditing`, `onStartEdit`, `onCancelEdit`.\n */\n variant?: 'secret'\n /** Há um valor salvo (mesmo sem mostrá-lo). */\n hasValue?: boolean\n /** Texto mascarado mostrado no lugar do valor, ex.: \"••••••a1b2c3\". */\n maskedHint?: string\n /** Campo aberto para digitar um valor novo. */\n isEditing?: boolean\n onStartEdit?: () => void\n onCancelEdit?: () => void\n /** Remove o valor salvo. Sem essa prop, o botão \"Remover\" não aparece. */\n onRemove?: () => void\n /** Remoção em andamento: desabilita e mostra o carregamento no botão \"Remover\". */\n removing?: boolean\n className?: string\n /**\n * Classe extra no próprio elemento `<input>` (className vai no quadro em volta). Uso raro:\n * hoje só o texto riscado de um item marcado no Checklist.\n */\n inputClassName?: string\n}\n\n/**\n * Input único. Tipos, máscaras, ícone, limpar, senha, unidades e valor guardado são props:\n * nunca crie InputCPF, InputTelefone, InputSenha ou InputSegredo.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n size,\n mask,\n icon,\n suffix,\n clearable,\n invalid,\n type = 'text',\n value,\n defaultValue,\n onChange,\n onValueChange,\n disabled,\n className,\n inputClassName,\n inputMode,\n placeholder,\n ddi: ddiProp,\n onDdiChange,\n ddiOptions = phoneCountries,\n hideDdi,\n onCentsChange,\n onLookup,\n units,\n unit: unitProp,\n onUnitChange,\n percentMax,\n variant,\n hasValue,\n maskedHint,\n isEditing,\n onStartEdit,\n onCancelEdit,\n onRemove,\n removing,\n ...props\n },\n ref,\n) {\n const inputRef = useRef<HTMLInputElement>(null)\n useImperativeHandle(ref, () => inputRef.current as HTMLInputElement)\n const maskRef = useRef<InputMask<FactoryArg> | null>(null)\n const [showPassword, setShowPassword] = useState(false)\n const [inner, setInner] = useState(String(value ?? defaultValue ?? ''))\n const current = value ?? inner\n // variant=\"secret\" em edição: o campo nunca deriva de `value` do consumidor (o valor salvo\n // não pode aparecer nem acionar o \"Limpar campo\"); o rascunho é próprio e abre vazio.\n const [secretDraft, setSecretDraft] = useState('')\n const [lastIsEditing, setLastIsEditing] = useState(isEditing)\n if (isEditing !== lastIsEditing) {\n setLastIsEditing(isEditing)\n if (isEditing) setSecretDraft('')\n }\n const cb = useRef({ onChange, onValueChange, onCentsChange })\n cb.current = { onChange, onValueChange, onCentsChange }\n const lookupKind =\n mask === 'cep' ? 'cep' : mask === 'cnpj' ? 'cnpj' : mask === 'cpfCnpj' ? 'auto' : undefined\n const searching = useLookup(lookupKind, current, onLookup)\n\n // Telefone: seletor de DDI embutido. Controlado pela prop ddi ou interno.\n const isPhone = mask === 'phone'\n const [innerDdi, setInnerDdi] = useState(ddiProp ?? DEFAULT_DDI)\n const ddi = ddiProp ?? innerDdi\n const showDdi = isPhone && !hideDdi\n const intl = isPhone && ddi !== DEFAULT_DDI\n\n // Unidades (A9): seletor embutido à direita. A unidade escolhida decide a máscara.\n const hasUnits = Boolean(units && units.length > 0)\n const [innerUnit, setInnerUnit] = useState(unitProp ?? units?.[0]?.id ?? '')\n const unit = hasUnits ? (unitProp ?? innerUnit) : undefined\n const unitMaskName = unit === 'percent' ? 'percent' : unit === 'currency' ? 'currency' : undefined\n\n const def = intl\n ? internationalPhoneMask\n : hasUnits\n ? unitMaskName === 'percent'\n ? percentMask(percentMax)\n : unitMaskName === 'currency'\n ? masks.currency\n : undefined\n : mask\n ? masks[mask]\n : undefined\n const maskKey = !def\n ? undefined\n : intl\n ? 'phone-intl'\n : hasUnits\n ? `unit-${unitMaskName}-${percentMax ?? ''}`\n : mask\n\n // Máscara: criada uma vez por tipo de máscara, sincronizada com o valor controlado.\n useEffect(() => {\n if (!maskKey || !def || !inputRef.current) return\n const m = IMask(inputRef.current, def.options)\n maskRef.current = m\n m.on('accept', () => {\n setInner(m.value)\n cb.current.onChange?.(m.value)\n cb.current.onValueChange?.(m.unmaskedValue, m.value)\n if (mask === 'currency' || unitMaskName === 'currency')\n cb.current.onCentsChange?.(toCents(m.value))\n })\n return () => {\n m.destroy()\n maskRef.current = null\n }\n // A máscara só muda com o tipo (maskKey); def acompanha o maskKey.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [maskKey])\n\n useEffect(() => {\n const m = maskRef.current\n if (m && value !== undefined && value !== m.value) m.value = value\n }, [value])\n\n const isPassword = type === 'password'\n const country = ddiOptions.find((c) => c.ddi === ddi)\n const isSecret = variant === 'secret'\n // id e aria-* que o Field injeta no controle (não removidos de props: o <input> normal\n // continua recebendo pelo {...props}). No modo leitura do secret não há <input>; sem\n // repassar para o botão Trocar, o Label do Field fica apontando para um id inexistente.\n const {\n id: fieldId,\n 'aria-describedby': fieldDescribedBy,\n 'aria-required': fieldRequired,\n } = props\n\n // Esvazia o valor (máscara, estado interno e os callbacks): usado por \"Limpar campo\" e\n // por trocar de unidade, que nunca deve carregar o número de uma unidade para outra.\n const resetValue = () => {\n if (maskRef.current) maskRef.current.value = ''\n setInner('')\n setSecretDraft('')\n onChange?.('')\n onValueChange?.('', '')\n onCentsChange?.(null)\n }\n\n const clear = () => {\n resetValue()\n inputRef.current?.focus()\n }\n\n // Trocar de unidade sempre limpa o valor (a máscara muda junto).\n const changeUnit = (id: string) => {\n setInnerUnit(id)\n onUnitChange?.(id)\n resetValue()\n }\n\n // ---------------------------------------------------------------- variant=\"secret\" (A10)\n if (isSecret && !isEditing) {\n return (\n <div\n data-slot=\"control\"\n data-rendra=\"CAMP-001\"\n className={cn(controlFrame({ size, invalid }), className)}\n >\n <span className=\"min-w-0 flex-1 truncate font-mono text-sm text-muted-foreground\">\n {hasValue ? (maskedHint ?? '••••••••') : 'Nenhum valor salvo'}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onStartEdit}\n disabled={disabled}\n id={fieldId}\n aria-describedby={fieldDescribedBy}\n aria-required={fieldRequired}\n >\n Trocar\n </Button>\n {hasValue && onRemove && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n disabled={disabled || removing}\n loading={removing}\n >\n Remover\n </Button>\n )}\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"control\"\n data-rendra=\"CAMP-001\"\n className={cn(controlFrame({ size, invalid }), className)}\n >\n {showDdi && (\n // Seletor nativo transparente sobre o \"+55\": no celular abre a lista do sistema.\n <span className=\"relative -ml-1 flex h-full min-w-touch shrink-0 items-center gap-1 border-r pr-2 text-sm font-medium\">\n <span aria-hidden>+{ddi}</span>\n <ChevronDown className=\"size-icon-sm text-muted-foreground\" aria-hidden />\n <select\n aria-label={`Código do país (DDI): ${country?.name ?? ''} +${ddi}`}\n value={ddi}\n disabled={disabled}\n onChange={(e) => {\n setInnerDdi(e.target.value)\n onDdiChange?.(e.target.value)\n }}\n className=\"absolute inset-0 cursor-pointer bg-popover text-popover-foreground opacity-0 disabled:cursor-not-allowed\"\n >\n {ddiOptions.map((c) => (\n <option key={c.ddi} value={c.ddi} className=\"bg-popover text-popover-foreground\">\n {c.name} (+{c.ddi})\n </option>\n ))}\n </select>\n </span>\n )}\n {icon && (\n <span className=\"flex shrink-0 text-muted-foreground [&_svg]:size-icon-sm\" aria-hidden>\n {icon}\n </span>\n )}\n <input\n key={hasUnits ? `unit-${unit}` : undefined}\n ref={inputRef}\n type={\n isSecret\n ? showPassword\n ? 'text'\n : 'password'\n : isPassword && showPassword\n ? 'text'\n : type\n }\n inputMode={inputMode ?? def?.inputMode}\n placeholder={placeholder ?? def?.placeholder}\n disabled={disabled}\n aria-invalid={invalid || undefined}\n aria-busy={searching || undefined}\n className={cn(controlInput, inputClassName)}\n {...(isSecret\n ? {\n // \"Trocar\" sempre abre vazio: o valor salvo nunca chega a existir no DOM.\n value: secretDraft,\n onChange: (e: ChangeEvent<HTMLInputElement>) => {\n setSecretDraft(e.target.value)\n onChange?.(e.target.value)\n onValueChange?.(e.target.value, e.target.value)\n },\n }\n : maskKey\n ? { defaultValue: current }\n : {\n value: current,\n onChange: (e: ChangeEvent<HTMLInputElement>) => {\n setInner(e.target.value)\n onChange?.(e.target.value)\n onValueChange?.(e.target.value, e.target.value)\n },\n })}\n {...props}\n />\n {searching && (\n <Spinner size=\"sm\" label=\"Buscando…\" className=\"shrink-0 text-muted-foreground\" />\n )}\n {hasUnits && (\n // Mesmo padrão do seletor de DDI, à direita: rótulo visível e select nativo por cima.\n <span className=\"relative -mr-1 flex h-full min-w-touch shrink-0 items-center gap-1 border-l pl-2 text-sm font-medium\">\n <span aria-hidden>{units?.find((u) => u.id === unit)?.label ?? unit}</span>\n <ChevronDown className=\"size-icon-sm text-muted-foreground\" aria-hidden />\n <select\n aria-label={`Unidade: ${units?.find((u) => u.id === unit)?.label ?? unit}`}\n value={unit}\n disabled={disabled}\n onChange={(e) => changeUnit(e.target.value)}\n className=\"absolute inset-0 cursor-pointer bg-popover text-popover-foreground opacity-0 disabled:cursor-not-allowed\"\n >\n {units?.map((u) => (\n <option key={u.id} value={u.id} className=\"bg-popover text-popover-foreground\">\n {u.label}\n </option>\n ))}\n </select>\n </span>\n )}\n {!hasUnits && suffix && (\n <span className=\"shrink-0 text-sm text-muted-foreground\">{suffix}</span>\n )}\n {clearable && (isSecret ? secretDraft : current) && !disabled && (\n <button\n type=\"button\"\n onClick={clear}\n aria-label=\"Limpar campo\"\n className={controlAdornmentButton}\n >\n <X aria-hidden />\n </button>\n )}\n {(isPassword || isSecret) && (\n <button\n type=\"button\"\n onClick={() => setShowPassword((s) => !s)}\n aria-label={showPassword ? 'Ocultar senha' : 'Mostrar senha'}\n aria-pressed={showPassword}\n className={controlAdornmentButton}\n >\n {showPassword ? <EyeOff aria-hidden /> : <Eye aria-hidden />}\n </button>\n )}\n {isSecret && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancelEdit} disabled={disabled}>\n Cancelar\n </Button>\n )}\n </div>\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,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAQAElEQVR4AexdB2AcxdX+Zveq7nTqvdmybMld7gWMTTPVNs000zsECJAQINQEAyaGEAgk8AMhCUnoBBJqKKYZDNgY9y6r95N0/U5X9n9vbQm1k+6kkzEk6x3tzsybN2/mffPmzczdWcKP8FIUZaS3veGqVvvWv9Y1f7xub92Ljdsq/uDYsPsez7rtN7av2Xpl4LMN54VWrTtZWbXuJIXf12y5MrB2243tG3Yv92wtf9RRVvt8Y23zB+tabJv+SryuUBTPyB9hV+FHAQC3t/r6xtbPV+2sftr69dbrAh99c3LZ6o0XP7Z+103nbqt4YOre2mfT6prfNlttaww213at21MttwdahYIAFATB78RDtru3a622Lw311nfN5XV/T9te8bup3+7+5bnE64+rvjmz7Mut1wZ2VD5hrW/5ZJXNvfe6HwMgfnAAUJTWRLe37mdNrV9+tKvyqdbVm84PfbH58t9uLrtvQXXDa8kOzx6ZlSqEiJl+hGBeIbg8e+WapjeSt+5duWDt1qsf+nTDstD2isdaG1s/W+V0V1+nkGwxq/QAMfpBAIBMusbprvlFnfXjbRt3P2L9auvVD2wqWz6/qun1RF97ixDiwDeD6/QH7KK2+Z3EzWX3L/hq21UPfbNzpZWmja1Od+XPWeYDpMMhVXPgey5CcbkDne6qnza0fL5xa/mD3m92/vx+GnklVvtaKaS0R8jlQJIpsDk3SdvKHxq7dvsNKzfuucdbb/14o8tb+RNuy4GUJJq6DkoAOFx7flXR8Jp1S/kDv9tavnJiQ8vHciDoBA31aNr2vdCyjCHFB/IlZALDxI277320vP7FZptr5+3fi0ADVHrQAIBGic7h2vXYnuq/eDbvXXnHnuqnLS5PGRQlMEATDt5s9kU8vhqU1TybsHnPfb/eVfWku9Wx+ffc1oNF6oMCAG2unbfuqHrcvrFsxVUVDS8ZuNN4JEXSSdSZCIRC5MkH4PH74PR5YPO60epxwupyoNll7xU4vdXthM3jgoPo3e0+eAN+BIJBApyihkjqjpSG2+LzN6Oq8XUj+QtXb6942N7i2HRrpOWHg66D5/cKAJe37ri9dc83bt37wPLaprf0vvZGkos9bnqEuYOhILz+dthJyc1OO+odbai3t6Le2YZGp42U7VAV30IKZhC0kZJ7Bk7nfCvRMECaqFwj8alztKKOeDURaLgMA8O/HxRhxIkyWcAfaEOd9X391r0PLt9T85dGh6dqfpRMYkr+vQDA5XJl11tXrd+059dvlte9kOb11YVtVEgJwRdoByuElVPVZt2nJFJ+KynX4fPATSOfQeELBNAeDJBFCCJIViGkKAgXgsQ3QGBiBfuoDFsADwHL2e5VLQMDo55AUWOzosbWogKLAREkvmGFjThDoN1vRUX9q2mb9/x6VU3j26tdrqbsiIvHkPCAAoDMtcbpqXimrOGRyu2Vfyh1e6uF0sccT3SkdD9ayITXtLWgWlWAXTXXrGA/KY4VqNA2Tgz7opOVQm8hAk+A6uH63ASwVppS9gGwGQ1kbZw+rwoylpXIB3mH4PHVi13VT87dWfNwZatz69PETzNIZoMqdsAAoCi+iXUtHzWt33nrBU2ta+RQyNNLYO50Nu3VNOoq25phdTvgodEfpFHHeb0KHMAEUgwYdAwIm8etWqGqtia00DTCVmQoooRoWdvq2Chv3HXXReQnNCmKt3Ao/KIpe0AA4PU2X7ut4o/rt5c/mOgP2Ei+EAWhOlusWB85YE1k0vc014HNrodMMXc4j0QiPChvtj7t5B9YCaR7WxpQS1bK5fPSlBNS28X5kQvOfo+CIA2K3dVPJW7a8+AOp6fugsjLD55yWAFASpScnsp3vt1z2+/qrR/IADcUagfxqOZ5lx2wytYm1Ws/mBWOAS72HWrsLaq/wO/cPmo/TVLRtkqg2bZGs2HnLX9qc+x4YYBqh5w9bACgxuut9m+2rN12wzFub42qeUojlIfUJRcvxXjU2Mibj7aLhtzqYWTA1otXJXW2VjAQAsGQCvhoq/QFrOKbnb84vY62v6nf9NGWj5R+WABAAsfXNL1bsXH3nSUh2hWjOEI0j3v9fnVeZ2eqzetCkDzxSAX9IdExoNl3aaBVBFs4FQjkUHI/RNeOELaVrywpr3+pQlGa4qMr2zd1z9SYA0BRWvJpaVexu/rJDJDJ50azk9RGI73JZVOXcwHqDPzILo0kQSvLkLscTLF/w8pvctpVZ5GnPO4PRHUJlNf+PWN39WsVDkddWlRFIyCWIqCJmMThqxu3s+rFHRX1LyeFyLPlxqodQBsrbPK5AyJm9gMiNOn0SDVZkGZKQKrZgiSjCTpZ09kCBnwb7VmwNeDlJMc7MyN4URBCdeObSZVNz5c5HBXjIigSMUnMAOBub55ZW//a+rrm9wwhMvs86q37Fe+izRWF3KGIpfqBESYb42ExxMGsNyCBnslx8UihYNTqurWEB0ALLRubaX+D+6db5gARBUE0tn5sLm98br3bXTVzAPKIs2MCAK+3saiy7sXP6ltW6YKkfDftrbO5byXUt9MuW8TS/EAJdRpNN8llSVLBkBxnhqEHCPQaLeIoTRKqX4xoLgZBs+1L3Z66v39m81YVRVM2HO2QAUBbmFkVja9/S8s8rT/oVud4Vj7vlLEzFK7iH1O6lzarerZHCEGK1iOerIK83y/Q07SQbk5AvMEIWRpc1yu0c0og0NbUvrze5SrP6llvtPHBSbG/Fprj9Y1tH26ta37H5A96ydFxUHDSNm5gP8V/x6ORnLwQbR33bK0QggBghH6/hUjY7xsIco570kYTVwgEDW2fmGtbP9jMOoimbE/aQQOAKpZrre/vqGh4MdEXcNNhiV0d/UFa7vWs5Mce99M010gnikoffg6PflmiPTDqBJ1GQ39jczMIqhvfSK5seHUr62KwXAcNgDbnZtL+wwVeUn4TjQAbLfNCfYyCwQr2QyvHZxi8+RPsMQBIOejol6GO/J59opAl2FPzTGFT6+r3e+b1jIeLDwoAbm/tTzfuuXs+H782k6fPS71wFfw3pXM/VNIBES/5+HyDg5XOCviDKtwPPcHBaUMPAlvKH5jf6txx/WB4RQ0An+IYv7Xi4QddPrvgkc/O3mAq/rGW8dMBUSNNBxWtTeDAKyFF2ecOMxD2vcW29YoSFDsqHl7p89WNj5ZzVACghshV1a981tS2QeY1vpvOyaOt8L+NnvcC4vVGdWPI7vOoH1YZjj5we6vksrqXP2UdRcM/KgBYbV9/trv2+cQW2sxw0Vo/mor+W2l5lzAjPhG8UyiR98++AilpWLqjzvpuUr11VVT+gBSpJB5f7bIt5Y/MstKc5iAkR1ruv52ON8XYUuppA0iWJLS6XXD6vIM6IRy4LwV2VP5+vs25+7yBafdRRAQAQqx2b90rT9TbqoWDhN9X9H9/I+kBt78dVpeTgh3sH/BSsdltBwNjOPyBkBIQFXUv/kFRFG0k8kUEgMa2L1/cUfOWqc3rjITn/2h69ADvFPL8H9x//M1AYEvqosFEiupB3XeU6SJdRVjtX5nqrO//uW9O3VMHBADv82/a+6clVpd1mMxWd4H+W2LegF/dPGslf2ogxbLy+UyFHe/QfhD11098ZlDZ8MqZdu+eMf3Rcd6AAKi2fvp2Tes2EfgRnuFzB3yfgZXKy0ReNrJTHU65bDma6QTRQb6XzeOOaCC6vXVSk/WLNwdqX78AsLn3/HRjxYtFHr97ID7/yx9kD7ByWbH8MTL++HsbnaDyBpKftpcZIE6fB1VtVrjoSD1I+wl2invIrxi4uhBqm98tsto3/Lw/2n4BsLP67eXNjr39lf9fXox6IEim3UuKbaJNpMq2ZnUTiT8sW2dvI+fxu8M1BgeDxE8bTgNV7Q+0oaFl1Z390YUFgNW567o9DR+YQ0qwv/L/y4txD/DKQKGRHtofeNXQswoXbcDZva6IpgJr29fmVtvmsL9mEhYAlQ2rb21zVfas+3/xg6AHGCBO2ojjqYDf+xPJH7Sh2fHVreFo+gRAq63s3N31b6eEK/S/9O+/B3gqYN+Bp47+pRFobP0kxebc0efmUJ8AqLNvWG517Bb9M/5f7vfdA+wYutvbB5wKvL5m0eLYcHdf8vYCQJuzduHOmn/n9UV8oNIkoYFG0kMrG6HXxiNOn6YGgzYBWk0cZMkAIfjDFTxjHiipwtcjCS00sgE6ks2oS4HJkAGTPh0GXaIqr0bSQxIsL/OIncyBUEj9wqyflug9pwKuqSMIIdBg/TDP6d17TEdax7MXAOye8luaHTsO6OgXENR5ZqRZxqMk92RMGrEMk0eeh1IKUwovxLRRl1C4FFMKL6K08ynvXEwuOBtjshchyTwK3PkdDToQTyEk6AmMmUmlGJd7KiaPOIfCPnmnjrpYlXVqEct7Icl7HiaPPFdt01hqW5plgtpWAQmxuNzkEPLqYSBYuX11wuEsv7lnnb2kKG/8eG4g2Pubuz0LxiIu0chJiS/B9KIrMLf4Bswt+Zn6nDXmGkq7HFNHXYrJI87DuLxTKZyiduLUwosxo+hyzCq+Zh89lZlTfD3lL6WRlw5B/zAslwJJyEhPGI8pIy/aV3fxzzCn5AbMHPMTkvcyAuglmJB/OsbmnoRxpOxJBcswtfASyrsCM0dfjTkdbSSZOZ6eMAGSpB2StDzybV63eszc14rhO+YhNLWtmftdfN9bNwA43DVn7G34UAcIDOclqCPTLOMwa8zV1JE3qIodk7MImUmToNUYI6xa0CiMR27KTOrwk6mjL8KhY28iC3ISpSdGyCNSMoFEUyHVcTEp8XoC5TkYnXUc0hLGQiPrI2IihFDbxm0sprZOHHGWyovBm5U0DZLomCIiYteNiC0AB1o5dkvvGWmxf6NzuPee0TVd6hqxOvfc5Glv6ZoU83ejLhkT8s9UlTU29xRkJ0+FRjZACDHouoSQaPSnoSDtMBqFF2Pe2JuRmTgFAt2ah+gvHvUa4nsoDhv/S0woOBOZZPZ1WjOEGLy8LIcsaYnXZJTkLFEHwVSa3uINg/uUN5t/tgIh2kxi3uECf/3c7t51U9f8zh4iU2LcWfv25K6ZsX0XSI0vwWHjbgXPk2kJ46CNeLRHJokQAvHGTIzMWIDDJ96FnJQZpCg5ssJ9UGlkE1mn8zBv3C3ITCwly2JBrC+2IKmWYkwkv+fwSXeTRZs9KJk9tIvIVgD9XEII1LesmkS67kRvJwBcnobLa5q/6Iz3wyfqLEEjMYtG+pGT70Ne2lwYtBZqZKcMiPUlSRoCQjaB4NfUobOI/WDqUmjevoosyvlkXci3oM4jRsN26zQmZCROxIKJd6IocyFkiWZiRHfZvAP7bnbHVtnlKf9pB2ep46XNXb7EF7B3RGP4FMhKmoqjJ9+PhLhcapg2hrzDsxJCgKebowh0lrjoTWvpiIvAzicrJnwtsc1hJzNOl4rDxt+K0dnHQyInOZoaeF9g9zlEwgAAEABJREFUoDMCPip2eCuWdPDtBEBty7elgECsr2Raph039XekjEQIEXv+/ckrhAAr8IxDXqGnpT/SLnkK+SXTMav4qgMG1i6Vq33EPtH88bdhRPphBAJN1+wB3/mMoH8igVb7JtL1PiqJHzQnxO9teC+B32MZ4vRpOGH6o9BoDLFkGzUvSdJi6SHPk0L1A5Y16JJwdOn9RCcofL/3kZPuQSY5ndFI0eZxd34RJVw5q+2LBEVpUfWtAsDuqbu4xbknpi3WaeIxf/wdiNOnhpPjgKabDekYn3cKaN80bL1CyDhy0n1kLeLD0hzIDEnSQJ3CjDkRV8tnA/x5w/4KtPttwu5qvJBpVADYnHvPEEJ95bQhBwEJxbTWzU+bg4PpmkobSyZDRliRMhMnIyV+FCSaOsISHeAMI1mkabTxpZWNEdfsbO/fGWRdu721qh+gar3O9u1kIHYGIMlciIn5Z+FguzTUiePzTyMjwCvnHtLRLspE2l7WaxMoI3Z9QcyGfBdmHIERGQuITx9yU2rP20VHxfybTD3Tu8Ztzq2lHJdo/tdWNX0es0lalnS0YXIWjPpk5n9QBUlokJ92GHhU9RQsjfYlLHE5EDG0hD3rGGyc+5S3leNohRAJj1BIgSfg75fUal9LfoCiJwsQmGV3V8cM8snxReRFTwUL3a8E30OmEAIm8knG5JzYq/YiWnZZaK4VEL3yvu8EQaC0GHNRSPsD5MQMKA6fCbjpkKg/Qp+/VQQCjhmSx++e3h6I1ef9hbpHHqdLgRAHX0dyh+hpEyoneWavaSDekAmeIpjmYAwa2jUtzDgcOo05IvE8tDNI1j0sraIEQSCYLnl9jTP6IwzLoY+MOBpd6QkTDuqOBAQYBCbDd7+4xo5fnJ5Bi4P24k0iszELfHral5A90wLBAPr7KL8QAr721gmSw9MwVojYjNaU+NHg+VWI2PDr2ahYxIUQ4CVhfuphnezyUufBEpdP8YNXbhKOttATkEOnnwpCHO038KBuDwT6pfEFmkdJTm9DZr9UEWYqdBKVSSdwRrICOMgvoy4FOcnTOqVMiMujzo10p7Cz2AF/0chGpFrGQCubBqybIeIjK9AfodfXVCg5PfXx/RFFmqelwwxLXDYJF7MFRaRVR00nJAmSrCU/IKQGmhUAsgw4yC8hBHSk/Dj9wCsshZa17QOsBLz+RovkaW+TY9Funle1hNBY8IqEh9/vR2trC8rLy7B27ddobGxEe3tk/52cAP9jf5oAwOaUOmtfSv81B4NBOJ1O1NXV4Ztv1qGsbA9cLieBKLL1ef/cI8uVZT30Gt6rGJh+oM8K0ipAI7UHWmMCAK0cB5mEG1isoVM0NzfhxRefw6GHzsTixcfh6qsvx733/grr16+PmLlOY4ZJn0FedTw0JPtABV0uFz777BNcdtkFWLhwPs4//yxce+2VeOWVFwcqGtN8LQ2yuAgsAFfKVqA/R7Dd36aTPP6WmABAIxsgi+jPsFnQaILT6cBjjz2CBx+8H7IsQyJzPnPmbIo/jFmz+Ow/Mm4G2mLluT9On0rzf0K/hdiyfPLJR7jvvl9j8+ZNEEIgISERK1Y8iHPOuUCN98sghpmypIVWExcRxxBZNj4bCEfsD7okqd3vlsIRRJMuSzpIdHgRTZloaUOhEN5889949923Edjv4ep0OowePZrAoImKnY4Oq0y09jdqE6HT9r+2rqqqxBtvvI6amprOOg499DBkZWVRm2PSfZ18B3wh8PGScEA6IlCgIEh9Rq993sGQR0ghxd9nZvSJXN3wzoU85//978/C4bB3ikcgJzCwz9uZRC8KvF4vgv14wVoypUayArKshyy0VKbv2+fz4euvv1TNvxCik8hPGy0MyM4EemGT6yffhF6H7VZCQQSCvk7+/b1w3/QHgEDQRvazPw5R5AVD7VBC/a87o2DXJ+lXX32pKl+I7xTRTgcfmzZ9i9ra2s4yLS0teO+9d9HQ0NCZ1vOFrZVMyu+Z3jPe0mLF++//B6zcrnnr1q3F7t270GGJguQgbtz4Lb76ak1Xspi/+0n5nnZbRHxZ5v4AwEwkjRzXc/hwetTBH3DTzlNkyIyaORUIkSn7+OMPVc+fop03p2/fvg3Ll99Jc/JyPPDACtx99514/PFHCQD1nXQ9XyShgUbSqYrtz245HA5s2NDbuWRg/OEPv1fr+uMff4+77roN999/D15//VWVZ8/6YhUPBD3w+tsiYsc2mf2AcMQa2RKSdLKxv/aHK9sr3R9wkckdPgDwSLPZ2jpHXIcAQghamjlUE/3SSy/ghRf+gQ8+eI8sQg3JEx7bCi3/FNq88gcZuN4Odr2eCtlRrrtXBiUwMFjhf/vbX/Cvf/0TmzZtpCVibS8ZiTRmNwPA44v8o/shamO4ymUpTpF0Wkv4XgpXso90RqXP7yD0x4RdrxpCNPcBAkIIhLv8NC/znM35Qgii5be+g0IWJRjyw+1rpj1xW99EEaSyBWIrwUBhco5z4PdYB5bX4a2PwgKA3MDwUrD1l+J0qZHtnoTno+aElACa7NtJuO8cNDUjRn9kmb38EAEsMoOlEPIVGr3hqg+Sz8Kj3+Wtg8ff/4jqh0039lxfIBCEJoa/Ct61Aq/fhqrmL6gPIhxkCpXuR3idNqldMupSvEQWk7veth4eGlExYdaDCXdqVlYO9Hp9j5y+owaDsV9F+AJ2ODzsONIyjjpKCTNWhBDQasOvErrWzkvSkpKSYVsatvvtqG9dT5ZNdK120O96bYpXMhnSI/MoBqxGoM1ZThbARgilHh2QPjoCIQSOOOJoJCcPvA/OnKdPn4m0tO+OfDmta/D4rGhz7aXOJABwRpiREh9vxqRJE5hiwGA2x+OYY44nnrFRUNcK/eT8VTR9Ck+7tWvykN4NmuQ2yWxIrx4Sly6F2axur34tpkJ2YY/S0ilITU0bsIPZShx77PHIzs7tWrzznU21h8y+jQDAifVtG+H0NvJrr5CRkYWzzjoPPLp7ZfZISE5OIhmn9kgdepTldXkbsKWSt533gSsirkxKAyccrV6fVi3F6ZP3cAXhiKJNr2z+HDZ3FUJKMNqiA9LzCDvttNNhsSSEpRVCYNq0GSgsHNUvUBRFUL5O5VPe+JFqDRSlt+Xirea8vAKUlk4leqHS9/XHZDLjoosuQ1xcZNu0ffEIlxYIerG54kUCafhlbV9lWVoB0VeWmqbVJm6S4gwZa8KTqHRR/fGRo7Kx/O/wtsdoZulR+5Ilp+L4409EfHzvU2xZllFSMg7nnHO++uxRtDPaHnDC5iqHEPtazjI7PHW0bdreSdP1ZcyYYjoEugpjx46DLO+fMroQmEwmnHjiYpxwwuIuqbF7raJBta36VWK4T156ifgO9xF3Brtem7FaMmgT3qOlYMQMIyGsbPoMFY2fREIaNQ07gz//+c1kls/F4YcfiZycXJoWUlXlsBKuvfZ6zJ17aKdy0eNSyNmze2qwq+6tbjl76t8jp7CuT/9FCIHp02fghht+oSp5/PgJap1c94IFR6iy3HTTrQQOuRvPWETqW7/FFzseIosa/S6rgIAkegMWdAkhw2xMXkMAERXJ5lG9bR8RDfYO0ZLwm7KnyWPdMFgW/ZZjr/yqq67BbbfdhSuvvIZG55W4/vobccstd6jKl/rZ4VZoeeii+b51//zfUVFNy5eobVlLHe3vSOr2ZJ4zZszCL395h1rXZZddhauuuha33/4rXHPNdf2uOLoxChNRaPrxBxywu3bBaluH5ravUNfyCb7Z81jUpr+jCiEEZEmgr8tkzAsKYaxQ4ZGbOnvwOyF9cac0J21YfLH9t2i276BY7G+JlJyWlo7Fi0/CmWeeg9mz56rzrxB9N3ifBApt/DSBzamA2nR0XILiWypfomWstU8rALqEEFSHCXz8fOaZy7Bo0RJaaaRDiP7qpIJhbla6l7z66sY3safmGeyqfqpb2F31FJRAFfj/GkyJi4dZF92nrVgsWerezg5REuLGOvhdzc1InPht/3tGTBp9aLRvwZc7H0WrsyL6wsNQgjvc6thNmymr++Te4tytmlvebu2TIIaJQdqIqqh/GbuqHkd5/QuoavwX/6wrWhybYXWUocFWhmZnDdqDfkikSaNWh+Q4M9JMFvB7JKJIENBIcp+kCeaxpHNA4lxLXP7roWHw2pl3TctX+GrX78FLLY5/n6Gd9v3X7X6i3xFe1rAKn29/gDyFmM6K3ZrNZn7r3gdI6a+hqe1LWjU1oNHRilpbC+rtreBfD+f/T6DF7QAHq8uBJpcdnMaf92elxmn1pN5ubHtFhBCQ+/ABFJoG4wzZr4OufQAwGp5JMY8elhYrBCx2Cldv+w121nZ3vKj+A3grWLXpdtqu3jZAnQrJ+Tbe/eZ6AkqEW64DcOyaXdXwb2zZu5IUvwZWZz2q25pR72iDzeuCs90L/h9G2oP7PtPPvwPIgT/b5wv4wd/5YxoX0XF8IIVJDIA+pgBa/ikWU/ozLJcKACGSbaMyj7ZxwnCEEDmFdtcebKt4Eut3/wa1ze/D7i4Lu+waDhnW7Pg9qpo+j4h1SPGjkvbc31x7FS1nY9ctlQ2vkrl/npagVahsa1JHtSfQTsfoQbI4EYmmEoXIYezvo15MJOiPjs5PhOA3inS5UxNm21jnnKQCgF8yk6Z8G2s/gBGYZUlCUWomRiSnwaIPos3+GXZUPoJ126/DZxuX4dudt8Pra6LRNhCeWcrBBAUfbboLG8r/Sh5+MGIGClmuGloVPPfpSfim7BkqG4q4bF+E9dZVqGr4F2paq1BByucRHCJF9kUbizQhBHQabZ+ski3s8+3LkvY9gART/gc6jaUjOqSngECS0YxRKZkwkefK7QzSca7PT2bM54WTAs9l7QE3rRLW4/Mtl5JZfAABmqMVJh5S7VxYQSgUUEfvm2uvxo7aNzHYqz3gwNpdf8Q/PjkR63b/H1y0hGwPuEhWH4E2RKE3cLkNCs2zQTpu9tMevsNdjQpS/l7rLth87n5FkSUdks2jYNKnE52gMLhbkA7YAvQuLWA2FKjzP+d1AsBsyHgwJ2U6tYZuzhlk4FHP/09eUpwJ/INFLeTAlLc0oszaoCK/xt6CWgpVNPdx2l7Kq7M3k3n+EGu2XEvnCI2q8gZTvULgCQR9tNSzYnfdu3jtywtRbf2KWA2tTQpCquLX7vk/PP/pySrfL3f+nvYNvqGprFrdQHJ46unJoY6eteRr7MC2qn9i1cY78PGmn2Jn/VfqHE7CdLtZZpCytLIJiaYRmFtyAxbNeEIFAYZwCSGg02h6cUgwjwuZjCOe6MiQOl6EEJ7i7BP3gITBIC+JPE7+DxI15Hg0O+2oaG1Ei8cJnq/CqSBEI4UtAs+Juxo3kTX4Bcoa3kdd67dosm1VO5hHXIhMskIK7ioax0M00t10ssfLu/q2b7Gl6iW8te5afLzlbvKuK4k8XM2UNYg7EPLRsrYMmyufx7/XXoYXVp+GF+cvY9wAABAASURBVD47DS+uXrovfLaU4qfin2vOxert96PG+ika7dXk3PnQ9WLZBSSYDOnITp6OGaOvxOKZT6I4+yTUNVTB5mzEUKZkHW2La3osAbnOrOQF21nXxFy9OwHAsaT4oseMumR+jToIKmHS6VWT2OBsA//fNtF2fXswiLLmrfh0y114i0z3+xtupnX577C16hUCxQeooOPQCt5m7gyfYHf9f7Ce5uiPN/8Kb5Pi1+x4mNbROxEix5NEGtZbQKL2BhEkUATI1Ksh5O1St6B1fADsxaPbJZBqGQP+FbDpoy7D0aUrMCH/DCCoV79x9I+XHiIQ7O1WIpqIIGIjLRPp0e2WJQNMptFPdk3sBgCLMefhkemH+weDPEabQiO0lUY8m/6ulXS8cz6HjnhfT85vV5dBXtg9tShvXIU1Ox/GBxtuxXvf3rQ/3ExPDjeBl3abK58jk7uNphz+bZxoYdeXFMOTZtKnoSBtHopzTsSckp+pP2Q5Nu9k0HkM+EOm7733H/zmN/eivG4tZF3kDmtvaQV4n6BnerJlit9iLHy4a3o3AJBpUEZkLFitkY1daSJ6D5Hy3X4fLWnCecsCSeaRGEONT4kvhizpaPQoEfAWNCkJolNoZPnV0RakUcYhpI5yzuNAJAfRrVB/cDAZ0kFLbJSOOA8zx1yDeeNuxfzxtyGHzL5WE6f2AX/H8Omnn8Bjjz2M7du3w5Qg0HMAR9M0rSxD32P+F5CQljx3NesYXa5uAOD0JHPeXSnx0W8K8TzPIGAe4UKcPhXj85di1phrMZvCtFGXoiTnJLDXKwktdUY48ITjeHCls8IlIRPQR2Fs7knqvD57zE/peRWmFV2O0VnH0ZyfCkE0LDl/eeXzzz/DI4/8Fq+++rL6ieKEFAFLsoAkCQz2iqOpmM9KupY3GjIUk7Hgjq5p/N4LAPHGvI+Lc0+qEhCcH8OgwO6uotOuauSlzsK4/NNRWngBdc4V6og4avK9WDDhLhUcY7IXkUdcCCH2zbHcsTEUJGasFCVEoA0gLWEcJhWcS6P7Zhw56R61PTPIqSsdeR6N/oVIiMuDRtaDRl9n3fwt49/9biVWrrwXH330Idxut5qXO1qGJUUiWjU6qD/xekO3cgpZo4zko6vI/H/aLYMiEoVed1b8pNuS42N7RMyVuMlb/+jzl/Dppx/B3+6HVjaArUJ64kSMSJ+P0dnHqb/PO6PoCurIu3H8tEdxzJQHCRh3YkbRT1CUeTSSTCOpXBxC5P0rpAAcgKujHoM2CZmJk0nZZ5Oyb8HC0pU4ccbjWDD+DpSOPBfFOYswMuMIZFB74sjayTTNCSF6SfjOO2/i+uuvxmuvvYqysjJqy3eWLyldhtHUu0wvJmESdLT7p9fouuUa9WlKQvyEW7ol7o/0CYCkhMJnizKPj92nD/dXFqI52+rahD+/sBzXXXcVVq36AB4PO24gxEuQJS10GhPMxgykkJeckzyDnKbDUJR1DCbQ1DG7+AYsJEAsnvkUTpnzV5w4/Q8UfwBHTLyb1s83YkrhxaSExchPPURVQkJcAajxxFdHQUP+g6szKEo7pXF9ZpgNmUiOH03LsakozDiaFHwuWaJrVL4LVSX/ESfN+hNOnPFH1XGbUngRxmSfoII2J3kWlS2iepKhIUAL0WeXgq+ysj244YZraNTfp36FrGPUcx6HpHQJKVkSZA3HBhcSDHGQuoFOQUbSgvpk89h/9MUxrLT5qYfewx3YV6GhpMWnBBHSNOCLNatx000/o7P8U/D00493msAO3gL0jxoiSRrqWD10WjNMhjSaGvJBPgrSEyYiJ2UmRqQdhlFZCzE+71RMG3Wx+h9RHEXLqhOmPaaC5MxDX8K5C96h8B9cfNSaznDhkZ9S2rtYdti/sfSQF3DSzKdx7JSHScF3YuaYKzGx4GyVb0H6YcghIKYnTAT7Kpa4HBh0iSSTASybEAIDXTU11bj99ptx4YXL8OGH76OpqYmmju4OMFlpZBZISCUACDEwz3B1WggAXfO0mkQaTDN6zf0dNGEBkJIw6ncF6Yc5Owhj9dRoBUZN0iC7UILX68HevWV4+OGHcOSR83DJJeeRSdwzYFVCCAjBQaKnBHa8JAKKLOlIMXqaIozQkoet05ig05ih11r2hwR6dg0W6LTxYDot0Ws1RmhkA5iPLGmh8hWyWocQXJ8YULauBLW1Nbjvvrtx2mlL8Prr/0Rra2s3c9+VVmcAkjNlGExS1+So3i16I2Spa3kFaQkz2xIt454Kx6grdS+aMZnHLk80jeiVPtSElEwJaTkyJPk7Ti6Xk8zilzjllBNxwglHqWayoqIcLpcL/AMNoVDoO+KD8E2hIRygI1t27jZt2qBat6VLF+O5556lNgw8jnKLZIwYJxPYBt+4nqNfp0km83/4tf1xlPrLTE0suX9c7kmVsqRDLC9JFhg/W4vskb0bzIquqqrCX//6DE49dRHOPvs0dX28bt3XqnVoaKiHjw6TuMNjKdNgeLEMDNDq6irs3LkDL7zwHJYtW0qm/hy8/fYbcDhY8WJA1jRwkZEvw5LUWx0DFt5PYCYTotdo98f4ISEr9ejdSQkTn+VYuDBgjQUZR5+RrK4IBm5IuEr6SrckSxg5XkMmT/SaD0GXELSN2t6uThF/+tOTuPzyi3DFFRdhxYq78dZbb2D9+nXYsmUTqqoqwaOOlUHFhv32+Xyor6+jDZutYFC+/PILuPnmn+Oii84h2Zar8raT3NEIklkgq9MiD4xoynXQstNnMRjBz440oy5NSUuZe0JHPNxzQAAkxGWumVp4ybta2Ug8ujsulDDom/SL4ulajBgrQ9b0Dy4hBAKBAHV8PT744H3cccctuPLKS9Sl1D33/Ap/+cvT6tez//Ofd2iJ+bEKDva4bTabOn1ECw6m9/v96pzNI5t/IYRXLDyqn3/+b/jtb3+DG2+8Hj/5yWXg3yriH4bgbwgL0X87enYWzRrqAMgv0cCSLPfMjjhuoo0fAy39hNhXvxAy8jOXvm4xjNo5EBNpIALOpzX66YWZR/kEBi8k+rj0BoFJ83Tg5U8f2WGThJDU5WN9fT1Wr/4Ujz/+GO6881b86le34957f03+wwo8+uhDtLp4As8++2cyzf8Aj9TXXnuFnLFX8e9/vwb+zZ+OwHF20jif6V544R/gKeippx5Xd+l4f3758rvUOh588Ddk3t8E+ycdS9iwgg6QIWugev5FkzXo5rsNUK5rtiwkxNMcIkvfqTIpvrQ9O3Xh6V3pwr1/VyocBaULIRylhecvj9OnUiy2dwp5vpMJBATgQTEm2cCBfQeHww5ecm3evBF8sPLMM0+qCly58j71l0NWrlyhPvlXRB544H567xpWqMBhGqbn7VkGAf862I4d22np1kirFq8qI9envgzxT1y8wPiZWtr4iUgNfdbWc/RLQouRWctuJhn9fRbokRhxzUmmEcvnjbtlKxC7aYBlEQIYM0WD6UfqoIRix1sIAUGjo8Oc86YLA4SnBV6O8elbR2htbYHN1kZOm50sixts/rmcEIJFHJYgkTGdMFeLvGINBlsN7/p1H/0KxuRfuT7BPPqhSIWOGADMsCB93vTJBee5Yg0CmXyACXN0KJ1PIIgdBljkgzbkF8sYO0MLbvtghGRomvUGGLRaAhDHgMyUo1xZKUcdEg2/qAAghPBMLjrvmMzEyTFXk94oMPVwHUaX0tCIpgU/QNr4JIHZxxmGZPoNWh3MtPSTyMqBrjh9rpKbvnQh64iiEd9RAYC5xmmTVy8Yf+d9+hh9gJR5dgSjWVI7pnCipiPpR/fkc/4TLjQiOUOikYuwV38ZGnL42PTzup8UTny0GFtw/XJLXM7n/ZXrK0/qK3GgtMT4EbcunPqb9QJiINKo8gWx47PwucfraV3847MEpDcsvsSIZNoJ5bZikJeRUMQAEII6DCGMG3nD+oT4MXcMht2gAMAVZSdNnzNvwu0NEq05Y+kTCCHA5+GHLDKgeJoGbOF4vcx1xiqwg8eB+ckQ0FIlOgp6SQYH9Z3jFDreDV3ymF4WgkpSyyMUjqe4Ey42qjt+QggM9jKS6U+JM0OWJGIhoTDngob0xEMG/f/zMRdiFP0thPCNzZlXPLXwUpesbhXHzi0Q1D/xiTQdHKvHRPKUaZ8jegHDlGCFxtOaM0mjR77BjEOTsnBGZhGuzJuAnxVMxq0jp+HuollYMWZOZ/g1xW8tnI4bR0zBtfmTcH52CY5OyUOhMQHJWgMssg4MEKlLnQwwIQR0Og0SU2UsXGZA7igZQhJdqKJ71RAI+fsWOtryFUJGbtqitoKMI4sF6SI6Tt9RS9+9Rv8mRLJtQt6S0pLck72ypCcGsQMBMYOZQDDjaB2mLNCBpwaJpI1wwHFxNbAiWOkppKhcgxlHJufi0txxuKVwGm4mZZ+dNQbzkrIxzpyMAqMFGfo4JJKJjZO14GCiJ8fTdUbkUfnRpkTMSEjHyemF+MXIKbhj1HT8JH8ijk8tQHFcEtINJqQmpyA3Nw+jiwsx9/AxWHwxxUfLkGSBwV6SEODTPhONBiE0SE+a78pJWTKOdTBYnlxO4j9DCQZD+u4JBefMLc5e5NfEeLuY5TLESerqYN4SPUaM04AcX06OKCRoaFURl4jDk/cp/eYRU3FSRiFKTElI1OohU6dGxCgMEe9bmONMKC4YiVNnH4ZbT1iK28+6GDffcCPuvvc2XHf7IsxdLBCf6oEkDV75XL2ZAJgUZyY+OqQmzPGPyjqt1GRKq+O8oQRpKIU7yiaZctZPGXXh0UWZxwY1koGSY2sJeK1cMFaLQxbxlKBDeh6J3U9/mmQNiknxx6bk4/ycEpycPhIjaXRrJSqH6C62IByo5yGb4mDIzkR88Sgklk5A6tzpyDzmcOSdvhiFFy9DybWXYs7VF2DcITnw6L/E7qaX9n85Jbo6e1KbaNSnmuKhkXVISZgRHJF91tEGQ97unnSDiUffI2FqiTdmfTxtxCWTxuad6hwOEAgBWOgEceYxOsyhVcL4WVokkzfddUogEmTrTTiCRvzpNK/PT84Gm24hOKe74KxUNYRCYB5Cp4Mm3gxdegqM+TmILylC4pSJpOQZSD/iUGQdezhyTjoO+WcsQcG5SzHyorMw6srzkX/WyUg7dBaMI3LQhkpsqXoRX+54GNuqXoXPb8dQL3b6+NtWWrJmGcmHuUaknTkh3pj38VD5dpSPGQCYYXx81tZJuWcXTh11SatGtQScGtsgywK5RRoccqIeh5JFmHOsGccsmYGzz16G85edj5+ccxGWnX42pp14HLKPno+Mo+Z1hsyFC9QRm3X8kchZfAxyTz4eeaTQ/HNOwYjzlmLE+adjxHkU9j9H8pPCyPPPQMGyU5GzaCFSZk1FfNFIGNJTIev1UGgZVtW8But2P4HPtz+IdXueQrNjh5o+mJZ3LcPKTzNZYCCHNS/9pKbcgqUFFsvI7V1phvoeUwCwMASCpimFiwoix/J/AAAHbklEQVQOGfeLCqD3yEOMLq2egDBaQ9vHGkw41IPx89yYd0Ie5iw9CqNOW4TcU07oFXJOOR45pHQeyTlLjkU2BQZC9vFHIePIeepITpleisTxJTAXFsCQmQ5dYgJkgx5CljslZ8thc1Wqo/yzrSvw5c7fY2P5P9DQthHBkK+TbigvBvL0U+LiodNoMCrngqpROefnWESudSg8+yobcwBwJUKkOUpylhQunvHEu0ZtosJpwxGEAGRtEF5UoN71MbY3/wOfVq7A6tqHsN3+FtrkWogEI7RJidAlJ6nK1CVaoLXEQ2M2QWM0QNJqIckyhBBhRWSF+/wO1LWsx/qyP+ODjbdS+CW+3v04tte8DiuN+ECITwrD8wjLvI8MHvmpNPLN+nhlUtHt7+VlnDRCCBHR6V4f7PpNGhYAcI0kcCg7Zdqxi2c+dV128vQgbZlw8rAF/lUPt68RjbbN2FP/Pr4p+xPe33AL/vXVpXjv25vw2baVpLynUVb/ARpaN8LmqoLT2wSPrxXedgfcvhY4PI1oc1ai1roWu2vfxloy659suRfvfHM9/v315fhw0x3YsPev2NvwIZrs2+Fpt5L/EIppm+K0evDIT08YG5wy+v7r0hNn8/5+bCvpIvGwAaCjjqT4kY8cMflXU6YUXtQ23CAA9o3AUMhPDpgNdk8Nmu3bUNH0CbZXv0YA+As+2Xov3v32Z3j960vwzzXn4pU15+CVL87Eq1+cg9co/q+1l+K9jTfjs+0rsaH8b9hZ+waqrF/A6tgJh7cWvoAdISWAfde++va9D/2vqnzy9otyTm0aN+qWKQnxRY8MnWv/HIYdAFy9WZ+5aebon2ScMPXRzw26hGGbEriurkF0AIIUFqS52R90q8DwtLfSyLfSqG+Gy9tAlqABLrIebhrRHp+VLEIb0dnBX/cOhtpplJMBI8Yd/Oi1z5v35/mUrs/MARLNOgOyE7OUacW3vVecd1km99kARWKSfUAAwJLSlNCelz73kJNm/eWKkpzFbkloOfkHGwRJLiDA27PJtEGTFZ8EX9APr7+dciK/JSGQFGfBhLwT3DNLVl6RmTRvWE1+T8kOGAA6Kk405f3f/Al3JCwsXfFyirlIkYSmI2tIT0GltbIMDrKQ0BEk6mAOQggIouFAj4hvphdUknnIxFcjSTDSmpz35LMsici2JIF/D6HO0Yr2QMfUEBl7raxDXnKxcmjJrf+cXHRLgsVU+H+RlYwdlRQ7VpFzEkIERmQsWHpc6SOlM4qurIw35gDUyRjCxfMK/xdpGkkGf0Q6heZSDqm0lGKnKoVGaaLRRHlxYHPL8y1726zMrsFAyuV0E+2+sUlPoDLMJ8OciCxSdpYlGWlmi7o8s3s9qGqzwuHzRCW5IOpEU5Yyp/jK3fMmrSjNST/qFO4TSj7g9/cCgI5Wms0ZG6eMuqBgYen9Z08asazJbMjqyBrUk3+fwEMmuNXjQpPThjZ68g8vMjg0kgZxNM9aDHFIJnCkkxJZqRnxieCQSaOZQxY/yZynk8JTCDwWvRFGWiqSguAL+ImnE/U02hscbeoPOypg7pGKq8BsSMekEWc3LZy0Ytm4/PNGm/V5GyMtPRx00nAwjZZnWsLY5+aWXJ9+TOlvLp1edEVTomlktCx60bNa2oMBVUnNLruqtDp7K1hxjaS8Jqdd/elV/hErBkzXwD/PymUaCUQc6u1tann+uVaHz4v2YDAqtfPqh63c1MKLmo4pXXnpnJKfpScnTHiul9DfQ4L0PdQZtsq0xHFPTS+6NP3oyfddMmvMT9vSLGMhS3pwB9KfId8hJUTKC8BLI9nl96mm2+51w+Z10cj+Ltgojc26m2iYln/kKcQHBlFJoECStEgyF2JG0VVtR09eccnMMVenpyVOCPtFzajYx4j4oAJAR5tSLKOfnlJ4XtIRk+65bt7Ym9sK0ubDoEvuyD7Inwr5BybkpMzGISU/b1tYuuK6aUWXJKUnjnv6YBRcOhiF6pApyVzwcEne4qRjp/42ftH0Jx44fMLddflphyg6TTyRsJGnx0FyayQDcpKnKQsm3Fm1eOaT9504/a748fmnJSWZRz18kIjYpxgHNQA6JCYHzJliKbyxOPf47MOKb8s+ZfZfVhxT+sDWsbmnBszkOO7bmTuQgFDU3UCTPg1jchYHjpx077bT5v7t/sPHLc8uyV2Sn2op/qUQ6c4O+Q/m5w8CAF070GxOr080F9wyMvOI8fMn/FJ78uy/nnD6IS+/dsTE5c3FuYuVZHMRtBqTWkSJ0lVTC/X4wzw48AhPNBWgKOtYZf6EO5uXznnhtVPmPLvoiIl3akdnHzMu0TzyZpatR/GDPvqDA0DPHjUZkt9KtYw+eUzO8WmHT7hTOnnW3+aee/jbVy+b/8bjp8z+83sLJ6/YPnvMdc2TCs51js4+wVuQdog/M2lSMNE0QjHoksi3SAK/ZyROCOanzfGPzj7OO6ngHOes0dc0Hzn53u1LZj31/rJ5bzxxzoJ3rj119t8OPWryPdLY3CVpaYklJ5sMaW9giNf3Xfz/AQAA//9T+F1+AAAABklEQVQDAH8uCHwmhwdRAAAAAElFTkSuQmCC\"","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 { X } from 'lucide-react'\nimport { Dialog, Popover } from 'radix-ui'\nimport { useRef, type ReactNode } from 'react'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\nimport { useLayoutReady, useMotionLib, useMotionOn, useMotionPresets } from '@/lib/motion'\n\n/*\n * Painel de escolha usado por Select e DatePicker (não é para uso direto nas telas).\n * Desktop: popover ancorado no campo, na largura dele.\n * Mobile (< 768px): o mesmo conteúdo reconstruído como bottom sheet, com título,\n * área rolável e rodapé fixo que respeita a área segura do aparelho.\n */\n\ninterface PickerPanelProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** O gatilho (renderizado com asChild). */\n trigger: ReactNode\n /** Título do bottom sheet no mobile (normalmente o rótulo do campo). */\n title: string\n /** Topo fixo (ex.: campo de busca). */\n header?: ReactNode\n children: ReactNode\n /** Rodapé fixo (ex.: Limpar / Aplicar). */\n footer?: ReactNode\n /** Largura no desktop: do gatilho ou automática (calendário). */\n width?: 'trigger' | 'auto'\n /**\n * Botão sobreposto ao gatilho (ex.: limpar). Fica como irmão do gatilho, nunca dentro\n * dele: botão dentro de botão é HTML inválido e confunde leitores de tela.\n */\n adornment?: ReactNode\n align?: 'start' | 'center' | 'end'\n}\n\n/** A folha fecha se o arraste passou de 40% da altura ou se foi um arremesso (> 0,11 px/ms). */\nconst DISMISS_FRACTION = 0.4\nconst DISMISS_VELOCITY = 110\n\ninterface MobileSheetProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n trigger: ReactNode\n adornment?: ReactNode\n /** Alça e título: a única área que começa o arraste (o resto rola). */\n head: ReactNode\n /** Busca, lista e rodapé. */\n rest: ReactNode\n}\n\n/**\n * A folha do celular em `on`: entra de baixo, acompanha o dedo (arraste vertical pela alça, com\n * fricção ao puxar para cima), fecha por distância ou por arremesso e, se o dedo solta antes\n * disso, volta à origem com a mola da folha (a velocidade do dedo entra na mola, sem costura). O\n * fundo escurecido acompanha a distância. Só a alça arrasta: o corpo rola sem disputar o gesto.\n * Nenhum valor passa por `style`: o Motion guarda a posição do arraste, e o escurecimento do\n * fundo é gravado direto no elemento (sem render por quadro).\n */\nfunction MobileSheet({ open, onOpenChange, trigger, adornment, head, rest }: MobileSheetProps) {\n const { AnimatePresence, animate, m, useDragControls } = useMotionOn()\n const presets = useMotionPresets()\n const ready = useLayoutReady()\n const controls = useDragControls()\n const sheetRef = useRef<HTMLDivElement>(null)\n const dimRef = useRef<HTMLDivElement>(null)\n const height = useRef(1)\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Anchor adornment={adornment}>\n <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>\n </Anchor>\n <AnimatePresence>\n {open && (\n <Dialog.Portal forceMount key=\"sheet\">\n <Dialog.Overlay forceMount asChild>\n <m.div className=\"fixed inset-0 z-40\" {...presets.fade}>\n <div ref={dimRef} className=\"absolute inset-0 bg-overlay\" />\n </m.div>\n </Dialog.Overlay>\n <Dialog.Content\n forceMount\n asChild\n aria-describedby={undefined}\n className=\"fixed inset-x-0 bottom-0 z-50 flex max-h-sheet flex-col rounded-t-surface border-t bg-popover text-popover-foreground shadow-lg outline-none\"\n >\n <m.div\n ref={sheetRef}\n {...presets.sheet('bottom')}\n drag={ready ? 'y' : false}\n dragControls={controls}\n dragListener={false}\n dragConstraints={{ top: 0 }}\n dragElastic={{ top: 0.2, bottom: 0 }}\n dragSnapToOrigin\n dragTransition={presets.sheetBounce}\n onDragStart={() => {\n height.current = sheetRef.current?.offsetHeight || 1\n }}\n onDrag={(_, info) => {\n const dim = dimRef.current\n if (dim)\n dim.style.opacity = String(\n 1 - Math.min(1, Math.max(0, info.offset.y / height.current)),\n )\n }}\n onDragEnd={(_, info) => {\n if (\n info.offset.y > height.current * DISMISS_FRACTION ||\n info.velocity.y > DISMISS_VELOCITY\n ) {\n onOpenChange(false)\n return\n }\n // Soltou antes: o fundo volta a escurecer por inteiro junto com a folha.\n if (dimRef.current) animate(dimRef.current, { opacity: 1 }, presets.springSheet)\n }}\n >\n <div\n data-sheet-handle\n onPointerDown={(e) => controls.start(e)}\n className=\"touch-none\"\n >\n {head}\n </div>\n {rest}\n </m.div>\n </Dialog.Content>\n </Dialog.Portal>\n )}\n </AnimatePresence>\n </Dialog.Root>\n )\n}\n\nfunction Anchor({ adornment, children }: { adornment?: ReactNode; children: ReactNode }) {\n if (!adornment) return children\n return (\n <div className=\"relative w-full min-w-0\">\n {children}\n {adornment}\n </div>\n )\n}\n\nexport function PickerPanel({\n open,\n onOpenChange,\n trigger,\n title,\n header,\n children,\n footer,\n width = 'trigger',\n adornment,\n align = 'start',\n}: PickerPanelProps) {\n const { isMobile } = useBreakpoint()\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const on = lib !== null\n\n // Conteúdo interno do sheet (mobile) e do painel (desktop), igual nos dois modos. A alça e o\n // título ficam à parte porque, em `on`, só eles começam o arraste da folha.\n const sheetHead = (\n <>\n <div className=\"flex shrink-0 flex-col items-center pt-2\">\n <span aria-hidden className=\"h-1 w-12 rounded-full bg-border\" />\n </div>\n <div className=\"flex shrink-0 items-center justify-between gap-2 pr-2 pl-4\">\n <Dialog.Title className=\"truncate text-base font-semibold\">{title}</Dialog.Title>\n <Dialog.Close\n aria-label=\"Fechar\"\n className=\"flex size-touch items-center justify-center rounded-item text-muted-foreground hover:bg-accent\"\n >\n <X className=\"size-icon-md\" aria-hidden />\n </Dialog.Close>\n </div>\n </>\n )\n const sheetRest = (\n <>\n {header && <div className=\"shrink-0 border-b px-4 pb-3\">{header}</div>}\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-2\">{children}</div>\n {footer && <div className=\"shrink-0 border-t px-4 pt-3 pb-safe\">{footer}</div>}\n </>\n )\n const sheetBody = (\n <>\n {sheetHead}\n {sheetRest}\n </>\n )\n // O painel nasce do campo, não do centro (W6): a origem vem do Radix (é um Popover).\n const panelCls = cn(\n 'z-50 flex max-h-command origin-(--radix-popover-content-transform-origin) flex-col overflow-hidden rounded-surface border bg-popover text-popover-foreground shadow-md outline-none',\n width === 'trigger' ? 'w-trigger max-w-popover' : 'w-auto max-w-popover md:max-w-none',\n )\n const panelBody = (\n <>\n {header && <div className=\"shrink-0 border-b p-2\">{header}</div>}\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-1\">{children}</div>\n {footer && <div className=\"shrink-0 border-t p-2\">{footer}</div>}\n </>\n )\n\n if (on && isMobile) {\n return (\n <MobileSheet\n open={open}\n onOpenChange={onOpenChange}\n trigger={trigger}\n adornment={adornment}\n head={sheetHead}\n rest={sheetRest}\n />\n )\n }\n\n if (on) {\n return (\n <Popover.Root open={open} onOpenChange={onOpenChange}>\n <Anchor adornment={adornment}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n </Anchor>\n <lib.AnimatePresence>\n {open && (\n <Popover.Portal forceMount key=\"panel\">\n <Popover.Content\n forceMount\n asChild\n align={align}\n sideOffset={6}\n collisionPadding={16}\n className={panelCls}\n >\n <lib.m.div {...presets.open()}>{panelBody}</lib.m.div>\n </Popover.Content>\n </Popover.Portal>\n )}\n </lib.AnimatePresence>\n </Popover.Root>\n )\n }\n\n if (isMobile) {\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Anchor adornment={adornment}>\n <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>\n </Anchor>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-40 bg-overlay data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) 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=\"fixed inset-x-0 bottom-0 z-50 flex max-h-sheet flex-col rounded-t-surface border-t bg-popover text-popover-foreground shadow-lg outline-none data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:slide-out-to-bottom data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom\"\n >\n {sheetBody}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n }\n\n return (\n <Popover.Root open={open} onOpenChange={onOpenChange}>\n <Anchor adornment={adornment}>\n <Popover.Trigger asChild>{trigger}</Popover.Trigger>\n </Anchor>\n <Popover.Portal>\n <Popover.Content\n align={align}\n sideOffset={6}\n collisionPadding={16}\n className={cn(\n 'z-50 flex max-h-command origin-(--radix-popover-content-transform-origin) flex-col overflow-hidden rounded-surface border bg-popover text-popover-foreground shadow-md outline-none',\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',\n width === 'trigger' ? 'w-trigger max-w-popover' : 'w-auto max-w-popover md:max-w-none',\n )}\n >\n {panelBody}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\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 { Dialog } from 'radix-ui'\nimport { useState, type ReactNode } from 'react'\nimport { Modal } from '@/components/ui/modal'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\nimport { OverlayShell } from './overlay-shell'\n\n/*\n * Drawer único, componente central do sistema. Desliza da direita para a esquerda.\n * Para formulários e detalhes de volume médio (até ~12 campos).\n * Header fixo: ícone, título, descrição e fechar.\n * Body: única área com rolagem.\n * Footer fixo: ações (use <ActionBar>), com borda superior.\n * Mobile: tela inteira (100dvh), footer acima da área segura e do teclado.\n * Fecha por Esc e clique fora; com dirty, pede confirmação antes.\n */\n\n/*\n * Largura no desktop, em porcentagem da tela: 30 (padrão), 40, 50 ou 75. Nunca menos que\n * 28rem (para caber o formulário em telas médias); no celular, sempre tela inteira.\n * sm, md, lg e xl são os nomes antigos e valem 30, 30, 50 e 75.\n */\nconst sizes = {\n '30': 'md:w-sheet-30',\n '40': 'md:w-sheet-40',\n '50': 'md:w-sheet-50',\n '75': 'md:w-sheet-75',\n full: 'md:w-full',\n sm: 'md:w-sheet-30',\n md: 'md:w-sheet-30',\n lg: 'md:w-sheet-50',\n xl: 'md:w-sheet-75',\n} as const\n\nconst overlayCls = 'fixed inset-0 z-50 bg-overlay'\nconst panelCls =\n 'fixed inset-y-0 right-0 z-50 flex h-dvh w-full flex-col bg-card text-card-foreground shadow-lg outline-none md:border-l'\n\nexport interface DrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: ReactNode\n description?: ReactNode\n icon?: ReactNode\n size?: keyof typeof sizes\n children: ReactNode\n /** Rodapé fixo. Normalmente um <ActionBar>. */\n footer?: ReactNode\n /** Há alterações não salvas: fechar pede confirmação. */\n dirty?: boolean\n /** Textos da confirmação de descarte. */\n discardTitle?: string\n discardDescription?: string\n}\n\nexport function Drawer({\n open,\n onOpenChange,\n title,\n description,\n icon,\n size = '30',\n children,\n footer,\n dirty,\n discardTitle = 'Descartar alterações?',\n discardDescription = 'As informações preenchidas neste painel serão perdidas.',\n}: DrawerProps) {\n const [confirming, setConfirming] = useState(false)\n const requestClose = () => (dirty ? setConfirming(true) : onOpenChange(false))\n const lib = useMotionLib()\n const presets = useMotionPresets()\n\n const keepOpenIfDirty = (e: { preventDefault: () => void }) => {\n if (dirty) {\n e.preventDefault()\n setConfirming(true)\n }\n }\n const shell = (\n <OverlayShell\n title={title}\n description={description}\n icon={icon}\n footer={footer}\n onRequestClose={requestClose}\n >\n {children}\n </OverlayShell>\n )\n\n return (\n <>\n <Dialog.Root open={open} onOpenChange={(o) => (o ? onOpenChange(true) : requestClose())}>\n {lib ? (\n // `on`: o painel só existe enquanto aberto ou saindo; o Radix fica com forceMount.\n <lib.AnimatePresence>\n {open && (\n <Dialog.Portal forceMount key=\"drawer\">\n <Dialog.Overlay forceMount asChild>\n <lib.m.div className={overlayCls} {...presets.fade} />\n </Dialog.Overlay>\n <Dialog.Content\n forceMount\n asChild\n onEscapeKeyDown={keepOpenIfDirty}\n onPointerDownOutside={keepOpenIfDirty}\n data-rendra=\"GAV-001\"\n className={cn(panelCls, sizes[size])}\n >\n <lib.m.div {...presets.sheet('right')}>{shell}</lib.m.div>\n </Dialog.Content>\n </Dialog.Portal>\n )}\n </lib.AnimatePresence>\n ) : (\n <Dialog.Portal>\n <Dialog.Overlay\n className={cn(\n overlayCls,\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0',\n )}\n />\n <Dialog.Content\n onEscapeKeyDown={keepOpenIfDirty}\n onPointerDownOutside={keepOpenIfDirty}\n data-rendra=\"GAV-001\"\n className={cn(\n panelCls,\n 'data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:slide-out-to-right data-[state=open]:animate-in data-[state=open]:slide-in-from-right',\n sizes[size],\n )}\n >\n {shell}\n </Dialog.Content>\n </Dialog.Portal>\n )}\n </Dialog.Root>\n <Modal\n open={confirming}\n onOpenChange={setConfirming}\n type=\"destructive\"\n title={discardTitle}\n description={discardDescription}\n confirmLabel=\"Descartar\"\n cancelLabel=\"Continuar editando\"\n onConfirm={() => onOpenChange(false)}\n />\n </>\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 /** 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 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 {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","/**\n * Mapas de classes das primitivas de layout. Classes completas e estáticas,\n * para o Tailwind encontrá-las. Só os degraus da escala permitida.\n */\nexport type Space =\n '0' | '1' | '2' | '3' | '4' | '6' | '8' | '12' | '16' | '24' | 'section' | 'fields'\n\nexport const gapClass: Record<Space, string> = {\n '0': 'gap-0',\n '1': 'gap-1',\n '2': 'gap-2',\n '3': 'gap-3',\n '4': 'gap-4',\n '6': 'gap-6',\n '8': 'gap-8',\n '12': 'gap-12',\n '16': 'gap-16',\n '24': 'gap-24',\n // Espaço entre seções de página: menor no mobile, cheio no desktop.\n section: 'gap-8 md:gap-12',\n // Entre campos de formulário (Field): 16px do fim de um campo ao rótulo do próximo.\n fields: 'gap-x-4 gap-y-4 md:gap-x-6',\n}\n\n/**\n * Grade de formulário, pela largura do próprio bloco (container query), não da tela:\n * 1 coluna estreito, 6 colunas a partir de 28rem, 12 colunas a partir de 48rem.\n * No largo, o padrão é 3 campos por linha (md = 4/12). Nunca 2 por linha por padrão.\n */\nexport const fieldGridClass = 'grid grid-cols-1 @md:grid-cols-6 @3xl:grid-cols-12'\n\n/** Largura do Field na grade de formulário (no largo, em 12 colunas). */\nexport const fieldSpanClass = {\n /** 2/12, cerca de 17%: UF, número, DDD. */\n xs: '@md:col-span-2 @3xl:col-span-2',\n /** 3/12 = 25%: CEP, CNPJ, CPF, datas curtas. */\n sm: '@md:col-span-2 @3xl:col-span-3',\n /** 4/12 = 33%: o padrão, 3 campos por linha. */\n md: '@md:col-span-3 @3xl:col-span-4',\n /** 6/12 = 50%. */\n lg: '@md:col-span-3 @3xl:col-span-6',\n /** 8/12 = 67%: nome, logradouro longo. */\n xl: '@md:col-span-6 @3xl:col-span-8',\n /** Linha inteira. */\n full: '@md:col-span-6 @3xl:col-span-12',\n} as const\n\nexport type FieldSpan = keyof typeof fieldSpanClass\n\nexport const alignClass = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n} as const\n\nexport const justifyClass = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n} as const\n\nexport type Align = keyof typeof alignClass\nexport type Justify = keyof typeof justifyClass\n","import { Label as L } from 'radix-ui'\nimport {\n cloneElement,\n createContext,\n isValidElement,\n useContext,\n useId,\n type ComponentProps,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { fieldSpanClass, type FieldSpan } from '@/components/layout/tokens'\nimport { cn } from '@/lib/cn'\n\n/*\n * Rótulo, ajuda e erro padronizados.\n * Regras: rótulo sempre acima; obrigatório marcado no rótulo; erro abaixo do campo em\n * espaço reservado (a tela não pula quando o erro aparece).\n */\n\nexport function Label({\n className,\n required,\n children,\n ...props\n}: ComponentProps<typeof L.Root> & { required?: boolean }) {\n return (\n <L.Root\n data-rendra=\"FLD-002\"\n className={cn('text-label text-label-foreground label-case', className)}\n {...props}\n >\n {children}\n {required && (\n <span className=\"text-destructive\" aria-hidden>\n {' '}\n *\n </span>\n )}\n {required && <span className=\"sr-only\"> (obrigatório)</span>}\n </L.Root>\n )\n}\n\ninterface FieldContextValue {\n id: string\n describedBy: string\n invalid: boolean\n}\nconst FieldContext = createContext<FieldContextValue | null>(null)\n\n/** Liga um controle ao Field mais próximo (id, aria-describedby, aria-invalid). */\nexport function useFieldControl() {\n return useContext(FieldContext)\n}\n\nexport interface FieldProps {\n label?: ReactNode\n required?: boolean\n /** Texto de ajuda sempre visível (substitui tooltip no mobile). */\n help?: ReactNode\n /** Mensagem de erro, abaixo do controle, no lugar da ajuda. */\n error?: ReactNode\n /**\n * Largura na grade de formulário (Grid form ou FormSection): xs (17%), sm (25%),\n * md (33%, padrão: 3 por linha), lg (50%), xl (67%), full. half é o antigo e vale md.\n */\n span?: FieldSpan | 'half'\n /** Começa uma linha nova (ex.: os campos que vêm depois do CEP ou do CNPJ). */\n newRow?: boolean\n /**\n * Reserva a linha da mensagem mesmo vazia, para o erro não empurrar o que vem abaixo\n * (útil em formulários em grid de 2 colunas com validação ao digitar). Padrão: não\n * reserva, e os campos ficam mais próximos.\n */\n reserveMessage?: boolean\n /** Obsoleto: sem reserva já é o padrão. Mantido para não quebrar telas existentes. */\n compact?: boolean\n /** id do controle; gerado automaticamente se omitido. */\n id?: string\n className?: string\n children: ReactNode\n}\n\nexport function Field({\n label,\n required,\n help,\n error,\n span = 'md',\n newRow,\n reserveMessage = false,\n id,\n className,\n children,\n}: FieldProps) {\n const auto = useId()\n const controlId = id ?? `campo${auto}`\n const messageId = `${controlId}-mensagem`\n const invalid = Boolean(error)\n const message = error ?? help\n\n // Repassa id e acessibilidade ao controle filho quando ele é um elemento simples.\n const child =\n isValidElement(children) && typeof children.type !== 'string'\n ? cloneElement(children as ReactElement<Record<string, unknown>>, {\n id: (children.props as { id?: string }).id ?? controlId,\n // Só repassa invalid quando há erro, para não vazar o atributo em elementos comuns.\n ...(invalid\n ? { invalid: (children.props as { invalid?: boolean }).invalid ?? true }\n : {}),\n 'aria-describedby': message ? messageId : undefined,\n 'aria-required': required || undefined,\n })\n : children\n\n return (\n <FieldContext.Provider\n value={{ id: controlId, describedBy: message ? messageId : '', invalid }}\n >\n <div\n data-slot=\"field\"\n data-rendra=\"FLD-001\"\n className={cn(\n 'flex min-w-0 flex-col gap-2',\n fieldSpanClass[span === 'half' ? 'md' : span],\n newRow && '@md:col-start-1 @3xl:col-start-1',\n className,\n )}\n >\n {label && (\n <Label htmlFor={controlId} required={required}>\n {label}\n </Label>\n )}\n {child}\n {(reserveMessage || message) && (\n <p\n id={messageId}\n role={invalid ? 'alert' : undefined}\n className={cn(\n '-mt-1 min-h-4 text-help',\n invalid ? 'font-medium text-destructive' : 'text-help-foreground',\n )}\n >\n {message}\n </p>\n )}\n </div>\n </FieldContext.Provider>\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 { Command } from 'cmdk'\nimport { Check, ChevronDown, Plus, Search, X } from 'lucide-react'\nimport { forwardRef, useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { Spinner } from '@/components/ui/spinner'\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 interface SelectOption {\n value: string\n label: string\n description?: string\n icon?: ReactNode\n disabled?: boolean\n /** Agrupa opções sob um título. */\n group?: string\n}\n\ninterface BaseProps {\n options?: SelectOption[]\n placeholder?: string\n /**\n * Nome do campo: título do painel no mobile e, quando o Select não está dentro de um\n * Field (sem id ligado a um rótulo visível), nome acessível do gatilho.\n */\n label?: string\n size?: ControlSize\n invalid?: boolean\n disabled?: boolean\n /** Campo de busca no topo da lista. */\n searchable?: boolean\n /** Permite criar uma opção nova a partir do texto buscado. */\n creatable?: boolean\n onCreate?: (label: string) => SelectOption | Promise<SelectOption>\n /** Busca remota: recebe o texto e devolve as opções. Liga a busca automaticamente. */\n loadOptions?: (query: string) => Promise<SelectOption[]>\n /** Mostra indicador de carregamento na lista. */\n loading?: boolean\n /** Botão de limpar no campo. */\n clearable?: boolean\n emptyText?: string\n id?: string\n className?: string\n 'aria-describedby'?: string\n}\n\n/** Acima deste número de opções, o \"Selecionar todos\" aparece sem a prop `selectAll`. */\nconst SELECT_ALL_AUTO_MIN = 5\n\ninterface SingleProps extends BaseProps {\n multiple?: false\n value?: string | null\n onChange?: (value: string | null) => void\n selectAll?: never\n showCount?: never\n maxChips?: never\n}\n\ninterface MultipleProps extends BaseProps {\n /** Seleção múltipla com checkbox e chips. */\n multiple: true\n value?: string[]\n onChange?: (value: string[]) => void\n /**\n * Linha \"Selecionar todos\" no topo da lista (vira \"Desmarcar todos\" com tudo marcado).\n * Padrão: aparece sozinha com mais de 5 opções; `false` desliga, `true` força com 5 ou menos.\n */\n selectAll?: boolean\n /** Mostra \"3 selecionados\" no lugar dos chips. */\n showCount?: boolean\n /** Máximo de chips visíveis antes de \"+N\". */\n maxChips?: number\n}\n\nexport type SelectProps = SingleProps | MultipleProps\n\n/**\n * Select único do sistema. Busca, múltiplo, selecionar todos, contador, criar opção,\n * busca remota e carregamento são props. No mobile abre como bottom sheet.\n */\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(props, ref) {\n const {\n options: staticOptions = [],\n placeholder = 'Selecione',\n label,\n size,\n invalid,\n disabled,\n searchable,\n creatable,\n onCreate,\n loadOptions,\n loading,\n clearable,\n emptyText = 'Nenhuma opção encontrada.',\n id,\n className,\n } = props\n const multiple = props.multiple === true\n const { isMobile } = useBreakpoint()\n const [open, setOpen] = useState(false)\n const listId = `${useId()}-lista`\n const [query, setQuery] = useState('')\n const [remote, setRemote] = useState<SelectOption[] | null>(null)\n const [remoteLoading, setRemoteLoading] = useState(false)\n const [created, setCreated] = useState<SelectOption[]>([])\n const [innerSingle, setInnerSingle] = useState<string | null>(null)\n const [innerMulti, setInnerMulti] = useState<string[]>([])\n // No mobile, o múltiplo só aplica ao confirmar.\n const [draft, setDraft] = useState<string[]>([])\n\n const selectedSingle = multiple ? null : ((props as SingleProps).value ?? innerSingle)\n const selectedMulti = multiple ? ((props as MultipleProps).value ?? innerMulti) : []\n\n // Busca remota com espera curta entre teclas.\n const seq = useRef(0)\n useEffect(() => {\n if (!loadOptions || !open) return\n const n = ++seq.current\n setRemoteLoading(true)\n const t = window.setTimeout(async () => {\n const res = await loadOptions(query)\n if (n === seq.current) {\n setRemote(res)\n setRemoteLoading(false)\n }\n }, 250)\n return () => window.clearTimeout(t)\n }, [loadOptions, query, open])\n\n const all = useMemo(() => {\n const base = remote ?? staticOptions\n const map = new Map<string, SelectOption>()\n ;[...base, ...created].forEach((o) => map.set(o.value, o))\n return [...map.values()]\n }, [remote, staticOptions, created])\n\n const byValue = (v: string) => all.find((o) => o.value === v)\n const isSearchable = searchable || creatable || Boolean(loadOptions)\n const busy = loading || remoteLoading\n const multiValue = isMobile && multiple ? draft : selectedMulti\n\n const commitSingle = (v: string | null) => {\n setInnerSingle(v)\n ;(props as SingleProps).onChange?.(v)\n }\n const commitMulti = (v: string[]) => {\n setInnerMulti(v)\n ;(props as MultipleProps).onChange?.(v)\n }\n\n const toggle = (v: string) => {\n if (!multiple) {\n commitSingle(v)\n setOpen(false)\n return\n }\n const next = multiValue.includes(v) ? multiValue.filter((x) => x !== v) : [...multiValue, v]\n if (isMobile) setDraft(next)\n else commitMulti(next)\n }\n\n const enabled = all.filter((o) => !o.disabled)\n const allSelected = enabled.length > 0 && enabled.every((o) => multiValue.includes(o.value))\n const showSelectAll =\n multiple && ((props as MultipleProps).selectAll ?? all.length > SELECT_ALL_AUTO_MIN)\n const toggleAll = () => {\n const next = allSelected ? [] : enabled.map((o) => o.value)\n if (isMobile) setDraft(next)\n else commitMulti(next)\n }\n\n const create = async () => {\n const text = query.trim()\n if (!text) return\n const opt = onCreate ? await onCreate(text) : { value: text, label: text }\n setCreated((c) => [...c, opt])\n setQuery('')\n toggle(opt.value)\n }\n\n const onOpenChange = (o: boolean) => {\n setOpen(o)\n if (o) setDraft(selectedMulti)\n else setQuery('')\n }\n\n // ------------------------------------------------ gatilho\n const hasValue = multiple ? selectedMulti.length > 0 : selectedSingle != null\n const maxChips = (props as MultipleProps).maxChips ?? 2\n let display: ReactNode = <span className=\"truncate text-muted-foreground\">{placeholder}</span>\n if (!multiple && selectedSingle != null) {\n const o = byValue(selectedSingle)\n display = (\n <span className=\"flex min-w-0 items-center gap-2\">\n {o?.icon}\n <span className=\"truncate\">{o?.label ?? selectedSingle}</span>\n </span>\n )\n } else if (multiple && selectedMulti.length > 0) {\n display = (props as MultipleProps).showCount ? (\n <span className=\"truncate\">\n {selectedMulti.length} {selectedMulti.length === 1 ? 'selecionado' : 'selecionados'}\n </span>\n ) : (\n <span className=\"flex min-w-0 items-center gap-1 overflow-hidden\">\n {selectedMulti.slice(0, maxChips).map((v) => (\n <span\n key={v}\n className=\"max-w-3xs shrink-0 truncate rounded-item bg-primary-soft px-2 py-1 text-xs leading-none font-medium text-primary-soft-foreground\"\n >\n {byValue(v)?.label ?? v}\n </span>\n ))}\n {selectedMulti.length > maxChips && (\n <span className=\"shrink-0 rounded-item bg-muted px-2 py-1 text-xs leading-none font-medium\">\n +{selectedMulti.length - maxChips}\n </span>\n )}\n </span>\n )\n }\n\n const showClear = clearable && hasValue && !disabled\n const clear = showClear ? (\n <button\n type=\"button\"\n aria-label=\"Limpar seleção\"\n className={cn(\n controlAdornmentButton,\n 'absolute top-1/2 right-8 mr-0 -translate-y-1/2 md:mr-0',\n )}\n onClick={() => (multiple ? commitMulti([]) : commitSingle(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 role=\"combobox\"\n aria-expanded={open}\n aria-controls={listId}\n aria-haspopup=\"listbox\"\n aria-invalid={invalid || undefined}\n aria-describedby={props['aria-describedby']}\n aria-label={id ? undefined : label}\n disabled={disabled}\n data-rendra=\"SEL-001\"\n // Teclas no gatilho não chegam à lista (Enter não seleciona opção com o painel fechado).\n onKeyDown={(e) => e.stopPropagation()}\n className={cn(\n controlFrame({ size, invalid }),\n 'cursor-pointer text-left disabled:cursor-not-allowed disabled:opacity-60',\n className,\n )}\n >\n <span className=\"flex min-w-0 flex-1 items-center\">{display}</span>\n {showClear && <span aria-hidden className={cn(controlAdornmentSpace, '-mr-1')} />}\n <ChevronDown\n aria-hidden\n className={cn(\n 'size-icon-sm shrink-0 text-muted-foreground transition-transform duration-(--rendra-duration-base) ease-move',\n open && 'rotate-180',\n )}\n />\n </button>\n )\n\n // ------------------------------------------------ lista\n const groups = all.reduce<Record<string, SelectOption[]>>((acc, o) => {\n ;(acc[o.group ?? ''] ??= []).push(o)\n return acc\n }, {})\n const q = query.trim().toLowerCase()\n const showCreate = creatable && q && !all.some((o) => o.label.toLowerCase() === q)\n\n const itemClass =\n 'relative flex min-h-touch cursor-pointer items-center gap-3 rounded-item px-3 text-sm outline-none select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent md:min-h-0 md:py-2'\n\n const checkbox = (checked: boolean) => (\n <span\n aria-hidden\n className={cn(\n 'flex size-icon-sm shrink-0 items-center justify-center rounded-item border transition-colors',\n checked ? 'border-primary bg-primary text-primary-foreground' : 'border-input bg-card',\n )}\n >\n {checked && <Check className=\"size-3\" strokeWidth={3} />}\n </span>\n )\n\n const list = (\n <Command.List id={listId} aria-label={label ?? placeholder}>\n {busy && (\n <Command.Loading>\n <div className=\"flex items-center gap-2 px-3 py-4 text-sm text-muted-foreground\">\n <Spinner size=\"sm\" />\n Carregando opções...\n </div>\n </Command.Loading>\n )}\n {!busy && (\n <Command.Empty className=\"px-3 py-6 text-center text-sm text-muted-foreground\">\n {emptyText}\n </Command.Empty>\n )}\n {showCreate && (\n <Command.Item value={`__criar__${query}`} onSelect={create} className={itemClass}>\n <Plus className=\"size-icon-sm shrink-0 text-primary-text\" aria-hidden />\n <span className=\"truncate\">\n Criar <strong className=\"font-semibold\">“{query.trim()}”</strong>\n </span>\n </Command.Item>\n )}\n {showSelectAll && !q && enabled.length > 0 && (\n <Command.Item\n value=\"__todos__\"\n onSelect={toggleAll}\n className={cn(itemClass, 'font-medium')}\n >\n {checkbox(allSelected)}\n {allSelected ? 'Desmarcar todos' : 'Selecionar todos'}\n </Command.Item>\n )}\n {Object.entries(groups).map(([group, opts]) => (\n <Command.Group\n key={group || 'sem-grupo'}\n heading={group || undefined}\n className=\"[&_[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 >\n {opts.map((o) => {\n const checked = multiple ? multiValue.includes(o.value) : selectedSingle === o.value\n return (\n <Command.Item\n key={o.value}\n value={`${o.label} ${o.description ?? ''} ${o.value}`}\n disabled={o.disabled}\n onSelect={() => toggle(o.value)}\n aria-selected={checked}\n className={itemClass}\n >\n {multiple && checkbox(checked)}\n {o.icon && <span className=\"flex shrink-0 [&_svg]:size-icon-sm\">{o.icon}</span>}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className={cn('truncate', checked && !multiple && 'font-medium')}>\n {o.label}\n </span>\n {o.description && (\n <span className=\"truncate text-xs text-muted-foreground\">{o.description}</span>\n )}\n </span>\n {!multiple && checked && (\n <Check className=\"size-icon-sm shrink-0 text-primary-text\" aria-hidden />\n )}\n </Command.Item>\n )\n })}\n </Command.Group>\n ))}\n </Command.List>\n )\n\n const search = isSearchable ? (\n <div className={cn(controlFrame({ size: 'md' }), 'bg-background')}>\n <Search className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden />\n <Command.Input\n value={query}\n onValueChange={setQuery}\n placeholder={creatable ? 'Buscar ou criar...' : 'Buscar...'}\n className=\"h-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground\"\n />\n </div>\n ) : null\n\n const count = multiValue.length\n const footer =\n multiple && (isMobile || count > 0) ? (\n <div className=\"grid grid-actions-2 gap-3\">\n <Button\n variant=\"outline\"\n onClick={() => (isMobile ? setDraft([]) : commitMulti([]))}\n disabled={count === 0}\n >\n Limpar\n </Button>\n {isMobile ? (\n <Button\n onClick={() => {\n commitMulti(draft)\n setOpen(false)\n }}\n >\n Aplicar{count ? ` (${count})` : ''}\n </Button>\n ) : (\n <Button variant=\"secondary\" onClick={() => setOpen(false)}>\n Pronto ({count})\n </Button>\n )}\n </div>\n ) : undefined\n\n return (\n <Command shouldFilter={!loadOptions} loop className=\"contents\" label={label ?? placeholder}>\n <PickerPanel\n open={open}\n onOpenChange={onOpenChange}\n trigger={trigger}\n adornment={clear}\n title={label ?? placeholder}\n header={search}\n footer={footer}\n >\n {list}\n </PickerPanel>\n </Command>\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 { useLayoutEffect, useRef } from 'react'\n\n/**\n * Mede o espaço que sobra na área de conteúdo (o <main>) abaixo do elemento e grava em\n * --board-h. Com a classe h-board, o elemento ocupa exatamente essa altura: a página não\n * rola e a rolagem acontece dentro dele (kanban, chat).\n */\nexport function useFillHeight<T extends HTMLElement = HTMLDivElement>() {\n const ref = useRef<T>(null)\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const main = el.closest('main')\n const measure = () => {\n // O quadro fica com a altura que sobra na área de conteúdo depois de tudo o que está\n // acima e abaixo dele (título, ações, respiro da página): a página nunca rola por ele.\n // Nunca menos que 20rem, para caber ao menos alguns cards.\n const h = el.getBoundingClientRect().height\n // Altura real do conteúdo da página (o primeiro filho do <main>), não a de rolagem.\n const page = main?.firstElementChild as HTMLElement | null\n const room =\n main && page\n ? main.clientHeight - (page.getBoundingClientRect().height - h)\n : window.innerHeight - el.getBoundingClientRect().top\n el.style.setProperty('--board-h', `${Math.max(320, Math.floor(room))}px`)\n }\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(document.documentElement)\n if (main) ro.observe(main)\n return () => ro.disconnect()\n }, [])\n return ref\n}\n","import { format } from 'date-fns'\nimport {\n ArrowRightLeft,\n CalendarDays,\n GripVertical,\n Mail,\n MoreHorizontal,\n Phone,\n Plus,\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 { 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 DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\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\n/** Contador de quadros, só para o `layoutId` dos cards em `on` (um prefixo por instância). */\nlet boardsCreated = 0\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\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/**\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}\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. */\n renderCard?: (card: KanbanCard) => ReactNode\n /**\n * Valores do card (até 2, lado a lado com divisória) e o total de cada um na coluna.\n * 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 /** Card solto num destino da barra (ou escolhido no menu \"Mover para\"). */\n onDropTarget?: (cardId: string, targetId: string) => void\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\nfunction CardBody({\n card,\n valueFields = [],\n formatValue,\n withHandle,\n}: {\n card: KanbanCard\n valueFields?: KanbanValueField[]\n formatValue: (n: number) => string\n /** Reserva o espaço da alça de arraste no toque, à esquerda do título. */\n withHandle?: boolean\n}) {\n const shown = valueFields.slice(0, 2)\n return (\n <>\n {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 {card.subtitle && (\n <span className=\"text-xs text-muted-foreground tabular-nums\">{card.subtitle}</span>\n )}\n </span>\n {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 {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 {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 {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 {shown.length > 0 && (\n <span className=\"grid grid-cols-2 divide-x rounded-block bg-muted text-xs\">\n {shown.map((f) => (\n <span key={f.key} className=\"flex min-w-0 flex-col px-2 py-1\">\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 {(card.assignee || card.dueDate || card.meta) && (\n <span className=\"flex items-center gap-2 border-t pt-2 text-xs text-muted-foreground\">\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 {card.meta && (\n <span className=\"font-medium text-foreground tabular-nums\">{card.meta}</span>\n )}\n {card.assignee && (\n <span className=\"ml-auto\" title={card.assignee}>\n <Avatar name={card.assignee} size=\"sm\" />\n </span>\n )}\n </span>\n )}\n </>\n )\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 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 // 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\n const inColumn = (id: string) => cards.filter((c) => c.columnId === id)\n\n const drop = (columnId: string, index: number) => {\n if (dragging) onCardMove?.(dragging, columnId, index)\n setDragging(null)\n setOver(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 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 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 /** Barra de destinos, mostrada durante o arraste (mouse ou toque) quando há dropTargets. */\n const targetBar = showTargetBar && (\n <div\n aria-label=\"Soltar em\"\n className=\"fixed inset-x-4 bottom-4 z-30 flex justify-center gap-2 overflow-x-auto rounded-surface border bg-card p-2 shadow-lg\"\n >\n {dropTargets!.map((t) => (\n <div\n key={t.id}\n data-kanban-target={t.id}\n onDragOver={(e) => {\n if (dragging && !t.disabled) e.preventDefault()\n }}\n onDrop={(e) => {\n e.preventDefault()\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 opacity-50'\n : touchDrag?.overTargetId === t.id && 'bg-primary-soft/60 ring-2 ring-ring',\n )}\n >\n {t.icon && (\n <span aria-hidden className={targetIconTone[t.tone ?? 'neutral']}>\n {t.icon}\n </span>\n )}\n <span className=\"font-medium\">{t.label}</span>\n {t.hint && !t.disabled && <span className=\"text-muted-foreground\">{t.hint}</span>}\n {t.disabled && t.disabledReason && (\n <span className=\"text-muted-foreground\">{t.disabledReason}</span>\n )}\n </div>\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 }\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 bg-card 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 body = (\n <>\n {onCardClick ? (\n <button\n type=\"button\"\n onClick={() => onCardClick(card)}\n className=\"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 {renderCard ? (\n renderCard(card)\n ) : (\n <CardBody\n card={card}\n valueFields={valueFields}\n formatValue={formatValue}\n withHandle={showHandle}\n />\n )}\n </button>\n ) : (\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n {renderCard ? (\n renderCard(card)\n ) : (\n <CardBody\n card={card}\n valueFields={valueFields}\n formatValue={formatValue}\n withHandle={showHandle}\n />\n )}\n </div>\n )}\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 totals = (col: KanbanColumn) =>\n (valueFields ?? []).slice(0, 2).map((f) => ({\n ...f,\n total: inColumn(col.id).reduce((sum, c) => sum + (c.values?.[f.key] ?? 0), 0),\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 {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>\n ))}\n </div>\n )}\n </div>\n )\n\n const columnList = (col: KanbanColumn) => {\n const all = inColumn(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 if (isMobile) {\n return (\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: inColumn(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, inColumn(col.id).length)}\n {columnList(col)}\n </div>\n ))}\n </div>\n )\n }\n\n return (\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, inColumn(col.id).length)}</div>\n {columnList(col)}\n </div>\n ))}\n </section>\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 { CheckCircle2, SkipForward, XCircle } from 'lucide-react'\nimport type { ComponentType, ElementType, ReactNode } from 'react'\nimport type { FeedbackType } from '@/brand/types'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\nexport interface TimelineEvent {\n id: string\n title: ReactNode\n description?: ReactNode\n /** Data em formato curto (ex.: \"22/09/2026 14:30\"). */\n date: string\n tone?: FeedbackType | 'neutral'\n icon?: ReactNode\n /** Resultado do evento: mostrado com ícone e texto, nunca só pela cor. */\n status?: 'succeeded' | 'failed' | 'skipped'\n}\n\nconst dot: Record<NonNullable<TimelineEvent['tone']>, string> = {\n neutral: 'bg-muted text-muted-foreground',\n info: 'bg-info-soft text-info-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}\n\nconst statusTone: Record<\n NonNullable<TimelineEvent['status']>,\n NonNullable<TimelineEvent['tone']>\n> = {\n succeeded: 'success',\n failed: 'error',\n skipped: 'neutral',\n}\n\nconst statusIcon: Record<\n NonNullable<TimelineEvent['status']>,\n ComponentType<{ className?: string }>\n> = {\n succeeded: CheckCircle2,\n failed: XCircle,\n skipped: SkipForward,\n}\n\nconst statusLabel: Record<NonNullable<TimelineEvent['status']>, string> = {\n succeeded: 'Concluído',\n failed: 'Falhou',\n skipped: 'Ignorado',\n}\n\nconst statusTextTone: Record<NonNullable<TimelineEvent['status']>, string> = {\n succeeded: 'text-success-soft-foreground',\n failed: 'text-destructive-soft-foreground',\n skipped: 'text-muted-foreground',\n}\n\n/** Linha do tempo única, com eventos em ordem e tom semântico por evento. */\nexport function Timeline({ events, className }: { events: TimelineEvent[]; className?: string }) {\n const lib = useMotionLib()\n const on = lib !== null\n const presets = useMotionPresets()\n // Em `on` cada evento entra com slide curto e atraso escalonado (no máximo 10 itens).\n const Item: ElementType = on ? lib.m.li : 'li'\n const enter = presets.slide('bottom', 'short')\n return (\n <ol data-rendra=\"TLN-001\" className={cn('@container flex flex-col', className)}>\n {events.map((e, i) => {\n const StatusIcon = e.status ? statusIcon[e.status] : null\n const tone = e.tone ?? (e.status ? statusTone[e.status] : 'neutral')\n return (\n <Item\n key={e.id}\n className=\"relative flex gap-3 pb-6 last:pb-0\"\n {...(on\n ? { ...enter, transition: { ...enter.transition, ...presets.stagger(i) } }\n : {})}\n >\n {i < events.length - 1 && (\n <span\n aria-hidden\n className=\"absolute top-8 bottom-0 left-4 w-px -translate-x-1/2 bg-border\"\n />\n )}\n <span\n aria-hidden\n className={cn(\n 'relative flex size-8 shrink-0 items-center justify-center rounded-full [&_svg]:size-icon-sm',\n dot[tone],\n )}\n >\n {e.icon ?? (StatusIcon && <StatusIcon />) ?? (\n <span className=\"size-2 rounded-full bg-current\" />\n )}\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1 pt-1\">\n <div className=\"flex min-w-0 flex-col gap-1 @sm:flex-row @sm:items-baseline @sm:justify-between @sm:gap-3\">\n <span className=\"text-sm font-medium wrap-break-word\">{e.title}</span>\n <time className=\"shrink-0 text-xs text-muted-foreground tabular-nums\">\n {e.date}\n </time>\n </div>\n {e.description && (\n <p className=\"text-sm wrap-break-word text-muted-foreground\">{e.description}</p>\n )}\n {e.status && StatusIcon && (\n <span\n className={cn(\n 'inline-flex w-fit items-center gap-1 text-xs font-medium [&_svg]:size-icon-sm',\n statusTextTone[e.status],\n )}\n >\n <StatusIcon />\n {statusLabel[e.status]}\n </span>\n )}\n </div>\n </Item>\n )\n })}\n </ol>\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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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;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"}