@celke/kole-react 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -22
- package/README.md +370 -255
- package/dist/components/Preferencias/Preferencias.d.ts +20 -3
- package/dist/estilos.css +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +360 -337
- package/dist/index.js.map +1 -1
- package/dist/tailwind.css +82 -0
- package/dist/tokens.css +403 -321
- package/package.json +91 -83
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["ICONES","Map","mover","DISTANCIA","posicionar","_Fragment","Ctx","_Fragment","Ctx","_Fragment","Fragment","_Fragment","_Fragment","Fragment","_Fragment","_Fragment","MARGEM","posicionar","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","Imagem","_Fragment","Map$1","Fragment$1","cx","classes","ICONES$1","AppWindow","ArrowDown","ArrowDownWideNarrow","ArrowLeft","ArrowRight","ArrowUp","ArrowUpDown","ArrowUpNarrowWide","Bell","Briefcase","Building2","Calculator","Calendar","Camera","ChartColumn","ChartLine","Check","ChevronDown","ChevronLeft","ChevronRight","ChevronUp","ChevronsLeft","ChevronsRight","Circle","CircleAlert","CircleCheck","CirclePlus","CircleQuestionMark","CircleUser","CircleX","Clock","CloudUpload","Code","Copy","CreditCard","Download","Ellipsis","EllipsisVertical","Equal","ExternalLink","Eye","EyeOff","File","FilePen","FileSpreadsheet","FileText","FileType","Folder","Funnel","FunnelX","GripVertical","Heart","History","House","IdCard","Image","Inbox","Info","Key","Layers","LayoutGrid","Link","List","LoaderCircle","Lock","LogIn","LogOut","Mail","MapPin","Maximize","Menu","Minimize","MessageSquare","Minus","Moon","Package","Palette","PanelRight","Paperclip","Pause","Pencil","Phone","Play","Plus","Printer","RefreshCw","RotateCw","Save","Search","Send","Settings","Square","SquareMousePointer","Shield","ShieldCheck","ShoppingCart","SlidersHorizontal","Star","Sun","Table","Tag","Tags","Trash2","TriangleAlert","Truck","Upload","User","UserPen","UserPlus","Users","Video","Volume2","Wallet","X","ZoomIn","ZoomOut","registrarIcones","icones","DEV","avisados","avisar","msg","Icone","icone","nome","C","girar","className","CORINGAS","capacidade","padrao","c","semMascara","valor","aplicarMascara","padroes","mascara","a","b","cru","p","saida","i","coringa","MASCARAS","TIPOS_DE_CAMPO","digitos","v","repetido","d","dvMod11","resto","base","s","pesos","isCpf","dv1","dv2","isCnpj","isCpfCnpj","isEmail","isCep","isTelefone","n","isPlaca","isRenavam","isChassi","isCnh","soma","peso","desconto","isImei","isHora","m","isData","mes","dt","isDataHora","data","hora","validarTelefone","tipo","validar","TIPOS_CAMPO","ESTADOS","UF_SIGLAS","OPCOES_ESTADOS","TIPOS_PESSOA","listaPorExtenso","l","itens","UNIDADES","DEZ_A_DEZENOVE","DEZENAS","CENTENAS","ESCALAS","grupoPorExtenso","partes","u","numeroPorExtenso","num","grupos","ultimo","g","texto","comE","valorMonetarioPorExtenso","total","inteiro","centavos","de","lerCampo","caminho","o","k","obj","NUMERO","COMPACTO","formatarNumero","opcoes","saudacaoPorHora","h","agora","iniciais","normalizar","formatCpfCnpj","nomeProprio","nomeCurto","p2","parseDataBr","formatDataBr","parseHoraBr","formatHoraBr","parseDataHoraBr","formatDataHoraBr","isoParaDataBr","iso","dataBrParaIso","VERBOS","tituloDeEntidade","e","entidade","modo","nomeDeArquivo","UNIDADES_BYTES","formatBytes","bytes","extensao","tipoDeArquivo","t","ext","iconeArquivo","exibicao","decodificarJwt","token","b64","bin","expiracaoJwt","exp","jwtExpirado","margemSegundos","margemRefreshJwt","apiDefinida","url","SEVERIDADES","CORES","severidadeCor","sev","ehSeveridade","POLITICA_PADRAO","CLASSES","validarSenha","senha","politica","forcaSenha","score","re","senhasIguais","PICKLIST_VAZIO","normalizarPicklistValor","mover$1","para","moverParaAlvo","r","moverParaFonte","moverTudoParaAlvo","apenas","moverTudoParaFonte","reordenarLista","lista","item","filtrarItens","termo","semAssinatura","useNoNavegador","useSyncExternalStore","Portal","createPortal","children","portal","no","FOLGA_V","FOLGA_H","DISTANCIA$1","posicionar$2","lado","preferido","cx_","cy","Dica","alvo","useRef","timer","pos","setPos","useState","abrir","el","medido","posicao","imediato","atraso","fechar","useEffect","esc","Fragment","filhoDesabilitado","isValidElement","cor","PadroesBotaoCtx","createContext","Botao","forwardRef","severidadeProp","aparenciaProp","formatoProp","tamanhoProp","useContext","severidade","aparencia","formato","tamanho","rotulo","soIcone","botao","posicaoIcone","bloco","sombra","iconeDestacado","pressionado","carregando","onClick","dica","FOCAVEIS","abertos","pilha","Sobreposicao","painel","dispensar","eu","anterior","focoInicial","classeMascara","dispensavel","rotuloId","descricaoId","aoDispensar","primeiro","Ctx$2","ICONE_PADRAO","ProvedorConfirmacao","atual","setAtual","resolver","tituloId","useId","msgId","confirmar","useCallback","res","api","useMemo","responder","useConfirmacao","ctx","ICONE","Toast","tom","ic","aoFechar","corpo","detalhe","acoes","modelo","titulo","tempo","Ctx$1","seq","ProvedorToast","setItens","timers","remover","id","tm","agendar","ms","pausar","retomar","mostrar","duracao","mapa","posicoes","daqui","visiveis","ocultos","useToast","useToastOpcional","CLASSE_DENSIDADE","Ctx","CHAVE","ler","temaDoSistema","ProvedorPreferencias","tema","setTema","temaInicial","densidade","setDensidade","densidadeInicial","body","alternarTema","usePreferencias","ProvedorUi","prefs","usePreferenciasOpcional","useCliqueFora","ativo","handler","refs","aoClicarFora","iniciaisDe","Avatar","falhou","setFalhou","estilo","foto","MAX_MENU","Busca","raiz","campo","setTermo","aberto","setAberto","setAtivo","atalho","casam","itensMenu","menu","excedente","mudar","aoMudarTermo","navegar","aoNavegar","rota","aoTeclar","passo","aoBuscar","temMenu","mostrarPainel","ocupado","placeholder","TrilhaCtx","ProvedorTrilha","useTrilha","caminhoNoMenu","melhor","visitar","pais","secoes","SEPARADORES","Trilha","explicitos","extras","mostrarUnico","sep","separador","modoIcones","aparenciaFinal","marcaSep","desenharLink","it","conteudo","classe","pai","comIcone","DENSIDADES","CHAVE_SIDEBAR","useMedia","casa","setCasa","consulta","mq","lerExpandida","achatar","trilha","nav","ItensMenu","aoEscolher","Estrutura","idConteudo","estreito","movel","expandida","setExpandida","aside","setAside","asideTopo","setAsideTopo","subAbertos","setSubAbertos","setMenu","logoOk","setLogoOk","sidebarRef","asideRef","direitaRef","conteudoRef","rotaAtual","alternarSidebar","nova","fecharMenus","fecharAside","rotaAtiva","secao","grupoAtivo","f","emLinha","submenu","alternarGrupo","chave","chaves","achou","aoNavegou","link","on","props","renderLink","inicio","marca","fim","modeloTrilha","renderFilhos","filho","chavePai","itensBusca","itemAside","naoLidas","notificacoes","temDev","menuDesenvolvimento","densidadeAtual","alternarMenu","escolher","fn","avatar","usuario","cabecalhoUsuario","menuDensidade","buscaPadrao","busca","placeholderBusca","ambiente","sec","si","rodapeSidebar","versao","neto","complementosTopbar","aoEscolherMenuDesenvolvimento","aoEscolherNotificacao","menuUsuario","aoEscolherMenuUsuario","rodape","CabecalhoPagina","categoria","DATA_EXTENSO","DATA","HORA","BoasVindas","cargoLinha","cargo","sigla","hoje","ultimoAcesso","ICONES","Alerta","fechado","setFechado","cartao","faixa","comFechar","iconeFinal","acoesAbaixo","posicaoAcoes","botaoX","botaoFechar","mensagem","blocoAcoes","papel","midia","RevelarCamposCtx","MSG_OBRIGATORIO","useValidacaoCampo","tentativas","mexido","setMexido","revelado","setRevelado","vazio","visivel","erroFinal","erro","avisoFinal","aviso","obrigatorio","useCampoIds","gerado","idExterno","descricaoDe","Campo","inline","variante","rotuloRef","rotuloW","setRotuloW","medir","ro","CampoMarcacao","aoMudar","onChange","CampoTexto","validacao","emMoldura","prefixo","sufixo","input","maiuscula","onBlur","disabled","campoTipado","meta","extra","CampoCpf","CampoCnpj","CampoCpfCnpj","CampoCep","CampoPlaca","CampoEmail","CampoRenavam","CampoChassi","CampoCnh","CampoImei","CampoTelefone","fixo","celular","CampoData","CampoHora","CampoDataHora","BRL","CampoMoeda","CampoInteiro","ROTULO_NIVEL","CampoSenha","setVisivel","capsLock","setCapsLock","lerCaps","forca","onKeyDown","onKeyUp","revelavel","x","Dialogo","lateral","rolagem","telaCheiaAbaixo","animacao","subtitulo","Status","TAMANHO_CODIGO","TelaLogin","setUsuario","setSenha","entrando","setEntrando","setErro","tentou","setTentou","pedindoCodigo","setPedindoCodigo","codigo","setCodigo","confiar","setConfiar","erroCodigo","setErroCodigo","confirmando","setConfirmando","comConteudo","apresentacao","entrar","aoEntrar","aoConfirmarCodigo","obrig","propsUsuario","descricao","identificador","linkSenha","instrucaoCodigo","confiarDispositivo","TelaErro","tela","GrupoBotoes","orientacao","GrupoAlternancia","grupo","marcados","marcado","alternar","_m","_v","_a","BarraBotoes","distribuicao","SETA","MARGEM$1","SELETOR_ITEM","SELETOR_FOCAVEL","posicionar$1","ao","afasta","vw","vh","gap","dir","direcao","w","top","left","alinh","MenuSuspenso","ariaLabel","gatilhoProprio","gatilho","ehMenu","deslocamento","devolverFoco","ancora","referencia","grande","alinhamentoTelaGrande","alinhamento","posicionado","fechamento","teclaGatilho","teclaPainel","focaveis","prox","seta","semSeta","propsGatilho","desabilitado","dividido","botaoSeta","aoClicarPrincipal","escuro","larguraMenu","Aba","Abas","barra","abas","Children","interna","setInterna","ativa","pagina","vertical","alinha","selecionar","j","entradas","aba","ultima","temPainel","conteudoTab","en","escolhida","paineis","iconeAcima","posicaoBarra","aoVoltar","identidade","cabecalho","Card","recolhido","setRecolhido","recolhidoInicial","cheio","setCheio","corpoId","antes","interativo","aoClicar","comFerramentas","recolhivel","telaCheia","ferramentas","fundo","posicaoMidia","horizontal","corpoSemEspaco","borda","detalhes","GrupoCards","Recolhivel","prefereMenosMovimento","Carrossel","slides","pausadoUsuario","setPausadoUsuario","pausadoHover","setPausadoHover","inicioArraste","ir","proximo","rodando","automatico","intervalo","transicao","arrastar","proporcao","x0","dx","controles","indicadores","localizar","colunas","mover","novas","QuadroArrastavel","arraste","setArraste","pego","setPego","anuncio","setAnuncio","refsColunas","nomeColuna","aoPressionar","aoMoverPonteiro","y","menor","col","fora","min","max","dist","indice","arrastando","mover_","soltar","useLayoutEffect","alca","nomeItem","final","fantasma","renderItem","AcordeaoCtx","Acordeao","controlado","interno","setInterno","padraoAbertos","novos","multiplo","separado","ItemAcordeao","AcaoLinha","OPOSTO","DISTANCIA","MARGEM","cabe","posicionar","Balao","balao","passar","abrirLogo","fecharDepois","cloneElement","largura","FormCtx","Form","tituloProp","formId","leitura","setTentativas","aoSubmeter","salvando","aoSalvar","pendencias","acoesPadrao","aoCancelar","rotuloSalvar","arranjo","comMenu","temAcoes","menuTitulo","menuAtivo","aoEscolherMenu","FormSecao","grade","legenda","CampoTextarea","comContador","contador","maxLength","pct","usePosicaoFlutuante","abaixo","acima","alturaEstimada","espaco","SelectInterno","listaId","moldura","estaSel","selecionados","comBusca","rotuloSelecao","idx","ariaComum","botaoLimpar","limpar","sel","CampoSelect","temValor","CampoSelectMultiplo","opcoesUf","CampoUf","CampoUfMultiplo","CampoTipoPessoa","Escolha","idxSel","idxFoco","fmt","Avaliacao","sob","setSob","setOcupado","exibido","bloqueado","somenteLeitura","notaNoPonteiro","aoPassar","estrelas","preenchido","mensagens","textoOcupado","limpavel","Chip","aoRemover","focavel","Filtros","aoConsultar","consultando","alterado","aoLimpar","aplicados","Picklist","valorBruto","setSel","foco","setFoco","arrastado","paraRotulo","transferir","destino","rotuloAlvo","rotuloFonte","marcar","aditivo","reordenarItem","focar","reordenar","antesDe","coluna","filtro","alturaLista","dragdrop","marcadosFonte","marcadosAlvo","BUSCA_ATRASO_MS","useBuscaAssincrona","resultados","setResultados","setCarregando","buscarRef","buscar","estavaAtivo","primeira","minimo","minha","CampoBusca","editando","setEditando","paraDetalhe","vazioTexto","CampoCidade","setLista","ufAnterior","uf","buscarPorUf","vivo","listaPaginas","Paginacao","totalPaginas","ini","aoMudarPagina","embutida","aoMudarTamanho","tamanhoOpcoes","Skeleton","altura","Vazio","valorDoCampo","CaixaSelecao","ref","indeterminado","LARGURAS","Tabela","registros","todos","alguns","selecao","aoMudarSelecao","alternarTodos","aoClicarLinha","linha","iconeOrdem","ordenacao","paginacao","aoRecarregar","atualizando","aoOrdenar","cel","vazioIcone","vazioTitulo","vazioDescricao","vazioAcoes","Lista","numerada","ItemLista","esquerda","marcacao","aoMarcar","href","solido","ListaCards","larguraMin","alturaCard","card","NUM","PCT","Indicador","subiu","variacao","boa","variacaoBoa","Indicadores","Detalhes","disposicao","Badge","ComBadge","ponto","Placa","numero","Citacao","autor","fonte","Imagem","responsiva","cantos","miniatura","style","Figura","alinhamentoLegenda","BotaoFechar","Carregando","bloqueante","logo","ESCALA","Girador","mostrarRotulo","PADRAO","Progresso","formatar","classeBarra","animado","entrada","trilhaColorida","mostrarValor","etiqueta","segmentos","marcos","marcador","LIMIAR","Conversa","noFim","longe","setLonge","filhos","semMensagens","quantas","novaDoUsuario","irParaFim","ls","aoRolar","larguraMaxima","rotuloIrParaFim","formatarHora","Mensagem","toast","copiado","setCopiado","gerando","estado","comErro","copiar","textoCopia","blocoAvatar","comAcoes","copiavel","dataHora","rotuloGerando","rotuloEnviando","aoTentarNovamente","rotuloTentarNovamente","rotuloCopiar","AVISO_CONTADOR","CampoMensagem","podeEnviar","maxCaracteres","ajustarAltura","cs","linhasMaximas","enviar","aoEnviar","acoesExtras","rotuloParar","aoParar","rotuloEnviar","rotuloPadrao","Trecho","cortado","setCortado","menos","mais","Referencias","abertoInicial","rotuloMostrarMais","rotuloMostrarMenos","NIVEIS","VisualizadorArquivo","arquivo","Conteudo","falhar","aoFalhar","Imagem$1","nivel","setNivel","giro","setGiro","pan","setPan","palco","arrasto","zoom","limitar","mx","my","mudarNivel","novo","ajustar","CONTROLES","DialogoArquivo","arquivos","aoMudarIndice","chaveDe","CampoAnexo","urls","sobre","setSobre","recusados","setRecusados","visualizando","setVisualizando","useImperativeHandle","adicionar","aceitos","grandes","maxTamanho","multiple","existentes","aoSoltar","faltam","AVATAR","normalizarFotos","Foto","indiceExterno","fotos","indiceInterno","setIndiceInterno","semFoto","sobreposto","exibida","ampliavel","aoAmpliar"],"sources":["../src/utils/cx.ts","../src/utils/Icone.tsx","../src/utils/mascara.ts","../src/utils/validadores.ts","../src/utils/tiposCampo.ts","../src/utils/constantes.ts","../src/utils/texto.ts","../src/utils/datas.ts","../src/utils/entidade.ts","../src/utils/anexos.ts","../src/utils/jwt.ts","../src/utils/severidade.ts","../src/utils/senha.ts","../src/utils/picklist.ts","../src/utils/portal.tsx","../src/components/Dica/Dica.tsx","../src/components/Botao/Botao.tsx","../src/components/Dialogo/Sobreposicao.tsx","../src/components/Confirmacao/Confirmacao.tsx","../src/components/Toast/Toast.tsx","../src/components/Preferencias/Preferencias.tsx","../src/utils/useCliqueFora.ts","../src/components/Avatar/Avatar.tsx","../src/components/Busca/Busca.tsx","../src/components/Trilha/Trilha.tsx","../src/components/Estrutura/Estrutura.tsx","../src/components/CabecalhoPagina/CabecalhoPagina.tsx","../src/components/BoasVindas/BoasVindas.tsx","../src/components/Alerta/Alerta.tsx","../src/components/Campo/Campo.tsx","../src/components/CampoMarcacao/CampoMarcacao.tsx","../src/components/CampoTexto/CampoTexto.tsx","../src/components/CampoSenha/CampoSenha.tsx","../src/components/Dialogo/Dialogo.tsx","../src/components/Status/Status.tsx","../src/components/TelaLogin/TelaLogin.tsx","../src/components/TelaErro/TelaErro.tsx","../src/components/GrupoBotoes/GrupoBotoes.tsx","../src/components/MenuSuspenso/MenuSuspenso.tsx","../src/components/Abas/Abas.tsx","../src/components/Card/Card.tsx","../src/components/Recolhivel/Recolhivel.tsx","../src/components/Carrossel/Carrossel.tsx","../src/components/QuadroArrastavel/QuadroArrastavel.tsx","../src/components/Acordeao/Acordeao.tsx","../src/components/AcaoLinha/AcaoLinha.tsx","../src/components/Balao/Balao.tsx","../src/components/Form/Form.tsx","../src/components/CampoTextarea/CampoTextarea.tsx","../src/utils/usePosicaoFlutuante.ts","../src/components/CampoSelect/CampoSelect.tsx","../src/components/CampoDominio/CampoDominio.tsx","../src/components/Escolha/Escolha.tsx","../src/components/Avaliacao/Avaliacao.tsx","../src/components/Chip/Chip.tsx","../src/components/Filtros/Filtros.tsx","../src/components/Picklist/Picklist.tsx","../src/utils/useBuscaAssincrona.ts","../src/components/CampoBusca/CampoBusca.tsx","../src/components/CampoBusca/CampoCidade.tsx","../src/components/Paginacao/Paginacao.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Vazio/Vazio.tsx","../src/components/Tabela/Tabela.tsx","../src/components/Lista/Lista.tsx","../src/components/ListaCards/ListaCards.tsx","../src/components/Indicador/Indicador.tsx","../src/components/Detalhes/Detalhes.tsx","../src/components/Badge/Badge.tsx","../src/components/Placa/Placa.tsx","../src/components/Citacao/Citacao.tsx","../src/components/Imagem/Imagem.tsx","../src/components/BotaoFechar/BotaoFechar.tsx","../src/components/Carregando/Carregando.tsx","../src/components/Girador/Girador.tsx","../src/components/Progresso/Progresso.tsx","../src/components/Conversa/Conversa.tsx","../src/components/Mensagem/Mensagem.tsx","../src/components/CampoMensagem/CampoMensagem.tsx","../src/components/Referencias/Referencias.tsx","../src/components/Arquivo/VisualizadorArquivo.tsx","../src/components/Arquivo/DialogoArquivo.tsx","../src/components/Arquivo/CampoAnexo.tsx","../src/components/Arquivo/Foto.tsx"],"sourcesContent":["/** Junta classes CSS ignorando valores falsos. */\nexport function cx(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(' ');\n}\n","import type { ReactNode } from 'react';\nimport {\n AppWindow,\n ArrowDown,\n ArrowDownWideNarrow,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowUpDown,\n ArrowUpNarrowWide,\n Bell,\n Briefcase,\n Building2,\n Calculator,\n Calendar,\n Camera,\n ChartColumn,\n ChartLine,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronUp,\n ChevronsLeft,\n ChevronsRight,\n Circle,\n CircleAlert,\n CircleCheck,\n CirclePlus,\n CircleQuestionMark,\n CircleUser,\n CircleX,\n Clock,\n CloudUpload,\n Code,\n Copy,\n CreditCard,\n Download,\n Ellipsis,\n EllipsisVertical,\n Equal,\n ExternalLink,\n Eye,\n EyeOff,\n File,\n FilePen,\n FileSpreadsheet,\n FileText,\n FileType,\n Folder,\n Funnel,\n FunnelX,\n GripVertical,\n Heart,\n History,\n House,\n IdCard,\n Image,\n Inbox,\n Info,\n Key,\n Layers,\n LayoutGrid,\n Link,\n List,\n LoaderCircle,\n Lock,\n LogIn,\n LogOut,\n Mail,\n Map,\n MapPin,\n Maximize,\n Menu,\n Minimize,\n MessageSquare,\n Minus,\n Moon,\n Package,\n Palette,\n PanelRight,\n Paperclip,\n Pause,\n Pencil,\n Phone,\n Play,\n Plus,\n Printer,\n RefreshCw,\n RotateCw,\n Save,\n Search,\n Send,\n Settings,\n Square,\n SquareMousePointer,\n Shield,\n ShieldCheck,\n ShoppingCart,\n SlidersHorizontal,\n Star,\n Sun,\n Table,\n Tag,\n Tags,\n Trash2,\n TriangleAlert,\n Truck,\n Upload,\n User,\n UserPen,\n UserPlus,\n Users,\n Video,\n Volume2,\n Wallet,\n X,\n ZoomIn,\n ZoomOut,\n type LucideIcon,\n} from 'lucide-react';\nimport { cx } from './cx';\n\n/**\n * Ícones registrados, pelo nome do Lucide (https://lucide.dev/icons).\n * Só estes entram no pacote; o app registra outros com `registrarIcones`\n * ou passa o componente direto: `icone={<Rocket />}`.\n */\nconst ICONES: Record<string, LucideIcon> = {\n 'app-window': AppWindow,\n 'arrow-down': ArrowDown,\n 'arrow-down-wide-narrow': ArrowDownWideNarrow,\n 'arrow-left': ArrowLeft,\n 'arrow-right': ArrowRight,\n 'arrow-up': ArrowUp,\n 'arrow-up-down': ArrowUpDown,\n 'arrow-up-narrow-wide': ArrowUpNarrowWide,\n bell: Bell,\n briefcase: Briefcase,\n 'building-2': Building2,\n calculator: Calculator,\n calendar: Calendar,\n camera: Camera,\n 'chart-column': ChartColumn,\n 'chart-line': ChartLine,\n check: Check,\n 'chevron-down': ChevronDown,\n 'chevron-left': ChevronLeft,\n 'chevron-right': ChevronRight,\n 'chevron-up': ChevronUp,\n 'chevrons-left': ChevronsLeft,\n 'chevrons-right': ChevronsRight,\n circle: Circle,\n 'circle-alert': CircleAlert,\n 'circle-check': CircleCheck,\n 'circle-plus': CirclePlus,\n 'circle-question-mark': CircleQuestionMark,\n 'circle-user': CircleUser,\n 'circle-x': CircleX,\n clock: Clock,\n 'cloud-upload': CloudUpload,\n code: Code,\n copy: Copy,\n 'credit-card': CreditCard,\n download: Download,\n ellipsis: Ellipsis,\n 'ellipsis-vertical': EllipsisVertical,\n equal: Equal,\n 'external-link': ExternalLink,\n eye: Eye,\n 'eye-off': EyeOff,\n file: File,\n 'file-pen': FilePen,\n 'file-spreadsheet': FileSpreadsheet,\n 'file-text': FileText,\n 'file-type': FileType,\n folder: Folder,\n funnel: Funnel,\n 'funnel-x': FunnelX,\n 'grip-vertical': GripVertical,\n heart: Heart,\n history: History,\n house: House,\n 'id-card': IdCard,\n image: Image,\n inbox: Inbox,\n info: Info,\n key: Key,\n layers: Layers,\n 'layout-grid': LayoutGrid,\n link: Link,\n list: List,\n 'loader-circle': LoaderCircle,\n lock: Lock,\n 'log-in': LogIn,\n 'log-out': LogOut,\n mail: Mail,\n map: Map,\n 'map-pin': MapPin,\n maximize: Maximize,\n menu: Menu,\n minimize: Minimize,\n 'message-square': MessageSquare,\n minus: Minus,\n moon: Moon,\n package: Package,\n palette: Palette,\n 'panel-right': PanelRight,\n paperclip: Paperclip,\n pause: Pause,\n pencil: Pencil,\n phone: Phone,\n play: Play,\n plus: Plus,\n printer: Printer,\n 'refresh-cw': RefreshCw,\n 'rotate-cw': RotateCw,\n save: Save,\n search: Search,\n send: Send,\n settings: Settings,\n square: Square,\n 'square-mouse-pointer': SquareMousePointer,\n shield: Shield,\n 'shield-check': ShieldCheck,\n 'shopping-cart': ShoppingCart,\n 'sliders-horizontal': SlidersHorizontal,\n star: Star,\n sun: Sun,\n table: Table,\n tag: Tag,\n tags: Tags,\n 'trash-2': Trash2,\n 'triangle-alert': TriangleAlert,\n truck: Truck,\n upload: Upload,\n user: User,\n 'user-pen': UserPen,\n 'user-plus': UserPlus,\n users: Users,\n video: Video,\n 'volume-2': Volume2,\n wallet: Wallet,\n x: X,\n 'zoom-in': ZoomIn,\n 'zoom-out': ZoomOut,\n};\n\n/** Nome de ícone registrado (ou qualquer outro, depois de `registrarIcones`). */\nexport type NomeIcone = keyof typeof ICONES | (string & {});\n\n/** Ícone aceito pelos componentes: nome do Lucide (`'save'`) ou um nó React (`<Rocket />`). */\nexport type IconeProp = NomeIcone | ReactNode;\n\n/** Acrescenta ícones ao registro: `registrarIcones({ rocket: Rocket })`. */\nexport function registrarIcones(icones: Record<string, LucideIcon>) {\n Object.assign(ICONES, icones);\n}\n\n// o bundler do APP substitui `process.env.NODE_ENV` (padrão das bibliotecas);\n// sem bundler, `process` não existe e os avisos ficam desligados\ndeclare const process: { env: { NODE_ENV?: string } };\nlet DEV = false;\ntry {\n DEV = process.env.NODE_ENV !== 'production';\n} catch {\n DEV = false;\n}\n\nconst avisados = new Set<string>();\nfunction avisar(msg: string) {\n if (avisados.has(msg) || !DEV) return;\n avisados.add(msg);\n console.warn(`[@celke/kole-react] ${msg}`);\n}\n\nexport interface IconeProps {\n icone?: IconeProp;\n className?: string;\n /** Gira continuamente (indicador de carregamento). */\n girar?: boolean;\n}\n\nexport function Icone({ icone, className, girar }: IconeProps) {\n if (icone === undefined || icone === null || icone === false || icone === '') return null;\n if (typeof icone === 'string') {\n const nome = icone.trim();\n const C = ICONES[nome];\n if (!C) {\n avisar(`Ícone \"${nome}\" não registrado. Use registrarIcones({ '${nome}': Componente }) ou passe o componente do lucide-react.`);\n return null;\n }\n return <C className={cx('lp-ic', girar && 'lp-ic--girar', className)} size=\"1em\" strokeWidth={2} aria-hidden=\"true\" focusable=\"false\" />;\n }\n return (\n <span className={cx('lp-icone', girar && 'lp-ic--girar', className)} aria-hidden=\"true\">\n {icone}\n </span>\n );\n}\n","/**\n * Máscara de digitação simples, sem dependências.\n *\n * Coringas do padrão: `0` dígito · `A` letra · `S` letra ou dígito · `*` qualquer.\n * Qualquer outro caractere é literal e entra sozinho.\n * Vários padrões (array) = o primeiro que comporta o texto digitado vence\n * (ex.: telefone fixo × celular).\n */\nexport type Mascara = string | string[];\n\nconst CORINGAS: Record<string, RegExp> = {\n '0': /\\d/,\n A: /[a-zA-Z]/,\n S: /[a-zA-Z0-9]/,\n '*': /./,\n};\n\nfunction capacidade(padrao: string): number {\n return [...padrao].filter((c) => c in CORINGAS).length;\n}\n\n/** Remove os literais da máscara, deixando só o que o usuário digitou. */\nexport function semMascara(valor: string): string {\n return valor.replace(/[^a-zA-Z0-9]/g, '');\n}\n\nexport function aplicarMascara(valor: string, mascara: Mascara): string {\n const padroes = (Array.isArray(mascara) ? mascara : [mascara])\n .slice()\n .sort((a, b) => capacidade(a) - capacidade(b));\n const cru = semMascara(valor);\n const padrao = padroes.find((p) => capacidade(p) >= cru.length) ?? padroes[padroes.length - 1];\n\n let saida = '';\n let i = 0;\n for (const c of padrao) {\n if (i >= cru.length) break;\n const coringa = CORINGAS[c];\n if (coringa) {\n // descarta o que não casa com o coringa até achar um caractere válido\n while (i < cru.length && !coringa.test(cru[i])) i++;\n if (i >= cru.length) break;\n saida += cru[i++];\n } else {\n saida += c;\n }\n }\n return saida;\n}\n\nexport const MASCARAS = {\n cpf: '000.000.000-00',\n cnpj: '00.000.000/0000-00',\n cep: '00000-000',\n telefone: ['(00) 0000-0000', '(00) 00000-0000'],\n placa: 'AAA0S00',\n} as const;\n","/**\n * Validadores de dados brasileiros: predicados `is*` + o despachante `validar()`.\n * Lógica pura, sem React. A máscara de cada tipo mora em `tiposCampo.ts`.\n */\n\nexport const TIPOS_DE_CAMPO = [\n 'cpf',\n 'cnpj',\n 'cpfCnpj',\n 'email',\n 'cep',\n 'telefone',\n 'placa',\n 'renavam',\n 'chassi',\n 'cnh',\n 'imei',\n 'hora',\n 'data',\n 'dataHora',\n] as const;\n\nexport type TipoDeCampo = (typeof TIPOS_DE_CAMPO)[number];\n\nconst digitos = (v: string) => (v ?? '').replace(/\\D/g, '');\nconst repetido = (d: string) => /^(\\d)\\1*$/.test(d);\n\n/** Dígito verificador mod-11 (CPF/CNPJ): pesos aplicados da esquerda para a direita. */\nfunction dvMod11(base: string, pesos: number[]): number {\n const soma = [...base].reduce((s, c, i) => s + Number(c) * pesos[i], 0);\n const resto = soma % 11;\n return resto < 2 ? 0 : 11 - resto;\n}\n\n/** CPF com os dois dígitos verificadores; rejeita sequências repetidas. */\nexport function isCpf(v: string): boolean {\n const d = digitos(v);\n if (d.length !== 11 || repetido(d)) return false;\n const dv1 = dvMod11(d.slice(0, 9), [10, 9, 8, 7, 6, 5, 4, 3, 2]);\n const dv2 = dvMod11(d.slice(0, 10), [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]);\n return dv1 === Number(d[9]) && dv2 === Number(d[10]);\n}\n\n/** CNPJ com os dois dígitos verificadores; rejeita sequências repetidas. */\nexport function isCnpj(v: string): boolean {\n const d = digitos(v);\n if (d.length !== 14 || repetido(d)) return false;\n const dv1 = dvMod11(d.slice(0, 12), [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);\n const dv2 = dvMod11(d.slice(0, 13), [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);\n return dv1 === Number(d[12]) && dv2 === Number(d[13]);\n}\n\n/** Mais de 11 dígitos = CNPJ; senão, CPF. */\nexport function isCpfCnpj(v: string): boolean {\n return digitos(v).length > 11 ? isCnpj(v) : isCpf(v);\n}\n\nexport function isEmail(v: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test((v ?? '').trim());\n}\n\nexport function isCep(v: string): boolean {\n return digitos(v).length === 8;\n}\n\n/** Fixo (10 dígitos) ou celular (11), sempre com DDD. */\nexport function isTelefone(v: string): boolean {\n const n = digitos(v).length;\n return n === 10 || n === 11;\n}\n\n/** Placa antiga `AAA0000` ou Mercosul `AAA0A00` (aceita hífen). */\nexport function isPlaca(v: string): boolean {\n const p = (v ?? '').replace(/[^a-zA-Z0-9]/g, '').toUpperCase();\n return /^[A-Z]{3}\\d[A-Z0-9]\\d{2}$/.test(p);\n}\n\n/** RENAVAM: por enquanto só o tamanho (9 a 11 dígitos); o dígito verificador fica para depois. */\nexport function isRenavam(v: string): boolean {\n const n = digitos(v).length;\n return n >= 9 && n <= 11 && n === (v ?? '').replace(/\\s/g, '').length;\n}\n\n/** Chassi (VIN): 17 caracteres alfanuméricos, sem I, O e Q. */\nexport function isChassi(v: string): boolean {\n return /^[A-HJ-NPR-Z0-9]{17}$/.test((v ?? '').trim().toUpperCase());\n}\n\n/** CNH: 9 dígitos + 2 verificadores (algoritmo do DENATRAN). */\nexport function isCnh(v: string): boolean {\n const d = digitos(v);\n if (d.length !== 11 || repetido(d)) return false;\n let soma = 0;\n for (let i = 0, peso = 9; i < 9; i++, peso--) soma += Number(d[i]) * peso;\n let dv1 = soma % 11;\n let desconto = 0;\n if (dv1 >= 10) {\n dv1 = 0;\n desconto = 2;\n }\n soma = 0;\n for (let i = 0, peso = 1; i < 9; i++, peso++) soma += Number(d[i]) * peso;\n const resto = soma % 11;\n let dv2 = resto >= 10 ? 0 : resto - desconto;\n if (dv2 < 0) dv2 += 11;\n if (dv2 >= 10) dv2 = 0;\n return dv1 === Number(d[9]) && dv2 === Number(d[10]);\n}\n\n/** IMEI: 15 dígitos validados por Luhn; rejeita sequências repetidas. */\nexport function isImei(v: string): boolean {\n const d = digitos(v);\n if (d.length !== 15 || repetido(d)) return false;\n let soma = 0;\n for (let i = 0; i < 15; i++) {\n let n = Number(d[i]);\n if (i % 2 === 1) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n soma += n;\n }\n return soma % 10 === 0;\n}\n\n/** `HH:mm` entre 00:00 e 23:59. */\nexport function isHora(v: string): boolean {\n const m = /^(\\d{2}):(\\d{2})$/.exec((v ?? '').trim());\n return !!m && Number(m[1]) <= 23 && Number(m[2]) <= 59;\n}\n\n/** `dd/mm/aaaa` existente no calendário (31/02 é recusado). */\nexport function isData(v: string): boolean {\n const m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/.exec((v ?? '').trim());\n if (!m) return false;\n const [d, mes, a] = [Number(m[1]), Number(m[2]), Number(m[3])];\n const dt = new Date(a, mes - 1, d);\n return dt.getFullYear() === a && dt.getMonth() === mes - 1 && dt.getDate() === d;\n}\n\n/** `dd/mm/aaaa HH:mm`. */\nexport function isDataHora(v: string): boolean {\n const [data, hora, ...resto] = (v ?? '').trim().split(/\\s+/);\n return !resto.length && isData(data ?? '') && isHora(hora ?? '');\n}\n\n/**\n * Telefone, opcionalmente restrito a um formato. Vazio é válido\n * (obrigatoriedade é assunto do campo, não do validador).\n */\nexport function validarTelefone(v: string, tipo?: 'fixo' | 'celular'): string {\n const n = digitos(v).length;\n if (!n) return '';\n if (tipo === 'fixo') return n === 10 ? '' : 'Deve ser um telefone fixo com DDD';\n if (tipo === 'celular') return n === 11 ? '' : 'Deve ser um celular com DDD';\n return n === 10 || n === 11 ? '' : 'Telefone incompleto';\n}\n\n/**\n * Mensagem de validação do tipo, ou `''` quando vazio ou válido.\n * Separa \"incompleto\" (ainda digitando) de \"inválido\" (errado).\n */\nexport function validar(tipo: TipoDeCampo, valor: string): string {\n const v = (valor ?? '').trim();\n if (!v) return '';\n const n = digitos(v).length;\n switch (tipo) {\n case 'cpf':\n return n < 11 ? 'CPF incompleto' : isCpf(v) ? '' : 'CPF inválido';\n case 'cnpj':\n return n < 14 ? 'CNPJ incompleto' : isCnpj(v) ? '' : 'CNPJ inválido';\n case 'cpfCnpj':\n if (n < 11) return 'CPF/CNPJ incompleto';\n if (n === 11) return isCpf(v) ? '' : 'CPF inválido';\n if (n < 14) return 'CNPJ incompleto';\n return isCnpj(v) ? '' : 'CNPJ inválido';\n case 'email':\n return isEmail(v) ? '' : 'E-mail inválido';\n case 'cep':\n return isCep(v) ? '' : 'CEP incompleto';\n case 'telefone':\n return validarTelefone(v);\n case 'placa':\n return isPlaca(v) ? '' : 'Placa inválida';\n case 'renavam':\n return isRenavam(v) ? '' : 'RENAVAM deve ter de 9 a 11 dígitos';\n case 'chassi':\n return v.replace(/\\s/g, '').length < 17 ? 'Chassi incompleto' : isChassi(v) ? '' : 'Chassi inválido';\n case 'cnh':\n return n < 11 ? 'CNH incompleta' : isCnh(v) ? '' : 'CNH inválida';\n case 'imei':\n return n < 15 ? 'IMEI incompleto' : isImei(v) ? '' : 'IMEI inválido';\n case 'hora':\n return isHora(v) ? '' : 'Hora inválida';\n case 'data':\n return isData(v) ? '' : 'Data inválida';\n case 'dataHora':\n return isDataHora(v) ? '' : 'Data e hora inválidas';\n }\n}\n","import { MASCARAS, type Mascara } from './mascara';\nimport { validar, type TipoDeCampo } from './validadores';\n\n/** Descritor de um tipo de campo: máscara, placeholder, validação e caixa alta. */\nexport interface MetaTipoCampo {\n mascara?: Mascara;\n placeholder?: string;\n validar: (valor: string) => string;\n /** `true` = sempre maiúscula (placa) · `false` = nunca (e-mail). */\n caixaAlta?: boolean;\n}\n\n/** Fonte única de máscara/placeholder/validação de cada tipo de campo. */\nexport const TIPOS_CAMPO: Record<TipoDeCampo, MetaTipoCampo> = {\n cpf: { mascara: MASCARAS.cpf, placeholder: '000.000.000-00', validar: (v) => validar('cpf', v) },\n cnpj: { mascara: MASCARAS.cnpj, placeholder: '00.000.000/0000-00', validar: (v) => validar('cnpj', v) },\n cpfCnpj: { mascara: [MASCARAS.cpf, MASCARAS.cnpj], placeholder: 'CPF ou CNPJ', validar: (v) => validar('cpfCnpj', v) },\n email: { placeholder: 'nome@exemplo.com', validar: (v) => validar('email', v), caixaAlta: false },\n cep: { mascara: MASCARAS.cep, placeholder: '00000-000', validar: (v) => validar('cep', v) },\n telefone: { mascara: [...MASCARAS.telefone], placeholder: '(00) 00000-0000', validar: (v) => validar('telefone', v) },\n placa: { mascara: MASCARAS.placa, placeholder: 'ABC0A00', validar: (v) => validar('placa', v), caixaAlta: true },\n renavam: { mascara: '00000000000', placeholder: '00000000000', validar: (v) => validar('renavam', v) },\n chassi: { mascara: 'SSSSSSSSSSSSSSSSS', placeholder: 'Código de 17 caracteres', validar: (v) => validar('chassi', v), caixaAlta: true },\n cnh: { mascara: '00000000000', placeholder: '00000000000', validar: (v) => validar('cnh', v) },\n imei: { mascara: '000000000000000', placeholder: '000000000000000', validar: (v) => validar('imei', v) },\n hora: { mascara: '00:00', placeholder: 'HH:mm', validar: (v) => validar('hora', v) },\n data: { mascara: '00/00/0000', placeholder: 'dd/mm/aaaa', validar: (v) => validar('data', v) },\n dataHora: { mascara: '00/00/0000 00:00', placeholder: 'dd/mm/aaaa HH:mm', validar: (v) => validar('dataHora', v) },\n};\n","import type { Opcao } from './tipos';\n\n/** Unidade federativa: sigla + nome. */\nexport interface Uf {\n uf: string;\n descricao: string;\n}\n\n/** Os 26 estados + o Distrito Federal, em ordem alfabética da sigla. */\nexport const ESTADOS: readonly Uf[] = [\n { uf: 'AC', descricao: 'Acre' },\n { uf: 'AL', descricao: 'Alagoas' },\n { uf: 'AM', descricao: 'Amazonas' },\n { uf: 'AP', descricao: 'Amapá' },\n { uf: 'BA', descricao: 'Bahia' },\n { uf: 'CE', descricao: 'Ceará' },\n { uf: 'DF', descricao: 'Distrito Federal' },\n { uf: 'ES', descricao: 'Espírito Santo' },\n { uf: 'GO', descricao: 'Goiás' },\n { uf: 'MA', descricao: 'Maranhão' },\n { uf: 'MG', descricao: 'Minas Gerais' },\n { uf: 'MS', descricao: 'Mato Grosso do Sul' },\n { uf: 'MT', descricao: 'Mato Grosso' },\n { uf: 'PA', descricao: 'Pará' },\n { uf: 'PB', descricao: 'Paraíba' },\n { uf: 'PE', descricao: 'Pernambuco' },\n { uf: 'PI', descricao: 'Piauí' },\n { uf: 'PR', descricao: 'Paraná' },\n { uf: 'RJ', descricao: 'Rio de Janeiro' },\n { uf: 'RN', descricao: 'Rio Grande do Norte' },\n { uf: 'RO', descricao: 'Rondônia' },\n { uf: 'RR', descricao: 'Roraima' },\n { uf: 'RS', descricao: 'Rio Grande do Sul' },\n { uf: 'SC', descricao: 'Santa Catarina' },\n { uf: 'SE', descricao: 'Sergipe' },\n { uf: 'SP', descricao: 'São Paulo' },\n { uf: 'TO', descricao: 'Tocantins' },\n];\n\n/** Só as siglas, derivadas de `ESTADOS`. */\nexport const UF_SIGLAS: readonly string[] = ESTADOS.map((e) => e.uf);\n\n/** Opções prontas para select: valor = sigla, rótulo = \"PR — Paraná\". */\nexport const OPCOES_ESTADOS: readonly Opcao[] = ESTADOS.map((e) => ({ valor: e.uf, rotulo: `${e.uf} — ${e.descricao}` }));\n\n/** Tipo de pessoa no formato rótulo/valor. `F`/`J` é a convenção comum dos backends. */\nexport const TIPOS_PESSOA: readonly Opcao<'F' | 'J'>[] = [\n { rotulo: 'Física', valor: 'F' },\n { rotulo: 'Jurídica', valor: 'J' },\n];\n","/**\n * Texto e número: listas e valores por extenso (documentos), leitura de\n * caminho, formatação, saudação, iniciais, normalização para busca.\n */\n\n/** `['A']` → `A` · `['A','B']` → `A e B` · `['A','B','C']` → `A, B e C`. */\nexport function listaPorExtenso(itens: readonly string[]): string {\n const l = itens.map((i) => i.trim()).filter(Boolean);\n if (l.length <= 1) return l[0] ?? '';\n return `${l.slice(0, -1).join(', ')} e ${l[l.length - 1]}`;\n}\n\nconst UNIDADES = ['', 'um', 'dois', 'três', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove'];\nconst DEZ_A_DEZENOVE = ['dez', 'onze', 'doze', 'treze', 'quatorze', 'quinze', 'dezesseis', 'dezessete', 'dezoito', 'dezenove'];\nconst DEZENAS = ['', '', 'vinte', 'trinta', 'quarenta', 'cinquenta', 'sessenta', 'setenta', 'oitenta', 'noventa'];\nconst CENTENAS = ['', 'cento', 'duzentos', 'trezentos', 'quatrocentos', 'quinhentos', 'seiscentos', 'setecentos', 'oitocentos', 'novecentos'];\nconst ESCALAS: [string, string][] = [\n ['', ''],\n ['mil', 'mil'],\n ['milhão', 'milhões'],\n ['bilhão', 'bilhões'],\n ['trilhão', 'trilhões'],\n];\n\n/** 1 a 999 por extenso. */\nfunction grupoPorExtenso(n: number): string {\n if (n === 100) return 'cem';\n const c = Math.floor(n / 100);\n const resto = n % 100;\n const partes: string[] = [];\n if (c) partes.push(CENTENAS[c]);\n if (resto >= 10 && resto < 20) partes.push(DEZ_A_DEZENOVE[resto - 10]);\n else {\n const d = Math.floor(resto / 10);\n const u = resto % 10;\n if (d) partes.push(DEZENAS[d]);\n if (u) partes.push(UNIDADES[u]);\n }\n return partes.join(' e ');\n}\n\n/** Inteiro por extenso (trunca decimais): `1500` → `mil e quinhentos`. */\nexport function numeroPorExtenso(num: number): string {\n let n = Math.trunc(num);\n if (n === 0) return 'zero';\n if (n < 0) return `menos ${numeroPorExtenso(-n)}`;\n\n const grupos: number[] = [];\n while (n > 0) {\n grupos.push(n % 1000);\n n = Math.floor(n / 1000);\n }\n // o \"e\" entra antes do último grupo quando ele é < 100 ou centena redonda\n const ultimo = grupos.findIndex((g) => g > 0);\n const partes: string[] = [];\n for (let i = grupos.length - 1; i >= 0; i--) {\n const g = grupos[i];\n if (!g) continue;\n let texto = grupoPorExtenso(g);\n // \"mil\", não \"um mil\"; \"um milhão\" / \"dois milhões\"\n if (i === 1) texto = g === 1 ? 'mil' : `${texto} mil`;\n else if (i > 1) texto = `${texto} ${g === 1 ? ESCALAS[i][0] : ESCALAS[i][1]}`;\n const comE = partes.length > 0 && i === ultimo && (g < 100 || g % 100 === 0);\n partes.push(comE ? `e ${texto}` : texto);\n }\n return partes.join(' ');\n}\n\n/** Valor em reais por extenso: `1500.5` → `mil e quinhentos reais e cinquenta centavos`. */\nexport function valorMonetarioPorExtenso(valor: number): string {\n const total = Math.round(Math.abs(valor) * 100);\n const inteiro = Math.floor(total / 100);\n const centavos = total % 100;\n if (!inteiro && !centavos) return 'zero reais';\n\n const partes: string[] = [];\n if (inteiro) {\n // \"dois milhões de reais\", mas \"quinhentos mil reais\"\n const de = inteiro >= 1_000_000 && inteiro % 1_000_000 === 0 ? ' de' : '';\n partes.push(`${numeroPorExtenso(inteiro)}${de} ${inteiro === 1 ? 'real' : 'reais'}`);\n }\n if (centavos) partes.push(`${numeroPorExtenso(centavos)} ${centavos === 1 ? 'centavo' : 'centavos'}`);\n const texto = partes.join(' e ');\n return valor < 0 ? `menos ${texto}` : texto;\n}\n\n/** Lê um caminho com ponto (`a.b.c`); `undefined` se algum trecho faltar. */\nexport function lerCampo(obj: unknown, caminho: string): unknown {\n if (!caminho) return obj;\n return caminho\n .split('.')\n .reduce<unknown>((o, k) => (o !== null && typeof o === 'object' ? (o as Record<string, unknown>)[k] : undefined), obj);\n}\n\nconst NUMERO = new Intl.NumberFormat('pt-BR');\nconst COMPACTO = new Intl.NumberFormat('pt-BR', { notation: 'compact', maximumFractionDigits: 1 });\n\n/** `1243` → `1.243` · compacto: `12400` → `12,4 mil` (deixe o valor cheio no `title`). */\nexport function formatarNumero(valor: number, opcoes?: { compacto?: boolean }): string {\n return (opcoes?.compacto ? COMPACTO : NUMERO).format(valor);\n}\n\n/** 5–11h Bom dia · 12–17h Boa tarde · demais Boa noite. */\nexport function saudacaoPorHora(agora: Date = new Date()): string {\n const h = agora.getHours();\n if (h >= 5 && h < 12) return 'Bom dia';\n if (h >= 12 && h < 18) return 'Boa tarde';\n return 'Boa noite';\n}\n\n/** Primeira letra das duas primeiras palavras: `Gabrielly Ribeiro da Silva` → `GR`. */\nexport function iniciais(nome: string): string {\n return (nome ?? '')\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((p) => p[0])\n .join('')\n .toUpperCase();\n}\n\n/** Sem acento e em minúsculas — a comparação de toda busca/filtro. */\nexport function normalizar(s: string): string {\n return (s ?? '')\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase();\n}\n\n/** Formata CPF (até 11 dígitos) ou CNPJ (12 a 14) enquanto digita. */\nexport function formatCpfCnpj(v: string): string {\n const d = (v ?? '').replace(/\\D/g, '').slice(0, 14);\n if (d.length <= 11) {\n return d\n .replace(/^(\\d{3})(\\d)/, '$1.$2')\n .replace(/^(\\d{3})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/\\.(\\d{3})(\\d{1,2})$/, '.$1-$2');\n }\n return d\n .replace(/^(\\d{2})(\\d)/, '$1.$2')\n .replace(/^(\\d{2})\\.(\\d{3})(\\d)/, '$1.$2.$3')\n .replace(/\\.(\\d{3})(\\d)/, '.$1/$2')\n .replace(/\\/(\\d{4})(\\d{1,2})$/, '/$1-$2');\n}\n\n/** Nome em caixa de título (pt-BR): `GABRIELLY RIBEIRO` → `Gabrielly Ribeiro`. */\nexport function nomeProprio(valor: string): string {\n return (valor ?? '')\n .trim()\n .toLocaleLowerCase('pt-BR')\n .split(/\\s+/)\n .filter(Boolean)\n .map((p) => p[0].toLocaleUpperCase('pt-BR') + p.slice(1))\n .join(' ');\n}\n\n/** Primeiro + último nome: `GABRIELLY RIBEIRO DA SILVA` → `Gabrielly Silva`. */\nexport function nomeCurto(valor: string): string {\n const p = nomeProprio(valor).split(' ');\n return p.length > 1 ? `${p[0]} ${p[p.length - 1]}` : p[0] ?? '';\n}\n","/**\n * Ponte entre texto pt-BR (`dd/mm/aaaa`, `HH:mm`) e `Date`.\n * A validação é por ida e volta: `31/04/2026` vira `null`, não 1º de maio.\n */\n\nconst p2 = (n: number) => String(n).padStart(2, '0');\n\n/** `dd/mm/aaaa` → `Date`, ou `null` se malformado ou inexistente no calendário. */\nexport function parseDataBr(s: string): Date | null {\n const m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/.exec((s ?? '').trim());\n if (!m) return null;\n const [d, mes, a] = [Number(m[1]), Number(m[2]), Number(m[3])];\n const dt = new Date(a, mes - 1, d);\n return dt.getFullYear() === a && dt.getMonth() === mes - 1 && dt.getDate() === d ? dt : null;\n}\n\nexport function formatDataBr(d: Date): string {\n return `${p2(d.getDate())}/${p2(d.getMonth() + 1)}/${d.getFullYear()}`;\n}\n\n/** `HH:mm` → `Date` de HOJE com esse horário. */\nexport function parseHoraBr(s: string): Date | null {\n const m = /^(\\d{2}):(\\d{2})$/.exec((s ?? '').trim());\n if (!m || Number(m[1]) > 23 || Number(m[2]) > 59) return null;\n const d = new Date();\n d.setHours(Number(m[1]), Number(m[2]), 0, 0);\n return d;\n}\n\nexport function formatHoraBr(d: Date): string {\n return `${p2(d.getHours())}:${p2(d.getMinutes())}`;\n}\n\n/** `dd/mm/aaaa[ HH:mm]` → `Date` (sem hora = 00:00). */\nexport function parseDataHoraBr(s: string): Date | null {\n const [data, hora] = (s ?? '').trim().split(/\\s+/);\n const d = parseDataBr(data ?? '');\n if (!d) return null;\n if (hora) {\n const h = parseHoraBr(hora);\n if (!h) return null;\n d.setHours(h.getHours(), h.getMinutes(), 0, 0);\n }\n return d;\n}\n\nexport function formatDataHoraBr(d: Date): string {\n return `${formatDataBr(d)} ${formatHoraBr(d)}`;\n}\n\n/** ISO `aaaa-mm-dd` (valor do `CampoData`) → `dd/mm/aaaa`. Vazio se não for ISO. */\nexport function isoParaDataBr(iso: string): string {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(iso ?? '');\n return m ? `${m[3]}/${m[2]}/${m[1]}` : '';\n}\n\n/** `dd/mm/aaaa` → ISO `aaaa-mm-dd` (para o `CampoData`). Vazio se a data não existir. */\nexport function dataBrParaIso(s: string): string {\n const d = parseDataBr(s);\n return d ? `${d.getFullYear()}-${p2(d.getMonth() + 1)}-${p2(d.getDate())}` : '';\n}\n","/**\n * Vocabulário de entidade e títulos de tela: verbo no infinitivo + substantivo\n * (`Cadastrar veículo`), sem artigo — nunca precisa saber o gênero.\n * Quando a regra não serve (verbo do domínio, substantivo deverbal), a\n * entidade declara a frase INTEIRA do modo.\n */\n\nexport type Modo = 'novo' | 'editar' | 'leitura';\n\nexport interface Entidade {\n /** Substantivo em minúsculas, como entra na frase (`veículo`). */\n readonly nome: string;\n /** Frases completas para os modos que fogem da regra (ex.: `Firmar contrato`). */\n readonly novo?: string;\n readonly editar?: string;\n readonly leitura?: string;\n}\n\nconst VERBOS: Record<Modo, string> = { novo: 'Cadastrar', editar: 'Editar', leitura: 'Visualizar' };\n\n/** Título da tela: a frase declarada do modo ou `Verbo nome`. */\nexport function tituloDeEntidade(entidade: string | Entidade, modo: Modo): string {\n const e: Entidade = typeof entidade === 'string' ? { nome: entidade } : entidade;\n const declarada = e[modo]?.trim();\n return declarada || `${VERBOS[modo]} ${e.nome}`.trim();\n}\n\n/** Troca `\\ / : * ? \" < > |` por `-` e junta espaços — nome seguro para \"Salvar como PDF\". */\nexport function nomeDeArquivo(texto: string): string {\n return (texto ?? '')\n .replace(/[\\\\/:*?\"<>|]/g, '-')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n","/** Metadados de anexo — serializável, sem o `File` (que vive só na sessão). */\nexport interface Anexo {\n nome: string;\n /** Tamanho em bytes. */\n tamanho: number;\n /** MIME (pode chegar vazio do navegador). */\n tipo: string;\n /** Endereço do arquivo já armazenado (abrir/baixar). */\n url?: string;\n /** Miniatura da MESMA imagem, quando o backend serve dois tamanhos. */\n miniatura?: string;\n}\n\n/** Como o anexo pode ser EXIBIDO pelo navegador. */\nexport type TipoArquivo = 'imagem' | 'pdf' | 'video' | 'audio' | 'outro';\n\nconst UNIDADES_BYTES = ['B', 'KB', 'MB', 'GB', 'TB'];\n\n/** `1536` → `1.5 KB` · uma casa decimal abaixo de 10. */\nexport function formatBytes(bytes: number): string {\n if (!bytes || bytes < 0) return '0 B';\n let v = bytes;\n let i = 0;\n while (v >= 1024 && i < UNIDADES_BYTES.length - 1) {\n v /= 1024;\n i++;\n }\n if (i === 0) return `${v} B`;\n return `${v < 10 ? v.toFixed(1) : Math.round(v)} ${UNIDADES_BYTES[i]}`;\n}\n\nconst extensao = (nome: string) => /\\.([a-z0-9]+)$/i.exec(nome ?? '')?.[1]?.toLowerCase() ?? '';\n\n/** Classifica pelo MIME e, na falta, pela extensão do nome. */\nexport function tipoDeArquivo(tipo: string, nome = ''): TipoArquivo {\n const t = (tipo ?? '').toLowerCase();\n const ext = extensao(nome);\n if (t.startsWith('image/') || /^(png|jpe?g|gif|webp|svg|bmp|avif)$/.test(ext)) return 'imagem';\n if (t === 'application/pdf' || ext === 'pdf') return 'pdf';\n if (t.startsWith('video/') || /^(mp4|webm|ogv|mov|mkv|avi)$/.test(ext)) return 'video';\n if (t.startsWith('audio/') || /^(mp3|wav|ogg|m4a|aac|flac)$/.test(ext)) return 'audio';\n return 'outro';\n}\n\n/** Nome do ícone (Lucide) do anexo, pela família do documento. */\nexport function iconeArquivo(tipo: string, nome = ''): string {\n const exibicao = tipoDeArquivo(tipo, nome);\n if (exibicao === 'imagem') return 'image';\n if (exibicao === 'pdf') return 'file-text';\n if (exibicao === 'video') return 'video';\n if (exibicao === 'audio') return 'volume-2';\n const t = (tipo ?? '').toLowerCase();\n const ext = extensao(nome);\n if (t.includes('word') || /^docx?$/.test(ext)) return 'file-type';\n if (t.includes('excel') || t.includes('spreadsheet') || /^(xlsx?|csv)$/.test(ext)) return 'file-spreadsheet';\n if (t.includes('zip') || t.includes('compressed') || /^(zip|rar|7z)$/.test(ext)) return 'package';\n return 'file';\n}\n","/** Utilitários de JWT (só leitura do payload — NÃO confere assinatura). */\n\n/** Decodifica o payload (Base64Url, aceita acentos); `null` se malformado. */\nexport function decodificarJwt<T = Record<string, unknown>>(token: string): T | null {\n const partes = (token ?? '').split('.');\n if (partes.length !== 3) return null;\n try {\n const b64 = partes[1].replace(/-/g, '+').replace(/_/g, '/');\n const bin = atob(b64.padEnd(b64.length + ((4 - (b64.length % 4)) % 4), '='));\n const bytes = Uint8Array.from(bin, (c) => c.charCodeAt(0));\n return JSON.parse(new TextDecoder().decode(bytes)) as T;\n } catch {\n return null;\n }\n}\n\n/** Data de expiração (`exp`), ou `null`. */\nexport function expiracaoJwt(token: string): Date | null {\n const exp = decodificarJwt<{ exp?: number }>(token)?.exp;\n return typeof exp === 'number' ? new Date(exp * 1000) : null;\n}\n\n/** `true` se inválido ou se expira em menos de `margemSegundos` (renovação proativa). */\nexport function jwtExpirado(token: string, margemSegundos = 0): boolean {\n const exp = expiracaoJwt(token);\n if (!exp) return true;\n return exp.getTime() - Date.now() < margemSegundos * 1000;\n}\n\n/** Limita a margem de renovação à metade da vida do token. */\nexport function margemRefreshJwt(token: string, margemSegundos: number): number {\n const p = decodificarJwt<{ exp?: number; iat?: number }>(token);\n if (!p || typeof p.exp !== 'number' || typeof p.iat !== 'number' || p.exp <= p.iat) return margemSegundos;\n return Math.min(margemSegundos, (p.exp - p.iat) / 2);\n}\n\n/** Convenção de ambiente: `'#'` marca uma API não configurada. */\nexport function apiDefinida(url: string | null | undefined): url is string {\n return !!url && url !== '#';\n}\n","/** Fonte única de severidades; cada componente usa um recorte dela. */\nexport const SEVERIDADES = ['pri', 'ok', 'warn', 'err', 'info', 'neutral'] as const;\n\nexport type SeveridadeCompleta = (typeof SEVERIDADES)[number];\n\nconst CORES: Record<SeveridadeCompleta, string> = {\n pri: 'var(--pri)',\n ok: 'var(--ok-solid)',\n warn: 'var(--warn-solid)',\n err: 'var(--err-solid)',\n info: 'var(--info-solid)',\n neutral: 'var(--t3)',\n};\n\n/** Cor SÓLIDA da severidade (`var(--token)`) — para filete, tile ou marcador fora de um selo. */\nexport function severidadeCor(sev: SeveridadeCompleta): string {\n return CORES[sev];\n}\n\n/** O texto é um dos nomes de severidade? */\nexport function ehSeveridade(valor: string): valor is SeveridadeCompleta {\n return (SEVERIDADES as readonly string[]).includes(valor);\n}\n","/** Política de senha: o app declara só o que muda sobre `POLITICA_PADRAO`. */\nexport interface PoliticaSenha {\n minimo: number;\n exigirMinuscula?: boolean;\n exigirMaiuscula?: boolean;\n exigirDigito?: boolean;\n exigirSimbolo?: boolean;\n}\n\nexport type NivelForcaSenha = 'vazia' | 'fraca' | 'media' | 'forte';\n\nexport interface ForcaSenha {\n /** 0 (vazia) a 4. Abaixo do mínimo fica preso em 1. */\n score: number;\n nivel: NivelForcaSenha;\n}\n\n/** Padrão da biblioteca: só o tamanho. */\nexport const POLITICA_PADRAO: PoliticaSenha = { minimo: 8 };\n\nconst CLASSES = {\n minuscula: /[a-z]/,\n maiuscula: /[A-Z]/,\n digito: /\\d/,\n simbolo: /[^a-zA-Z0-9]/,\n};\n\n/** Primeira regra violada (tamanho → minúscula → maiúscula → dígito → símbolo), ou `''`. */\nexport function validarSenha(senha: string, politica: PoliticaSenha = POLITICA_PADRAO): string {\n if (!senha) return '';\n if (senha.length < politica.minimo) return `Use pelo menos ${politica.minimo} caracteres`;\n if (politica.exigirMinuscula && !CLASSES.minuscula.test(senha)) return 'Inclua uma letra minúscula';\n if (politica.exigirMaiuscula && !CLASSES.maiuscula.test(senha)) return 'Inclua uma letra maiúscula';\n if (politica.exigirDigito && !CLASSES.digito.test(senha)) return 'Inclua um número';\n if (politica.exigirSimbolo && !CLASSES.simbolo.test(senha)) return 'Inclua um símbolo';\n return '';\n}\n\n/** Heurística barata: +1 por classe de caractere, +1 com `minimo + 4` de tamanho. */\nexport function forcaSenha(senha: string, politica: PoliticaSenha = POLITICA_PADRAO): ForcaSenha {\n if (!senha) return { score: 0, nivel: 'vazia' };\n if (senha.length < politica.minimo) return { score: 1, nivel: 'fraca' };\n let score = Object.values(CLASSES).filter((re) => re.test(senha)).length;\n if (senha.length >= politica.minimo + 4) score++;\n score = Math.max(1, Math.min(4, score));\n return { score, nivel: score >= 3 ? 'forte' : score === 2 ? 'media' : 'fraca' };\n}\n\nexport function senhasIguais(a: string, b: string): boolean {\n return a === b;\n}\n","import { normalizar } from './texto';\n\n/** Valor do picklist: o par disponíveis (`fonte`) × escolhidos (`alvo`). */\nexport interface PicklistValor<T> {\n fonte: T[];\n alvo: T[];\n}\n\nexport const PICKLIST_VAZIO: PicklistValor<never> = { fonte: [], alvo: [] };\n\nexport function normalizarPicklistValor<T>(v: PicklistValor<T> | null | undefined): PicklistValor<T> {\n return { fonte: [...(v?.fonte ?? [])], alvo: [...(v?.alvo ?? [])] };\n}\n\n/** Move `itens` para o fim do destino, na ordem de ORIGEM. */\nfunction mover<T>(de: readonly T[], para: readonly T[], itens: readonly T[]) {\n const s = new Set(itens);\n return { de: de.filter((i) => !s.has(i)), para: [...para, ...de.filter((i) => s.has(i))] };\n}\n\nexport function moverParaAlvo<T>(v: PicklistValor<T>, itens: readonly T[]): PicklistValor<T> {\n const r = mover(v.fonte, v.alvo, itens);\n return { fonte: r.de, alvo: r.para };\n}\n\nexport function moverParaFonte<T>(v: PicklistValor<T>, itens: readonly T[]): PicklistValor<T> {\n const r = mover(v.alvo, v.fonte, itens);\n return { fonte: r.para, alvo: r.de };\n}\n\nexport function moverTudoParaAlvo<T>(v: PicklistValor<T>, apenas?: readonly T[]): PicklistValor<T> {\n return moverParaAlvo(v, apenas ?? v.fonte);\n}\n\nexport function moverTudoParaFonte<T>(v: PicklistValor<T>, apenas?: readonly T[]): PicklistValor<T> {\n return moverParaFonte(v, apenas ?? v.alvo);\n}\n\n/** Move o item de `de` para `para` (índices limitados; nunca lança). */\nexport function reordenarLista<T>(lista: readonly T[], de: number, para: number): T[] {\n const l = [...lista];\n if (!l.length) return l;\n const a = Math.max(0, Math.min(de, l.length - 1));\n const b = Math.max(0, Math.min(para, l.length - 1));\n const [item] = l.splice(a, 1);\n l.splice(b, 0, item);\n return l;\n}\n\n/** Filtro sem acento/caixa; termo vazio devolve tudo (cópia). */\nexport function filtrarItens<T>(itens: readonly T[], termo: string, texto: (item: T) => string): T[] {\n const t = normalizar(termo.trim());\n return t ? itens.filter((i) => normalizar(texto(i)).includes(t)) : [...itens];\n}\n","import { useSyncExternalStore, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nconst semAssinatura = () => () => {};\n\n/**\n * `true` só no navegador depois da hidratação. No servidor (SSR/Next.js) e no\n * render de hidratação fica `false`, sem render extra num app só cliente.\n */\nexport function useNoNavegador(): boolean {\n return useSyncExternalStore(\n semAssinatura,\n () => true,\n () => false,\n );\n}\n\nfunction Portal({ children }: { children: ReactNode }) {\n return useNoNavegador() ? createPortal(children, document.body) : null;\n}\n\n/** `createPortal(no, document.body)` que não quebra no SSR (lá não existe `document`). */\nexport function portal(no: ReactNode) {\n return <Portal>{no}</Portal>;\n}\n","import { isValidElement, useEffect, useRef, useState, type ReactNode } from 'react';\nimport { portal } from '../../utils/portal';\nimport { cx } from '../../utils/cx';\nimport './Dica.css';\n\nexport type PosicaoDica = 'cima' | 'direita' | 'baixo' | 'esquerda';\nexport type CorDica = 'padrao' | 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'claro';\n\nexport interface DicaProps {\n /** Texto do balão (aceita conteúdo formatado). Vazio = sem dica (o filho é renderizado puro). */\n texto?: ReactNode;\n children: ReactNode;\n /** Atraso para abrir no hover, em ms. */\n atraso?: number;\n /** Lado preferido; vira para o oposto se não couber. Padrão: `cima`. */\n posicao?: PosicaoDica;\n cor?: CorDica;\n}\n\ninterface Pos {\n top: number;\n left: number;\n lado: PosicaoDica;\n}\n\n/** Espaço mínimo (px) para a dica caber de um lado antes de virar para o outro. */\nconst FOLGA_V = 48;\nconst FOLGA_H = 160;\nconst DISTANCIA = 6;\n\nfunction posicionar(r: DOMRect, preferido: PosicaoDica): Pos {\n let lado = preferido;\n if (lado === 'cima' && r.top < FOLGA_V) lado = 'baixo';\n else if (lado === 'baixo' && window.innerHeight - r.bottom < FOLGA_V) lado = 'cima';\n else if (lado === 'direita' && window.innerWidth - r.right < FOLGA_H) lado = 'esquerda';\n else if (lado === 'esquerda' && r.left < FOLGA_H) lado = 'direita';\n const cx_ = r.left + r.width / 2;\n const cy = r.top + r.height / 2;\n if (lado === 'cima') return { top: r.top - DISTANCIA, left: cx_, lado };\n if (lado === 'baixo') return { top: r.bottom + DISTANCIA, left: cx_, lado };\n if (lado === 'direita') return { top: cy, left: r.right + DISTANCIA, lado };\n return { top: cy, left: r.left - DISTANCIA, lado };\n}\n\n/** Balão de dica (tooltip) no hover/foco do elemento envolvido. */\nexport function Dica({ texto, children, atraso = 350, posicao = 'cima', cor = 'padrao' }: DicaProps) {\n const alvo = useRef<HTMLSpanElement>(null);\n const timer = useRef<number | undefined>(undefined);\n const [pos, setPos] = useState<Pos | null>(null);\n\n const abrir = (imediato: boolean) => {\n window.clearTimeout(timer.current);\n timer.current = window.setTimeout(\n () => {\n const el = alvo.current;\n if (!el) return;\n // mede o próprio filho (o span-alvo pode ser maior que ele)\n const medido = (el.firstElementChild as HTMLElement | null) ?? el;\n setPos(posicionar(medido.getBoundingClientRect(), posicao));\n },\n imediato ? 0 : atraso,\n );\n };\n const fechar = () => {\n window.clearTimeout(timer.current);\n setPos(null);\n };\n\n useEffect(() => {\n if (!pos) return;\n const esc = (e: KeyboardEvent) => e.key === 'Escape' && fechar();\n window.addEventListener('keydown', esc);\n window.addEventListener('scroll', fechar, true);\n return () => {\n window.removeEventListener('keydown', esc);\n window.removeEventListener('scroll', fechar, true);\n };\n }, [pos]);\n\n useEffect(() => () => window.clearTimeout(timer.current), []);\n\n if (!texto) return <>{children}</>;\n\n // elemento desabilitado não recebe foco nem eventos: o próprio alvo assume\n const filhoDesabilitado = isValidElement<{ disabled?: boolean }>(children) && !!children.props.disabled;\n\n return (\n <span\n ref={alvo}\n className=\"lp-dica-alvo\"\n tabIndex={filhoDesabilitado ? 0 : undefined}\n onMouseEnter={() => abrir(false)}\n onMouseLeave={fechar}\n onFocus={() => abrir(true)}\n onBlur={fechar}\n onPointerDown={fechar}\n >\n {children}\n {pos &&\n portal(\n <div\n className={cx('lp-dica', `lp-dica--${pos.lado}`, cor !== 'padrao' && `lp-dica--${cor}`)}\n style={{ top: pos.top, left: pos.left }}\n aria-hidden=\"true\"\n >\n {texto}\n </div>,\n )}\n </span>\n );\n}\n","import { createContext, forwardRef, useContext, type ButtonHTMLAttributes, type MouseEvent, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { Dica } from '../Dica/Dica';\nimport './Botao.css';\n\nexport type SeveridadeBotao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\n/**\n * `solido` · `contorno` · `texto` · `suave` = fundo claro da cor · `gradiente`\n * · `fantasma` = contorno discreto que se preenche no hover.\n */\nexport type AparenciaBotao = 'solido' | 'contorno' | 'texto' | 'suave' | 'gradiente' | 'fantasma';\n\n/** Padrões que um grupo (`GrupoBotoes`) repassa aos botões de dentro. */\nexport interface PadroesBotao {\n severidade?: SeveridadeBotao;\n aparencia?: AparenciaBotao;\n formato?: 'pilula' | 'retangulo';\n tamanho?: 'pequeno' | 'medio' | 'grande';\n}\nexport const PadroesBotaoCtx = createContext<PadroesBotao>({});\n\nexport interface BotaoProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n rotulo?: string;\n icone?: IconeProp;\n posicaoIcone?: 'esquerda' | 'direita';\n severidade?: SeveridadeBotao;\n aparencia?: AparenciaBotao;\n /** Mostra spinner e recusa o clique (o botão segue focável). */\n carregando?: boolean;\n /** Ocupa 100% da largura. */\n bloco?: boolean;\n /** `pilula` (padrão) · `retangulo` = cantos levemente arredondados. */\n formato?: 'pilula' | 'retangulo';\n tamanho?: 'pequeno' | 'medio' | 'grande';\n /** Sombra fixa, ou `elevado` (sombra da cor que sobe no hover). */\n sombra?: 'pequena' | 'media' | 'grande' | 'elevado';\n /** Ícone num segmento mais escuro, colado à borda (\"botão com rótulo\"). */\n iconeDestacado?: boolean;\n /** Botão de alternância: liga/desliga (vira `aria-pressed`). */\n pressionado?: boolean;\n /** Balão de dica — use em botões só com ícone. */\n dica?: string;\n children?: ReactNode;\n}\n\nexport const Botao = forwardRef<HTMLButtonElement, BotaoProps>(function Botao(\n {\n rotulo,\n icone,\n posicaoIcone = 'esquerda',\n severidade: severidadeProp,\n aparencia: aparenciaProp,\n carregando = false,\n bloco = false,\n formato: formatoProp,\n tamanho: tamanhoProp,\n sombra,\n iconeDestacado = false,\n pressionado,\n dica,\n children,\n className,\n type = 'button',\n onClick,\n ...resto\n },\n ref,\n) {\n const padroes = useContext(PadroesBotaoCtx);\n const severidade = severidadeProp ?? padroes.severidade ?? 'pri';\n const aparencia = aparenciaProp ?? padroes.aparencia ?? 'solido';\n const formato = formatoProp ?? padroes.formato ?? 'pilula';\n const tamanho = tamanhoProp ?? padroes.tamanho ?? 'medio';\n const texto = children ?? rotulo;\n const soIcone = !texto && !!icone;\n\n const aoClicar = (e: MouseEvent<HTMLButtonElement>) => {\n if (carregando) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n const botao = (\n <button\n ref={ref}\n type={type}\n className={cx(\n 'lp-btn',\n `lp-btn--${aparencia}`,\n severidade !== 'pri' && `lp-btn--${severidade}`,\n soIcone && 'lp-btn--icone',\n posicaoIcone === 'direita' && 'lp-btn--icone-dir',\n bloco && 'lp-btn--bloco',\n formato === 'retangulo' && 'lp-btn--retangulo',\n tamanho !== 'medio' && `lp-btn--${tamanho}`,\n sombra && `lp-btn--sombra-${sombra}`,\n iconeDestacado && !soIcone && 'lp-btn--icone-destacado',\n pressionado && 'is-pressionado',\n className,\n )}\n aria-pressed={pressionado}\n aria-disabled={carregando || undefined}\n aria-busy={carregando || undefined}\n onClick={aoClicar}\n {...resto}\n >\n {iconeDestacado && !soIcone && (icone || carregando) ? (\n <span className=\"lp-btn-segmento\">{carregando ? <Icone icone=\"loader-circle\" girar /> : <Icone icone={icone} />}</span>\n ) : carregando ? (\n <Icone icone=\"loader-circle\" girar />\n ) : (\n <Icone icone={icone} />\n )}\n {texto && <span className=\"lp-btn-rotulo\">{texto}</span>}\n </button>\n );\n\n return dica ? <Dica texto={dica}>{botao}</Dica> : botao;\n});\n","import { useEffect, useRef, type KeyboardEvent, type ReactNode } from 'react';\nimport { portal } from '../../utils/portal';\n\nconst FOCAVEIS =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nlet abertos = 0;\n// pilha das sobreposições abertas: o Esc é da que está no topo\nconst pilha: symbol[] = [];\n\nexport interface SobreposicaoProps {\n aoDispensar?: () => void;\n /** Esc e clique na máscara fecham. */\n dispensavel?: boolean;\n rotuloId?: string;\n descricaoId?: string;\n /** Elemento que recebe o foco ao abrir (seletor CSS dentro do painel). */\n focoInicial?: string;\n className?: string;\n /** Classe extra na máscara (ex.: alinhamento do painel lateral). */\n classeMascara?: string;\n children: ReactNode;\n}\n\n/**\n * Máscara + painel modal: portal no <body>, trava o scroll, prende o foco\n * (Tab circula dentro) e devolve o foco a quem abriu ao fechar.\n */\nexport function Sobreposicao({\n aoDispensar,\n dispensavel = true,\n rotuloId,\n descricaoId,\n focoInicial,\n className,\n classeMascara,\n children,\n}: SobreposicaoProps) {\n const painel = useRef<HTMLDivElement>(null);\n const dispensar = useRef({ aoDispensar, dispensavel });\n dispensar.current = { aoDispensar, dispensavel };\n\n // Esc no documento: vale mesmo quando o foco caiu no <body> (ex.: o\n // elemento focado saiu da tela ao trocar o conteúdo do diálogo)\n useEffect(() => {\n const eu = Symbol('sobreposicao');\n pilha.push(eu);\n const h = (e: globalThis.KeyboardEvent) => {\n if (e.key !== 'Escape' || pilha[pilha.length - 1] !== eu || e.defaultPrevented) return;\n if (painel.current?.contains(document.activeElement)) return; // o onKeyDown do painel cuida\n if (dispensar.current.dispensavel) dispensar.current.aoDispensar?.();\n };\n document.addEventListener('keydown', h);\n return () => {\n document.removeEventListener('keydown', h);\n pilha.splice(pilha.indexOf(eu), 1);\n };\n }, []);\n\n useEffect(() => {\n const anterior = document.activeElement as HTMLElement | null;\n abertos++;\n document.body.style.overflow = 'hidden';\n const el = painel.current;\n const alvo =\n (focoInicial && el?.querySelector<HTMLElement>(focoInicial)) ||\n el?.querySelector<HTMLElement>('[data-foco-inicial]') ||\n el?.querySelector<HTMLElement>('.lp-dlg-corpo ' + FOCAVEIS.split(',').join(', .lp-dlg-corpo ')) ||\n el;\n alvo?.focus();\n return () => {\n abertos--;\n if (!abertos) document.body.style.overflow = '';\n anterior?.focus?.();\n };\n // abre uma vez por montagem\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const aoTeclar = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape' && dispensavel) {\n e.stopPropagation();\n aoDispensar?.();\n return;\n }\n if (e.key !== 'Tab' || !painel.current) return;\n const lista = [...painel.current.querySelectorAll<HTMLElement>(FOCAVEIS)].filter((n) => n.offsetParent !== null);\n if (!lista.length) {\n e.preventDefault();\n return;\n }\n const primeiro = lista[0];\n const ultimo = lista[lista.length - 1];\n if (e.shiftKey && document.activeElement === primeiro) {\n e.preventDefault();\n ultimo.focus();\n } else if (!e.shiftKey && document.activeElement === ultimo) {\n e.preventDefault();\n primeiro.focus();\n }\n };\n\n return portal(\n <div\n className={classeMascara ? `lp-sobre ${classeMascara}` : 'lp-sobre'}\n onMouseDown={(e) => {\n if (e.target !== e.currentTarget) return;\n if (dispensavel) aoDispensar?.();\n else {\n // não fecha por fora: um tremidinho avisa que é preciso usar os botões\n const el = painel.current;\n el?.classList.remove('lp-sobre-recusa');\n void el?.offsetWidth;\n el?.classList.add('lp-sobre-recusa');\n }\n }}\n >\n <div\n ref={painel}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={rotuloId}\n aria-describedby={descricaoId}\n tabIndex={-1}\n className={className}\n onKeyDown={aoTeclar}\n >\n {children}\n </div>\n </div>,\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport { createContext, useCallback, useContext, useId, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { Botao, type SeveridadeBotao } from '../Botao/Botao';\nimport { Sobreposicao } from '../Dialogo/Sobreposicao';\nimport './Confirmacao.css';\n\nexport interface OpcoesConfirmacao {\n titulo: string;\n mensagem?: ReactNode;\n severidade?: Exclude<SeveridadeBotao, 'secundario'>;\n icone?: string;\n rotuloAceitar?: string;\n rotuloRecusar?: string;\n iconeAceitar?: string;\n /** Só o botão de OK (aviso). */\n somenteOk?: boolean;\n}\n\n/** Remoção: sempre vermelha e com lixeira (não dá para trocar). */\nexport type OpcoesRemocao = Omit<Partial<OpcoesConfirmacao>, 'severidade' | 'iconeAceitar' | 'somenteOk'>;\n\n/** Aviso: um botão só, para ciência. */\nexport type OpcoesAviso = Omit<OpcoesConfirmacao, 'somenteOk' | 'rotuloRecusar'>;\n\nexport interface Confirmar {\n (opcoes: OpcoesConfirmacao): Promise<boolean>;\n /** Atalho institucional de exclusão de dado salvo (irreversível). */\n remover: (opcoes?: OpcoesRemocao) => Promise<boolean>;\n /** Só ciência — \"alertar\" é `avisar({ severidade: 'err' })`. */\n avisar: (opcoes: OpcoesAviso) => Promise<void>;\n}\n\nconst Ctx = createContext<Confirmar | null>(null);\n\nconst ICONE_PADRAO: Record<string, string> = {\n pri: 'circle-question-mark',\n ok: 'circle-check',\n warn: 'triangle-alert',\n err: 'trash-2',\n};\n\n/** Fornece `useConfirmacao()` para a árvore. Já incluso no `ProvedorUi`. */\nexport function ProvedorConfirmacao({ children }: { children: ReactNode }) {\n const [atual, setAtual] = useState<OpcoesConfirmacao | null>(null);\n const resolver = useRef<((v: boolean) => void) | null>(null);\n const tituloId = useId();\n const msgId = useId();\n\n const confirmar = useCallback((opcoes: OpcoesConfirmacao) => {\n resolver.current?.(false);\n setAtual(opcoes);\n return new Promise<boolean>((res) => {\n resolver.current = res;\n });\n }, []);\n\n const api = useMemo<Confirmar>(\n () =>\n Object.assign((o: OpcoesConfirmacao) => confirmar(o), {\n remover: (o: OpcoesRemocao = {}) =>\n confirmar({\n titulo: 'Remover registro?',\n mensagem: 'Esta ação não pode ser desfeita.',\n rotuloAceitar: 'Remover',\n ...o,\n severidade: 'err',\n icone: 'trash-2',\n iconeAceitar: 'trash-2',\n }),\n avisar: (o: OpcoesAviso) =>\n confirmar({ rotuloAceitar: 'Entendi', icone: o.severidade && o.severidade !== 'pri' ? undefined : 'info', ...o, somenteOk: true }).then(\n () => undefined,\n ),\n }),\n [confirmar],\n );\n\n const responder = (v: boolean) => {\n resolver.current?.(v);\n resolver.current = null;\n setAtual(null);\n };\n\n const sev = atual?.severidade ?? 'pri';\n\n return (\n <Ctx.Provider value={api}>\n {children}\n {atual && (\n <Sobreposicao\n aoDispensar={() => responder(false)}\n rotuloId={tituloId}\n descricaoId={atual.mensagem ? msgId : undefined}\n focoInicial=\"[data-aceitar]\"\n className=\"lp-dlg lp-dlg--pequeno lp-conf\"\n >\n <div className=\"lp-conf-cab\">\n <span className=\"lp-conf-selo\" data-sev-conf={sev}>\n <Icone icone={atual.icone ?? ICONE_PADRAO[sev]} />\n </span>\n <span className=\"lp-conf-titulo\" id={tituloId}>\n {atual.titulo}\n </span>\n </div>\n {atual.mensagem && (\n <p className=\"lp-conf-msg\" id={msgId}>\n {atual.mensagem}\n </p>\n )}\n <div className=\"lp-conf-rodape\">\n {!atual.somenteOk && (\n <Botao rotulo={atual.rotuloRecusar ?? 'Cancelar'} aparencia=\"texto\" severidade=\"secundario\" onClick={() => responder(false)} />\n )}\n <Botao\n data-aceitar=\"\"\n rotulo={atual.rotuloAceitar ?? (atual.somenteOk ? 'OK' : 'Confirmar')}\n icone={atual.iconeAceitar}\n severidade={sev}\n onClick={() => responder(true)}\n />\n </div>\n </Sobreposicao>\n )}\n </Ctx.Provider>\n );\n}\n\n/**\n * `const confirmar = useConfirmacao();`\n * `if (await confirmar({ titulo: 'Excluir?', severidade: 'err' })) …`\n * `if (await confirmar.remover({ mensagem: '\"TJ-PR 2026\" será removido.' })) …`\n * `await confirmar.avisar({ titulo: 'Prazo encerrado', severidade: 'warn' })`\n */\nexport function useConfirmacao(): Confirmar {\n const ctx = useContext(Ctx);\n if (!ctx) throw new Error('useConfirmacao precisa de <ProvedorConfirmacao> (ou <ProvedorUi>) acima na árvore.');\n return ctx;\n}\n","import { Icone, type IconeProp } from '../../utils/Icone';\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type HTMLAttributes, type ReactNode } from 'react';\nimport { portal } from '../../utils/portal';\nimport { cx } from '../../utils/cx';\nimport type { Severidade } from '../../utils/tipos';\nimport './Toast.css';\n\ntype SevToast = Exclude<Severidade, 'neutral'>;\n\nexport type CorToast = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\n/** `suave` (padrão) = fundo claro da cor · `padrao` = fundo neutro, ícone na cor · `solido` · `translucido` = vidro fosco. */\nexport type AparenciaToast = 'suave' | 'padrao' | 'solido' | 'translucido';\nexport type PosicaoToast =\n | 'topo-esquerda'\n | 'topo-centro'\n | 'topo-direita'\n | 'meio-esquerda'\n | 'meio-centro'\n | 'meio-direita'\n | 'base-esquerda'\n | 'base-centro'\n | 'base-direita';\n\nconst ICONE: Record<SevToast, string> = {\n ok: 'circle-check',\n info: 'info',\n warn: 'triangle-alert',\n err: 'circle-x',\n};\n\nexport interface ToastProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Dá o ícone e a cor padrão. */\n severidade?: SevToast;\n /** Cor no lugar da que vem da severidade. */\n cor?: CorToast;\n aparencia?: AparenciaToast;\n titulo?: ReactNode;\n detalhe?: ReactNode;\n /** Ícone no lugar do da severidade; `false` tira. */\n icone?: IconeProp | false;\n /** `cabecalho` = linha de cima com ícone, título, tempo e ×; o detalhe vai embaixo. */\n modelo?: 'compacto' | 'cabecalho';\n /** Quando aconteceu (ex.: \"há 11 min\"), no modelo com cabeçalho. */\n tempo?: string;\n /** Botões ou links abaixo do texto. */\n acoes?: ReactNode;\n /** Mostra o × e é chamado ao fechar. */\n aoFechar?: () => void;\n}\n\n/**\n * O cartão de aviso. Aparece sozinho via `useToast()`; use direto para um\n * aviso fixo na página.\n */\nexport function Toast({\n severidade,\n cor,\n aparencia = 'suave',\n titulo,\n detalhe,\n icone,\n modelo = 'compacto',\n tempo,\n acoes,\n aoFechar,\n children,\n className,\n ...resto\n}: ToastProps) {\n const tom = cor ?? severidade ?? 'pri';\n const ic = icone === false ? null : (icone ?? (severidade ? ICONE[severidade] : null));\n const fechar = aoFechar && (\n <button type=\"button\" className=\"lp-toast-fechar\" aria-label=\"Fechar aviso\" onClick={aoFechar}>\n <Icone icone=\"x\" />\n </button>\n );\n const corpo = (\n <>\n {detalhe && <span className=\"lp-toast-detalhe\">{detalhe}</span>}\n {children}\n {acoes && <div className=\"lp-toast-acoes\">{acoes}</div>}\n </>\n );\n\n return (\n <div className={cx('lp-toast', `lp-toast--${tom}`, `lp-toast--${aparencia}`, modelo === 'cabecalho' && 'lp-toast--cabecalho', className)} {...resto}>\n {modelo === 'cabecalho' ? (\n <>\n <div className=\"lp-toast-cab\">\n {ic && <Icone icone={ic} className=\"lp-toast-ic\" />}\n <strong className=\"lp-toast-titulo\">{titulo}</strong>\n {tempo && <small className=\"lp-toast-tempo\">{tempo}</small>}\n {fechar}\n </div>\n <div className=\"lp-toast-corpo\">{corpo}</div>\n </>\n ) : (\n <>\n {ic && <Icone icone={ic} className=\"lp-toast-ic\" />}\n <div className=\"lp-toast-corpo\">\n {titulo && <strong className=\"lp-toast-titulo\">{titulo}</strong>}\n {corpo}\n </div>\n {fechar}\n </>\n )}\n </div>\n );\n}\n\nexport interface OpcoesToast {\n severidade?: SevToast;\n titulo: string;\n detalhe?: string;\n /** ms até sumir sozinho. 0 = só fecha no ×. */\n duracao?: number;\n /** Canto/lado da tela. Padrão: `topo-direita`. */\n posicao?: PosicaoToast;\n cor?: CorToast;\n aparencia?: AparenciaToast;\n /** Ícone no lugar do da severidade; `false` tira. */\n icone?: IconeProp | false;\n}\n\ninterface ItemToast extends OpcoesToast {\n id: number;\n severidade: SevToast;\n posicao: PosicaoToast;\n saindo: boolean;\n}\n\nexport interface ApiToast {\n mostrar: (o: OpcoesToast) => number;\n ok: (titulo: string, detalhe?: string) => number;\n info: (titulo: string, detalhe?: string) => number;\n warn: (titulo: string, detalhe?: string) => number;\n err: (titulo: string, detalhe?: string) => number;\n fechar: (id: number) => void;\n}\n\nconst Ctx = createContext<ApiToast | null>(null);\n\nconst MAX_VISIVEIS = 4;\nlet seq = 0;\n\n/** Fornece `useToast()` e renderiza a pilha. Já incluso no `ProvedorUi`. */\nexport function ProvedorToast({ children }: { children: ReactNode }) {\n const [itens, setItens] = useState<ItemToast[]>([]);\n const timers = useRef(new Map<number, { t?: number; resta: number; inicio: number }>());\n\n const remover = useCallback((id: number) => {\n setItens((l) => l.map((t) => (t.id === id ? { ...t, saindo: true } : t)));\n window.setTimeout(() => setItens((l) => l.filter((t) => t.id !== id)), 180);\n const tm = timers.current.get(id);\n if (tm?.t) window.clearTimeout(tm.t);\n timers.current.delete(id);\n }, []);\n\n const agendar = useCallback(\n (id: number, ms: number) => {\n if (ms <= 0) return;\n const t = window.setTimeout(() => remover(id), ms);\n timers.current.set(id, { t, resta: ms, inicio: Date.now() });\n },\n [remover],\n );\n\n const pausar = (id: number) => {\n const tm = timers.current.get(id);\n if (!tm?.t) return;\n window.clearTimeout(tm.t);\n timers.current.set(id, { resta: tm.resta - (Date.now() - tm.inicio), inicio: Date.now() });\n };\n const retomar = (id: number) => {\n const tm = timers.current.get(id);\n if (tm && !tm.t) agendar(id, Math.max(tm.resta, 1500));\n };\n\n const mostrar = useCallback(\n (o: OpcoesToast) => {\n const id = ++seq;\n const severidade = o.severidade ?? 'info';\n const duracao = o.duracao ?? (severidade === 'err' ? 8000 : 5000);\n setItens((l) => [...l, { ...o, id, severidade, duracao, posicao: o.posicao ?? 'topo-direita', saindo: false }]);\n agendar(id, duracao);\n return id;\n },\n [agendar],\n );\n\n const api = useMemo<ApiToast>(\n () => ({\n mostrar,\n ok: (titulo, detalhe) => mostrar({ severidade: 'ok', titulo, detalhe }),\n info: (titulo, detalhe) => mostrar({ severidade: 'info', titulo, detalhe }),\n warn: (titulo, detalhe) => mostrar({ severidade: 'warn', titulo, detalhe }),\n err: (titulo, detalhe) => mostrar({ severidade: 'err', titulo, detalhe }),\n fechar: remover,\n }),\n [mostrar, remover],\n );\n\n useEffect(() => {\n const mapa = timers.current;\n return () => mapa.forEach((tm) => tm.t && window.clearTimeout(tm.t));\n }, []);\n\n const ultimo = itens[itens.length - 1];\n // uma pilha por posição, na ordem em que aparecem\n const posicoes = [...new Set(itens.map((t) => t.posicao))];\n\n return (\n <Ctx.Provider value={api}>\n {children}\n {portal(\n <>\n <div className=\"lp-sr\" aria-live=\"polite\">\n {ultimo && ultimo.severidade !== 'err' ? `${ultimo.titulo}. ${ultimo.detalhe ?? ''}` : ''}\n </div>\n {posicoes.map((pos) => {\n const daqui = itens.filter((t) => t.posicao === pos);\n const visiveis = daqui.slice(-MAX_VISIVEIS);\n const ocultos = daqui.length - visiveis.length;\n return (\n <div key={pos} className={cx('lp-toasts', `lp-toasts--${pos}`)}>\n {visiveis.map((t) => (\n <Toast\n key={t.id}\n severidade={t.severidade}\n cor={t.cor}\n aparencia={t.aparencia}\n icone={t.icone}\n titulo={t.titulo}\n detalhe={t.detalhe}\n className={t.saindo ? 'is-saindo' : undefined}\n role={t.severidade === 'err' ? 'alert' : undefined}\n onMouseEnter={() => pausar(t.id)}\n onMouseLeave={() => retomar(t.id)}\n onFocus={() => pausar(t.id)}\n onBlur={() => retomar(t.id)}\n aoFechar={() => remover(t.id)}\n />\n ))}\n {ocultos > 0 && (\n <div className=\"lp-toast-mais\">\n e mais {ocultos} {ocultos === 1 ? 'aviso' : 'avisos'}\n </div>\n )}\n </div>\n );\n })}\n </>,\n )}\n </Ctx.Provider>\n );\n}\n\n/** `const toast = useToast(); toast.ok('Salvo com sucesso');` */\nexport function useToast(): ApiToast {\n const ctx = useContext(Ctx);\n if (!ctx) throw new Error('useToast precisa de <ProvedorToast> (ou <ProvedorUi>) acima na árvore.');\n return ctx;\n}\n\n/** Igual a `useToast`, mas devolve `null` fora do provedor. */\nexport function useToastOpcional(): ApiToast | null {\n return useContext(Ctx);\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { ProvedorConfirmacao } from '../Confirmacao/Confirmacao';\nimport { ProvedorToast } from '../Toast/Toast';\n\nexport type Tema = 'claro' | 'escuro';\nexport type Densidade = 'compacta' | 'confortavel' | 'espacosa';\n\nconst CLASSE_DENSIDADE: Record<Densidade, string> = {\n compacta: 'density-compact',\n confortavel: 'density-comfortable',\n espacosa: 'density-cozy',\n};\n\nexport interface Preferencias {\n tema: Tema;\n escuro: boolean;\n densidade: Densidade;\n definirTema: (t: Tema) => void;\n alternarTema: () => void;\n definirDensidade: (d: Densidade) => void;\n}\n\nconst Ctx = createContext<Preferencias | null>(null);\n\nconst CHAVE = 'lp-preferencias';\n\nfunction ler(): Partial<{ tema: Tema; densidade: Densidade }> {\n try {\n return JSON.parse(localStorage.getItem(CHAVE) ?? '{}');\n } catch {\n return {};\n }\n}\n\nfunction temaDoSistema(): Tema {\n try {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'escuro' : 'claro';\n } catch {\n return 'claro';\n }\n}\n\nexport interface ProvedorPreferenciasProps {\n children: ReactNode;\n temaInicial?: Tema;\n densidadeInicial?: Densidade;\n}\n\n/**\n * Tema (claro/escuro) e densidade, lembrados no navegador. Aplica\n * `data-theme` no <html> e a classe de densidade no <body>.\n */\nexport function ProvedorPreferencias({ children, temaInicial, densidadeInicial = 'confortavel' }: ProvedorPreferenciasProps) {\n const [tema, setTema] = useState<Tema>(() => ler().tema ?? temaInicial ?? temaDoSistema());\n const [densidade, setDensidade] = useState<Densidade>(() => ler().densidade ?? densidadeInicial);\n\n useEffect(() => {\n document.documentElement.setAttribute('data-theme', tema === 'escuro' ? 'dark' : 'light');\n }, [tema]);\n\n useEffect(() => {\n const body = document.body;\n Object.values(CLASSE_DENSIDADE).forEach((c) => body.classList.remove(c));\n body.classList.add(CLASSE_DENSIDADE[densidade]);\n }, [densidade]);\n\n useEffect(() => {\n try {\n localStorage.setItem(CHAVE, JSON.stringify({ tema, densidade }));\n } catch {\n /* navegação privada: segue sem lembrar */\n }\n }, [tema, densidade]);\n\n const alternarTema = useCallback(() => setTema((t) => (t === 'escuro' ? 'claro' : 'escuro')), []);\n\n const valor = useMemo<Preferencias>(\n () => ({\n tema,\n escuro: tema === 'escuro',\n densidade,\n definirTema: setTema,\n alternarTema,\n definirDensidade: setDensidade,\n }),\n [tema, densidade, alternarTema],\n );\n\n return <Ctx.Provider value={valor}>{children}</Ctx.Provider>;\n}\n\nexport function usePreferencias(): Preferencias {\n const ctx = useContext(Ctx);\n if (!ctx) throw new Error('usePreferencias precisa de <ProvedorPreferencias> (ou <ProvedorUi>) acima na árvore.');\n return ctx;\n}\n\n/** Tudo que a biblioteca precisa na raiz do app: preferências, toasts e confirmação. */\nexport function ProvedorUi({ children, ...prefs }: ProvedorPreferenciasProps) {\n return (\n <ProvedorPreferencias {...prefs}>\n <ProvedorToast>\n <ProvedorConfirmacao>{children}</ProvedorConfirmacao>\n </ProvedorToast>\n </ProvedorPreferencias>\n );\n}\n\n/** Igual a `usePreferencias`, mas devolve `null` fora do provedor. */\nexport function usePreferenciasOpcional(): Preferencias | null {\n return useContext(Ctx);\n}\n","import { useEffect, type RefObject } from 'react';\n\n/** Chama `aoClicarFora` em pointerdown fora de TODOS os elementos dados. */\nexport function useCliqueFora(\n refs: Array<RefObject<HTMLElement | null>>,\n ativo: boolean,\n aoClicarFora: () => void,\n) {\n useEffect(() => {\n if (!ativo) return;\n const handler = (e: PointerEvent) => {\n const alvo = e.target as Node;\n if (refs.some((r) => r.current?.contains(alvo))) return;\n aoClicarFora();\n };\n document.addEventListener('pointerdown', handler);\n return () => document.removeEventListener('pointerdown', handler);\n // refs são estáveis (useRef); o callback muda a cada render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ativo, aoClicarFora]);\n}\n","import { useState, type CSSProperties } from 'react';\nimport { cx } from '../../utils/cx';\nimport './Avatar.css';\n\nexport interface AvatarProps {\n foto?: string;\n /** Nome completo — gera as iniciais quando não há foto. */\n nome?: string;\n iniciais?: string;\n tom?: 'claro' | 'escuro';\n formato?: 'circulo' | 'quadrado';\n /** Tamanho CSS (ex.: `2rem`). */\n tamanho?: string;\n className?: string;\n}\n\nfunction iniciaisDe(nome = '') {\n const partes = nome.trim().split(/\\s+/).filter(Boolean);\n if (!partes.length) return '';\n const primeira = partes[0][0];\n const ultima = partes.length > 1 ? partes[partes.length - 1][0] : '';\n return (primeira + ultima).toUpperCase();\n}\n\nexport function Avatar({ foto, nome, iniciais, tom = 'claro', formato = 'circulo', tamanho, className }: AvatarProps) {\n const [falhou, setFalhou] = useState(false);\n const estilo = tamanho ? ({ '--av-size': tamanho } as CSSProperties) : undefined;\n return (\n <span className={cx('lp-av', `lp-av--${formato}`, `lp-av--${tom}`, className)} style={estilo} title={nome}>\n {foto && !falhou ? (\n <img src={foto} alt=\"\" loading=\"lazy\" onError={() => setFalhou(true)} />\n ) : (\n <span className=\"lp-av-ini\" aria-hidden=\"true\">\n {iniciais ?? iniciaisDe(nome)}\n </span>\n )}\n </span>\n );\n}\n","import { useEffect, useRef, useState, type KeyboardEvent, type MouseEvent, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { normalizar } from '../../utils/texto';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { useCliqueFora } from '../../utils/useCliqueFora';\nimport './Busca.css';\n\nexport interface ItemBusca {\n rotulo: string;\n rota: string;\n icone?: IconeProp;\n /** Caminho no menu (ex.: \"Cadastros › Pessoas\"). */\n trilha?: string;\n}\n\nexport interface BuscaProps {\n placeholder?: string;\n /** Mostra spinner no lugar da lupa. */\n ocupado?: boolean;\n /** Itens de menu filtrados pelo termo (seção \"Menu\" do painel). */\n itensMenu?: ItemBusca[];\n aoNavegar?: (rota: string) => void;\n /** Enter sem item de menu ativo. */\n aoBuscar?: (termo: string) => void;\n aoMudarTermo?: (termo: string) => void;\n /** Ctrl+K / ⌘K foca a busca (padrão: sim). */\n atalho?: boolean;\n /** Resultados do app no painel; marque opções navegáveis com `data-busca-opcao`. */\n children?: ReactNode;\n className?: string;\n}\n\nconst MAX_MENU = 8;\n\n/** Busca global da topbar: filtra o menu e hospeda resultados do app. */\nexport function Busca({\n placeholder = 'Buscar…',\n ocupado,\n itensMenu,\n aoNavegar,\n aoBuscar,\n aoMudarTermo,\n atalho = true,\n children,\n className,\n}: BuscaProps) {\n const raiz = useRef<HTMLDivElement>(null);\n const campo = useRef<HTMLInputElement>(null);\n const [termo, setTermo] = useState('');\n const [aberto, setAberto] = useState(false);\n const [ativo, setAtivo] = useState(-1);\n\n useCliqueFora([raiz], aberto, () => setAberto(false));\n\n useEffect(() => {\n if (!atalho) return;\n const h = (e: globalThis.KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') {\n e.preventDefault();\n campo.current?.focus();\n }\n };\n window.addEventListener('keydown', h);\n return () => window.removeEventListener('keydown', h);\n }, [atalho]);\n\n const t = normalizar(termo.trim());\n const casam = t && itensMenu ? itensMenu.filter((i) => normalizar(`${i.rotulo} ${i.trilha ?? ''}`).includes(t)) : [];\n const menu = casam.slice(0, MAX_MENU);\n const excedente = casam.length - menu.length;\n\n // opções navegáveis: itens de menu + opções do app (data-busca-opcao)\n const opcoes = (): HTMLElement[] =>\n raiz.current ? [...raiz.current.querySelectorAll<HTMLElement>('.lp-pb-item, [data-busca-opcao]')] : [];\n\n useEffect(() => {\n opcoes().forEach((el, i) => el.classList.toggle('is-ativa', i === ativo));\n });\n\n const mudar = (v: string) => {\n setTermo(v);\n setAtivo(-1);\n setAberto(true);\n aoMudarTermo?.(v);\n };\n\n const navegar = (rota: string, e?: MouseEvent) => {\n if (aoNavegar) {\n e?.preventDefault();\n aoNavegar(rota);\n }\n setTermo('');\n setAberto(false);\n campo.current?.blur();\n };\n\n const aoTeclar = (e: KeyboardEvent<HTMLInputElement>) => {\n const lista = opcoes();\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n if (!lista.length) return;\n setAberto(true);\n const passo = e.key === 'ArrowDown' ? 1 : -1;\n setAtivo((a) => (a + passo + lista.length) % lista.length);\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (ativo >= 0 && lista[ativo]) lista[ativo].click();\n else aoBuscar?.(termo.trim());\n } else if (e.key === 'Escape') {\n if (termo) mudar('');\n else {\n setAberto(false);\n campo.current?.blur();\n }\n }\n };\n\n const temMenu = !!itensMenu;\n const mostrarPainel = aberto && (temMenu || !!children);\n\n return (\n <div ref={raiz} className={cx('lp-busca', className)}>\n <div className=\"lp-pb\" role=\"search\">\n <Icone icone={ocupado ? 'loader-circle' : 'search'} girar={ocupado} className=\"lp-pb-ic\" />\n <input\n ref={campo}\n type=\"search\"\n className=\"lp-pb-input\"\n role=\"combobox\"\n autoComplete=\"off\"\n aria-expanded={mostrarPainel}\n aria-autocomplete=\"list\"\n aria-label={placeholder}\n placeholder={placeholder}\n value={termo}\n onFocus={() => setAberto(true)}\n onChange={(e) => mudar(e.target.value)}\n onKeyDown={aoTeclar}\n />\n {atalho && (\n <kbd className=\"lp-pb-kbd\" aria-hidden=\"true\">\n Ctrl K\n </kbd>\n )}\n </div>\n <span className=\"lp-sr\" role=\"status\" aria-live=\"polite\">\n {t && temMenu ? `${casam.length} item(ns) de menu encontrado(s)` : ''}\n </span>\n\n {mostrarPainel && (\n <div className=\"lp-pb-painel\">\n {temMenu && (\n <div className={cx('lp-pb-menu', !menu.length && 'lp-pb-menu-sem-itens')}>\n {t ? (\n menu.length ? (\n <>\n <div className=\"lp-pb-ttl\">Menu</div>\n {menu.map((r) => (\n <a key={r.rota} className=\"lp-pb-item\" href={r.rota} onClick={(e) => navegar(r.rota, e)}>\n <Icone icone={r.icone ?? 'chevron-right'} />\n <span>{r.rotulo}</span>\n {r.trilha && <span className=\"lp-pb-trilha\">{r.trilha}</span>}\n </a>\n ))}\n {excedente > 0 && <p className=\"lp-pb-hint\">…e mais {excedente} itens no menu</p>}\n </>\n ) : (\n <p className=\"lp-pb-hint\">Nenhum item de menu encontrado.</p>\n )\n ) : (\n <p className=\"lp-pb-hint\">\n Digite para pesquisar — <kbd className=\"lp-pb-kbd\">Esc</kbd> limpa.\n </p>\n )}\n </div>\n )}\n {children && <div className=\"lp-pb-conteudo\">{children}</div>}\n </div>\n )}\n </div>\n );\n}\n","import { createContext, Fragment, useContext, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport './Trilha.css';\n\n/** Um passo da trilha. Sem `rota`, aparece como texto (grupo do menu). */\nexport interface ItemTrilha {\n rotulo: string;\n rota?: string;\n icone?: IconeProp;\n}\n\n/** Separadores prontos, ou qualquer nó React (ex.: `'|'` ou um ícone). */\nexport type SeparadorTrilha = 'chevron' | 'barra' | 'duplo' | 'seta' | 'til' | 'ponto' | ReactNode;\n\n/** Aparência da trilha — pode valer para o sistema todo (`Estrutura.modeloTrilha`). */\nexport interface ModeloTrilha {\n /** Padrão: `chevron` (›). */\n separador?: SeparadorTrilha;\n /** Ícones: só no Início (padrão), em todos os passos que têm, ou nenhum. */\n icones?: 'inicio' | 'todos' | 'nenhum';\n /** `simples` (padrão) · `fundo` = faixa com fundo suave. */\n aparencia?: 'simples' | 'fundo';\n}\n\ninterface CtxTrilha {\n /** Caminho da página atual, calculado do menu (já com \"Início\"). */\n itens: ItemTrilha[];\n /** Desenha um link pelo mesmo caminho dos links do menu (renderLink/aoNavegar). */\n link: (rota: string, conteudo: ReactNode, className: string) => ReactNode;\n /** Modelo padrão do sistema. */\n modelo?: ModeloTrilha;\n}\n\nconst TrilhaCtx = createContext<CtxTrilha | null>(null);\nexport const ProvedorTrilha = TrilhaCtx.Provider;\n\n/** Caminho calculado pela `Estrutura` para a rota atual (vazio fora dela). */\nexport function useTrilha(): ItemTrilha[] {\n return useContext(TrilhaCtx)?.itens ?? [];\n}\n\ninterface NoMenu {\n rotulo: string;\n rota?: string;\n icone?: IconeProp;\n filhos?: NoMenu[];\n}\n\n/**\n * Caminho no menu até o item da rota atual: seção › grupo(s) › item. Vence o\n * item de rota mais longa que casa (em `/pedidos/novo`, \"Novo pedido\" ganha\n * de \"Pedidos\").\n */\nexport function caminhoNoMenu(\n secoes: { rotulo?: string; itens: NoMenu[] }[],\n ativo: (rota?: string) => boolean,\n): ItemTrilha[] {\n let melhor: ItemTrilha[] = [];\n let tamanho = -1;\n const visitar = (itens: NoMenu[], pais: ItemTrilha[]) => {\n for (const item of itens) {\n if (item.rota && ativo(item.rota) && item.rota.length > tamanho) {\n melhor = [...pais, { rotulo: item.rotulo, rota: item.rota, icone: item.icone }];\n tamanho = item.rota.length;\n }\n if (item.filhos) visitar(item.filhos, [...pais, { rotulo: item.rotulo, icone: item.icone }]);\n }\n };\n for (const s of secoes) visitar(s.itens, s.rotulo ? [{ rotulo: s.rotulo }] : []);\n return melhor;\n}\n\nconst SEPARADORES: Record<string, ReactNode> = {\n chevron: <Icone icone=\"chevron-right\" />,\n barra: '/',\n duplo: '»',\n seta: <Icone icone=\"arrow-right\" />,\n til: '~',\n ponto: '•',\n};\n\nexport interface TrilhaProps extends ModeloTrilha {\n /** Passos explícitos. Sem a prop, usa o caminho calculado pela `Estrutura`. */\n itens?: ItemTrilha[];\n /** Passos acrescentados ao final do caminho automático (ex.: o registro aberto). */\n extras?: ItemTrilha[];\n /** Mostra mesmo com um passo só (por padrão, some: o título já diz onde se está). */\n mostrarUnico?: boolean;\n className?: string;\n}\n\n/**\n * Trilha de navegação (breadcrumb). O último passo é a página atual; os do\n * meio com rota são links. Em tela estreita vira só \"‹ nível de cima\".\n */\nexport function Trilha({ itens: explicitos, extras = [], mostrarUnico = false, separador, icones, aparencia, className }: TrilhaProps) {\n const ctx = useContext(TrilhaCtx);\n const itens = [...(explicitos ?? ctx?.itens ?? []), ...extras];\n if (!itens.length || (itens.length < 2 && !mostrarUnico)) return null;\n\n const modelo = ctx?.modelo ?? {};\n const sep = separador ?? modelo.separador ?? 'chevron';\n const modoIcones = icones ?? modelo.icones ?? 'inicio';\n const aparenciaFinal = aparencia ?? modelo.aparencia ?? 'simples';\n const marcaSep = typeof sep === 'string' && sep in SEPARADORES ? SEPARADORES[sep] : sep;\n\n const ultimo = itens.length - 1;\n const desenharLink = (it: ItemTrilha, conteudo: ReactNode, classe: string) =>\n ctx ? ctx.link(it.rota!, conteudo, classe) : <a href={it.rota} className={classe}>{conteudo}</a>;\n // nível de cima com destino: o único passo que aparece em tela estreita\n let pai = -1;\n for (let i = ultimo - 1; i >= 0; i--)\n if (itens[i].rota) {\n pai = i;\n break;\n }\n\n return (\n <nav className={cx('lp-trilha', `lp-trilha--${aparenciaFinal}`, className)} aria-label=\"Trilha de navegação\">\n <ol className=\"lp-trilha-lista\">\n {itens.map((it, i) => {\n const comIcone = !!it.icone && (modoIcones === 'todos' || (modoIcones === 'inicio' && i === 0));\n const conteudo = (\n <Fragment>\n {comIcone && <Icone icone={it.icone} className=\"lp-trilha-ic\" />}\n <span className=\"lp-trilha-rot\">{it.rotulo}</span>\n </Fragment>\n );\n return (\n <li key={`${i}-${it.rotulo}`} className={cx('lp-trilha-item', i === pai && 'is-pai')}>\n {i > 0 && (\n <span className=\"lp-trilha-sep\" aria-hidden=\"true\">\n {marcaSep}\n </span>\n )}\n {i === ultimo ? (\n <span className=\"lp-trilha-atual\" aria-current=\"page\" title={it.rotulo}>\n {conteudo}\n </span>\n ) : it.rota ? (\n desenharLink(\n it,\n <>\n <Icone icone=\"chevron-left\" className=\"lp-trilha-voltar\" />\n {conteudo}\n </>,\n 'lp-trilha-link',\n )\n ) : (\n <span className=\"lp-trilha-grupo\" title={it.rotulo}>\n {conteudo}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import {\n Fragment,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { useCliqueFora } from '../../utils/useCliqueFora';\nimport { Avatar } from '../Avatar/Avatar';\nimport { Busca, type ItemBusca } from '../Busca/Busca';\nimport { Dica } from '../Dica/Dica';\nimport { ProvedorTrilha, caminhoNoMenu, type ItemTrilha, type ModeloTrilha } from '../Trilha/Trilha';\nimport { usePreferenciasOpcional, type Densidade } from '../Preferencias/Preferencias';\nimport './Estrutura.css';\n\nexport interface ItemNav {\n rotulo: string;\n icone?: IconeProp;\n /** Folha: destino. Grupo: omita e use `filhos`. */\n rota?: string;\n filhos?: ItemNav[];\n desabilitado?: boolean;\n}\n\nexport interface SecaoNav {\n /** Rótulo do grupo (linha em caixa alta). */\n rotulo?: string;\n itens: ItemNav[];\n}\n\nexport interface Marca {\n nome: string;\n subtitulo?: string;\n /** URL da imagem do logo (sem ela, mostra um escudo). */\n logo?: string;\n href?: string;\n}\n\nexport interface UsuarioEstrutura {\n nome: string;\n cargo?: string;\n foto?: string;\n iniciais?: string;\n}\n\nexport interface ItemMenu {\n id: string;\n rotulo: string;\n icone?: string;\n destrutivo?: boolean;\n divisorAntes?: boolean;\n}\n\nexport interface Notificacao {\n id: string;\n titulo: string;\n descricao?: string;\n tempo?: string;\n icone?: string;\n naoLida?: boolean;\n}\n\n/** Props entregues a `renderLink` (para usar o <Link> do seu roteador). */\nexport interface PropsLink {\n href: string;\n className: string;\n children: ReactNode;\n onClick: (e: MouseEvent<HTMLAnchorElement>) => void;\n 'aria-current'?: 'page';\n 'aria-disabled'?: boolean;\n}\n\nexport interface EstruturaProps {\n marca: Marca;\n nav: SecaoNav[];\n /** Rota atual — marca o item ativo (ex.: `location.pathname`). */\n rotaAtual?: string;\n /** Navegação SPA: recebe a rota e evita o reload. */\n aoNavegar?: (rota: string) => void;\n /** Renderiza os links com o componente do seu roteador. */\n renderLink?: (props: PropsLink, item: ItemNav) => ReactNode;\n usuario?: UsuarioEstrutura;\n menuUsuario?: ItemMenu[];\n aoEscolherMenuUsuario?: (id: string) => void;\n /** Lista de notificações. Sem a prop, o sino não aparece. */\n notificacoes?: Notificacao[];\n aoEscolherNotificacao?: (id: string) => void;\n /** Menu de ferramentas de desenvolvimento (não passe em produção). */\n menuDesenvolvimento?: ItemMenu[];\n aoEscolherMenuDesenvolvimento?: (id: string) => void;\n /** Tarja de ambiente no topo da sidebar (Homologação, Treinamento…). */\n ambiente?: {\n rotulo: string;\n severidade?: 'warn' | 'err' | 'info' | 'neutral';\n /** Texto curto para a sidebar recolhida (padrão: 3 primeiras letras, ex.: \"HOM\"). */\n sigla?: string;\n };\n versao?: string;\n /**\n * Como os grupos do menu abrem com a sidebar expandida: `abaixo` (padrão,\n * sanfona dentro da própria sidebar) ou `lateral` (painel ao lado). Com a\n * sidebar recolhida, sempre abre o painel lateral.\n */\n submenu?: 'abaixo' | 'lateral';\n /** Modelo padrão das trilhas de navegação do sistema (separador, ícones, aparência). */\n modeloTrilha?: ModeloTrilha;\n /** Conteúdo do rodapé da sidebar (marca do ecossistema, links…). */\n rodapeSidebar?: ReactNode;\n /** Rodapé da área de conteúdo, sempre visível no pé da tela (autoria, direitos, links…). */\n rodape?: ReactNode;\n /** Substitui a busca padrão (filtro do menu). `false` remove. */\n busca?: ReactNode | false;\n placeholderBusca?: string;\n aoBuscar?: (termo: string) => void;\n /** Controles extras à direita da topbar. */\n complementosTopbar?: ReactNode;\n children?: ReactNode;\n}\n\nconst DENSIDADES: Array<{ valor: Densidade; rotulo: string; icone: string }> = [\n { valor: 'compacta', rotulo: 'Compacta', icone: 'minus' },\n { valor: 'confortavel', rotulo: 'Confortável', icone: 'equal' },\n { valor: 'espacosa', rotulo: 'Espaçosa', icone: 'menu' },\n];\n\ntype Menu = 'densidade' | 'dev' | 'sino' | 'usuario' | 'compacto' | null;\n\nconst CHAVE_SIDEBAR = 'lp-sidebar-expandida';\n\nfunction useMedia(consulta: string) {\n const [casa, setCasa] = useState(() => typeof window !== 'undefined' && window.matchMedia(consulta).matches);\n useEffect(() => {\n const mq = window.matchMedia(consulta);\n const h = () => setCasa(mq.matches);\n h();\n mq.addEventListener('change', h);\n return () => mq.removeEventListener('change', h);\n }, [consulta]);\n return casa;\n}\n\nfunction lerExpandida(): boolean {\n try {\n return localStorage.getItem(CHAVE_SIDEBAR) !== '0';\n } catch {\n return true;\n }\n}\n\nfunction achatar(nav: SecaoNav[]): ItemBusca[] {\n const lista: ItemBusca[] = [];\n const visitar = (itens: ItemNav[], trilha: string[], icone?: IconeProp) => {\n for (const i of itens) {\n if (i.desabilitado) continue;\n if (i.filhos?.length) visitar(i.filhos, [...trilha, i.rotulo], i.icone ?? icone);\n else if (i.rota) lista.push({ rotulo: i.rotulo, rota: i.rota, icone: i.icone ?? icone, trilha: trilha.join(' › ') || undefined });\n }\n };\n nav.forEach((s) => visitar(s.itens, s.rotulo ? [s.rotulo] : []));\n return lista;\n}\n\nfunction ItensMenu({ itens, aoEscolher }: { itens: ItemMenu[]; aoEscolher: (id: string) => void }) {\n return (\n <>\n {itens.map((item) => (\n <Fragment key={item.id}>\n {item.divisorAntes && <div className=\"lp-tb-menu-ln\" aria-hidden=\"true\" />}\n <button type=\"button\" className={cx('lp-tb-menu-item', item.destrutivo && 'lp-danger')} onClick={() => aoEscolher(item.id)}>\n {item.icone && <Icone icone={item.icone} />}\n <span>{item.rotulo}</span>\n </button>\n </Fragment>\n ))}\n </>\n );\n}\n\n/**\n * Moldura do app autenticado: sidebar recolhível (com submenu em painel\n * lateral), topbar com busca, densidade, tema, notificações e perfil.\n * Responsiva: abaixo de 64rem a sidebar vira sobreposição; abaixo de 48rem,\n * gaveta com hambúrguer.\n */\nexport function Estrutura({\n marca,\n nav,\n rotaAtual,\n aoNavegar,\n renderLink,\n usuario,\n menuUsuario = [],\n aoEscolherMenuUsuario,\n notificacoes,\n aoEscolherNotificacao,\n menuDesenvolvimento = [],\n aoEscolherMenuDesenvolvimento,\n ambiente,\n versao,\n rodapeSidebar,\n rodape,\n modeloTrilha,\n submenu = 'abaixo',\n busca,\n placeholderBusca = 'Buscar no sistema…',\n aoBuscar,\n complementosTopbar,\n children,\n}: EstruturaProps) {\n const prefs = usePreferenciasOpcional();\n const idConteudo = `lp-conteudo-${useId().replace(/:/g, '')}`;\n const estreito = useMedia('(max-width: 64rem)');\n const movel = useMedia('(max-width: 48rem)');\n\n const [expandida, setExpandida] = useState(() => !estreito && lerExpandida());\n const [aside, setAside] = useState<string | null>(null);\n // altura (px) do item que abriu o cartão flutuante, com a sidebar recolhida\n const [asideTopo, setAsideTopo] = useState(0);\n const [subAbertos, setSubAbertos] = useState<Set<string>>(new Set());\n const [menu, setMenu] = useState<Menu>(null);\n const [logoOk, setLogoOk] = useState(true);\n\n const sidebarRef = useRef<HTMLElement>(null);\n const asideRef = useRef<HTMLDivElement>(null);\n const direitaRef = useRef<HTMLDivElement>(null);\n const conteudoRef = useRef<HTMLElement>(null);\n\n // telas estreitas nascem (e voltam) recolhidas\n useEffect(() => {\n if (estreito) setExpandida(false);\n else setExpandida(lerExpandida());\n }, [estreito]);\n\n // página nova começa do topo (o scroll é do <main>, não da janela)\n useEffect(() => {\n conteudoRef.current?.scrollTo({ top: 0 });\n }, [rotaAtual]);\n\n const alternarSidebar = () => {\n setExpandida((e) => {\n const nova = !e;\n if (!estreito) {\n try {\n localStorage.setItem(CHAVE_SIDEBAR, nova ? '1' : '0');\n } catch {\n /* sem armazenamento: segue */\n }\n }\n return nova;\n });\n };\n\n const fecharMenus = useCallback(() => setMenu(null), []);\n const fecharAside = useCallback(() => setAside(null), []);\n useCliqueFora([direitaRef], menu !== null, fecharMenus);\n useCliqueFora([sidebarRef, asideRef], aside !== null, fecharAside);\n\n useEffect(() => {\n if (!menu && !aside) return;\n const esc = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n setMenu(null);\n setAside(null);\n };\n window.addEventListener('keydown', esc);\n return () => window.removeEventListener('keydown', esc);\n }, [menu, aside]);\n\n // Só UM item fica ativo: o de rota mais específica que casa com a atual.\n // Em /pedidos/novo, \"Novo pedido\" ganha de \"Pedidos\"; em /perfil/editar (fora\n // do menu), o prefixo ainda acende \"Meu perfil\".\n const rotaAtiva = useMemo(() => {\n if (!rotaAtual) return undefined;\n const casa = (rota: string) =>\n rota === '/' ? rotaAtual === '/' : rotaAtual === rota || rotaAtual.startsWith(rota.endsWith('/') ? rota : `${rota}/`);\n let melhor: string | undefined;\n const visitar = (itens: ItemNav[]) => {\n for (const i of itens) {\n if (i.rota && casa(i.rota) && (!melhor || i.rota.length > melhor.length)) melhor = i.rota;\n if (i.filhos) visitar(i.filhos);\n }\n };\n nav.forEach((secao) => visitar(secao.itens));\n return melhor;\n }, [nav, rotaAtual]);\n const ativo = useCallback((rota?: string) => !!rota && rota === rotaAtiva, [rotaAtiva]);\n const grupoAtivo = (item: ItemNav): boolean => !!item.filhos?.some((f) => ativo(f.rota) || grupoAtivo(f));\n\n // sanfona: com a sidebar expandida os grupos abrem para baixo\n const emLinha = submenu === 'abaixo' && expandida;\n const alternarGrupo = (chave: string) =>\n setSubAbertos((s) => {\n const n = new Set(s);\n if (n.has(chave)) n.delete(chave);\n else n.add(chave);\n return n;\n });\n // ao chegar numa página, o(s) grupo(s) dela abrem (e o usuário ainda pode fechar)\n useEffect(() => {\n const chaves: string[] = [];\n const visitar = (itens: ItemNav[], pai: string): boolean => {\n let achou = false;\n for (const i of itens) {\n const chave = pai ? `${pai}›${i.rotulo}` : i.rotulo;\n if (i.filhos && visitar(i.filhos, chave)) {\n chaves.push(chave);\n achou = true;\n } else if (!i.filhos && ativo(i.rota)) achou = true;\n }\n return achou;\n };\n nav.forEach((s) => visitar(s.itens, ''));\n if (chaves.length) setSubAbertos((s) => new Set([...s, ...chaves]));\n }, [nav, ativo]);\n // passou a abrir para baixo: o painel lateral sai\n useEffect(() => {\n if (emLinha) setAside(null);\n }, [emLinha]);\n\n const aoNavegou = () => {\n setAside(null);\n if (estreito) setExpandida(false);\n };\n\n const link = (item: ItemNav, className: string, conteudo: ReactNode) => {\n const on = ativo(item.rota);\n const props: PropsLink = {\n href: item.rota ?? '#',\n className: cx(className, on && 'lp-active', item.desabilitado && 'lp-is-disabled'),\n 'aria-current': on ? 'page' : undefined,\n 'aria-disabled': item.desabilitado || undefined,\n children: conteudo,\n onClick: (e) => {\n if (item.desabilitado) {\n e.preventDefault();\n return;\n }\n if (aoNavegar && item.rota) {\n e.preventDefault();\n aoNavegar(item.rota);\n }\n aoNavegou();\n },\n };\n return renderLink ? renderLink(props, item) : <a {...props} />;\n };\n\n // trilha da página atual: Início › seção › grupo(s) › item do menu\n const trilha = useMemo(() => {\n const inicio: ItemTrilha = { rotulo: 'Início', rota: marca.href ?? '/', icone: 'house' };\n const caminho = caminhoNoMenu(nav, ativo);\n const fim = caminho[caminho.length - 1];\n return {\n itens: !fim || fim.rota === inicio.rota ? [inicio] : [inicio, ...caminho],\n link: (rota: string, conteudo: ReactNode, className: string) => link({ rotulo: '', rota }, className, conteudo),\n modelo: modeloTrilha,\n };\n // `link` lê aoNavegar/renderLink do render atual\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nav, ativo, marca.href, aoNavegar, renderLink, modeloTrilha]);\n\n /** Filhos de um grupo aberto para baixo (qualquer profundidade). */\n const renderFilhos = (itens: ItemNav[], chavePai: string): ReactNode =>\n itens.map((filho) => {\n if (!filho.filhos?.length) {\n return (\n <Fragment key={filho.rotulo}>\n {link(\n filho,\n 'lp-nav-sub',\n <>\n <span className=\"lp-nav-sub-ic\">\n <Icone icone={filho.icone ?? 'chevron-right'} />\n </span>\n <span className=\"lp-nav-sub-tx\">{filho.rotulo}</span>\n </>,\n )}\n </Fragment>\n );\n }\n const chave = `${chavePai}›${filho.rotulo}`;\n const aberto = subAbertos.has(chave);\n return (\n <div key={filho.rotulo} className={cx('lp-nav-sub-grp', aberto && 'lp-sub-open', grupoAtivo(filho) && 'lp-has-active')}>\n <button\n type=\"button\"\n className={cx('lp-nav-sub lp-nav-sub-parent', filho.desabilitado && 'lp-is-disabled')}\n disabled={filho.desabilitado}\n aria-expanded={aberto}\n onClick={() => alternarGrupo(chave)}\n >\n <span className=\"lp-nav-sub-ic\">\n <Icone icone={filho.icone ?? 'folder'} />\n </span>\n <span className=\"lp-nav-sub-tx\">{filho.rotulo}</span>\n <Icone icone=\"chevron-down\" className=\"lp-nav-ch lp-nav-ch--gira\" />\n </button>\n {aberto && (\n <div className=\"lp-nav-sub-netos\" role=\"group\" aria-label={filho.rotulo}>\n {renderFilhos(filho.filhos, chave)}\n </div>\n )}\n </div>\n );\n });\n\n const itensBusca = useMemo(() => achatar(nav), [nav]);\n const itemAside = useMemo(() => {\n for (const s of nav) for (const i of s.itens) if (i.rotulo === aside && i.filhos) return i;\n return null;\n }, [nav, aside]);\n\n const naoLidas = notificacoes?.filter((n) => n.naoLida).length ?? 0;\n const temDev = menuDesenvolvimento.length > 0;\n const densidadeAtual = DENSIDADES.find((d) => d.valor === prefs?.densidade) ?? DENSIDADES[1];\n\n const alternarMenu = (m: Exclude<Menu, null>) => setMenu((atual) => (atual === m ? null : m));\n const escolher = (fn?: (id: string) => void) => (id: string) => {\n setMenu(null);\n fn?.(id);\n };\n\n const avatar = usuario && (\n <Avatar className=\"lp-avatar-topo\" tom=\"escuro\" tamanho=\"1.875rem\" nome={usuario.nome} foto={usuario.foto} iniciais={usuario.iniciais} />\n );\n\n const cabecalhoUsuario = usuario && (\n <div className=\"lp-tb-menu-head\">\n {avatar}\n <div className=\"lp-tb-menu-head-tx\">\n <div className=\"lp-profile-name\">{usuario.nome}</div>\n {usuario.cargo && <div className=\"lp-profile-role\">{usuario.cargo}</div>}\n </div>\n </div>\n );\n\n const menuDensidade = prefs && (\n <>\n {DENSIDADES.map((d) => (\n <button\n key={d.valor}\n type=\"button\"\n className={cx('lp-tb-menu-item', prefs.densidade === d.valor && 'lp-active')}\n aria-pressed={prefs.densidade === d.valor}\n onClick={() => prefs.definirDensidade(d.valor)}\n >\n <Icone icone={d.icone} />\n <span>{d.rotulo}</span>\n {prefs.densidade === d.valor && <Icone icone=\"check\" className=\"lp-tb-menu-check\" />}\n </button>\n ))}\n </>\n );\n\n const buscaPadrao =\n busca === undefined ? (\n <Busca placeholder={placeholderBusca} itensMenu={itensBusca} aoNavegar={aoNavegar} aoBuscar={aoBuscar} />\n ) : (\n busca || null\n );\n\n return (\n <div className=\"lp-estrutura\">\n <div className={cx('lp-layout', expandida && 'lp-sidebar-expanded', estreito && 'lp-vp-narrow', movel && 'lp-vp-mobile')}>\n <a\n className=\"lp-skip-link\"\n href={`#${idConteudo}`}\n onClick={(e) => {\n e.preventDefault();\n conteudoRef.current?.focus();\n }}\n >\n Pular para o conteúdo\n </a>\n {estreito && expandida && <div className=\"lp-sidebar-backdrop\" aria-hidden=\"true\" onClick={() => setExpandida(false)} />}\n\n {/* ===== SIDEBAR ===== */}\n <aside className=\"lp-sidebar\" ref={sidebarRef}>\n {ambiente?.rotulo && (\n <div className=\"lp-amb\" data-sev={ambiente.severidade ?? 'warn'} title={ambiente.rotulo}>\n <span className=\"lp-sr\">Ambiente:</span>\n <span className=\"lp-amb-completo\">{ambiente.rotulo}</span>\n <span className=\"lp-amb-sigla\" aria-hidden=\"true\">\n {ambiente.sigla ?? ambiente.rotulo.slice(0, 3)}\n </span>\n </div>\n )}\n <div className=\"lp-sidebar-head\">\n <a\n className=\"lp-brand-logo\"\n href={marca.href ?? '/'}\n aria-label={marca.nome}\n onClick={(e) => {\n if (aoNavegar) {\n e.preventDefault();\n aoNavegar(marca.href ?? '/');\n }\n }}\n >\n {marca.logo && logoOk ? (\n <img className=\"lp-brand-img\" src={marca.logo} alt=\"\" onError={() => setLogoOk(false)} />\n ) : (\n <Icone icone=\"shield\" />\n )}\n </a>\n <span className=\"lp-brand-name\">\n <b>{marca.nome}</b>\n {marca.subtitulo && <span>{marca.subtitulo}</span>}\n </span>\n <Dica texto={expandida ? 'Recolher menu' : 'Expandir menu'}>\n <button\n type=\"button\"\n className=\"lp-ham\"\n onClick={alternarSidebar}\n aria-label={expandida ? 'Recolher menu' : 'Expandir menu'}\n aria-expanded={expandida}\n >\n <Icone icone=\"chevrons-left\" />\n </button>\n </Dica>\n </div>\n\n <div className=\"lp-sidebar-divline\" />\n\n <nav className=\"lp-sidebar-nav\" aria-label=\"Menu principal\" onScroll={!expandida && aside ? fecharAside : undefined}>\n {nav.map((sec, si) => (\n <Fragment key={si}>\n {sec.rotulo && (\n <div className=\"lp-sidebar-grp\">\n <span>{sec.rotulo}</span>\n <span className=\"lp-sidebar-grp-ln\" />\n </div>\n )}\n <div className=\"lp-sidebar-items\">\n {sec.itens.map((item) =>\n !item.filhos ? (\n <Dica key={item.rotulo} texto={expandida ? undefined : item.rotulo} posicao=\"direita\" atraso={150}>\n {link(\n item,\n 'lp-nav-it',\n <>\n <span className=\"lp-nav-tile\">\n <Icone icone={item.icone ?? 'circle'} />\n </span>\n <span className=\"lp-nav-tx\">{item.rotulo}</span>\n </>,\n )}\n </Dica>\n ) : (\n emLinha ? (\n <div\n key={item.rotulo}\n className={cx('lp-nav-group', subAbertos.has(item.rotulo) && 'lp-grupo-aberto', grupoAtivo(item) && 'lp-has-active')}\n >\n <button\n type=\"button\"\n className={cx('lp-nav-it lp-nav-parent', item.desabilitado && 'lp-is-disabled')}\n disabled={item.desabilitado}\n aria-expanded={subAbertos.has(item.rotulo)}\n onClick={() => alternarGrupo(item.rotulo)}\n >\n <span className=\"lp-nav-tile\">\n <Icone icone={item.icone ?? 'folder'} />\n </span>\n <span className=\"lp-nav-tx\">{item.rotulo}</span>\n <Icone icone=\"chevron-down\" className=\"lp-nav-ch lp-nav-ch--gira\" />\n </button>\n {subAbertos.has(item.rotulo) && (\n <div className=\"lp-nav-filhos\" role=\"group\" aria-label={item.rotulo}>\n {renderFilhos(item.filhos, item.rotulo)}\n </div>\n )}\n </div>\n ) : (\n <div\n key={item.rotulo}\n className={cx('lp-nav-group', aside === item.rotulo && 'lp-aside-on', grupoAtivo(item) && 'lp-has-active')}\n >\n <button\n type=\"button\"\n className={cx('lp-nav-it lp-nav-parent', item.desabilitado && 'lp-is-disabled')}\n disabled={item.desabilitado}\n aria-expanded={aside === item.rotulo}\n onClick={(e) => {\n setAsideTopo(e.currentTarget.getBoundingClientRect().top);\n setAside((a) => (a === item.rotulo ? null : item.rotulo));\n }}\n >\n <span className=\"lp-nav-tile\">\n <Icone icone={item.icone ?? 'folder'} />\n </span>\n <span className=\"lp-nav-tx\">{item.rotulo}</span>\n <Icone icone=\"chevron-right\" className=\"lp-nav-ch\" />\n </button>\n </div>\n )\n ),\n )}\n </div>\n </Fragment>\n ))}\n </nav>\n\n {(rodapeSidebar || versao) && (\n <div className=\"lp-sidebar-foot\">\n <div className=\"lp-sidebar-divline\" />\n {rodapeSidebar && <div className=\"lp-sidebar-rodape\">{rodapeSidebar}</div>}\n {versao && (\n <span className=\"lp-versao\">\n <span className=\"lp-sr\">Versão do sistema:</span>\n {versao}\n </span>\n )}\n </div>\n )}\n </aside>\n\n {/* ===== PAINEL DE SUBMENU ===== */}\n {itemAside && (\n <div\n className={cx('lp-sidebar-aside', !expandida && 'lp-aside--flutuante')}\n ref={asideRef}\n role=\"region\"\n aria-label={`Submenu ${itemAside.rotulo}`}\n style={!expandida ? ({ '--aside-topo': `${Math.max(8, Math.min(asideTopo, window.innerHeight - 320))}px` } as CSSProperties) : undefined}\n >\n <div className=\"lp-aside-head\">\n <span className=\"lp-aside-ic\">\n <Icone icone={itemAside.icone ?? 'folder'} />\n </span>\n <span className=\"lp-aside-ttl\">{itemAside.rotulo}</span>\n <button type=\"button\" className=\"lp-aside-x\" aria-label=\"Fechar submenu\" title=\"Fechar\" onClick={() => setAside(null)}>\n <Icone icone=\"x\" />\n </button>\n </div>\n <div className=\"lp-aside-corpo\">\n {itemAside.filhos!.map((filho) => {\n if (!filho.filhos?.length) {\n return (\n <Fragment key={filho.rotulo}>\n {link(\n filho,\n 'lp-nav-sub',\n <>\n <span className=\"lp-nav-sub-ic\">\n <Icone icone={filho.icone ?? 'chevron-right'} />\n </span>\n <span className=\"lp-nav-sub-tx\">{filho.rotulo}</span>\n </>,\n )}\n </Fragment>\n );\n }\n const chave = `${itemAside.rotulo}›${filho.rotulo}`;\n const aberto = subAbertos.has(chave) || grupoAtivo(filho);\n return (\n <div key={filho.rotulo} className={cx('lp-nav-sub-grp', aberto && 'lp-sub-open', grupoAtivo(filho) && 'lp-has-active')}>\n <button\n type=\"button\"\n className={cx('lp-nav-sub lp-nav-sub-parent', filho.desabilitado && 'lp-is-disabled')}\n disabled={filho.desabilitado}\n aria-expanded={aberto}\n onClick={() =>\n setSubAbertos((s) => {\n const n = new Set(s);\n if (n.has(chave)) n.delete(chave);\n else n.add(chave);\n return n;\n })\n }\n >\n <span className=\"lp-nav-sub-ic\">\n <Icone icone={filho.icone ?? 'folder'} />\n </span>\n <span className=\"lp-nav-sub-tx\">{filho.rotulo}</span>\n <Icone icone={aberto ? 'chevron-up' : 'chevron-down'} className=\"lp-nav-ch\" />\n </button>\n {aberto && (\n <div className=\"lp-nav-sub-netos\" role=\"group\" aria-label={filho.rotulo}>\n {filho.filhos.map((neto) => (\n <Fragment key={neto.rotulo}>\n {link(\n neto,\n 'lp-nav-sub lp-nav-sub-neto',\n <>\n <span className=\"lp-nav-sub-ic\">\n <Icone icone={neto.icone ?? 'chevron-right'} />\n </span>\n <span className=\"lp-nav-sub-tx\">{neto.rotulo}</span>\n </>,\n )}\n </Fragment>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {/* ===== MAIN ===== */}\n <div className=\"lp-main\">\n <header className=\"lp-topbar\">\n {movel && (\n <button type=\"button\" className=\"lp-tb-icon\" onClick={alternarSidebar} aria-label=\"Abrir menu\" aria-expanded={expandida}>\n <Icone icone=\"menu\" />\n </button>\n )}\n {!expandida && (\n <span className=\"lp-tb-system\">\n <b>{marca.nome}</b>\n {marca.subtitulo && <span>{marca.subtitulo}</span>}\n </span>\n )}\n\n {!movel && buscaPadrao}\n\n <div className=\"lp-tb-right\" ref={direitaRef}>\n {!movel && (\n <>\n {complementosTopbar}\n {prefs && (\n <div className=\"lp-tb-menu-wrap\">\n <Dica texto={`Densidade: ${densidadeAtual.rotulo}`}>\n <button\n type=\"button\"\n className={cx('lp-tb-icon', menu === 'densidade' && 'lp-menu-open')}\n aria-expanded={menu === 'densidade'}\n aria-label={`Densidade: ${densidadeAtual.rotulo}`}\n onClick={() => alternarMenu('densidade')}\n >\n <Icone icone={densidadeAtual.icone} />\n </button>\n </Dica>\n {menu === 'densidade' && (\n <div className=\"lp-tb-menu\" role=\"group\" aria-label=\"Densidade\">\n <div className=\"lp-tb-menu-ttl\">Densidade</div>\n {menuDensidade}\n </div>\n )}\n </div>\n )}\n\n {temDev && (\n <div className=\"lp-tb-menu-wrap\">\n <Dica texto=\"Desenvolvimento\">\n <button\n type=\"button\"\n className={cx('lp-tb-icon', menu === 'dev' && 'lp-menu-open')}\n aria-expanded={menu === 'dev'}\n aria-label=\"Desenvolvimento\"\n onClick={() => alternarMenu('dev')}\n >\n <Icone icone=\"code\" />\n </button>\n </Dica>\n {menu === 'dev' && (\n <div className=\"lp-tb-menu\" role=\"group\" aria-label=\"Desenvolvimento\">\n <ItensMenu itens={menuDesenvolvimento} aoEscolher={escolher(aoEscolherMenuDesenvolvimento)} />\n </div>\n )}\n </div>\n )}\n\n {prefs && (\n <Dica texto={prefs.escuro ? 'Tema claro' : 'Tema escuro'}>\n <button\n type=\"button\"\n className=\"lp-tb-icon\"\n aria-label={prefs.escuro ? 'Tema claro' : 'Tema escuro'}\n onClick={prefs.alternarTema}\n >\n <Icone icone={prefs.escuro ? 'sun' : 'moon'} />\n </button>\n </Dica>\n )}\n </>\n )}\n\n {notificacoes && (\n <div className=\"lp-tb-menu-wrap\">\n <Dica texto=\"Notificações\">\n <button\n type=\"button\"\n className={cx('lp-tb-icon lp-tb-bell', menu === 'sino' && 'lp-menu-open')}\n aria-expanded={menu === 'sino'}\n aria-label={naoLidas ? `Notificações: ${naoLidas} não lida(s)` : 'Notificações'}\n onClick={() => alternarMenu('sino')}\n >\n <Icone icone=\"bell\" />\n {naoLidas > 0 && <span className=\"lp-bell-dot\" aria-hidden=\"true\" />}\n </button>\n </Dica>\n {menu === 'sino' && (\n <div className=\"lp-tb-menu lp-tb-menu-notif\" role=\"group\" aria-label=\"Notificações\">\n <div className=\"lp-tb-menu-ttl\">\n <span>Notificações</span>\n {naoLidas > 0 && <span className=\"lp-notif-count\">{naoLidas} não lida(s)</span>}\n </div>\n {notificacoes.length ? (\n notificacoes.map((n) => (\n <button\n key={n.id}\n type=\"button\"\n className={cx('lp-tb-menu-item lp-notif-item', n.naoLida && 'lp-unread')}\n onClick={() => escolher(aoEscolherNotificacao)(n.id)}\n >\n <span className=\"lp-notif-ic\">\n <Icone icone={n.icone ?? 'bell'} />\n </span>\n <span className=\"lp-notif-tx\">\n <span className=\"lp-notif-ttl\">{n.titulo}</span>\n {n.descricao && <span className=\"lp-notif-desc\">{n.descricao}</span>}\n {n.tempo && <span className=\"lp-notif-time\">{n.tempo}</span>}\n </span>\n {n.naoLida && <span className=\"lp-notif-dot\" aria-hidden=\"true\" />}\n </button>\n ))\n ) : (\n <p className=\"lp-notif-empty\">\n <Icone icone=\"circle-check\" />\n Tudo em dia — sem notificações.\n </p>\n )}\n </div>\n )}\n </div>\n )}\n\n {usuario &&\n (!movel ? (\n <>\n <span className=\"lp-tb-divider\" />\n <div className=\"lp-tb-menu-wrap\">\n <button\n type=\"button\"\n className={cx('lp-profile', !menuUsuario.length && 'lp-no-menu')}\n aria-expanded={menuUsuario.length ? menu === 'usuario' : undefined}\n aria-label={`Usuário: ${usuario.nome}`}\n onClick={() => menuUsuario.length && alternarMenu('usuario')}\n >\n {avatar}\n <div className=\"lp-profile-info\">\n <div className=\"lp-profile-name\">{usuario.nome}</div>\n {usuario.cargo && <div className=\"lp-profile-role\">{usuario.cargo}</div>}\n </div>\n {menuUsuario.length > 0 && (\n <Icone icone=\"chevron-down\" className={cx('lp-profile-caret', menu === 'usuario' && 'lp-caret-open')} />\n )}\n </button>\n {menu === 'usuario' && (\n <div className=\"lp-tb-menu lp-tb-menu-user\" role=\"group\" aria-label=\"Menu do usuário\">\n {cabecalhoUsuario}\n <ItensMenu itens={menuUsuario} aoEscolher={escolher(aoEscolherMenuUsuario)} />\n </div>\n )}\n </div>\n </>\n ) : (\n <div className=\"lp-tb-menu-wrap\">\n <button\n type=\"button\"\n className=\"lp-profile\"\n aria-expanded={menu === 'compacto'}\n aria-label={`Conta e preferências: ${usuario.nome}`}\n onClick={() => alternarMenu('compacto')}\n >\n {avatar}\n </button>\n {menu === 'compacto' && (\n <div className=\"lp-tb-menu lp-tb-menu-compact\" role=\"group\" aria-label=\"Conta e preferências\">\n {cabecalhoUsuario}\n {aoBuscar && (\n <div className=\"lp-cm-search\" role=\"search\">\n <Icone icone=\"search\" />\n <input\n type=\"search\"\n className=\"lp-cm-search-input\"\n placeholder={placeholderBusca}\n aria-label=\"Busca global\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n aoBuscar(e.currentTarget.value.trim());\n setMenu(null);\n }\n }}\n />\n </div>\n )}\n {prefs && (\n <>\n <div className=\"lp-tb-menu-ttl\">Aparência</div>\n <button type=\"button\" className=\"lp-tb-menu-item\" onClick={prefs.alternarTema}>\n <Icone icone={prefs.escuro ? 'sun' : 'moon'} />\n <span>{prefs.escuro ? 'Tema claro' : 'Tema escuro'}</span>\n </button>\n </>\n )}\n {temDev && (\n <>\n <div className=\"lp-tb-menu-ttl\">Desenvolvimento</div>\n <ItensMenu itens={menuDesenvolvimento} aoEscolher={escolher(aoEscolherMenuDesenvolvimento)} />\n </>\n )}\n {prefs && (\n <>\n <div className=\"lp-tb-menu-ttl\">Densidade</div>\n {menuDensidade}\n </>\n )}\n {menuUsuario.length > 0 && (\n <>\n <div className=\"lp-tb-menu-ln\" aria-hidden=\"true\" />\n <ItensMenu itens={menuUsuario} aoEscolher={escolher(aoEscolherMenuUsuario)} />\n </>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n </header>\n\n <main className=\"lp-content\" id={idConteudo} ref={conteudoRef} tabIndex={-1}>\n <div className=\"lp-content-inner\">\n <ProvedorTrilha value={trilha}>{children}</ProvedorTrilha>\n </div>\n </main>\n {rodape && <footer className=\"lp-rodape\">{rodape}</footer>}\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { Trilha, type ItemTrilha } from '../Trilha/Trilha';\nimport './CabecalhoPagina.css';\n\nexport interface CabecalhoPaginaProps {\n titulo: string;\n icone?: IconeProp;\n /** Linha pequena em caixa alta acima do título. */\n categoria?: string;\n /**\n * Trilha de navegação logo abaixo do título. `true` = caminho automático do\n * menu (via `Estrutura`); lista = automático + estes passos no fim (ex.: o\n * registro aberto).\n */\n trilha?: boolean | ItemTrilha[];\n /** Botões à direita do título. */\n acoes?: ReactNode;\n /** Texto descritivo abaixo. */\n children?: ReactNode;\n className?: string;\n}\n\nexport function CabecalhoPagina({ titulo, icone, categoria, trilha, acoes, children, className }: CabecalhoPaginaProps) {\n return (\n <header className={cx('lp-cab', className)}>\n <div className=\"lp-cab-topo\">\n {icone && (\n <span className=\"lp-cab-tile\">\n <Icone icone={icone} />\n </span>\n )}\n <div className=\"lp-cab-titulos\">\n {categoria && <p className=\"lp-cab-categoria\">{categoria}</p>}\n <h1 className=\"lp-cab-titulo\">{titulo}</h1>\n {trilha && <Trilha extras={Array.isArray(trilha) ? trilha : undefined} className=\"lp-cab-trilha\" />}\n </div>\n {acoes && <div className=\"lp-cab-acoes\">{acoes}</div>}\n </div>\n {children && <div className=\"lp-cab-descricao\">{children}</div>}\n </header>\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport { useState, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { nomeCurto, saudacaoPorHora } from '../../utils/texto';\nimport { Avatar } from '../Avatar/Avatar';\nimport './BoasVindas.css';\n\nexport interface BoasVindasProps {\n /** Nome completo (a saudação usa primeiro + último). */\n nome: string;\n cargo?: string;\n /** Sigla da unidade (ex.: RH). */\n sigla?: string;\n foto?: string;\n /** Último acesso; sem ele a linha some. */\n ultimoAcesso?: Date | null;\n /** Ações da página inicial (ex.: \"Novo cadastro\"). */\n children?: ReactNode;\n className?: string;\n}\n\nconst DATA_EXTENSO = new Intl.DateTimeFormat('pt-BR', { dateStyle: 'full' });\nconst DATA = new Intl.DateTimeFormat('pt-BR', { dateStyle: 'short' });\nconst HORA = new Intl.DateTimeFormat('pt-BR', { timeStyle: 'short' });\n\n/**\n * Cabeçalho de sessão da página inicial: foto, data por extenso, saudação\n * pela hora, cargo · unidade e último acesso. Substitui o `CabecalhoPagina` na home.\n */\nexport function BoasVindas({ nome, cargo, sigla, foto, ultimoAcesso, children, className }: BoasVindasProps) {\n // congelados no primeiro render: a página não fica aberta virando a hora\n const [agora] = useState(() => new Date());\n const cargoLinha = [cargo, sigla].filter(Boolean).join(' · ');\n const hoje = DATA_EXTENSO.format(agora);\n\n return (\n <header className={cx('lp-bv', className)}>\n <Avatar nome={nome} foto={foto} tom=\"escuro\" tamanho=\"3.5rem\" />\n <div className=\"lp-bv-txt\">\n <span className=\"lp-bv-data\">{hoje.charAt(0).toUpperCase() + hoje.slice(1)}</span>\n <h1 className=\"lp-bv-saudacao\">\n {saudacaoPorHora(agora)}, {nomeCurto(nome).split(' ')[0]}\n </h1>\n {cargoLinha && <span className=\"lp-bv-cargo\">{cargoLinha}</span>}\n {ultimoAcesso && (\n <span className=\"lp-bv-acesso\">\n <Icone icone=\"clock\" />\n Último acesso em {DATA.format(ultimoAcesso)} às {HORA.format(ultimoAcesso)}\n </span>\n )}\n </div>\n {children && <div className=\"lp-bv-acoes\">{children}</div>}\n </header>\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport type { Severidade } from '../../utils/tipos';\nimport './Alerta.css';\n\n/** Cores do alerta: as severidades + `pri` (azul de ação) e `destaque` (laranja da marca). */\nexport type CorAlerta = Severidade | 'pri' | 'destaque';\n\nexport type AparenciaAlerta = 'suave' | 'solido' | 'contorno' | 'destaque' | 'faixa' | 'cartao';\n\nconst ICONES: Record<CorAlerta, string> = {\n pri: 'info',\n destaque: 'circle-alert',\n ok: 'circle-check',\n info: 'info',\n warn: 'triangle-alert',\n err: 'circle-x',\n neutral: 'info',\n};\n\nexport interface AlertaProps {\n severidade?: CorAlerta;\n /**\n * `suave` (padrão) = fundo claro · `solido` = fundo cheio · `contorno` =\n * só a borda · `destaque` = fundo neutro com filete lateral colorido ·\n * `faixa` = título numa faixa sólida sobre o texto · `cartao` = bloco\n * centralizado com ícone grande (avisos de página, confirmações).\n */\n aparencia?: AparenciaAlerta;\n /** `pilula` = cantos totalmente arredondados. */\n formato?: 'padrao' | 'pilula';\n sombra?: 'pequena' | 'media' | 'grande';\n /** Linha em negrito acima da mensagem. */\n titulo?: ReactNode;\n mensagem?: ReactNode;\n children?: ReactNode;\n /** Ícone da severidade por padrão; outro ícone, ou `false` para nenhum. */\n icone?: IconeProp | false;\n /** Imagem/avatar no lugar do ícone. */\n midia?: ReactNode;\n /** Botões ou links. */\n acoes?: ReactNode;\n /** `lado` = à direita da mensagem (padrão) · `abaixo` = sob o texto. */\n posicaoAcoes?: 'lado' | 'abaixo';\n /** Mostra o \"×\" e some ao clicar (sem controle externo). */\n dispensavel?: boolean;\n /** Mostra o \"×\" e avisa o app (que decide se o alerta sai da tela). */\n aoFechar?: () => void;\n /** `circulo` = \"×\" num círculo sólido da cor do alerta. */\n botaoFechar?: 'simples' | 'circulo';\n className?: string;\n}\n\nexport function Alerta({\n severidade = 'info',\n aparencia = 'suave',\n formato = 'padrao',\n sombra,\n titulo,\n mensagem,\n children,\n icone,\n midia,\n acoes,\n posicaoAcoes,\n dispensavel = false,\n aoFechar,\n botaoFechar = 'simples',\n className,\n}: AlertaProps) {\n const [fechado, setFechado] = useState(false);\n if (fechado) return null;\n\n const cartao = aparencia === 'cartao';\n const faixa = aparencia === 'faixa';\n const comFechar = dispensavel || !!aoFechar;\n const iconeFinal = icone === false ? null : (icone ?? ICONES[severidade]);\n const acoesAbaixo = (posicaoAcoes ?? (cartao || titulo ? 'abaixo' : 'lado')) === 'abaixo';\n\n const fechar = () => {\n aoFechar?.();\n if (dispensavel) setFechado(true);\n };\n const botaoX = comFechar && (\n <button type=\"button\" className={cx('lp-alerta-fechar', botaoFechar === 'circulo' && 'lp-alerta-fechar--circulo')} aria-label=\"Fechar alerta\" onClick={fechar}>\n <Icone icone=\"x\" />\n </button>\n );\n\n const texto = (mensagem || children) && (\n <span className=\"lp-alerta-txt\">\n {mensagem}\n {children}\n </span>\n );\n const blocoAcoes = acoes && <span className={cx('lp-alerta-acoes', acoesAbaixo && 'lp-alerta-acoes--abaixo')}>{acoes}</span>;\n\n const classes = cx(\n 'lp-alerta',\n `lp-alerta--${aparencia}`,\n formato === 'pilula' && 'lp-alerta--pilula',\n sombra && `lp-alerta--sombra-${sombra}`,\n !!titulo && 'tem-titulo',\n comFechar && 'tem-fechar',\n className,\n );\n const papel = severidade === 'err' ? 'alert' : 'status';\n\n if (faixa) {\n return (\n <div className={classes} data-cor={severidade} role={papel}>\n <div className=\"lp-alerta-faixa\">\n {iconeFinal && <Icone icone={iconeFinal} className=\"lp-alerta-ic\" />}\n <span className=\"lp-alerta-tit\">{titulo}</span>\n {botaoX}\n </div>\n <div className=\"lp-alerta-corpo\">\n {texto}\n {blocoAcoes}\n </div>\n </div>\n );\n }\n\n return (\n <div className={classes} data-cor={severidade} role={papel}>\n <span className=\"lp-alerta-msg\">\n {midia ? <span className=\"lp-alerta-midia\">{midia}</span> : iconeFinal && <Icone icone={iconeFinal} className=\"lp-alerta-ic\" />}\n <span className=\"lp-alerta-conteudo\">\n {titulo && <span className=\"lp-alerta-tit\">{titulo}</span>}\n {texto}\n {acoesAbaixo && blocoAcoes}\n </span>\n </span>\n {!acoesAbaixo && blocoAcoes}\n {botaoX}\n </div>\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport { createContext, useContext, useId, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport './Campo.css';\n\n/** Props comuns a todo campo de formulário. */\nexport interface CampoBaseProps {\n rotulo?: string;\n /** Texto de ajuda abaixo do campo. */\n dica?: string;\n /** Mensagem de erro (pinta o campo de vermelho). */\n erro?: string;\n /** Aviso não-bloqueante (âmbar). */\n aviso?: string;\n obrigatorio?: boolean;\n /** `campo` = rótulo em cima · `inline` = pílula com rótulo dentro (barras de filtro). */\n variante?: 'campo' | 'inline';\n className?: string;\n}\n\nexport interface CampoProps extends CampoBaseProps {\n htmlFor?: string;\n msgId?: string;\n children: ReactNode;\n}\n\n/**\n * Contador de \"tentativas de salvar\" do formulário em volta. O `Form` o\n * incrementa a cada envio; acima de zero, todo campo revela sua pendência\n * mesmo sem ter sido tocado.\n */\nexport const RevelarCamposCtx = createContext(0);\n\nexport const MSG_OBRIGATORIO = 'Campo obrigatório';\n\ninterface OpcoesValidacao {\n valor: string;\n /** Regra de formato do campo: mensagem, ou `''` se válido. */\n validar?: (valor: string) => string;\n obrigatorio?: boolean;\n /** Erro vindo do app — sempre vence. */\n erro?: string;\n aviso?: string;\n}\n\n/**\n * Regra de exibição de pendência:\n * - o erro só aparece ao SAIR do campo depois de o usuário mexer nele, ou\n * quando o formulário tenta salvar;\n * - um valor recebido de fora (carga de registro) que não atende ao formato\n * NÃO é reformatado nem recusado: vira aviso âmbar não bloqueante.\n */\nexport function useValidacaoCampo({ valor, validar, obrigatorio, erro, aviso }: OpcoesValidacao) {\n const tentativas = useContext(RevelarCamposCtx);\n const [mexido, setMexido] = useState(false);\n const [revelado, setRevelado] = useState(false);\n\n const vazio = !valor?.trim();\n const formato = !vazio && validar ? validar(valor) : '';\n const visivel = revelado || tentativas > 0;\n\n let erroFinal = erro;\n let avisoFinal = aviso;\n if (!erroFinal) {\n if (vazio && obrigatorio && visivel) erroFinal = MSG_OBRIGATORIO;\n else if (formato && mexido && visivel) erroFinal = formato;\n else if (formato && !mexido && !avisoFinal) avisoFinal = `${formato}. O valor será mantido como está.`;\n }\n\n return {\n erro: erroFinal || undefined,\n aviso: avisoFinal || undefined,\n /** Chame no evento de digitação/gesto real do usuário. */\n aoInteragir: () => setMexido(true),\n /** Chame no blur do controle. */\n aoSair: () => mexido && setRevelado(true),\n };\n}\n\n/** Ids estáveis do campo e da mensagem associada (aria-describedby). */\nexport function useCampoIds(idExterno?: string) {\n const gerado = useId();\n const id = idExterno ?? `lp-${gerado.replace(/:/g, '')}`;\n return { id, msgId: `${id}-msg` };\n}\n\nexport function descricaoDe(p: Pick<CampoBaseProps, 'erro' | 'aviso' | 'dica'>, msgId: string) {\n return p.erro || p.aviso || p.dica ? msgId : undefined;\n}\n\n/**\n * Moldura de campo: rótulo, asterisco de obrigatório, erro/aviso/dica.\n * Envolve qualquer controle — os campos da biblioteca já a usam por dentro.\n */\nexport function Campo({\n rotulo,\n dica,\n erro,\n aviso,\n obrigatorio,\n variante = 'campo',\n className,\n htmlFor,\n msgId,\n children,\n}: CampoProps) {\n const inline = variante === 'inline';\n const rotuloRef = useRef<HTMLLabelElement>(null);\n const [rotuloW, setRotuloW] = useState(0);\n\n // no inline o rótulo é sobreposto: o valor recua a largura medida dele\n useLayoutEffect(() => {\n if (!inline || !rotuloRef.current) return;\n const el = rotuloRef.current;\n const medir = () => setRotuloW(el.offsetWidth);\n medir();\n const ro = new ResizeObserver(medir);\n ro.observe(el);\n return () => ro.disconnect();\n }, [inline, rotulo]);\n\n const estilo = inline ? ({ '--rotulo-w': `${rotuloW}px` } as CSSProperties) : undefined;\n\n return (\n <div\n className={cx('lp-campo', inline && 'lp-campo--inline', inline && erro && 'is-invalid', className)}\n style={estilo}\n title={inline ? erro || aviso || undefined : undefined}\n >\n {rotulo &&\n (inline ? (\n <label ref={rotuloRef} className=\"lp-campo-rotulo-inline\" htmlFor={htmlFor}>\n {rotulo}\n {obrigatorio && <span className=\"lp-campo-req\" aria-hidden=\"true\">*</span>}:\n </label>\n ) : (\n <label className=\"lp-campo-rotulo\" htmlFor={htmlFor}>\n <span className=\"lp-campo-rotulo-txt\">{rotulo}</span>\n {obrigatorio && <span className=\"lp-campo-req\" aria-hidden=\"true\">*</span>}\n </label>\n ))}\n\n <div className=\"lp-campo-ctl\">{children}</div>\n\n {inline ? (\n erro ? (\n <>\n <Icone icone=\"circle-alert\" className=\"lp-campo-ic-err\" />\n <span className=\"lp-sr\" role=\"alert\" id={msgId}>{erro}</span>\n </>\n ) : aviso ? (\n <>\n <Icone icone=\"triangle-alert\" className=\"lp-campo-ic-aviso\" />\n <span className=\"lp-sr\" id={msgId}>{aviso}</span>\n </>\n ) : dica ? (\n <span className=\"lp-sr\" id={msgId}>{dica}</span>\n ) : null\n ) : erro ? (\n <span className=\"lp-campo-msg lp-campo-msg--err\" role=\"alert\" id={msgId}>{erro}</span>\n ) : aviso ? (\n <span className=\"lp-campo-msg lp-campo-msg--aviso\" id={msgId}>\n <Icone icone=\"triangle-alert\" />\n <span>{aviso}</span>\n </span>\n ) : dica ? (\n <span className=\"lp-campo-msg lp-campo-msg--dica\" id={msgId}>{dica}</span>\n ) : null}\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport { useCampoIds } from '../Campo/Campo';\nimport './CampoMarcacao.css';\n\nexport interface CampoMarcacaoProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'checked' | 'defaultChecked' | 'className' | 'value'> {\n rotulo?: string;\n valor?: boolean;\n aoMudar?: (valor: boolean) => void;\n /** `caixa` = checkbox · `chave` = interruptor (switch). */\n aparencia?: 'caixa' | 'chave';\n dica?: string;\n erro?: string;\n obrigatorio?: boolean;\n className?: string;\n}\n\nexport function CampoMarcacao({\n rotulo,\n valor,\n aoMudar,\n aparencia = 'caixa',\n dica,\n erro,\n obrigatorio,\n className,\n id: idExterno,\n onChange,\n ...resto\n}: CampoMarcacaoProps) {\n const { id, msgId } = useCampoIds(idExterno);\n return (\n <div className={cx('lp-marc-wrap', className)}>\n <label className={cx('lp-marc', aparencia === 'chave' && 'lp-marc--chave')}>\n <input\n id={id}\n type=\"checkbox\"\n className=\"lp-marc-in\"\n role={aparencia === 'chave' ? 'switch' : undefined}\n checked={valor}\n onChange={(e) => {\n aoMudar?.(e.target.checked);\n onChange?.(e);\n }}\n aria-required={obrigatorio || undefined}\n aria-invalid={erro ? true : undefined}\n aria-describedby={erro || dica ? msgId : undefined}\n {...resto}\n />\n <span className=\"lp-marc-visual\" aria-hidden=\"true\" />\n {rotulo && (\n <span className=\"lp-marc-rotulo\">\n {rotulo}\n {obrigatorio && <span className=\"lp-campo-req\" aria-hidden=\"true\">*</span>}\n </span>\n )}\n </label>\n {erro ? (\n <span className=\"lp-campo-msg lp-campo-msg--err\" role=\"alert\" id={msgId}>{erro}</span>\n ) : dica ? (\n <span className=\"lp-campo-msg lp-campo-msg--dica\" id={msgId}>{dica}</span>\n ) : null}\n </div>\n );\n}\n","import { forwardRef, type ChangeEvent, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { aplicarMascara, MASCARAS, type Mascara } from '../../utils/mascara';\nimport { TIPOS_CAMPO } from '../../utils/tiposCampo';\nimport { validarTelefone, type TipoDeCampo } from '../../utils/validadores';\nimport { Campo, descricaoDe, useCampoIds, useValidacaoCampo, type CampoBaseProps } from '../Campo/Campo';\nimport './CampoTexto.css';\n\ntype InputNativo = Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'className'>;\n\nexport interface CampoTextoProps extends CampoBaseProps, InputNativo {\n valor?: string;\n aoMudar?: (valor: string) => void;\n /** Ícone à esquerda, dentro do campo. */\n icone?: IconeProp;\n /** Máscara de digitação (`0` dígito, `A` letra, `S` alfanumérico). */\n mascara?: Mascara;\n /** Converte o texto para CAIXA ALTA enquanto digita. */\n maiuscula?: boolean;\n /** Texto fixo antes do valor (ex.: \"R$\"). */\n prefixo?: ReactNode;\n /** Conteúdo após o valor (ex.: botão de lupa). */\n sufixo?: ReactNode;\n /**\n * Regra de formato: devolve a mensagem, ou `''` se válido. O erro aparece\n * ao sair do campo depois de digitar (ou ao salvar o `Form`).\n */\n validar?: (valor: string) => string;\n}\n\nexport const CampoTexto = forwardRef<HTMLInputElement, CampoTextoProps>(function CampoTexto(\n {\n rotulo,\n dica,\n erro,\n aviso,\n obrigatorio,\n variante = 'campo',\n className,\n id: idExterno,\n valor,\n aoMudar,\n onChange,\n icone,\n mascara,\n maiuscula,\n prefixo,\n sufixo,\n disabled,\n type = 'text',\n validar,\n onBlur,\n ...resto\n },\n ref,\n) {\n const { id, msgId } = useCampoIds(idExterno);\n const validacao = useValidacaoCampo({ valor: valor ?? '', validar, obrigatorio, erro, aviso });\n erro = validacao.erro;\n aviso = validacao.aviso;\n const inline = variante === 'inline';\n const emMoldura = !inline && (prefixo !== undefined || sufixo !== undefined);\n\n const aoDigitar = (e: ChangeEvent<HTMLInputElement>) => {\n let v = e.target.value;\n if (mascara) v = aplicarMascara(v, mascara);\n if (maiuscula) v = v.toUpperCase();\n if (v !== e.target.value) e.target.value = v;\n validacao.aoInteragir();\n aoMudar?.(v);\n onChange?.(e);\n };\n\n const input = (\n <input\n ref={ref}\n id={id}\n type={type}\n className={cx('lp-input', (inline || emMoldura) && 'lp-input--bare')}\n value={valor}\n onChange={aoDigitar}\n onBlur={(e) => {\n validacao.aoSair();\n onBlur?.(e);\n }}\n disabled={disabled}\n required={obrigatorio}\n aria-required={obrigatorio || undefined}\n aria-invalid={erro ? true : undefined}\n aria-describedby={descricaoDe({ erro, aviso, dica }, msgId)}\n {...resto}\n />\n );\n\n return (\n <Campo\n rotulo={rotulo}\n dica={dica}\n erro={erro}\n aviso={aviso}\n obrigatorio={obrigatorio}\n variante={variante}\n className={className}\n htmlFor={id}\n msgId={msgId}\n >\n {emMoldura ? (\n <div className={cx('lp-ctl-frame', 'lp-campo-frame', erro && 'is-invalid', disabled && 'is-disabled')}>\n <Icone icone={icone} className=\"lp-campo-frame-ic\" />\n {prefixo !== undefined && <span className=\"lp-campo-prefixo\">{prefixo}</span>}\n {input}\n {sufixo}\n </div>\n ) : (\n <div className={cx('lp-campo-texto', inline && 'lp-campo-texto--inline', !!icone && 'tem-icone')}>\n <Icone icone={icone} className=\"lp-campo-texto-ic\" />\n {input}\n </div>\n )}\n </Campo>\n );\n});\n\n/* ---------- campos prontos (máscaras e validação brasileiras) ---------- */\n\ntype Preset = Omit<CampoTextoProps, 'mascara'>;\n\n/** Monta um campo tipado a partir do descritor `TIPOS_CAMPO` (máscara + placeholder + regra). */\nfunction campoTipado(tipo: TipoDeCampo, nome: string, extra: Partial<CampoTextoProps> = {}) {\n const meta = TIPOS_CAMPO[tipo];\n const C = forwardRef<HTMLInputElement, Preset>((p, ref) => (\n <CampoTexto\n ref={ref}\n mascara={meta.mascara}\n placeholder={meta.placeholder}\n maiuscula={meta.caixaAlta}\n validar={meta.validar}\n {...extra}\n {...p}\n />\n ));\n C.displayName = nome;\n return C;\n}\n\nexport const CampoCpf = campoTipado('cpf', 'CampoCpf', { inputMode: 'numeric' });\nexport const CampoCnpj = campoTipado('cnpj', 'CampoCnpj', { inputMode: 'numeric' });\n/** CPF ou CNPJ: a máscara muda pelo número de dígitos. */\nexport const CampoCpfCnpj = campoTipado('cpfCnpj', 'CampoCpfCnpj', { inputMode: 'numeric' });\nexport const CampoCep = campoTipado('cep', 'CampoCep', { inputMode: 'numeric' });\nexport const CampoPlaca = campoTipado('placa', 'CampoPlaca');\nexport const CampoEmail = campoTipado('email', 'CampoEmail', {\n type: 'email',\n inputMode: 'email',\n autoComplete: 'email',\n icone: 'mail',\n});\n/** RENAVAM: 9 a 11 dígitos. */\nexport const CampoRenavam = campoTipado('renavam', 'CampoRenavam', { inputMode: 'numeric' });\n/** Chassi (VIN): 17 caracteres, sem I, O e Q. */\nexport const CampoChassi = campoTipado('chassi', 'CampoChassi');\n/** CNH com dígitos verificadores do DENATRAN. */\nexport const CampoCnh = campoTipado('cnh', 'CampoCnh', { inputMode: 'numeric' });\n/** IMEI com verificação de Luhn. */\nexport const CampoImei = campoTipado('imei', 'CampoImei', { inputMode: 'numeric' });\n\nexport interface CampoTelefoneProps extends Preset {\n /** Restringe a fixo (10 dígitos) ou celular (11). Sem `tipo`, aceita os dois. */\n tipo?: 'fixo' | 'celular';\n}\n\nexport const CampoTelefone = forwardRef<HTMLInputElement, CampoTelefoneProps>(({ tipo, ...p }, ref) => {\n const [fixo, celular] = MASCARAS.telefone;\n return (\n <CampoTexto\n ref={ref}\n mascara={tipo === 'fixo' ? fixo : tipo === 'celular' ? celular : [fixo, celular]}\n inputMode=\"tel\"\n type=\"tel\"\n placeholder={tipo === 'fixo' ? '(00) 0000-0000' : '(00) 00000-0000'}\n validar={(v) => validarTelefone(v, tipo)}\n {...p}\n />\n );\n});\nCampoTelefone.displayName = 'CampoTelefone';\n\n/** Data no formato ISO (`AAAA-MM-DD`), com o seletor nativo do navegador. */\nexport const CampoData = forwardRef<HTMLInputElement, Preset>((p, ref) => (\n <CampoTexto ref={ref} type=\"date\" {...p} />\n));\nCampoData.displayName = 'CampoData';\n\n/** Hora `HH:MM`. */\nexport const CampoHora = forwardRef<HTMLInputElement, Preset>((p, ref) => (\n <CampoTexto ref={ref} type=\"time\" {...p} />\n));\nCampoHora.displayName = 'CampoHora';\n\n/** Data e hora `AAAA-MM-DDTHH:MM`. */\nexport const CampoDataHora = forwardRef<HTMLInputElement, Preset>((p, ref) => (\n <CampoTexto ref={ref} type=\"datetime-local\" {...p} />\n));\nCampoDataHora.displayName = 'CampoDataHora';\n\n/* ---------- numéricos ---------- */\n\ntype PresetNumerico = Omit<CampoTextoProps, 'mascara' | 'valor' | 'aoMudar'> & {\n valor?: number | null;\n aoMudar?: (valor: number | null) => void;\n};\n\nconst BRL = new Intl.NumberFormat('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n/** Valor em reais: digita-se da direita (centavos primeiro), como no caixa. */\nexport const CampoMoeda = forwardRef<HTMLInputElement, PresetNumerico>(function CampoMoeda(\n { valor, aoMudar, ...p },\n ref,\n) {\n return (\n <CampoTexto\n ref={ref}\n inputMode=\"numeric\"\n prefixo=\"R$\"\n placeholder=\"0,00\"\n valor={valor === null || valor === undefined ? '' : BRL.format(valor)}\n aoMudar={(t) => {\n const digitos = t.replace(/\\D/g, '');\n aoMudar?.(digitos ? Number(digitos) / 100 : null);\n }}\n {...p}\n />\n );\n});\n\n/** Número inteiro (só dígitos). */\nexport const CampoInteiro = forwardRef<HTMLInputElement, PresetNumerico>(function CampoInteiro(\n { valor, aoMudar, ...p },\n ref,\n) {\n return (\n <CampoTexto\n ref={ref}\n inputMode=\"numeric\"\n valor={valor === null || valor === undefined ? '' : String(valor)}\n aoMudar={(t) => {\n const digitos = t.replace(/\\D/g, '');\n aoMudar?.(digitos ? Number(digitos) : null);\n }}\n {...p}\n />\n );\n});\n","import { Icone } from '../../utils/Icone';\nimport { useState, type KeyboardEvent } from 'react';\nimport { cx } from '../../utils/cx';\nimport { forcaSenha, POLITICA_PADRAO, validarSenha, type PoliticaSenha } from '../../utils/senha';\nimport { CampoTexto, type CampoTextoProps } from '../CampoTexto/CampoTexto';\nimport './CampoSenha.css';\n\nexport interface CampoSenhaProps extends Omit<CampoTextoProps, 'type' | 'mascara' | 'maiuscula' | 'prefixo' | 'sufixo'> {\n /** Botão de olho para mostrar/ocultar (padrão: sim). */\n revelavel?: boolean;\n /**\n * Liga o medidor de força E a validação pela `politica`. Desligado no\n * login — não se cobra política de uma senha que já existe.\n */\n forca?: boolean;\n politica?: PoliticaSenha;\n /** `new-password` em cadastro/troca de senha (padrão: `current-password`). */\n autoComplete?: string;\n}\n\nconst ROTULO_NIVEL = { vazia: '', fraca: 'Fraca', media: 'Média', forte: 'Forte' } as const;\n\n/** Senha com olho, aviso de Caps Lock e medidor de força opcional. */\nexport function CampoSenha({\n revelavel = true,\n forca = false,\n politica = POLITICA_PADRAO,\n autoComplete = 'current-password',\n className,\n valor = '',\n validar,\n aviso,\n onKeyDown,\n onKeyUp,\n disabled,\n ...p\n}: CampoSenhaProps) {\n const [visivel, setVisivel] = useState(false);\n const [capsLock, setCapsLock] = useState(false);\n const f = forcaSenha(valor, politica);\n\n const lerCaps = (e: KeyboardEvent<HTMLInputElement>) => setCapsLock(e.getModifierState?.('CapsLock') ?? false);\n\n return (\n <div className={cx('lp-senha', className)}>\n <CampoTexto\n {...p}\n type={visivel ? 'text' : 'password'}\n autoComplete={autoComplete}\n valor={valor}\n disabled={disabled}\n validar={forca ? (v) => validarSenha(v, politica) || validar?.(v) || '' : validar}\n aviso={aviso ?? (capsLock ? 'Caps Lock está ativado' : undefined)}\n onKeyDown={(e) => {\n lerCaps(e);\n onKeyDown?.(e);\n }}\n onKeyUp={(e) => {\n lerCaps(e);\n onKeyUp?.(e);\n }}\n sufixo={\n revelavel && !disabled ? (\n <button\n type=\"button\"\n className=\"lp-ctl-suffix\"\n aria-label={visivel ? 'Ocultar senha' : 'Mostrar senha'}\n aria-pressed={visivel}\n onClick={() => setVisivel((x) => !x)}\n >\n <Icone icone={visivel ? 'eye-off' : 'eye'} />\n </button>\n ) : undefined\n }\n />\n {forca && (\n <div className=\"lp-senha-forca\" data-nivel={f.nivel} aria-live=\"polite\">\n <div className=\"lp-senha-barras\" aria-hidden=\"true\">\n {[1, 2, 3, 4].map((n) => (\n <span key={n} className={cx('lp-senha-barra', n <= f.score && 'is-on')} />\n ))}\n </div>\n {f.nivel !== 'vazia' && <span className=\"lp-senha-nivel\">Força: {ROTULO_NIVEL[f.nivel]}</span>}\n </div>\n )}\n </div>\n );\n}\n","import { useId, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { Sobreposicao } from './Sobreposicao';\nimport './Dialogo.css';\n\nexport type TamanhoDialogo = 'pequeno' | 'medio' | 'grande' | 'extragrande' | 'full';\n\n/** Efeito de entrada do diálogo central. */\nexport type AnimacaoDialogo =\n | 'padrao'\n | 'escala'\n | 'deslizar-direita'\n | 'deslizar-baixo'\n | 'jornal'\n | 'queda'\n | 'girar-horizontal'\n | 'girar-vertical'\n | 'super-escala'\n | 'placa'\n | 'girar-baixo'\n | 'girar-esquerda';\n\nexport interface DialogoProps {\n aberto: boolean;\n aoFechar: () => void;\n titulo: string;\n subtitulo?: string;\n icone?: IconeProp;\n tamanho?: TamanhoDialogo;\n /** Tela cheia só abaixo desta largura (`sm` 36rem · `md` 48rem · `lg` 64rem · `xl` 75rem · `xxl` 87.5rem). */\n telaCheiaAbaixo?: 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\n /**\n * `central` (padrão) · `lateral` = painel encostado à direita, altura\n * total (gaveta). No lateral, `full` cai para `grande`.\n */\n aparencia?: 'central' | 'lateral';\n /** Onde o diálogo central fica: `centro` (padrão) ou `topo`. */\n posicao?: 'centro' | 'topo';\n /**\n * Conteúdo longo: `corpo` (padrão) rola só o miolo, com cabeçalho e rodapé\n * fixos · `pagina` deixa o diálogo crescer e rola a máscara inteira.\n */\n rolagem?: 'corpo' | 'pagina';\n animacao?: AnimacaoDialogo;\n /** `escuro` = cabeçalho na cor da marca. */\n tom?: 'claro' | 'escuro';\n /** Esc / clique fora fecham (padrão: sim). */\n dispensavel?: boolean;\n /** Botões do rodapé. */\n rodape?: ReactNode;\n children?: ReactNode;\n className?: string;\n}\n\nexport function Dialogo({\n aberto,\n aoFechar,\n titulo,\n subtitulo,\n icone,\n tamanho = 'medio',\n telaCheiaAbaixo,\n aparencia = 'central',\n posicao = 'centro',\n rolagem = 'corpo',\n animacao = 'padrao',\n tom = 'claro',\n dispensavel = true,\n rodape,\n children,\n className,\n}: DialogoProps) {\n const tituloId = useId();\n if (!aberto) return null;\n const lateral = aparencia === 'lateral';\n return (\n <Sobreposicao\n aoDispensar={aoFechar}\n dispensavel={dispensavel}\n rotuloId={tituloId}\n classeMascara={cx(\n lateral && 'lp-sobre--lateral',\n !lateral && posicao === 'topo' && 'lp-sobre--topo',\n !lateral && rolagem === 'pagina' && 'lp-sobre--rolar',\n telaCheiaAbaixo && `lp-sobre--cheia-${telaCheiaAbaixo}`,\n )}\n className={cx(\n 'lp-dlg',\n `lp-dlg--${lateral && tamanho === 'full' ? 'grande' : tamanho}`,\n lateral && 'lp-dlg--lateral',\n !lateral && rolagem === 'pagina' && 'lp-dlg--rolar-pagina',\n !lateral && animacao !== 'padrao' && `lp-dlg--anim-${animacao}`,\n telaCheiaAbaixo && `lp-dlg--cheia-${telaCheiaAbaixo}`,\n tom === 'escuro' && 'lp-dlg--escuro',\n className,\n )}\n >\n <div className=\"lp-dlg-cab\">\n {icone && (\n <span className=\"lp-dlg-ic\">\n <Icone icone={icone} />\n </span>\n )}\n <div className=\"lp-dlg-titulos\">\n <span className=\"lp-dlg-titulo\" id={tituloId}>\n {titulo}\n </span>\n {subtitulo && <span className=\"lp-dlg-sub\">{subtitulo}</span>}\n </div>\n <button type=\"button\" className=\"lp-dlg-fechar\" aria-label=\"Fechar\" title=\"Fechar\" onClick={aoFechar}>\n <Icone icone=\"x\" />\n </button>\n </div>\n <div className=\"lp-dlg-corpo\">{children}</div>\n {rodape && <div className=\"lp-dlg-rodape\">{rodape}</div>}\n </Sobreposicao>\n );\n}\n","import { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport type { Severidade } from '../../utils/tipos';\nimport './Status.css';\n\nexport interface StatusProps {\n rotulo: string;\n severidade?: Severidade;\n icone?: IconeProp;\n className?: string;\n}\n\n/** Selo de situação (Ativo, Pendente, Cancelado…). */\nexport function Status({ rotulo, severidade = 'neutral', icone, className }: StatusProps) {\n return (\n <span className={cx('lp-status', className)} data-sev={severidade}>\n <Icone icone={icone} />\n <span>{rotulo}</span>\n </span>\n );\n}\n","import { useId, useState, type FormEvent, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { Alerta } from '../Alerta/Alerta';\nimport { Botao } from '../Botao/Botao';\nimport { CampoMarcacao } from '../CampoMarcacao/CampoMarcacao';\nimport { CampoSenha } from '../CampoSenha/CampoSenha';\nimport { CampoCpf, CampoEmail, CampoTexto } from '../CampoTexto/CampoTexto';\nimport { Dialogo } from '../Dialogo/Dialogo';\nimport { Dica } from '../Dica/Dica';\nimport type { Marca } from '../Estrutura/Estrutura';\nimport { usePreferenciasOpcional } from '../Preferencias/Preferencias';\nimport { Status } from '../Status/Status';\nimport './TelaLogin.css';\n\nexport interface CredenciaisLogin {\n usuario: string;\n senha: string;\n}\n\n/**\n * Resposta do `aoEntrar`: nada = entrou · `'codigo'` = pedir o código de\n * verificação em duas etapas · `{ erro }` = mensagem para o usuário.\n */\nexport type ResultadoLogin = void | 'codigo' | { erro: string };\n\n/** Painel institucional do modelo `conteudo`. */\nexport interface ApresentacaoLogin {\n /** Chamada em caixa alta acima do título (ex.: \"Plataforma comercial\"). */\n chamada?: string;\n titulo: string;\n descricao?: ReactNode;\n /** Até 3–4 pontos fortes do sistema, cada um com ícone. */\n destaques?: { icone: IconeProp; texto: string }[];\n /** Conteúdo livre abaixo dos destaques (ilustração, gráfico, depoimento). */\n extra?: ReactNode;\n}\n\nexport interface TelaLoginProps {\n marca: Marca;\n /**\n * `conteudo` (padrão) = apresentação do sistema à esquerda + cartão do\n * formulário · `formulario` = só o cartão, centralizado.\n */\n modelo?: 'conteudo' | 'formulario';\n /** Conteúdo da lateral esquerda no modelo `conteudo` (some em telas estreitas). */\n apresentacao?: ApresentacaoLogin;\n /** Selo de ambiente sob o subtítulo (Homologação, Treinamento…). Produção: omita. */\n ambiente?: { rotulo: string; severidade?: 'warn' | 'err' | 'info' | 'neutral' };\n /** Como o usuário se identifica (padrão: CPF). */\n identificador?: 'cpf' | 'email' | 'usuario';\n titulo?: string;\n descricao?: string;\n aoEntrar: (credenciais: CredenciaisLogin) => Promise<ResultadoLogin> | ResultadoLogin;\n /** Confirma o código de 6 dígitos; devolva `{ erro }` para manter o diálogo aberto. */\n aoConfirmarCodigo?: (codigo: string, confiarDispositivo: boolean) => Promise<void | { erro: string }> | void | { erro: string };\n /** Mostra \"Confiar neste dispositivo\" no diálogo do código (padrão: sim). */\n confiarDispositivo?: boolean;\n /** Onde o usuário encontra o código (ex.: \"Abra o aplicativo autenticador no celular…\"). */\n instrucaoCodigo?: string;\n /** Link sob a senha, alinhado à direita (ex.: \"Esqueci minha senha\"). */\n linkSenha?: ReactNode;\n /** Links ou botões abaixo do Entrar. */\n acoes?: ReactNode;\n rodape?: ReactNode;\n className?: string;\n}\n\nconst TAMANHO_CODIGO = 6;\n\n/** Tela de login institucional: imagem + painel com identificação, senha e 2FA. */\nexport function TelaLogin({\n marca,\n modelo = 'conteudo',\n apresentacao,\n ambiente,\n identificador = 'cpf',\n titulo = 'Acesse sua conta',\n descricao = 'Entre com suas credenciais institucionais.',\n aoEntrar,\n aoConfirmarCodigo,\n confiarDispositivo = true,\n instrucaoCodigo = 'Digite o código de 6 dígitos gerado no aplicativo de autenticação.',\n linkSenha,\n acoes,\n rodape,\n className,\n}: TelaLoginProps) {\n const [usuario, setUsuario] = useState('');\n const [senha, setSenha] = useState('');\n const [entrando, setEntrando] = useState(false);\n const [erro, setErro] = useState('');\n const [tentou, setTentou] = useState(false);\n const [pedindoCodigo, setPedindoCodigo] = useState(false);\n const [codigo, setCodigo] = useState('');\n const [confiar, setConfiar] = useState(false);\n const [erroCodigo, setErroCodigo] = useState('');\n const [confirmando, setConfirmando] = useState(false);\n const prefs = usePreferenciasOpcional();\n const tituloId = useId();\n const comConteudo = modelo === 'conteudo' && !!apresentacao;\n\n const entrar = async (e: FormEvent) => {\n e.preventDefault();\n setTentou(true);\n if (!usuario.trim() || !senha) return;\n setErro('');\n setEntrando(true);\n try {\n const r = await aoEntrar({ usuario, senha });\n if (r === 'codigo') {\n setCodigo('');\n setConfiar(false);\n setErroCodigo('');\n setPedindoCodigo(true);\n } else if (r && typeof r === 'object') setErro(r.erro);\n } catch {\n setErro('Não foi possível entrar agora. Tente de novo em instantes.');\n } finally {\n setEntrando(false);\n }\n };\n\n const confirmar = async (e?: FormEvent) => {\n e?.preventDefault();\n if (codigo.length !== TAMANHO_CODIGO) {\n setErroCodigo(`Informe os ${TAMANHO_CODIGO} dígitos`);\n return;\n }\n setConfirmando(true);\n try {\n const r = await aoConfirmarCodigo?.(codigo, confiar);\n if (r && typeof r === 'object') setErroCodigo(r.erro);\n else setPedindoCodigo(false);\n } catch {\n setErroCodigo('Não foi possível validar o código. Tente de novo.');\n } finally {\n setConfirmando(false);\n }\n };\n\n const obrig = (v: string) => (tentou && !v.trim() ? 'Campo obrigatório' : undefined);\n const propsUsuario = { valor: usuario, aoMudar: setUsuario, obrigatorio: true, erro: obrig(usuario), autoFocus: true };\n\n return (\n <div className={cx('lp-login', comConteudo ? 'lp-login--conteudo' : 'lp-login--formulario', className)}>\n {/* fundo decorativo: duas manchas desfocadas + grade que some nas bordas */}\n <div className=\"lp-login-fundo\" aria-hidden=\"true\">\n <span className=\"lp-login-mancha lp-login-mancha--1\" />\n <span className=\"lp-login-mancha lp-login-mancha--2\" />\n <span className=\"lp-login-grade\" />\n </div>\n\n <header className=\"lp-login-cab\">\n <div className=\"lp-login-marca\">\n {marca.logo ? (\n <img src={marca.logo} alt=\"\" className=\"lp-login-logo\" />\n ) : (\n <span className=\"lp-login-escudo\" aria-hidden=\"true\">\n <Icone icone=\"shield\" />\n </span>\n )}\n <div>\n <div className=\"lp-login-nome\">{marca.nome}</div>\n {marca.subtitulo && <div className=\"lp-login-sub\">{marca.subtitulo}</div>}\n </div>\n {ambiente?.rotulo && ambiente.rotulo !== '#' && <Status rotulo={ambiente.rotulo} severidade={ambiente.severidade ?? 'err'} />}\n </div>\n {prefs && (\n <Dica texto={prefs.escuro ? 'Tema claro' : 'Tema escuro'}>\n <button type=\"button\" className=\"lp-login-tema\" aria-label={prefs.escuro ? 'Tema claro' : 'Tema escuro'} onClick={prefs.alternarTema}>\n <Icone icone={prefs.escuro ? 'sun' : 'moon'} />\n </button>\n </Dica>\n )}\n </header>\n\n <main className=\"lp-login-main\">\n {comConteudo && apresentacao && (\n <section className=\"lp-login-apres\" aria-label=\"Sobre o sistema\">\n {apresentacao.chamada && <p className=\"lp-login-chamada\">{apresentacao.chamada}</p>}\n <h2 className=\"lp-login-apres-titulo\">{apresentacao.titulo}</h2>\n {apresentacao.descricao && <p className=\"lp-login-apres-desc\">{apresentacao.descricao}</p>}\n {!!apresentacao.destaques?.length && (\n <ul className=\"lp-login-destaques\">\n {apresentacao.destaques.map((d) => (\n <li key={d.texto}>\n <span className=\"lp-login-destaque-ic\" aria-hidden=\"true\">\n <Icone icone={d.icone} />\n </span>\n {d.texto}\n </li>\n ))}\n </ul>\n )}\n {apresentacao.extra && <div className=\"lp-login-extra\">{apresentacao.extra}</div>}\n </section>\n )}\n\n <section className=\"lp-login-cartao density-cozy\" aria-labelledby={tituloId}>\n <div className=\"lp-login-cartao-cab\">\n <span className=\"lp-login-filete\" aria-hidden=\"true\" />\n <h1 className=\"lp-login-titulo\" id={tituloId}>\n {titulo}\n </h1>\n {descricao && <p className=\"lp-login-desc\">{descricao}</p>}\n </div>\n\n {erro && <Alerta severidade=\"err\" mensagem={erro} />}\n\n <form className=\"lp-login-form\" onSubmit={entrar} noValidate>\n {identificador === 'cpf' ? (\n <CampoCpf rotulo=\"CPF\" autoComplete=\"username\" {...propsUsuario} />\n ) : identificador === 'email' ? (\n <CampoEmail rotulo=\"E-mail\" autoComplete=\"username\" placeholder=\"voce@empresa.com.br\" {...propsUsuario} />\n ) : (\n <CampoTexto rotulo=\"Usuário\" autoComplete=\"username\" icone=\"user\" {...propsUsuario} />\n )}\n <div className=\"lp-login-senha\">\n <CampoSenha rotulo=\"Senha\" placeholder=\"••••••••\" valor={senha} aoMudar={setSenha} obrigatorio erro={obrig(senha)} />\n {linkSenha && <div className=\"lp-login-link-senha\">{linkSenha}</div>}\n </div>\n <Botao type=\"submit\" rotulo={entrando ? 'Entrando…' : 'Entrar'} icone=\"log-in\" bloco carregando={entrando} />\n </form>\n\n {acoes && <div className=\"lp-login-acoes\">{acoes}</div>}\n {rodape && <div className=\"lp-login-rodape\">{rodape}</div>}\n </section>\n </main>\n\n <Dialogo\n aberto={pedindoCodigo}\n aoFechar={() => setPedindoCodigo(false)}\n titulo=\"Verificação em duas etapas\"\n subtitulo=\"Precisamos confirmar que é você\"\n icone=\"lock\"\n tamanho=\"pequeno\"\n dispensavel={!confirmando}\n rodape={\n <>\n <Botao rotulo=\"Cancelar\" severidade=\"secundario\" disabled={confirmando} onClick={() => setPedindoCodigo(false)} />\n <Botao rotulo=\"Confirmar\" icone=\"check\" carregando={confirmando} onClick={() => confirmar()} />\n </>\n }\n >\n <form className=\"lp-login-otp\" onSubmit={confirmar} noValidate>\n <p className=\"lp-login-desc\">{instrucaoCodigo}</p>\n <CampoTexto\n rotulo=\"Código\"\n className=\"lp-login-otp-campo\"\n mascara=\"000000\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n data-foco-inicial\n valor={codigo}\n aoMudar={(v) => {\n setCodigo(v);\n setErroCodigo('');\n }}\n erro={erroCodigo || undefined}\n />\n {confiarDispositivo && (\n <CampoMarcacao\n rotulo=\"Confiar neste dispositivo\"\n dica=\"O código não será pedido de novo neste computador.\"\n valor={confiar}\n aoMudar={setConfiar}\n />\n )}\n </form>\n </Dialogo>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport type { Marca } from '../Estrutura/Estrutura';\nimport './TelaErro.css';\n\nexport interface TelaErroProps {\n /** Código grande em destaque (ex.: 404). */\n codigo: string | number;\n /** Frase principal (vira o `h1` da página). */\n titulo: string;\n descricao?: ReactNode;\n /** Ícone no selo acima do código. */\n icone?: IconeProp;\n /** Cor do código: `pri` (padrão) · `warn` · `err`. */\n cor?: 'pri' | 'warn' | 'err';\n /** Botões (voltar, tentar de novo, entrar…). */\n acoes?: ReactNode;\n /** Informação técnica miúda (ex.: código do incidente para o suporte). */\n detalhe?: ReactNode;\n /** Marca no topo, como na tela de login. */\n marca?: Marca;\n /** `cheia` (padrão) ocupa a janela; `contida` cabe dentro da moldura do sistema. */\n tela?: 'cheia' | 'contida';\n className?: string;\n}\n\n/** Página de erro (401, 404, 500…) com código em destaque e caminhos de saída. */\nexport function TelaErro({ codigo, titulo, descricao, icone, cor = 'pri', acoes, detalhe, marca, tela = 'cheia', className }: TelaErroProps) {\n return (\n <div className={cx('lp-erro', `lp-erro--${tela}`, cor !== 'pri' && `lp-erro--${cor}`, className)}>\n <div className=\"lp-erro-fundo\" aria-hidden=\"true\">\n <span className=\"lp-erro-mancha lp-erro-mancha--1\" />\n <span className=\"lp-erro-mancha lp-erro-mancha--2\" />\n <span className=\"lp-erro-grade\" />\n </div>\n\n {marca && tela === 'cheia' && (\n <header className=\"lp-erro-cab\">\n {marca.logo ? (\n <img className=\"lp-erro-logo\" src={marca.logo} alt=\"\" />\n ) : (\n <span className=\"lp-erro-escudo\" aria-hidden=\"true\">\n <Icone icone=\"shield\" />\n </span>\n )}\n <span className=\"lp-erro-marca\">\n <strong>{marca.nome}</strong>\n {marca.subtitulo && <span>{marca.subtitulo}</span>}\n </span>\n </header>\n )}\n\n <main className=\"lp-erro-main\">\n {icone && (\n <span className=\"lp-erro-selo\" aria-hidden=\"true\">\n <Icone icone={icone} />\n </span>\n )}\n <p className=\"lp-erro-codigo\" aria-hidden=\"true\">\n {codigo}\n </p>\n <h1 className=\"lp-erro-titulo\">\n <span className=\"lp-sr\">Erro {codigo}: </span>\n {titulo}\n </h1>\n {descricao && <div className=\"lp-erro-desc\">{descricao}</div>}\n {acoes && <div className=\"lp-erro-acoes\">{acoes}</div>}\n {detalhe && <div className=\"lp-erro-detalhe\">{detalhe}</div>}\n </main>\n </div>\n );\n}\n","import type { JSX, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport type { IconeProp } from '../../utils/Icone';\nimport { Botao, PadroesBotaoCtx, type BotaoProps, type PadroesBotao } from '../Botao/Botao';\nimport './GrupoBotoes.css';\n\nexport interface GrupoBotoesProps extends PadroesBotao {\n children: ReactNode;\n orientacao?: 'horizontal' | 'vertical';\n /** Nome do grupo para leitor de tela (ex.: \"Controles do player\"). */\n rotulo?: string;\n className?: string;\n}\n\n/**\n * Botões colados num bloco só. `severidade`, `aparencia`, `formato` e\n * `tamanho` viram o padrão dos botões de dentro (cada um pode sobrescrever).\n */\nexport function GrupoBotoes({ children, orientacao = 'horizontal', rotulo, className, ...padroes }: GrupoBotoesProps) {\n return (\n <PadroesBotaoCtx.Provider value={padroes}>\n <div role=\"group\" aria-label={rotulo} className={cx('lp-grupo-btn', orientacao === 'vertical' && 'lp-grupo-btn--vertical', className)}>\n {children}\n </div>\n </PadroesBotaoCtx.Provider>\n );\n}\n\nexport interface OpcaoAlternancia<V> {\n valor: V;\n rotulo?: string;\n icone?: IconeProp;\n /** Obrigatória quando a opção é só ícone. */\n dica?: string;\n desabilitada?: boolean;\n}\n\ninterface BaseAlternancia<V> extends Omit<GrupoBotoesProps, 'children'> {\n opcoes: OpcaoAlternancia<V>[];\n /** Aparência das opções desmarcadas (as marcadas ficam sólidas). Padrão: `contorno`. */\n aparencia?: BotaoProps['aparencia'];\n}\n\nexport interface GrupoAlternanciaUnicoProps<V> extends BaseAlternancia<V> {\n multiplo?: false;\n valor?: V | null;\n aoMudar?: (valor: V) => void;\n}\n\nexport interface GrupoAlternanciaMultiploProps<V> extends BaseAlternancia<V> {\n multiplo: true;\n valor?: V[];\n aoMudar?: (valor: V[]) => void;\n}\n\nexport type GrupoAlternanciaProps<V> = GrupoAlternanciaUnicoProps<V> | GrupoAlternanciaMultiploProps<V>;\n\n/**\n * Grupo de botões de seleção: única (como rádio) ou múltipla (como caixas de\n * marcação). Cada opção é um botão de alternância (`aria-pressed`).\n */\nexport function GrupoAlternancia<V = string>(props: GrupoAlternanciaMultiploProps<V>): JSX.Element;\nexport function GrupoAlternancia<V = string>(props: GrupoAlternanciaUnicoProps<V>): JSX.Element;\nexport function GrupoAlternancia<V = string>(props: GrupoAlternanciaProps<V>): JSX.Element {\n const { opcoes, aparencia = 'contorno', ...grupo } = props;\n const marcados: V[] = props.multiplo ? (props.valor ?? []) : props.valor == null ? [] : [props.valor];\n const marcado = (v: V) => marcados.some((m) => Object.is(m, v));\n\n const alternar = (v: V) => {\n if (props.multiplo) props.aoMudar?.(marcado(v) ? marcados.filter((m) => !Object.is(m, v)) : [...marcados, v]);\n else props.aoMudar?.(v);\n };\n\n const { multiplo: _m, valor: _v, aoMudar: _a, ...resto } = grupo as GrupoAlternanciaProps<V>;\n return (\n <GrupoBotoes {...resto}>\n {opcoes.map((o, i) => (\n <Botao\n key={i}\n rotulo={o.rotulo}\n icone={o.icone}\n dica={o.dica}\n aria-label={o.rotulo ? undefined : o.dica}\n disabled={o.desabilitada}\n aparencia={marcado(o.valor) ? 'solido' : aparencia}\n pressionado={marcado(o.valor)}\n onClick={() => alternar(o.valor)}\n />\n ))}\n </GrupoBotoes>\n );\n}\n\nexport interface BarraBotoesProps {\n children: ReactNode;\n /** Nome da barra para leitor de tela. */\n rotulo?: string;\n /** `inicio` (padrão) · `entre` = espalha os grupos de ponta a ponta. */\n distribuicao?: 'inicio' | 'entre';\n className?: string;\n}\n\n/** Barra de ferramentas: vários grupos (e campos) lado a lado. */\nexport function BarraBotoes({ children, rotulo, distribuicao = 'inicio', className }: BarraBotoesProps) {\n return (\n <div role=\"toolbar\" aria-label={rotulo} className={cx('lp-barra-btn', distribuicao === 'entre' && 'lp-barra-btn--entre', className)}>\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useId, useLayoutEffect, useRef, useState, type KeyboardEvent, type ReactNode, type RefObject } from 'react';\nimport { portal } from '../../utils/portal';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { useCliqueFora } from '../../utils/useCliqueFora';\nimport { Botao, type BotaoProps, type PadroesBotao, type SeveridadeBotao } from '../Botao/Botao';\nimport { GrupoBotoes } from '../GrupoBotoes/GrupoBotoes';\nimport './MenuSuspenso.css';\n\nexport interface ItemMenuSuspenso {\n /** Devolvido em `aoEscolher` (sem id, vai o rótulo). */\n id?: string;\n /** `item` (padrão) · `titulo` = cabeçalho de seção · `divisor` · `texto` = linha não clicável. */\n tipo?: 'item' | 'titulo' | 'divisor' | 'texto';\n rotulo?: string;\n icone?: IconeProp;\n /** Texto miúdo à direita (atalho, contagem). */\n extra?: string;\n /** Vira link (`<a href>`) em vez de botão. */\n href?: string;\n ativo?: boolean;\n desabilitado?: boolean;\n destrutivo?: boolean;\n}\n\nexport type DirecaoMenu = 'baixo' | 'cima' | 'direita' | 'esquerda';\nexport type AlinhamentoMenu = 'inicio' | 'centro' | 'fim';\n/**\n * Quando o menu fecha sozinho: `sempre` (escolher item ou clicar fora) ·\n * `dentro` (só ao escolher item) · `fora` (só ao clicar fora) · `manual`\n * (só pelo próprio botão ou Esc).\n */\nexport type FechamentoMenu = 'sempre' | 'dentro' | 'fora' | 'manual';\n\n/** Props que um gatilho próprio (`gatilho`) deve espalhar no seu botão. */\nexport interface PropsGatilhoMenu {\n ref: RefObject<HTMLButtonElement | null>;\n 'aria-haspopup': 'menu' | 'dialog';\n 'aria-expanded': boolean;\n 'aria-controls'?: string;\n disabled?: boolean;\n onClick: () => void;\n onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => void;\n}\n\nexport interface MenuSuspensoProps extends PadroesBotao {\n rotulo?: string;\n icone?: IconeProp;\n /** Balão de dica — use em gatilhos só com ícone. */\n dica?: string;\n 'aria-label'?: string;\n itens?: ItemMenuSuspenso[];\n aoEscolher?: (id: string) => void;\n /** Conteúdo livre no painel (texto, formulário). A função recebe `fechar`. */\n children?: ReactNode | ((fechar: () => void) => ReactNode);\n /** Botão dividido: ação principal + seta que abre o menu. */\n dividido?: boolean;\n aoClicarPrincipal?: () => void;\n /** Para onde o painel abre; vira para o lado oposto se não couber. */\n direcao?: DirecaoMenu;\n alinhamento?: AlinhamentoMenu;\n /** Alinhamento a partir de 64rem (o anterior vale abaixo disso). */\n alinhamentoTelaGrande?: AlinhamentoMenu;\n fechamento?: FechamentoMenu;\n /** `[ao longo, afastando]` em px (ex.: `[10, 20]`). */\n deslocamento?: [number, number];\n /** No dividido, `pai` ancora o painel no grupo inteiro em vez de só na seta. */\n referencia?: 'gatilho' | 'pai';\n /** Painel escuro. */\n escuro?: boolean;\n /** Cor do item em foco/ativo (painel colorido). */\n cor?: SeveridadeBotao;\n sombra?: BotaoProps['sombra'];\n /** Esconde a seta do gatilho. */\n semSeta?: boolean;\n /** Largura mínima do painel (ex.: `'16rem'`). */\n larguraMenu?: string;\n desabilitado?: boolean;\n /** Gatilho próprio no lugar do `Botao` (ex.: uma aba). Espalhe as props no `<button>`. */\n gatilho?: (props: PropsGatilhoMenu, aberto: boolean) => ReactNode;\n className?: string;\n}\n\ninterface Pos {\n top: number;\n left: number;\n direcao: DirecaoMenu;\n}\n\nconst SETA: Record<DirecaoMenu, string> = {\n baixo: 'chevron-down',\n cima: 'chevron-up',\n direita: 'chevron-right',\n esquerda: 'chevron-left',\n};\nconst MARGEM = 8;\nconst SELETOR_ITEM = '[role=\"menuitem\"]:not([aria-disabled=\"true\"])';\nconst SELETOR_FOCAVEL = 'a[href], button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction posicionar(r: DOMRect, w: number, h: number, direcao: DirecaoMenu, alinh: AlinhamentoMenu, [ao, afasta]: [number, number]): Pos {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const gap = 4 + afasta;\n let dir = direcao;\n // vira para o lado oposto quando não cabe e do outro lado cabe\n if (dir === 'baixo' && r.bottom + gap + h > vh && r.top - gap - h >= 0) dir = 'cima';\n else if (dir === 'cima' && r.top - gap - h < 0 && r.bottom + gap + h <= vh) dir = 'baixo';\n else if (dir === 'direita' && r.right + gap + w > vw && r.left - gap - w >= 0) dir = 'esquerda';\n else if (dir === 'esquerda' && r.left - gap - w < 0 && r.right + gap + w <= vw) dir = 'direita';\n\n let top: number;\n let left: number;\n if (dir === 'baixo' || dir === 'cima') {\n top = dir === 'baixo' ? r.bottom + gap : r.top - gap - h;\n left = alinh === 'inicio' ? r.left : alinh === 'fim' ? r.right - w : r.left + r.width / 2 - w / 2;\n left += ao;\n } else {\n left = dir === 'direita' ? r.right + gap : r.left - gap - w;\n top = alinh === 'fim' ? r.bottom - h : alinh === 'centro' ? r.top + r.height / 2 - h / 2 : r.top;\n top += ao;\n }\n // nunca sai da janela\n left = Math.max(MARGEM, Math.min(left, vw - w - MARGEM));\n top = Math.max(MARGEM, Math.min(top, vh - h - MARGEM));\n return { top, left, direcao: dir };\n}\n\n/**\n * Menu suspenso (dropdown): botão que abre uma lista de ações, ou um painel\n * livre (texto, formulário). Dividido, em 4 direções, alinhável, com\n * fechamento configurável e navegação por setas.\n */\nexport function MenuSuspenso({\n rotulo,\n icone,\n dica,\n 'aria-label': ariaLabel,\n itens,\n aoEscolher,\n children,\n dividido = false,\n aoClicarPrincipal,\n direcao = 'baixo',\n alinhamento = 'inicio',\n alinhamentoTelaGrande,\n fechamento = 'sempre',\n deslocamento = [0, 0],\n referencia = 'gatilho',\n escuro = false,\n cor,\n sombra,\n semSeta = false,\n larguraMenu,\n desabilitado,\n gatilho: gatilhoProprio,\n className,\n severidade,\n aparencia,\n formato,\n tamanho,\n}: MenuSuspensoProps) {\n const id = useId();\n const raiz = useRef<HTMLSpanElement>(null);\n const gatilho = useRef<HTMLButtonElement>(null);\n const painel = useRef<HTMLDivElement>(null);\n const [aberto, setAberto] = useState(false);\n const [pos, setPos] = useState<Pos | null>(null);\n // foco ao abrir: primeiro ou último item (seta para cima no gatilho)\n const focoInicial = useRef<'primeiro' | 'ultimo'>('primeiro');\n const ehMenu = !!itens?.length;\n const [ao, afasta] = deslocamento;\n\n const fechar = useCallback((devolverFoco = true) => {\n setAberto(false);\n if (devolverFoco) gatilho.current?.focus();\n }, []);\n\n const medir = useCallback(() => {\n const ancora = referencia === 'pai' ? raiz.current : gatilho.current;\n const el = painel.current;\n if (!ancora || !el) return;\n const grande = alinhamentoTelaGrande && window.matchMedia('(min-width: 64rem)').matches;\n setPos(posicionar(ancora.getBoundingClientRect(), el.offsetWidth, el.offsetHeight, direcao, grande ? alinhamentoTelaGrande : alinhamento, [ao, afasta]));\n }, [referencia, direcao, alinhamento, alinhamentoTelaGrande, ao, afasta]);\n\n useLayoutEffect(() => {\n if (!aberto) {\n setPos(null);\n return;\n }\n medir();\n window.addEventListener('scroll', medir, true);\n window.addEventListener('resize', medir);\n return () => {\n window.removeEventListener('scroll', medir, true);\n window.removeEventListener('resize', medir);\n };\n }, [aberto, medir]);\n\n // depois de posicionado, leva o foco para dentro do painel\n const posicionado = !!pos;\n useEffect(() => {\n if (!posicionado || !painel.current) return;\n const lista = painel.current.querySelectorAll<HTMLElement>(ehMenu ? SELETOR_ITEM : SELETOR_FOCAVEL);\n const alvo = focoInicial.current === 'ultimo' ? lista[lista.length - 1] : lista[0];\n (alvo ?? painel.current).focus({ preventScroll: true });\n }, [posicionado, ehMenu]);\n\n useCliqueFora([raiz, painel], aberto && (fechamento === 'sempre' || fechamento === 'fora'), () => fechar(false));\n\n // Esc fecha mesmo com o foco fora do painel (ex.: fechamento manual)\n useEffect(() => {\n if (!aberto) return;\n const esc = (e: globalThis.KeyboardEvent) => e.key === 'Escape' && fechar();\n document.addEventListener('keydown', esc);\n return () => document.removeEventListener('keydown', esc);\n }, [aberto, fechar]);\n\n const alternar = () => {\n focoInicial.current = 'primeiro';\n setAberto((a) => !a);\n };\n\n const teclaGatilho = (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return;\n e.preventDefault();\n focoInicial.current = e.key === 'ArrowUp' ? 'ultimo' : 'primeiro';\n setAberto(true);\n };\n\n const teclaPainel = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n fechar();\n return;\n }\n const el = painel.current;\n if (!el) return;\n if (e.key === 'Tab') {\n // sair do painel com Tab fecha e devolve o foco à ordem normal da página\n const focaveis = Array.from(el.querySelectorAll<HTMLElement>(ehMenu ? SELETOR_ITEM : SELETOR_FOCAVEL));\n const atual = document.activeElement;\n if (ehMenu || !focaveis.length || (e.shiftKey ? atual === focaveis[0] : atual === focaveis[focaveis.length - 1])) {\n if (e.shiftKey) e.preventDefault();\n fechar();\n }\n return;\n }\n if (!ehMenu) return;\n const lista = Array.from(el.querySelectorAll<HTMLElement>(SELETOR_ITEM));\n if (!lista.length) return;\n const i = lista.indexOf(document.activeElement as HTMLElement);\n let prox: number | null = null;\n if (e.key === 'ArrowDown') prox = (i + 1) % lista.length;\n else if (e.key === 'ArrowUp') prox = (i - 1 + lista.length) % lista.length;\n else if (e.key === 'Home') prox = 0;\n else if (e.key === 'End') prox = lista.length - 1;\n if (prox === null) return;\n e.preventDefault();\n lista[prox].focus();\n };\n\n const escolher = (item: ItemMenuSuspenso) => {\n if (item.desabilitado) return;\n aoEscolher?.(item.id ?? item.rotulo ?? '');\n if (fechamento === 'sempre' || fechamento === 'dentro') fechar();\n };\n\n const seta = !semSeta && <Icone icone={SETA[direcao]} className=\"lp-menu-sus-seta\" />;\n const propsGatilho: PropsGatilhoMenu = {\n ref: gatilho,\n 'aria-haspopup': ehMenu ? 'menu' : 'dialog',\n 'aria-expanded': aberto,\n 'aria-controls': aberto ? id : undefined,\n disabled: desabilitado,\n onClick: alternar,\n onKeyDown: teclaGatilho,\n };\n const padroes = { severidade, aparencia, formato, tamanho, sombra };\n\n let botao: ReactNode;\n if (gatilhoProprio) {\n botao = gatilhoProprio(propsGatilho, aberto);\n } else if (dividido) {\n const botaoSeta = (\n <Botao\n {...propsGatilho}\n className={cx('lp-menu-sus-divisor', aberto && 'is-aberto')}\n icone={SETA[direcao]}\n aria-label={ariaLabel ?? (rotulo ? `Mais opções de ${rotulo}` : 'Mais opções')}\n />\n );\n botao = (\n <GrupoBotoes severidade={severidade} aparencia={aparencia} formato={formato} tamanho={tamanho} rotulo={rotulo}>\n {direcao === 'esquerda' && botaoSeta}\n <Botao rotulo={rotulo} icone={icone} sombra={sombra} disabled={desabilitado} onClick={aoClicarPrincipal} />\n {direcao !== 'esquerda' && botaoSeta}\n </GrupoBotoes>\n );\n } else {\n botao = (\n <Botao {...propsGatilho} {...padroes} icone={icone} dica={dica} aria-label={ariaLabel ?? (!rotulo ? dica : undefined)} className={cx(aberto && 'is-aberto')}>\n {rotulo || seta ? (\n <>\n {direcao === 'esquerda' && seta}\n {rotulo}\n {direcao !== 'esquerda' && seta}\n </>\n ) : undefined}\n </Botao>\n );\n }\n\n return (\n <span ref={raiz} className={cx('lp-menu-sus', className)}>\n {botao}\n {aberto &&\n portal(\n <div\n ref={painel}\n id={id}\n role={ehMenu ? 'menu' : 'dialog'}\n aria-label={rotulo ?? ariaLabel ?? dica}\n tabIndex={-1}\n className={cx(\n 'lp-menu-sus-painel',\n escuro && 'lp-menu-sus-painel--escuro',\n cor && 'lp-menu-sus-painel--colorido',\n cor && cor !== 'pri' && `lp-menu-sus-painel--${cor}`,\n pos && `lp-menu-sus-painel--${pos.direcao}`,\n )}\n style={{ top: pos?.top ?? 0, left: pos?.left ?? 0, minWidth: larguraMenu, visibility: pos ? undefined : 'hidden' }}\n onKeyDown={teclaPainel}\n >\n {itens?.map((item, i) => {\n const tipo = item.tipo ?? 'item';\n if (tipo === 'divisor') return <div key={i} role=\"separator\" className=\"lp-menu-sus-ln\" />;\n if (tipo === 'titulo')\n return (\n <div key={i} role=\"presentation\" className=\"lp-menu-sus-titulo\">\n {item.rotulo}\n </div>\n );\n if (tipo === 'texto')\n return (\n <div key={i} role=\"presentation\" className=\"lp-menu-sus-texto\">\n <Icone icone={item.icone} />\n {item.rotulo}\n </div>\n );\n const conteudo = (\n <>\n <Icone icone={item.icone} />\n <span className=\"lp-menu-sus-rotulo\">{item.rotulo}</span>\n {item.extra && <span className=\"lp-menu-sus-extra\">{item.extra}</span>}\n </>\n );\n const props = {\n role: 'menuitem',\n tabIndex: -1,\n className: cx('lp-menu-sus-item', item.ativo && 'is-ativo', item.destrutivo && 'is-destrutivo'),\n 'aria-current': item.ativo ? ('true' as const) : undefined,\n 'aria-disabled': item.desabilitado || undefined,\n onClick: () => escolher(item),\n };\n return item.href && !item.desabilitado ? (\n <a key={item.id ?? i} href={item.href} {...props}>\n {conteudo}\n </a>\n ) : (\n <button key={item.id ?? i} type=\"button\" {...props}>\n {conteudo}\n </button>\n );\n })}\n {typeof children === 'function' ? children(() => fechar()) : children}\n </div>,\n )}\n </span>\n );\n}\n","import { Children, isValidElement, useId, useRef, useState, type KeyboardEvent, type ReactElement, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { MenuSuspenso } from '../MenuSuspenso/MenuSuspenso';\nimport './Abas.css';\n\nexport interface AbaProps {\n valor: string;\n rotulo: string;\n icone?: IconeProp;\n desabilitada?: boolean;\n /** Número de pendências (chip âmbar na aba). */\n pendentes?: number;\n /** Selo livre depois do rótulo (ex.: `<Badge>`). */\n badge?: ReactNode;\n /** Abas vizinhas com o mesmo grupo viram uma aba com menu suspenso. */\n grupo?: string;\n children?: ReactNode;\n}\n\n/** Painel de uma aba. Só funciona dentro de `<Abas>`. */\nexport function Aba(_props: AbaProps): null {\n return null;\n}\n\n/**\n * `sublinhado` (padrão) · `classica` = aba com borda colada no painel ·\n * `pilulas` = ativa sólida · `suave` = ativa em fundo claro · `contorno` =\n * todas com borda, ativa sólida · `segmentado` = trilho cinza com a ativa\n * destacada · `passos` = círculos numerados · `cartao` = ativa e painel na\n * mesma cor · `blocos` = caixas com ícone em cima e seta para o painel.\n */\nexport type VarianteAbas = 'sublinhado' | 'classica' | 'pilulas' | 'suave' | 'contorno' | 'segmentado' | 'passos' | 'cartao' | 'blocos';\n\n/** `preencher` = abas crescem conforme o rótulo · `justificado` = todas da mesma largura. */\nexport type AlinhamentoAbas = 'inicio' | 'centro' | 'fim' | 'preencher' | 'justificado';\n\nexport interface AbasProps {\n /** Aba ativa (controlado). Sem ele, começa na primeira. */\n ativa?: string;\n aoMudar?: (valor: string) => void;\n /** Nome acessível da lista de abas. */\n rotulo?: string;\n variante?: VarianteAbas;\n /** Padrão: `preencher` no sublinhado, `inicio` nas demais. */\n alinhamento?: AlinhamentoAbas;\n /** `responsiva` = empilha as abas abaixo de 36rem. */\n orientacao?: 'horizontal' | 'vertical' | 'responsiva';\n /** Ícone acima do rótulo. */\n iconeAcima?: boolean;\n /** `caixa` = painel com borda e respiro. */\n painel?: 'livre' | 'caixa';\n /** `base` = abas abaixo do painel (rodapé). */\n posicaoBarra?: 'topo' | 'base';\n /** Título à esquerda, na mesma linha das abas. */\n cabecalho?: ReactNode;\n /** Modo página: cabeçalho com Voltar + título acima das abas. */\n titulo?: string;\n identidade?: string;\n aoVoltar?: () => void;\n acoes?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\ntype Entrada = { aba: ReactElement<AbaProps>; i: number } | { grupo: string; abas: Array<ReactElement<AbaProps>> };\n\nexport function Abas({\n ativa,\n aoMudar,\n rotulo,\n variante = 'sublinhado',\n alinhamento,\n orientacao = 'horizontal',\n iconeAcima = false,\n painel = 'livre',\n posicaoBarra = 'topo',\n cabecalho,\n titulo,\n identidade,\n aoVoltar,\n acoes,\n children,\n className,\n}: AbasProps) {\n const base = useId().replace(/:/g, '');\n const barra = useRef<HTMLDivElement>(null);\n const abas = Children.toArray(children).filter(\n (c): c is ReactElement<AbaProps> => isValidElement(c) && c.type === Aba,\n );\n const [interna, setInterna] = useState(abas[0]?.props.valor);\n const atual = ativa ?? interna;\n const pagina = !!titulo;\n const vertical = orientacao === 'vertical';\n const alinha = alinhamento ?? (variante === 'sublinhado' ? 'preencher' : 'inicio');\n\n const selecionar = (v: string) => {\n setInterna(v);\n aoMudar?.(v);\n };\n\n const aoTeclar = (e: KeyboardEvent<HTMLButtonElement>) => {\n const lista = Array.from(barra.current?.querySelectorAll<HTMLButtonElement>('.lp-abas-tab') ?? []);\n const n = lista.length;\n const i = lista.indexOf(e.currentTarget);\n let j = -1;\n if (e.key === (vertical ? 'ArrowDown' : 'ArrowRight')) j = (i + 1) % n;\n else if (e.key === (vertical ? 'ArrowUp' : 'ArrowLeft')) j = (i - 1 + n) % n;\n else if (e.key === 'Home') j = 0;\n else if (e.key === 'End') j = n - 1;\n if (j < 0) return;\n e.preventDefault();\n lista[j]?.focus();\n };\n\n // abas vizinhas do mesmo grupo viram uma entrada só (aba com menu)\n const entradas: Entrada[] = [];\n abas.forEach((aba, i) => {\n const g = aba.props.grupo;\n const ultima = entradas[entradas.length - 1];\n if (g && ultima && 'grupo' in ultima && ultima.grupo === g) ultima.abas.push(aba);\n else if (g) entradas.push({ grupo: g, abas: [aba] });\n else entradas.push({ aba, i });\n });\n\n const temPainel = (p: AbaProps) => p.children !== undefined && p.children !== null && p.children !== false;\n\n const conteudoTab = (p: AbaProps, i: number) => (\n <>\n {variante === 'passos' && <span className=\"lp-abas-num\">{i + 1}</span>}\n {p.icone && (\n <span className=\"lp-abas-ic\">\n <Icone icone={p.icone} />\n </span>\n )}\n <span className=\"lp-abas-rot\">{p.rotulo}</span>\n {p.badge}\n {!!p.pendentes && (\n <span className=\"lp-abas-pend\">\n {p.pendentes}\n <span className=\"lp-sr\"> pendência(s) nesta aba</span>\n </span>\n )}\n </>\n );\n\n const lista = (\n <div\n className=\"lp-abas-barra\"\n role=\"tablist\"\n aria-label={rotulo ?? titulo}\n aria-orientation={vertical ? 'vertical' : undefined}\n ref={barra}\n >\n {entradas.map((en) => {\n if ('grupo' in en) {\n const on = en.abas.some((a) => a.props.valor === atual);\n const escolhida = en.abas.find((a) => a.props.valor === atual);\n return (\n <MenuSuspenso\n key={`grupo-${en.grupo}`}\n rotulo={en.grupo}\n itens={en.abas.map((a) => ({\n id: a.props.valor,\n rotulo: a.props.rotulo,\n icone: a.props.icone,\n desabilitado: a.props.desabilitada,\n ativo: a.props.valor === atual,\n }))}\n aoEscolher={selecionar}\n className=\"lp-abas-grupo\"\n gatilho={(props, aberto) => (\n <button\n {...props}\n type=\"button\"\n className={cx('lp-abas-tab', on && 'is-on', aberto && 'is-aberto')}\n onKeyDown={(e) => {\n props.onKeyDown(e);\n if (!e.defaultPrevented) aoTeclar(e);\n }}\n >\n <span className=\"lp-abas-rot\">{escolhida ? `${en.grupo}: ${escolhida.props.rotulo}` : en.grupo}</span>\n <Icone icone=\"chevron-down\" className=\"lp-abas-seta\" />\n </button>\n )}\n />\n );\n }\n const p = en.aba.props;\n const on = p.valor === atual;\n return (\n <button\n key={p.valor}\n type=\"button\"\n role=\"tab\"\n id={`${base}-tab-${p.valor}`}\n aria-controls={temPainel(p) ? `${base}-painel-${p.valor}` : undefined}\n aria-selected={on}\n aria-disabled={p.desabilitada || undefined}\n tabIndex={on ? 0 : -1}\n className={cx('lp-abas-tab', on && 'is-on', p.desabilitada && 'is-off')}\n onClick={() => !p.desabilitada && selecionar(p.valor)}\n onKeyDown={aoTeclar}\n >\n {conteudoTab(p, en.i)}\n </button>\n );\n })}\n </div>\n );\n\n const paineis = abas.filter((a) => temPainel(a.props));\n\n return (\n <div\n className={cx(\n 'lp-abas',\n `lp-abas--${variante}`,\n `lp-abas--alinha-${alinha}`,\n orientacao !== 'horizontal' && `lp-abas--${orientacao}`,\n iconeAcima && 'lp-abas--icone-acima',\n painel === 'caixa' && 'lp-abas--painel-caixa',\n posicaoBarra === 'base' && 'lp-abas--barra-base',\n pagina && 'lp-abas--pagina',\n className,\n )}\n >\n {pagina ? (\n <div className=\"lp-abas-banda\">\n <header className=\"lp-abas-cab\">\n {aoVoltar && (\n <button type=\"button\" className=\"lp-voltar\" aria-label=\"Voltar\" title=\"Voltar\" onClick={aoVoltar}>\n <Icone icone=\"arrow-left\" />\n </button>\n )}\n <div className=\"lp-abas-titulos\">\n <h2 className=\"lp-abas-titulo\">{titulo}</h2>\n {identidade && <span className=\"lp-abas-ident\">{identidade}</span>}\n </div>\n {acoes && <div className=\"lp-abas-acoes\">{acoes}</div>}\n </header>\n {lista}\n </div>\n ) : cabecalho ? (\n <div className=\"lp-abas-topo\">\n <div className=\"lp-abas-cabecalho\">{cabecalho}</div>\n {lista}\n </div>\n ) : (\n lista\n )}\n {paineis.length > 0 && (\n <div className=\"lp-abas-paineis\">\n {paineis.map((a) => (\n <div\n key={a.props.valor}\n role=\"tabpanel\"\n id={`${base}-painel-${a.props.valor}`}\n aria-labelledby={a.props.grupo ? undefined : `${base}-tab-${a.props.valor}`}\n aria-label={a.props.grupo ? a.props.rotulo : undefined}\n className=\"lp-abas-painel\"\n hidden={a.props.valor !== atual}\n >\n {a.props.children}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useId, useState, type HTMLAttributes, type KeyboardEvent, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone } from '../../utils/Icone';\nimport type { Severidade } from '../../utils/tipos';\nimport './Card.css';\n\n/** Mesmas cores do `Alerta`/`Badge`. */\nexport type CorCard = Severidade | 'pri' | 'destaque';\n\nexport interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'title'> {\n /** Capa que sangra até a borda (imagem, mapa…). */\n midia?: ReactNode;\n /**\n * Onde fica a mídia: `topo` (padrão) · `base` · `esquerda`/`direita`\n * (card horizontal) · `fundo` (texto sobre a imagem, com véu escuro).\n */\n posicaoMidia?: 'topo' | 'base' | 'esquerda' | 'direita' | 'fundo';\n /** Título do cabeçalho (com linha embaixo). */\n titulo?: ReactNode;\n subtitulo?: ReactNode;\n /** Conteúdo à direita do título (botões, badge). */\n ferramentas?: ReactNode;\n /** Botão de recolher/expandir o corpo no cabeçalho. */\n recolhivel?: boolean;\n /** Começa recolhido (com `recolhivel`). */\n recolhidoInicial?: boolean;\n /** Botão de fechar no cabeçalho: o card sai da tela. */\n dispensavel?: boolean;\n aoFechar?: () => void;\n /** Botão que abre o card em tela cheia (Esc volta). */\n telaCheia?: boolean;\n /** Ações flutuantes no canto superior direito (aparecem no hover). */\n acoes?: ReactNode;\n rodape?: ReactNode;\n /** Fundo na cor (texto claro/escuro conforme o contraste). */\n cor?: CorCard;\n /** Borda na cor, fundo normal. */\n borda?: CorCard;\n alinhamento?: 'esquerda' | 'centro' | 'direita';\n /** Corpo sem espaçamento interno (listas, tabelas, imagem inteira). */\n corpoSemEspaco?: boolean;\n /**\n * Painel de leitura que COBRE o card ao passar o mouse ou focar (ex.: algumas\n * linhas de `<Detalhes>`). Enriquecimento rápido, não substitui a ficha.\n */\n detalhes?: ReactNode;\n /** Torna o card inteiro clicável (role=button + Enter/Espaço). */\n aoClicar?: () => void;\n children?: ReactNode;\n}\n\nexport function Card({\n midia,\n posicaoMidia = 'topo',\n titulo,\n subtitulo,\n ferramentas,\n recolhivel = false,\n recolhidoInicial = false,\n dispensavel = false,\n aoFechar,\n telaCheia = false,\n acoes,\n rodape,\n cor,\n borda,\n alinhamento,\n corpoSemEspaco = false,\n detalhes,\n aoClicar,\n children,\n className,\n ...resto\n}: CardProps) {\n const [recolhido, setRecolhido] = useState(recolhidoInicial);\n const [fechado, setFechado] = useState(false);\n const [cheio, setCheio] = useState(false);\n const corpoId = useId();\n\n // tela cheia: Esc volta e a página atrás não rola\n useEffect(() => {\n if (!cheio) return;\n const h = (e: globalThis.KeyboardEvent) => e.key === 'Escape' && setCheio(false);\n document.addEventListener('keydown', h);\n const antes = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', h);\n document.body.style.overflow = antes;\n };\n }, [cheio]);\n\n if (fechado) return null;\n\n const interativo = !!aoClicar;\n const aoTeclar = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n aoClicar?.();\n }\n };\n\n const comFerramentas = recolhivel || dispensavel || telaCheia || !!ferramentas;\n const cabecalho = (titulo || subtitulo || comFerramentas) && (\n <div className=\"lp-card-cab\">\n <div className=\"lp-card-titulos\">\n {titulo && <div className=\"lp-card-titulo\">{titulo}</div>}\n {subtitulo && <div className=\"lp-card-subtitulo\">{subtitulo}</div>}\n </div>\n {comFerramentas && (\n <div className=\"lp-card-ferramentas\" onClick={(e) => e.stopPropagation()}>\n {ferramentas}\n {recolhivel && (\n <button type=\"button\" className=\"lp-card-ferr\" aria-expanded={!recolhido} aria-controls={corpoId} aria-label={recolhido ? 'Expandir' : 'Recolher'} title={recolhido ? 'Expandir' : 'Recolher'} onClick={() => setRecolhido((x) => !x)}>\n <Icone icone={recolhido ? 'chevron-down' : 'chevron-up'} />\n </button>\n )}\n {telaCheia && (\n <button type=\"button\" className=\"lp-card-ferr\" aria-pressed={cheio} aria-label={cheio ? 'Sair da tela cheia' : 'Tela cheia'} title={cheio ? 'Sair da tela cheia' : 'Tela cheia'} onClick={() => setCheio((x) => !x)}>\n <Icone icone={cheio ? 'minimize' : 'maximize'} />\n </button>\n )}\n {dispensavel && (\n <button\n type=\"button\"\n className=\"lp-card-ferr\"\n aria-label=\"Fechar\"\n title=\"Fechar\"\n onClick={() => {\n aoFechar?.();\n setFechado(true);\n }}\n >\n <Icone icone=\"x\" />\n </button>\n )}\n </div>\n )}\n </div>\n );\n\n const fundo = posicaoMidia === 'fundo';\n const horizontal = posicaoMidia === 'esquerda' || posicaoMidia === 'direita';\n const conteudo = (\n <>\n {cabecalho}\n <div id={corpoId} className={cx('lp-card-corpo', corpoSemEspaco && 'lp-card-corpo--sem-espaco')} hidden={recolhido}>\n {children}\n </div>\n {rodape && !recolhido && <div className=\"lp-card-rodape\">{rodape}</div>}\n </>\n );\n\n return (\n <div\n className={cx(\n 'lp-card',\n interativo && 'lp-card--interativo',\n !!midia && `lp-card--midia-${posicaoMidia}`,\n cor && 'lp-card--cor',\n borda && 'lp-card--borda',\n alinhamento && alinhamento !== 'esquerda' && `lp-card--${alinhamento}`,\n cheio && 'lp-card--cheio',\n className,\n )}\n data-cor={cor ?? borda}\n role={interativo ? 'button' : undefined}\n tabIndex={interativo ? 0 : undefined}\n onClick={aoClicar}\n onKeyDown={interativo ? aoTeclar : undefined}\n {...resto}\n >\n {acoes && (\n <div className=\"lp-card-acoes\" onClick={(e) => e.stopPropagation()}>\n {acoes}\n </div>\n )}\n {midia && posicaoMidia !== 'base' && posicaoMidia !== 'direita' && <div className=\"lp-card-midia\">{midia}</div>}\n {horizontal || fundo ? <div className=\"lp-card-conteudo\">{conteudo}</div> : conteudo}\n {midia && (posicaoMidia === 'base' || posicaoMidia === 'direita') && <div className=\"lp-card-midia\">{midia}</div>}\n {detalhes && (\n <div className=\"lp-card-detalhes\" tabIndex={0} role=\"group\" aria-label=\"Detalhes\">\n {detalhes}\n </div>\n )}\n </div>\n );\n}\n\n/** Cards colados lado a lado, com a mesma altura (vira coluna em tela estreita). */\nexport function GrupoCards({ children, className }: { children: ReactNode; className?: string }) {\n return <div className={cx('lp-grupo-cards', className)}>{children}</div>;\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport './Recolhivel.css';\n\nexport interface RecolhivelProps {\n aberto: boolean;\n children: ReactNode;\n /** `vertical` (padrão) anima a altura; `horizontal`, a largura. */\n orientacao?: 'vertical' | 'horizontal';\n id?: string;\n className?: string;\n}\n\n/**\n * Mostra/esconde o conteúdo com animação. Fechado, o conteúdo sai da ordem de\n * foco e do leitor de tela (`inert`).\n */\nexport function Recolhivel({ aberto, children, orientacao = 'vertical', id, className }: RecolhivelProps) {\n return (\n <div id={id} className={cx('lp-recolhivel', orientacao === 'horizontal' && 'lp-recolhivel--horizontal', aberto && 'is-aberto', className)} inert={!aberto}>\n <div className=\"lp-recolhivel-interno\">{children}</div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type KeyboardEvent, type PointerEvent, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone } from '../../utils/Icone';\nimport './Carrossel.css';\n\nexport interface SlideCarrossel {\n imagem: string;\n alt: string;\n titulo?: ReactNode;\n descricao?: ReactNode;\n /** Tempo deste slide, em ms (sobrepõe o `intervalo` do carrossel). */\n intervalo?: number;\n}\n\nexport interface CarrosselProps {\n slides: SlideCarrossel[];\n /** Nome do carrossel para leitor de tela. */\n rotulo: string;\n /** Avança sozinho. Desligado para quem prefere menos movimento. */\n automatico?: boolean;\n /** Tempo de cada slide, em ms. */\n intervalo?: number;\n /** Setas de anterior/próximo. */\n controles?: boolean;\n /** Tracinhos que levam a cada slide. */\n indicadores?: boolean;\n /** `deslizar` (padrão) ou `esmaecer`. */\n transicao?: 'deslizar' | 'esmaecer';\n /** Controles e legendas escuros, para imagens claras. */\n escuro?: boolean;\n /** Arrastar para os lados no toque/mouse troca o slide. */\n arrastar?: boolean;\n /** Proporção da área (ex.: `'16 / 9'`). */\n proporcao?: string;\n className?: string;\n}\n\nconst prefereMenosMovimento = () => typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n/** Carrossel de imagens com legendas, setas, indicadores e avanço automático. */\nexport function Carrossel({\n slides,\n rotulo,\n automatico = true,\n intervalo = 5000,\n controles = false,\n indicadores = false,\n transicao = 'deslizar',\n escuro = false,\n arrastar = true,\n proporcao = '16 / 10',\n className,\n}: CarrosselProps) {\n const n = slides.length;\n const [atual, setAtual] = useState(0);\n const [pausadoUsuario, setPausadoUsuario] = useState(() => prefereMenosMovimento());\n const [pausadoHover, setPausadoHover] = useState(false);\n const inicioArraste = useRef<number | null>(null);\n\n const ir = useCallback((i: number) => setAtual(((i % n) + n) % n), [n]);\n // a partir do estado mais recente: cliques seguidos não usam um índice velho\n const proximo = useCallback(() => setAtual((a) => (a + 1) % n), [n]);\n const anterior = () => setAtual((a) => (a - 1 + n) % n);\n\n const rodando = automatico && !pausadoUsuario && !pausadoHover && n > 1;\n useEffect(() => {\n if (!rodando) return;\n const t = window.setTimeout(proximo, slides[atual]?.intervalo ?? intervalo);\n return () => window.clearTimeout(t);\n }, [rodando, proximo, atual, slides, intervalo]);\n\n const aoTeclar = (e: KeyboardEvent) => {\n if (e.key === 'ArrowRight') proximo();\n else if (e.key === 'ArrowLeft') anterior();\n else return;\n e.preventDefault();\n };\n\n const aoPressionar = (e: PointerEvent) => {\n if (arrastar) inicioArraste.current = e.clientX;\n };\n const aoSoltar = (e: PointerEvent) => {\n const x0 = inicioArraste.current;\n inicioArraste.current = null;\n if (x0 === null) return;\n const dx = e.clientX - x0;\n if (dx < -40) proximo();\n else if (dx > 40) anterior();\n };\n\n return (\n <section\n className={cx('lp-carrossel', `lp-carrossel--${transicao}`, escuro && 'lp-carrossel--escuro', !arrastar && 'lp-carrossel--sem-arraste', className)}\n aria-roledescription=\"carrossel\"\n aria-label={rotulo}\n onMouseEnter={() => setPausadoHover(true)}\n onMouseLeave={() => setPausadoHover(false)}\n onFocus={() => setPausadoHover(true)}\n onBlur={(e) => !e.currentTarget.contains(e.relatedTarget as Node | null) && setPausadoHover(false)}\n onKeyDown={aoTeclar}\n >\n <div\n className=\"lp-carrossel-janela\"\n style={{ aspectRatio: proporcao }}\n // anúncio só quando a troca vem do usuário: com avanço automático, silêncio\n aria-live={rodando ? 'off' : 'polite'}\n onPointerDown={aoPressionar}\n onPointerUp={aoSoltar}\n onPointerCancel={() => (inicioArraste.current = null)}\n >\n <div className=\"lp-carrossel-trilho\" style={transicao === 'deslizar' ? { transform: `translateX(${-atual * 100}%)` } : undefined}>\n {slides.map((s, i) => (\n <div\n key={i}\n className={cx('lp-carrossel-slide', i === atual && 'is-atual')}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${i + 1} de ${n}`}\n inert={i !== atual}\n >\n <img src={s.imagem} alt={s.alt} draggable={false} />\n {(s.titulo || s.descricao) && (\n <div className=\"lp-carrossel-legenda\">\n {s.titulo && <strong>{s.titulo}</strong>}\n {s.descricao && <span>{s.descricao}</span>}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n\n {controles && n > 1 && (\n <>\n <button type=\"button\" className=\"lp-carrossel-seta lp-carrossel-seta--ant\" aria-label=\"Slide anterior\" onClick={anterior}>\n <Icone icone=\"chevron-left\" />\n </button>\n <button type=\"button\" className=\"lp-carrossel-seta lp-carrossel-seta--prox\" aria-label=\"Próximo slide\" onClick={proximo}>\n <Icone icone=\"chevron-right\" />\n </button>\n </>\n )}\n {indicadores && n > 1 && (\n <div className=\"lp-carrossel-indicadores\">\n {slides.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n className={cx('lp-carrossel-ind', i === atual && 'is-atual')}\n aria-label={`Ir para o slide ${i + 1}`}\n aria-current={i === atual ? 'true' : undefined}\n onClick={() => ir(i)}\n />\n ))}\n </div>\n )}\n {automatico && n > 1 && (\n <button\n type=\"button\"\n className=\"lp-carrossel-pausa\"\n aria-label={pausadoUsuario ? 'Retomar a troca automática' : 'Pausar a troca automática'}\n onClick={() => setPausadoUsuario((p) => !p)}\n >\n <Icone icone={pausadoUsuario ? 'play' : 'pause'} />\n </button>\n )}\n </section>\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type PointerEvent, type ReactNode } from 'react';\nimport { portal } from '../../utils/portal';\nimport { cx } from '../../utils/cx';\nimport { Icone } from '../../utils/Icone';\nimport './QuadroArrastavel.css';\n\nexport interface ColunaArrastavel<T> {\n id: string;\n /** Nome da coluna (anunciado ao mover pelo teclado). */\n titulo?: string;\n itens: T[];\n}\n\nexport interface QuadroArrastavelProps<T extends { id: string }> {\n colunas: ColunaArrastavel<T>[];\n /** Recebe as colunas já reordenadas. */\n aoMudar: (colunas: ColunaArrastavel<T>[]) => void;\n /** Desenha o item; ponha a `alca` (botão de arrastar) onde quiser, ex.: no cabeçalho do card. */\n renderItem: (item: T, alca: ReactNode) => ReactNode;\n /** Nome de cada item para leitor de tela (ex.: o título do card). */\n nomeItem: (item: T) => string;\n className?: string;\n}\n\ninterface Arraste {\n id: string;\n x: number;\n y: number;\n dx: number;\n dy: number;\n largura: number;\n}\n\ntype Posicao = { coluna: number; indice: number };\n\nfunction localizar<T extends { id: string }>(colunas: ColunaArrastavel<T>[], id: string): Posicao | null {\n for (let c = 0; c < colunas.length; c++) {\n const i = colunas[c].itens.findIndex((x) => x.id === id);\n if (i >= 0) return { coluna: c, indice: i };\n }\n return null;\n}\n\nfunction mover<T extends { id: string }>(colunas: ColunaArrastavel<T>[], de: Posicao, para: Posicao): ColunaArrastavel<T>[] {\n const novas = colunas.map((c) => ({ ...c, itens: [...c.itens] }));\n const [item] = novas[de.coluna].itens.splice(de.indice, 1);\n novas[para.coluna].itens.splice(Math.min(para.indice, novas[para.coluna].itens.length), 0, item);\n return novas;\n}\n\n/**\n * Colunas de itens (cards) que se reordenam arrastando, entre colunas\n * inclusive. Mouse, toque e teclado: na alça, Espaço pega/solta, setas movem,\n * Esc devolve ao lugar de origem.\n */\nexport function QuadroArrastavel<T extends { id: string }>({ colunas, aoMudar, renderItem, nomeItem, className }: QuadroArrastavelProps<T>) {\n const [arraste, setArraste] = useState<Arraste | null>(null);\n const [pego, setPego] = useState<{ id: string; origem: ColunaArrastavel<T>[] } | null>(null);\n const [anuncio, setAnuncio] = useState('');\n const refsColunas = useRef<Array<HTMLDivElement | null>>([]);\n\n const nomeColuna = (c: number) => colunas[c]?.titulo ?? `coluna ${c + 1}`;\n const item = (id: string) => colunas.flatMap((c) => c.itens).find((x) => x.id === id);\n\n // ---- ponteiro (mouse e toque) ----\n const aoPressionar = (e: PointerEvent<HTMLButtonElement>, id: string) => {\n if (e.button !== 0) return;\n const el = e.currentTarget.closest<HTMLElement>('[data-quadro-item]');\n if (!el) return;\n e.preventDefault();\n const r = el.getBoundingClientRect();\n setArraste({ id, x: e.clientX, y: e.clientY, dx: e.clientX - r.left, dy: e.clientY - r.top, largura: r.width });\n };\n\n // ouvido na janela: ao trocar de coluna a alça é remontada e perderia o ponteiro\n const aoMoverPonteiro = useRef<(e: globalThis.PointerEvent) => void>(() => {});\n aoMoverPonteiro.current = (e) => {\n if (!arraste) return;\n const { clientX: x, clientY: y } = e;\n setArraste({ ...arraste, x, y });\n // coluna sob o ponteiro (ou a mais próxima; em tela estreita elas ficam empilhadas)\n let alvo = -1;\n let menor = Infinity;\n refsColunas.current.forEach((col, c) => {\n if (!col) return;\n const r = col.getBoundingClientRect();\n const fora = (v: number, min: number, max: number) => (v < min ? min - v : v > max ? v - max : 0);\n const dist = fora(x, r.left, r.right) + fora(y, r.top, r.bottom);\n if (dist < menor) {\n menor = dist;\n alvo = c;\n }\n });\n const col = refsColunas.current[alvo];\n const de = localizar(colunas, arraste.id);\n if (!col || !de) return;\n // posição: quantos itens (fora o arrastado) têm o meio acima do ponteiro\n const outros = Array.from(col.querySelectorAll<HTMLElement>('[data-quadro-item]')).filter((el) => el.dataset.quadroItem !== arraste.id);\n const indice = outros.filter((el) => {\n const r = el.getBoundingClientRect();\n return r.top + r.height / 2 < y;\n }).length;\n if (de.coluna !== alvo || de.indice !== indice) aoMudar(mover(colunas, de, { coluna: alvo, indice }));\n };\n\n const arrastando = !!arraste;\n useEffect(() => {\n if (!arrastando) return;\n const mover_ = (e: globalThis.PointerEvent) => aoMoverPonteiro.current(e);\n const soltar = () => setArraste(null);\n window.addEventListener('pointermove', mover_);\n window.addEventListener('pointerup', soltar);\n window.addEventListener('pointercancel', soltar);\n return () => {\n window.removeEventListener('pointermove', mover_);\n window.removeEventListener('pointerup', soltar);\n window.removeEventListener('pointercancel', soltar);\n };\n }, [arrastando]);\n\n // pelo teclado, trocar de coluna remonta a alça: devolve o foco a ela\n useLayoutEffect(() => {\n if (!pego) return;\n const alca = document.querySelector<HTMLElement>(`[data-quadro-item=\"${CSS.escape(pego.id)}\"] .lp-quadro-alca`);\n if (alca && document.activeElement !== alca) alca.focus();\n }, [colunas, pego]);\n\n // ---- teclado ----\n const aoTeclar = (e: KeyboardEvent<HTMLButtonElement>, id: string) => {\n const nome = nomeItem(item(id)!);\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n if (pego) {\n const p = localizar(colunas, id)!;\n setPego(null);\n setAnuncio(`${nome} solto em ${nomeColuna(p.coluna)}, posição ${p.indice + 1}.`);\n } else {\n setPego({ id, origem: colunas });\n setAnuncio(`${nome} pego. Use as setas para mover, Espaço para soltar, Esc para cancelar.`);\n }\n return;\n }\n if (!pego || pego.id !== id) return;\n if (e.key === 'Escape') {\n e.preventDefault();\n aoMudar(pego.origem);\n setPego(null);\n setAnuncio(`Movimento cancelado. ${nome} voltou ao lugar.`);\n return;\n }\n const de = localizar(colunas, id);\n if (!de) return;\n let para: Posicao | null = null;\n if (e.key === 'ArrowUp' && de.indice > 0) para = { coluna: de.coluna, indice: de.indice - 1 };\n else if (e.key === 'ArrowDown' && de.indice < colunas[de.coluna].itens.length - 1) para = { coluna: de.coluna, indice: de.indice + 1 };\n else if (e.key === 'ArrowLeft' && de.coluna > 0) para = { coluna: de.coluna - 1, indice: de.indice };\n else if (e.key === 'ArrowRight' && de.coluna < colunas.length - 1) para = { coluna: de.coluna + 1, indice: de.indice };\n if (!e.key.startsWith('Arrow')) return;\n e.preventDefault();\n if (!para) return;\n const novas = mover(colunas, de, para);\n aoMudar(novas);\n const final = localizar(novas, id)!;\n setAnuncio(`${nome} em ${nomeColuna(final.coluna)}, posição ${final.indice + 1} de ${novas[final.coluna].itens.length}.`);\n };\n\n const alca = (it: T) => (\n <button\n type=\"button\"\n className={cx('lp-quadro-alca', pego?.id === it.id && 'is-pego')}\n aria-label={`Mover ${nomeItem(it)}`}\n aria-pressed={pego?.id === it.id}\n title=\"Arrastar\"\n onPointerDown={(e) => aoPressionar(e, it.id)}\n onKeyDown={(e) => aoTeclar(e, it.id)}\n onBlur={() => {\n // adiado: se a alça só foi remontada, o foco volta a ela antes disto rodar\n window.setTimeout(() => {\n const ativo = document.activeElement as HTMLElement | null;\n if (pego?.id === it.id && ativo?.closest('[data-quadro-item]')?.getAttribute('data-quadro-item') !== it.id) setPego(null);\n }, 0);\n }}\n >\n <Icone icone=\"grip-vertical\" />\n </button>\n );\n\n const fantasma = arraste && item(arraste.id);\n\n return (\n <div className={cx('lp-quadro', arraste && 'is-arrastando', className)}>\n {colunas.map((col, c) => (\n <div key={col.id} ref={(el) => void (refsColunas.current[c] = el)} className=\"lp-quadro-coluna\" aria-label={col.titulo} role={col.titulo ? 'group' : undefined}>\n {col.itens.map((it) => (\n <div\n key={it.id}\n data-quadro-item={it.id}\n className={cx('lp-quadro-item', arraste?.id === it.id && 'is-vazio', pego?.id === it.id && 'is-pego')}\n >\n {renderItem(it, alca(it))}\n </div>\n ))}\n </div>\n ))}\n <div className=\"lp-sr\" aria-live=\"assertive\">\n {anuncio}\n </div>\n {arraste &&\n fantasma &&\n portal(\n <div\n className=\"lp-quadro-fantasma\"\n style={{ left: arraste.x - arraste.dx, top: arraste.y - arraste.dy, width: arraste.largura } as CSSProperties}\n aria-hidden=\"true\"\n inert\n >\n {renderItem(fantasma, <span className=\"lp-quadro-alca\">{<Icone icone=\"grip-vertical\" />}</span>)}\n </div>,\n )}\n </div>\n );\n}\n","import { createContext, useContext, useId, useState, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { Recolhivel } from '../Recolhivel/Recolhivel';\nimport './Acordeao.css';\n\nexport type CorAcordeao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\n/**\n * `padrao` = caixa com borda · `sem-borda` = encostado no container ·\n * `solido` = cabeçalho aberto na cor · `suave` = cabeçalho aberto em tom\n * claro · `contorno` = borda na cor.\n */\nexport type VarianteAcordeao = 'padrao' | 'sem-borda' | 'solido' | 'suave' | 'contorno';\n\ninterface Ctx {\n abertos: string[];\n alternar: (valor: string) => void;\n icone: 'seta' | 'mais' | 'nenhum';\n}\nconst AcordeaoCtx = createContext<Ctx | null>(null);\n\nexport interface AcordeaoProps {\n children: ReactNode;\n /** Vários itens abertos ao mesmo tempo. */\n multiplo?: boolean;\n /** Itens abertos (controlado). */\n abertos?: string[];\n /** Itens abertos de início (não controlado). */\n padraoAbertos?: string[];\n aoMudar?: (abertos: string[]) => void;\n variante?: VarianteAcordeao;\n cor?: CorAcordeao;\n /** Itens soltos, com espaço entre eles. */\n separado?: boolean;\n /** `seta` (padrão) · `mais` = + / − · `nenhum`. */\n icone?: 'seta' | 'mais' | 'nenhum';\n /** Lado do ícone. */\n posicaoIcone?: 'fim' | 'inicio';\n className?: string;\n}\n\n/** Lista de seções que abrem e fecham (acordeão). */\nexport function Acordeao({\n children,\n multiplo = false,\n abertos: controlado,\n padraoAbertos = [],\n aoMudar,\n variante = 'padrao',\n cor,\n separado = false,\n icone = 'seta',\n posicaoIcone = 'fim',\n className,\n}: AcordeaoProps) {\n const [interno, setInterno] = useState(padraoAbertos);\n const abertos = controlado ?? interno;\n\n const alternar = (valor: string) => {\n const aberto = abertos.includes(valor);\n const novos = aberto ? abertos.filter((v) => v !== valor) : multiplo ? [...abertos, valor] : [valor];\n setInterno(novos);\n aoMudar?.(novos);\n };\n\n return (\n <AcordeaoCtx.Provider value={{ abertos, alternar, icone }}>\n <div\n className={cx(\n 'lp-acord',\n `lp-acord--${variante}`,\n cor && cor !== 'pri' && `lp-acord--${cor}`,\n separado && 'lp-acord--separado',\n posicaoIcone === 'inicio' && 'lp-acord--icone-inicio',\n className,\n )}\n >\n {children}\n </div>\n </AcordeaoCtx.Provider>\n );\n}\n\nexport interface ItemAcordeaoProps {\n valor: string;\n titulo: ReactNode;\n /** Ícone antes do título. */\n icone?: IconeProp;\n /** Cor só deste item (sobrepõe a do acordeão). */\n cor?: CorAcordeao;\n desabilitado?: boolean;\n children: ReactNode;\n}\n\n/** Seção de um `Acordeao`. */\nexport function ItemAcordeao({ valor, titulo, icone, cor, desabilitado = false, children }: ItemAcordeaoProps) {\n const ctx = useContext(AcordeaoCtx);\n const id = useId();\n if (!ctx) throw new Error('ItemAcordeao precisa estar dentro de <Acordeao>.');\n const aberto = ctx.abertos.includes(valor);\n\n return (\n <div className={cx('lp-acord-item', cor && `lp-acord--${cor}`, aberto && 'is-aberto', desabilitado && 'is-desabilitado')}>\n <h3 className=\"lp-acord-cab\">\n <button\n type=\"button\"\n id={`${id}-cab`}\n className=\"lp-acord-botao\"\n aria-expanded={aberto}\n aria-controls={`${id}-painel`}\n disabled={desabilitado}\n onClick={() => ctx.alternar(valor)}\n >\n {icone && <Icone icone={icone} className=\"lp-acord-ic-titulo\" />}\n <span className=\"lp-acord-titulo\">{titulo}</span>\n {ctx.icone !== 'nenhum' && (\n <span className={cx('lp-acord-indicador', ctx.icone === 'seta' && 'lp-acord-indicador--seta')} aria-hidden=\"true\">\n <Icone icone={ctx.icone === 'mais' ? (aberto ? 'minus' : 'plus') : 'chevron-down'} />\n </span>\n )}\n </button>\n </h3>\n <Recolhivel aberto={aberto}>\n <div id={`${id}-painel`} role=\"region\" aria-labelledby={`${id}-cab`} className=\"lp-acord-corpo\">\n {children}\n </div>\n </Recolhivel>\n </div>\n );\n}\n","import type { ButtonHTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { Dica } from '../Dica/Dica';\nimport './AcaoLinha.css';\n\nexport interface AcaoLinhaProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n icone: IconeProp;\n /** Nome da ação: vira dica e aria-label. */\n rotulo: string;\n /** `pri` = azul · `destaque` = laranja · `err` = vermelho. */\n severidade?: 'neutra' | 'pri' | 'destaque' | 'err';\n carregando?: boolean;\n}\n\n/** Botão-ícone compacto para ações de linha de tabela/card. */\nexport function AcaoLinha({\n icone,\n rotulo,\n severidade = 'neutra',\n carregando = false,\n disabled,\n className,\n type = 'button',\n ...resto\n}: AcaoLinhaProps) {\n return (\n <Dica texto={rotulo}>\n <button\n type={type}\n className={cx('lp-acao', severidade !== 'neutra' && `lp-acao--${severidade}`, className)}\n aria-label={rotulo}\n aria-busy={carregando || undefined}\n disabled={disabled || carregando}\n {...resto}\n >\n {carregando ? <Icone icone=\"loader-circle\" girar /> : <Icone icone={icone} />}\n </button>\n </Dica>\n );\n}\n","import {\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { portal } from '../../utils/portal';\nimport { cx } from '../../utils/cx';\nimport { useCliqueFora } from '../../utils/useCliqueFora';\nimport './Balao.css';\n\nexport type PosicaoBalao = 'cima' | 'direita' | 'baixo' | 'esquerda';\nexport type CorBalao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\n/** `padrao` · `cabecalho` = só o título na cor · `solido` = balão todo na cor · `suave` = fundo claro da cor. */\nexport type AparenciaBalao = 'padrao' | 'cabecalho' | 'solido' | 'suave';\n/**\n * `clique` = abre/fecha no clique; fecha também ao clicar fora ou Esc ·\n * `foco` = fecha no próximo clique em qualquer lugar · `passar` = abre com o\n * mouse em cima ou com o foco do teclado.\n */\nexport type GatilhoBalao = 'clique' | 'foco' | 'passar';\n\nexport interface BalaoProps {\n /** O elemento que abre o balão (botão, ícone, avatar…). */\n children: ReactNode;\n titulo?: ReactNode;\n conteudo: ReactNode;\n /** Lado preferido; vira para o oposto se não couber. */\n posicao?: PosicaoBalao;\n cor?: CorBalao;\n aparencia?: AparenciaBalao;\n gatilho?: GatilhoBalao;\n /** Largura máxima (padrão `17rem`). */\n largura?: string;\n className?: string;\n}\n\ninterface Pos {\n top: number;\n left: number;\n lado: PosicaoBalao;\n /** deslocamento da seta ao longo do lado, em px */\n seta: number;\n}\n\nconst OPOSTO: Record<PosicaoBalao, PosicaoBalao> = { cima: 'baixo', baixo: 'cima', direita: 'esquerda', esquerda: 'direita' };\nconst DISTANCIA = 10;\nconst MARGEM = 8;\n\nfunction cabe(r: DOMRect, w: number, h: number, lado: PosicaoBalao) {\n if (lado === 'cima') return r.top - DISTANCIA - h >= MARGEM;\n if (lado === 'baixo') return r.bottom + DISTANCIA + h <= window.innerHeight - MARGEM;\n if (lado === 'esquerda') return r.left - DISTANCIA - w >= MARGEM;\n return r.right + DISTANCIA + w <= window.innerWidth - MARGEM;\n}\n\nfunction posicionar(r: DOMRect, w: number, h: number, preferido: PosicaoBalao): Pos {\n const lado = cabe(r, w, h, preferido) || !cabe(r, w, h, OPOSTO[preferido]) ? preferido : OPOSTO[preferido];\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const cx_ = r.left + r.width / 2;\n const cy = r.top + r.height / 2;\n let top: number;\n let left: number;\n if (lado === 'cima' || lado === 'baixo') {\n top = lado === 'cima' ? r.top - DISTANCIA - h : r.bottom + DISTANCIA;\n left = Math.max(MARGEM, Math.min(cx_ - w / 2, vw - w - MARGEM));\n return { top, left, lado, seta: cx_ - left };\n }\n left = lado === 'esquerda' ? r.left - DISTANCIA - w : r.right + DISTANCIA;\n top = Math.max(MARGEM, Math.min(cy - h / 2, vh - h - MARGEM));\n return { top, left, lado, seta: cy - top };\n}\n\n/**\n * Balão com título e conteúdo (popover), ancorado num elemento. Abre no\n * clique, no foco ou ao passar o mouse; nas 4 direções e em cores.\n */\nexport function Balao({\n children,\n titulo,\n conteudo,\n posicao = 'cima',\n cor = 'pri',\n aparencia = 'padrao',\n gatilho = 'clique',\n largura,\n className,\n}: BalaoProps) {\n const id = useId();\n const alvo = useRef<HTMLSpanElement>(null);\n const balao = useRef<HTMLDivElement>(null);\n const timer = useRef<number | undefined>(undefined);\n const [aberto, setAberto] = useState(false);\n const [pos, setPos] = useState<Pos | null>(null);\n\n const medir = useCallback(() => {\n const a = alvo.current;\n const b = balao.current;\n if (!a || !b) return;\n // mede o próprio filho (o span-alvo pode ser maior que ele)\n const el = (a.firstElementChild as HTMLElement | null) ?? a;\n setPos(posicionar(el.getBoundingClientRect(), b.offsetWidth, b.offsetHeight, posicao));\n }, [posicao]);\n\n useLayoutEffect(() => {\n if (!aberto) {\n setPos(null);\n return;\n }\n medir();\n window.addEventListener('scroll', medir, true);\n window.addEventListener('resize', medir);\n return () => {\n window.removeEventListener('scroll', medir, true);\n window.removeEventListener('resize', medir);\n };\n }, [aberto, medir]);\n\n // Esc fecha; no gatilho `foco`, qualquer clique fecha\n useEffect(() => {\n if (!aberto) return;\n const esc = (e: KeyboardEvent) => e.key === 'Escape' && setAberto(false);\n document.addEventListener('keydown', esc);\n if (gatilho !== 'foco') return () => document.removeEventListener('keydown', esc);\n // adiado: o próprio clique que abriu não pode fechar\n const t = window.setTimeout(() => document.addEventListener('pointerdown', fechar), 0);\n function fechar(e: PointerEvent) {\n if (alvo.current?.contains(e.target as Node)) return;\n setAberto(false);\n }\n return () => {\n window.clearTimeout(t);\n document.removeEventListener('keydown', esc);\n document.removeEventListener('pointerdown', fechar);\n };\n }, [aberto, gatilho]);\n\n useCliqueFora([alvo, balao], aberto && gatilho === 'clique', () => setAberto(false));\n useEffect(() => () => window.clearTimeout(timer.current), []);\n\n const passar = gatilho === 'passar';\n const abrirLogo = () => {\n window.clearTimeout(timer.current);\n setAberto(true);\n };\n // atraso ao sair: dá tempo de levar o mouse até o balão\n const fecharDepois = () => {\n window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => setAberto(false), 120);\n };\n\n const filhoDesabilitado = isValidElement<{ disabled?: boolean }>(children) && !!children.props.disabled;\n const filho = isValidElement(children)\n ? cloneElement(children as ReactElement<Record<string, unknown>>, {\n 'aria-expanded': passar ? undefined : aberto,\n 'aria-describedby': aberto ? id : undefined,\n })\n : children;\n\n return (\n <span\n ref={alvo}\n className=\"lp-balao-alvo\"\n // botão desabilitado não recebe foco nem eventos: o próprio alvo assume\n tabIndex={filhoDesabilitado ? 0 : undefined}\n onClick={passar ? undefined : () => setAberto((a) => !a)}\n onMouseEnter={passar ? abrirLogo : undefined}\n onMouseLeave={passar ? fecharDepois : undefined}\n onFocus={passar ? abrirLogo : undefined}\n onBlur={passar ? fecharDepois : undefined}\n >\n {filho}\n {aberto &&\n portal(\n <div\n ref={balao}\n id={id}\n role={passar ? 'tooltip' : 'dialog'}\n aria-label={typeof titulo === 'string' ? titulo : undefined}\n className={cx(\n 'lp-balao',\n cor !== 'pri' && `lp-balao--${cor}`,\n aparencia !== 'padrao' && `lp-balao--${aparencia}`,\n pos && `lp-balao--${pos.lado}`,\n className,\n )}\n style={\n {\n top: pos?.top ?? 0,\n left: pos?.left ?? 0,\n maxWidth: largura,\n visibility: pos ? undefined : 'hidden',\n '--balao-seta': pos ? `${pos.seta}px` : undefined,\n } as CSSProperties\n }\n onMouseEnter={passar ? abrirLogo : undefined}\n onMouseLeave={passar ? fecharDepois : undefined}\n // o portal ainda borbulha no React: sem isto, clicar no balão o fecharia pelo alvo\n onClick={(e) => e.stopPropagation()}\n >\n <span className=\"lp-balao-seta\" aria-hidden=\"true\" />\n {titulo && <div className=\"lp-balao-titulo\">{titulo}</div>}\n <div className=\"lp-balao-corpo\">{conteudo}</div>\n </div>,\n )}\n </span>\n );\n}\n","import { createContext, useContext, useEffect, useId, useState, type CSSProperties, type FormEvent, type MouseEvent, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { tituloDeEntidade, type Entidade, type Modo } from '../../utils/entidade';\nimport { Botao } from '../Botao/Botao';\nimport { Trilha, type ItemTrilha } from '../Trilha/Trilha';\nimport { RevelarCamposCtx } from '../Campo/Campo';\nimport { Dialogo, type TamanhoDialogo } from '../Dialogo/Dialogo';\nimport './Form.css';\n\ninterface CtxForm {\n arranjo: 'pagina' | 'modal';\n}\n\nconst FormCtx = createContext<CtxForm>({ arranjo: 'pagina' });\n\n/** Item do menu lateral: cada um leva a um formulário do mesmo cadastro. */\nexport interface ItemMenuForm {\n id: string;\n rotulo: string;\n icone?: IconeProp;\n /** Com `href` o item vira link (ex.: `#/pedidos/novo/itens`). */\n href?: string;\n /** Chip de pendências ao lado do rótulo. */\n pendencias?: number;\n desabilitado?: boolean;\n}\n\nexport interface FormProps {\n /** `pagina` = tela cheia com menu lateral opcional · `modal` = dentro de diálogo. */\n arranjo?: 'pagina' | 'modal';\n /**\n * Título do cabeçalho. Com `entidade`, pode ser omitido: vira\n * \"Cadastrar/Editar/Visualizar <entidade>\" conforme o `modo`.\n */\n titulo?: string;\n /** Entidade do cadastro (`'veículo'` ou `{ nome, novo: 'Firmar contrato' }`). */\n entidade?: string | Entidade;\n /** Fase do registro na tela (padrão: `novo`). Em `leitura` some o Salvar. */\n modo?: Modo;\n /**\n * Página: trilha de navegação abaixo do título. `true` = caminho automático\n * do menu; lista = automático + estes passos no fim.\n */\n trilha?: boolean | ItemTrilha[];\n /** Identificação do registro (ex.: \"Protocolo 2026/0012\"). */\n identidade?: string;\n icone?: IconeProp;\n /** Modal: controla a abertura. */\n aberto?: boolean;\n tamanho?: TamanhoDialogo;\n aoSalvar?: () => void;\n aoCancelar?: () => void;\n salvando?: boolean;\n /** Quantos campos faltam corrigir — mostrado no rodapé. */\n pendencias?: number;\n /** Página: menu lateral com os formulários do cadastro. */\n menu?: ItemMenuForm[];\n /** Título do card do menu (padrão: \"Formulários\"). */\n menuTitulo?: string;\n /** `id` do item do menu que corresponde a este formulário. */\n menuAtivo?: string;\n /** Clique num item do menu; num item com `href`, chame `preventDefault` para navegar por conta própria. */\n aoEscolherMenu?: (id: string, evento: MouseEvent) => void;\n /** Botões extras no rodapé, antes de Cancelar/Salvar. */\n acoes?: ReactNode;\n /** Cancelar + Salvar no rodapé (padrão: sim). */\n acoesPadrao?: boolean;\n /**\n * Página: onde ficam os botões. `secao` (padrão) = card logo abaixo das\n * seções · `fixo` = barra presa ao pé da tela.\n */\n posicaoAcoes?: 'secao' | 'fixo';\n rotuloSalvar?: string;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Formulário de cadastro. Agrupe os campos em `<FormSecao>`; a grade de\n * colunas, o menu lateral e o rodapé com Salvar/Cancelar vêm prontos.\n */\nexport function Form({\n arranjo = 'pagina',\n titulo: tituloProp,\n entidade,\n modo = 'novo',\n trilha,\n identidade,\n icone,\n aberto = true,\n tamanho = 'grande',\n aoSalvar,\n aoCancelar,\n salvando = false,\n pendencias,\n menu,\n menuTitulo = 'Formulários',\n menuAtivo,\n aoEscolherMenu,\n acoes,\n acoesPadrao = true,\n posicaoAcoes = 'secao',\n rotuloSalvar = 'Salvar',\n children,\n className,\n}: FormProps) {\n const formId = `lp-form-${useId().replace(/:/g, '')}`;\n const titulo = tituloProp ?? (entidade ? tituloDeEntidade(entidade, modo) : '');\n const leitura = modo === 'leitura';\n // cada envio revela as pendências de todos os campos; reabrir zera\n const [tentativas, setTentativas] = useState(0);\n useEffect(() => {\n if (aberto) setTentativas(0);\n }, [aberto]);\n\n const aoSubmeter = (e: FormEvent) => {\n e.preventDefault();\n setTentativas((n) => n + 1);\n if (!salvando) aoSalvar?.();\n };\n\n const rodape = (\n <div className=\"lp-form-rodape\">\n {pendencias !== undefined && (\n <span className={cx('lp-form-pend', pendencias ? 'is-warn' : 'is-ok')} role=\"status\">\n <Icone icone={pendencias ? 'circle-alert' : 'circle-check'} />\n {pendencias ? `${pendencias} campo(s) a corrigir` : 'Pronto para salvar'}\n </span>\n )}\n <span className=\"lp-form-rodape-esp\" />\n {acoes}\n {acoesPadrao && (\n <>\n <Botao rotulo={leitura ? 'Fechar' : 'Cancelar'} severidade=\"secundario\" disabled={salvando} onClick={aoCancelar} />\n {!leitura && <Botao type=\"submit\" form={formId} rotulo={rotuloSalvar} icone=\"save\" carregando={salvando} />}\n </>\n )}\n </div>\n );\n\n const corpo = (\n <form id={formId} className=\"lp-form-secoes\" onSubmit={aoSubmeter} noValidate>\n <RevelarCamposCtx.Provider value={tentativas}>\n {leitura ? (\n <fieldset className=\"lp-form-leitura\" disabled>\n {children}\n </fieldset>\n ) : (\n children\n )}\n </RevelarCamposCtx.Provider>\n </form>\n );\n\n const ctx: CtxForm = { arranjo };\n\n if (arranjo === 'modal') {\n return (\n <FormCtx.Provider value={ctx}>\n <Dialogo\n aberto={aberto}\n aoFechar={() => aoCancelar?.()}\n titulo={titulo}\n subtitulo={identidade}\n icone={icone}\n tamanho={tamanho}\n dispensavel={!salvando}\n rodape={acoesPadrao || acoes ? rodape : undefined}\n className={className}\n >\n {corpo}\n </Dialogo>\n </FormCtx.Provider>\n );\n }\n\n if (!aberto) return null;\n const comMenu = !!menu?.length;\n const temAcoes = acoesPadrao || !!acoes;\n\n return (\n <FormCtx.Provider value={ctx}>\n <div className={cx('lp-form-pagina', className)}>\n <header className=\"lp-form-cab\">\n {aoCancelar && (\n <button type=\"button\" className=\"lp-voltar\" aria-label=\"Voltar\" title=\"Voltar\" onClick={aoCancelar}>\n <Icone icone=\"arrow-left\" />\n </button>\n )}\n {icone && (\n <span className=\"lp-form-cab-ic\">\n <Icone icone={icone} />\n </span>\n )}\n <div className=\"lp-form-titulos-col\">\n <div className=\"lp-form-titulos\">\n <h2 className=\"lp-form-titulo\">{titulo}</h2>\n {identidade && <span className=\"lp-form-ident\">{identidade}</span>}\n </div>\n {trilha && <Trilha extras={Array.isArray(trilha) ? trilha : undefined} className=\"lp-form-trilha\" />}\n </div>\n </header>\n\n <div className={cx('lp-form-corpo', !comMenu && 'sem-menu')}>\n {comMenu && (\n <aside className=\"lp-form-menu\">\n <div className=\"lp-form-menu-cab\">\n <h3 className=\"lp-form-menu-titulo\">{menuTitulo}</h3>\n </div>\n <nav className=\"lp-form-menu-nav\" aria-label={menuTitulo}>\n {menu.map((item) => {\n const on = item.id === menuAtivo;\n const conteudo = (\n <>\n <Icone icone={item.icone} />\n <span className=\"lp-form-menu-rot\">{item.rotulo}</span>\n {!!item.pendencias && <span className=\"lp-form-pendchip\">{item.pendencias}</span>}\n </>\n );\n const props = {\n className: cx('lp-form-menu-item', on && 'is-on'),\n 'aria-current': on ? ('page' as const) : undefined,\n onClick: (e: MouseEvent) => aoEscolherMenu?.(item.id, e),\n };\n return item.href && !item.desabilitado ? (\n <a key={item.id} href={item.href} {...props}>\n {conteudo}\n </a>\n ) : (\n <button key={item.id} type=\"button\" disabled={item.desabilitado} {...props}>\n {conteudo}\n </button>\n );\n })}\n </nav>\n </aside>\n )}\n <div className=\"lp-form-col\">\n {corpo}\n {temAcoes && posicaoAcoes === 'secao' && <div className=\"lp-fsec lp-form-acoes\">{rodape}</div>}\n </div>\n </div>\n\n {temAcoes && posicaoAcoes === 'fixo' && (\n <footer className=\"lp-form-pe\">\n <div className=\"lp-form-pe-col\">{rodape}</div>\n </footer>\n )}\n </div>\n </FormCtx.Provider>\n );\n}\n\nexport interface FormSecaoProps {\n legenda: string;\n icone?: IconeProp;\n /** Botões no cabeçalho da seção. */\n acoes?: ReactNode;\n /** Colunas da grade (padrão: 4 na página, 3 no modal). */\n colunas?: number;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Seção de formulário: card com título e grade de campos.\n * Larguras: `className=\"lp-col-2\"`, `lp-col-3` ou `lp-col-full` no campo.\n */\nexport function FormSecao({ legenda, icone, acoes, colunas, children, className }: FormSecaoProps) {\n const { arranjo } = useContext(FormCtx);\n const id = `lp-sec-${useId().replace(/:/g, '')}`;\n\n const estilo = colunas ? ({ '--lp-colunas': colunas } as CSSProperties) : undefined;\n const grade = (\n <div className={cx('lp-fsec-grade', !!colunas && 'tem-colunas')} style={estilo}>\n {children}\n </div>\n );\n\n if (arranjo === 'modal') {\n return (\n <fieldset id={id} className={cx('lp-fsec lp-fsec--modal', !!acoes && 'tem-acoes', className)}>\n <legend className=\"lp-fsec-legenda-up\">\n <Icone icone={icone} />\n {legenda}\n </legend>\n {acoes && <div className=\"lp-fsec-acoes lp-fsec-acoes--borda\">{acoes}</div>}\n {grade}\n </fieldset>\n );\n }\n\n return (\n <section id={id} className={cx('lp-fsec lp-fsec--pagina', className)} aria-labelledby={`${id}-t`}>\n <div className=\"lp-fsec-legenda\">\n <Icone icone={icone} />\n <span className=\"lp-fsec-legenda-txt\" id={`${id}-t`}>\n {legenda}\n </span>\n {acoes && <span className=\"lp-fsec-acoes\">{acoes}</span>}\n </div>\n {grade}\n </section>\n );\n}\n","import { forwardRef, type ChangeEvent, type TextareaHTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Campo, descricaoDe, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\nimport './CampoTextarea.css';\n\ntype TextareaNativo = Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'value' | 'className'>;\n\nexport interface CampoTextareaProps extends Omit<CampoBaseProps, 'variante'>, TextareaNativo {\n valor?: string;\n aoMudar?: (valor: string) => void;\n /** Com `maxLength`, mostra o contador `n/máx` no canto. */\n contador?: boolean;\n}\n\nexport const CampoTextarea = forwardRef<HTMLTextAreaElement, CampoTextareaProps>(function CampoTextarea(\n { rotulo, dica, erro, aviso, obrigatorio, className, id: idExterno, valor, aoMudar, onChange, maxLength, contador = true, rows = 3, ...resto },\n ref,\n) {\n const { id, msgId } = useCampoIds(idExterno);\n const comContador = contador && !!maxLength;\n const tamanho = valor?.length ?? 0;\n const pct = maxLength ? tamanho / maxLength : 0;\n\n const aoDigitar = (e: ChangeEvent<HTMLTextAreaElement>) => {\n aoMudar?.(e.target.value);\n onChange?.(e);\n };\n\n return (\n <Campo rotulo={rotulo} dica={dica} erro={erro} aviso={aviso} obrigatorio={obrigatorio} className={className} htmlFor={id} msgId={msgId}>\n <div className=\"lp-ta\">\n <textarea\n ref={ref}\n id={id}\n rows={rows}\n className={cx('lp-input', comContador && 'lp-ta--contador')}\n value={valor}\n onChange={aoDigitar}\n maxLength={maxLength}\n required={obrigatorio}\n aria-required={obrigatorio || undefined}\n aria-invalid={erro ? true : undefined}\n aria-describedby={descricaoDe({ erro, aviso, dica }, msgId)}\n {...resto}\n />\n {comContador && (\n <span\n className={cx('lp-ta-contador', pct >= 1 ? 'is-err' : pct >= 0.9 && 'is-warn')}\n aria-hidden=\"true\"\n >\n {tamanho}/{maxLength}\n </span>\n )}\n </div>\n </Campo>\n );\n});\n","import { useCallback, useLayoutEffect, useState, type RefObject } from 'react';\n\nexport interface PosicaoFlutuante {\n top: number;\n left: number;\n width: number;\n /** true quando abriu para CIMA por falta de espaço embaixo */\n acima: boolean;\n}\n\n/**\n * Posição `fixed` de um painel flutuante ancorado num elemento (select,\n * dica). Recalcula em scroll (de qualquer container) e resize.\n */\nexport function usePosicaoFlutuante(\n ancora: RefObject<HTMLElement | null>,\n aberto: boolean,\n alturaEstimada = 260,\n espaco = 4,\n): PosicaoFlutuante | null {\n const [pos, setPos] = useState<PosicaoFlutuante | null>(null);\n\n const medir = useCallback(() => {\n const el = ancora.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const abaixo = window.innerHeight - r.bottom;\n const acima = abaixo < alturaEstimada && r.top > abaixo;\n setPos({\n top: acima ? r.top - espaco : r.bottom + espaco,\n left: r.left,\n width: r.width,\n acima,\n });\n }, [ancora, alturaEstimada, espaco]);\n\n useLayoutEffect(() => {\n if (!aberto) {\n setPos(null);\n return;\n }\n medir();\n window.addEventListener('scroll', medir, true);\n window.addEventListener('resize', medir);\n return () => {\n window.removeEventListener('scroll', medir, true);\n window.removeEventListener('resize', medir);\n };\n }, [aberto, medir]);\n\n return pos;\n}\n","import { Icone } from '../../utils/Icone';\nimport { useCallback, useEffect, useRef, useState, type KeyboardEvent } from 'react';\nimport { portal } from '../../utils/portal';\nimport { cx } from '../../utils/cx';\nimport { normalizar } from '../../utils/texto';\nimport type { Opcao } from '../../utils/tipos';\nimport { useCliqueFora } from '../../utils/useCliqueFora';\nimport { usePosicaoFlutuante } from '../../utils/usePosicaoFlutuante';\nimport { Campo, descricaoDe, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\nimport './CampoSelect.css';\n\ninterface BaseSelectProps<V> extends CampoBaseProps {\n opcoes: Opcao<V>[];\n placeholder?: string;\n /** Digitar filtra as opções. */\n comBusca?: boolean;\n /** Mostra o \"×\" para limpar quando há valor. */\n botaoLimpar?: boolean;\n disabled?: boolean;\n id?: string;\n}\n\nexport interface CampoSelectProps<V = string> extends BaseSelectProps<V> {\n valor?: V | null;\n aoMudar?: (valor: V | null) => void;\n}\n\nexport interface CampoSelectMultiploProps<V = string> extends BaseSelectProps<V> {\n valor?: V[];\n aoMudar?: (valor: V[]) => void;\n}\n\n\ninterface InternoProps<V> extends BaseSelectProps<V> {\n multiplo: boolean;\n selecionados: V[];\n alternar: (o: Opcao<V>) => void;\n limpar: () => void;\n}\n\nfunction SelectInterno<V>({\n rotulo,\n dica,\n erro,\n aviso,\n obrigatorio,\n variante = 'campo',\n className,\n id: idExterno,\n opcoes,\n placeholder = 'Selecione',\n comBusca = false,\n botaoLimpar = false,\n disabled = false,\n multiplo,\n selecionados,\n alternar,\n limpar,\n}: InternoProps<V>) {\n const { id, msgId } = useCampoIds(idExterno);\n const listaId = `${id}-lista`;\n const inline = variante === 'inline';\n\n const moldura = useRef<HTMLDivElement>(null);\n const painel = useRef<HTMLDivElement>(null);\n const gatilho = useRef<HTMLDivElement & HTMLInputElement>(null);\n\n const [aberto, setAberto] = useState(false);\n const [ativo, setAtivo] = useState(-1);\n const [termo, setTermo] = useState('');\n\n const pos = usePosicaoFlutuante(moldura, aberto);\n const estaSel = (o: Opcao<V>) => selecionados.some((v) => Object.is(v, o.valor));\n\n const visiveis = comBusca && termo.trim()\n ? opcoes.filter((o) => normalizar(o.rotulo).includes(normalizar(termo.trim())))\n : opcoes;\n\n const rotuloSelecao = opcoes\n .filter(estaSel)\n .map((o) => o.rotulo)\n .join(', ');\n\n const fechar = useCallback(() => {\n setAberto(false);\n setTermo('');\n setAtivo(-1);\n }, []);\n\n const abrir = () => {\n if (disabled) return;\n const idx = opcoes.findIndex(estaSel);\n setAtivo(idx >= 0 ? idx : 0);\n setAberto(true);\n };\n\n useCliqueFora([moldura, painel], aberto, fechar);\n\n // mantém a opção ativa visível ao navegar por teclado\n useEffect(() => {\n if (aberto && ativo >= 0) document.getElementById(`${id}-op-${ativo}`)?.scrollIntoView({ block: 'nearest' });\n }, [aberto, ativo, id]);\n\n const mover = (passo: number) => {\n if (!visiveis.length) return;\n let i = ativo;\n for (let n = 0; n < visiveis.length; n++) {\n i = (i + passo + visiveis.length) % visiveis.length;\n if (!visiveis[i].desabilitada) break;\n }\n setAtivo(i);\n };\n\n const escolher = (o: Opcao<V>) => {\n if (o.desabilitada) return;\n alternar(o);\n if (!multiplo) {\n fechar();\n gatilho.current?.focus();\n } else {\n setTermo('');\n }\n };\n\n const aoTeclar = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (aberto) mover(1);\n else abrir();\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (aberto) mover(-1);\n else abrir();\n break;\n case 'Home':\n if (aberto) {\n e.preventDefault();\n setAtivo(0);\n }\n break;\n case 'End':\n if (aberto) {\n e.preventDefault();\n setAtivo(visiveis.length - 1);\n }\n break;\n case 'Enter':\n e.preventDefault();\n if (aberto && visiveis[ativo]) escolher(visiveis[ativo]);\n else if (!aberto) abrir();\n break;\n case ' ':\n if (comBusca) break;\n e.preventDefault();\n if (aberto && visiveis[ativo]) escolher(visiveis[ativo]);\n else abrir();\n break;\n case 'Escape':\n if (aberto) {\n e.preventDefault();\n e.stopPropagation();\n fechar();\n }\n break;\n case 'Tab':\n if (aberto) fechar();\n break;\n }\n };\n\n const ariaComum = {\n id,\n role: 'combobox',\n 'aria-expanded': aberto,\n 'aria-controls': listaId,\n 'aria-haspopup': 'listbox' as const,\n 'aria-activedescendant': aberto && ativo >= 0 ? `${id}-op-${ativo}` : undefined,\n 'aria-required': obrigatorio || undefined,\n 'aria-invalid': erro ? true : undefined,\n 'aria-describedby': descricaoDe({ erro, aviso, dica }, msgId),\n 'aria-disabled': disabled || undefined,\n onKeyDown: aoTeclar,\n };\n\n return (\n <Campo\n rotulo={rotulo}\n dica={dica}\n erro={erro}\n aviso={aviso}\n obrigatorio={obrigatorio}\n variante={variante}\n className={className}\n htmlFor={id}\n msgId={msgId}\n >\n <div\n ref={moldura}\n className={cx('lp-sel', !inline && 'lp-ctl-frame', erro && 'is-invalid', disabled && 'is-disabled')}\n >\n {comBusca ? (\n <input\n ref={gatilho}\n {...ariaComum}\n className=\"lp-input lp-input--bare lp-sel-input\"\n aria-autocomplete=\"list\"\n autoComplete=\"off\"\n disabled={disabled}\n placeholder={rotuloSelecao || placeholder}\n value={aberto ? termo : rotuloSelecao}\n onChange={(e) => {\n setTermo(e.target.value);\n setAtivo(0);\n if (!aberto) setAberto(true);\n }}\n onClick={() => !aberto && abrir()}\n />\n ) : (\n <div\n ref={gatilho}\n {...ariaComum}\n tabIndex={disabled ? -1 : 0}\n className=\"lp-sel-gatilho\"\n onClick={() => (aberto ? fechar() : abrir())}\n >\n <span className={cx('lp-sel-texto', !rotuloSelecao && 'lp-sel-ph')}>{rotuloSelecao || placeholder}</span>\n </div>\n )}\n {botaoLimpar && selecionados.length > 0 && !disabled && (\n <button type=\"button\" className=\"lp-ctl-suffix\" aria-label=\"Limpar seleção\" onClick={limpar}>\n <Icone icone=\"x\" />\n </button>\n )}\n <button\n type=\"button\"\n className=\"lp-ctl-suffix lp-sel-seta\"\n tabIndex={-1}\n aria-hidden=\"true\"\n disabled={disabled}\n onClick={() => {\n if (aberto) fechar();\n else {\n abrir();\n gatilho.current?.focus();\n }\n }}\n >\n <Icone icone={aberto ? 'chevron-up' : 'chevron-down'} />\n </button>\n </div>\n\n {aberto &&\n pos &&\n portal(\n <div\n ref={painel}\n className=\"lp-sel-painel\"\n style={{\n top: pos.top,\n left: pos.left,\n width: pos.width,\n transform: pos.acima ? 'translateY(-100%)' : undefined,\n }}\n >\n <ul id={listaId} role=\"listbox\" className=\"lp-sel-lista\" aria-multiselectable={multiplo || undefined}>\n {visiveis.map((o, i) => {\n const sel = estaSel(o);\n return (\n <li\n key={i}\n id={`${id}-op-${i}`}\n role=\"option\"\n aria-selected={sel}\n aria-disabled={o.desabilitada || undefined}\n data-ativo={i === ativo || undefined}\n className=\"lp-sel-op\"\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setAtivo(i)}\n onClick={() => escolher(o)}\n >\n {multiplo && <span className=\"lp-sel-check\" aria-hidden=\"true\" />}\n {o.rotulo}\n </li>\n );\n })}\n </ul>\n {!visiveis.length && (\n <div className=\"lp-sel-nada\" role=\"status\">\n Nenhum resultado encontrado\n </div>\n )}\n </div>,\n )}\n </Campo>\n );\n}\n\n/** Select de opção única. */\nexport function CampoSelect<V = string>({ valor, aoMudar, ...p }: CampoSelectProps<V>) {\n const temValor = valor !== null && valor !== undefined;\n return (\n <SelectInterno<V>\n {...p}\n multiplo={false}\n selecionados={temValor ? [valor] : []}\n alternar={(o) => aoMudar?.(o.valor)}\n limpar={() => aoMudar?.(null)}\n />\n );\n}\n\n/** Select de várias opções (com caixas de marcação). */\nexport function CampoSelectMultiplo<V = string>({ valor = [], aoMudar, ...p }: CampoSelectMultiploProps<V>) {\n return (\n <SelectInterno<V>\n {...p}\n multiplo\n selecionados={valor}\n alternar={(o) =>\n aoMudar?.(valor.some((v) => Object.is(v, o.valor)) ? valor.filter((v) => !Object.is(v, o.valor)) : [...valor, o.valor])\n }\n limpar={() => aoMudar?.([])}\n />\n );\n}\n","import { ESTADOS, TIPOS_PESSOA } from '../../utils/constantes';\nimport { CampoSelect, CampoSelectMultiplo, type CampoSelectMultiploProps, type CampoSelectProps } from '../CampoSelect/CampoSelect';\n\ntype SemOpcoes<P> = Omit<P, 'opcoes'>;\n\nexport interface CampoUfProps extends SemOpcoes<CampoSelectProps<string>> {\n /** `sigla` = \"PR\" · `completo` = \"PR — Paraná\" (padrão). */\n exibicao?: 'sigla' | 'completo';\n}\n\nconst opcoesUf = (exibicao: CampoUfProps['exibicao']) =>\n ESTADOS.map((e) => ({ valor: e.uf, rotulo: exibicao === 'sigla' ? e.uf : `${e.uf} — ${e.descricao}` }));\n\n/** UF (estado) a partir de `ESTADOS`; o valor é a sigla. */\nexport function CampoUf({ exibicao = 'completo', comBusca = true, placeholder = 'UF', ...p }: CampoUfProps) {\n return <CampoSelect<string> opcoes={opcoesUf(exibicao)} comBusca={comBusca} placeholder={placeholder} {...p} />;\n}\n\nexport interface CampoUfMultiploProps extends SemOpcoes<CampoSelectMultiploProps<string>> {\n exibicao?: 'sigla' | 'completo';\n}\n\n/** Várias UFs; o valor é a lista de siglas. */\nexport function CampoUfMultiplo({ exibicao = 'completo', comBusca = true, placeholder = 'UFs', ...p }: CampoUfMultiploProps) {\n return <CampoSelectMultiplo<string> opcoes={opcoesUf(exibicao)} comBusca={comBusca} placeholder={placeholder} {...p} />;\n}\n\nexport type CampoTipoPessoaProps = SemOpcoes<CampoSelectProps<'F' | 'J'>>;\n\n/** Pessoa física (`F`) ou jurídica (`J`). */\nexport function CampoTipoPessoa({ placeholder = 'Selecione', ...p }: CampoTipoPessoaProps) {\n return <CampoSelect<'F' | 'J'> opcoes={[...TIPOS_PESSOA]} placeholder={placeholder} {...p} />;\n}\n","import { useRef, type KeyboardEvent } from 'react';\nimport { cx } from '../../utils/cx';\nimport type { Opcao } from '../../utils/tipos';\nimport { Campo, descricaoDe, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\nimport './Escolha.css';\n\nexport interface EscolhaProps<V = string> extends Omit<CampoBaseProps, 'variante' | 'aviso'> {\n opcoes: Opcao<V>[];\n valor?: V | null;\n aoMudar?: (valor: V) => void;\n /** `segmentado` = botões colados · `radio` = lista de bolinhas. */\n aparencia?: 'segmentado' | 'radio';\n disabled?: boolean;\n ariaLabel?: string;\n id?: string;\n}\n\n/** Escolha única entre poucas opções (radiogroup). */\nexport function Escolha<V = string>({\n rotulo,\n dica,\n erro,\n obrigatorio,\n className,\n opcoes,\n valor,\n aoMudar,\n aparencia = 'segmentado',\n disabled = false,\n ariaLabel,\n id: idExterno,\n}: EscolhaProps<V>) {\n const { id, msgId } = useCampoIds(idExterno);\n const grupo = useRef<HTMLDivElement>(null);\n const idxSel = opcoes.findIndex((o) => Object.is(o.valor, valor));\n const idxFoco = idxSel >= 0 ? idxSel : 0;\n\n const aoTeclar = (e: KeyboardEvent, i: number) => {\n const passo = e.key === 'ArrowRight' || e.key === 'ArrowDown' ? 1 : e.key === 'ArrowLeft' || e.key === 'ArrowUp' ? -1 : 0;\n if (!passo) return;\n e.preventDefault();\n let j = i;\n for (let n = 0; n < opcoes.length; n++) {\n j = (j + passo + opcoes.length) % opcoes.length;\n if (!opcoes[j].desabilitada) break;\n }\n aoMudar?.(opcoes[j].valor);\n grupo.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]')[j]?.focus();\n };\n\n return (\n <Campo rotulo={rotulo} dica={dica} erro={erro} obrigatorio={obrigatorio} className={cx('lp-escolha-campo', className)} msgId={msgId}>\n <div\n ref={grupo}\n id={id}\n role=\"radiogroup\"\n className={cx('lp-esc', aparencia === 'radio' && 'lp-esc--radio')}\n aria-label={rotulo ?? ariaLabel}\n aria-required={obrigatorio || undefined}\n aria-invalid={erro ? true : undefined}\n aria-describedby={descricaoDe({ erro, dica }, msgId)}\n >\n {opcoes.map((o, i) => {\n const on = i === idxSel;\n return (\n <button\n key={i}\n type=\"button\"\n role=\"radio\"\n aria-checked={on}\n className={cx('lp-esc-op', on && 'is-on')}\n tabIndex={i === idxFoco ? 0 : -1}\n disabled={disabled || o.desabilitada}\n onClick={() => aoMudar?.(o.valor)}\n onKeyDown={(e) => aoTeclar(e, i)}\n >\n {aparencia === 'radio' && <span className=\"lp-esc-dot\" aria-hidden=\"true\" />}\n {o.rotulo}\n </button>\n );\n })}\n </div>\n </Campo>\n );\n}\n","import { useId, useState, type CSSProperties, type MouseEvent } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone } from '../../utils/Icone';\nimport './Avaliacao.css';\n\nexport interface AvaliacaoProps {\n /** Nota atual (0 = sem nota). */\n valor: number;\n /**\n * Muda a nota. Se devolver uma Promise (ex.: salvar no servidor), o\n * componente fica ocupado até ela terminar.\n */\n aoMudar?: (valor: number) => void | Promise<unknown>;\n /** Quantidade de estrelas. */\n max?: number;\n /** `1` = estrelas inteiras · `0.5` = meias estrelas. */\n passo?: 1 | 0.5;\n /** Só mostra a nota (aceita fração, ex.: 3.7). */\n somenteLeitura?: boolean;\n /** Nome para leitor de tela (ex.: \"Avaliação do produto\"). */\n rotulo: string;\n icone?: 'star' | 'heart';\n tamanho?: 'pequeno' | 'medio' | 'grande';\n /** Texto para cada nota inteira (índice 0 = 1 estrela), mostrado ao lado. */\n mensagens?: string[];\n /** Chamado ao passar o mouse (com a nota sob o ponteiro, ou `null` ao sair). */\n aoPassar?: (valor: number | null) => void;\n /** Botão para limpar a nota. */\n limpavel?: boolean;\n /** Texto enquanto `aoMudar` não termina. */\n textoOcupado?: string;\n className?: string;\n}\n\nconst fmt = (v: number) => v.toLocaleString('pt-BR', { maximumFractionDigits: 1 });\n\n/** Avaliação por estrelas (ou corações): editável, com meias estrelas, ou só leitura. */\nexport function Avaliacao({\n valor,\n aoMudar,\n max = 5,\n passo = 1,\n somenteLeitura = false,\n rotulo,\n icone = 'star',\n tamanho = 'medio',\n mensagens,\n aoPassar,\n limpavel = false,\n textoOcupado = 'Salvando...',\n className,\n}: AvaliacaoProps) {\n const nome = useId();\n const [sob, setSob] = useState<number | null>(null);\n const [ocupado, setOcupado] = useState(false);\n const exibido = sob ?? valor;\n const bloqueado = somenteLeitura || ocupado;\n\n const escolher = async (v: number) => {\n if (bloqueado) return;\n const r = aoMudar?.(v);\n if (r instanceof Promise) {\n setOcupado(true);\n try {\n await r;\n } finally {\n setOcupado(false);\n }\n }\n };\n\n // nota sob o ponteiro: com meias estrelas, a metade esquerda vale x,5\n const notaNoPonteiro = (e: MouseEvent<HTMLSpanElement>, i: number) => {\n if (passo === 1) return i + 1;\n const r = e.currentTarget.getBoundingClientRect();\n return e.clientX - r.left < r.width / 2 ? i + 0.5 : i + 1;\n };\n const passar = (v: number | null) => {\n if (bloqueado) return;\n setSob(v);\n aoPassar?.(v);\n };\n\n const estrelas = Array.from({ length: max }, (_, i) => {\n const preenchido = Math.max(0, Math.min(1, exibido - i)) * 100;\n return (\n <span\n key={i}\n className=\"lp-aval-estrela\"\n style={{ '--aval-pct': `${preenchido}%` } as CSSProperties}\n onMouseMove={bloqueado ? undefined : (e) => passar(notaNoPonteiro(e, i))}\n onClick={bloqueado ? undefined : (e) => escolher(notaNoPonteiro(e, i))}\n aria-hidden=\"true\"\n >\n <Icone icone={icone} className=\"lp-aval-fundo\" />\n <span className=\"lp-aval-cheia\">\n <Icone icone={icone} />\n </span>\n </span>\n );\n });\n\n const mensagem = mensagens && exibido > 0 ? mensagens[Math.ceil(exibido) - 1] : undefined;\n const classes = cx('lp-aval', `lp-aval--${tamanho}`, icone === 'heart' && 'lp-aval--coracao', ocupado && 'is-ocupado', className);\n\n if (somenteLeitura)\n return (\n <span className={classes} role=\"img\" aria-label={`${rotulo}: ${fmt(valor)} de ${max}`}>\n <span className=\"lp-aval-estrelas\">{estrelas}</span>\n </span>\n );\n\n // rádios escondidos: setas, Tab e leitor de tela funcionam sem código extra\n const opcoes: number[] = [];\n for (let v = passo; v <= max; v += passo) opcoes.push(v);\n\n return (\n <span className={classes}>\n <span className=\"lp-aval-estrelas\" role=\"radiogroup\" aria-label={rotulo} aria-busy={ocupado || undefined} onMouseLeave={() => passar(null)}>\n {estrelas}\n <span className=\"lp-sr\">\n {opcoes.map((v) => (\n <label key={v}>\n <input\n type=\"radio\"\n name={nome}\n value={v}\n checked={valor === v}\n disabled={ocupado}\n onChange={() => escolher(v)}\n onFocus={() => setSob(null)}\n />\n {fmt(v)} de {max}\n </label>\n ))}\n </span>\n </span>\n {ocupado ? (\n <span className=\"lp-aval-msg\" role=\"status\">\n {textoOcupado}\n </span>\n ) : (\n mensagem && <span className=\"lp-aval-msg\">{mensagem}</span>\n )}\n {limpavel && valor > 0 && !ocupado && (\n <button type=\"button\" className=\"lp-aval-limpar\" onClick={() => escolher(0)}>\n Limpar\n </button>\n )}\n </span>\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport { cx } from '../../utils/cx';\nimport './Chip.css';\n\nexport interface ChipProps {\n rotulo: string;\n /** Nome do que está etiquetado (ex.: \"Protocolo\" → PROTOCOLO: 123). */\n campo?: string;\n /** Mostra o \"×\" e dispara `aoRemover`. */\n aoRemover?: () => void;\n /** `false` tira o \"×\" da ordem do Tab (chips dentro de controles compostos). */\n focavel?: boolean;\n className?: string;\n}\n\nexport function Chip({ rotulo, campo, aoRemover, focavel = true, className }: ChipProps) {\n return (\n <span className={cx('lp-chip', className)}>\n {campo && <span className=\"lp-chip-campo\">{campo}:</span>}\n <span className=\"lp-chip-rotulo\">{rotulo}</span>\n {aoRemover && (\n <button\n type=\"button\"\n className=\"lp-chip-remover\"\n tabIndex={focavel ? undefined : -1}\n aria-label={`Remover ${campo ? `${campo}: ` : ''}${rotulo}`}\n onClick={aoRemover}\n >\n <Icone icone=\"x\" />\n </button>\n )}\n </span>\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport type { FormEvent, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Alerta } from '../Alerta/Alerta';\nimport { Botao } from '../Botao/Botao';\nimport { Chip } from '../Chip/Chip';\nimport './Filtros.css';\n\nexport interface FiltroAplicado {\n campo: string;\n rotulo: string;\n aoRemover?: () => void;\n}\n\nexport interface FiltrosProps {\n /** Campos de filtro — de preferência com `variante=\"inline\"`. */\n children: ReactNode;\n aoConsultar: () => void;\n aoLimpar?: () => void;\n /** Chips dos filtros já aplicados. */\n aplicados?: FiltroAplicado[];\n /** Há mudanças ainda não consultadas (ponto âmbar + aviso). */\n alterado?: boolean;\n consultando?: boolean;\n /** `barra` = linha única em card · `secao` = moldura com legenda \"Filtros\". */\n aparencia?: 'barra' | 'secao';\n className?: string;\n}\n\n/** Barra de filtros de listagem: campos + Consultar + Limpar + chips. */\nexport function Filtros({\n children,\n aoConsultar,\n aoLimpar,\n aplicados = [],\n alterado,\n consultando,\n aparencia = 'barra',\n className,\n}: FiltrosProps) {\n const aoSubmeter = (e: FormEvent) => {\n e.preventDefault();\n aoConsultar();\n };\n return (\n <div className={cx('lp-filtros', className)}>\n <form onSubmit={aoSubmeter} noValidate>\n <fieldset className={cx('lp-ff', aparencia === 'secao' && 'lp-ff--secao')}>\n {aparencia === 'secao' && (\n <legend className=\"lp-ff-leg\">\n <Icone icone=\"funnel\" />\n Filtros\n </legend>\n )}\n <div className={cx('lp-fb', aparencia === 'secao' && 'lp-fb--secao')}>\n <div className=\"lp-fb-campos\">{children}</div>\n <div className=\"lp-fb-acoes\">\n <span className=\"lp-fb-consultar\">\n <Botao\n type=\"submit\"\n rotulo=\"Consultar\"\n icone=\"search\"\n carregando={consultando}\n aria-label={alterado ? 'Consultar, filtros alterados' : 'Consultar'}\n />\n {alterado && <span className=\"lp-fb-ponto\" aria-hidden=\"true\" />}\n </span>\n {aoLimpar && (\n <Botao icone=\"funnel-x\" severidade=\"secundario\" aria-label=\"Limpar filtros\" dica=\"Limpar filtros\" onClick={aoLimpar} />\n )}\n </div>\n </div>\n </fieldset>\n </form>\n {alterado && (\n <div className=\"lp-fb-avisos\">\n <Alerta severidade=\"warn\" mensagem=\"Filtros alterados — clique em Consultar para atualizar a lista.\" />\n </div>\n )}\n {aplicados.length > 0 && (\n <div className=\"lp-fb-chips\" role=\"list\" aria-label=\"Filtros aplicados\">\n {aplicados.map((f) => (\n <span role=\"listitem\" key={f.campo}>\n <Chip campo={f.campo} rotulo={f.rotulo} aoRemover={f.aoRemover} />\n </span>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport { useContext, useRef, useState, type DragEvent, type KeyboardEvent, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport {\n filtrarItens,\n moverParaAlvo,\n moverParaFonte,\n normalizarPicklistValor,\n reordenarLista,\n type PicklistValor,\n} from '../../utils/picklist';\nimport { Botao } from '../Botao/Botao';\nimport { Campo, MSG_OBRIGATORIO, RevelarCamposCtx, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\nimport './Picklist.css';\n\nexport interface PicklistProps<T> extends Omit<CampoBaseProps, 'variante'> {\n valor?: PicklistValor<T>;\n aoMudar?: (valor: PicklistValor<T>) => void;\n rotuloFonte?: string;\n rotuloAlvo?: string;\n /** Texto do item (linha, filtro e anúncios). Obrigatório para objetos. */\n paraRotulo?: (item: T) => string;\n /** Linha customizada; padrão = `paraRotulo(item)`. */\n renderItem?: (item: T) => ReactNode;\n /** Campo de busca no topo de cada lista. */\n filtro?: boolean;\n /** Arrastar e soltar como caminho ADICIONAL (o teclado sempre funciona). */\n dragdrop?: boolean;\n /** Reordenar dentro da lista (Alt + setas, ou arrastando). */\n reordenar?: boolean;\n alturaLista?: string;\n disabled?: boolean;\n id?: string;\n}\n\ntype Lado = 'fonte' | 'alvo';\n\n/**\n * Transferência entre duas listas (disponíveis × selecionados). Teclado:\n * setas movem o foco, Espaço marca, Enter transfere, Alt+setas reordena;\n * duplo clique também transfere.\n */\nexport function Picklist<T>({\n rotulo,\n dica,\n erro,\n aviso,\n obrigatorio,\n className,\n id: idExterno,\n valor: valorBruto,\n aoMudar,\n rotuloFonte = 'Disponíveis',\n rotuloAlvo = 'Selecionados',\n paraRotulo = (i) => (typeof i === 'string' ? i : String(i)),\n renderItem,\n filtro = false,\n dragdrop = true,\n reordenar = true,\n alturaLista = '15rem',\n disabled = false,\n}: PicklistProps<T>) {\n const { id, msgId } = useCampoIds(idExterno);\n const valor = normalizarPicklistValor(valorBruto);\n const [sel, setSel] = useState<{ fonte: Set<T>; alvo: Set<T> }>({ fonte: new Set(), alvo: new Set() });\n const [termo, setTermo] = useState({ fonte: '', alvo: '' });\n const [foco, setFoco] = useState({ fonte: 0, alvo: 0 });\n const [anuncio, setAnuncio] = useState('');\n const [mexido, setMexido] = useState(false);\n const tentativas = useContext(RevelarCamposCtx);\n const arrastado = useRef<{ lado: Lado; item: T } | null>(null);\n\n const visiveis = {\n fonte: filtrarItens(valor.fonte, termo.fonte, paraRotulo),\n alvo: filtrarItens(valor.alvo, termo.alvo, paraRotulo),\n };\n\n const mudar = (v: PicklistValor<T>, msg: string) => {\n setMexido(true);\n setAnuncio(msg);\n aoMudar?.(v);\n };\n\n const transferir = (de: Lado, itens: readonly T[]) => {\n if (!itens.length || disabled) return;\n const v = de === 'fonte' ? moverParaAlvo(valor, itens) : moverParaFonte(valor, itens);\n setSel({ fonte: new Set(), alvo: new Set() });\n const destino = de === 'fonte' ? rotuloAlvo : rotuloFonte;\n mudar(v, itens.length === 1 ? `${paraRotulo(itens[0])} movido para ${destino}` : `${itens.length} itens movidos para ${destino}`);\n };\n\n const marcar = (lado: Lado, item: T, aditivo: boolean) => {\n setSel((s) => {\n const atual = new Set(aditivo ? s[lado] : []);\n if (aditivo && atual.has(item)) atual.delete(item);\n else atual.add(item);\n return { ...s, [lado]: atual };\n });\n };\n\n const reordenarItem = (lado: Lado, item: T, passo: number) => {\n const lista = valor[lado];\n const i = lista.indexOf(item);\n const j = i + passo;\n if (i < 0 || j < 0 || j >= lista.length) return;\n mudar({ ...valor, [lado]: reordenarLista(lista, i, j) }, `${paraRotulo(item)} na posição ${j + 1}`);\n };\n\n const aoTeclar = (lado: Lado) => (e: KeyboardEvent<HTMLUListElement>) => {\n const lista = visiveis[lado];\n const i = Math.min(foco[lado], lista.length - 1);\n const item = lista[i];\n const focar = (n: number) => setFoco((f) => ({ ...f, [lado]: Math.max(0, Math.min(lista.length - 1, n)) }));\n if (e.altKey && reordenar && item && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n if (termo[lado]) return; // reordenar com filtro ativo embaralharia a posição real\n const passo = e.key === 'ArrowUp' ? -1 : 1;\n reordenarItem(lado, item, passo);\n focar(i + passo);\n return;\n }\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focar(i + 1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n focar(i - 1);\n break;\n case 'Home':\n e.preventDefault();\n focar(0);\n break;\n case 'End':\n e.preventDefault();\n focar(lista.length - 1);\n break;\n case ' ':\n e.preventDefault();\n if (item) marcar(lado, item, true);\n break;\n case 'Enter': {\n e.preventDefault();\n const marcados = lista.filter((x) => sel[lado].has(x));\n transferir(lado, marcados.length ? marcados : item ? [item] : []);\n break;\n }\n }\n };\n\n const soltar = (lado: Lado, antesDe?: T) => (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const a = arrastado.current;\n arrastado.current = null;\n if (!a || disabled) return;\n if (a.lado !== lado) {\n transferir(a.lado, [a.item]);\n return;\n }\n if (!reordenar || antesDe === undefined || antesDe === a.item) return;\n const lista = valor[lado];\n mudar({ ...valor, [lado]: reordenarLista(lista, lista.indexOf(a.item), lista.indexOf(antesDe)) }, `${paraRotulo(a.item)} reordenado`);\n };\n\n const erroFinal = erro || (obrigatorio && !valor.alvo.length && (mexido || tentativas > 0) ? MSG_OBRIGATORIO : undefined);\n\n const coluna = (lado: Lado, titulo: string) => {\n const lista = visiveis[lado];\n const listaId = `${id}-${lado}`;\n const ativo = Math.min(foco[lado], lista.length - 1);\n return (\n <div className=\"lp-pick-col\">\n <div className=\"lp-pick-cab\">\n <span id={`${listaId}-t`}>{titulo}</span>\n <span className=\"lp-contador\">{valor[lado].length}</span>\n </div>\n {filtro && (\n <div className=\"lp-pick-filtro\">\n <Icone icone=\"search\" />\n <input\n className=\"lp-input lp-input--bare\"\n placeholder=\"Buscar\"\n aria-label={`Buscar em ${titulo}`}\n disabled={disabled}\n value={termo[lado]}\n onChange={(e) => {\n setTermo((t) => ({ ...t, [lado]: e.target.value }));\n setFoco((f) => ({ ...f, [lado]: 0 }));\n }}\n />\n </div>\n )}\n <ul\n id={listaId}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n aria-labelledby={`${listaId}-t`}\n aria-activedescendant={lista.length ? `${listaId}-${ativo}` : undefined}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n className=\"lp-pick-lista\"\n style={{ height: alturaLista }}\n onKeyDown={aoTeclar(lado)}\n onDragOver={(e) => dragdrop && e.preventDefault()}\n onDrop={soltar(lado)}\n >\n {lista.map((item, i) => (\n <li\n key={i}\n id={`${listaId}-${i}`}\n role=\"option\"\n aria-selected={sel[lado].has(item)}\n data-ativo={i === ativo || undefined}\n className=\"lp-pick-item\"\n draggable={dragdrop && !disabled}\n onDragStart={() => (arrastado.current = { lado, item })}\n onDragOver={(e) => dragdrop && e.preventDefault()}\n onDrop={soltar(lado, item)}\n onClick={(e) => {\n if (disabled) return;\n setFoco((f) => ({ ...f, [lado]: i }));\n marcar(lado, item, e.ctrlKey || e.metaKey);\n }}\n onDoubleClick={() => transferir(lado, [item])}\n >\n {dragdrop && !disabled && <Icone icone=\"menu\" className=\"lp-pick-alca\" />}\n <span className=\"lp-pick-rot\">{renderItem ? renderItem(item) : paraRotulo(item)}</span>\n </li>\n ))}\n {!lista.length && <li className=\"lp-pick-vazio\">{termo[lado] ? 'Nada encontrado' : 'Nenhum item'}</li>}\n </ul>\n </div>\n );\n };\n\n const marcadosFonte = visiveis.fonte.filter((x) => sel.fonte.has(x));\n const marcadosAlvo = visiveis.alvo.filter((x) => sel.alvo.has(x));\n\n return (\n <Campo rotulo={rotulo} dica={dica} erro={erroFinal} aviso={aviso} obrigatorio={obrigatorio} className={className} msgId={msgId}>\n <div className={cx('lp-pick', disabled && 'is-disabled', erroFinal && 'is-invalid')} aria-describedby={erroFinal || aviso || dica ? msgId : undefined}>\n {coluna('fonte', rotuloFonte)}\n <div className=\"lp-pick-acoes\">\n <Botao icone=\"chevron-right\" severidade=\"secundario\" aparencia=\"contorno\" dica=\"Mover selecionados\" aria-label=\"Mover selecionados\" disabled={disabled || !marcadosFonte.length} onClick={() => transferir('fonte', marcadosFonte)} />\n <Botao icone=\"chevrons-right\" severidade=\"secundario\" aparencia=\"contorno\" dica=\"Mover todos\" aria-label=\"Mover todos\" disabled={disabled || !visiveis.fonte.length} onClick={() => transferir('fonte', visiveis.fonte)} />\n <Botao icone=\"chevron-left\" severidade=\"secundario\" aparencia=\"contorno\" dica=\"Devolver selecionados\" aria-label=\"Devolver selecionados\" disabled={disabled || !marcadosAlvo.length} onClick={() => transferir('alvo', marcadosAlvo)} />\n <Botao icone=\"chevrons-left\" severidade=\"secundario\" aparencia=\"contorno\" dica=\"Devolver todos\" aria-label=\"Devolver todos\" disabled={disabled || !visiveis.alvo.length} onClick={() => transferir('alvo', visiveis.alvo)} />\n </div>\n {coluna('alvo', rotuloAlvo)}\n <span className=\"lp-sr\" aria-live=\"polite\">\n {anuncio}\n </span>\n </div>\n </Campo>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\n/** Espera padrão entre a última tecla e a busca (ms). */\nexport const BUSCA_ATRASO_MS = 300;\n\nexport interface OpcoesBuscaAssincrona<T> {\n /** A busca é do módulo: termo → registros. */\n buscar: (termo: string) => Promise<T[]>;\n /** Só busca enquanto `true` (ex.: painel aberto). Ao ligar, busca na hora, sem espera. */\n ativo?: boolean;\n /** Mínimo de caracteres; abaixo dele limpa sem chamar a API. */\n minimo?: number;\n atraso?: number;\n}\n\n/**\n * Busca remota com espera de digitação e descarte de resposta velha: só a\n * requisição MAIS RECENTE escreve o resultado (\"ab\" que volta depois de\n * \"abc\" é ignorada). Erro da API vira lista vazia.\n */\nexport function useBuscaAssincrona<T>({ buscar, ativo = true, minimo = 0, atraso = BUSCA_ATRASO_MS }: OpcoesBuscaAssincrona<T>) {\n const [termo, setTermo] = useState('');\n const [resultados, setResultados] = useState<T[]>([]);\n const [carregando, setCarregando] = useState(false);\n const seq = useRef(0);\n const buscarRef = useRef(buscar);\n buscarRef.current = buscar;\n const estavaAtivo = useRef(false);\n\n useEffect(() => {\n if (!ativo) {\n estavaAtivo.current = false;\n seq.current++;\n setCarregando(false);\n return;\n }\n const primeira = !estavaAtivo.current;\n estavaAtivo.current = true;\n if (termo.trim().length < minimo) {\n seq.current++;\n setResultados([]);\n setCarregando(false);\n return;\n }\n const minha = ++seq.current;\n setCarregando(true);\n const t = setTimeout(\n () => {\n buscarRef\n .current(termo.trim())\n .then((r) => minha === seq.current && setResultados(r))\n .catch(() => minha === seq.current && setResultados([]))\n .finally(() => minha === seq.current && setCarregando(false));\n },\n primeira ? 0 : atraso,\n );\n return () => clearTimeout(t);\n }, [termo, ativo, minimo, atraso]);\n\n // desmontou: nenhuma promessa pendente escreve mais\n useEffect(() => () => void seq.current++, []);\n\n return { termo, setTermo, resultados, carregando };\n}\n","import { Icone } from '../../utils/Icone';\nimport { useCallback, useContext, useEffect, useRef, useState, type KeyboardEvent, type Key } from 'react';\nimport { portal } from '../../utils/portal';\nimport { cx } from '../../utils/cx';\nimport { useBuscaAssincrona, BUSCA_ATRASO_MS } from '../../utils/useBuscaAssincrona';\nimport { useCliqueFora } from '../../utils/useCliqueFora';\nimport { usePosicaoFlutuante } from '../../utils/usePosicaoFlutuante';\nimport { Campo, descricaoDe, MSG_OBRIGATORIO, RevelarCamposCtx, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\nimport '../CampoSelect/CampoSelect.css';\nimport './CampoBusca.css';\n\nexport interface CampoBuscaProps<T> extends CampoBaseProps {\n /** A busca do módulo: termo → registros. */\n buscar: (termo: string) => Promise<T[]>;\n /** Texto do registro (no campo e em cada linha do painel). */\n paraRotulo: (item: T) => string;\n /** Linha secundária opcional no painel (ex.: CPF, lotação). */\n paraDetalhe?: (item: T) => string | undefined;\n /** Chave de cada resultado (padrão: `item.id` ou o rótulo). */\n chave?: (item: T) => Key;\n /** O REGISTRO escolhido — texto digitado sem escolha não é valor. */\n valor?: T | null;\n aoMudar?: (valor: T | null) => void;\n /** Mínimo de caracteres para buscar (padrão: 1). */\n minimo?: number;\n atraso?: number;\n placeholder?: string;\n disabled?: boolean;\n id?: string;\n /** Mensagem quando a busca não acha nada. */\n vazioTexto?: string;\n}\n\n/**\n * Autocompletar com busca no servidor: o jeito canônico de buscar e vincular\n * uma entidade (pessoa, servidor, fornecedor…) grande demais para carregar inteira.\n */\nexport function CampoBusca<T>({\n rotulo,\n dica,\n erro,\n aviso,\n obrigatorio,\n variante = 'campo',\n className,\n id: idExterno,\n buscar,\n paraRotulo,\n paraDetalhe,\n chave = (i) => ((i as { id?: Key }).id ?? paraRotulo(i)) as Key,\n valor = null,\n aoMudar,\n minimo = 1,\n atraso = BUSCA_ATRASO_MS,\n placeholder = 'Buscar…',\n disabled = false,\n vazioTexto = 'Nenhum resultado encontrado',\n}: CampoBuscaProps<T>) {\n const { id, msgId } = useCampoIds(idExterno);\n const listaId = `${id}-lista`;\n const inline = variante === 'inline';\n const moldura = useRef<HTMLDivElement>(null);\n const painel = useRef<HTMLDivElement>(null);\n const input = useRef<HTMLInputElement>(null);\n\n const [editando, setEditando] = useState(false);\n const [ativo, setAtivo] = useState(0);\n const [revelado, setRevelado] = useState(false);\n const tentativas = useContext(RevelarCamposCtx);\n\n const { termo, setTermo, resultados, carregando } = useBuscaAssincrona({ buscar, ativo: editando, minimo, atraso });\n const aberto = editando && termo.trim().length >= minimo;\n const pos = usePosicaoFlutuante(moldura, aberto);\n\n const fechar = useCallback(() => {\n setEditando(false);\n setTermo('');\n }, [setTermo]);\n useCliqueFora([moldura, painel], editando, fechar);\n\n useEffect(() => setAtivo(0), [resultados]);\n useEffect(() => {\n if (aberto) document.getElementById(`${id}-op-${ativo}`)?.scrollIntoView({ block: 'nearest' });\n }, [aberto, ativo, id]);\n\n const escolher = (item: T) => {\n aoMudar?.(item);\n fechar();\n input.current?.focus();\n };\n\n const aoTeclar = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown' && aberto) {\n e.preventDefault();\n setAtivo((i) => Math.min(i + 1, resultados.length - 1));\n } else if (e.key === 'ArrowUp' && aberto) {\n e.preventDefault();\n setAtivo((i) => Math.max(i - 1, 0));\n } else if (e.key === 'Enter' && aberto && resultados[ativo]) {\n e.preventDefault();\n escolher(resultados[ativo]);\n } else if (e.key === 'Escape' && editando) {\n e.preventDefault();\n e.stopPropagation();\n fechar();\n } else if (e.key === 'Tab') {\n fechar();\n }\n };\n\n const erroFinal = erro || (obrigatorio && !valor && (revelado || tentativas > 0) ? MSG_OBRIGATORIO : undefined);\n\n return (\n <Campo\n rotulo={rotulo}\n dica={dica}\n erro={erroFinal}\n aviso={aviso}\n obrigatorio={obrigatorio}\n variante={variante}\n className={className}\n htmlFor={id}\n msgId={msgId}\n >\n <div ref={moldura} className={cx('lp-sel', !inline && 'lp-ctl-frame', erroFinal && 'is-invalid', disabled && 'is-disabled')}>\n <Icone icone=\"search\" className=\"lp-busca-campo-ic\" />\n <input\n ref={input}\n id={id}\n role=\"combobox\"\n aria-expanded={aberto}\n aria-controls={listaId}\n aria-autocomplete=\"list\"\n aria-activedescendant={aberto && resultados.length ? `${id}-op-${ativo}` : undefined}\n aria-required={obrigatorio || undefined}\n aria-invalid={erroFinal ? true : undefined}\n aria-describedby={descricaoDe({ erro: erroFinal, aviso, dica }, msgId)}\n autoComplete=\"off\"\n className=\"lp-input lp-input--bare lp-sel-input\"\n disabled={disabled}\n placeholder={placeholder}\n value={editando ? termo : valor ? paraRotulo(valor) : ''}\n onChange={(e) => {\n setEditando(true);\n setTermo(e.target.value);\n // texto digitado não casa mais com o registro escolhido\n if (valor) aoMudar?.(null);\n }}\n onKeyDown={aoTeclar}\n onBlur={() => setRevelado(true)}\n />\n {carregando && editando && (\n <span role=\"status\" className=\"lp-busca-campo-carregando\">\n <Icone icone=\"loader-circle\" girar />\n <span className=\"lp-sr\">Buscando</span>\n </span>\n )}\n {valor && !disabled && !editando && (\n <button type=\"button\" className=\"lp-ctl-suffix\" aria-label=\"Limpar seleção\" onClick={() => aoMudar?.(null)}>\n <Icone icone=\"x\" />\n </button>\n )}\n </div>\n\n {aberto &&\n pos &&\n portal(\n <div\n ref={painel}\n className=\"lp-sel-painel\"\n style={{ top: pos.top, left: pos.left, width: pos.width, transform: pos.acima ? 'translateY(-100%)' : undefined }}\n >\n <ul id={listaId} role=\"listbox\" className=\"lp-sel-lista\" aria-busy={carregando || undefined}>\n {resultados.map((item, i) => (\n <li\n key={chave(item)}\n id={`${id}-op-${i}`}\n role=\"option\"\n aria-selected={i === ativo}\n data-ativo={i === ativo || undefined}\n className=\"lp-sel-op lp-busca-campo-op\"\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setAtivo(i)}\n onClick={() => escolher(item)}\n >\n <span>{paraRotulo(item)}</span>\n {paraDetalhe?.(item) && <span className=\"lp-busca-campo-det\">{paraDetalhe(item)}</span>}\n </li>\n ))}\n </ul>\n {!resultados.length && (\n <div className=\"lp-sel-nada\" role=\"status\">\n {carregando ? 'Buscando…' : vazioTexto}\n </div>\n )}\n </div>,\n )}\n </Campo>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { normalizar } from '../../utils/texto';\nimport type { CampoBaseProps } from '../Campo/Campo';\nimport { CampoTexto } from '../CampoTexto/CampoTexto';\nimport { CampoBusca } from './CampoBusca';\n\nexport interface Municipio {\n id: string | number;\n nome: string;\n}\n\nexport interface CampoCidadeProps extends CampoBaseProps {\n /** UF que filtra os municípios (`''` = nenhuma). Trocar de UF limpa a cidade. */\n uf: string;\n /**\n * Municípios da UF. Sem esta função o campo vira texto livre\n * (continua utilizável, só não sugere).\n */\n buscarPorUf?: (uf: string) => Promise<Municipio[]>;\n /** O município escolhido — ou o texto digitado, no modo texto livre. */\n valor?: Municipio | string | null;\n aoMudar?: (valor: Municipio | string | null) => void;\n placeholder?: string;\n disabled?: boolean;\n id?: string;\n}\n\n/**\n * Município filtrado pela UF, com a cascata UF → cidade embutida: quando a\n * UF muda, a cidade da UF anterior é limpa pelo próprio campo.\n */\nexport function CampoCidade({ uf, buscarPorUf, valor = null, aoMudar, placeholder = 'Município', disabled, ...p }: CampoCidadeProps) {\n const [lista, setLista] = useState<Municipio[]>([]);\n const ufAnterior = useRef(uf);\n\n useEffect(() => {\n if (!buscarPorUf || !uf) {\n setLista([]);\n return;\n }\n let vivo = true;\n buscarPorUf(uf)\n .then((l) => vivo && setLista(l))\n .catch(() => vivo && setLista([]));\n return () => {\n vivo = false;\n };\n // a função costuma ser recriada a cada render; a lista depende só da UF\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uf, !!buscarPorUf]);\n\n // cascata: a cidade escolhida sob outra UF deixa de valer\n useEffect(() => {\n if (ufAnterior.current !== uf) {\n ufAnterior.current = uf;\n if (valor) aoMudar?.(null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uf]);\n\n if (!buscarPorUf) {\n return (\n <CampoTexto\n {...p}\n disabled={disabled}\n placeholder={placeholder}\n valor={typeof valor === 'string' ? valor : valor?.nome ?? ''}\n aoMudar={(t) => aoMudar?.(t || null)}\n />\n );\n }\n\n return (\n <CampoBusca<Municipio>\n {...p}\n disabled={disabled || !uf}\n placeholder={uf ? placeholder : 'Escolha a UF primeiro'}\n minimo={1}\n atraso={0}\n buscar={async (termo) => {\n const t = normalizar(termo);\n return lista.filter((m) => normalizar(m.nome).includes(t)).slice(0, 50);\n }}\n paraRotulo={(m) => m.nome}\n chave={(m) => m.id}\n valor={typeof valor === 'object' ? valor : null}\n aoMudar={aoMudar}\n />\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport { cx } from '../../utils/cx';\nimport './Paginacao.css';\n\nexport interface PaginacaoProps {\n total: number;\n /** Página atual, começando em 1. */\n pagina: number;\n tamanho: number;\n tamanhoOpcoes?: number[];\n aoMudarPagina: (pagina: number) => void;\n aoMudarTamanho?: (tamanho: number) => void;\n /** Sem borda própria (dentro do card da tabela). */\n embutida?: boolean;\n className?: string;\n}\n\ntype Item = number | '…';\n\nfunction listaPaginas(atual: number, total: number): Item[] {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n if (atual <= 4) return [1, 2, 3, 4, 5, '…', total];\n if (atual >= total - 3) return [1, '…', total - 4, total - 3, total - 2, total - 1, total];\n return [1, '…', atual - 1, atual, atual + 1, '…', total];\n}\n\nexport function Paginacao({\n total,\n pagina,\n tamanho,\n tamanhoOpcoes = [10, 20, 50, 100],\n aoMudarPagina,\n aoMudarTamanho,\n embutida,\n className,\n}: PaginacaoProps) {\n const totalPaginas = Math.max(1, Math.ceil(total / tamanho));\n const atual = Math.min(Math.max(1, pagina), totalPaginas);\n const ini = total ? (atual - 1) * tamanho + 1 : 0;\n const fim = Math.min(atual * tamanho, total);\n const ir = (p: number) => p >= 1 && p <= totalPaginas && p !== atual && aoMudarPagina(p);\n\n return (\n <nav className={cx('lp-pag', embutida && 'lp-pag--embutida', className)} aria-label=\"Paginação\">\n <span className=\"lp-pag-exibindo\">\n Exibindo <strong>{total ? `${ini}–${fim}` : '0'}</strong> de {total}\n </span>\n <div className=\"lp-pag-dir\">\n {aoMudarTamanho && tamanhoOpcoes.length > 0 && (\n <label className=\"lp-pag-por\">\n Por página:\n <select className=\"lp-pag-sel\" value={tamanho} onChange={(e) => aoMudarTamanho(Number(e.target.value))}>\n {tamanhoOpcoes.map((n) => (\n <option key={n} value={n}>\n {n}\n </option>\n ))}\n </select>\n </label>\n )}\n <div className=\"lp-pag-paginas\">\n <button type=\"button\" className=\"lp-pag-bt\" aria-label=\"Página anterior\" disabled={atual === 1} onClick={() => ir(atual - 1)}>\n <Icone icone=\"chevron-left\" />\n </button>\n {listaPaginas(atual, totalPaginas).map((p, i) =>\n p === '…' ? (\n <span key={`g${i}`} className=\"lp-pag-bt lp-pag-gap\" aria-hidden=\"true\">\n …\n </span>\n ) : (\n <button\n key={p}\n type=\"button\"\n className={cx('lp-pag-bt', p === atual && 'is-on')}\n aria-current={p === atual ? 'page' : undefined}\n onClick={() => ir(p)}\n >\n {p}\n </button>\n ),\n )}\n <button\n type=\"button\"\n className=\"lp-pag-bt\"\n aria-label=\"Próxima página\"\n disabled={atual === totalPaginas}\n onClick={() => ir(atual + 1)}\n >\n <Icone icone=\"chevron-right\" />\n </button>\n </div>\n </div>\n </nav>\n );\n}\n","import type { CSSProperties } from 'react';\nimport { cx } from '../../utils/cx';\nimport './Skeleton.css';\n\nexport interface SkeletonProps {\n largura?: string;\n altura?: string;\n formato?: 'retangulo' | 'circulo';\n className?: string;\n}\n\n/** Silhueta de carregamento. */\nexport function Skeleton({ largura = '100%', altura = '1rem', formato = 'retangulo', className }: SkeletonProps) {\n const estilo: CSSProperties = { width: largura, height: altura };\n return <div className={cx('lp-skel', formato === 'circulo' && 'lp-skel--circulo', className)} style={estilo} aria-hidden=\"true\" />;\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport './Vazio.css';\n\nexport interface VazioProps {\n titulo: string;\n descricao?: string;\n icone?: IconeProp;\n /** Botões de ação abaixo do texto. */\n children?: ReactNode;\n className?: string;\n}\n\n/** Estado vazio (lista sem registros, busca sem resultado…). */\nexport function Vazio({ titulo, descricao, icone = 'inbox', children, className }: VazioProps) {\n return (\n <div className={cx('lp-vazio', className)}>\n <div className=\"lp-vazio-ic\">\n <Icone icone={icone} />\n </div>\n <div className=\"lp-vazio-titulo\">{titulo}</div>\n {descricao && <div className=\"lp-vazio-desc\">{descricao}</div>}\n {children && <div className=\"lp-vazio-acoes\">{children}</div>}\n </div>\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport { useEffect, useRef, type Key, type MouseEvent, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { lerCampo } from '../../utils/texto';\nimport type { Severidade } from '../../utils/tipos';\nimport { Botao } from '../Botao/Botao';\nimport { Paginacao, type PaginacaoProps } from '../Paginacao/Paginacao';\nimport { Skeleton } from '../Skeleton/Skeleton';\nimport { Status } from '../Status/Status';\nimport { Vazio } from '../Vazio/Vazio';\nimport './Tabela.css';\n\nexport interface Coluna<T> {\n /** Chave do campo no registro (aceita caminho com ponto: `endereco.cidade`). */\n campo: string;\n rotulo: string;\n ordenavel?: boolean;\n alinhamento?: 'esquerda' | 'centro' | 'direita';\n /** Texto forte (coluna principal). */\n destaque?: boolean;\n maiuscula?: boolean;\n largura?: string;\n /** Formata o valor cru da célula. */\n formato?: (valor: unknown, linha: T) => ReactNode;\n /** Renderiza a célula como selo de situação. */\n severidade?: (linha: T) => Severidade;\n /** Célula totalmente customizada. */\n render?: (linha: T) => ReactNode;\n}\n\nexport interface Ordenacao {\n campo: string;\n direcao: 'asc' | 'desc';\n}\n\nexport interface TabelaProps<T> {\n colunas: Coluna<T>[];\n registros: T[];\n /** Chave de cada linha (padrão: `linha.id` ou o índice). */\n chave?: (linha: T, indice: number) => Key;\n /** Botões de ação por linha (use `<AcaoLinha>`), na última coluna. */\n acoes?: (linha: T) => ReactNode;\n aparencia?: 'listrada' | 'grade';\n rotulo?: string;\n /** Primeira carga: silhuetas no lugar das linhas. */\n carregando?: boolean;\n /** Recarga (paginar/ordenar): mantém a tabela esmaecida. */\n atualizando?: boolean;\n erro?: string | boolean;\n aoRecarregar?: () => void;\n vazioTitulo?: string;\n vazioDescricao?: string;\n vazioIcone?: string;\n vazioAcoes?: ReactNode;\n ordenacao?: Ordenacao | null;\n aoOrdenar?: (campo: string) => void;\n selecao?: 'unica' | 'multipla';\n selecionados?: Key[];\n aoMudarSelecao?: (chaves: Key[]) => void;\n aoClicarLinha?: (linha: T) => void;\n /** Paginação controlada (servidor). */\n paginacao?: Omit<PaginacaoProps, 'embutida' | 'className'>;\n className?: string;\n}\n\n/** Mantido por compatibilidade: é o `lerCampo` dos utilitários. */\nexport const valorDoCampo = lerCampo;\n\nfunction CaixaSelecao({ marcado, indeterminado, rotulo, aoMudar }: { marcado: boolean; indeterminado?: boolean; rotulo: string; aoMudar: () => void }) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (ref.current) ref.current.indeterminate = !!indeterminado;\n }, [indeterminado]);\n return (\n <label className=\"lp-tbl-sel\" onClick={(e) => e.stopPropagation()}>\n <input ref={ref} type=\"checkbox\" className=\"lp-tbl-sel-in\" checked={marcado} onChange={aoMudar} aria-label={rotulo} />\n <span className=\"lp-tbl-sel-visual\" aria-hidden=\"true\" />\n </label>\n );\n}\n\nconst LARGURAS = ['70%', '55%', '82%', '64%', '48%'];\n\nexport function Tabela<T>({\n colunas,\n registros,\n chave = (l, i) => ((l as { id?: Key }).id ?? i) as Key,\n acoes,\n aparencia = 'listrada',\n rotulo = 'Tabela de dados',\n carregando,\n atualizando,\n erro,\n aoRecarregar,\n vazioTitulo = 'Nenhum registro encontrado',\n vazioDescricao,\n vazioIcone = 'inbox',\n vazioAcoes,\n ordenacao,\n aoOrdenar,\n selecao,\n selecionados = [],\n aoMudarSelecao,\n aoClicarLinha,\n paginacao,\n className,\n}: TabelaProps<T>) {\n const chaves = registros.map(chave);\n const sel = new Set(selecionados);\n const todos = chaves.length > 0 && chaves.every((k) => sel.has(k));\n const alguns = !todos && chaves.some((k) => sel.has(k));\n\n const alternar = (k: Key) => {\n if (selecao === 'unica') aoMudarSelecao?.(sel.has(k) ? [] : [k]);\n else aoMudarSelecao?.(sel.has(k) ? selecionados.filter((s) => s !== k) : [...selecionados, k]);\n };\n const alternarTodos = () => {\n if (todos) aoMudarSelecao?.(selecionados.filter((s) => !chaves.includes(s)));\n else aoMudarSelecao?.([...new Set([...selecionados, ...chaves])]);\n };\n\n const aoClicar = (linha: T, k: Key, e: MouseEvent) => {\n if ((e.target as HTMLElement).closest('button, a, input, label')) return;\n if (selecao) alternar(k);\n else aoClicarLinha?.(linha);\n };\n\n const alinh = (c: Coluna<T>) => (c.alinhamento === 'centro' ? 'is-centro' : c.alinhamento === 'direita' ? 'is-direita' : undefined);\n\n const iconeOrdem = (c: Coluna<T>) => {\n if (ordenacao?.campo !== c.campo) return <Icone icone=\"arrow-up-down\" />;\n return <Icone icone={ordenacao.direcao === 'asc' ? 'arrow-up-narrow-wide' : 'arrow-down-wide-narrow'} className=\"is-on\" />;\n };\n\n let corpo: ReactNode;\n if (carregando) {\n corpo = (\n <div className=\"lp-tbl-carregando\" role=\"status\" aria-busy=\"true\" aria-label=\"Carregando registros\">\n <div className=\"lp-tbl-carregando-cab\" />\n {Array.from({ length: Math.min(paginacao?.tamanho ?? 5, 8) }, (_, i) => (\n <div className=\"lp-tbl-carregando-lin\" key={i}>\n <Skeleton largura={LARGURAS[i % LARGURAS.length]} altura=\"0.6875rem\" />\n </div>\n ))}\n </div>\n );\n } else if (erro) {\n corpo = (\n <div className=\"lp-tbl-vazio\">\n <Vazio\n icone=\"triangle-alert\"\n titulo=\"Não foi possível carregar\"\n descricao={typeof erro === 'string' ? erro : 'Verifique a conexão e tente de novo.'}\n >\n {aoRecarregar && <Botao rotulo=\"Tentar de novo\" icone=\"refresh-cw\" severidade=\"secundario\" onClick={aoRecarregar} />}\n </Vazio>\n </div>\n );\n } else if (!registros.length) {\n corpo = (\n <div className=\"lp-tbl-vazio\">\n <Vazio icone={vazioIcone} titulo={vazioTitulo} descricao={vazioDescricao}>\n {vazioAcoes}\n </Vazio>\n </div>\n );\n } else {\n corpo = (\n <div className={cx('lp-tbl-scroll', atualizando && 'is-atualizando')} tabIndex={0} role=\"region\" aria-label={rotulo} aria-busy={atualizando || undefined}>\n <table className={cx('lp-tbl', aparencia === 'grade' && 'lp-tbl--grade')}>\n <thead>\n <tr>\n {selecao && (\n <th className=\"lp-tbl-col-sel\" scope=\"col\">\n {selecao === 'multipla' ? (\n <CaixaSelecao marcado={todos} indeterminado={alguns} rotulo=\"Selecionar todos os visíveis\" aoMudar={alternarTodos} />\n ) : (\n <span className=\"lp-sr\">Seleção</span>\n )}\n </th>\n )}\n {colunas.map((c) => (\n <th\n key={c.campo}\n scope=\"col\"\n className={alinh(c)}\n style={c.largura ? { width: c.largura } : undefined}\n aria-sort={\n ordenacao?.campo === c.campo ? (ordenacao.direcao === 'asc' ? 'ascending' : 'descending') : undefined\n }\n >\n {c.ordenavel && aoOrdenar ? (\n <button type=\"button\" className=\"lp-tbl-ordenar\" onClick={() => aoOrdenar(c.campo)}>\n {c.rotulo}\n {iconeOrdem(c)}\n </button>\n ) : (\n c.rotulo\n )}\n </th>\n ))}\n {acoes && (\n <th className=\"lp-tbl-col-acoes\" scope=\"col\">\n Ações\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {registros.map((linha, i) => {\n const k = chaves[i];\n const marcado = !!selecao && sel.has(k);\n return (\n <tr\n key={k}\n className={cx((selecao || aoClicarLinha) && 'is-clicavel', marcado && 'is-sel')}\n onClick={(e) => aoClicar(linha, k, e)}\n >\n {selecao && (\n <td className=\"lp-tbl-col-sel\">\n <CaixaSelecao marcado={marcado} rotulo={`Selecionar linha ${i + 1}`} aoMudar={() => alternar(k)} />\n </td>\n )}\n {colunas.map((c) => {\n const v = valorDoCampo(linha, c.campo);\n let cel: ReactNode;\n if (c.render) cel = c.render(linha);\n else if (c.severidade) cel = <Status rotulo={String(c.formato ? c.formato(v, linha) : v ?? '')} severidade={c.severidade(linha)} />;\n else if (c.formato) cel = c.formato(v, linha);\n else cel = v === null || v === undefined || v === '' ? '—' : String(v);\n return (\n <td key={c.campo} className={cx(alinh(c), c.destaque && 'is-destaque', c.maiuscula && 'is-maiuscula')}>\n {cel}\n </td>\n );\n })}\n {acoes && (\n <td className=\"lp-tbl-col-acoes\">\n <div className=\"lp-tbl-acoes\">{acoes(linha)}</div>\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n }\n\n return (\n <div className={cx('lp-tbl-card', className)}>\n {corpo}\n {paginacao && !carregando && !erro && paginacao.total > 0 && <Paginacao embutida {...paginacao} />}\n </div>\n );\n}\n","import type { MouseEvent, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport './Lista.css';\n\nexport type CorItemLista = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\n\nexport interface ListaProps {\n children: ReactNode;\n /** `padrao` = caixa com borda · `sem-borda` = encostada no container (dentro de card). */\n variante?: 'padrao' | 'sem-borda';\n /** Numera os itens (1, 2, 3…). */\n numerada?: boolean;\n /** Itens lado a lado; com breakpoint, só a partir dele (`sm` 36rem · `md` 48rem · `lg` 64rem · `xl` 75rem). */\n horizontal?: boolean | 'sm' | 'md' | 'lg' | 'xl';\n /** Nome da lista para leitor de tela. */\n rotulo?: string;\n className?: string;\n}\n\n/** Grupo de itens empilhados (list group): lista simples, de links, de seleção… */\nexport function Lista({ children, variante = 'padrao', numerada = false, horizontal = false, rotulo, className }: ListaProps) {\n const Tag = numerada ? 'ol' : 'ul';\n return (\n <Tag\n aria-label={rotulo}\n className={cx(\n 'lp-lista',\n variante === 'sem-borda' && 'lp-lista--sem-borda',\n numerada && 'lp-lista--numerada',\n horizontal === true && 'lp-lista--horizontal',\n typeof horizontal === 'string' && `lp-lista--horizontal-${horizontal}`,\n className,\n )}\n >\n {children}\n </Tag>\n );\n}\n\nexport interface ItemListaProps {\n /** Conteúdo principal (ou a descrição, quando há `titulo`). */\n children?: ReactNode;\n /** Linha em negrito acima do conteúdo. */\n titulo?: ReactNode;\n /** Ícone à esquerda (atalho para `inicio`). */\n icone?: IconeProp;\n /** Conteúdo à esquerda: avatar, ícone em caixa… */\n inicio?: ReactNode;\n /** Conteúdo à direita: badge, contagem, data… */\n fim?: ReactNode;\n ativo?: boolean;\n desabilitado?: boolean;\n /** Tom do item: fundo claro da cor, ou sólido com `solido`. */\n cor?: CorItemLista;\n solido?: boolean;\n /** Vira link. */\n href?: string;\n /** Vira botão. */\n onClick?: (e: MouseEvent<HTMLElement>) => void;\n /** Vira item de seleção: caixa de marcação ou rádio. */\n marcacao?: 'caixa' | 'radio';\n marcado?: boolean;\n aoMarcar?: (marcado: boolean) => void;\n /** Nome do grupo de rádios. */\n nome?: string;\n className?: string;\n}\n\n/** Item de `Lista`. Estático, link (`href`), botão (`onClick`) ou seleção (`marcacao`). */\nexport function ItemLista({\n children,\n titulo,\n icone,\n inicio,\n fim,\n ativo = false,\n desabilitado = false,\n cor,\n solido = false,\n href,\n onClick,\n marcacao,\n marcado,\n aoMarcar,\n nome,\n className,\n}: ItemListaProps) {\n const esquerda = inicio ?? (icone ? <Icone icone={icone} className=\"lp-lista-icone\" /> : null);\n const conteudo = (\n <>\n {marcacao && (\n <input\n type={marcacao === 'radio' ? 'radio' : 'checkbox'}\n className=\"lp-lista-marca\"\n name={nome}\n checked={marcado ?? false}\n disabled={desabilitado}\n onChange={(e) => aoMarcar?.(e.target.checked)}\n />\n )}\n {esquerda && <span className=\"lp-lista-inicio\">{esquerda}</span>}\n <span className=\"lp-lista-meio\">\n {titulo && <span className=\"lp-lista-titulo\">{titulo}</span>}\n {children && <span className={titulo ? 'lp-lista-desc' : 'lp-lista-texto'}>{children}</span>}\n </span>\n {fim && <span className=\"lp-lista-fim\">{fim}</span>}\n </>\n );\n\n let corpo: ReactNode;\n if (marcacao) corpo = <label className=\"lp-lista-corpo lp-lista-corpo--acao\">{conteudo}</label>;\n else if (href && !desabilitado)\n corpo = (\n <a className=\"lp-lista-corpo lp-lista-corpo--acao\" href={href} aria-current={ativo ? 'page' : undefined} onClick={onClick}>\n {conteudo}\n </a>\n );\n else if (onClick || href)\n corpo = (\n <button type=\"button\" className=\"lp-lista-corpo lp-lista-corpo--acao\" disabled={desabilitado} aria-pressed={onClick ? ativo : undefined} onClick={onClick}>\n {conteudo}\n </button>\n );\n else corpo = <div className=\"lp-lista-corpo\">{conteudo}</div>;\n\n return (\n <li\n className={cx(\n 'lp-lista-it',\n cor && `lp-lista-it--${cor}`,\n cor && solido && 'lp-lista-it--solido',\n ativo && 'is-ativo',\n desabilitado && 'is-desabilitado',\n className,\n )}\n aria-current={ativo && !href && !onClick ? 'true' : undefined}\n aria-disabled={desabilitado && !onClick && !href && !marcacao ? true : undefined}\n >\n {corpo}\n </li>\n );\n}\n","import type { CSSProperties, Key, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Botao } from '../Botao/Botao';\nimport { Paginacao, type PaginacaoProps } from '../Paginacao/Paginacao';\nimport { Skeleton } from '../Skeleton/Skeleton';\nimport { Vazio } from '../Vazio/Vazio';\nimport './ListaCards.css';\n\nexport interface ListaCardsProps<T> {\n itens: T[];\n /** Monta o card de cada item (normalmente um `<Card>` composto pelo módulo). */\n card: (item: T, indice: number) => ReactNode;\n chave?: (item: T, indice: number) => Key;\n /** Largura mínima de cada célula (padrão: 16rem) — define quantas colunas cabem. */\n larguraMin?: string;\n /** Altura das silhuetas: calibre pela altura do SEU card (padrão: 8.5rem). */\n alturaCard?: string;\n /** Nome acessível da grade. */\n rotulo?: string;\n /** Primeira carga: silhuetas no lugar dos cards. */\n carregando?: boolean;\n /** Recarga: mantém a grade esmaecida. */\n atualizando?: boolean;\n erro?: string | boolean;\n aoRecarregar?: () => void;\n vazioTitulo?: string;\n vazioDescricao?: string;\n vazioIcone?: string;\n vazioAcoes?: ReactNode;\n paginacao?: Omit<PaginacaoProps, 'embutida' | 'className'>;\n className?: string;\n}\n\n/** Listagem em grade de cards, irmã da `Tabela` (a ordenação fica na barra de filtros). */\nexport function ListaCards<T>({\n itens,\n card,\n chave = (i, n) => ((i as { id?: Key }).id ?? n) as Key,\n larguraMin = '16rem',\n alturaCard = '8.5rem',\n rotulo,\n carregando,\n atualizando,\n erro,\n aoRecarregar,\n vazioTitulo = 'Nenhum registro encontrado',\n vazioDescricao,\n vazioIcone = 'inbox',\n vazioAcoes,\n paginacao,\n className,\n}: ListaCardsProps<T>) {\n const estilo = { '--lp-cards-min': larguraMin } as CSSProperties;\n\n let corpo: ReactNode;\n if (carregando) {\n corpo = (\n <div className=\"lp-cards\" style={estilo} role=\"status\" aria-busy=\"true\" aria-label=\"Carregando registros\">\n {Array.from({ length: Math.min(paginacao?.tamanho ?? 6, 12) }, (_, i) => (\n <Skeleton key={i} altura={alturaCard} />\n ))}\n </div>\n );\n } else if (erro) {\n corpo = (\n <Vazio icone=\"triangle-alert\" titulo=\"Não foi possível carregar\" descricao={typeof erro === 'string' ? erro : 'Verifique a conexão e tente de novo.'}>\n {aoRecarregar && <Botao rotulo=\"Tentar de novo\" icone=\"refresh-cw\" severidade=\"secundario\" onClick={aoRecarregar} />}\n </Vazio>\n );\n } else if (!itens.length) {\n corpo = (\n <Vazio icone={vazioIcone} titulo={vazioTitulo} descricao={vazioDescricao}>\n {vazioAcoes}\n </Vazio>\n );\n } else {\n corpo = (\n <div\n className={cx('lp-cards', atualizando && 'is-atualizando')}\n style={estilo}\n role={rotulo ? 'group' : undefined}\n aria-label={rotulo || undefined}\n aria-busy={atualizando || undefined}\n >\n {itens.map((item, i) => (\n <div key={chave(item, i)} className=\"lp-cards-cel\">\n {card(item, i)}\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={cx('lp-cards-lista', className)}>\n {corpo}\n {paginacao && !carregando && !erro && paginacao.total > 0 && <Paginacao {...paginacao} />}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport { Skeleton } from '../Skeleton/Skeleton';\nimport './Indicador.css';\n\nexport interface IndicadorProps {\n rotulo: string;\n valor: number | string;\n icone?: IconeProp;\n /** Cor de destaque (qualquer cor CSS, de preferência um token: `var(--ok-solid)`). */\n cor?: string;\n /** Torna o card um link. */\n href?: string;\n aoClicar?: () => void;\n carregando?: boolean;\n /** Variação em % (ex.: `1.31` ou `-9.26`): seta e cor ao lado do valor. */\n variacao?: number;\n /** Qual direção é boa (verde). Padrão: `alta`; use `baixa` para despesas, rejeições… */\n variacaoBoa?: 'alta' | 'baixa';\n /** Linha miúda abaixo do valor (ex.: \"há 6 min\"). */\n descricao?: ReactNode;\n /** Rodapé (variação, comparação…). */\n children?: ReactNode;\n className?: string;\n}\n\nconst NUM = new Intl.NumberFormat('pt-BR');\nconst PCT = new Intl.NumberFormat('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n/** Card de KPI para dashboards. */\nexport function Indicador({ rotulo, valor, icone, cor, href, aoClicar, carregando, variacao, variacaoBoa = 'alta', descricao, children, className }: IndicadorProps) {\n const texto = typeof valor === 'number' ? NUM.format(valor) : valor;\n const subiu = (variacao ?? 0) >= 0;\n const boa = subiu === (variacaoBoa === 'alta');\n const estilo = cor ? ({ '--ind-cor': cor } as CSSProperties) : undefined;\n const acionavel = !!href || !!aoClicar;\n return (\n <div className={cx('lp-ind', cor && 'lp-ind--cor', acionavel && 'lp-ind--link', className)} style={estilo}>\n {href ? (\n <a className=\"lp-ind-link\" href={href} onClick={aoClicar} aria-label={`${rotulo}: ${texto}`} />\n ) : aoClicar ? (\n <button type=\"button\" className=\"lp-ind-link\" onClick={aoClicar} aria-label={`${rotulo}: ${texto}`} />\n ) : null}\n <div className=\"lp-ind-topo\">\n <span className=\"lp-ind-rotulo\">{rotulo}</span>\n {icone && (\n <span className=\"lp-ind-tile\">\n <Icone icone={icone} />\n </span>\n )}\n </div>\n {carregando ? (\n <Skeleton largura=\"4.5rem\" altura=\"1.8rem\" />\n ) : variacao === undefined ? (\n <div className=\"lp-ind-valor\">{texto}</div>\n ) : (\n <div className=\"lp-ind-linha\">\n <span className=\"lp-ind-valor\">{texto}</span>\n <span className={cx('lp-ind-var', boa ? 'is-boa' : 'is-ruim')}>\n <Icone icone={subiu ? 'arrow-up' : 'arrow-down'} />\n {PCT.format(Math.abs(variacao))}%<span className=\"lp-sr\">{subiu ? ' de alta' : ' de queda'}</span>\n </span>\n </div>\n )}\n {descricao && <div className=\"lp-ind-desc\">{descricao}</div>}\n {children && <div className=\"lp-ind-rodape\">{children}</div>}\n </div>\n );\n}\n\n/** Grade responsiva de indicadores. */\nexport function Indicadores({ children, className }: { children: ReactNode; className?: string }) {\n return <div className={cx('lp-inds', className)}>{children}</div>;\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport './Detalhes.css';\n\nexport interface DetalhesProps {\n rotulo: string;\n /** Valor em texto; `children` substitui. Vazio mostra travessão. */\n valor?: ReactNode;\n /** `coluna` = rótulo em cima · `linha` = rótulo à esquerda, valor à direita. */\n disposicao?: 'coluna' | 'linha';\n children?: ReactNode;\n className?: string;\n}\n\n/** Par rótulo/valor para telas de visualização. */\nexport function Detalhes({ rotulo, valor, disposicao = 'coluna', children, className }: DetalhesProps) {\n const conteudo = children ?? (valor === undefined || valor === null || valor === '' ? '—' : valor);\n return (\n <div className={cx('lp-det', disposicao === 'linha' && 'lp-det--linha', className)}>\n <span className=\"lp-det-rotulo\">{rotulo}</span>\n <span className=\"lp-det-valor\">{conteudo}</span>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport type { Severidade } from '../../utils/tipos';\nimport './Badge.css';\n\n/** Mesmas cores do `Alerta`: severidades + `pri` (azul) e `destaque` (laranja). */\nexport type CorBadge = Severidade | 'pri' | 'destaque';\n\nexport interface BadgeProps {\n cor?: CorBadge;\n /**\n * `solido` (padrão) · `suave` = fundo claro · `contorno` = só a borda ·\n * `gradiente` · `inverso` = fundo da superfície com texto colorido (para\n * usar dentro de um botão sólido da mesma cor).\n */\n aparencia?: 'solido' | 'suave' | 'contorno' | 'gradiente' | 'inverso';\n /** `pilula` = cantos totalmente arredondados. */\n formato?: 'padrao' | 'pilula';\n /** `herdar` = acompanha o tamanho do texto em volta (títulos). */\n tamanho?: 'pequeno' | 'medio' | 'herdar';\n icone?: IconeProp;\n /** Texto do badge (ou use `children`). */\n rotulo?: ReactNode;\n children?: ReactNode;\n className?: string;\n}\n\n/** Etiqueta curta: contagem, rótulo de novidade, categoria. */\nexport function Badge({ cor = 'pri', aparencia = 'solido', formato = 'padrao', tamanho = 'pequeno', icone, rotulo, children, className }: BadgeProps) {\n return (\n <span\n className={cx('lp-badge', `lp-badge--${aparencia}`, formato === 'pilula' && 'lp-badge--pilula', `lp-badge--${tamanho}`, className)}\n data-cor={cor}\n >\n <Icone icone={icone} />\n {rotulo}\n {children}\n </span>\n );\n}\n\nexport interface ComBadgeProps {\n /** Elemento que recebe o badge (avatar, botão, ícone). */\n children: ReactNode;\n /** Contagem ou texto no canto; com `ponto`, é ignorado. */\n conteudo?: ReactNode;\n /** Acima disto vira \"N+\" (só para números; padrão: 99). */\n max?: number;\n /** Só um ponto (ex.: \"online\", \"não lido\"). */\n ponto?: boolean;\n cor?: CorBadge;\n /** Canto do badge (padrão: superior direito). */\n posicao?: 'superior-direita' | 'inferior-direita' | 'superior-esquerda' | 'inferior-esquerda';\n /** Texto para leitor de tela (ex.: \"99 mensagens não lidas\"). */\n descricao?: string;\n className?: string;\n}\n\n/** Posiciona um badge (ou ponto) no canto de outro elemento. */\nexport function ComBadge({ children, conteudo, max = 99, ponto = false, cor = 'err', posicao = 'superior-direita', descricao, className }: ComBadgeProps) {\n const vazio = conteudo === undefined || conteudo === null || conteudo === false || conteudo === '';\n const texto = typeof conteudo === 'number' && conteudo > max ? `${max}+` : conteudo;\n return (\n <span className={cx('lp-com-badge', className)}>\n {children}\n {(ponto || !vazio) && (\n <span className={cx('lp-com-badge-marca', `is-${posicao}`, ponto ? 'lp-com-badge-ponto' : 'lp-badge lp-badge--solido lp-badge--pilula lp-badge--pequeno')} data-cor={cor}>\n {!ponto && texto}\n {descricao && <span className=\"lp-sr\">{descricao}</span>}\n </span>\n )}\n </span>\n );\n}\n","import { cx } from '../../utils/cx';\nimport './Placa.css';\n\nexport interface PlacaProps {\n /** Número da placa (ex.: `QBX-7H42`) — sempre exibido em maiúsculas. */\n numero: string;\n /** UF da faixa superior (padrão: PR). */\n uf?: string;\n className?: string;\n}\n\n/** Arte da placa de veículo (faixa BRASIL/UF + número), só leitura. */\nexport function Placa({ numero, uf = 'PR', className }: PlacaProps) {\n const n = (numero ?? '').toUpperCase();\n const u = (uf ?? '').toUpperCase();\n return (\n <span className={cx('lp-placa', className)} role=\"img\" aria-label={`Placa ${n}${u ? `, ${u}` : ''}`}>\n <span className=\"lp-placa-faixa\" aria-hidden=\"true\">\n <span>BRASIL</span>\n {u && <span className=\"lp-placa-uf\">{u}</span>}\n </span>\n <span className=\"lp-placa-numero\" aria-hidden=\"true\">\n {n}\n </span>\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone, type IconeProp } from '../../utils/Icone';\nimport './Citacao.css';\n\nexport type CorCitacao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\n\nexport interface CitacaoProps {\n /** O texto citado. */\n children: ReactNode;\n /** Quem disse. */\n autor?: ReactNode;\n /** De onde veio (livro, discurso…), em itálico depois do autor. */\n fonte?: ReactNode;\n cor?: CorCitacao;\n /** `simples` = filete na lateral · `cartao` = fundo claro da cor, ícone e aspas. */\n aparencia?: 'simples' | 'cartao';\n alinhamento?: 'inicio' | 'centro' | 'fim';\n /** Ícone no canto do cartão (só na aparência `cartao`). */\n icone?: IconeProp;\n className?: string;\n}\n\n/** Citação (blockquote) com autor e fonte. */\nexport function Citacao({ children, autor, fonte, cor = 'pri', aparencia = 'simples', alinhamento = 'inicio', icone = 'info', className }: CitacaoProps) {\n return (\n <figure\n className={cx(\n 'lp-citacao',\n cor !== 'pri' && `lp-citacao--${cor}`,\n `lp-citacao--${aparencia}`,\n alinhamento !== 'inicio' && `lp-citacao--${alinhamento}`,\n className,\n )}\n >\n {aparencia === 'cartao' && <Icone icone={icone} className=\"lp-citacao-ic\" />}\n <blockquote className=\"lp-citacao-texto\">{children}</blockquote>\n {(autor || fonte) && (\n <figcaption className=\"lp-citacao-autor\">\n — {autor}\n {fonte && <> {autor && 'em '}<cite>{fonte}</cite></>}\n </figcaption>\n )}\n </figure>\n );\n}\n","import type { CSSProperties, ImgHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport './Imagem.css';\n\n/** `reto` · `arredondado` = cantos do card · `circulo` = pílula/círculo. */\nexport type CantosImagem = 'reto' | 'arredondado' | 'circulo';\n/** `esquerda`/`direita` = flutua com o texto em volta · `centro` = bloco centralizado. */\nexport type AlinhamentoImagem = 'esquerda' | 'centro' | 'direita';\n\nexport interface ImagemProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'alt' | 'width'> {\n src: string;\n /** Texto alternativo. Use `''` só para imagem decorativa. */\n alt: string;\n /** Encolhe para caber no container (largura máx. 100%). Padrão: true. */\n responsiva?: boolean;\n cantos?: CantosImagem;\n /** Moldura de miniatura: borda fina e respiro em volta. */\n miniatura?: boolean;\n alinhamento?: AlinhamentoImagem;\n /** Recorta na proporção dada (ex.: `'1 / 1'`, `'16 / 9'`) sem distorcer. */\n proporcao?: string;\n /** Largura (ex.: `'12rem'`, `'50%'`). */\n largura?: string;\n}\n\n/** Imagem responsiva com cantos, miniatura, recorte e alinhamento. */\nexport function Imagem({\n responsiva = true,\n cantos = 'reto',\n miniatura = false,\n alinhamento,\n proporcao,\n largura,\n loading = 'lazy',\n className,\n style,\n ...resto\n}: ImagemProps) {\n return (\n <img\n loading={loading}\n className={cx(\n 'lp-img',\n responsiva && 'lp-img--responsiva',\n cantos !== 'reto' && `lp-img--${cantos}`,\n miniatura && 'lp-img--miniatura',\n alinhamento && `lp-img--${alinhamento}`,\n proporcao && 'lp-img--recorte',\n className,\n )}\n style={{ aspectRatio: proporcao, width: largura, ...style }}\n {...resto}\n />\n );\n}\n\nexport interface FiguraProps {\n src: string;\n alt: string;\n /** Legenda abaixo da imagem. */\n legenda?: ReactNode;\n alinhamentoLegenda?: 'inicio' | 'centro' | 'fim';\n cantos?: CantosImagem;\n miniatura?: boolean;\n proporcao?: string;\n /** Posição da figura inteira (imagem + legenda). */\n alinhamento?: AlinhamentoImagem;\n /** Largura da figura (ex.: `'14rem'`). */\n largura?: string;\n className?: string;\n style?: CSSProperties;\n}\n\n/** Imagem com legenda (`<figure>` + `<figcaption>`). */\nexport function Figura({\n src,\n alt,\n legenda,\n alinhamentoLegenda = 'inicio',\n cantos = 'arredondado',\n miniatura,\n proporcao,\n alinhamento,\n largura,\n className,\n style,\n}: FiguraProps) {\n return (\n <figure className={cx('lp-figura', alinhamento && `lp-figura--${alinhamento}`, className)} style={{ width: largura, ...style }}>\n <Imagem src={src} alt={alt} cantos={cantos} miniatura={miniatura} proporcao={proporcao} largura=\"100%\" />\n {legenda && <figcaption className={cx('lp-figura-legenda', alinhamentoLegenda !== 'inicio' && `lp-figura-legenda--${alinhamentoLegenda}`)}>{legenda}</figcaption>}\n </figure>\n );\n}\n","import type { ButtonHTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone } from '../../utils/Icone';\nimport './BotaoFechar.css';\n\nexport interface BotaoFecharProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n /** `claro` = para fundos escuros. */\n variante?: 'padrao' | 'claro';\n tamanho?: 'pequeno' | 'medio';\n /** Nome para leitor de tela (padrão: \"Fechar\"). */\n rotulo?: string;\n}\n\n/** O × de fechar (avisos, diálogos, painéis), com o nome acessível. */\nexport function BotaoFechar({ variante = 'padrao', tamanho = 'medio', rotulo = 'Fechar', className, type = 'button', ...resto }: BotaoFecharProps) {\n return (\n <button\n type={type}\n className={cx('lp-fechar', variante === 'claro' && 'lp-fechar--claro', tamanho === 'pequeno' && 'lp-fechar--pequeno', className)}\n aria-label={rotulo}\n title={rotulo}\n {...resto}\n >\n <Icone icone=\"x\" />\n </button>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { portal } from '../../utils/portal';\nimport { cx } from '../../utils/cx';\nimport './Carregando.css';\n\nexport interface CarregandoProps {\n mensagem?: string;\n /** Imagem da marca (ex.: logo) no lugar do anel. */\n logo?: string;\n /** Cobre a página inteira com máscara e bloqueia interação. */\n bloqueante?: boolean;\n className?: string;\n}\n\n/** Indicador de espera de seção/página. Para listas, prefira Skeleton. */\nexport function Carregando({ mensagem = 'Carregando', logo, bloqueante = false, className }: CarregandoProps) {\n const painel = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!bloqueante) return;\n const anterior = document.activeElement as HTMLElement | null;\n painel.current?.focus();\n return () => anterior?.focus?.();\n }, [bloqueante]);\n\n const conteudo = (\n <div\n className={cx('lp-carr', bloqueante && 'lp-carr--overlay', className)}\n role=\"status\"\n aria-busy={bloqueante || undefined}\n onKeyDown={bloqueante ? (e) => e.key === 'Tab' && e.preventDefault() : undefined}\n >\n <div className=\"lp-carr-painel\" ref={painel} tabIndex={-1}>\n <span className=\"lp-carr-pilha\">\n {logo ? <img className=\"lp-carr-logo\" src={logo} alt=\"\" aria-hidden=\"true\" /> : <span className=\"lp-carr-anel\" aria-hidden=\"true\" />}\n <span className=\"lp-carr-traco\" aria-hidden=\"true\" />\n <span className=\"lp-carr-txt\">\n <span>{mensagem}</span>\n <span className=\"lp-carr-pontos\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n </span>\n </span>\n </div>\n </div>\n );\n\n return bloqueante ? portal(conteudo) : conteudo;\n}\n","import type { CSSProperties } from 'react';\nimport { cx } from '../../utils/cx';\nimport './Girador.css';\n\n/** `atual` = cor do texto em volta (para usar dentro de botões). */\nexport type CorGirador = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro' | 'atual';\n\nexport interface GiradorProps {\n /** `anel` = gira · `pulso` = cresce e some · `pontos` = três pontos piscando. */\n tipo?: 'anel' | 'pulso' | 'pontos';\n cor?: CorGirador;\n /** Escala pronta, ou qualquer medida CSS (ex.: `'3rem'`). */\n tamanho?: 'pequeno' | 'medio' | 'grande' | (string & {});\n /** Texto para leitor de tela (e visível com `mostrarRotulo`). */\n rotulo?: string;\n mostrarRotulo?: boolean;\n className?: string;\n}\n\nconst ESCALA: Record<string, string> = { pequeno: '1rem', medio: '1.75rem', grande: '2.75rem' };\n\n/** Indicador de atividade em linha (spinner). Para espera de seção inteira, use `Carregando`. */\nexport function Girador({ tipo = 'anel', cor = 'pri', tamanho = 'medio', rotulo = 'Carregando...', mostrarRotulo = false, className }: GiradorProps) {\n return (\n <span\n role=\"status\"\n className={cx('lp-girador', `lp-girador--${tipo}`, cor !== 'pri' && `lp-girador--${cor}`, className)}\n style={{ '--gir-tam': ESCALA[tamanho] ?? tamanho } as CSSProperties}\n >\n <span className=\"lp-girador-forma\" aria-hidden=\"true\">\n {tipo === 'pontos' && (\n <>\n <span />\n <span />\n <span />\n </>\n )}\n </span>\n <span className={mostrarRotulo ? 'lp-girador-rotulo' : 'lp-sr'}>{rotulo}</span>\n </span>\n );\n}\n","import type { CSSProperties } from 'react';\nimport { cx } from '../../utils/cx';\nimport './Progresso.css';\n\nexport type CorProgresso = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\n\nexport interface SegmentoProgresso {\n valor: number;\n cor?: CorProgresso;\n /** Nome do segmento (leitor de tela e texto `dentro`). */\n rotulo?: string;\n}\n\nexport interface ProgressoProps {\n /** Valor atual (0 a `max`). Ignorado quando há `segmentos`. */\n valor?: number;\n max?: number;\n /** Várias barras empilhadas na mesma trilha. */\n segmentos?: SegmentoProgresso[];\n cor?: CorProgresso;\n /** `listrado` = faixas diagonais · `gradiente` = clareia no começo. */\n aparencia?: 'solido' | 'listrado' | 'gradiente';\n /** Faixas em movimento (com `listrado`). */\n animado?: boolean;\n /** A barra cresce do zero ao aparecer. */\n entrada?: boolean;\n altura?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /**\n * Onde mostrar o valor: `dentro` da barra · no `fim` da linha · `balao`\n * acima da ponta · `pilula` na ponta da barra.\n */\n mostrarValor?: 'nenhum' | 'dentro' | 'fim' | 'balao' | 'pilula';\n /** Bolinha na ponta da barra. */\n marcador?: boolean;\n /** Pontos de marco ao longo da trilha (valores, ex.: `[25, 50, 75]`). */\n marcos?: number[];\n /** Trilha com o tom claro da cor. */\n trilhaColorida?: boolean;\n /** Selo colorido no começo da barra (ex.: \"Celulares\"). */\n etiqueta?: string;\n /** Nome acessível (ex.: \"Envio do arquivo\"). */\n rotulo?: string;\n /** Formata o valor exibido (padrão: porcentagem). */\n formatar?: (valor: number, max: number) => string;\n className?: string;\n}\n\nconst pct = (v: number, max: number) => Math.max(0, Math.min(100, (v / max) * 100));\nconst PADRAO = (v: number, max: number) => `${Math.round(pct(v, max))}%`;\n\n/** Barra de progresso: simples, listrada, em gradiente, com marcos, balão de valor ou várias barras. */\nexport function Progresso({\n valor = 0,\n max = 100,\n segmentos,\n cor = 'pri',\n aparencia = 'solido',\n animado = false,\n entrada = false,\n altura = 'md',\n mostrarValor = 'nenhum',\n marcador = false,\n marcos,\n trilhaColorida = false,\n etiqueta,\n rotulo,\n formatar = PADRAO,\n className,\n}: ProgressoProps) {\n const p = pct(valor, max);\n const texto = formatar(valor, max);\n const classeBarra = (c: CorProgresso) =>\n cx(\n 'lp-prog-barra',\n // sempre explícita: num segmento `pri` dentro de barra de outra cor\n `lp-prog--${c}`,\n aparencia !== 'solido' && `lp-prog-barra--${aparencia}`,\n animado && 'lp-prog-barra--animado',\n entrada && 'lp-prog-barra--entrada',\n );\n\n return (\n <div\n className={cx(\n 'lp-prog',\n cor !== 'pri' && `lp-prog--${cor}`,\n `lp-prog--${altura}`,\n trilhaColorida && 'lp-prog--trilha-colorida',\n mostrarValor === 'balao' && 'lp-prog--com-balao',\n className,\n )}\n >\n {etiqueta && <span className=\"lp-prog-etiqueta\">{etiqueta}</span>}\n {segmentos ? (\n <div className=\"lp-prog-trilha\" role=\"group\" aria-label={rotulo}>\n {segmentos.map((s, i) => (\n <div\n key={i}\n className={classeBarra(s.cor ?? cor)}\n style={{ width: `${pct(s.valor, max)}%` }}\n role=\"progressbar\"\n aria-label={s.rotulo}\n aria-valuenow={s.valor}\n aria-valuemin={0}\n aria-valuemax={max}\n >\n {mostrarValor === 'dentro' && <span className=\"lp-prog-texto\">{formatar(s.valor, max)}</span>}\n </div>\n ))}\n </div>\n ) : (\n <div\n className=\"lp-prog-trilha\"\n role=\"progressbar\"\n aria-label={rotulo ?? etiqueta}\n aria-valuenow={valor}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuetext={texto}\n style={{ '--prog-pct': `${p}%` } as CSSProperties}\n >\n <div className={classeBarra(cor)} style={{ width: `${p}%` }}>\n {mostrarValor === 'dentro' && <span className=\"lp-prog-texto\">{texto}</span>}\n </div>\n {marcos?.map((m) => (\n <span key={m} className={cx('lp-prog-marco', m <= valor && 'is-atingido')} style={{ left: `${pct(m, max)}%` }} aria-hidden=\"true\" />\n ))}\n {marcador && <span className=\"lp-prog-marcador\" aria-hidden=\"true\" />}\n {mostrarValor === 'balao' && (\n <span className=\"lp-prog-balao\" aria-hidden=\"true\">\n {texto}\n </span>\n )}\n {mostrarValor === 'pilula' && (\n <span className=\"lp-prog-pilula\" aria-hidden=\"true\">\n {texto}\n </span>\n )}\n </div>\n )}\n {mostrarValor === 'fim' && (\n <span className=\"lp-prog-valor\" aria-hidden=\"true\">\n {segmentos ? formatar(segmentos.reduce((t, s) => t + s.valor, 0), max) : texto}\n </span>\n )}\n </div>\n );\n}\n","import { Children, isValidElement, useCallback, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Botao } from '../Botao/Botao';\nimport { Vazio } from '../Vazio/Vazio';\nimport './Conversa.css';\n\nexport interface ConversaProps {\n /** As mensagens (`Mensagem`), da mais antiga para a mais nova. */\n children?: ReactNode;\n /** Mostrado quando não há mensagens. Padrão: um `Vazio`. */\n vazio?: ReactNode;\n /** Campo de envio fixo abaixo da rolagem (normalmente um `CampoMensagem`). */\n campo?: ReactNode;\n /** Largura máxima das mensagens e do campo, centralizados (ex.: `48rem` numa página inteira). */\n larguraMaxima?: string;\n /** Nome da conversa para leitores de tela. */\n rotulo?: string;\n rotuloIrParaFim?: string;\n className?: string;\n}\n\n/** distância do fim (px) que ainda conta como \"no fim\" */\nconst LIMIAR = 24;\n\n/**\n * Área rolável de uma conversa. Acompanha o fim quando chegam mensagens ou a\n * última cresce (streaming); se a pessoa rolar para cima, para de puxar e\n * mostra \"Ir para o fim\". Ocupa a altura do contêiner pai.\n */\nexport function Conversa({\n children,\n vazio,\n campo,\n larguraMaxima,\n rotulo = 'Conversa',\n rotuloIrParaFim = 'Ir para o fim',\n className,\n}: ConversaProps) {\n const rolagem = useRef<HTMLDivElement>(null);\n const lista = useRef<HTMLDivElement>(null);\n // ref para a lógica (o ResizeObserver não vê estado novo); estado para o botão\n const noFim = useRef(true);\n const [longe, setLonge] = useState(false);\n const filhos = Children.toArray(children);\n const semMensagens = filhos.length === 0;\n const quantas = useRef(filhos.length);\n // a mensagem que a própria pessoa acabou de enviar sempre leva ao fim\n const novaDoUsuario =\n filhos.length > quantas.current &&\n filhos.slice(quantas.current).some((f) => isValidElement<{ autor?: string }>(f) && f.props.autor === 'usuario');\n\n const irParaFim = useCallback(() => {\n const el = rolagem.current;\n if (!el) return;\n el.scrollTop = el.scrollHeight;\n noFim.current = true;\n setLonge(false);\n }, []);\n\n // conteúdo ou caixa mudou de tamanho: se estava no fim, continua no fim\n useLayoutEffect(() => {\n const el = rolagem.current;\n const ls = lista.current;\n if (!el || !ls) return;\n irParaFim();\n const ro = new ResizeObserver(() => {\n if (noFim.current) el.scrollTop = el.scrollHeight;\n });\n ro.observe(el);\n ro.observe(ls);\n return () => ro.disconnect();\n }, [irParaFim, semMensagens]);\n\n useLayoutEffect(() => {\n quantas.current = filhos.length;\n if (novaDoUsuario) irParaFim();\n });\n\n const aoRolar = () => {\n const el = rolagem.current;\n if (!el) return;\n const fim = el.scrollHeight - el.scrollTop - el.clientHeight <= LIMIAR;\n noFim.current = fim;\n setLonge(!fim);\n };\n\n const estilo = larguraMaxima ? ({ '--conversa-largura': larguraMaxima } as CSSProperties) : undefined;\n\n return (\n <div className={cx('lp-conversa', className)} style={estilo}>\n <div className=\"lp-conversa-area\">\n <div ref={rolagem} className=\"lp-conversa-rolagem\" tabIndex={0} aria-label={rotulo} onScroll={aoRolar}>\n <div ref={lista} className=\"lp-conversa-lista\" role=\"log\" aria-live=\"polite\">\n {semMensagens ? (\n <div className=\"lp-conversa-vazio\">\n {vazio ?? <Vazio titulo=\"Nenhuma mensagem ainda\" descricao=\"Envie uma mensagem para começar a conversa.\" icone=\"message-square\" />}\n </div>\n ) : (\n children\n )}\n </div>\n </div>\n {longe && !semMensagens && (\n <Botao\n className=\"lp-conversa-fim\"\n rotulo={rotuloIrParaFim}\n icone=\"arrow-down\"\n severidade=\"secundario\"\n tamanho=\"pequeno\"\n sombra=\"media\"\n onClick={irParaFim}\n />\n )}\n </div>\n {campo && <div className=\"lp-conversa-campo\">{campo}</div>}\n </div>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { formatDataHoraBr, formatHoraBr } from '../../utils/datas';\nimport { Icone } from '../../utils/Icone';\nimport { Avatar } from '../Avatar/Avatar';\nimport { Botao } from '../Botao/Botao';\nimport { useToastOpcional } from '../Toast/Toast';\nimport './Mensagem.css';\n\n/** `usuario` = à direita, em destaque · `assistente` = à esquerda, neutra · `sistema` = aviso centralizado. */\nexport type AutorMensagem = 'usuario' | 'assistente' | 'sistema';\n/**\n * `enviando` = ainda não confirmada · `gerando` = a resposta está chegando\n * (sem conteúdo, mostra os três pontos) · `concluida` · `erro`.\n */\nexport type EstadoMensagem = 'enviando' | 'gerando' | 'concluida' | 'erro';\n\nexport interface MensagemProps {\n autor?: AutorMensagem;\n /** O conteúdo. Texto puro preserva as quebras de linha; Markdown chega já renderizado pelo app. */\n children?: ReactNode;\n /** Nome de quem escreveu, acima da bolha. */\n nome?: string;\n /** `true` = iniciais do `nome` · texto = URL da foto · ou um nó próprio (`<Avatar>`, ícone). */\n avatar?: ReactNode;\n /** Quando foi enviada. `Date` vira `HH:mm` (hoje) ou `dd/mm/aaaa HH:mm`; texto aparece como veio. */\n hora?: Date | string;\n estado?: EstadoMensagem;\n /** Texto do erro, com `estado=\"erro\"`. */\n erro?: ReactNode;\n /** Mostra \"Tentar novamente\" no erro. */\n aoTentarNovamente?: () => void;\n /** Botão que copia o texto da mensagem. */\n copiavel?: boolean;\n /** O que copiar, quando o conteúdo não é texto puro. Padrão: o texto visível. */\n textoCopia?: string;\n /** Outras ações abaixo da bolha (botões pequenos). */\n acoes?: ReactNode;\n /** Abaixo do conteúdo, dentro da bolha (ex.: `Referencias`). */\n rodape?: ReactNode;\n rotuloTentarNovamente?: string;\n rotuloCopiar?: string;\n /** Lido pelo leitor de tela no lugar dos três pontos. */\n rotuloGerando?: string;\n rotuloEnviando?: string;\n className?: string;\n}\n\nfunction formatarHora(d: Date) {\n return d.toDateString() === new Date().toDateString() ? formatHoraBr(d) : formatDataHoraBr(d);\n}\n\n/** Uma mensagem da `Conversa`: bolha com autor, hora, estado e ações. */\nexport function Mensagem({\n autor = 'assistente',\n children,\n nome,\n avatar,\n hora,\n estado = 'concluida',\n erro,\n aoTentarNovamente,\n copiavel = false,\n textoCopia,\n acoes,\n rodape,\n rotuloTentarNovamente = 'Tentar novamente',\n rotuloCopiar = 'Copiar mensagem',\n rotuloGerando = 'Gerando resposta',\n rotuloEnviando = 'Enviando',\n className,\n}: MensagemProps) {\n const toast = useToastOpcional();\n const conteudo = useRef<HTMLDivElement>(null);\n const timer = useRef<number | undefined>(undefined);\n const [copiado, setCopiado] = useState(false);\n useEffect(() => () => window.clearTimeout(timer.current), []);\n\n const vazio = children === undefined || children === null || children === false || children === '';\n const texto = typeof children === 'string';\n const gerando = estado === 'gerando';\n const comErro = estado === 'erro';\n\n const copiar = async () => {\n const valor = textoCopia ?? (texto ? children : (conteudo.current?.innerText ?? ''));\n try {\n await navigator.clipboard.writeText(valor);\n toast?.ok('Mensagem copiada');\n setCopiado(true);\n window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => setCopiado(false), 2000);\n } catch {\n toast?.err('Não foi possível copiar', 'O navegador bloqueou o acesso à área de transferência.');\n }\n };\n\n if (autor === 'sistema') {\n return (\n <div className={cx('lp-mensagem', 'lp-mensagem--sistema', className)}>\n <div className=\"lp-mensagem-conteudo\" ref={conteudo}>\n {children}\n </div>\n </div>\n );\n }\n\n const blocoAvatar =\n avatar === true ? (\n <Avatar nome={nome} tom={autor === 'usuario' ? 'escuro' : 'claro'} />\n ) : typeof avatar === 'string' ? (\n <Avatar foto={avatar} nome={nome} />\n ) : (\n avatar\n );\n const comAcoes = (copiavel && !vazio && !gerando) || !!acoes;\n const dataHora = hora instanceof Date ? hora.toISOString() : undefined;\n\n return (\n <div\n className={cx('lp-mensagem', `lp-mensagem--${autor}`, `is-${estado}`, className)}\n // a resposta ainda está mudando: o leitor de tela espera ela terminar\n aria-busy={gerando || undefined}\n >\n {blocoAvatar && <div className=\"lp-mensagem-avatar\">{blocoAvatar}</div>}\n <div className=\"lp-mensagem-coluna\">\n {(nome || hora) && (\n <div className=\"lp-mensagem-meta\">\n {nome && <span className=\"lp-mensagem-nome\">{nome}</span>}\n {hora && <time dateTime={dataHora}>{hora instanceof Date ? formatarHora(hora) : hora}</time>}\n </div>\n )}\n {/* erro antes de qualquer conteúdo: só a faixa de erro, sem bolha vazia */}\n {(!vazio || gerando || rodape) && (\n <div className=\"lp-mensagem-bolha\">\n {gerando && vazio ? (\n <span className=\"lp-mensagem-digitando\">\n <span className=\"lp-sr\">{rotuloGerando}</span>\n <span aria-hidden=\"true\" />\n <span aria-hidden=\"true\" />\n <span aria-hidden=\"true\" />\n </span>\n ) : (\n <div className={cx('lp-mensagem-conteudo', texto && 'lp-mensagem-conteudo--texto')} ref={conteudo}>\n {children}\n {gerando && <span className=\"lp-mensagem-cursor\" aria-hidden=\"true\" />}\n </div>\n )}\n {rodape && <div className=\"lp-mensagem-rodape\">{rodape}</div>}\n </div>\n )}\n {estado === 'enviando' && <div className=\"lp-mensagem-situacao\">{rotuloEnviando}…</div>}\n {comErro && (\n <div className=\"lp-mensagem-erro\" role=\"alert\">\n <Icone icone=\"circle-alert\" className=\"lp-mensagem-erro-ic\" />\n <span className=\"lp-mensagem-erro-txt\">{erro ?? 'Não foi possível concluir esta mensagem.'}</span>\n {aoTentarNovamente && (\n <Botao rotulo={rotuloTentarNovamente} icone=\"refresh-cw\" severidade=\"err\" aparencia=\"texto\" tamanho=\"pequeno\" onClick={aoTentarNovamente} />\n )}\n </div>\n )}\n {comAcoes && (\n <div className=\"lp-mensagem-acoes\">\n {copiavel && !vazio && !gerando && (\n <Botao\n icone={copiado ? 'check' : 'copy'}\n aria-label={rotuloCopiar}\n dica={rotuloCopiar}\n severidade=\"secundario\"\n aparencia=\"texto\"\n tamanho=\"pequeno\"\n onClick={copiar}\n />\n )}\n {acoes}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { forwardRef, useCallback, useImperativeHandle, useLayoutEffect, useRef, type KeyboardEvent, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Botao } from '../Botao/Botao';\nimport { useCampoIds } from '../Campo/Campo';\nimport './CampoMensagem.css';\n\nexport interface CampoMensagemProps {\n valor: string;\n aoMudar: (valor: string) => void;\n /** Recebe o texto sem espaços nas pontas; nunca é chamado com texto vazio. */\n aoEnviar: (texto: string) => void;\n /** Uma resposta está chegando: o Enviar vira Parar. */\n gerando?: boolean;\n /** Chamado pelo botão Parar (sem ele, o Parar fica desabilitado). */\n aoParar?: () => void;\n desabilitado?: boolean;\n placeholder?: string;\n /** Limite de caracteres; o contador aparece perto do limite. */\n maxCaracteres?: number;\n /** Até quantas linhas o campo cresce antes de rolar. */\n linhasMaximas?: number;\n autoFocus?: boolean;\n /** Botões próprios do app à esquerda do Enviar (anexar, escolher documentos…). */\n acoesExtras?: ReactNode;\n /** Rótulo do campo para leitores de tela. */\n rotulo?: string;\n rotuloEnviar?: string;\n rotuloParar?: string;\n id?: string;\n className?: string;\n}\n\n/** a partir de que fração do limite o contador aparece */\nconst AVISO_CONTADOR = 0.8;\n\n/**\n * Campo de envio de mensagem: Enter envia, Shift+Enter quebra a linha. Cresce\n * com o texto até `linhasMaximas` e depois rola.\n */\nexport const CampoMensagem = forwardRef<HTMLTextAreaElement, CampoMensagemProps>(function CampoMensagem(\n {\n valor,\n aoMudar,\n aoEnviar,\n gerando = false,\n aoParar,\n desabilitado = false,\n placeholder = 'Escreva uma mensagem',\n maxCaracteres,\n linhasMaximas = 6,\n autoFocus,\n acoesExtras,\n rotulo = 'Mensagem',\n rotuloEnviar = 'Enviar mensagem',\n rotuloParar = 'Parar',\n id: idExterno,\n className,\n },\n ref,\n) {\n const { id } = useCampoIds(idExterno);\n const campo = useRef<HTMLTextAreaElement>(null);\n useImperativeHandle(ref, () => campo.current as HTMLTextAreaElement);\n\n const texto = valor.trim();\n const podeEnviar = !desabilitado && !gerando && texto !== '' && (!maxCaracteres || valor.length <= maxCaracteres);\n const pct = maxCaracteres ? valor.length / maxCaracteres : 0;\n\n // altura = conteúdo, até o limite de linhas; daí em diante, rola\n const ajustarAltura = useCallback(() => {\n const el = campo.current;\n if (!el) return;\n const cs = getComputedStyle(el);\n const linha = parseFloat(cs.lineHeight) || parseFloat(cs.fontSize) * 1.5;\n const max = linha * linhasMaximas + parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom);\n el.style.height = 'auto';\n el.style.height = `${Math.min(el.scrollHeight, max)}px`;\n el.style.overflowY = el.scrollHeight > max ? 'auto' : 'hidden';\n }, [linhasMaximas]);\n\n useLayoutEffect(ajustarAltura, [valor, ajustarAltura]);\n\n // largura mudou (janela, painel): as linhas quebram em outro ponto\n useLayoutEffect(() => {\n const el = campo.current;\n if (!el) return;\n let largura = el.clientWidth;\n const ro = new ResizeObserver(() => {\n if (el.clientWidth === largura) return;\n largura = el.clientWidth;\n ajustarAltura();\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [ajustarAltura]);\n\n const enviar = () => {\n if (!podeEnviar) return;\n aoEnviar(texto);\n };\n\n const aoTeclar = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key !== 'Enter' || e.shiftKey) return;\n // Enter que confirma a composição do IME (japonês, chinês…) não envia\n if (e.nativeEvent.isComposing || e.keyCode === 229) return;\n e.preventDefault();\n enviar();\n };\n\n return (\n <div className={cx('lp-campo-mensagem', desabilitado && 'is-disabled', className)} onClick={() => campo.current?.focus()}>\n <label className=\"lp-sr\" htmlFor={id}>\n {rotulo}\n </label>\n <textarea\n ref={campo}\n id={id}\n rows={1}\n className=\"lp-campo-mensagem-texto\"\n value={valor}\n placeholder={placeholder}\n maxLength={maxCaracteres}\n disabled={desabilitado}\n autoFocus={autoFocus}\n enterKeyHint=\"send\"\n onChange={(e) => aoMudar(e.target.value)}\n onKeyDown={aoTeclar}\n />\n <div className=\"lp-campo-mensagem-barra\" onClick={(e) => e.stopPropagation()}>\n {acoesExtras && <div className=\"lp-campo-mensagem-extras\">{acoesExtras}</div>}\n {maxCaracteres && pct >= AVISO_CONTADOR && (\n <span className={cx('lp-campo-mensagem-contador', pct >= 1 ? 'is-err' : pct >= 0.9 && 'is-warn')} aria-hidden=\"true\">\n {valor.length}/{maxCaracteres}\n </span>\n )}\n {gerando ? (\n <Botao\n \n icone=\"square\"\n aria-label={rotuloParar}\n dica={rotuloParar}\n severidade=\"secundario\"\n disabled={!aoParar}\n onClick={aoParar}\n />\n ) : (\n <Botao icone=\"send\" aria-label={rotuloEnviar} dica={rotuloEnviar} disabled={!podeEnviar} onClick={enviar} />\n )}\n </div>\n </div>\n );\n});\n","import { useId, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx';\nimport { Icone } from '../../utils/Icone';\nimport { Recolhivel } from '../Recolhivel/Recolhivel';\nimport './Referencias.css';\n\nexport interface ItemReferencia {\n id: string;\n /** Nome da fonte (documento, página, artigo…). */\n titulo: ReactNode;\n /** Linha curta ao lado do título (ex.: \"Página 3\"). */\n detalhe?: ReactNode;\n /** Trecho citado; aparece truncado, com opção de expandir. */\n trecho?: ReactNode;\n /** Torna o título um link (abre em nova aba). */\n href?: string;\n}\n\nexport interface ReferenciasProps {\n itens: ItemReferencia[];\n /** Começa aberta. */\n abertoInicial?: boolean;\n /** Texto do botão que abre a lista. Padrão: \"3 fontes\". */\n rotulo?: (quantidade: number) => ReactNode;\n rotuloMostrarMais?: string;\n rotuloMostrarMenos?: string;\n className?: string;\n}\n\nconst rotuloPadrao = (n: number) => (n === 1 ? '1 fonte' : `${n} fontes`);\n\nfunction Trecho({ children, mais, menos }: { children: ReactNode; mais: string; menos: string }) {\n const el = useRef<HTMLDivElement>(null);\n const [aberto, setAberto] = useState(false);\n const [cortado, setCortado] = useState(false);\n\n // só oferece \"mostrar mais\" se o trecho passar das linhas visíveis\n useLayoutEffect(() => {\n const t = el.current;\n if (!t) return;\n const medir = () => !aberto && setCortado(t.scrollHeight > t.clientHeight + 1);\n medir();\n const ro = new ResizeObserver(medir);\n ro.observe(t);\n return () => ro.disconnect();\n }, [aberto, children]);\n\n return (\n <>\n <div ref={el} className={cx('lp-referencias-trecho', aberto && 'is-aberto')}>\n {children}\n </div>\n {(cortado || aberto) && (\n <button type=\"button\" className=\"lp-referencias-mais\" aria-expanded={aberto} onClick={() => setAberto((a) => !a)}>\n {aberto ? menos : mais}\n </button>\n )}\n </>\n );\n}\n\n/** Lista recolhível de fontes/citações de uma mensagem (vai no `rodape` da `Mensagem`). */\nexport function Referencias({\n itens,\n abertoInicial = false,\n rotulo = rotuloPadrao,\n rotuloMostrarMais = 'Mostrar trecho completo',\n rotuloMostrarMenos = 'Mostrar menos',\n className,\n}: ReferenciasProps) {\n const id = useId();\n const [aberto, setAberto] = useState(abertoInicial);\n if (!itens.length) return null;\n\n return (\n <div className={cx('lp-referencias', aberto && 'is-aberto', className)}>\n <button type=\"button\" className=\"lp-referencias-gatilho\" aria-expanded={aberto} aria-controls={id} onClick={() => setAberto((a) => !a)}>\n <Icone icone=\"file-text\" />\n <span>{rotulo(itens.length)}</span>\n <Icone icone=\"chevron-down\" className=\"lp-referencias-seta\" />\n </button>\n <Recolhivel aberto={aberto} id={id}>\n <ol className=\"lp-referencias-lista\">\n {itens.map((item, i) => (\n <li key={item.id} className=\"lp-referencias-item\">\n <span className=\"lp-referencias-num\" aria-hidden=\"true\">\n {i + 1}\n </span>\n <div className=\"lp-referencias-corpo\">\n <div className=\"lp-referencias-cab\">\n {item.href ? (\n <a className=\"lp-referencias-titulo\" href={item.href} target=\"_blank\" rel=\"noopener noreferrer\">\n {item.titulo}\n <Icone icone=\"external-link\" />\n </a>\n ) : (\n <span className=\"lp-referencias-titulo\">{item.titulo}</span>\n )}\n {item.detalhe && <span className=\"lp-referencias-detalhe\">{item.detalhe}</span>}\n </div>\n {item.trecho && (\n <Trecho mais={rotuloMostrarMais} menos={rotuloMostrarMenos}>\n {item.trecho}\n </Trecho>\n )}\n </div>\n </li>\n ))}\n </ol>\n </Recolhivel>\n </div>\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport { useRef, useState, type KeyboardEvent, type PointerEvent } from 'react';\nimport { formatBytes, iconeArquivo, tipoDeArquivo, type Anexo } from '../../utils/anexos';\nimport { cx } from '../../utils/cx';\nimport { Botao } from '../Botao/Botao';\nimport { Vazio } from '../Vazio/Vazio';\nimport './Arquivo.css';\n\nexport interface VisualizadorArquivoProps {\n arquivo: Anexo | null;\n /** A imagem/vídeo/áudio falhou ao carregar (URL expirada, 404, codec). */\n aoFalhar?: (arquivo: Anexo) => void;\n className?: string;\n}\n\nconst NIVEIS = [1, 1.5, 2, 3, 4];\n\n/**\n * Superfície de exibição de UM anexo: imagem (zoom, giro, arrasto), PDF,\n * vídeo e áudio nativos; o resto cai num estado com botão \"Baixar\".\n */\nexport function VisualizadorArquivo({ arquivo, aoFalhar, className }: VisualizadorArquivoProps) {\n // a identidade do anexo zera zoom/giro/arrasto ao trocar de arquivo\n const chave = arquivo ? `${arquivo.url ?? ''}|${arquivo.nome}` : 'vazio';\n return (\n <div className={cx('lp-visu', className)}>\n <Conteudo key={chave} arquivo={arquivo} aoFalhar={aoFalhar} />\n </div>\n );\n}\n\nfunction Conteudo({ arquivo, aoFalhar }: Omit<VisualizadorArquivoProps, 'className'>) {\n const [falhou, setFalhou] = useState(false);\n const url = arquivo?.url?.trim();\n const tipo = arquivo ? tipoDeArquivo(arquivo.tipo, arquivo.nome) : 'outro';\n const falhar = () => {\n setFalhou(true);\n if (arquivo) aoFalhar?.(arquivo);\n };\n\n if (!arquivo || !url || falhou || tipo === 'outro') {\n const detalhe = [arquivo?.nome, arquivo?.tamanho ? formatBytes(arquivo.tamanho) : ''].filter(Boolean).join(' · ');\n return (\n <div className=\"lp-visu-indisponivel\">\n <Vazio\n icone={arquivo ? iconeArquivo(arquivo.tipo, arquivo.nome) : 'file'}\n titulo={url ? 'Pré-visualização indisponível' : 'Arquivo indisponível'}\n descricao={detalhe || undefined}\n >\n {url && (\n <a className=\"lp-visu-baixar\" href={url} download={arquivo?.nome} target=\"_blank\" rel=\"noreferrer\">\n <Icone icone=\"download\" />\n Baixar\n </a>\n )}\n </Vazio>\n </div>\n );\n }\n\n if (tipo === 'imagem') return <Imagem url={url} nome={arquivo.nome} aoFalhar={falhar} />;\n if (tipo === 'pdf') return <iframe className=\"lp-visu-pdf\" src={url} title={arquivo.nome || 'Documento PDF'} />;\n if (tipo === 'video')\n return (\n <video className=\"lp-visu-video\" src={url} controls preload=\"metadata\" onError={falhar}>\n <track kind=\"captions\" />\n </video>\n );\n return (\n <div className=\"lp-visu-audio\">\n <Icone icone=\"volume-2\" />\n <span className=\"lp-visu-audio-nome\">{arquivo.nome}</span>\n <audio src={url} controls preload=\"metadata\" onError={falhar} />\n </div>\n );\n}\n\nfunction Imagem({ url, nome, aoFalhar }: { url: string; nome: string; aoFalhar: () => void }) {\n const [nivel, setNivel] = useState(0);\n const [giro, setGiro] = useState(0);\n const [pan, setPan] = useState({ x: 0, y: 0 });\n const palco = useRef<HTMLDivElement>(null);\n const arrasto = useRef<{ x: number; y: number; px: number; py: number } | null>(null);\n const zoom = NIVEIS[nivel];\n\n const limitar = (x: number, y: number) => {\n const r = palco.current?.getBoundingClientRect();\n if (!r) return { x, y };\n // a imagem nunca sai inteira da área visível\n const mx = (r.width * (zoom - 1)) / 2 + r.width * 0.25;\n const my = (r.height * (zoom - 1)) / 2 + r.height * 0.25;\n return { x: Math.max(-mx, Math.min(mx, x)), y: Math.max(-my, Math.min(my, y)) };\n };\n\n const mudarNivel = (n: number) => {\n const novo = Math.max(0, Math.min(NIVEIS.length - 1, n));\n setNivel(novo);\n if (novo === 0) setPan({ x: 0, y: 0 });\n };\n const ajustar = () => {\n setNivel(0);\n setPan({ x: 0, y: 0 });\n };\n const girar = () => {\n setGiro((g) => (g + 90) % 360);\n setPan({ x: 0, y: 0 });\n };\n\n const aoTeclar = (e: KeyboardEvent) => {\n if (e.key === '+' || e.key === '=') mudarNivel(nivel + 1);\n else if (e.key === '-' || e.key === '_') mudarNivel(nivel - 1);\n else if (e.key === '0') ajustar();\n else if (e.key === 'r' || e.key === 'R') girar();\n else return;\n e.preventDefault();\n };\n\n const aoPressionar = (e: PointerEvent) => {\n if (zoom <= 1) return;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n arrasto.current = { x: e.clientX, y: e.clientY, px: pan.x, py: pan.y };\n };\n const aoMover = (e: PointerEvent) => {\n const a = arrasto.current;\n if (!a) return;\n setPan(limitar(a.px + e.clientX - a.x, a.py + e.clientY - a.y));\n };\n\n return (\n <div className=\"lp-visu-img\">\n <div\n ref={palco}\n className={cx('lp-visu-palco', zoom > 1 && 'is-ampliado')}\n tabIndex={0}\n role=\"img\"\n aria-label={nome ? `Imagem ${nome}` : 'Imagem'}\n onKeyDown={aoTeclar}\n onDoubleClick={() => (nivel === 0 ? setNivel(NIVEIS.indexOf(2)) : ajustar())}\n onPointerDown={aoPressionar}\n onPointerMove={aoMover}\n onPointerUp={() => (arrasto.current = null)}\n onPointerCancel={() => (arrasto.current = null)}\n >\n <img\n src={url}\n alt=\"\"\n draggable={false}\n onError={aoFalhar}\n style={{ transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom}) rotate(${giro}deg)` }}\n />\n </div>\n <div className=\"lp-visu-barra\" role=\"toolbar\" aria-label=\"Controles da imagem\">\n <Botao icone=\"zoom-out\" severidade=\"secundario\" aparencia=\"texto\" dica=\"Reduzir\" aria-label=\"Reduzir\" disabled={nivel === 0} onClick={() => mudarNivel(nivel - 1)} />\n <span className=\"lp-visu-zoom\" aria-live=\"polite\">\n {Math.round(zoom * 100)}%\n </span>\n <Botao\n icone=\"zoom-in\"\n severidade=\"secundario\"\n aparencia=\"texto\"\n dica=\"Ampliar\" aria-label=\"Ampliar\"\n disabled={nivel === NIVEIS.length - 1}\n onClick={() => mudarNivel(nivel + 1)}\n />\n <Botao icone=\"maximize\" severidade=\"secundario\" aparencia=\"texto\" dica=\"Ajustar à tela\" aria-label=\"Ajustar à tela\" onClick={ajustar} />\n <Botao icone=\"refresh-cw\" severidade=\"secundario\" aparencia=\"texto\" dica=\"Girar 90 graus\" aria-label=\"Girar 90 graus\" onClick={girar} />\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { formatBytes, type Anexo } from '../../utils/anexos';\nimport { Botao } from '../Botao/Botao';\nimport { Dialogo } from '../Dialogo/Dialogo';\nimport { VisualizadorArquivo } from './VisualizadorArquivo';\nimport './Arquivo.css';\n\nexport interface DialogoArquivoProps {\n aberto: boolean;\n aoFechar: () => void;\n /** A lista INTEIRA; aponte o item clicado com `indice`. */\n arquivos: readonly Anexo[];\n indice: number;\n aoMudarIndice: (indice: number) => void;\n}\n\n// setas pertencem ao controle quando o foco está num destes\nconst CONTROLES = 'video, audio, input, textarea, select, [contenteditable=\"\"], [contenteditable=\"true\"]';\n\n/** Visualizador em tela cheia que folheia uma lista de anexos (botões ou ← →). */\nexport function DialogoArquivo({ aberto, aoFechar, arquivos, indice, aoMudarIndice }: DialogoArquivoProps) {\n const total = arquivos.length;\n const i = Math.max(0, Math.min(indice, total - 1));\n const atual = arquivos[i] ?? null;\n\n useEffect(() => {\n if (!aberto || total < 2) return;\n const h = (e: KeyboardEvent) => {\n if ((e.target as HTMLElement | null)?.closest?.(CONTROLES)) return;\n if (e.key === 'ArrowLeft' && i > 0) aoMudarIndice(i - 1);\n else if (e.key === 'ArrowRight' && i < total - 1) aoMudarIndice(i + 1);\n };\n document.addEventListener('keydown', h);\n return () => document.removeEventListener('keydown', h);\n }, [aberto, total, i, aoMudarIndice]);\n\n return (\n <Dialogo\n aberto={aberto}\n aoFechar={aoFechar}\n tamanho=\"full\"\n icone=\"paperclip\"\n titulo={atual?.nome || 'Anexo'}\n subtitulo={atual?.tamanho ? formatBytes(atual.tamanho) : undefined}\n className=\"lp-dlg-arq\"\n rodape={\n total > 1 ? (\n <>\n <span className=\"lp-dlg-arq-pos\" aria-live=\"polite\">\n {i + 1} de {total}\n </span>\n <Botao rotulo=\"Anterior\" icone=\"chevron-left\" severidade=\"secundario\" disabled={i === 0} onClick={() => aoMudarIndice(i - 1)} />\n <Botao\n rotulo=\"Próximo\"\n icone=\"chevron-right\"\n posicaoIcone=\"direita\"\n severidade=\"secundario\"\n disabled={i === total - 1}\n onClick={() => aoMudarIndice(i + 1)}\n />\n </>\n ) : undefined\n }\n >\n <VisualizadorArquivo arquivo={atual} />\n </Dialogo>\n );\n}\n","import { Icone } from '../../utils/Icone';\nimport { forwardRef, useContext, useEffect, useImperativeHandle, useRef, useState, type DragEvent } from 'react';\nimport { formatBytes, iconeArquivo, tipoDeArquivo, type Anexo } from '../../utils/anexos';\nimport { cx } from '../../utils/cx';\nimport { listaPorExtenso } from '../../utils/texto';\nimport { AcaoLinha } from '../AcaoLinha/AcaoLinha';\nimport { Campo, RevelarCamposCtx, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\nimport { DialogoArquivo } from './DialogoArquivo';\nimport './Arquivo.css';\n\nexport interface CampoAnexoProps extends Omit<CampoBaseProps, 'variante' | 'obrigatorio'> {\n /** Lista serializável de anexos (sem o `File`). */\n valor?: Anexo[];\n aoMudar?: (valor: Anexo[]) => void;\n /** Filtro do seletor nativo (ex.: `image/*,.pdf`). */\n accept?: string;\n /** Vários arquivos (padrão: sim). Com `false`, a nova escolha substitui. */\n multiple?: boolean;\n /** Tamanho máximo por arquivo, em bytes (0 = sem limite). */\n maxTamanho?: number;\n /** Mínimo de anexos; acima de zero o campo é obrigatório. */\n minimo?: number;\n disabled?: boolean;\n id?: string;\n}\n\n/** O que a `ref` do `CampoAnexo` expõe. */\nexport interface CampoAnexoRef {\n /** O `File` da sessão por trás do anexo, ou `null` (anexo já salvo no backend). */\n arquivoDe: (anexo: Pick<Anexo, 'nome' | 'tamanho'>) => File | null;\n}\n\nconst chaveDe = (a: Pick<Anexo, 'nome' | 'tamanho'>) => `${a.nome}|${a.tamanho}`;\n\n/**\n * Zona de anexos (clicar ou arrastar). O valor é `Anexo[]`; o `File` real fica\n * na sessão e sai por `ref.current.arquivoDe(anexo)` na hora do upload.\n */\nexport const CampoAnexo = forwardRef<CampoAnexoRef, CampoAnexoProps>(function CampoAnexo({\n rotulo,\n dica,\n erro,\n aviso,\n className,\n id: idExterno,\n valor = [],\n aoMudar,\n accept,\n multiple = true,\n maxTamanho = 0,\n minimo = 0,\n disabled = false,\n}, ref) {\n const { id, msgId } = useCampoIds(idExterno);\n const input = useRef<HTMLInputElement>(null);\n const arquivos = useRef(new Map<string, File>());\n const urls = useRef(new Map<string, string>());\n const [sobre, setSobre] = useState(false);\n const [recusados, setRecusados] = useState('');\n const [visualizando, setVisualizando] = useState<number | null>(null);\n const [mexido, setMexido] = useState(false);\n const tentativas = useContext(RevelarCamposCtx);\n\n useImperativeHandle(ref, () => ({ arquivoDe: (a) => arquivos.current.get(chaveDe(a)) ?? null }), []);\n\n // libera as URLs de pré-visualização ao desmontar\n useEffect(() => () => urls.current.forEach((u) => URL.revokeObjectURL(u)), []);\n\n const adicionar = (lista: FileList | null) => {\n if (!lista?.length || disabled) return;\n setMexido(true);\n const aceitos: Anexo[] = [];\n const grandes: string[] = [];\n for (const f of Array.from(lista)) {\n if (maxTamanho && f.size > maxTamanho) {\n grandes.push(f.name);\n continue;\n }\n const k = chaveDe({ nome: f.name, tamanho: f.size });\n arquivos.current.set(k, f);\n let url = urls.current.get(k);\n if (!url) {\n url = URL.createObjectURL(f);\n urls.current.set(k, url);\n }\n aceitos.push({ nome: f.name, tamanho: f.size, tipo: f.type, url });\n }\n setRecusados(grandes.length ? `${listaPorExtenso(grandes)} excede${grandes.length > 1 ? 'm' : ''} ${formatBytes(maxTamanho)}.` : '');\n if (!aceitos.length) return;\n if (!multiple) aoMudar?.(aceitos.slice(0, 1));\n else {\n const existentes = new Set(valor.map(chaveDe));\n aoMudar?.([...valor, ...aceitos.filter((a) => !existentes.has(chaveDe(a)))]);\n }\n };\n\n const remover = (a: Anexo) => {\n setMexido(true);\n aoMudar?.(valor.filter((x) => chaveDe(x) !== chaveDe(a)));\n };\n\n const aoSoltar = (e: DragEvent) => {\n e.preventDefault();\n setSobre(false);\n adicionar(e.dataTransfer.files);\n };\n\n const faltam = minimo > 0 && valor.length < minimo && (mexido || tentativas > 0);\n const erroFinal =\n erro ||\n recusados ||\n (faltam ? (minimo === 1 ? 'Anexe pelo menos um arquivo' : `Anexe pelo menos ${minimo} arquivos`) : undefined);\n\n return (\n <Campo\n rotulo={rotulo}\n dica={dica}\n erro={erroFinal}\n aviso={aviso}\n obrigatorio={minimo > 0}\n className={className}\n htmlFor={id}\n msgId={msgId}\n >\n <div\n className={cx('lp-anexo-zona', sobre && 'is-sobre', erroFinal && 'is-invalid', disabled && 'is-disabled')}\n onClick={() => input.current?.click()}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setSobre(true);\n }}\n onDragLeave={() => setSobre(false)}\n onDrop={aoSoltar}\n >\n <Icone icone=\"cloud-upload\" />\n <span>\n <strong>Clique para escolher</strong> ou arraste {multiple ? 'os arquivos' : 'o arquivo'} até aqui\n </span>\n {maxTamanho > 0 && <small>Até {formatBytes(maxTamanho)} por arquivo</small>}\n <input\n ref={input}\n id={id}\n type=\"file\"\n className=\"lp-sr\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n aria-describedby={erroFinal || aviso || dica ? msgId : undefined}\n aria-invalid={erroFinal ? true : undefined}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => {\n adicionar(e.target.files);\n e.target.value = '';\n }}\n />\n </div>\n\n {valor.length > 0 && (\n <ul className=\"lp-anexo-lista\">\n {valor.map((a, i) => (\n <li key={chaveDe(a)} className=\"lp-anexo-item\">\n <button type=\"button\" className=\"lp-anexo-abrir\" onClick={() => setVisualizando(i)} title={`Visualizar ${a.nome}`}>\n <span className=\"lp-anexo-thumb\">\n {tipoDeArquivo(a.tipo, a.nome) === 'imagem' && a.url ? (\n <img src={a.miniatura ?? a.url} alt=\"\" />\n ) : (\n <Icone icone={iconeArquivo(a.tipo, a.nome)} />\n )}\n </span>\n <span className=\"lp-anexo-txt\">\n <span className=\"lp-anexo-nome\">{a.nome}</span>\n <span className=\"lp-anexo-tam\">{formatBytes(a.tamanho)}</span>\n </span>\n </button>\n {!disabled && <AcaoLinha icone=\"x\" rotulo={`Remover ${a.nome}`} severidade=\"err\" onClick={() => remover(a)} />}\n </li>\n ))}\n </ul>\n )}\n\n <DialogoArquivo\n aberto={visualizando !== null}\n aoFechar={() => setVisualizando(null)}\n arquivos={valor}\n indice={visualizando ?? 0}\n aoMudarIndice={setVisualizando}\n />\n </Campo>\n );\n});\n","import { Icone } from '../../utils/Icone';\nimport { useState, type CSSProperties, type ReactNode } from 'react';\nimport type { Anexo } from '../../utils/anexos';\nimport { cx } from '../../utils/cx';\nimport { Avatar } from '../Avatar/Avatar';\nimport { DialogoArquivo } from './DialogoArquivo';\nimport './Arquivo.css';\n\nexport type EntradaFoto = string | Anexo | readonly (string | Anexo)[] | null | undefined;\n\nexport interface FotoProps {\n /** A foto ou a coleção: URL, `Anexo` ou lista misturando os dois. */\n fotos?: EntradaFoto;\n /** De quem é a foto: vira o `alt` e as iniciais do avatar sem foto. */\n nome: string;\n tamanho?: 'sm' | 'md' | 'lg';\n /** Válvulas de escape da escala (ex.: `13rem`). */\n altura?: string;\n largura?: string;\n /** Clique abre a galeria em tela cheia. Não use dentro de outro alvo clicável. */\n ampliavel?: boolean;\n /** Qual foto da coleção (padrão: 0). */\n indice?: number;\n aoMudarIndice?: (indice: number) => void;\n aoAmpliar?: (indice: number) => void;\n /** Substitui o avatar padrão quando não há foto (ex.: \"Foto indisponível\"). */\n semFoto?: ReactNode;\n /** Conteúdo sobre a imagem (selo, marca d'água). */\n sobreposto?: ReactNode;\n className?: string;\n}\n\nconst AVATAR = { sm: '3rem', md: '4.5rem', lg: '6rem' };\n\nconst normalizarFotos = (f: EntradaFoto): Anexo[] =>\n (f == null ? [] : Array.isArray(f) ? f : [f])\n .map((x) => (typeof x === 'string' ? { nome: '', tamanho: 0, tipo: 'image/*', url: x } : x))\n .filter((x): x is Anexo => !!x?.url?.trim());\n\n/**\n * Moldura de foto em tamanho de leitura: fundo desfocado da própria foto,\n * sombra e anel. Entre o `Avatar` (miniatura) e o `DialogoArquivo` (tela cheia).\n */\nexport function Foto({\n fotos,\n nome,\n tamanho = 'md',\n altura,\n largura,\n ampliavel = false,\n indice: indiceExterno,\n aoMudarIndice,\n aoAmpliar,\n semFoto,\n sobreposto,\n className,\n}: FotoProps) {\n const lista = normalizarFotos(fotos);\n const [indiceInterno, setIndiceInterno] = useState(0);\n const [aberto, setAberto] = useState(false);\n const indice = Math.max(0, Math.min(indiceExterno ?? indiceInterno, lista.length - 1));\n const mudar = (i: number) => {\n setIndiceInterno(i);\n aoMudarIndice?.(i);\n };\n const atual = lista[indice];\n const estilo: CSSProperties = { height: altura, width: largura };\n\n if (!atual) {\n return (\n <div className={cx('lp-foto', `lp-foto--${tamanho}`, className)} style={estilo}>\n {semFoto ?? <Avatar nome={nome} tom=\"escuro\" formato=\"quadrado\" tamanho={AVATAR[tamanho]} />}\n {sobreposto && <div className=\"lp-foto-sobreposto\">{sobreposto}</div>}\n </div>\n );\n }\n\n const exibida = atual.miniatura ?? atual.url!;\n return (\n <div className={cx('lp-foto', `lp-foto--${tamanho}`, className)} style={estilo}>\n {/* fundo: a menor versão disponível, já que vai desfocada */}\n <div className=\"lp-foto-fundo\" style={{ backgroundImage: `url(\"${exibida}\")` }} aria-hidden=\"true\" />\n <img className=\"lp-foto-img\" src={exibida} alt={nome ? `Fotografia de ${nome}` : 'Fotografia'} />\n {ampliavel && (\n <button\n type=\"button\"\n className=\"lp-foto-ampliar\"\n aria-label={`Ampliar fotografia${nome ? ` de ${nome}` : ''}`}\n onClick={() => {\n aoAmpliar?.(indice);\n setAberto(true);\n }}\n >\n <span className=\"lp-foto-lupa\" aria-hidden=\"true\">\n <Icone icone=\"zoom-in\" />\n </span>\n </button>\n )}\n {sobreposto && <div className=\"lp-foto-sobreposto\">{sobreposto}</div>}\n {ampliavel && (\n <DialogoArquivo\n aberto={aberto}\n aoFechar={() => setAberto(false)}\n arquivos={lista.map((a, i) => ({ ...a, nome: a.nome || `Fotografia ${lista.length > 1 ? i + 1 : ''}`.trim() }))}\n indice={indice}\n aoMudarIndice={mudar}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["ICONES","Map","mover","DISTANCIA","posicionar","_Fragment","Ctx","_Fragment","Ctx","_Fragment","Fragment","_Fragment","_Fragment","Fragment","_Fragment","_Fragment","MARGEM","posicionar","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","Imagem","_Fragment","Map$1","Fragment$1","cx","classes","ICONES$1","AppWindow","ArrowDown","ArrowDownWideNarrow","ArrowLeft","ArrowRight","ArrowUp","ArrowUpDown","ArrowUpNarrowWide","Bell","Briefcase","Building2","Calculator","Calendar","Camera","ChartColumn","ChartLine","Check","ChevronDown","ChevronLeft","ChevronRight","ChevronUp","ChevronsLeft","ChevronsRight","Circle","CircleAlert","CircleCheck","CirclePlus","CircleQuestionMark","CircleUser","CircleX","Clock","CloudUpload","Code","Copy","CreditCard","Download","Ellipsis","EllipsisVertical","Equal","ExternalLink","Eye","EyeOff","File","FilePen","FileSpreadsheet","FileText","FileType","Folder","Funnel","FunnelX","GripVertical","Heart","History","House","IdCard","Image","Inbox","Info","Key","Layers","LayoutGrid","Link","List","LoaderCircle","Lock","LogIn","LogOut","Mail","MapPin","Maximize","Menu","Minimize","MessageSquare","Minus","Moon","Package","Palette","PanelRight","Paperclip","Pause","Pencil","Phone","Play","Plus","Printer","RefreshCw","RotateCw","Save","Search","Send","Settings","Square","SquareMousePointer","Shield","ShieldCheck","ShoppingCart","SlidersHorizontal","Star","Sun","Table","Tag","Tags","Trash2","TriangleAlert","Truck","Upload","User","UserPen","UserPlus","Users","Video","Volume2","Wallet","X","ZoomIn","ZoomOut","registrarIcones","icones","DEV","avisados","avisar","msg","Icone","icone","nome","C","girar","className","CORINGAS","capacidade","padrao","c","semMascara","valor","aplicarMascara","padroes","mascara","a","b","cru","p","saida","i","coringa","MASCARAS","TIPOS_DE_CAMPO","digitos","v","repetido","d","dvMod11","resto","base","s","pesos","isCpf","dv1","dv2","isCnpj","isCpfCnpj","isEmail","isCep","isTelefone","n","isPlaca","isRenavam","isChassi","isCnh","soma","peso","desconto","isImei","isHora","m","isData","mes","dt","isDataHora","data","hora","validarTelefone","tipo","validar","TIPOS_CAMPO","ESTADOS","UF_SIGLAS","OPCOES_ESTADOS","TIPOS_PESSOA","listaPorExtenso","l","itens","UNIDADES","DEZ_A_DEZENOVE","DEZENAS","CENTENAS","ESCALAS","grupoPorExtenso","partes","u","numeroPorExtenso","num","grupos","ultimo","g","texto","comE","valorMonetarioPorExtenso","total","inteiro","centavos","de","lerCampo","caminho","o","k","obj","NUMERO","COMPACTO","formatarNumero","opcoes","saudacaoPorHora","h","agora","iniciais","normalizar","formatCpfCnpj","nomeProprio","nomeCurto","p2","parseDataBr","formatDataBr","parseHoraBr","formatHoraBr","parseDataHoraBr","formatDataHoraBr","isoParaDataBr","iso","dataBrParaIso","VERBOS","tituloDeEntidade","e","entidade","modo","nomeDeArquivo","UNIDADES_BYTES","formatBytes","bytes","extensao","tipoDeArquivo","t","ext","iconeArquivo","exibicao","decodificarJwt","token","b64","bin","expiracaoJwt","exp","jwtExpirado","margemSegundos","margemRefreshJwt","apiDefinida","url","SEVERIDADES","CORES","severidadeCor","sev","ehSeveridade","POLITICA_PADRAO","CLASSES","validarSenha","senha","politica","forcaSenha","score","re","senhasIguais","PICKLIST_VAZIO","normalizarPicklistValor","mover$1","para","moverParaAlvo","r","moverParaFonte","moverTudoParaAlvo","apenas","moverTudoParaFonte","reordenarLista","lista","item","filtrarItens","termo","semAssinatura","useNoNavegador","useSyncExternalStore","Portal","createPortal","children","portal","no","FOLGA_V","FOLGA_H","DISTANCIA$1","posicionar$2","lado","preferido","cx_","cy","Dica","alvo","useRef","timer","pos","setPos","useState","abrir","el","medido","posicao","imediato","atraso","fechar","useEffect","esc","Fragment","filhoDesabilitado","isValidElement","cor","PadroesBotaoCtx","createContext","Botao","forwardRef","severidadeProp","aparenciaProp","formatoProp","tamanhoProp","useContext","severidade","aparencia","formato","tamanho","rotulo","soIcone","botao","posicaoIcone","bloco","sombra","iconeDestacado","pressionado","carregando","onClick","dica","FOCAVEIS","abertos","pilha","Sobreposicao","painel","dispensar","eu","anterior","focoInicial","classeMascara","dispensavel","rotuloId","descricaoId","aoDispensar","primeiro","Ctx$2","ICONE_PADRAO","ProvedorConfirmacao","atual","setAtual","resolver","tituloId","useId","msgId","confirmar","useCallback","res","api","useMemo","responder","useConfirmacao","ctx","ICONE","Toast","tom","ic","aoFechar","corpo","detalhe","acoes","modelo","titulo","tempo","Ctx$1","seq","ProvedorToast","setItens","timers","remover","id","tm","agendar","ms","pausar","retomar","mostrar","duracao","mapa","posicoes","daqui","visiveis","ocultos","useToast","useToastOpcional","CLASSE_DENSIDADE","ATRIBUTO_TEMA","CONSULTA_ESCURO","TEMA_PADRAO","Ctx","CHAVE","ler","sistemaEscuro","useSistemaEscuro","escuro","setEscuro","ativo","consulta","aoMudar","scriptTemaInicial","temaInicial","densidadeInicial","ProvedorPreferencias","tema","setTema","densidade","setDensidade","escuroDoSistema","body","alternarTema","usePreferencias","ProvedorUi","prefs","usePreferenciasOpcional","useCliqueFora","handler","refs","aoClicarFora","iniciaisDe","Avatar","falhou","setFalhou","estilo","foto","MAX_MENU","Busca","raiz","campo","setTermo","aberto","setAberto","setAtivo","atalho","casam","itensMenu","menu","excedente","mudar","aoMudarTermo","navegar","aoNavegar","rota","aoTeclar","passo","aoBuscar","temMenu","mostrarPainel","ocupado","placeholder","TrilhaCtx","ProvedorTrilha","useTrilha","caminhoNoMenu","melhor","visitar","pais","secoes","SEPARADORES","Trilha","explicitos","extras","mostrarUnico","sep","separador","modoIcones","aparenciaFinal","marcaSep","desenharLink","it","conteudo","classe","pai","comIcone","DENSIDADES","CHAVE_SIDEBAR","useMedia","casa","setCasa","mq","lerExpandida","achatar","trilha","nav","ItensMenu","aoEscolher","Estrutura","idConteudo","estreito","movel","expandida","setExpandida","aside","setAside","asideTopo","setAsideTopo","subAbertos","setSubAbertos","setMenu","logoOk","setLogoOk","sidebarRef","asideRef","direitaRef","conteudoRef","rotaAtual","alternarSidebar","nova","fecharMenus","fecharAside","rotaAtiva","secao","grupoAtivo","f","emLinha","submenu","alternarGrupo","chave","chaves","achou","aoNavegou","link","on","props","renderLink","inicio","marca","fim","modeloTrilha","renderFilhos","filho","chavePai","itensBusca","itemAside","naoLidas","notificacoes","temDev","menuDesenvolvimento","densidadeAtual","alternarMenu","escolher","fn","avatar","usuario","cabecalhoUsuario","menuDensidade","buscaPadrao","busca","placeholderBusca","ambiente","sec","si","rodapeSidebar","versao","neto","complementosTopbar","aoEscolherMenuDesenvolvimento","aoEscolherNotificacao","menuUsuario","aoEscolherMenuUsuario","rodape","CabecalhoPagina","categoria","DATA_EXTENSO","DATA","HORA","BoasVindas","cargoLinha","cargo","sigla","hoje","ultimoAcesso","ICONES","Alerta","fechado","setFechado","cartao","faixa","comFechar","iconeFinal","acoesAbaixo","posicaoAcoes","botaoX","botaoFechar","mensagem","blocoAcoes","papel","midia","RevelarCamposCtx","MSG_OBRIGATORIO","useValidacaoCampo","tentativas","mexido","setMexido","revelado","setRevelado","vazio","visivel","erroFinal","erro","avisoFinal","aviso","obrigatorio","useCampoIds","gerado","idExterno","descricaoDe","Campo","inline","variante","rotuloRef","rotuloW","setRotuloW","medir","ro","CampoMarcacao","onChange","CampoTexto","validacao","emMoldura","prefixo","sufixo","input","maiuscula","onBlur","disabled","campoTipado","meta","extra","CampoCpf","CampoCnpj","CampoCpfCnpj","CampoCep","CampoPlaca","CampoEmail","CampoRenavam","CampoChassi","CampoCnh","CampoImei","CampoTelefone","fixo","celular","CampoData","CampoHora","CampoDataHora","BRL","CampoMoeda","CampoInteiro","ROTULO_NIVEL","CampoSenha","setVisivel","capsLock","setCapsLock","lerCaps","forca","onKeyDown","onKeyUp","revelavel","x","Dialogo","lateral","rolagem","telaCheiaAbaixo","animacao","subtitulo","Status","TAMANHO_CODIGO","TelaLogin","setUsuario","setSenha","entrando","setEntrando","setErro","tentou","setTentou","pedindoCodigo","setPedindoCodigo","codigo","setCodigo","confiar","setConfiar","erroCodigo","setErroCodigo","confirmando","setConfirmando","comConteudo","apresentacao","entrar","aoEntrar","aoConfirmarCodigo","obrig","propsUsuario","descricao","identificador","linkSenha","instrucaoCodigo","confiarDispositivo","TelaErro","tela","GrupoBotoes","orientacao","GrupoAlternancia","grupo","marcados","marcado","alternar","_m","_v","_a","BarraBotoes","distribuicao","SETA","MARGEM$1","SELETOR_ITEM","SELETOR_FOCAVEL","posicionar$1","ao","afasta","vw","vh","gap","dir","direcao","w","top","left","alinh","MenuSuspenso","ariaLabel","gatilhoProprio","gatilho","ehMenu","deslocamento","devolverFoco","ancora","referencia","grande","alinhamentoTelaGrande","alinhamento","posicionado","fechamento","teclaGatilho","teclaPainel","focaveis","prox","seta","semSeta","propsGatilho","desabilitado","dividido","botaoSeta","aoClicarPrincipal","larguraMenu","Aba","Abas","barra","abas","Children","interna","setInterna","ativa","pagina","vertical","alinha","selecionar","j","entradas","aba","ultima","temPainel","conteudoTab","en","escolhida","paineis","iconeAcima","posicaoBarra","aoVoltar","identidade","cabecalho","Card","recolhido","setRecolhido","recolhidoInicial","cheio","setCheio","corpoId","antes","interativo","aoClicar","comFerramentas","recolhivel","telaCheia","ferramentas","fundo","posicaoMidia","horizontal","corpoSemEspaco","borda","detalhes","GrupoCards","Recolhivel","prefereMenosMovimento","Carrossel","slides","pausadoUsuario","setPausadoUsuario","pausadoHover","setPausadoHover","inicioArraste","ir","proximo","rodando","automatico","intervalo","transicao","arrastar","proporcao","x0","dx","controles","indicadores","localizar","colunas","mover","novas","QuadroArrastavel","arraste","setArraste","pego","setPego","anuncio","setAnuncio","refsColunas","nomeColuna","aoPressionar","aoMoverPonteiro","y","menor","col","fora","min","max","dist","indice","arrastando","mover_","soltar","useLayoutEffect","alca","nomeItem","final","fantasma","renderItem","AcordeaoCtx","Acordeao","controlado","interno","setInterno","padraoAbertos","novos","multiplo","separado","ItemAcordeao","AcaoLinha","OPOSTO","DISTANCIA","MARGEM","cabe","posicionar","Balao","balao","passar","abrirLogo","fecharDepois","cloneElement","largura","FormCtx","Form","tituloProp","formId","leitura","setTentativas","aoSubmeter","salvando","aoSalvar","pendencias","acoesPadrao","aoCancelar","rotuloSalvar","arranjo","comMenu","temAcoes","menuTitulo","menuAtivo","aoEscolherMenu","FormSecao","grade","legenda","CampoTextarea","comContador","contador","maxLength","pct","usePosicaoFlutuante","abaixo","acima","alturaEstimada","espaco","SelectInterno","listaId","moldura","estaSel","selecionados","comBusca","rotuloSelecao","idx","ariaComum","botaoLimpar","limpar","sel","CampoSelect","temValor","CampoSelectMultiplo","opcoesUf","CampoUf","CampoUfMultiplo","CampoTipoPessoa","Escolha","idxSel","idxFoco","fmt","Avaliacao","sob","setSob","setOcupado","exibido","bloqueado","somenteLeitura","notaNoPonteiro","aoPassar","estrelas","preenchido","mensagens","textoOcupado","limpavel","Chip","aoRemover","focavel","Filtros","aoConsultar","consultando","alterado","aoLimpar","aplicados","Picklist","valorBruto","setSel","foco","setFoco","arrastado","paraRotulo","transferir","destino","rotuloAlvo","rotuloFonte","marcar","aditivo","reordenarItem","focar","reordenar","antesDe","coluna","filtro","alturaLista","dragdrop","marcadosFonte","marcadosAlvo","BUSCA_ATRASO_MS","useBuscaAssincrona","resultados","setResultados","setCarregando","buscarRef","buscar","estavaAtivo","primeira","minimo","minha","CampoBusca","editando","setEditando","paraDetalhe","vazioTexto","CampoCidade","setLista","ufAnterior","uf","buscarPorUf","vivo","listaPaginas","Paginacao","totalPaginas","ini","aoMudarPagina","embutida","aoMudarTamanho","tamanhoOpcoes","Skeleton","altura","Vazio","valorDoCampo","CaixaSelecao","ref","indeterminado","LARGURAS","Tabela","registros","todos","alguns","selecao","aoMudarSelecao","alternarTodos","aoClicarLinha","linha","iconeOrdem","ordenacao","paginacao","aoRecarregar","atualizando","aoOrdenar","cel","vazioIcone","vazioTitulo","vazioDescricao","vazioAcoes","Lista","numerada","ItemLista","esquerda","marcacao","aoMarcar","href","solido","ListaCards","larguraMin","alturaCard","card","NUM","PCT","Indicador","subiu","variacao","boa","variacaoBoa","Indicadores","Detalhes","disposicao","Badge","ComBadge","ponto","Placa","numero","Citacao","autor","fonte","Imagem","responsiva","cantos","miniatura","style","Figura","alinhamentoLegenda","BotaoFechar","Carregando","bloqueante","logo","ESCALA","Girador","mostrarRotulo","PADRAO","Progresso","formatar","classeBarra","animado","entrada","trilhaColorida","mostrarValor","etiqueta","segmentos","marcos","marcador","LIMIAR","Conversa","noFim","longe","setLonge","filhos","semMensagens","quantas","novaDoUsuario","irParaFim","ls","aoRolar","larguraMaxima","rotuloIrParaFim","formatarHora","Mensagem","toast","copiado","setCopiado","gerando","estado","comErro","copiar","textoCopia","blocoAvatar","comAcoes","copiavel","dataHora","rotuloGerando","rotuloEnviando","aoTentarNovamente","rotuloTentarNovamente","rotuloCopiar","AVISO_CONTADOR","CampoMensagem","podeEnviar","maxCaracteres","ajustarAltura","cs","linhasMaximas","enviar","aoEnviar","acoesExtras","rotuloParar","aoParar","rotuloEnviar","rotuloPadrao","Trecho","cortado","setCortado","menos","mais","Referencias","abertoInicial","rotuloMostrarMais","rotuloMostrarMenos","NIVEIS","VisualizadorArquivo","arquivo","Conteudo","falhar","aoFalhar","Imagem$1","nivel","setNivel","giro","setGiro","pan","setPan","palco","arrasto","zoom","limitar","mx","my","mudarNivel","novo","ajustar","CONTROLES","DialogoArquivo","arquivos","aoMudarIndice","chaveDe","CampoAnexo","urls","sobre","setSobre","recusados","setRecusados","visualizando","setVisualizando","useImperativeHandle","adicionar","aceitos","grandes","maxTamanho","multiple","existentes","aoSoltar","faltam","AVATAR","normalizarFotos","Foto","indiceExterno","fotos","indiceInterno","setIndiceInterno","semFoto","sobreposto","exibida","ampliavel","aoAmpliar"],"sources":["../src/utils/cx.ts","../src/utils/Icone.tsx","../src/utils/mascara.ts","../src/utils/validadores.ts","../src/utils/tiposCampo.ts","../src/utils/constantes.ts","../src/utils/texto.ts","../src/utils/datas.ts","../src/utils/entidade.ts","../src/utils/anexos.ts","../src/utils/jwt.ts","../src/utils/severidade.ts","../src/utils/senha.ts","../src/utils/picklist.ts","../src/utils/portal.tsx","../src/components/Dica/Dica.tsx","../src/components/Botao/Botao.tsx","../src/components/Dialogo/Sobreposicao.tsx","../src/components/Confirmacao/Confirmacao.tsx","../src/components/Toast/Toast.tsx","../src/components/Preferencias/Preferencias.tsx","../src/utils/useCliqueFora.ts","../src/components/Avatar/Avatar.tsx","../src/components/Busca/Busca.tsx","../src/components/Trilha/Trilha.tsx","../src/components/Estrutura/Estrutura.tsx","../src/components/CabecalhoPagina/CabecalhoPagina.tsx","../src/components/BoasVindas/BoasVindas.tsx","../src/components/Alerta/Alerta.tsx","../src/components/Campo/Campo.tsx","../src/components/CampoMarcacao/CampoMarcacao.tsx","../src/components/CampoTexto/CampoTexto.tsx","../src/components/CampoSenha/CampoSenha.tsx","../src/components/Dialogo/Dialogo.tsx","../src/components/Status/Status.tsx","../src/components/TelaLogin/TelaLogin.tsx","../src/components/TelaErro/TelaErro.tsx","../src/components/GrupoBotoes/GrupoBotoes.tsx","../src/components/MenuSuspenso/MenuSuspenso.tsx","../src/components/Abas/Abas.tsx","../src/components/Card/Card.tsx","../src/components/Recolhivel/Recolhivel.tsx","../src/components/Carrossel/Carrossel.tsx","../src/components/QuadroArrastavel/QuadroArrastavel.tsx","../src/components/Acordeao/Acordeao.tsx","../src/components/AcaoLinha/AcaoLinha.tsx","../src/components/Balao/Balao.tsx","../src/components/Form/Form.tsx","../src/components/CampoTextarea/CampoTextarea.tsx","../src/utils/usePosicaoFlutuante.ts","../src/components/CampoSelect/CampoSelect.tsx","../src/components/CampoDominio/CampoDominio.tsx","../src/components/Escolha/Escolha.tsx","../src/components/Avaliacao/Avaliacao.tsx","../src/components/Chip/Chip.tsx","../src/components/Filtros/Filtros.tsx","../src/components/Picklist/Picklist.tsx","../src/utils/useBuscaAssincrona.ts","../src/components/CampoBusca/CampoBusca.tsx","../src/components/CampoBusca/CampoCidade.tsx","../src/components/Paginacao/Paginacao.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Vazio/Vazio.tsx","../src/components/Tabela/Tabela.tsx","../src/components/Lista/Lista.tsx","../src/components/ListaCards/ListaCards.tsx","../src/components/Indicador/Indicador.tsx","../src/components/Detalhes/Detalhes.tsx","../src/components/Badge/Badge.tsx","../src/components/Placa/Placa.tsx","../src/components/Citacao/Citacao.tsx","../src/components/Imagem/Imagem.tsx","../src/components/BotaoFechar/BotaoFechar.tsx","../src/components/Carregando/Carregando.tsx","../src/components/Girador/Girador.tsx","../src/components/Progresso/Progresso.tsx","../src/components/Conversa/Conversa.tsx","../src/components/Mensagem/Mensagem.tsx","../src/components/CampoMensagem/CampoMensagem.tsx","../src/components/Referencias/Referencias.tsx","../src/components/Arquivo/VisualizadorArquivo.tsx","../src/components/Arquivo/DialogoArquivo.tsx","../src/components/Arquivo/CampoAnexo.tsx","../src/components/Arquivo/Foto.tsx"],"sourcesContent":["/** Junta classes CSS ignorando valores falsos. */\r\nexport function cx(...classes: Array<string | false | null | undefined>): string {\r\n return classes.filter(Boolean).join(' ');\r\n}\r\n","import type { ReactNode } from 'react';\r\nimport {\r\n AppWindow,\r\n ArrowDown,\r\n ArrowDownWideNarrow,\r\n ArrowLeft,\r\n ArrowRight,\r\n ArrowUp,\r\n ArrowUpDown,\r\n ArrowUpNarrowWide,\r\n Bell,\r\n Briefcase,\r\n Building2,\r\n Calculator,\r\n Calendar,\r\n Camera,\r\n ChartColumn,\r\n ChartLine,\r\n Check,\r\n ChevronDown,\r\n ChevronLeft,\r\n ChevronRight,\r\n ChevronUp,\r\n ChevronsLeft,\r\n ChevronsRight,\r\n Circle,\r\n CircleAlert,\r\n CircleCheck,\r\n CirclePlus,\r\n CircleQuestionMark,\r\n CircleUser,\r\n CircleX,\r\n Clock,\r\n CloudUpload,\r\n Code,\r\n Copy,\r\n CreditCard,\r\n Download,\r\n Ellipsis,\r\n EllipsisVertical,\r\n Equal,\r\n ExternalLink,\r\n Eye,\r\n EyeOff,\r\n File,\r\n FilePen,\r\n FileSpreadsheet,\r\n FileText,\r\n FileType,\r\n Folder,\r\n Funnel,\r\n FunnelX,\r\n GripVertical,\r\n Heart,\r\n History,\r\n House,\r\n IdCard,\r\n Image,\r\n Inbox,\r\n Info,\r\n Key,\r\n Layers,\r\n LayoutGrid,\r\n Link,\r\n List,\r\n LoaderCircle,\r\n Lock,\r\n LogIn,\r\n LogOut,\r\n Mail,\r\n Map,\r\n MapPin,\r\n Maximize,\r\n Menu,\r\n Minimize,\r\n MessageSquare,\r\n Minus,\r\n Moon,\r\n Package,\r\n Palette,\r\n PanelRight,\r\n Paperclip,\r\n Pause,\r\n Pencil,\r\n Phone,\r\n Play,\r\n Plus,\r\n Printer,\r\n RefreshCw,\r\n RotateCw,\r\n Save,\r\n Search,\r\n Send,\r\n Settings,\r\n Square,\r\n SquareMousePointer,\r\n Shield,\r\n ShieldCheck,\r\n ShoppingCart,\r\n SlidersHorizontal,\r\n Star,\r\n Sun,\r\n Table,\r\n Tag,\r\n Tags,\r\n Trash2,\r\n TriangleAlert,\r\n Truck,\r\n Upload,\r\n User,\r\n UserPen,\r\n UserPlus,\r\n Users,\r\n Video,\r\n Volume2,\r\n Wallet,\r\n X,\r\n ZoomIn,\r\n ZoomOut,\r\n type LucideIcon,\r\n} from 'lucide-react';\r\nimport { cx } from './cx';\r\n\r\n/**\r\n * Ícones registrados, pelo nome do Lucide (https://lucide.dev/icons).\r\n * Só estes entram no pacote; o app registra outros com `registrarIcones`\r\n * ou passa o componente direto: `icone={<Rocket />}`.\r\n */\r\nconst ICONES: Record<string, LucideIcon> = {\r\n 'app-window': AppWindow,\r\n 'arrow-down': ArrowDown,\r\n 'arrow-down-wide-narrow': ArrowDownWideNarrow,\r\n 'arrow-left': ArrowLeft,\r\n 'arrow-right': ArrowRight,\r\n 'arrow-up': ArrowUp,\r\n 'arrow-up-down': ArrowUpDown,\r\n 'arrow-up-narrow-wide': ArrowUpNarrowWide,\r\n bell: Bell,\r\n briefcase: Briefcase,\r\n 'building-2': Building2,\r\n calculator: Calculator,\r\n calendar: Calendar,\r\n camera: Camera,\r\n 'chart-column': ChartColumn,\r\n 'chart-line': ChartLine,\r\n check: Check,\r\n 'chevron-down': ChevronDown,\r\n 'chevron-left': ChevronLeft,\r\n 'chevron-right': ChevronRight,\r\n 'chevron-up': ChevronUp,\r\n 'chevrons-left': ChevronsLeft,\r\n 'chevrons-right': ChevronsRight,\r\n circle: Circle,\r\n 'circle-alert': CircleAlert,\r\n 'circle-check': CircleCheck,\r\n 'circle-plus': CirclePlus,\r\n 'circle-question-mark': CircleQuestionMark,\r\n 'circle-user': CircleUser,\r\n 'circle-x': CircleX,\r\n clock: Clock,\r\n 'cloud-upload': CloudUpload,\r\n code: Code,\r\n copy: Copy,\r\n 'credit-card': CreditCard,\r\n download: Download,\r\n ellipsis: Ellipsis,\r\n 'ellipsis-vertical': EllipsisVertical,\r\n equal: Equal,\r\n 'external-link': ExternalLink,\r\n eye: Eye,\r\n 'eye-off': EyeOff,\r\n file: File,\r\n 'file-pen': FilePen,\r\n 'file-spreadsheet': FileSpreadsheet,\r\n 'file-text': FileText,\r\n 'file-type': FileType,\r\n folder: Folder,\r\n funnel: Funnel,\r\n 'funnel-x': FunnelX,\r\n 'grip-vertical': GripVertical,\r\n heart: Heart,\r\n history: History,\r\n house: House,\r\n 'id-card': IdCard,\r\n image: Image,\r\n inbox: Inbox,\r\n info: Info,\r\n key: Key,\r\n layers: Layers,\r\n 'layout-grid': LayoutGrid,\r\n link: Link,\r\n list: List,\r\n 'loader-circle': LoaderCircle,\r\n lock: Lock,\r\n 'log-in': LogIn,\r\n 'log-out': LogOut,\r\n mail: Mail,\r\n map: Map,\r\n 'map-pin': MapPin,\r\n maximize: Maximize,\r\n menu: Menu,\r\n minimize: Minimize,\r\n 'message-square': MessageSquare,\r\n minus: Minus,\r\n moon: Moon,\r\n package: Package,\r\n palette: Palette,\r\n 'panel-right': PanelRight,\r\n paperclip: Paperclip,\r\n pause: Pause,\r\n pencil: Pencil,\r\n phone: Phone,\r\n play: Play,\r\n plus: Plus,\r\n printer: Printer,\r\n 'refresh-cw': RefreshCw,\r\n 'rotate-cw': RotateCw,\r\n save: Save,\r\n search: Search,\r\n send: Send,\r\n settings: Settings,\r\n square: Square,\r\n 'square-mouse-pointer': SquareMousePointer,\r\n shield: Shield,\r\n 'shield-check': ShieldCheck,\r\n 'shopping-cart': ShoppingCart,\r\n 'sliders-horizontal': SlidersHorizontal,\r\n star: Star,\r\n sun: Sun,\r\n table: Table,\r\n tag: Tag,\r\n tags: Tags,\r\n 'trash-2': Trash2,\r\n 'triangle-alert': TriangleAlert,\r\n truck: Truck,\r\n upload: Upload,\r\n user: User,\r\n 'user-pen': UserPen,\r\n 'user-plus': UserPlus,\r\n users: Users,\r\n video: Video,\r\n 'volume-2': Volume2,\r\n wallet: Wallet,\r\n x: X,\r\n 'zoom-in': ZoomIn,\r\n 'zoom-out': ZoomOut,\r\n};\r\n\r\n/** Nome de ícone registrado (ou qualquer outro, depois de `registrarIcones`). */\r\nexport type NomeIcone = keyof typeof ICONES | (string & {});\r\n\r\n/** Ícone aceito pelos componentes: nome do Lucide (`'save'`) ou um nó React (`<Rocket />`). */\r\nexport type IconeProp = NomeIcone | ReactNode;\r\n\r\n/** Acrescenta ícones ao registro: `registrarIcones({ rocket: Rocket })`. */\r\nexport function registrarIcones(icones: Record<string, LucideIcon>) {\r\n Object.assign(ICONES, icones);\r\n}\r\n\r\n// o bundler do APP substitui `process.env.NODE_ENV` (padrão das bibliotecas);\r\n// sem bundler, `process` não existe e os avisos ficam desligados\r\ndeclare const process: { env: { NODE_ENV?: string } };\r\nlet DEV = false;\r\ntry {\r\n DEV = process.env.NODE_ENV !== 'production';\r\n} catch {\r\n DEV = false;\r\n}\r\n\r\nconst avisados = new Set<string>();\r\nfunction avisar(msg: string) {\r\n if (avisados.has(msg) || !DEV) return;\r\n avisados.add(msg);\r\n console.warn(`[@celke/kole-react] ${msg}`);\r\n}\r\n\r\nexport interface IconeProps {\r\n icone?: IconeProp;\r\n className?: string;\r\n /** Gira continuamente (indicador de carregamento). */\r\n girar?: boolean;\r\n}\r\n\r\nexport function Icone({ icone, className, girar }: IconeProps) {\r\n if (icone === undefined || icone === null || icone === false || icone === '') return null;\r\n if (typeof icone === 'string') {\r\n const nome = icone.trim();\r\n const C = ICONES[nome];\r\n if (!C) {\r\n avisar(`Ícone \"${nome}\" não registrado. Use registrarIcones({ '${nome}': Componente }) ou passe o componente do lucide-react.`);\r\n return null;\r\n }\r\n return <C className={cx('lp-ic', girar && 'lp-ic--girar', className)} size=\"1em\" strokeWidth={2} aria-hidden=\"true\" focusable=\"false\" />;\r\n }\r\n return (\r\n <span className={cx('lp-icone', girar && 'lp-ic--girar', className)} aria-hidden=\"true\">\r\n {icone}\r\n </span>\r\n );\r\n}\r\n","/**\r\n * Máscara de digitação simples, sem dependências.\r\n *\r\n * Coringas do padrão: `0` dígito · `A` letra · `S` letra ou dígito · `*` qualquer.\r\n * Qualquer outro caractere é literal e entra sozinho.\r\n * Vários padrões (array) = o primeiro que comporta o texto digitado vence\r\n * (ex.: telefone fixo × celular).\r\n */\r\nexport type Mascara = string | string[];\r\n\r\nconst CORINGAS: Record<string, RegExp> = {\r\n '0': /\\d/,\r\n A: /[a-zA-Z]/,\r\n S: /[a-zA-Z0-9]/,\r\n '*': /./,\r\n};\r\n\r\nfunction capacidade(padrao: string): number {\r\n return [...padrao].filter((c) => c in CORINGAS).length;\r\n}\r\n\r\n/** Remove os literais da máscara, deixando só o que o usuário digitou. */\r\nexport function semMascara(valor: string): string {\r\n return valor.replace(/[^a-zA-Z0-9]/g, '');\r\n}\r\n\r\nexport function aplicarMascara(valor: string, mascara: Mascara): string {\r\n const padroes = (Array.isArray(mascara) ? mascara : [mascara])\r\n .slice()\r\n .sort((a, b) => capacidade(a) - capacidade(b));\r\n const cru = semMascara(valor);\r\n const padrao = padroes.find((p) => capacidade(p) >= cru.length) ?? padroes[padroes.length - 1];\r\n\r\n let saida = '';\r\n let i = 0;\r\n for (const c of padrao) {\r\n if (i >= cru.length) break;\r\n const coringa = CORINGAS[c];\r\n if (coringa) {\r\n // descarta o que não casa com o coringa até achar um caractere válido\r\n while (i < cru.length && !coringa.test(cru[i])) i++;\r\n if (i >= cru.length) break;\r\n saida += cru[i++];\r\n } else {\r\n saida += c;\r\n }\r\n }\r\n return saida;\r\n}\r\n\r\nexport const MASCARAS = {\r\n cpf: '000.000.000-00',\r\n cnpj: '00.000.000/0000-00',\r\n cep: '00000-000',\r\n telefone: ['(00) 0000-0000', '(00) 00000-0000'],\r\n placa: 'AAA0S00',\r\n} as const;\r\n","/**\r\n * Validadores de dados brasileiros: predicados `is*` + o despachante `validar()`.\r\n * Lógica pura, sem React. A máscara de cada tipo mora em `tiposCampo.ts`.\r\n */\r\n\r\nexport const TIPOS_DE_CAMPO = [\r\n 'cpf',\r\n 'cnpj',\r\n 'cpfCnpj',\r\n 'email',\r\n 'cep',\r\n 'telefone',\r\n 'placa',\r\n 'renavam',\r\n 'chassi',\r\n 'cnh',\r\n 'imei',\r\n 'hora',\r\n 'data',\r\n 'dataHora',\r\n] as const;\r\n\r\nexport type TipoDeCampo = (typeof TIPOS_DE_CAMPO)[number];\r\n\r\nconst digitos = (v: string) => (v ?? '').replace(/\\D/g, '');\r\nconst repetido = (d: string) => /^(\\d)\\1*$/.test(d);\r\n\r\n/** Dígito verificador mod-11 (CPF/CNPJ): pesos aplicados da esquerda para a direita. */\r\nfunction dvMod11(base: string, pesos: number[]): number {\r\n const soma = [...base].reduce((s, c, i) => s + Number(c) * pesos[i], 0);\r\n const resto = soma % 11;\r\n return resto < 2 ? 0 : 11 - resto;\r\n}\r\n\r\n/** CPF com os dois dígitos verificadores; rejeita sequências repetidas. */\r\nexport function isCpf(v: string): boolean {\r\n const d = digitos(v);\r\n if (d.length !== 11 || repetido(d)) return false;\r\n const dv1 = dvMod11(d.slice(0, 9), [10, 9, 8, 7, 6, 5, 4, 3, 2]);\r\n const dv2 = dvMod11(d.slice(0, 10), [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]);\r\n return dv1 === Number(d[9]) && dv2 === Number(d[10]);\r\n}\r\n\r\n/** CNPJ com os dois dígitos verificadores; rejeita sequências repetidas. */\r\nexport function isCnpj(v: string): boolean {\r\n const d = digitos(v);\r\n if (d.length !== 14 || repetido(d)) return false;\r\n const dv1 = dvMod11(d.slice(0, 12), [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);\r\n const dv2 = dvMod11(d.slice(0, 13), [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);\r\n return dv1 === Number(d[12]) && dv2 === Number(d[13]);\r\n}\r\n\r\n/** Mais de 11 dígitos = CNPJ; senão, CPF. */\r\nexport function isCpfCnpj(v: string): boolean {\r\n return digitos(v).length > 11 ? isCnpj(v) : isCpf(v);\r\n}\r\n\r\nexport function isEmail(v: string): boolean {\r\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test((v ?? '').trim());\r\n}\r\n\r\nexport function isCep(v: string): boolean {\r\n return digitos(v).length === 8;\r\n}\r\n\r\n/** Fixo (10 dígitos) ou celular (11), sempre com DDD. */\r\nexport function isTelefone(v: string): boolean {\r\n const n = digitos(v).length;\r\n return n === 10 || n === 11;\r\n}\r\n\r\n/** Placa antiga `AAA0000` ou Mercosul `AAA0A00` (aceita hífen). */\r\nexport function isPlaca(v: string): boolean {\r\n const p = (v ?? '').replace(/[^a-zA-Z0-9]/g, '').toUpperCase();\r\n return /^[A-Z]{3}\\d[A-Z0-9]\\d{2}$/.test(p);\r\n}\r\n\r\n/** RENAVAM: por enquanto só o tamanho (9 a 11 dígitos); o dígito verificador fica para depois. */\r\nexport function isRenavam(v: string): boolean {\r\n const n = digitos(v).length;\r\n return n >= 9 && n <= 11 && n === (v ?? '').replace(/\\s/g, '').length;\r\n}\r\n\r\n/** Chassi (VIN): 17 caracteres alfanuméricos, sem I, O e Q. */\r\nexport function isChassi(v: string): boolean {\r\n return /^[A-HJ-NPR-Z0-9]{17}$/.test((v ?? '').trim().toUpperCase());\r\n}\r\n\r\n/** CNH: 9 dígitos + 2 verificadores (algoritmo do DENATRAN). */\r\nexport function isCnh(v: string): boolean {\r\n const d = digitos(v);\r\n if (d.length !== 11 || repetido(d)) return false;\r\n let soma = 0;\r\n for (let i = 0, peso = 9; i < 9; i++, peso--) soma += Number(d[i]) * peso;\r\n let dv1 = soma % 11;\r\n let desconto = 0;\r\n if (dv1 >= 10) {\r\n dv1 = 0;\r\n desconto = 2;\r\n }\r\n soma = 0;\r\n for (let i = 0, peso = 1; i < 9; i++, peso++) soma += Number(d[i]) * peso;\r\n const resto = soma % 11;\r\n let dv2 = resto >= 10 ? 0 : resto - desconto;\r\n if (dv2 < 0) dv2 += 11;\r\n if (dv2 >= 10) dv2 = 0;\r\n return dv1 === Number(d[9]) && dv2 === Number(d[10]);\r\n}\r\n\r\n/** IMEI: 15 dígitos validados por Luhn; rejeita sequências repetidas. */\r\nexport function isImei(v: string): boolean {\r\n const d = digitos(v);\r\n if (d.length !== 15 || repetido(d)) return false;\r\n let soma = 0;\r\n for (let i = 0; i < 15; i++) {\r\n let n = Number(d[i]);\r\n if (i % 2 === 1) {\r\n n *= 2;\r\n if (n > 9) n -= 9;\r\n }\r\n soma += n;\r\n }\r\n return soma % 10 === 0;\r\n}\r\n\r\n/** `HH:mm` entre 00:00 e 23:59. */\r\nexport function isHora(v: string): boolean {\r\n const m = /^(\\d{2}):(\\d{2})$/.exec((v ?? '').trim());\r\n return !!m && Number(m[1]) <= 23 && Number(m[2]) <= 59;\r\n}\r\n\r\n/** `dd/mm/aaaa` existente no calendário (31/02 é recusado). */\r\nexport function isData(v: string): boolean {\r\n const m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/.exec((v ?? '').trim());\r\n if (!m) return false;\r\n const [d, mes, a] = [Number(m[1]), Number(m[2]), Number(m[3])];\r\n const dt = new Date(a, mes - 1, d);\r\n return dt.getFullYear() === a && dt.getMonth() === mes - 1 && dt.getDate() === d;\r\n}\r\n\r\n/** `dd/mm/aaaa HH:mm`. */\r\nexport function isDataHora(v: string): boolean {\r\n const [data, hora, ...resto] = (v ?? '').trim().split(/\\s+/);\r\n return !resto.length && isData(data ?? '') && isHora(hora ?? '');\r\n}\r\n\r\n/**\r\n * Telefone, opcionalmente restrito a um formato. Vazio é válido\r\n * (obrigatoriedade é assunto do campo, não do validador).\r\n */\r\nexport function validarTelefone(v: string, tipo?: 'fixo' | 'celular'): string {\r\n const n = digitos(v).length;\r\n if (!n) return '';\r\n if (tipo === 'fixo') return n === 10 ? '' : 'Deve ser um telefone fixo com DDD';\r\n if (tipo === 'celular') return n === 11 ? '' : 'Deve ser um celular com DDD';\r\n return n === 10 || n === 11 ? '' : 'Telefone incompleto';\r\n}\r\n\r\n/**\r\n * Mensagem de validação do tipo, ou `''` quando vazio ou válido.\r\n * Separa \"incompleto\" (ainda digitando) de \"inválido\" (errado).\r\n */\r\nexport function validar(tipo: TipoDeCampo, valor: string): string {\r\n const v = (valor ?? '').trim();\r\n if (!v) return '';\r\n const n = digitos(v).length;\r\n switch (tipo) {\r\n case 'cpf':\r\n return n < 11 ? 'CPF incompleto' : isCpf(v) ? '' : 'CPF inválido';\r\n case 'cnpj':\r\n return n < 14 ? 'CNPJ incompleto' : isCnpj(v) ? '' : 'CNPJ inválido';\r\n case 'cpfCnpj':\r\n if (n < 11) return 'CPF/CNPJ incompleto';\r\n if (n === 11) return isCpf(v) ? '' : 'CPF inválido';\r\n if (n < 14) return 'CNPJ incompleto';\r\n return isCnpj(v) ? '' : 'CNPJ inválido';\r\n case 'email':\r\n return isEmail(v) ? '' : 'E-mail inválido';\r\n case 'cep':\r\n return isCep(v) ? '' : 'CEP incompleto';\r\n case 'telefone':\r\n return validarTelefone(v);\r\n case 'placa':\r\n return isPlaca(v) ? '' : 'Placa inválida';\r\n case 'renavam':\r\n return isRenavam(v) ? '' : 'RENAVAM deve ter de 9 a 11 dígitos';\r\n case 'chassi':\r\n return v.replace(/\\s/g, '').length < 17 ? 'Chassi incompleto' : isChassi(v) ? '' : 'Chassi inválido';\r\n case 'cnh':\r\n return n < 11 ? 'CNH incompleta' : isCnh(v) ? '' : 'CNH inválida';\r\n case 'imei':\r\n return n < 15 ? 'IMEI incompleto' : isImei(v) ? '' : 'IMEI inválido';\r\n case 'hora':\r\n return isHora(v) ? '' : 'Hora inválida';\r\n case 'data':\r\n return isData(v) ? '' : 'Data inválida';\r\n case 'dataHora':\r\n return isDataHora(v) ? '' : 'Data e hora inválidas';\r\n }\r\n}\r\n","import { MASCARAS, type Mascara } from './mascara';\r\nimport { validar, type TipoDeCampo } from './validadores';\r\n\r\n/** Descritor de um tipo de campo: máscara, placeholder, validação e caixa alta. */\r\nexport interface MetaTipoCampo {\r\n mascara?: Mascara;\r\n placeholder?: string;\r\n validar: (valor: string) => string;\r\n /** `true` = sempre maiúscula (placa) · `false` = nunca (e-mail). */\r\n caixaAlta?: boolean;\r\n}\r\n\r\n/** Fonte única de máscara/placeholder/validação de cada tipo de campo. */\r\nexport const TIPOS_CAMPO: Record<TipoDeCampo, MetaTipoCampo> = {\r\n cpf: { mascara: MASCARAS.cpf, placeholder: '000.000.000-00', validar: (v) => validar('cpf', v) },\r\n cnpj: { mascara: MASCARAS.cnpj, placeholder: '00.000.000/0000-00', validar: (v) => validar('cnpj', v) },\r\n cpfCnpj: { mascara: [MASCARAS.cpf, MASCARAS.cnpj], placeholder: 'CPF ou CNPJ', validar: (v) => validar('cpfCnpj', v) },\r\n email: { placeholder: 'nome@exemplo.com', validar: (v) => validar('email', v), caixaAlta: false },\r\n cep: { mascara: MASCARAS.cep, placeholder: '00000-000', validar: (v) => validar('cep', v) },\r\n telefone: { mascara: [...MASCARAS.telefone], placeholder: '(00) 00000-0000', validar: (v) => validar('telefone', v) },\r\n placa: { mascara: MASCARAS.placa, placeholder: 'ABC0A00', validar: (v) => validar('placa', v), caixaAlta: true },\r\n renavam: { mascara: '00000000000', placeholder: '00000000000', validar: (v) => validar('renavam', v) },\r\n chassi: { mascara: 'SSSSSSSSSSSSSSSSS', placeholder: 'Código de 17 caracteres', validar: (v) => validar('chassi', v), caixaAlta: true },\r\n cnh: { mascara: '00000000000', placeholder: '00000000000', validar: (v) => validar('cnh', v) },\r\n imei: { mascara: '000000000000000', placeholder: '000000000000000', validar: (v) => validar('imei', v) },\r\n hora: { mascara: '00:00', placeholder: 'HH:mm', validar: (v) => validar('hora', v) },\r\n data: { mascara: '00/00/0000', placeholder: 'dd/mm/aaaa', validar: (v) => validar('data', v) },\r\n dataHora: { mascara: '00/00/0000 00:00', placeholder: 'dd/mm/aaaa HH:mm', validar: (v) => validar('dataHora', v) },\r\n};\r\n","import type { Opcao } from './tipos';\r\n\r\n/** Unidade federativa: sigla + nome. */\r\nexport interface Uf {\r\n uf: string;\r\n descricao: string;\r\n}\r\n\r\n/** Os 26 estados + o Distrito Federal, em ordem alfabética da sigla. */\r\nexport const ESTADOS: readonly Uf[] = [\r\n { uf: 'AC', descricao: 'Acre' },\r\n { uf: 'AL', descricao: 'Alagoas' },\r\n { uf: 'AM', descricao: 'Amazonas' },\r\n { uf: 'AP', descricao: 'Amapá' },\r\n { uf: 'BA', descricao: 'Bahia' },\r\n { uf: 'CE', descricao: 'Ceará' },\r\n { uf: 'DF', descricao: 'Distrito Federal' },\r\n { uf: 'ES', descricao: 'Espírito Santo' },\r\n { uf: 'GO', descricao: 'Goiás' },\r\n { uf: 'MA', descricao: 'Maranhão' },\r\n { uf: 'MG', descricao: 'Minas Gerais' },\r\n { uf: 'MS', descricao: 'Mato Grosso do Sul' },\r\n { uf: 'MT', descricao: 'Mato Grosso' },\r\n { uf: 'PA', descricao: 'Pará' },\r\n { uf: 'PB', descricao: 'Paraíba' },\r\n { uf: 'PE', descricao: 'Pernambuco' },\r\n { uf: 'PI', descricao: 'Piauí' },\r\n { uf: 'PR', descricao: 'Paraná' },\r\n { uf: 'RJ', descricao: 'Rio de Janeiro' },\r\n { uf: 'RN', descricao: 'Rio Grande do Norte' },\r\n { uf: 'RO', descricao: 'Rondônia' },\r\n { uf: 'RR', descricao: 'Roraima' },\r\n { uf: 'RS', descricao: 'Rio Grande do Sul' },\r\n { uf: 'SC', descricao: 'Santa Catarina' },\r\n { uf: 'SE', descricao: 'Sergipe' },\r\n { uf: 'SP', descricao: 'São Paulo' },\r\n { uf: 'TO', descricao: 'Tocantins' },\r\n];\r\n\r\n/** Só as siglas, derivadas de `ESTADOS`. */\r\nexport const UF_SIGLAS: readonly string[] = ESTADOS.map((e) => e.uf);\r\n\r\n/** Opções prontas para select: valor = sigla, rótulo = \"PR — Paraná\". */\r\nexport const OPCOES_ESTADOS: readonly Opcao[] = ESTADOS.map((e) => ({ valor: e.uf, rotulo: `${e.uf} — ${e.descricao}` }));\r\n\r\n/** Tipo de pessoa no formato rótulo/valor. `F`/`J` é a convenção comum dos backends. */\r\nexport const TIPOS_PESSOA: readonly Opcao<'F' | 'J'>[] = [\r\n { rotulo: 'Física', valor: 'F' },\r\n { rotulo: 'Jurídica', valor: 'J' },\r\n];\r\n","/**\r\n * Texto e número: listas e valores por extenso (documentos), leitura de\r\n * caminho, formatação, saudação, iniciais, normalização para busca.\r\n */\r\n\r\n/** `['A']` → `A` · `['A','B']` → `A e B` · `['A','B','C']` → `A, B e C`. */\r\nexport function listaPorExtenso(itens: readonly string[]): string {\r\n const l = itens.map((i) => i.trim()).filter(Boolean);\r\n if (l.length <= 1) return l[0] ?? '';\r\n return `${l.slice(0, -1).join(', ')} e ${l[l.length - 1]}`;\r\n}\r\n\r\nconst UNIDADES = ['', 'um', 'dois', 'três', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove'];\r\nconst DEZ_A_DEZENOVE = ['dez', 'onze', 'doze', 'treze', 'quatorze', 'quinze', 'dezesseis', 'dezessete', 'dezoito', 'dezenove'];\r\nconst DEZENAS = ['', '', 'vinte', 'trinta', 'quarenta', 'cinquenta', 'sessenta', 'setenta', 'oitenta', 'noventa'];\r\nconst CENTENAS = ['', 'cento', 'duzentos', 'trezentos', 'quatrocentos', 'quinhentos', 'seiscentos', 'setecentos', 'oitocentos', 'novecentos'];\r\nconst ESCALAS: [string, string][] = [\r\n ['', ''],\r\n ['mil', 'mil'],\r\n ['milhão', 'milhões'],\r\n ['bilhão', 'bilhões'],\r\n ['trilhão', 'trilhões'],\r\n];\r\n\r\n/** 1 a 999 por extenso. */\r\nfunction grupoPorExtenso(n: number): string {\r\n if (n === 100) return 'cem';\r\n const c = Math.floor(n / 100);\r\n const resto = n % 100;\r\n const partes: string[] = [];\r\n if (c) partes.push(CENTENAS[c]);\r\n if (resto >= 10 && resto < 20) partes.push(DEZ_A_DEZENOVE[resto - 10]);\r\n else {\r\n const d = Math.floor(resto / 10);\r\n const u = resto % 10;\r\n if (d) partes.push(DEZENAS[d]);\r\n if (u) partes.push(UNIDADES[u]);\r\n }\r\n return partes.join(' e ');\r\n}\r\n\r\n/** Inteiro por extenso (trunca decimais): `1500` → `mil e quinhentos`. */\r\nexport function numeroPorExtenso(num: number): string {\r\n let n = Math.trunc(num);\r\n if (n === 0) return 'zero';\r\n if (n < 0) return `menos ${numeroPorExtenso(-n)}`;\r\n\r\n const grupos: number[] = [];\r\n while (n > 0) {\r\n grupos.push(n % 1000);\r\n n = Math.floor(n / 1000);\r\n }\r\n // o \"e\" entra antes do último grupo quando ele é < 100 ou centena redonda\r\n const ultimo = grupos.findIndex((g) => g > 0);\r\n const partes: string[] = [];\r\n for (let i = grupos.length - 1; i >= 0; i--) {\r\n const g = grupos[i];\r\n if (!g) continue;\r\n let texto = grupoPorExtenso(g);\r\n // \"mil\", não \"um mil\"; \"um milhão\" / \"dois milhões\"\r\n if (i === 1) texto = g === 1 ? 'mil' : `${texto} mil`;\r\n else if (i > 1) texto = `${texto} ${g === 1 ? ESCALAS[i][0] : ESCALAS[i][1]}`;\r\n const comE = partes.length > 0 && i === ultimo && (g < 100 || g % 100 === 0);\r\n partes.push(comE ? `e ${texto}` : texto);\r\n }\r\n return partes.join(' ');\r\n}\r\n\r\n/** Valor em reais por extenso: `1500.5` → `mil e quinhentos reais e cinquenta centavos`. */\r\nexport function valorMonetarioPorExtenso(valor: number): string {\r\n const total = Math.round(Math.abs(valor) * 100);\r\n const inteiro = Math.floor(total / 100);\r\n const centavos = total % 100;\r\n if (!inteiro && !centavos) return 'zero reais';\r\n\r\n const partes: string[] = [];\r\n if (inteiro) {\r\n // \"dois milhões de reais\", mas \"quinhentos mil reais\"\r\n const de = inteiro >= 1_000_000 && inteiro % 1_000_000 === 0 ? ' de' : '';\r\n partes.push(`${numeroPorExtenso(inteiro)}${de} ${inteiro === 1 ? 'real' : 'reais'}`);\r\n }\r\n if (centavos) partes.push(`${numeroPorExtenso(centavos)} ${centavos === 1 ? 'centavo' : 'centavos'}`);\r\n const texto = partes.join(' e ');\r\n return valor < 0 ? `menos ${texto}` : texto;\r\n}\r\n\r\n/** Lê um caminho com ponto (`a.b.c`); `undefined` se algum trecho faltar. */\r\nexport function lerCampo(obj: unknown, caminho: string): unknown {\r\n if (!caminho) return obj;\r\n return caminho\r\n .split('.')\r\n .reduce<unknown>((o, k) => (o !== null && typeof o === 'object' ? (o as Record<string, unknown>)[k] : undefined), obj);\r\n}\r\n\r\nconst NUMERO = new Intl.NumberFormat('pt-BR');\r\nconst COMPACTO = new Intl.NumberFormat('pt-BR', { notation: 'compact', maximumFractionDigits: 1 });\r\n\r\n/** `1243` → `1.243` · compacto: `12400` → `12,4 mil` (deixe o valor cheio no `title`). */\r\nexport function formatarNumero(valor: number, opcoes?: { compacto?: boolean }): string {\r\n return (opcoes?.compacto ? COMPACTO : NUMERO).format(valor);\r\n}\r\n\r\n/** 5–11h Bom dia · 12–17h Boa tarde · demais Boa noite. */\r\nexport function saudacaoPorHora(agora: Date = new Date()): string {\r\n const h = agora.getHours();\r\n if (h >= 5 && h < 12) return 'Bom dia';\r\n if (h >= 12 && h < 18) return 'Boa tarde';\r\n return 'Boa noite';\r\n}\r\n\r\n/** Primeira letra das duas primeiras palavras: `Gabrielly Ribeiro da Silva` → `GR`. */\r\nexport function iniciais(nome: string): string {\r\n return (nome ?? '')\r\n .trim()\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .slice(0, 2)\r\n .map((p) => p[0])\r\n .join('')\r\n .toUpperCase();\r\n}\r\n\r\n/** Sem acento e em minúsculas — a comparação de toda busca/filtro. */\r\nexport function normalizar(s: string): string {\r\n return (s ?? '')\r\n .normalize('NFD')\r\n .replace(/[̀-ͯ]/g, '')\r\n .toLowerCase();\r\n}\r\n\r\n/** Formata CPF (até 11 dígitos) ou CNPJ (12 a 14) enquanto digita. */\r\nexport function formatCpfCnpj(v: string): string {\r\n const d = (v ?? '').replace(/\\D/g, '').slice(0, 14);\r\n if (d.length <= 11) {\r\n return d\r\n .replace(/^(\\d{3})(\\d)/, '$1.$2')\r\n .replace(/^(\\d{3})\\.(\\d{3})(\\d)/, '$1.$2.$3')\r\n .replace(/\\.(\\d{3})(\\d{1,2})$/, '.$1-$2');\r\n }\r\n return d\r\n .replace(/^(\\d{2})(\\d)/, '$1.$2')\r\n .replace(/^(\\d{2})\\.(\\d{3})(\\d)/, '$1.$2.$3')\r\n .replace(/\\.(\\d{3})(\\d)/, '.$1/$2')\r\n .replace(/\\/(\\d{4})(\\d{1,2})$/, '/$1-$2');\r\n}\r\n\r\n/** Nome em caixa de título (pt-BR): `GABRIELLY RIBEIRO` → `Gabrielly Ribeiro`. */\r\nexport function nomeProprio(valor: string): string {\r\n return (valor ?? '')\r\n .trim()\r\n .toLocaleLowerCase('pt-BR')\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .map((p) => p[0].toLocaleUpperCase('pt-BR') + p.slice(1))\r\n .join(' ');\r\n}\r\n\r\n/** Primeiro + último nome: `GABRIELLY RIBEIRO DA SILVA` → `Gabrielly Silva`. */\r\nexport function nomeCurto(valor: string): string {\r\n const p = nomeProprio(valor).split(' ');\r\n return p.length > 1 ? `${p[0]} ${p[p.length - 1]}` : p[0] ?? '';\r\n}\r\n","/**\r\n * Ponte entre texto pt-BR (`dd/mm/aaaa`, `HH:mm`) e `Date`.\r\n * A validação é por ida e volta: `31/04/2026` vira `null`, não 1º de maio.\r\n */\r\n\r\nconst p2 = (n: number) => String(n).padStart(2, '0');\r\n\r\n/** `dd/mm/aaaa` → `Date`, ou `null` se malformado ou inexistente no calendário. */\r\nexport function parseDataBr(s: string): Date | null {\r\n const m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/.exec((s ?? '').trim());\r\n if (!m) return null;\r\n const [d, mes, a] = [Number(m[1]), Number(m[2]), Number(m[3])];\r\n const dt = new Date(a, mes - 1, d);\r\n return dt.getFullYear() === a && dt.getMonth() === mes - 1 && dt.getDate() === d ? dt : null;\r\n}\r\n\r\nexport function formatDataBr(d: Date): string {\r\n return `${p2(d.getDate())}/${p2(d.getMonth() + 1)}/${d.getFullYear()}`;\r\n}\r\n\r\n/** `HH:mm` → `Date` de HOJE com esse horário. */\r\nexport function parseHoraBr(s: string): Date | null {\r\n const m = /^(\\d{2}):(\\d{2})$/.exec((s ?? '').trim());\r\n if (!m || Number(m[1]) > 23 || Number(m[2]) > 59) return null;\r\n const d = new Date();\r\n d.setHours(Number(m[1]), Number(m[2]), 0, 0);\r\n return d;\r\n}\r\n\r\nexport function formatHoraBr(d: Date): string {\r\n return `${p2(d.getHours())}:${p2(d.getMinutes())}`;\r\n}\r\n\r\n/** `dd/mm/aaaa[ HH:mm]` → `Date` (sem hora = 00:00). */\r\nexport function parseDataHoraBr(s: string): Date | null {\r\n const [data, hora] = (s ?? '').trim().split(/\\s+/);\r\n const d = parseDataBr(data ?? '');\r\n if (!d) return null;\r\n if (hora) {\r\n const h = parseHoraBr(hora);\r\n if (!h) return null;\r\n d.setHours(h.getHours(), h.getMinutes(), 0, 0);\r\n }\r\n return d;\r\n}\r\n\r\nexport function formatDataHoraBr(d: Date): string {\r\n return `${formatDataBr(d)} ${formatHoraBr(d)}`;\r\n}\r\n\r\n/** ISO `aaaa-mm-dd` (valor do `CampoData`) → `dd/mm/aaaa`. Vazio se não for ISO. */\r\nexport function isoParaDataBr(iso: string): string {\r\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(iso ?? '');\r\n return m ? `${m[3]}/${m[2]}/${m[1]}` : '';\r\n}\r\n\r\n/** `dd/mm/aaaa` → ISO `aaaa-mm-dd` (para o `CampoData`). Vazio se a data não existir. */\r\nexport function dataBrParaIso(s: string): string {\r\n const d = parseDataBr(s);\r\n return d ? `${d.getFullYear()}-${p2(d.getMonth() + 1)}-${p2(d.getDate())}` : '';\r\n}\r\n","/**\r\n * Vocabulário de entidade e títulos de tela: verbo no infinitivo + substantivo\r\n * (`Cadastrar veículo`), sem artigo — nunca precisa saber o gênero.\r\n * Quando a regra não serve (verbo do domínio, substantivo deverbal), a\r\n * entidade declara a frase INTEIRA do modo.\r\n */\r\n\r\nexport type Modo = 'novo' | 'editar' | 'leitura';\r\n\r\nexport interface Entidade {\r\n /** Substantivo em minúsculas, como entra na frase (`veículo`). */\r\n readonly nome: string;\r\n /** Frases completas para os modos que fogem da regra (ex.: `Firmar contrato`). */\r\n readonly novo?: string;\r\n readonly editar?: string;\r\n readonly leitura?: string;\r\n}\r\n\r\nconst VERBOS: Record<Modo, string> = { novo: 'Cadastrar', editar: 'Editar', leitura: 'Visualizar' };\r\n\r\n/** Título da tela: a frase declarada do modo ou `Verbo nome`. */\r\nexport function tituloDeEntidade(entidade: string | Entidade, modo: Modo): string {\r\n const e: Entidade = typeof entidade === 'string' ? { nome: entidade } : entidade;\r\n const declarada = e[modo]?.trim();\r\n return declarada || `${VERBOS[modo]} ${e.nome}`.trim();\r\n}\r\n\r\n/** Troca `\\ / : * ? \" < > |` por `-` e junta espaços — nome seguro para \"Salvar como PDF\". */\r\nexport function nomeDeArquivo(texto: string): string {\r\n return (texto ?? '')\r\n .replace(/[\\\\/:*?\"<>|]/g, '-')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n}\r\n","/** Metadados de anexo — serializável, sem o `File` (que vive só na sessão). */\r\nexport interface Anexo {\r\n nome: string;\r\n /** Tamanho em bytes. */\r\n tamanho: number;\r\n /** MIME (pode chegar vazio do navegador). */\r\n tipo: string;\r\n /** Endereço do arquivo já armazenado (abrir/baixar). */\r\n url?: string;\r\n /** Miniatura da MESMA imagem, quando o backend serve dois tamanhos. */\r\n miniatura?: string;\r\n}\r\n\r\n/** Como o anexo pode ser EXIBIDO pelo navegador. */\r\nexport type TipoArquivo = 'imagem' | 'pdf' | 'video' | 'audio' | 'outro';\r\n\r\nconst UNIDADES_BYTES = ['B', 'KB', 'MB', 'GB', 'TB'];\r\n\r\n/** `1536` → `1.5 KB` · uma casa decimal abaixo de 10. */\r\nexport function formatBytes(bytes: number): string {\r\n if (!bytes || bytes < 0) return '0 B';\r\n let v = bytes;\r\n let i = 0;\r\n while (v >= 1024 && i < UNIDADES_BYTES.length - 1) {\r\n v /= 1024;\r\n i++;\r\n }\r\n if (i === 0) return `${v} B`;\r\n return `${v < 10 ? v.toFixed(1) : Math.round(v)} ${UNIDADES_BYTES[i]}`;\r\n}\r\n\r\nconst extensao = (nome: string) => /\\.([a-z0-9]+)$/i.exec(nome ?? '')?.[1]?.toLowerCase() ?? '';\r\n\r\n/** Classifica pelo MIME e, na falta, pela extensão do nome. */\r\nexport function tipoDeArquivo(tipo: string, nome = ''): TipoArquivo {\r\n const t = (tipo ?? '').toLowerCase();\r\n const ext = extensao(nome);\r\n if (t.startsWith('image/') || /^(png|jpe?g|gif|webp|svg|bmp|avif)$/.test(ext)) return 'imagem';\r\n if (t === 'application/pdf' || ext === 'pdf') return 'pdf';\r\n if (t.startsWith('video/') || /^(mp4|webm|ogv|mov|mkv|avi)$/.test(ext)) return 'video';\r\n if (t.startsWith('audio/') || /^(mp3|wav|ogg|m4a|aac|flac)$/.test(ext)) return 'audio';\r\n return 'outro';\r\n}\r\n\r\n/** Nome do ícone (Lucide) do anexo, pela família do documento. */\r\nexport function iconeArquivo(tipo: string, nome = ''): string {\r\n const exibicao = tipoDeArquivo(tipo, nome);\r\n if (exibicao === 'imagem') return 'image';\r\n if (exibicao === 'pdf') return 'file-text';\r\n if (exibicao === 'video') return 'video';\r\n if (exibicao === 'audio') return 'volume-2';\r\n const t = (tipo ?? '').toLowerCase();\r\n const ext = extensao(nome);\r\n if (t.includes('word') || /^docx?$/.test(ext)) return 'file-type';\r\n if (t.includes('excel') || t.includes('spreadsheet') || /^(xlsx?|csv)$/.test(ext)) return 'file-spreadsheet';\r\n if (t.includes('zip') || t.includes('compressed') || /^(zip|rar|7z)$/.test(ext)) return 'package';\r\n return 'file';\r\n}\r\n","/** Utilitários de JWT (só leitura do payload — NÃO confere assinatura). */\r\n\r\n/** Decodifica o payload (Base64Url, aceita acentos); `null` se malformado. */\r\nexport function decodificarJwt<T = Record<string, unknown>>(token: string): T | null {\r\n const partes = (token ?? '').split('.');\r\n if (partes.length !== 3) return null;\r\n try {\r\n const b64 = partes[1].replace(/-/g, '+').replace(/_/g, '/');\r\n const bin = atob(b64.padEnd(b64.length + ((4 - (b64.length % 4)) % 4), '='));\r\n const bytes = Uint8Array.from(bin, (c) => c.charCodeAt(0));\r\n return JSON.parse(new TextDecoder().decode(bytes)) as T;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Data de expiração (`exp`), ou `null`. */\r\nexport function expiracaoJwt(token: string): Date | null {\r\n const exp = decodificarJwt<{ exp?: number }>(token)?.exp;\r\n return typeof exp === 'number' ? new Date(exp * 1000) : null;\r\n}\r\n\r\n/** `true` se inválido ou se expira em menos de `margemSegundos` (renovação proativa). */\r\nexport function jwtExpirado(token: string, margemSegundos = 0): boolean {\r\n const exp = expiracaoJwt(token);\r\n if (!exp) return true;\r\n return exp.getTime() - Date.now() < margemSegundos * 1000;\r\n}\r\n\r\n/** Limita a margem de renovação à metade da vida do token. */\r\nexport function margemRefreshJwt(token: string, margemSegundos: number): number {\r\n const p = decodificarJwt<{ exp?: number; iat?: number }>(token);\r\n if (!p || typeof p.exp !== 'number' || typeof p.iat !== 'number' || p.exp <= p.iat) return margemSegundos;\r\n return Math.min(margemSegundos, (p.exp - p.iat) / 2);\r\n}\r\n\r\n/** Convenção de ambiente: `'#'` marca uma API não configurada. */\r\nexport function apiDefinida(url: string | null | undefined): url is string {\r\n return !!url && url !== '#';\r\n}\r\n","/** Fonte única de severidades; cada componente usa um recorte dela. */\r\nexport const SEVERIDADES = ['pri', 'ok', 'warn', 'err', 'info', 'neutral'] as const;\r\n\r\nexport type SeveridadeCompleta = (typeof SEVERIDADES)[number];\r\n\r\nconst CORES: Record<SeveridadeCompleta, string> = {\r\n pri: 'var(--pri)',\r\n ok: 'var(--ok-solid)',\r\n warn: 'var(--warn-solid)',\r\n err: 'var(--err-solid)',\r\n info: 'var(--info-solid)',\r\n neutral: 'var(--t3)',\r\n};\r\n\r\n/** Cor SÓLIDA da severidade (`var(--token)`) — para filete, tile ou marcador fora de um selo. */\r\nexport function severidadeCor(sev: SeveridadeCompleta): string {\r\n return CORES[sev];\r\n}\r\n\r\n/** O texto é um dos nomes de severidade? */\r\nexport function ehSeveridade(valor: string): valor is SeveridadeCompleta {\r\n return (SEVERIDADES as readonly string[]).includes(valor);\r\n}\r\n","/** Política de senha: o app declara só o que muda sobre `POLITICA_PADRAO`. */\r\nexport interface PoliticaSenha {\r\n minimo: number;\r\n exigirMinuscula?: boolean;\r\n exigirMaiuscula?: boolean;\r\n exigirDigito?: boolean;\r\n exigirSimbolo?: boolean;\r\n}\r\n\r\nexport type NivelForcaSenha = 'vazia' | 'fraca' | 'media' | 'forte';\r\n\r\nexport interface ForcaSenha {\r\n /** 0 (vazia) a 4. Abaixo do mínimo fica preso em 1. */\r\n score: number;\r\n nivel: NivelForcaSenha;\r\n}\r\n\r\n/** Padrão da biblioteca: só o tamanho. */\r\nexport const POLITICA_PADRAO: PoliticaSenha = { minimo: 8 };\r\n\r\nconst CLASSES = {\r\n minuscula: /[a-z]/,\r\n maiuscula: /[A-Z]/,\r\n digito: /\\d/,\r\n simbolo: /[^a-zA-Z0-9]/,\r\n};\r\n\r\n/** Primeira regra violada (tamanho → minúscula → maiúscula → dígito → símbolo), ou `''`. */\r\nexport function validarSenha(senha: string, politica: PoliticaSenha = POLITICA_PADRAO): string {\r\n if (!senha) return '';\r\n if (senha.length < politica.minimo) return `Use pelo menos ${politica.minimo} caracteres`;\r\n if (politica.exigirMinuscula && !CLASSES.minuscula.test(senha)) return 'Inclua uma letra minúscula';\r\n if (politica.exigirMaiuscula && !CLASSES.maiuscula.test(senha)) return 'Inclua uma letra maiúscula';\r\n if (politica.exigirDigito && !CLASSES.digito.test(senha)) return 'Inclua um número';\r\n if (politica.exigirSimbolo && !CLASSES.simbolo.test(senha)) return 'Inclua um símbolo';\r\n return '';\r\n}\r\n\r\n/** Heurística barata: +1 por classe de caractere, +1 com `minimo + 4` de tamanho. */\r\nexport function forcaSenha(senha: string, politica: PoliticaSenha = POLITICA_PADRAO): ForcaSenha {\r\n if (!senha) return { score: 0, nivel: 'vazia' };\r\n if (senha.length < politica.minimo) return { score: 1, nivel: 'fraca' };\r\n let score = Object.values(CLASSES).filter((re) => re.test(senha)).length;\r\n if (senha.length >= politica.minimo + 4) score++;\r\n score = Math.max(1, Math.min(4, score));\r\n return { score, nivel: score >= 3 ? 'forte' : score === 2 ? 'media' : 'fraca' };\r\n}\r\n\r\nexport function senhasIguais(a: string, b: string): boolean {\r\n return a === b;\r\n}\r\n","import { normalizar } from './texto';\r\n\r\n/** Valor do picklist: o par disponíveis (`fonte`) × escolhidos (`alvo`). */\r\nexport interface PicklistValor<T> {\r\n fonte: T[];\r\n alvo: T[];\r\n}\r\n\r\nexport const PICKLIST_VAZIO: PicklistValor<never> = { fonte: [], alvo: [] };\r\n\r\nexport function normalizarPicklistValor<T>(v: PicklistValor<T> | null | undefined): PicklistValor<T> {\r\n return { fonte: [...(v?.fonte ?? [])], alvo: [...(v?.alvo ?? [])] };\r\n}\r\n\r\n/** Move `itens` para o fim do destino, na ordem de ORIGEM. */\r\nfunction mover<T>(de: readonly T[], para: readonly T[], itens: readonly T[]) {\r\n const s = new Set(itens);\r\n return { de: de.filter((i) => !s.has(i)), para: [...para, ...de.filter((i) => s.has(i))] };\r\n}\r\n\r\nexport function moverParaAlvo<T>(v: PicklistValor<T>, itens: readonly T[]): PicklistValor<T> {\r\n const r = mover(v.fonte, v.alvo, itens);\r\n return { fonte: r.de, alvo: r.para };\r\n}\r\n\r\nexport function moverParaFonte<T>(v: PicklistValor<T>, itens: readonly T[]): PicklistValor<T> {\r\n const r = mover(v.alvo, v.fonte, itens);\r\n return { fonte: r.para, alvo: r.de };\r\n}\r\n\r\nexport function moverTudoParaAlvo<T>(v: PicklistValor<T>, apenas?: readonly T[]): PicklistValor<T> {\r\n return moverParaAlvo(v, apenas ?? v.fonte);\r\n}\r\n\r\nexport function moverTudoParaFonte<T>(v: PicklistValor<T>, apenas?: readonly T[]): PicklistValor<T> {\r\n return moverParaFonte(v, apenas ?? v.alvo);\r\n}\r\n\r\n/** Move o item de `de` para `para` (índices limitados; nunca lança). */\r\nexport function reordenarLista<T>(lista: readonly T[], de: number, para: number): T[] {\r\n const l = [...lista];\r\n if (!l.length) return l;\r\n const a = Math.max(0, Math.min(de, l.length - 1));\r\n const b = Math.max(0, Math.min(para, l.length - 1));\r\n const [item] = l.splice(a, 1);\r\n l.splice(b, 0, item);\r\n return l;\r\n}\r\n\r\n/** Filtro sem acento/caixa; termo vazio devolve tudo (cópia). */\r\nexport function filtrarItens<T>(itens: readonly T[], termo: string, texto: (item: T) => string): T[] {\r\n const t = normalizar(termo.trim());\r\n return t ? itens.filter((i) => normalizar(texto(i)).includes(t)) : [...itens];\r\n}\r\n","import { useSyncExternalStore, type ReactNode } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nconst semAssinatura = () => () => {};\r\n\r\n/**\r\n * `true` só no navegador depois da hidratação. No servidor (SSR/Next.js) e no\r\n * render de hidratação fica `false`, sem render extra num app só cliente.\r\n */\r\nexport function useNoNavegador(): boolean {\r\n return useSyncExternalStore(\r\n semAssinatura,\r\n () => true,\r\n () => false,\r\n );\r\n}\r\n\r\nfunction Portal({ children }: { children: ReactNode }) {\r\n return useNoNavegador() ? createPortal(children, document.body) : null;\r\n}\r\n\r\n/** `createPortal(no, document.body)` que não quebra no SSR (lá não existe `document`). */\r\nexport function portal(no: ReactNode) {\r\n return <Portal>{no}</Portal>;\r\n}\r\n","import { isValidElement, useEffect, useRef, useState, type ReactNode } from 'react';\r\nimport { portal } from '../../utils/portal';\r\nimport { cx } from '../../utils/cx';\r\nimport './Dica.css';\r\n\r\nexport type PosicaoDica = 'cima' | 'direita' | 'baixo' | 'esquerda';\r\nexport type CorDica = 'padrao' | 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'claro';\r\n\r\nexport interface DicaProps {\r\n /** Texto do balão (aceita conteúdo formatado). Vazio = sem dica (o filho é renderizado puro). */\r\n texto?: ReactNode;\r\n children: ReactNode;\r\n /** Atraso para abrir no hover, em ms. */\r\n atraso?: number;\r\n /** Lado preferido; vira para o oposto se não couber. Padrão: `cima`. */\r\n posicao?: PosicaoDica;\r\n cor?: CorDica;\r\n}\r\n\r\ninterface Pos {\r\n top: number;\r\n left: number;\r\n lado: PosicaoDica;\r\n}\r\n\r\n/** Espaço mínimo (px) para a dica caber de um lado antes de virar para o outro. */\r\nconst FOLGA_V = 48;\r\nconst FOLGA_H = 160;\r\nconst DISTANCIA = 6;\r\n\r\nfunction posicionar(r: DOMRect, preferido: PosicaoDica): Pos {\r\n let lado = preferido;\r\n if (lado === 'cima' && r.top < FOLGA_V) lado = 'baixo';\r\n else if (lado === 'baixo' && window.innerHeight - r.bottom < FOLGA_V) lado = 'cima';\r\n else if (lado === 'direita' && window.innerWidth - r.right < FOLGA_H) lado = 'esquerda';\r\n else if (lado === 'esquerda' && r.left < FOLGA_H) lado = 'direita';\r\n const cx_ = r.left + r.width / 2;\r\n const cy = r.top + r.height / 2;\r\n if (lado === 'cima') return { top: r.top - DISTANCIA, left: cx_, lado };\r\n if (lado === 'baixo') return { top: r.bottom + DISTANCIA, left: cx_, lado };\r\n if (lado === 'direita') return { top: cy, left: r.right + DISTANCIA, lado };\r\n return { top: cy, left: r.left - DISTANCIA, lado };\r\n}\r\n\r\n/** Balão de dica (tooltip) no hover/foco do elemento envolvido. */\r\nexport function Dica({ texto, children, atraso = 350, posicao = 'cima', cor = 'padrao' }: DicaProps) {\r\n const alvo = useRef<HTMLSpanElement>(null);\r\n const timer = useRef<number | undefined>(undefined);\r\n const [pos, setPos] = useState<Pos | null>(null);\r\n\r\n const abrir = (imediato: boolean) => {\r\n window.clearTimeout(timer.current);\r\n timer.current = window.setTimeout(\r\n () => {\r\n const el = alvo.current;\r\n if (!el) return;\r\n // mede o próprio filho (o span-alvo pode ser maior que ele)\r\n const medido = (el.firstElementChild as HTMLElement | null) ?? el;\r\n setPos(posicionar(medido.getBoundingClientRect(), posicao));\r\n },\r\n imediato ? 0 : atraso,\r\n );\r\n };\r\n const fechar = () => {\r\n window.clearTimeout(timer.current);\r\n setPos(null);\r\n };\r\n\r\n useEffect(() => {\r\n if (!pos) return;\r\n const esc = (e: KeyboardEvent) => e.key === 'Escape' && fechar();\r\n window.addEventListener('keydown', esc);\r\n window.addEventListener('scroll', fechar, true);\r\n return () => {\r\n window.removeEventListener('keydown', esc);\r\n window.removeEventListener('scroll', fechar, true);\r\n };\r\n }, [pos]);\r\n\r\n useEffect(() => () => window.clearTimeout(timer.current), []);\r\n\r\n if (!texto) return <>{children}</>;\r\n\r\n // elemento desabilitado não recebe foco nem eventos: o próprio alvo assume\r\n const filhoDesabilitado = isValidElement<{ disabled?: boolean }>(children) && !!children.props.disabled;\r\n\r\n return (\r\n <span\r\n ref={alvo}\r\n className=\"lp-dica-alvo\"\r\n tabIndex={filhoDesabilitado ? 0 : undefined}\r\n onMouseEnter={() => abrir(false)}\r\n onMouseLeave={fechar}\r\n onFocus={() => abrir(true)}\r\n onBlur={fechar}\r\n onPointerDown={fechar}\r\n >\r\n {children}\r\n {pos &&\r\n portal(\r\n <div\r\n className={cx('lp-dica', `lp-dica--${pos.lado}`, cor !== 'padrao' && `lp-dica--${cor}`)}\r\n style={{ top: pos.top, left: pos.left }}\r\n aria-hidden=\"true\"\r\n >\r\n {texto}\r\n </div>,\r\n )}\r\n </span>\r\n );\r\n}\r\n","import { createContext, forwardRef, useContext, type ButtonHTMLAttributes, type MouseEvent, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { Dica } from '../Dica/Dica';\r\nimport './Botao.css';\r\n\r\nexport type SeveridadeBotao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\r\n/**\r\n * `solido` · `contorno` · `texto` · `suave` = fundo claro da cor · `gradiente`\r\n * · `fantasma` = contorno discreto que se preenche no hover.\r\n */\r\nexport type AparenciaBotao = 'solido' | 'contorno' | 'texto' | 'suave' | 'gradiente' | 'fantasma';\r\n\r\n/** Padrões que um grupo (`GrupoBotoes`) repassa aos botões de dentro. */\r\nexport interface PadroesBotao {\r\n severidade?: SeveridadeBotao;\r\n aparencia?: AparenciaBotao;\r\n formato?: 'pilula' | 'retangulo';\r\n tamanho?: 'pequeno' | 'medio' | 'grande';\r\n}\r\nexport const PadroesBotaoCtx = createContext<PadroesBotao>({});\r\n\r\nexport interface BotaoProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\r\n rotulo?: string;\r\n icone?: IconeProp;\r\n posicaoIcone?: 'esquerda' | 'direita';\r\n severidade?: SeveridadeBotao;\r\n aparencia?: AparenciaBotao;\r\n /** Mostra spinner e recusa o clique (o botão segue focável). */\r\n carregando?: boolean;\r\n /** Ocupa 100% da largura. */\r\n bloco?: boolean;\r\n /** `pilula` (padrão) · `retangulo` = cantos levemente arredondados. */\r\n formato?: 'pilula' | 'retangulo';\r\n tamanho?: 'pequeno' | 'medio' | 'grande';\r\n /** Sombra fixa, ou `elevado` (sombra da cor que sobe no hover). */\r\n sombra?: 'pequena' | 'media' | 'grande' | 'elevado';\r\n /** Ícone num segmento mais escuro, colado à borda (\"botão com rótulo\"). */\r\n iconeDestacado?: boolean;\r\n /** Botão de alternância: liga/desliga (vira `aria-pressed`). */\r\n pressionado?: boolean;\r\n /** Balão de dica — use em botões só com ícone. */\r\n dica?: string;\r\n children?: ReactNode;\r\n}\r\n\r\nexport const Botao = forwardRef<HTMLButtonElement, BotaoProps>(function Botao(\r\n {\r\n rotulo,\r\n icone,\r\n posicaoIcone = 'esquerda',\r\n severidade: severidadeProp,\r\n aparencia: aparenciaProp,\r\n carregando = false,\r\n bloco = false,\r\n formato: formatoProp,\r\n tamanho: tamanhoProp,\r\n sombra,\r\n iconeDestacado = false,\r\n pressionado,\r\n dica,\r\n children,\r\n className,\r\n type = 'button',\r\n onClick,\r\n ...resto\r\n },\r\n ref,\r\n) {\r\n const padroes = useContext(PadroesBotaoCtx);\r\n const severidade = severidadeProp ?? padroes.severidade ?? 'pri';\r\n const aparencia = aparenciaProp ?? padroes.aparencia ?? 'solido';\r\n const formato = formatoProp ?? padroes.formato ?? 'pilula';\r\n const tamanho = tamanhoProp ?? padroes.tamanho ?? 'medio';\r\n const texto = children ?? rotulo;\r\n const soIcone = !texto && !!icone;\r\n\r\n const aoClicar = (e: MouseEvent<HTMLButtonElement>) => {\r\n if (carregando) {\r\n e.preventDefault();\r\n return;\r\n }\r\n onClick?.(e);\r\n };\r\n\r\n const botao = (\r\n <button\r\n ref={ref}\r\n type={type}\r\n className={cx(\r\n 'lp-btn',\r\n `lp-btn--${aparencia}`,\r\n severidade !== 'pri' && `lp-btn--${severidade}`,\r\n soIcone && 'lp-btn--icone',\r\n posicaoIcone === 'direita' && 'lp-btn--icone-dir',\r\n bloco && 'lp-btn--bloco',\r\n formato === 'retangulo' && 'lp-btn--retangulo',\r\n tamanho !== 'medio' && `lp-btn--${tamanho}`,\r\n sombra && `lp-btn--sombra-${sombra}`,\r\n iconeDestacado && !soIcone && 'lp-btn--icone-destacado',\r\n pressionado && 'is-pressionado',\r\n className,\r\n )}\r\n aria-pressed={pressionado}\r\n aria-disabled={carregando || undefined}\r\n aria-busy={carregando || undefined}\r\n onClick={aoClicar}\r\n {...resto}\r\n >\r\n {iconeDestacado && !soIcone && (icone || carregando) ? (\r\n <span className=\"lp-btn-segmento\">{carregando ? <Icone icone=\"loader-circle\" girar /> : <Icone icone={icone} />}</span>\r\n ) : carregando ? (\r\n <Icone icone=\"loader-circle\" girar />\r\n ) : (\r\n <Icone icone={icone} />\r\n )}\r\n {texto && <span className=\"lp-btn-rotulo\">{texto}</span>}\r\n </button>\r\n );\r\n\r\n return dica ? <Dica texto={dica}>{botao}</Dica> : botao;\r\n});\r\n","import { useEffect, useRef, type KeyboardEvent, type ReactNode } from 'react';\r\nimport { portal } from '../../utils/portal';\r\n\r\nconst FOCAVEIS =\r\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\r\n\r\nlet abertos = 0;\r\n// pilha das sobreposições abertas: o Esc é da que está no topo\r\nconst pilha: symbol[] = [];\r\n\r\nexport interface SobreposicaoProps {\r\n aoDispensar?: () => void;\r\n /** Esc e clique na máscara fecham. */\r\n dispensavel?: boolean;\r\n rotuloId?: string;\r\n descricaoId?: string;\r\n /** Elemento que recebe o foco ao abrir (seletor CSS dentro do painel). */\r\n focoInicial?: string;\r\n className?: string;\r\n /** Classe extra na máscara (ex.: alinhamento do painel lateral). */\r\n classeMascara?: string;\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * Máscara + painel modal: portal no <body>, trava o scroll, prende o foco\r\n * (Tab circula dentro) e devolve o foco a quem abriu ao fechar.\r\n */\r\nexport function Sobreposicao({\r\n aoDispensar,\r\n dispensavel = true,\r\n rotuloId,\r\n descricaoId,\r\n focoInicial,\r\n className,\r\n classeMascara,\r\n children,\r\n}: SobreposicaoProps) {\r\n const painel = useRef<HTMLDivElement>(null);\r\n const dispensar = useRef({ aoDispensar, dispensavel });\r\n dispensar.current = { aoDispensar, dispensavel };\r\n\r\n // Esc no documento: vale mesmo quando o foco caiu no <body> (ex.: o\r\n // elemento focado saiu da tela ao trocar o conteúdo do diálogo)\r\n useEffect(() => {\r\n const eu = Symbol('sobreposicao');\r\n pilha.push(eu);\r\n const h = (e: globalThis.KeyboardEvent) => {\r\n if (e.key !== 'Escape' || pilha[pilha.length - 1] !== eu || e.defaultPrevented) return;\r\n if (painel.current?.contains(document.activeElement)) return; // o onKeyDown do painel cuida\r\n if (dispensar.current.dispensavel) dispensar.current.aoDispensar?.();\r\n };\r\n document.addEventListener('keydown', h);\r\n return () => {\r\n document.removeEventListener('keydown', h);\r\n pilha.splice(pilha.indexOf(eu), 1);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n const anterior = document.activeElement as HTMLElement | null;\r\n abertos++;\r\n document.body.style.overflow = 'hidden';\r\n const el = painel.current;\r\n const alvo =\r\n (focoInicial && el?.querySelector<HTMLElement>(focoInicial)) ||\r\n el?.querySelector<HTMLElement>('[data-foco-inicial]') ||\r\n el?.querySelector<HTMLElement>('.lp-dlg-corpo ' + FOCAVEIS.split(',').join(', .lp-dlg-corpo ')) ||\r\n el;\r\n alvo?.focus();\r\n return () => {\r\n abertos--;\r\n if (!abertos) document.body.style.overflow = '';\r\n anterior?.focus?.();\r\n };\r\n // abre uma vez por montagem\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const aoTeclar = (e: KeyboardEvent<HTMLDivElement>) => {\r\n if (e.key === 'Escape' && dispensavel) {\r\n e.stopPropagation();\r\n aoDispensar?.();\r\n return;\r\n }\r\n if (e.key !== 'Tab' || !painel.current) return;\r\n const lista = [...painel.current.querySelectorAll<HTMLElement>(FOCAVEIS)].filter((n) => n.offsetParent !== null);\r\n if (!lista.length) {\r\n e.preventDefault();\r\n return;\r\n }\r\n const primeiro = lista[0];\r\n const ultimo = lista[lista.length - 1];\r\n if (e.shiftKey && document.activeElement === primeiro) {\r\n e.preventDefault();\r\n ultimo.focus();\r\n } else if (!e.shiftKey && document.activeElement === ultimo) {\r\n e.preventDefault();\r\n primeiro.focus();\r\n }\r\n };\r\n\r\n return portal(\r\n <div\r\n className={classeMascara ? `lp-sobre ${classeMascara}` : 'lp-sobre'}\r\n onMouseDown={(e) => {\r\n if (e.target !== e.currentTarget) return;\r\n if (dispensavel) aoDispensar?.();\r\n else {\r\n // não fecha por fora: um tremidinho avisa que é preciso usar os botões\r\n const el = painel.current;\r\n el?.classList.remove('lp-sobre-recusa');\r\n void el?.offsetWidth;\r\n el?.classList.add('lp-sobre-recusa');\r\n }\r\n }}\r\n >\r\n <div\r\n ref={painel}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={rotuloId}\r\n aria-describedby={descricaoId}\r\n tabIndex={-1}\r\n className={className}\r\n onKeyDown={aoTeclar}\r\n >\r\n {children}\r\n </div>\r\n </div>,\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { createContext, useCallback, useContext, useId, useMemo, useRef, useState, type ReactNode } from 'react';\r\nimport { Botao, type SeveridadeBotao } from '../Botao/Botao';\r\nimport { Sobreposicao } from '../Dialogo/Sobreposicao';\r\nimport './Confirmacao.css';\r\n\r\nexport interface OpcoesConfirmacao {\r\n titulo: string;\r\n mensagem?: ReactNode;\r\n severidade?: Exclude<SeveridadeBotao, 'secundario'>;\r\n icone?: string;\r\n rotuloAceitar?: string;\r\n rotuloRecusar?: string;\r\n iconeAceitar?: string;\r\n /** Só o botão de OK (aviso). */\r\n somenteOk?: boolean;\r\n}\r\n\r\n/** Remoção: sempre vermelha e com lixeira (não dá para trocar). */\r\nexport type OpcoesRemocao = Omit<Partial<OpcoesConfirmacao>, 'severidade' | 'iconeAceitar' | 'somenteOk'>;\r\n\r\n/** Aviso: um botão só, para ciência. */\r\nexport type OpcoesAviso = Omit<OpcoesConfirmacao, 'somenteOk' | 'rotuloRecusar'>;\r\n\r\nexport interface Confirmar {\r\n (opcoes: OpcoesConfirmacao): Promise<boolean>;\r\n /** Atalho institucional de exclusão de dado salvo (irreversível). */\r\n remover: (opcoes?: OpcoesRemocao) => Promise<boolean>;\r\n /** Só ciência — \"alertar\" é `avisar({ severidade: 'err' })`. */\r\n avisar: (opcoes: OpcoesAviso) => Promise<void>;\r\n}\r\n\r\nconst Ctx = createContext<Confirmar | null>(null);\r\n\r\nconst ICONE_PADRAO: Record<string, string> = {\r\n pri: 'circle-question-mark',\r\n ok: 'circle-check',\r\n warn: 'triangle-alert',\r\n err: 'trash-2',\r\n};\r\n\r\n/** Fornece `useConfirmacao()` para a árvore. Já incluso no `ProvedorUi`. */\r\nexport function ProvedorConfirmacao({ children }: { children: ReactNode }) {\r\n const [atual, setAtual] = useState<OpcoesConfirmacao | null>(null);\r\n const resolver = useRef<((v: boolean) => void) | null>(null);\r\n const tituloId = useId();\r\n const msgId = useId();\r\n\r\n const confirmar = useCallback((opcoes: OpcoesConfirmacao) => {\r\n resolver.current?.(false);\r\n setAtual(opcoes);\r\n return new Promise<boolean>((res) => {\r\n resolver.current = res;\r\n });\r\n }, []);\r\n\r\n const api = useMemo<Confirmar>(\r\n () =>\r\n Object.assign((o: OpcoesConfirmacao) => confirmar(o), {\r\n remover: (o: OpcoesRemocao = {}) =>\r\n confirmar({\r\n titulo: 'Remover registro?',\r\n mensagem: 'Esta ação não pode ser desfeita.',\r\n rotuloAceitar: 'Remover',\r\n ...o,\r\n severidade: 'err',\r\n icone: 'trash-2',\r\n iconeAceitar: 'trash-2',\r\n }),\r\n avisar: (o: OpcoesAviso) =>\r\n confirmar({ rotuloAceitar: 'Entendi', icone: o.severidade && o.severidade !== 'pri' ? undefined : 'info', ...o, somenteOk: true }).then(\r\n () => undefined,\r\n ),\r\n }),\r\n [confirmar],\r\n );\r\n\r\n const responder = (v: boolean) => {\r\n resolver.current?.(v);\r\n resolver.current = null;\r\n setAtual(null);\r\n };\r\n\r\n const sev = atual?.severidade ?? 'pri';\r\n\r\n return (\r\n <Ctx.Provider value={api}>\r\n {children}\r\n {atual && (\r\n <Sobreposicao\r\n aoDispensar={() => responder(false)}\r\n rotuloId={tituloId}\r\n descricaoId={atual.mensagem ? msgId : undefined}\r\n focoInicial=\"[data-aceitar]\"\r\n className=\"lp-dlg lp-dlg--pequeno lp-conf\"\r\n >\r\n <div className=\"lp-conf-cab\">\r\n <span className=\"lp-conf-selo\" data-sev-conf={sev}>\r\n <Icone icone={atual.icone ?? ICONE_PADRAO[sev]} />\r\n </span>\r\n <span className=\"lp-conf-titulo\" id={tituloId}>\r\n {atual.titulo}\r\n </span>\r\n </div>\r\n {atual.mensagem && (\r\n <p className=\"lp-conf-msg\" id={msgId}>\r\n {atual.mensagem}\r\n </p>\r\n )}\r\n <div className=\"lp-conf-rodape\">\r\n {!atual.somenteOk && (\r\n <Botao rotulo={atual.rotuloRecusar ?? 'Cancelar'} aparencia=\"texto\" severidade=\"secundario\" onClick={() => responder(false)} />\r\n )}\r\n <Botao\r\n data-aceitar=\"\"\r\n rotulo={atual.rotuloAceitar ?? (atual.somenteOk ? 'OK' : 'Confirmar')}\r\n icone={atual.iconeAceitar}\r\n severidade={sev}\r\n onClick={() => responder(true)}\r\n />\r\n </div>\r\n </Sobreposicao>\r\n )}\r\n </Ctx.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * `const confirmar = useConfirmacao();`\r\n * `if (await confirmar({ titulo: 'Excluir?', severidade: 'err' })) …`\r\n * `if (await confirmar.remover({ mensagem: '\"TJ-PR 2026\" será removido.' })) …`\r\n * `await confirmar.avisar({ titulo: 'Prazo encerrado', severidade: 'warn' })`\r\n */\r\nexport function useConfirmacao(): Confirmar {\r\n const ctx = useContext(Ctx);\r\n if (!ctx) throw new Error('useConfirmacao precisa de <ProvedorConfirmacao> (ou <ProvedorUi>) acima na árvore.');\r\n return ctx;\r\n}\r\n","import { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type HTMLAttributes, type ReactNode } from 'react';\r\nimport { portal } from '../../utils/portal';\r\nimport { cx } from '../../utils/cx';\r\nimport type { Severidade } from '../../utils/tipos';\r\nimport './Toast.css';\r\n\r\ntype SevToast = Exclude<Severidade, 'neutral'>;\r\n\r\nexport type CorToast = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\r\n/** `suave` (padrão) = fundo claro da cor · `padrao` = fundo neutro, ícone na cor · `solido` · `translucido` = vidro fosco. */\r\nexport type AparenciaToast = 'suave' | 'padrao' | 'solido' | 'translucido';\r\nexport type PosicaoToast =\r\n | 'topo-esquerda'\r\n | 'topo-centro'\r\n | 'topo-direita'\r\n | 'meio-esquerda'\r\n | 'meio-centro'\r\n | 'meio-direita'\r\n | 'base-esquerda'\r\n | 'base-centro'\r\n | 'base-direita';\r\n\r\nconst ICONE: Record<SevToast, string> = {\r\n ok: 'circle-check',\r\n info: 'info',\r\n warn: 'triangle-alert',\r\n err: 'circle-x',\r\n};\r\n\r\nexport interface ToastProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\r\n /** Dá o ícone e a cor padrão. */\r\n severidade?: SevToast;\r\n /** Cor no lugar da que vem da severidade. */\r\n cor?: CorToast;\r\n aparencia?: AparenciaToast;\r\n titulo?: ReactNode;\r\n detalhe?: ReactNode;\r\n /** Ícone no lugar do da severidade; `false` tira. */\r\n icone?: IconeProp | false;\r\n /** `cabecalho` = linha de cima com ícone, título, tempo e ×; o detalhe vai embaixo. */\r\n modelo?: 'compacto' | 'cabecalho';\r\n /** Quando aconteceu (ex.: \"há 11 min\"), no modelo com cabeçalho. */\r\n tempo?: string;\r\n /** Botões ou links abaixo do texto. */\r\n acoes?: ReactNode;\r\n /** Mostra o × e é chamado ao fechar. */\r\n aoFechar?: () => void;\r\n}\r\n\r\n/**\r\n * O cartão de aviso. Aparece sozinho via `useToast()`; use direto para um\r\n * aviso fixo na página.\r\n */\r\nexport function Toast({\r\n severidade,\r\n cor,\r\n aparencia = 'suave',\r\n titulo,\r\n detalhe,\r\n icone,\r\n modelo = 'compacto',\r\n tempo,\r\n acoes,\r\n aoFechar,\r\n children,\r\n className,\r\n ...resto\r\n}: ToastProps) {\r\n const tom = cor ?? severidade ?? 'pri';\r\n const ic = icone === false ? null : (icone ?? (severidade ? ICONE[severidade] : null));\r\n const fechar = aoFechar && (\r\n <button type=\"button\" className=\"lp-toast-fechar\" aria-label=\"Fechar aviso\" onClick={aoFechar}>\r\n <Icone icone=\"x\" />\r\n </button>\r\n );\r\n const corpo = (\r\n <>\r\n {detalhe && <span className=\"lp-toast-detalhe\">{detalhe}</span>}\r\n {children}\r\n {acoes && <div className=\"lp-toast-acoes\">{acoes}</div>}\r\n </>\r\n );\r\n\r\n return (\r\n <div className={cx('lp-toast', `lp-toast--${tom}`, `lp-toast--${aparencia}`, modelo === 'cabecalho' && 'lp-toast--cabecalho', className)} {...resto}>\r\n {modelo === 'cabecalho' ? (\r\n <>\r\n <div className=\"lp-toast-cab\">\r\n {ic && <Icone icone={ic} className=\"lp-toast-ic\" />}\r\n <strong className=\"lp-toast-titulo\">{titulo}</strong>\r\n {tempo && <small className=\"lp-toast-tempo\">{tempo}</small>}\r\n {fechar}\r\n </div>\r\n <div className=\"lp-toast-corpo\">{corpo}</div>\r\n </>\r\n ) : (\r\n <>\r\n {ic && <Icone icone={ic} className=\"lp-toast-ic\" />}\r\n <div className=\"lp-toast-corpo\">\r\n {titulo && <strong className=\"lp-toast-titulo\">{titulo}</strong>}\r\n {corpo}\r\n </div>\r\n {fechar}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface OpcoesToast {\r\n severidade?: SevToast;\r\n titulo: string;\r\n detalhe?: string;\r\n /** ms até sumir sozinho. 0 = só fecha no ×. */\r\n duracao?: number;\r\n /** Canto/lado da tela. Padrão: `topo-direita`. */\r\n posicao?: PosicaoToast;\r\n cor?: CorToast;\r\n aparencia?: AparenciaToast;\r\n /** Ícone no lugar do da severidade; `false` tira. */\r\n icone?: IconeProp | false;\r\n}\r\n\r\ninterface ItemToast extends OpcoesToast {\r\n id: number;\r\n severidade: SevToast;\r\n posicao: PosicaoToast;\r\n saindo: boolean;\r\n}\r\n\r\nexport interface ApiToast {\r\n mostrar: (o: OpcoesToast) => number;\r\n ok: (titulo: string, detalhe?: string) => number;\r\n info: (titulo: string, detalhe?: string) => number;\r\n warn: (titulo: string, detalhe?: string) => number;\r\n err: (titulo: string, detalhe?: string) => number;\r\n fechar: (id: number) => void;\r\n}\r\n\r\nconst Ctx = createContext<ApiToast | null>(null);\r\n\r\nconst MAX_VISIVEIS = 4;\r\nlet seq = 0;\r\n\r\n/** Fornece `useToast()` e renderiza a pilha. Já incluso no `ProvedorUi`. */\r\nexport function ProvedorToast({ children }: { children: ReactNode }) {\r\n const [itens, setItens] = useState<ItemToast[]>([]);\r\n const timers = useRef(new Map<number, { t?: number; resta: number; inicio: number }>());\r\n\r\n const remover = useCallback((id: number) => {\r\n setItens((l) => l.map((t) => (t.id === id ? { ...t, saindo: true } : t)));\r\n window.setTimeout(() => setItens((l) => l.filter((t) => t.id !== id)), 180);\r\n const tm = timers.current.get(id);\r\n if (tm?.t) window.clearTimeout(tm.t);\r\n timers.current.delete(id);\r\n }, []);\r\n\r\n const agendar = useCallback(\r\n (id: number, ms: number) => {\r\n if (ms <= 0) return;\r\n const t = window.setTimeout(() => remover(id), ms);\r\n timers.current.set(id, { t, resta: ms, inicio: Date.now() });\r\n },\r\n [remover],\r\n );\r\n\r\n const pausar = (id: number) => {\r\n const tm = timers.current.get(id);\r\n if (!tm?.t) return;\r\n window.clearTimeout(tm.t);\r\n timers.current.set(id, { resta: tm.resta - (Date.now() - tm.inicio), inicio: Date.now() });\r\n };\r\n const retomar = (id: number) => {\r\n const tm = timers.current.get(id);\r\n if (tm && !tm.t) agendar(id, Math.max(tm.resta, 1500));\r\n };\r\n\r\n const mostrar = useCallback(\r\n (o: OpcoesToast) => {\r\n const id = ++seq;\r\n const severidade = o.severidade ?? 'info';\r\n const duracao = o.duracao ?? (severidade === 'err' ? 8000 : 5000);\r\n setItens((l) => [...l, { ...o, id, severidade, duracao, posicao: o.posicao ?? 'topo-direita', saindo: false }]);\r\n agendar(id, duracao);\r\n return id;\r\n },\r\n [agendar],\r\n );\r\n\r\n const api = useMemo<ApiToast>(\r\n () => ({\r\n mostrar,\r\n ok: (titulo, detalhe) => mostrar({ severidade: 'ok', titulo, detalhe }),\r\n info: (titulo, detalhe) => mostrar({ severidade: 'info', titulo, detalhe }),\r\n warn: (titulo, detalhe) => mostrar({ severidade: 'warn', titulo, detalhe }),\r\n err: (titulo, detalhe) => mostrar({ severidade: 'err', titulo, detalhe }),\r\n fechar: remover,\r\n }),\r\n [mostrar, remover],\r\n );\r\n\r\n useEffect(() => {\r\n const mapa = timers.current;\r\n return () => mapa.forEach((tm) => tm.t && window.clearTimeout(tm.t));\r\n }, []);\r\n\r\n const ultimo = itens[itens.length - 1];\r\n // uma pilha por posição, na ordem em que aparecem\r\n const posicoes = [...new Set(itens.map((t) => t.posicao))];\r\n\r\n return (\r\n <Ctx.Provider value={api}>\r\n {children}\r\n {portal(\r\n <>\r\n <div className=\"lp-sr\" aria-live=\"polite\">\r\n {ultimo && ultimo.severidade !== 'err' ? `${ultimo.titulo}. ${ultimo.detalhe ?? ''}` : ''}\r\n </div>\r\n {posicoes.map((pos) => {\r\n const daqui = itens.filter((t) => t.posicao === pos);\r\n const visiveis = daqui.slice(-MAX_VISIVEIS);\r\n const ocultos = daqui.length - visiveis.length;\r\n return (\r\n <div key={pos} className={cx('lp-toasts', `lp-toasts--${pos}`)}>\r\n {visiveis.map((t) => (\r\n <Toast\r\n key={t.id}\r\n severidade={t.severidade}\r\n cor={t.cor}\r\n aparencia={t.aparencia}\r\n icone={t.icone}\r\n titulo={t.titulo}\r\n detalhe={t.detalhe}\r\n className={t.saindo ? 'is-saindo' : undefined}\r\n role={t.severidade === 'err' ? 'alert' : undefined}\r\n onMouseEnter={() => pausar(t.id)}\r\n onMouseLeave={() => retomar(t.id)}\r\n onFocus={() => pausar(t.id)}\r\n onBlur={() => retomar(t.id)}\r\n aoFechar={() => remover(t.id)}\r\n />\r\n ))}\r\n {ocultos > 0 && (\r\n <div className=\"lp-toast-mais\">\r\n e mais {ocultos} {ocultos === 1 ? 'aviso' : 'avisos'}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </>,\r\n )}\r\n </Ctx.Provider>\r\n );\r\n}\r\n\r\n/** `const toast = useToast(); toast.ok('Salvo com sucesso');` */\r\nexport function useToast(): ApiToast {\r\n const ctx = useContext(Ctx);\r\n if (!ctx) throw new Error('useToast precisa de <ProvedorToast> (ou <ProvedorUi>) acima na árvore.');\r\n return ctx;\r\n}\r\n\r\n/** Igual a `useToast`, mas devolve `null` fora do provedor. */\r\nexport function useToastOpcional(): ApiToast | null {\r\n return useContext(Ctx);\r\n}\r\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react';\r\nimport { ProvedorConfirmacao } from '../Confirmacao/Confirmacao';\r\nimport { ProvedorToast } from '../Toast/Toast';\r\n\r\n/** `sistema` = segue o modo do sistema operacional, inclusive quando ele muda com a página aberta. */\r\nexport type Tema = 'claro' | 'escuro' | 'sistema';\r\nexport type Densidade = 'compacta' | 'confortavel' | 'espacosa';\r\n\r\nconst CLASSE_DENSIDADE: Record<Densidade, string> = {\r\n compacta: 'density-compact',\r\n confortavel: 'density-comfortable',\r\n espacosa: 'density-cozy',\r\n};\r\n\r\nconst ATRIBUTO_TEMA: Record<Tema, string> = { claro: 'light', escuro: 'dark', sistema: 'system' };\r\n\r\nconst CONSULTA_ESCURO = '(prefers-color-scheme: dark)';\r\n\r\n/**\r\n * Sem escolha salva nem `temaInicial`, segue o sistema operacional. Antes, o\r\n * tema do sistema era lido na primeira visita e salvo como claro/escuro, e o\r\n * app parava de acompanhar se o sistema mudasse depois.\r\n */\r\nconst TEMA_PADRAO: Tema = 'sistema';\r\n\r\nexport interface Preferencias {\r\n tema: Tema;\r\n /** O tema que está na tela: com `sistema`, o do sistema operacional agora. */\r\n escuro: boolean;\r\n densidade: Densidade;\r\n definirTema: (t: Tema) => void;\r\n alternarTema: () => void;\r\n definirDensidade: (d: Densidade) => void;\r\n}\r\n\r\nconst Ctx = createContext<Preferencias | null>(null);\r\n\r\nconst CHAVE = 'lp-preferencias';\r\n\r\nfunction ler(): Partial<{ tema: Tema; densidade: Densidade }> {\r\n try {\r\n return JSON.parse(localStorage.getItem(CHAVE) ?? '{}');\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nfunction sistemaEscuro(): boolean {\r\n try {\r\n return window.matchMedia(CONSULTA_ESCURO).matches;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** Acompanha o modo do sistema operacional, só enquanto o tema é `sistema`. */\r\nfunction useSistemaEscuro(ativo: boolean): boolean {\r\n const [escuro, setEscuro] = useState(sistemaEscuro);\r\n useEffect(() => {\r\n if (!ativo) return undefined;\r\n let consulta: MediaQueryList;\r\n try {\r\n consulta = window.matchMedia(CONSULTA_ESCURO);\r\n } catch {\r\n return undefined;\r\n }\r\n setEscuro(consulta.matches);\r\n const aoMudar = (e: MediaQueryListEvent) => setEscuro(e.matches);\r\n consulta.addEventListener('change', aoMudar);\r\n return () => consulta.removeEventListener('change', aoMudar);\r\n }, [ativo]);\r\n return escuro;\r\n}\r\n\r\n/**\r\n * Script para o `<head>` que aplica tema e densidade ANTES da primeira pintura.\r\n * Sem ele, o `ProvedorPreferencias` só aplica no primeiro efeito, e quem salvou\r\n * o tema escuro vê a página clara piscar ao abrir. Lê a mesma chave do\r\n * `localStorage`; passe o mesmo `temaInicial`/`densidadeInicial` do provedor.\r\n *\r\n * SSR: `<script dangerouslySetInnerHTML={{ __html: scriptTemaInicial() }} />`.\r\n * Vite/HTML estático: o README traz o script pronto para colar no index.html.\r\n */\r\nexport function scriptTemaInicial({ temaInicial, densidadeInicial = 'confortavel' }: { temaInicial?: Tema; densidadeInicial?: Densidade } = {}): string {\r\n return (\r\n `(function(){var p={};try{p=JSON.parse(localStorage.getItem(${JSON.stringify(CHAVE)})||\"{}\")||{}}catch(e){}` +\r\n `var t=p.tema||${JSON.stringify(temaInicial ?? TEMA_PADRAO)};` +\r\n `var h=document.documentElement;h.setAttribute(\"data-theme\",${JSON.stringify(ATRIBUTO_TEMA)}[t]||\"light\");` +\r\n `var d=${JSON.stringify(CLASSE_DENSIDADE)}[p.densidade||${JSON.stringify(densidadeInicial)}];if(d)h.classList.add(d)})();`\r\n );\r\n}\r\n\r\nexport interface ProvedorPreferenciasProps {\r\n children: ReactNode;\r\n /** Tema enquanto a pessoa não escolhe outro. Padrão: `sistema`. */\r\n temaInicial?: Tema;\r\n densidadeInicial?: Densidade;\r\n}\r\n\r\n/**\r\n * Tema (claro/escuro/sistema) e densidade, lembrados no navegador. Aplica\r\n * `data-theme` (`light`/`dark`/`system`) no <html> e a classe de densidade no\r\n * <body>. Para não piscar ao abrir, use também o `scriptTemaInicial` no <head>.\r\n */\r\nexport function ProvedorPreferencias({ children, temaInicial, densidadeInicial = 'confortavel' }: ProvedorPreferenciasProps) {\r\n const [tema, setTema] = useState<Tema>(() => ler().tema ?? temaInicial ?? TEMA_PADRAO);\r\n const [densidade, setDensidade] = useState<Densidade>(() => ler().densidade ?? densidadeInicial);\r\n const escuroDoSistema = useSistemaEscuro(tema === 'sistema');\r\n const escuro = tema === 'escuro' || (tema === 'sistema' && escuroDoSistema);\r\n\r\n useEffect(() => {\r\n document.documentElement.setAttribute('data-theme', ATRIBUTO_TEMA[tema] ?? 'light');\r\n }, [tema]);\r\n\r\n useEffect(() => {\r\n const body = document.body;\r\n Object.values(CLASSE_DENSIDADE).forEach((c) => body.classList.remove(c));\r\n body.classList.add(CLASSE_DENSIDADE[densidade]);\r\n }, [densidade]);\r\n\r\n useEffect(() => {\r\n try {\r\n localStorage.setItem(CHAVE, JSON.stringify({ tema, densidade }));\r\n } catch {\r\n /* navegação privada: segue sem lembrar */\r\n }\r\n }, [tema, densidade]);\r\n\r\n // alterna o que está na tela: no `sistema`, sai dele para o oposto do atual\r\n const alternarTema = useCallback(() => setTema(escuro ? 'claro' : 'escuro'), [escuro]);\r\n\r\n const valor = useMemo<Preferencias>(\r\n () => ({\r\n tema,\r\n escuro,\r\n densidade,\r\n definirTema: setTema,\r\n alternarTema,\r\n definirDensidade: setDensidade,\r\n }),\r\n [tema, escuro, densidade, alternarTema],\r\n );\r\n\r\n return <Ctx.Provider value={valor}>{children}</Ctx.Provider>;\r\n}\r\n\r\nexport function usePreferencias(): Preferencias {\r\n const ctx = useContext(Ctx);\r\n if (!ctx) throw new Error('usePreferencias precisa de <ProvedorPreferencias> (ou <ProvedorUi>) acima na árvore.');\r\n return ctx;\r\n}\r\n\r\n/** Tudo que a biblioteca precisa na raiz do app: preferências, toasts e confirmação. */\r\nexport function ProvedorUi({ children, ...prefs }: ProvedorPreferenciasProps) {\r\n return (\r\n <ProvedorPreferencias {...prefs}>\r\n <ProvedorToast>\r\n <ProvedorConfirmacao>{children}</ProvedorConfirmacao>\r\n </ProvedorToast>\r\n </ProvedorPreferencias>\r\n );\r\n}\r\n\r\n/** Igual a `usePreferencias`, mas devolve `null` fora do provedor. */\r\nexport function usePreferenciasOpcional(): Preferencias | null {\r\n return useContext(Ctx);\r\n}\r\n","import { useEffect, type RefObject } from 'react';\r\n\r\n/** Chama `aoClicarFora` em pointerdown fora de TODOS os elementos dados. */\r\nexport function useCliqueFora(\r\n refs: Array<RefObject<HTMLElement | null>>,\r\n ativo: boolean,\r\n aoClicarFora: () => void,\r\n) {\r\n useEffect(() => {\r\n if (!ativo) return;\r\n const handler = (e: PointerEvent) => {\r\n const alvo = e.target as Node;\r\n if (refs.some((r) => r.current?.contains(alvo))) return;\r\n aoClicarFora();\r\n };\r\n document.addEventListener('pointerdown', handler);\r\n return () => document.removeEventListener('pointerdown', handler);\r\n // refs são estáveis (useRef); o callback muda a cada render\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [ativo, aoClicarFora]);\r\n}\r\n","import { useState, type CSSProperties } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport './Avatar.css';\r\n\r\nexport interface AvatarProps {\r\n foto?: string;\r\n /** Nome completo — gera as iniciais quando não há foto. */\r\n nome?: string;\r\n iniciais?: string;\r\n tom?: 'claro' | 'escuro';\r\n formato?: 'circulo' | 'quadrado';\r\n /** Tamanho CSS (ex.: `2rem`). */\r\n tamanho?: string;\r\n className?: string;\r\n}\r\n\r\nfunction iniciaisDe(nome = '') {\r\n const partes = nome.trim().split(/\\s+/).filter(Boolean);\r\n if (!partes.length) return '';\r\n const primeira = partes[0][0];\r\n const ultima = partes.length > 1 ? partes[partes.length - 1][0] : '';\r\n return (primeira + ultima).toUpperCase();\r\n}\r\n\r\nexport function Avatar({ foto, nome, iniciais, tom = 'claro', formato = 'circulo', tamanho, className }: AvatarProps) {\r\n const [falhou, setFalhou] = useState(false);\r\n const estilo = tamanho ? ({ '--av-size': tamanho } as CSSProperties) : undefined;\r\n return (\r\n <span className={cx('lp-av', `lp-av--${formato}`, `lp-av--${tom}`, className)} style={estilo} title={nome}>\r\n {foto && !falhou ? (\r\n <img src={foto} alt=\"\" loading=\"lazy\" onError={() => setFalhou(true)} />\r\n ) : (\r\n <span className=\"lp-av-ini\" aria-hidden=\"true\">\r\n {iniciais ?? iniciaisDe(nome)}\r\n </span>\r\n )}\r\n </span>\r\n );\r\n}\r\n","import { useEffect, useRef, useState, type KeyboardEvent, type MouseEvent, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { normalizar } from '../../utils/texto';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { useCliqueFora } from '../../utils/useCliqueFora';\r\nimport './Busca.css';\r\n\r\nexport interface ItemBusca {\r\n rotulo: string;\r\n rota: string;\r\n icone?: IconeProp;\r\n /** Caminho no menu (ex.: \"Cadastros › Pessoas\"). */\r\n trilha?: string;\r\n}\r\n\r\nexport interface BuscaProps {\r\n placeholder?: string;\r\n /** Mostra spinner no lugar da lupa. */\r\n ocupado?: boolean;\r\n /** Itens de menu filtrados pelo termo (seção \"Menu\" do painel). */\r\n itensMenu?: ItemBusca[];\r\n aoNavegar?: (rota: string) => void;\r\n /** Enter sem item de menu ativo. */\r\n aoBuscar?: (termo: string) => void;\r\n aoMudarTermo?: (termo: string) => void;\r\n /** Ctrl+K / ⌘K foca a busca (padrão: sim). */\r\n atalho?: boolean;\r\n /** Resultados do app no painel; marque opções navegáveis com `data-busca-opcao`. */\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst MAX_MENU = 8;\r\n\r\n/** Busca global da topbar: filtra o menu e hospeda resultados do app. */\r\nexport function Busca({\r\n placeholder = 'Buscar…',\r\n ocupado,\r\n itensMenu,\r\n aoNavegar,\r\n aoBuscar,\r\n aoMudarTermo,\r\n atalho = true,\r\n children,\r\n className,\r\n}: BuscaProps) {\r\n const raiz = useRef<HTMLDivElement>(null);\r\n const campo = useRef<HTMLInputElement>(null);\r\n const [termo, setTermo] = useState('');\r\n const [aberto, setAberto] = useState(false);\r\n const [ativo, setAtivo] = useState(-1);\r\n\r\n useCliqueFora([raiz], aberto, () => setAberto(false));\r\n\r\n useEffect(() => {\r\n if (!atalho) return;\r\n const h = (e: globalThis.KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') {\r\n e.preventDefault();\r\n campo.current?.focus();\r\n }\r\n };\r\n window.addEventListener('keydown', h);\r\n return () => window.removeEventListener('keydown', h);\r\n }, [atalho]);\r\n\r\n const t = normalizar(termo.trim());\r\n const casam = t && itensMenu ? itensMenu.filter((i) => normalizar(`${i.rotulo} ${i.trilha ?? ''}`).includes(t)) : [];\r\n const menu = casam.slice(0, MAX_MENU);\r\n const excedente = casam.length - menu.length;\r\n\r\n // opções navegáveis: itens de menu + opções do app (data-busca-opcao)\r\n const opcoes = (): HTMLElement[] =>\r\n raiz.current ? [...raiz.current.querySelectorAll<HTMLElement>('.lp-pb-item, [data-busca-opcao]')] : [];\r\n\r\n useEffect(() => {\r\n opcoes().forEach((el, i) => el.classList.toggle('is-ativa', i === ativo));\r\n });\r\n\r\n const mudar = (v: string) => {\r\n setTermo(v);\r\n setAtivo(-1);\r\n setAberto(true);\r\n aoMudarTermo?.(v);\r\n };\r\n\r\n const navegar = (rota: string, e?: MouseEvent) => {\r\n if (aoNavegar) {\r\n e?.preventDefault();\r\n aoNavegar(rota);\r\n }\r\n setTermo('');\r\n setAberto(false);\r\n campo.current?.blur();\r\n };\r\n\r\n const aoTeclar = (e: KeyboardEvent<HTMLInputElement>) => {\r\n const lista = opcoes();\r\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n if (!lista.length) return;\r\n setAberto(true);\r\n const passo = e.key === 'ArrowDown' ? 1 : -1;\r\n setAtivo((a) => (a + passo + lista.length) % lista.length);\r\n } else if (e.key === 'Enter') {\r\n e.preventDefault();\r\n if (ativo >= 0 && lista[ativo]) lista[ativo].click();\r\n else aoBuscar?.(termo.trim());\r\n } else if (e.key === 'Escape') {\r\n if (termo) mudar('');\r\n else {\r\n setAberto(false);\r\n campo.current?.blur();\r\n }\r\n }\r\n };\r\n\r\n const temMenu = !!itensMenu;\r\n const mostrarPainel = aberto && (temMenu || !!children);\r\n\r\n return (\r\n <div ref={raiz} className={cx('lp-busca', className)}>\r\n <div className=\"lp-pb\" role=\"search\">\r\n <Icone icone={ocupado ? 'loader-circle' : 'search'} girar={ocupado} className=\"lp-pb-ic\" />\r\n <input\r\n ref={campo}\r\n type=\"search\"\r\n className=\"lp-pb-input\"\r\n role=\"combobox\"\r\n autoComplete=\"off\"\r\n aria-expanded={mostrarPainel}\r\n aria-autocomplete=\"list\"\r\n aria-label={placeholder}\r\n placeholder={placeholder}\r\n value={termo}\r\n onFocus={() => setAberto(true)}\r\n onChange={(e) => mudar(e.target.value)}\r\n onKeyDown={aoTeclar}\r\n />\r\n {atalho && (\r\n <kbd className=\"lp-pb-kbd\" aria-hidden=\"true\">\r\n Ctrl K\r\n </kbd>\r\n )}\r\n </div>\r\n <span className=\"lp-sr\" role=\"status\" aria-live=\"polite\">\r\n {t && temMenu ? `${casam.length} item(ns) de menu encontrado(s)` : ''}\r\n </span>\r\n\r\n {mostrarPainel && (\r\n <div className=\"lp-pb-painel\">\r\n {temMenu && (\r\n <div className={cx('lp-pb-menu', !menu.length && 'lp-pb-menu-sem-itens')}>\r\n {t ? (\r\n menu.length ? (\r\n <>\r\n <div className=\"lp-pb-ttl\">Menu</div>\r\n {menu.map((r) => (\r\n <a key={r.rota} className=\"lp-pb-item\" href={r.rota} onClick={(e) => navegar(r.rota, e)}>\r\n <Icone icone={r.icone ?? 'chevron-right'} />\r\n <span>{r.rotulo}</span>\r\n {r.trilha && <span className=\"lp-pb-trilha\">{r.trilha}</span>}\r\n </a>\r\n ))}\r\n {excedente > 0 && <p className=\"lp-pb-hint\">…e mais {excedente} itens no menu</p>}\r\n </>\r\n ) : (\r\n <p className=\"lp-pb-hint\">Nenhum item de menu encontrado.</p>\r\n )\r\n ) : (\r\n <p className=\"lp-pb-hint\">\r\n Digite para pesquisar — <kbd className=\"lp-pb-kbd\">Esc</kbd> limpa.\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n {children && <div className=\"lp-pb-conteudo\">{children}</div>}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { createContext, Fragment, useContext, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport './Trilha.css';\r\n\r\n/** Um passo da trilha. Sem `rota`, aparece como texto (grupo do menu). */\r\nexport interface ItemTrilha {\r\n rotulo: string;\r\n rota?: string;\r\n icone?: IconeProp;\r\n}\r\n\r\n/** Separadores prontos, ou qualquer nó React (ex.: `'|'` ou um ícone). */\r\nexport type SeparadorTrilha = 'chevron' | 'barra' | 'duplo' | 'seta' | 'til' | 'ponto' | ReactNode;\r\n\r\n/** Aparência da trilha — pode valer para o sistema todo (`Estrutura.modeloTrilha`). */\r\nexport interface ModeloTrilha {\r\n /** Padrão: `chevron` (›). */\r\n separador?: SeparadorTrilha;\r\n /** Ícones: só no Início (padrão), em todos os passos que têm, ou nenhum. */\r\n icones?: 'inicio' | 'todos' | 'nenhum';\r\n /** `simples` (padrão) · `fundo` = faixa com fundo suave. */\r\n aparencia?: 'simples' | 'fundo';\r\n}\r\n\r\ninterface CtxTrilha {\r\n /** Caminho da página atual, calculado do menu (já com \"Início\"). */\r\n itens: ItemTrilha[];\r\n /** Desenha um link pelo mesmo caminho dos links do menu (renderLink/aoNavegar). */\r\n link: (rota: string, conteudo: ReactNode, className: string) => ReactNode;\r\n /** Modelo padrão do sistema. */\r\n modelo?: ModeloTrilha;\r\n}\r\n\r\nconst TrilhaCtx = createContext<CtxTrilha | null>(null);\r\nexport const ProvedorTrilha = TrilhaCtx.Provider;\r\n\r\n/** Caminho calculado pela `Estrutura` para a rota atual (vazio fora dela). */\r\nexport function useTrilha(): ItemTrilha[] {\r\n return useContext(TrilhaCtx)?.itens ?? [];\r\n}\r\n\r\ninterface NoMenu {\r\n rotulo: string;\r\n rota?: string;\r\n icone?: IconeProp;\r\n filhos?: NoMenu[];\r\n}\r\n\r\n/**\r\n * Caminho no menu até o item da rota atual: seção › grupo(s) › item. Vence o\r\n * item de rota mais longa que casa (em `/pedidos/novo`, \"Novo pedido\" ganha\r\n * de \"Pedidos\").\r\n */\r\nexport function caminhoNoMenu(\r\n secoes: { rotulo?: string; itens: NoMenu[] }[],\r\n ativo: (rota?: string) => boolean,\r\n): ItemTrilha[] {\r\n let melhor: ItemTrilha[] = [];\r\n let tamanho = -1;\r\n const visitar = (itens: NoMenu[], pais: ItemTrilha[]) => {\r\n for (const item of itens) {\r\n if (item.rota && ativo(item.rota) && item.rota.length > tamanho) {\r\n melhor = [...pais, { rotulo: item.rotulo, rota: item.rota, icone: item.icone }];\r\n tamanho = item.rota.length;\r\n }\r\n if (item.filhos) visitar(item.filhos, [...pais, { rotulo: item.rotulo, icone: item.icone }]);\r\n }\r\n };\r\n for (const s of secoes) visitar(s.itens, s.rotulo ? [{ rotulo: s.rotulo }] : []);\r\n return melhor;\r\n}\r\n\r\nconst SEPARADORES: Record<string, ReactNode> = {\r\n chevron: <Icone icone=\"chevron-right\" />,\r\n barra: '/',\r\n duplo: '»',\r\n seta: <Icone icone=\"arrow-right\" />,\r\n til: '~',\r\n ponto: '•',\r\n};\r\n\r\nexport interface TrilhaProps extends ModeloTrilha {\r\n /** Passos explícitos. Sem a prop, usa o caminho calculado pela `Estrutura`. */\r\n itens?: ItemTrilha[];\r\n /** Passos acrescentados ao final do caminho automático (ex.: o registro aberto). */\r\n extras?: ItemTrilha[];\r\n /** Mostra mesmo com um passo só (por padrão, some: o título já diz onde se está). */\r\n mostrarUnico?: boolean;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Trilha de navegação (breadcrumb). O último passo é a página atual; os do\r\n * meio com rota são links. Em tela estreita vira só \"‹ nível de cima\".\r\n */\r\nexport function Trilha({ itens: explicitos, extras = [], mostrarUnico = false, separador, icones, aparencia, className }: TrilhaProps) {\r\n const ctx = useContext(TrilhaCtx);\r\n const itens = [...(explicitos ?? ctx?.itens ?? []), ...extras];\r\n if (!itens.length || (itens.length < 2 && !mostrarUnico)) return null;\r\n\r\n const modelo = ctx?.modelo ?? {};\r\n const sep = separador ?? modelo.separador ?? 'chevron';\r\n const modoIcones = icones ?? modelo.icones ?? 'inicio';\r\n const aparenciaFinal = aparencia ?? modelo.aparencia ?? 'simples';\r\n const marcaSep = typeof sep === 'string' && sep in SEPARADORES ? SEPARADORES[sep] : sep;\r\n\r\n const ultimo = itens.length - 1;\r\n const desenharLink = (it: ItemTrilha, conteudo: ReactNode, classe: string) =>\r\n ctx ? ctx.link(it.rota!, conteudo, classe) : <a href={it.rota} className={classe}>{conteudo}</a>;\r\n // nível de cima com destino: o único passo que aparece em tela estreita\r\n let pai = -1;\r\n for (let i = ultimo - 1; i >= 0; i--)\r\n if (itens[i].rota) {\r\n pai = i;\r\n break;\r\n }\r\n\r\n return (\r\n <nav className={cx('lp-trilha', `lp-trilha--${aparenciaFinal}`, className)} aria-label=\"Trilha de navegação\">\r\n <ol className=\"lp-trilha-lista\">\r\n {itens.map((it, i) => {\r\n const comIcone = !!it.icone && (modoIcones === 'todos' || (modoIcones === 'inicio' && i === 0));\r\n const conteudo = (\r\n <Fragment>\r\n {comIcone && <Icone icone={it.icone} className=\"lp-trilha-ic\" />}\r\n <span className=\"lp-trilha-rot\">{it.rotulo}</span>\r\n </Fragment>\r\n );\r\n return (\r\n <li key={`${i}-${it.rotulo}`} className={cx('lp-trilha-item', i === pai && 'is-pai')}>\r\n {i > 0 && (\r\n <span className=\"lp-trilha-sep\" aria-hidden=\"true\">\r\n {marcaSep}\r\n </span>\r\n )}\r\n {i === ultimo ? (\r\n <span className=\"lp-trilha-atual\" aria-current=\"page\" title={it.rotulo}>\r\n {conteudo}\r\n </span>\r\n ) : it.rota ? (\r\n desenharLink(\r\n it,\r\n <>\r\n <Icone icone=\"chevron-left\" className=\"lp-trilha-voltar\" />\r\n {conteudo}\r\n </>,\r\n 'lp-trilha-link',\r\n )\r\n ) : (\r\n <span className=\"lp-trilha-grupo\" title={it.rotulo}>\r\n {conteudo}\r\n </span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n","import {\r\n Fragment,\r\n useCallback,\r\n useEffect,\r\n useId,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type MouseEvent,\r\n type ReactNode,\r\n} from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { useCliqueFora } from '../../utils/useCliqueFora';\r\nimport { Avatar } from '../Avatar/Avatar';\r\nimport { Busca, type ItemBusca } from '../Busca/Busca';\r\nimport { Dica } from '../Dica/Dica';\r\nimport { ProvedorTrilha, caminhoNoMenu, type ItemTrilha, type ModeloTrilha } from '../Trilha/Trilha';\r\nimport { usePreferenciasOpcional, type Densidade } from '../Preferencias/Preferencias';\r\nimport './Estrutura.css';\r\n\r\nexport interface ItemNav {\r\n rotulo: string;\r\n icone?: IconeProp;\r\n /** Folha: destino. Grupo: omita e use `filhos`. */\r\n rota?: string;\r\n filhos?: ItemNav[];\r\n desabilitado?: boolean;\r\n}\r\n\r\nexport interface SecaoNav {\r\n /** Rótulo do grupo (linha em caixa alta). */\r\n rotulo?: string;\r\n itens: ItemNav[];\r\n}\r\n\r\nexport interface Marca {\r\n nome: string;\r\n subtitulo?: string;\r\n /** URL da imagem do logo (sem ela, mostra um escudo). */\r\n logo?: string;\r\n href?: string;\r\n}\r\n\r\nexport interface UsuarioEstrutura {\r\n nome: string;\r\n cargo?: string;\r\n foto?: string;\r\n iniciais?: string;\r\n}\r\n\r\nexport interface ItemMenu {\r\n id: string;\r\n rotulo: string;\r\n icone?: string;\r\n destrutivo?: boolean;\r\n divisorAntes?: boolean;\r\n}\r\n\r\nexport interface Notificacao {\r\n id: string;\r\n titulo: string;\r\n descricao?: string;\r\n tempo?: string;\r\n icone?: string;\r\n naoLida?: boolean;\r\n}\r\n\r\n/** Props entregues a `renderLink` (para usar o <Link> do seu roteador). */\r\nexport interface PropsLink {\r\n href: string;\r\n className: string;\r\n children: ReactNode;\r\n onClick: (e: MouseEvent<HTMLAnchorElement>) => void;\r\n 'aria-current'?: 'page';\r\n 'aria-disabled'?: boolean;\r\n}\r\n\r\nexport interface EstruturaProps {\r\n marca: Marca;\r\n nav: SecaoNav[];\r\n /** Rota atual — marca o item ativo (ex.: `location.pathname`). */\r\n rotaAtual?: string;\r\n /** Navegação SPA: recebe a rota e evita o reload. */\r\n aoNavegar?: (rota: string) => void;\r\n /** Renderiza os links com o componente do seu roteador. */\r\n renderLink?: (props: PropsLink, item: ItemNav) => ReactNode;\r\n usuario?: UsuarioEstrutura;\r\n menuUsuario?: ItemMenu[];\r\n aoEscolherMenuUsuario?: (id: string) => void;\r\n /** Lista de notificações. Sem a prop, o sino não aparece. */\r\n notificacoes?: Notificacao[];\r\n aoEscolherNotificacao?: (id: string) => void;\r\n /** Menu de ferramentas de desenvolvimento (não passe em produção). */\r\n menuDesenvolvimento?: ItemMenu[];\r\n aoEscolherMenuDesenvolvimento?: (id: string) => void;\r\n /** Tarja de ambiente no topo da sidebar (Homologação, Treinamento…). */\r\n ambiente?: {\r\n rotulo: string;\r\n severidade?: 'warn' | 'err' | 'info' | 'neutral';\r\n /** Texto curto para a sidebar recolhida (padrão: 3 primeiras letras, ex.: \"HOM\"). */\r\n sigla?: string;\r\n };\r\n versao?: string;\r\n /**\r\n * Como os grupos do menu abrem com a sidebar expandida: `abaixo` (padrão,\r\n * sanfona dentro da própria sidebar) ou `lateral` (painel ao lado). Com a\r\n * sidebar recolhida, sempre abre o painel lateral.\r\n */\r\n submenu?: 'abaixo' | 'lateral';\r\n /** Modelo padrão das trilhas de navegação do sistema (separador, ícones, aparência). */\r\n modeloTrilha?: ModeloTrilha;\r\n /** Conteúdo do rodapé da sidebar (marca do ecossistema, links…). */\r\n rodapeSidebar?: ReactNode;\r\n /** Rodapé da área de conteúdo, sempre visível no pé da tela (autoria, direitos, links…). */\r\n rodape?: ReactNode;\r\n /** Substitui a busca padrão (filtro do menu). `false` remove. */\r\n busca?: ReactNode | false;\r\n placeholderBusca?: string;\r\n aoBuscar?: (termo: string) => void;\r\n /** Controles extras à direita da topbar. */\r\n complementosTopbar?: ReactNode;\r\n children?: ReactNode;\r\n}\r\n\r\nconst DENSIDADES: Array<{ valor: Densidade; rotulo: string; icone: string }> = [\r\n { valor: 'compacta', rotulo: 'Compacta', icone: 'minus' },\r\n { valor: 'confortavel', rotulo: 'Confortável', icone: 'equal' },\r\n { valor: 'espacosa', rotulo: 'Espaçosa', icone: 'menu' },\r\n];\r\n\r\ntype Menu = 'densidade' | 'dev' | 'sino' | 'usuario' | 'compacto' | null;\r\n\r\nconst CHAVE_SIDEBAR = 'lp-sidebar-expandida';\r\n\r\nfunction useMedia(consulta: string) {\r\n const [casa, setCasa] = useState(() => typeof window !== 'undefined' && window.matchMedia(consulta).matches);\r\n useEffect(() => {\r\n const mq = window.matchMedia(consulta);\r\n const h = () => setCasa(mq.matches);\r\n h();\r\n mq.addEventListener('change', h);\r\n return () => mq.removeEventListener('change', h);\r\n }, [consulta]);\r\n return casa;\r\n}\r\n\r\nfunction lerExpandida(): boolean {\r\n try {\r\n return localStorage.getItem(CHAVE_SIDEBAR) !== '0';\r\n } catch {\r\n return true;\r\n }\r\n}\r\n\r\nfunction achatar(nav: SecaoNav[]): ItemBusca[] {\r\n const lista: ItemBusca[] = [];\r\n const visitar = (itens: ItemNav[], trilha: string[], icone?: IconeProp) => {\r\n for (const i of itens) {\r\n if (i.desabilitado) continue;\r\n if (i.filhos?.length) visitar(i.filhos, [...trilha, i.rotulo], i.icone ?? icone);\r\n else if (i.rota) lista.push({ rotulo: i.rotulo, rota: i.rota, icone: i.icone ?? icone, trilha: trilha.join(' › ') || undefined });\r\n }\r\n };\r\n nav.forEach((s) => visitar(s.itens, s.rotulo ? [s.rotulo] : []));\r\n return lista;\r\n}\r\n\r\nfunction ItensMenu({ itens, aoEscolher }: { itens: ItemMenu[]; aoEscolher: (id: string) => void }) {\r\n return (\r\n <>\r\n {itens.map((item) => (\r\n <Fragment key={item.id}>\r\n {item.divisorAntes && <div className=\"lp-tb-menu-ln\" aria-hidden=\"true\" />}\r\n <button type=\"button\" className={cx('lp-tb-menu-item', item.destrutivo && 'lp-danger')} onClick={() => aoEscolher(item.id)}>\r\n {item.icone && <Icone icone={item.icone} />}\r\n <span>{item.rotulo}</span>\r\n </button>\r\n </Fragment>\r\n ))}\r\n </>\r\n );\r\n}\r\n\r\n/**\r\n * Moldura do app autenticado: sidebar recolhível (com submenu em painel\r\n * lateral), topbar com busca, densidade, tema, notificações e perfil.\r\n * Responsiva: abaixo de 64rem a sidebar vira sobreposição; abaixo de 48rem,\r\n * gaveta com hambúrguer.\r\n */\r\nexport function Estrutura({\r\n marca,\r\n nav,\r\n rotaAtual,\r\n aoNavegar,\r\n renderLink,\r\n usuario,\r\n menuUsuario = [],\r\n aoEscolherMenuUsuario,\r\n notificacoes,\r\n aoEscolherNotificacao,\r\n menuDesenvolvimento = [],\r\n aoEscolherMenuDesenvolvimento,\r\n ambiente,\r\n versao,\r\n rodapeSidebar,\r\n rodape,\r\n modeloTrilha,\r\n submenu = 'abaixo',\r\n busca,\r\n placeholderBusca = 'Buscar no sistema…',\r\n aoBuscar,\r\n complementosTopbar,\r\n children,\r\n}: EstruturaProps) {\r\n const prefs = usePreferenciasOpcional();\r\n const idConteudo = `lp-conteudo-${useId().replace(/:/g, '')}`;\r\n const estreito = useMedia('(max-width: 64rem)');\r\n const movel = useMedia('(max-width: 48rem)');\r\n\r\n const [expandida, setExpandida] = useState(() => !estreito && lerExpandida());\r\n const [aside, setAside] = useState<string | null>(null);\r\n // altura (px) do item que abriu o cartão flutuante, com a sidebar recolhida\r\n const [asideTopo, setAsideTopo] = useState(0);\r\n const [subAbertos, setSubAbertos] = useState<Set<string>>(new Set());\r\n const [menu, setMenu] = useState<Menu>(null);\r\n const [logoOk, setLogoOk] = useState(true);\r\n\r\n const sidebarRef = useRef<HTMLElement>(null);\r\n const asideRef = useRef<HTMLDivElement>(null);\r\n const direitaRef = useRef<HTMLDivElement>(null);\r\n const conteudoRef = useRef<HTMLElement>(null);\r\n\r\n // telas estreitas nascem (e voltam) recolhidas\r\n useEffect(() => {\r\n if (estreito) setExpandida(false);\r\n else setExpandida(lerExpandida());\r\n }, [estreito]);\r\n\r\n // página nova começa do topo (o scroll é do <main>, não da janela)\r\n useEffect(() => {\r\n conteudoRef.current?.scrollTo({ top: 0 });\r\n }, [rotaAtual]);\r\n\r\n const alternarSidebar = () => {\r\n setExpandida((e) => {\r\n const nova = !e;\r\n if (!estreito) {\r\n try {\r\n localStorage.setItem(CHAVE_SIDEBAR, nova ? '1' : '0');\r\n } catch {\r\n /* sem armazenamento: segue */\r\n }\r\n }\r\n return nova;\r\n });\r\n };\r\n\r\n const fecharMenus = useCallback(() => setMenu(null), []);\r\n const fecharAside = useCallback(() => setAside(null), []);\r\n useCliqueFora([direitaRef], menu !== null, fecharMenus);\r\n useCliqueFora([sidebarRef, asideRef], aside !== null, fecharAside);\r\n\r\n useEffect(() => {\r\n if (!menu && !aside) return;\r\n const esc = (e: KeyboardEvent) => {\r\n if (e.key !== 'Escape') return;\r\n setMenu(null);\r\n setAside(null);\r\n };\r\n window.addEventListener('keydown', esc);\r\n return () => window.removeEventListener('keydown', esc);\r\n }, [menu, aside]);\r\n\r\n // Só UM item fica ativo: o de rota mais específica que casa com a atual.\r\n // Em /pedidos/novo, \"Novo pedido\" ganha de \"Pedidos\"; em /perfil/editar (fora\r\n // do menu), o prefixo ainda acende \"Meu perfil\".\r\n const rotaAtiva = useMemo(() => {\r\n if (!rotaAtual) return undefined;\r\n const casa = (rota: string) =>\r\n rota === '/' ? rotaAtual === '/' : rotaAtual === rota || rotaAtual.startsWith(rota.endsWith('/') ? rota : `${rota}/`);\r\n let melhor: string | undefined;\r\n const visitar = (itens: ItemNav[]) => {\r\n for (const i of itens) {\r\n if (i.rota && casa(i.rota) && (!melhor || i.rota.length > melhor.length)) melhor = i.rota;\r\n if (i.filhos) visitar(i.filhos);\r\n }\r\n };\r\n nav.forEach((secao) => visitar(secao.itens));\r\n return melhor;\r\n }, [nav, rotaAtual]);\r\n const ativo = useCallback((rota?: string) => !!rota && rota === rotaAtiva, [rotaAtiva]);\r\n const grupoAtivo = (item: ItemNav): boolean => !!item.filhos?.some((f) => ativo(f.rota) || grupoAtivo(f));\r\n\r\n // sanfona: com a sidebar expandida os grupos abrem para baixo\r\n const emLinha = submenu === 'abaixo' && expandida;\r\n const alternarGrupo = (chave: string) =>\r\n setSubAbertos((s) => {\r\n const n = new Set(s);\r\n if (n.has(chave)) n.delete(chave);\r\n else n.add(chave);\r\n return n;\r\n });\r\n // ao chegar numa página, o(s) grupo(s) dela abrem (e o usuário ainda pode fechar)\r\n useEffect(() => {\r\n const chaves: string[] = [];\r\n const visitar = (itens: ItemNav[], pai: string): boolean => {\r\n let achou = false;\r\n for (const i of itens) {\r\n const chave = pai ? `${pai}›${i.rotulo}` : i.rotulo;\r\n if (i.filhos && visitar(i.filhos, chave)) {\r\n chaves.push(chave);\r\n achou = true;\r\n } else if (!i.filhos && ativo(i.rota)) achou = true;\r\n }\r\n return achou;\r\n };\r\n nav.forEach((s) => visitar(s.itens, ''));\r\n if (chaves.length) setSubAbertos((s) => new Set([...s, ...chaves]));\r\n }, [nav, ativo]);\r\n // passou a abrir para baixo: o painel lateral sai\r\n useEffect(() => {\r\n if (emLinha) setAside(null);\r\n }, [emLinha]);\r\n\r\n const aoNavegou = () => {\r\n setAside(null);\r\n if (estreito) setExpandida(false);\r\n };\r\n\r\n const link = (item: ItemNav, className: string, conteudo: ReactNode) => {\r\n const on = ativo(item.rota);\r\n const props: PropsLink = {\r\n href: item.rota ?? '#',\r\n className: cx(className, on && 'lp-active', item.desabilitado && 'lp-is-disabled'),\r\n 'aria-current': on ? 'page' : undefined,\r\n 'aria-disabled': item.desabilitado || undefined,\r\n children: conteudo,\r\n onClick: (e) => {\r\n if (item.desabilitado) {\r\n e.preventDefault();\r\n return;\r\n }\r\n if (aoNavegar && item.rota) {\r\n e.preventDefault();\r\n aoNavegar(item.rota);\r\n }\r\n aoNavegou();\r\n },\r\n };\r\n return renderLink ? renderLink(props, item) : <a {...props} />;\r\n };\r\n\r\n // trilha da página atual: Início › seção › grupo(s) › item do menu\r\n const trilha = useMemo(() => {\r\n const inicio: ItemTrilha = { rotulo: 'Início', rota: marca.href ?? '/', icone: 'house' };\r\n const caminho = caminhoNoMenu(nav, ativo);\r\n const fim = caminho[caminho.length - 1];\r\n return {\r\n itens: !fim || fim.rota === inicio.rota ? [inicio] : [inicio, ...caminho],\r\n link: (rota: string, conteudo: ReactNode, className: string) => link({ rotulo: '', rota }, className, conteudo),\r\n modelo: modeloTrilha,\r\n };\r\n // `link` lê aoNavegar/renderLink do render atual\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [nav, ativo, marca.href, aoNavegar, renderLink, modeloTrilha]);\r\n\r\n /** Filhos de um grupo aberto para baixo (qualquer profundidade). */\r\n const renderFilhos = (itens: ItemNav[], chavePai: string): ReactNode =>\r\n itens.map((filho) => {\r\n if (!filho.filhos?.length) {\r\n return (\r\n <Fragment key={filho.rotulo}>\r\n {link(\r\n filho,\r\n 'lp-nav-sub',\r\n <>\r\n <span className=\"lp-nav-sub-ic\">\r\n <Icone icone={filho.icone ?? 'chevron-right'} />\r\n </span>\r\n <span className=\"lp-nav-sub-tx\">{filho.rotulo}</span>\r\n </>,\r\n )}\r\n </Fragment>\r\n );\r\n }\r\n const chave = `${chavePai}›${filho.rotulo}`;\r\n const aberto = subAbertos.has(chave);\r\n return (\r\n <div key={filho.rotulo} className={cx('lp-nav-sub-grp', aberto && 'lp-sub-open', grupoAtivo(filho) && 'lp-has-active')}>\r\n <button\r\n type=\"button\"\r\n className={cx('lp-nav-sub lp-nav-sub-parent', filho.desabilitado && 'lp-is-disabled')}\r\n disabled={filho.desabilitado}\r\n aria-expanded={aberto}\r\n onClick={() => alternarGrupo(chave)}\r\n >\r\n <span className=\"lp-nav-sub-ic\">\r\n <Icone icone={filho.icone ?? 'folder'} />\r\n </span>\r\n <span className=\"lp-nav-sub-tx\">{filho.rotulo}</span>\r\n <Icone icone=\"chevron-down\" className=\"lp-nav-ch lp-nav-ch--gira\" />\r\n </button>\r\n {aberto && (\r\n <div className=\"lp-nav-sub-netos\" role=\"group\" aria-label={filho.rotulo}>\r\n {renderFilhos(filho.filhos, chave)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n });\r\n\r\n const itensBusca = useMemo(() => achatar(nav), [nav]);\r\n const itemAside = useMemo(() => {\r\n for (const s of nav) for (const i of s.itens) if (i.rotulo === aside && i.filhos) return i;\r\n return null;\r\n }, [nav, aside]);\r\n\r\n const naoLidas = notificacoes?.filter((n) => n.naoLida).length ?? 0;\r\n const temDev = menuDesenvolvimento.length > 0;\r\n const densidadeAtual = DENSIDADES.find((d) => d.valor === prefs?.densidade) ?? DENSIDADES[1];\r\n\r\n const alternarMenu = (m: Exclude<Menu, null>) => setMenu((atual) => (atual === m ? null : m));\r\n const escolher = (fn?: (id: string) => void) => (id: string) => {\r\n setMenu(null);\r\n fn?.(id);\r\n };\r\n\r\n const avatar = usuario && (\r\n <Avatar className=\"lp-avatar-topo\" tom=\"escuro\" tamanho=\"1.875rem\" nome={usuario.nome} foto={usuario.foto} iniciais={usuario.iniciais} />\r\n );\r\n\r\n const cabecalhoUsuario = usuario && (\r\n <div className=\"lp-tb-menu-head\">\r\n {avatar}\r\n <div className=\"lp-tb-menu-head-tx\">\r\n <div className=\"lp-profile-name\">{usuario.nome}</div>\r\n {usuario.cargo && <div className=\"lp-profile-role\">{usuario.cargo}</div>}\r\n </div>\r\n </div>\r\n );\r\n\r\n const menuDensidade = prefs && (\r\n <>\r\n {DENSIDADES.map((d) => (\r\n <button\r\n key={d.valor}\r\n type=\"button\"\r\n className={cx('lp-tb-menu-item', prefs.densidade === d.valor && 'lp-active')}\r\n aria-pressed={prefs.densidade === d.valor}\r\n onClick={() => prefs.definirDensidade(d.valor)}\r\n >\r\n <Icone icone={d.icone} />\r\n <span>{d.rotulo}</span>\r\n {prefs.densidade === d.valor && <Icone icone=\"check\" className=\"lp-tb-menu-check\" />}\r\n </button>\r\n ))}\r\n </>\r\n );\r\n\r\n const buscaPadrao =\r\n busca === undefined ? (\r\n <Busca placeholder={placeholderBusca} itensMenu={itensBusca} aoNavegar={aoNavegar} aoBuscar={aoBuscar} />\r\n ) : (\r\n busca || null\r\n );\r\n\r\n return (\r\n <div className=\"lp-estrutura\">\r\n <div className={cx('lp-layout', expandida && 'lp-sidebar-expanded', estreito && 'lp-vp-narrow', movel && 'lp-vp-mobile')}>\r\n <a\r\n className=\"lp-skip-link\"\r\n href={`#${idConteudo}`}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n conteudoRef.current?.focus();\r\n }}\r\n >\r\n Pular para o conteúdo\r\n </a>\r\n {estreito && expandida && <div className=\"lp-sidebar-backdrop\" aria-hidden=\"true\" onClick={() => setExpandida(false)} />}\r\n\r\n {/* ===== SIDEBAR ===== */}\r\n <aside className=\"lp-sidebar\" ref={sidebarRef}>\r\n {ambiente?.rotulo && (\r\n <div className=\"lp-amb\" data-sev={ambiente.severidade ?? 'warn'} title={ambiente.rotulo}>\r\n <span className=\"lp-sr\">Ambiente:</span>\r\n <span className=\"lp-amb-completo\">{ambiente.rotulo}</span>\r\n <span className=\"lp-amb-sigla\" aria-hidden=\"true\">\r\n {ambiente.sigla ?? ambiente.rotulo.slice(0, 3)}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"lp-sidebar-head\">\r\n <a\r\n className=\"lp-brand-logo\"\r\n href={marca.href ?? '/'}\r\n aria-label={marca.nome}\r\n onClick={(e) => {\r\n if (aoNavegar) {\r\n e.preventDefault();\r\n aoNavegar(marca.href ?? '/');\r\n }\r\n }}\r\n >\r\n {marca.logo && logoOk ? (\r\n <img className=\"lp-brand-img\" src={marca.logo} alt=\"\" onError={() => setLogoOk(false)} />\r\n ) : (\r\n <Icone icone=\"shield\" />\r\n )}\r\n </a>\r\n <span className=\"lp-brand-name\">\r\n <b>{marca.nome}</b>\r\n {marca.subtitulo && <span>{marca.subtitulo}</span>}\r\n </span>\r\n <Dica texto={expandida ? 'Recolher menu' : 'Expandir menu'}>\r\n <button\r\n type=\"button\"\r\n className=\"lp-ham\"\r\n onClick={alternarSidebar}\r\n aria-label={expandida ? 'Recolher menu' : 'Expandir menu'}\r\n aria-expanded={expandida}\r\n >\r\n <Icone icone=\"chevrons-left\" />\r\n </button>\r\n </Dica>\r\n </div>\r\n\r\n <div className=\"lp-sidebar-divline\" />\r\n\r\n <nav className=\"lp-sidebar-nav\" aria-label=\"Menu principal\" onScroll={!expandida && aside ? fecharAside : undefined}>\r\n {nav.map((sec, si) => (\r\n <Fragment key={si}>\r\n {sec.rotulo && (\r\n <div className=\"lp-sidebar-grp\">\r\n <span>{sec.rotulo}</span>\r\n <span className=\"lp-sidebar-grp-ln\" />\r\n </div>\r\n )}\r\n <div className=\"lp-sidebar-items\">\r\n {sec.itens.map((item) =>\r\n !item.filhos ? (\r\n <Dica key={item.rotulo} texto={expandida ? undefined : item.rotulo} posicao=\"direita\" atraso={150}>\r\n {link(\r\n item,\r\n 'lp-nav-it',\r\n <>\r\n <span className=\"lp-nav-tile\">\r\n <Icone icone={item.icone ?? 'circle'} />\r\n </span>\r\n <span className=\"lp-nav-tx\">{item.rotulo}</span>\r\n </>,\r\n )}\r\n </Dica>\r\n ) : (\r\n emLinha ? (\r\n <div\r\n key={item.rotulo}\r\n className={cx('lp-nav-group', subAbertos.has(item.rotulo) && 'lp-grupo-aberto', grupoAtivo(item) && 'lp-has-active')}\r\n >\r\n <button\r\n type=\"button\"\r\n className={cx('lp-nav-it lp-nav-parent', item.desabilitado && 'lp-is-disabled')}\r\n disabled={item.desabilitado}\r\n aria-expanded={subAbertos.has(item.rotulo)}\r\n onClick={() => alternarGrupo(item.rotulo)}\r\n >\r\n <span className=\"lp-nav-tile\">\r\n <Icone icone={item.icone ?? 'folder'} />\r\n </span>\r\n <span className=\"lp-nav-tx\">{item.rotulo}</span>\r\n <Icone icone=\"chevron-down\" className=\"lp-nav-ch lp-nav-ch--gira\" />\r\n </button>\r\n {subAbertos.has(item.rotulo) && (\r\n <div className=\"lp-nav-filhos\" role=\"group\" aria-label={item.rotulo}>\r\n {renderFilhos(item.filhos, item.rotulo)}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div\r\n key={item.rotulo}\r\n className={cx('lp-nav-group', aside === item.rotulo && 'lp-aside-on', grupoAtivo(item) && 'lp-has-active')}\r\n >\r\n <button\r\n type=\"button\"\r\n className={cx('lp-nav-it lp-nav-parent', item.desabilitado && 'lp-is-disabled')}\r\n disabled={item.desabilitado}\r\n aria-expanded={aside === item.rotulo}\r\n onClick={(e) => {\r\n setAsideTopo(e.currentTarget.getBoundingClientRect().top);\r\n setAside((a) => (a === item.rotulo ? null : item.rotulo));\r\n }}\r\n >\r\n <span className=\"lp-nav-tile\">\r\n <Icone icone={item.icone ?? 'folder'} />\r\n </span>\r\n <span className=\"lp-nav-tx\">{item.rotulo}</span>\r\n <Icone icone=\"chevron-right\" className=\"lp-nav-ch\" />\r\n </button>\r\n </div>\r\n )\r\n ),\r\n )}\r\n </div>\r\n </Fragment>\r\n ))}\r\n </nav>\r\n\r\n {(rodapeSidebar || versao) && (\r\n <div className=\"lp-sidebar-foot\">\r\n <div className=\"lp-sidebar-divline\" />\r\n {rodapeSidebar && <div className=\"lp-sidebar-rodape\">{rodapeSidebar}</div>}\r\n {versao && (\r\n <span className=\"lp-versao\">\r\n <span className=\"lp-sr\">Versão do sistema:</span>\r\n {versao}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </aside>\r\n\r\n {/* ===== PAINEL DE SUBMENU ===== */}\r\n {itemAside && (\r\n <div\r\n className={cx('lp-sidebar-aside', !expandida && 'lp-aside--flutuante')}\r\n ref={asideRef}\r\n role=\"region\"\r\n aria-label={`Submenu ${itemAside.rotulo}`}\r\n style={!expandida ? ({ '--aside-topo': `${Math.max(8, Math.min(asideTopo, window.innerHeight - 320))}px` } as CSSProperties) : undefined}\r\n >\r\n <div className=\"lp-aside-head\">\r\n <span className=\"lp-aside-ic\">\r\n <Icone icone={itemAside.icone ?? 'folder'} />\r\n </span>\r\n <span className=\"lp-aside-ttl\">{itemAside.rotulo}</span>\r\n <button type=\"button\" className=\"lp-aside-x\" aria-label=\"Fechar submenu\" title=\"Fechar\" onClick={() => setAside(null)}>\r\n <Icone icone=\"x\" />\r\n </button>\r\n </div>\r\n <div className=\"lp-aside-corpo\">\r\n {itemAside.filhos!.map((filho) => {\r\n if (!filho.filhos?.length) {\r\n return (\r\n <Fragment key={filho.rotulo}>\r\n {link(\r\n filho,\r\n 'lp-nav-sub',\r\n <>\r\n <span className=\"lp-nav-sub-ic\">\r\n <Icone icone={filho.icone ?? 'chevron-right'} />\r\n </span>\r\n <span className=\"lp-nav-sub-tx\">{filho.rotulo}</span>\r\n </>,\r\n )}\r\n </Fragment>\r\n );\r\n }\r\n const chave = `${itemAside.rotulo}›${filho.rotulo}`;\r\n const aberto = subAbertos.has(chave) || grupoAtivo(filho);\r\n return (\r\n <div key={filho.rotulo} className={cx('lp-nav-sub-grp', aberto && 'lp-sub-open', grupoAtivo(filho) && 'lp-has-active')}>\r\n <button\r\n type=\"button\"\r\n className={cx('lp-nav-sub lp-nav-sub-parent', filho.desabilitado && 'lp-is-disabled')}\r\n disabled={filho.desabilitado}\r\n aria-expanded={aberto}\r\n onClick={() =>\r\n setSubAbertos((s) => {\r\n const n = new Set(s);\r\n if (n.has(chave)) n.delete(chave);\r\n else n.add(chave);\r\n return n;\r\n })\r\n }\r\n >\r\n <span className=\"lp-nav-sub-ic\">\r\n <Icone icone={filho.icone ?? 'folder'} />\r\n </span>\r\n <span className=\"lp-nav-sub-tx\">{filho.rotulo}</span>\r\n <Icone icone={aberto ? 'chevron-up' : 'chevron-down'} className=\"lp-nav-ch\" />\r\n </button>\r\n {aberto && (\r\n <div className=\"lp-nav-sub-netos\" role=\"group\" aria-label={filho.rotulo}>\r\n {filho.filhos.map((neto) => (\r\n <Fragment key={neto.rotulo}>\r\n {link(\r\n neto,\r\n 'lp-nav-sub lp-nav-sub-neto',\r\n <>\r\n <span className=\"lp-nav-sub-ic\">\r\n <Icone icone={neto.icone ?? 'chevron-right'} />\r\n </span>\r\n <span className=\"lp-nav-sub-tx\">{neto.rotulo}</span>\r\n </>,\r\n )}\r\n </Fragment>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ===== MAIN ===== */}\r\n <div className=\"lp-main\">\r\n <header className=\"lp-topbar\">\r\n {movel && (\r\n <button type=\"button\" className=\"lp-tb-icon\" onClick={alternarSidebar} aria-label=\"Abrir menu\" aria-expanded={expandida}>\r\n <Icone icone=\"menu\" />\r\n </button>\r\n )}\r\n {!expandida && (\r\n <span className=\"lp-tb-system\">\r\n <b>{marca.nome}</b>\r\n {marca.subtitulo && <span>{marca.subtitulo}</span>}\r\n </span>\r\n )}\r\n\r\n {!movel && buscaPadrao}\r\n\r\n <div className=\"lp-tb-right\" ref={direitaRef}>\r\n {!movel && (\r\n <>\r\n {complementosTopbar}\r\n {prefs && (\r\n <div className=\"lp-tb-menu-wrap\">\r\n <Dica texto={`Densidade: ${densidadeAtual.rotulo}`}>\r\n <button\r\n type=\"button\"\r\n className={cx('lp-tb-icon', menu === 'densidade' && 'lp-menu-open')}\r\n aria-expanded={menu === 'densidade'}\r\n aria-label={`Densidade: ${densidadeAtual.rotulo}`}\r\n onClick={() => alternarMenu('densidade')}\r\n >\r\n <Icone icone={densidadeAtual.icone} />\r\n </button>\r\n </Dica>\r\n {menu === 'densidade' && (\r\n <div className=\"lp-tb-menu\" role=\"group\" aria-label=\"Densidade\">\r\n <div className=\"lp-tb-menu-ttl\">Densidade</div>\r\n {menuDensidade}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {temDev && (\r\n <div className=\"lp-tb-menu-wrap\">\r\n <Dica texto=\"Desenvolvimento\">\r\n <button\r\n type=\"button\"\r\n className={cx('lp-tb-icon', menu === 'dev' && 'lp-menu-open')}\r\n aria-expanded={menu === 'dev'}\r\n aria-label=\"Desenvolvimento\"\r\n onClick={() => alternarMenu('dev')}\r\n >\r\n <Icone icone=\"code\" />\r\n </button>\r\n </Dica>\r\n {menu === 'dev' && (\r\n <div className=\"lp-tb-menu\" role=\"group\" aria-label=\"Desenvolvimento\">\r\n <ItensMenu itens={menuDesenvolvimento} aoEscolher={escolher(aoEscolherMenuDesenvolvimento)} />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {prefs && (\r\n <Dica texto={prefs.escuro ? 'Tema claro' : 'Tema escuro'}>\r\n <button\r\n type=\"button\"\r\n className=\"lp-tb-icon\"\r\n aria-label={prefs.escuro ? 'Tema claro' : 'Tema escuro'}\r\n onClick={prefs.alternarTema}\r\n >\r\n <Icone icone={prefs.escuro ? 'sun' : 'moon'} />\r\n </button>\r\n </Dica>\r\n )}\r\n </>\r\n )}\r\n\r\n {notificacoes && (\r\n <div className=\"lp-tb-menu-wrap\">\r\n <Dica texto=\"Notificações\">\r\n <button\r\n type=\"button\"\r\n className={cx('lp-tb-icon lp-tb-bell', menu === 'sino' && 'lp-menu-open')}\r\n aria-expanded={menu === 'sino'}\r\n aria-label={naoLidas ? `Notificações: ${naoLidas} não lida(s)` : 'Notificações'}\r\n onClick={() => alternarMenu('sino')}\r\n >\r\n <Icone icone=\"bell\" />\r\n {naoLidas > 0 && <span className=\"lp-bell-dot\" aria-hidden=\"true\" />}\r\n </button>\r\n </Dica>\r\n {menu === 'sino' && (\r\n <div className=\"lp-tb-menu lp-tb-menu-notif\" role=\"group\" aria-label=\"Notificações\">\r\n <div className=\"lp-tb-menu-ttl\">\r\n <span>Notificações</span>\r\n {naoLidas > 0 && <span className=\"lp-notif-count\">{naoLidas} não lida(s)</span>}\r\n </div>\r\n {notificacoes.length ? (\r\n notificacoes.map((n) => (\r\n <button\r\n key={n.id}\r\n type=\"button\"\r\n className={cx('lp-tb-menu-item lp-notif-item', n.naoLida && 'lp-unread')}\r\n onClick={() => escolher(aoEscolherNotificacao)(n.id)}\r\n >\r\n <span className=\"lp-notif-ic\">\r\n <Icone icone={n.icone ?? 'bell'} />\r\n </span>\r\n <span className=\"lp-notif-tx\">\r\n <span className=\"lp-notif-ttl\">{n.titulo}</span>\r\n {n.descricao && <span className=\"lp-notif-desc\">{n.descricao}</span>}\r\n {n.tempo && <span className=\"lp-notif-time\">{n.tempo}</span>}\r\n </span>\r\n {n.naoLida && <span className=\"lp-notif-dot\" aria-hidden=\"true\" />}\r\n </button>\r\n ))\r\n ) : (\r\n <p className=\"lp-notif-empty\">\r\n <Icone icone=\"circle-check\" />\r\n Tudo em dia — sem notificações.\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {usuario &&\r\n (!movel ? (\r\n <>\r\n <span className=\"lp-tb-divider\" />\r\n <div className=\"lp-tb-menu-wrap\">\r\n <button\r\n type=\"button\"\r\n className={cx('lp-profile', !menuUsuario.length && 'lp-no-menu')}\r\n aria-expanded={menuUsuario.length ? menu === 'usuario' : undefined}\r\n aria-label={`Usuário: ${usuario.nome}`}\r\n onClick={() => menuUsuario.length && alternarMenu('usuario')}\r\n >\r\n {avatar}\r\n <div className=\"lp-profile-info\">\r\n <div className=\"lp-profile-name\">{usuario.nome}</div>\r\n {usuario.cargo && <div className=\"lp-profile-role\">{usuario.cargo}</div>}\r\n </div>\r\n {menuUsuario.length > 0 && (\r\n <Icone icone=\"chevron-down\" className={cx('lp-profile-caret', menu === 'usuario' && 'lp-caret-open')} />\r\n )}\r\n </button>\r\n {menu === 'usuario' && (\r\n <div className=\"lp-tb-menu lp-tb-menu-user\" role=\"group\" aria-label=\"Menu do usuário\">\r\n {cabecalhoUsuario}\r\n <ItensMenu itens={menuUsuario} aoEscolher={escolher(aoEscolherMenuUsuario)} />\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"lp-tb-menu-wrap\">\r\n <button\r\n type=\"button\"\r\n className=\"lp-profile\"\r\n aria-expanded={menu === 'compacto'}\r\n aria-label={`Conta e preferências: ${usuario.nome}`}\r\n onClick={() => alternarMenu('compacto')}\r\n >\r\n {avatar}\r\n </button>\r\n {menu === 'compacto' && (\r\n <div className=\"lp-tb-menu lp-tb-menu-compact\" role=\"group\" aria-label=\"Conta e preferências\">\r\n {cabecalhoUsuario}\r\n {aoBuscar && (\r\n <div className=\"lp-cm-search\" role=\"search\">\r\n <Icone icone=\"search\" />\r\n <input\r\n type=\"search\"\r\n className=\"lp-cm-search-input\"\r\n placeholder={placeholderBusca}\r\n aria-label=\"Busca global\"\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n aoBuscar(e.currentTarget.value.trim());\r\n setMenu(null);\r\n }\r\n }}\r\n />\r\n </div>\r\n )}\r\n {prefs && (\r\n <>\r\n <div className=\"lp-tb-menu-ttl\">Aparência</div>\r\n <button type=\"button\" className=\"lp-tb-menu-item\" onClick={prefs.alternarTema}>\r\n <Icone icone={prefs.escuro ? 'sun' : 'moon'} />\r\n <span>{prefs.escuro ? 'Tema claro' : 'Tema escuro'}</span>\r\n </button>\r\n </>\r\n )}\r\n {temDev && (\r\n <>\r\n <div className=\"lp-tb-menu-ttl\">Desenvolvimento</div>\r\n <ItensMenu itens={menuDesenvolvimento} aoEscolher={escolher(aoEscolherMenuDesenvolvimento)} />\r\n </>\r\n )}\r\n {prefs && (\r\n <>\r\n <div className=\"lp-tb-menu-ttl\">Densidade</div>\r\n {menuDensidade}\r\n </>\r\n )}\r\n {menuUsuario.length > 0 && (\r\n <>\r\n <div className=\"lp-tb-menu-ln\" aria-hidden=\"true\" />\r\n <ItensMenu itens={menuUsuario} aoEscolher={escolher(aoEscolherMenuUsuario)} />\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </header>\r\n\r\n <main className=\"lp-content\" id={idConteudo} ref={conteudoRef} tabIndex={-1}>\r\n <div className=\"lp-content-inner\">\r\n <ProvedorTrilha value={trilha}>{children}</ProvedorTrilha>\r\n </div>\r\n </main>\r\n {rodape && <footer className=\"lp-rodape\">{rodape}</footer>}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { Trilha, type ItemTrilha } from '../Trilha/Trilha';\r\nimport './CabecalhoPagina.css';\r\n\r\nexport interface CabecalhoPaginaProps {\r\n titulo: string;\r\n icone?: IconeProp;\r\n /** Linha pequena em caixa alta acima do título. */\r\n categoria?: string;\r\n /**\r\n * Trilha de navegação logo abaixo do título. `true` = caminho automático do\r\n * menu (via `Estrutura`); lista = automático + estes passos no fim (ex.: o\r\n * registro aberto).\r\n */\r\n trilha?: boolean | ItemTrilha[];\r\n /** Botões à direita do título. */\r\n acoes?: ReactNode;\r\n /** Texto descritivo abaixo. */\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function CabecalhoPagina({ titulo, icone, categoria, trilha, acoes, children, className }: CabecalhoPaginaProps) {\r\n return (\r\n <header className={cx('lp-cab', className)}>\r\n <div className=\"lp-cab-topo\">\r\n {icone && (\r\n <span className=\"lp-cab-tile\">\r\n <Icone icone={icone} />\r\n </span>\r\n )}\r\n <div className=\"lp-cab-titulos\">\r\n {categoria && <p className=\"lp-cab-categoria\">{categoria}</p>}\r\n <h1 className=\"lp-cab-titulo\">{titulo}</h1>\r\n {trilha && <Trilha extras={Array.isArray(trilha) ? trilha : undefined} className=\"lp-cab-trilha\" />}\r\n </div>\r\n {acoes && <div className=\"lp-cab-acoes\">{acoes}</div>}\r\n </div>\r\n {children && <div className=\"lp-cab-descricao\">{children}</div>}\r\n </header>\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { useState, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { nomeCurto, saudacaoPorHora } from '../../utils/texto';\r\nimport { Avatar } from '../Avatar/Avatar';\r\nimport './BoasVindas.css';\r\n\r\nexport interface BoasVindasProps {\r\n /** Nome completo (a saudação usa primeiro + último). */\r\n nome: string;\r\n cargo?: string;\r\n /** Sigla da unidade (ex.: RH). */\r\n sigla?: string;\r\n foto?: string;\r\n /** Último acesso; sem ele a linha some. */\r\n ultimoAcesso?: Date | null;\r\n /** Ações da página inicial (ex.: \"Novo cadastro\"). */\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst DATA_EXTENSO = new Intl.DateTimeFormat('pt-BR', { dateStyle: 'full' });\r\nconst DATA = new Intl.DateTimeFormat('pt-BR', { dateStyle: 'short' });\r\nconst HORA = new Intl.DateTimeFormat('pt-BR', { timeStyle: 'short' });\r\n\r\n/**\r\n * Cabeçalho de sessão da página inicial: foto, data por extenso, saudação\r\n * pela hora, cargo · unidade e último acesso. Substitui o `CabecalhoPagina` na home.\r\n */\r\nexport function BoasVindas({ nome, cargo, sigla, foto, ultimoAcesso, children, className }: BoasVindasProps) {\r\n // congelados no primeiro render: a página não fica aberta virando a hora\r\n const [agora] = useState(() => new Date());\r\n const cargoLinha = [cargo, sigla].filter(Boolean).join(' · ');\r\n const hoje = DATA_EXTENSO.format(agora);\r\n\r\n return (\r\n <header className={cx('lp-bv', className)}>\r\n <Avatar nome={nome} foto={foto} tom=\"escuro\" tamanho=\"3.5rem\" />\r\n <div className=\"lp-bv-txt\">\r\n <span className=\"lp-bv-data\">{hoje.charAt(0).toUpperCase() + hoje.slice(1)}</span>\r\n <h1 className=\"lp-bv-saudacao\">\r\n {saudacaoPorHora(agora)}, {nomeCurto(nome).split(' ')[0]}\r\n </h1>\r\n {cargoLinha && <span className=\"lp-bv-cargo\">{cargoLinha}</span>}\r\n {ultimoAcesso && (\r\n <span className=\"lp-bv-acesso\">\r\n <Icone icone=\"clock\" />\r\n Último acesso em {DATA.format(ultimoAcesso)} às {HORA.format(ultimoAcesso)}\r\n </span>\r\n )}\r\n </div>\r\n {children && <div className=\"lp-bv-acoes\">{children}</div>}\r\n </header>\r\n );\r\n}\r\n","import { useState, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport type { Severidade } from '../../utils/tipos';\r\nimport './Alerta.css';\r\n\r\n/** Cores do alerta: as severidades + `pri` (azul de ação) e `destaque` (laranja da marca). */\r\nexport type CorAlerta = Severidade | 'pri' | 'destaque';\r\n\r\nexport type AparenciaAlerta = 'suave' | 'solido' | 'contorno' | 'destaque' | 'faixa' | 'cartao';\r\n\r\nconst ICONES: Record<CorAlerta, string> = {\r\n pri: 'info',\r\n destaque: 'circle-alert',\r\n ok: 'circle-check',\r\n info: 'info',\r\n warn: 'triangle-alert',\r\n err: 'circle-x',\r\n neutral: 'info',\r\n};\r\n\r\nexport interface AlertaProps {\r\n severidade?: CorAlerta;\r\n /**\r\n * `suave` (padrão) = fundo claro · `solido` = fundo cheio · `contorno` =\r\n * só a borda · `destaque` = fundo neutro com filete lateral colorido ·\r\n * `faixa` = título numa faixa sólida sobre o texto · `cartao` = bloco\r\n * centralizado com ícone grande (avisos de página, confirmações).\r\n */\r\n aparencia?: AparenciaAlerta;\r\n /** `pilula` = cantos totalmente arredondados. */\r\n formato?: 'padrao' | 'pilula';\r\n sombra?: 'pequena' | 'media' | 'grande';\r\n /** Linha em negrito acima da mensagem. */\r\n titulo?: ReactNode;\r\n mensagem?: ReactNode;\r\n children?: ReactNode;\r\n /** Ícone da severidade por padrão; outro ícone, ou `false` para nenhum. */\r\n icone?: IconeProp | false;\r\n /** Imagem/avatar no lugar do ícone. */\r\n midia?: ReactNode;\r\n /** Botões ou links. */\r\n acoes?: ReactNode;\r\n /** `lado` = à direita da mensagem (padrão) · `abaixo` = sob o texto. */\r\n posicaoAcoes?: 'lado' | 'abaixo';\r\n /** Mostra o \"×\" e some ao clicar (sem controle externo). */\r\n dispensavel?: boolean;\r\n /** Mostra o \"×\" e avisa o app (que decide se o alerta sai da tela). */\r\n aoFechar?: () => void;\r\n /** `circulo` = \"×\" num círculo sólido da cor do alerta. */\r\n botaoFechar?: 'simples' | 'circulo';\r\n className?: string;\r\n}\r\n\r\nexport function Alerta({\r\n severidade = 'info',\r\n aparencia = 'suave',\r\n formato = 'padrao',\r\n sombra,\r\n titulo,\r\n mensagem,\r\n children,\r\n icone,\r\n midia,\r\n acoes,\r\n posicaoAcoes,\r\n dispensavel = false,\r\n aoFechar,\r\n botaoFechar = 'simples',\r\n className,\r\n}: AlertaProps) {\r\n const [fechado, setFechado] = useState(false);\r\n if (fechado) return null;\r\n\r\n const cartao = aparencia === 'cartao';\r\n const faixa = aparencia === 'faixa';\r\n const comFechar = dispensavel || !!aoFechar;\r\n const iconeFinal = icone === false ? null : (icone ?? ICONES[severidade]);\r\n const acoesAbaixo = (posicaoAcoes ?? (cartao || titulo ? 'abaixo' : 'lado')) === 'abaixo';\r\n\r\n const fechar = () => {\r\n aoFechar?.();\r\n if (dispensavel) setFechado(true);\r\n };\r\n const botaoX = comFechar && (\r\n <button type=\"button\" className={cx('lp-alerta-fechar', botaoFechar === 'circulo' && 'lp-alerta-fechar--circulo')} aria-label=\"Fechar alerta\" onClick={fechar}>\r\n <Icone icone=\"x\" />\r\n </button>\r\n );\r\n\r\n const texto = (mensagem || children) && (\r\n <span className=\"lp-alerta-txt\">\r\n {mensagem}\r\n {children}\r\n </span>\r\n );\r\n const blocoAcoes = acoes && <span className={cx('lp-alerta-acoes', acoesAbaixo && 'lp-alerta-acoes--abaixo')}>{acoes}</span>;\r\n\r\n const classes = cx(\r\n 'lp-alerta',\r\n `lp-alerta--${aparencia}`,\r\n formato === 'pilula' && 'lp-alerta--pilula',\r\n sombra && `lp-alerta--sombra-${sombra}`,\r\n !!titulo && 'tem-titulo',\r\n comFechar && 'tem-fechar',\r\n className,\r\n );\r\n const papel = severidade === 'err' ? 'alert' : 'status';\r\n\r\n if (faixa) {\r\n return (\r\n <div className={classes} data-cor={severidade} role={papel}>\r\n <div className=\"lp-alerta-faixa\">\r\n {iconeFinal && <Icone icone={iconeFinal} className=\"lp-alerta-ic\" />}\r\n <span className=\"lp-alerta-tit\">{titulo}</span>\r\n {botaoX}\r\n </div>\r\n <div className=\"lp-alerta-corpo\">\r\n {texto}\r\n {blocoAcoes}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={classes} data-cor={severidade} role={papel}>\r\n <span className=\"lp-alerta-msg\">\r\n {midia ? <span className=\"lp-alerta-midia\">{midia}</span> : iconeFinal && <Icone icone={iconeFinal} className=\"lp-alerta-ic\" />}\r\n <span className=\"lp-alerta-conteudo\">\r\n {titulo && <span className=\"lp-alerta-tit\">{titulo}</span>}\r\n {texto}\r\n {acoesAbaixo && blocoAcoes}\r\n </span>\r\n </span>\r\n {!acoesAbaixo && blocoAcoes}\r\n {botaoX}\r\n </div>\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { createContext, useContext, useId, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport './Campo.css';\r\n\r\n/** Props comuns a todo campo de formulário. */\r\nexport interface CampoBaseProps {\r\n rotulo?: string;\r\n /** Texto de ajuda abaixo do campo. */\r\n dica?: string;\r\n /** Mensagem de erro (pinta o campo de vermelho). */\r\n erro?: string;\r\n /** Aviso não-bloqueante (âmbar). */\r\n aviso?: string;\r\n obrigatorio?: boolean;\r\n /** `campo` = rótulo em cima · `inline` = pílula com rótulo dentro (barras de filtro). */\r\n variante?: 'campo' | 'inline';\r\n className?: string;\r\n}\r\n\r\nexport interface CampoProps extends CampoBaseProps {\r\n htmlFor?: string;\r\n msgId?: string;\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * Contador de \"tentativas de salvar\" do formulário em volta. O `Form` o\r\n * incrementa a cada envio; acima de zero, todo campo revela sua pendência\r\n * mesmo sem ter sido tocado.\r\n */\r\nexport const RevelarCamposCtx = createContext(0);\r\n\r\nexport const MSG_OBRIGATORIO = 'Campo obrigatório';\r\n\r\ninterface OpcoesValidacao {\r\n valor: string;\r\n /** Regra de formato do campo: mensagem, ou `''` se válido. */\r\n validar?: (valor: string) => string;\r\n obrigatorio?: boolean;\r\n /** Erro vindo do app — sempre vence. */\r\n erro?: string;\r\n aviso?: string;\r\n}\r\n\r\n/**\r\n * Regra de exibição de pendência:\r\n * - o erro só aparece ao SAIR do campo depois de o usuário mexer nele, ou\r\n * quando o formulário tenta salvar;\r\n * - um valor recebido de fora (carga de registro) que não atende ao formato\r\n * NÃO é reformatado nem recusado: vira aviso âmbar não bloqueante.\r\n */\r\nexport function useValidacaoCampo({ valor, validar, obrigatorio, erro, aviso }: OpcoesValidacao) {\r\n const tentativas = useContext(RevelarCamposCtx);\r\n const [mexido, setMexido] = useState(false);\r\n const [revelado, setRevelado] = useState(false);\r\n\r\n const vazio = !valor?.trim();\r\n const formato = !vazio && validar ? validar(valor) : '';\r\n const visivel = revelado || tentativas > 0;\r\n\r\n let erroFinal = erro;\r\n let avisoFinal = aviso;\r\n if (!erroFinal) {\r\n if (vazio && obrigatorio && visivel) erroFinal = MSG_OBRIGATORIO;\r\n else if (formato && mexido && visivel) erroFinal = formato;\r\n else if (formato && !mexido && !avisoFinal) avisoFinal = `${formato}. O valor será mantido como está.`;\r\n }\r\n\r\n return {\r\n erro: erroFinal || undefined,\r\n aviso: avisoFinal || undefined,\r\n /** Chame no evento de digitação/gesto real do usuário. */\r\n aoInteragir: () => setMexido(true),\r\n /** Chame no blur do controle. */\r\n aoSair: () => mexido && setRevelado(true),\r\n };\r\n}\r\n\r\n/** Ids estáveis do campo e da mensagem associada (aria-describedby). */\r\nexport function useCampoIds(idExterno?: string) {\r\n const gerado = useId();\r\n const id = idExterno ?? `lp-${gerado.replace(/:/g, '')}`;\r\n return { id, msgId: `${id}-msg` };\r\n}\r\n\r\nexport function descricaoDe(p: Pick<CampoBaseProps, 'erro' | 'aviso' | 'dica'>, msgId: string) {\r\n return p.erro || p.aviso || p.dica ? msgId : undefined;\r\n}\r\n\r\n/**\r\n * Moldura de campo: rótulo, asterisco de obrigatório, erro/aviso/dica.\r\n * Envolve qualquer controle — os campos da biblioteca já a usam por dentro.\r\n */\r\nexport function Campo({\r\n rotulo,\r\n dica,\r\n erro,\r\n aviso,\r\n obrigatorio,\r\n variante = 'campo',\r\n className,\r\n htmlFor,\r\n msgId,\r\n children,\r\n}: CampoProps) {\r\n const inline = variante === 'inline';\r\n const rotuloRef = useRef<HTMLLabelElement>(null);\r\n const [rotuloW, setRotuloW] = useState(0);\r\n\r\n // no inline o rótulo é sobreposto: o valor recua a largura medida dele\r\n useLayoutEffect(() => {\r\n if (!inline || !rotuloRef.current) return;\r\n const el = rotuloRef.current;\r\n const medir = () => setRotuloW(el.offsetWidth);\r\n medir();\r\n const ro = new ResizeObserver(medir);\r\n ro.observe(el);\r\n return () => ro.disconnect();\r\n }, [inline, rotulo]);\r\n\r\n const estilo = inline ? ({ '--rotulo-w': `${rotuloW}px` } as CSSProperties) : undefined;\r\n\r\n return (\r\n <div\r\n className={cx('lp-campo', inline && 'lp-campo--inline', inline && erro && 'is-invalid', className)}\r\n style={estilo}\r\n title={inline ? erro || aviso || undefined : undefined}\r\n >\r\n {rotulo &&\r\n (inline ? (\r\n <label ref={rotuloRef} className=\"lp-campo-rotulo-inline\" htmlFor={htmlFor}>\r\n {rotulo}\r\n {obrigatorio && <span className=\"lp-campo-req\" aria-hidden=\"true\">*</span>}:\r\n </label>\r\n ) : (\r\n <label className=\"lp-campo-rotulo\" htmlFor={htmlFor}>\r\n <span className=\"lp-campo-rotulo-txt\">{rotulo}</span>\r\n {obrigatorio && <span className=\"lp-campo-req\" aria-hidden=\"true\">*</span>}\r\n </label>\r\n ))}\r\n\r\n <div className=\"lp-campo-ctl\">{children}</div>\r\n\r\n {inline ? (\r\n erro ? (\r\n <>\r\n <Icone icone=\"circle-alert\" className=\"lp-campo-ic-err\" />\r\n <span className=\"lp-sr\" role=\"alert\" id={msgId}>{erro}</span>\r\n </>\r\n ) : aviso ? (\r\n <>\r\n <Icone icone=\"triangle-alert\" className=\"lp-campo-ic-aviso\" />\r\n <span className=\"lp-sr\" id={msgId}>{aviso}</span>\r\n </>\r\n ) : dica ? (\r\n <span className=\"lp-sr\" id={msgId}>{dica}</span>\r\n ) : null\r\n ) : erro ? (\r\n <span className=\"lp-campo-msg lp-campo-msg--err\" role=\"alert\" id={msgId}>{erro}</span>\r\n ) : aviso ? (\r\n <span className=\"lp-campo-msg lp-campo-msg--aviso\" id={msgId}>\r\n <Icone icone=\"triangle-alert\" />\r\n <span>{aviso}</span>\r\n </span>\r\n ) : dica ? (\r\n <span className=\"lp-campo-msg lp-campo-msg--dica\" id={msgId}>{dica}</span>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","import type { InputHTMLAttributes } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { useCampoIds } from '../Campo/Campo';\r\nimport './CampoMarcacao.css';\r\n\r\nexport interface CampoMarcacaoProps\r\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'checked' | 'defaultChecked' | 'className' | 'value'> {\r\n rotulo?: string;\r\n valor?: boolean;\r\n aoMudar?: (valor: boolean) => void;\r\n /** `caixa` = checkbox · `chave` = interruptor (switch). */\r\n aparencia?: 'caixa' | 'chave';\r\n dica?: string;\r\n erro?: string;\r\n obrigatorio?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport function CampoMarcacao({\r\n rotulo,\r\n valor,\r\n aoMudar,\r\n aparencia = 'caixa',\r\n dica,\r\n erro,\r\n obrigatorio,\r\n className,\r\n id: idExterno,\r\n onChange,\r\n ...resto\r\n}: CampoMarcacaoProps) {\r\n const { id, msgId } = useCampoIds(idExterno);\r\n return (\r\n <div className={cx('lp-marc-wrap', className)}>\r\n <label className={cx('lp-marc', aparencia === 'chave' && 'lp-marc--chave')}>\r\n <input\r\n id={id}\r\n type=\"checkbox\"\r\n className=\"lp-marc-in\"\r\n role={aparencia === 'chave' ? 'switch' : undefined}\r\n checked={valor}\r\n onChange={(e) => {\r\n aoMudar?.(e.target.checked);\r\n onChange?.(e);\r\n }}\r\n aria-required={obrigatorio || undefined}\r\n aria-invalid={erro ? true : undefined}\r\n aria-describedby={erro || dica ? msgId : undefined}\r\n {...resto}\r\n />\r\n <span className=\"lp-marc-visual\" aria-hidden=\"true\" />\r\n {rotulo && (\r\n <span className=\"lp-marc-rotulo\">\r\n {rotulo}\r\n {obrigatorio && <span className=\"lp-campo-req\" aria-hidden=\"true\">*</span>}\r\n </span>\r\n )}\r\n </label>\r\n {erro ? (\r\n <span className=\"lp-campo-msg lp-campo-msg--err\" role=\"alert\" id={msgId}>{erro}</span>\r\n ) : dica ? (\r\n <span className=\"lp-campo-msg lp-campo-msg--dica\" id={msgId}>{dica}</span>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","import { forwardRef, type ChangeEvent, type InputHTMLAttributes, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { aplicarMascara, MASCARAS, type Mascara } from '../../utils/mascara';\r\nimport { TIPOS_CAMPO } from '../../utils/tiposCampo';\r\nimport { validarTelefone, type TipoDeCampo } from '../../utils/validadores';\r\nimport { Campo, descricaoDe, useCampoIds, useValidacaoCampo, type CampoBaseProps } from '../Campo/Campo';\r\nimport './CampoTexto.css';\r\n\r\ntype InputNativo = Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'className'>;\r\n\r\nexport interface CampoTextoProps extends CampoBaseProps, InputNativo {\r\n valor?: string;\r\n aoMudar?: (valor: string) => void;\r\n /** Ícone à esquerda, dentro do campo. */\r\n icone?: IconeProp;\r\n /** Máscara de digitação (`0` dígito, `A` letra, `S` alfanumérico). */\r\n mascara?: Mascara;\r\n /** Converte o texto para CAIXA ALTA enquanto digita. */\r\n maiuscula?: boolean;\r\n /** Texto fixo antes do valor (ex.: \"R$\"). */\r\n prefixo?: ReactNode;\r\n /** Conteúdo após o valor (ex.: botão de lupa). */\r\n sufixo?: ReactNode;\r\n /**\r\n * Regra de formato: devolve a mensagem, ou `''` se válido. O erro aparece\r\n * ao sair do campo depois de digitar (ou ao salvar o `Form`).\r\n */\r\n validar?: (valor: string) => string;\r\n}\r\n\r\nexport const CampoTexto = forwardRef<HTMLInputElement, CampoTextoProps>(function CampoTexto(\r\n {\r\n rotulo,\r\n dica,\r\n erro,\r\n aviso,\r\n obrigatorio,\r\n variante = 'campo',\r\n className,\r\n id: idExterno,\r\n valor,\r\n aoMudar,\r\n onChange,\r\n icone,\r\n mascara,\r\n maiuscula,\r\n prefixo,\r\n sufixo,\r\n disabled,\r\n type = 'text',\r\n validar,\r\n onBlur,\r\n ...resto\r\n },\r\n ref,\r\n) {\r\n const { id, msgId } = useCampoIds(idExterno);\r\n const validacao = useValidacaoCampo({ valor: valor ?? '', validar, obrigatorio, erro, aviso });\r\n erro = validacao.erro;\r\n aviso = validacao.aviso;\r\n const inline = variante === 'inline';\r\n const emMoldura = !inline && (prefixo !== undefined || sufixo !== undefined);\r\n\r\n const aoDigitar = (e: ChangeEvent<HTMLInputElement>) => {\r\n let v = e.target.value;\r\n if (mascara) v = aplicarMascara(v, mascara);\r\n if (maiuscula) v = v.toUpperCase();\r\n if (v !== e.target.value) e.target.value = v;\r\n validacao.aoInteragir();\r\n aoMudar?.(v);\r\n onChange?.(e);\r\n };\r\n\r\n const input = (\r\n <input\r\n ref={ref}\r\n id={id}\r\n type={type}\r\n className={cx('lp-input', (inline || emMoldura) && 'lp-input--bare')}\r\n value={valor}\r\n onChange={aoDigitar}\r\n onBlur={(e) => {\r\n validacao.aoSair();\r\n onBlur?.(e);\r\n }}\r\n disabled={disabled}\r\n required={obrigatorio}\r\n aria-required={obrigatorio || undefined}\r\n aria-invalid={erro ? true : undefined}\r\n aria-describedby={descricaoDe({ erro, aviso, dica }, msgId)}\r\n {...resto}\r\n />\r\n );\r\n\r\n return (\r\n <Campo\r\n rotulo={rotulo}\r\n dica={dica}\r\n erro={erro}\r\n aviso={aviso}\r\n obrigatorio={obrigatorio}\r\n variante={variante}\r\n className={className}\r\n htmlFor={id}\r\n msgId={msgId}\r\n >\r\n {emMoldura ? (\r\n <div className={cx('lp-ctl-frame', 'lp-campo-frame', erro && 'is-invalid', disabled && 'is-disabled')}>\r\n <Icone icone={icone} className=\"lp-campo-frame-ic\" />\r\n {prefixo !== undefined && <span className=\"lp-campo-prefixo\">{prefixo}</span>}\r\n {input}\r\n {sufixo}\r\n </div>\r\n ) : (\r\n <div className={cx('lp-campo-texto', inline && 'lp-campo-texto--inline', !!icone && 'tem-icone')}>\r\n <Icone icone={icone} className=\"lp-campo-texto-ic\" />\r\n {input}\r\n </div>\r\n )}\r\n </Campo>\r\n );\r\n});\r\n\r\n/* ---------- campos prontos (máscaras e validação brasileiras) ---------- */\r\n\r\ntype Preset = Omit<CampoTextoProps, 'mascara'>;\r\n\r\n/** Monta um campo tipado a partir do descritor `TIPOS_CAMPO` (máscara + placeholder + regra). */\r\nfunction campoTipado(tipo: TipoDeCampo, nome: string, extra: Partial<CampoTextoProps> = {}) {\r\n const meta = TIPOS_CAMPO[tipo];\r\n const C = forwardRef<HTMLInputElement, Preset>((p, ref) => (\r\n <CampoTexto\r\n ref={ref}\r\n mascara={meta.mascara}\r\n placeholder={meta.placeholder}\r\n maiuscula={meta.caixaAlta}\r\n validar={meta.validar}\r\n {...extra}\r\n {...p}\r\n />\r\n ));\r\n C.displayName = nome;\r\n return C;\r\n}\r\n\r\nexport const CampoCpf = campoTipado('cpf', 'CampoCpf', { inputMode: 'numeric' });\r\nexport const CampoCnpj = campoTipado('cnpj', 'CampoCnpj', { inputMode: 'numeric' });\r\n/** CPF ou CNPJ: a máscara muda pelo número de dígitos. */\r\nexport const CampoCpfCnpj = campoTipado('cpfCnpj', 'CampoCpfCnpj', { inputMode: 'numeric' });\r\nexport const CampoCep = campoTipado('cep', 'CampoCep', { inputMode: 'numeric' });\r\nexport const CampoPlaca = campoTipado('placa', 'CampoPlaca');\r\nexport const CampoEmail = campoTipado('email', 'CampoEmail', {\r\n type: 'email',\r\n inputMode: 'email',\r\n autoComplete: 'email',\r\n icone: 'mail',\r\n});\r\n/** RENAVAM: 9 a 11 dígitos. */\r\nexport const CampoRenavam = campoTipado('renavam', 'CampoRenavam', { inputMode: 'numeric' });\r\n/** Chassi (VIN): 17 caracteres, sem I, O e Q. */\r\nexport const CampoChassi = campoTipado('chassi', 'CampoChassi');\r\n/** CNH com dígitos verificadores do DENATRAN. */\r\nexport const CampoCnh = campoTipado('cnh', 'CampoCnh', { inputMode: 'numeric' });\r\n/** IMEI com verificação de Luhn. */\r\nexport const CampoImei = campoTipado('imei', 'CampoImei', { inputMode: 'numeric' });\r\n\r\nexport interface CampoTelefoneProps extends Preset {\r\n /** Restringe a fixo (10 dígitos) ou celular (11). Sem `tipo`, aceita os dois. */\r\n tipo?: 'fixo' | 'celular';\r\n}\r\n\r\nexport const CampoTelefone = forwardRef<HTMLInputElement, CampoTelefoneProps>(({ tipo, ...p }, ref) => {\r\n const [fixo, celular] = MASCARAS.telefone;\r\n return (\r\n <CampoTexto\r\n ref={ref}\r\n mascara={tipo === 'fixo' ? fixo : tipo === 'celular' ? celular : [fixo, celular]}\r\n inputMode=\"tel\"\r\n type=\"tel\"\r\n placeholder={tipo === 'fixo' ? '(00) 0000-0000' : '(00) 00000-0000'}\r\n validar={(v) => validarTelefone(v, tipo)}\r\n {...p}\r\n />\r\n );\r\n});\r\nCampoTelefone.displayName = 'CampoTelefone';\r\n\r\n/** Data no formato ISO (`AAAA-MM-DD`), com o seletor nativo do navegador. */\r\nexport const CampoData = forwardRef<HTMLInputElement, Preset>((p, ref) => (\r\n <CampoTexto ref={ref} type=\"date\" {...p} />\r\n));\r\nCampoData.displayName = 'CampoData';\r\n\r\n/** Hora `HH:MM`. */\r\nexport const CampoHora = forwardRef<HTMLInputElement, Preset>((p, ref) => (\r\n <CampoTexto ref={ref} type=\"time\" {...p} />\r\n));\r\nCampoHora.displayName = 'CampoHora';\r\n\r\n/** Data e hora `AAAA-MM-DDTHH:MM`. */\r\nexport const CampoDataHora = forwardRef<HTMLInputElement, Preset>((p, ref) => (\r\n <CampoTexto ref={ref} type=\"datetime-local\" {...p} />\r\n));\r\nCampoDataHora.displayName = 'CampoDataHora';\r\n\r\n/* ---------- numéricos ---------- */\r\n\r\ntype PresetNumerico = Omit<CampoTextoProps, 'mascara' | 'valor' | 'aoMudar'> & {\r\n valor?: number | null;\r\n aoMudar?: (valor: number | null) => void;\r\n};\r\n\r\nconst BRL = new Intl.NumberFormat('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\r\n\r\n/** Valor em reais: digita-se da direita (centavos primeiro), como no caixa. */\r\nexport const CampoMoeda = forwardRef<HTMLInputElement, PresetNumerico>(function CampoMoeda(\r\n { valor, aoMudar, ...p },\r\n ref,\r\n) {\r\n return (\r\n <CampoTexto\r\n ref={ref}\r\n inputMode=\"numeric\"\r\n prefixo=\"R$\"\r\n placeholder=\"0,00\"\r\n valor={valor === null || valor === undefined ? '' : BRL.format(valor)}\r\n aoMudar={(t) => {\r\n const digitos = t.replace(/\\D/g, '');\r\n aoMudar?.(digitos ? Number(digitos) / 100 : null);\r\n }}\r\n {...p}\r\n />\r\n );\r\n});\r\n\r\n/** Número inteiro (só dígitos). */\r\nexport const CampoInteiro = forwardRef<HTMLInputElement, PresetNumerico>(function CampoInteiro(\r\n { valor, aoMudar, ...p },\r\n ref,\r\n) {\r\n return (\r\n <CampoTexto\r\n ref={ref}\r\n inputMode=\"numeric\"\r\n valor={valor === null || valor === undefined ? '' : String(valor)}\r\n aoMudar={(t) => {\r\n const digitos = t.replace(/\\D/g, '');\r\n aoMudar?.(digitos ? Number(digitos) : null);\r\n }}\r\n {...p}\r\n />\r\n );\r\n});\r\n","import { Icone } from '../../utils/Icone';\r\nimport { useState, type KeyboardEvent } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { forcaSenha, POLITICA_PADRAO, validarSenha, type PoliticaSenha } from '../../utils/senha';\r\nimport { CampoTexto, type CampoTextoProps } from '../CampoTexto/CampoTexto';\r\nimport './CampoSenha.css';\r\n\r\nexport interface CampoSenhaProps extends Omit<CampoTextoProps, 'type' | 'mascara' | 'maiuscula' | 'prefixo' | 'sufixo'> {\r\n /** Botão de olho para mostrar/ocultar (padrão: sim). */\r\n revelavel?: boolean;\r\n /**\r\n * Liga o medidor de força E a validação pela `politica`. Desligado no\r\n * login — não se cobra política de uma senha que já existe.\r\n */\r\n forca?: boolean;\r\n politica?: PoliticaSenha;\r\n /** `new-password` em cadastro/troca de senha (padrão: `current-password`). */\r\n autoComplete?: string;\r\n}\r\n\r\nconst ROTULO_NIVEL = { vazia: '', fraca: 'Fraca', media: 'Média', forte: 'Forte' } as const;\r\n\r\n/** Senha com olho, aviso de Caps Lock e medidor de força opcional. */\r\nexport function CampoSenha({\r\n revelavel = true,\r\n forca = false,\r\n politica = POLITICA_PADRAO,\r\n autoComplete = 'current-password',\r\n className,\r\n valor = '',\r\n validar,\r\n aviso,\r\n onKeyDown,\r\n onKeyUp,\r\n disabled,\r\n ...p\r\n}: CampoSenhaProps) {\r\n const [visivel, setVisivel] = useState(false);\r\n const [capsLock, setCapsLock] = useState(false);\r\n const f = forcaSenha(valor, politica);\r\n\r\n const lerCaps = (e: KeyboardEvent<HTMLInputElement>) => setCapsLock(e.getModifierState?.('CapsLock') ?? false);\r\n\r\n return (\r\n <div className={cx('lp-senha', className)}>\r\n <CampoTexto\r\n {...p}\r\n type={visivel ? 'text' : 'password'}\r\n autoComplete={autoComplete}\r\n valor={valor}\r\n disabled={disabled}\r\n validar={forca ? (v) => validarSenha(v, politica) || validar?.(v) || '' : validar}\r\n aviso={aviso ?? (capsLock ? 'Caps Lock está ativado' : undefined)}\r\n onKeyDown={(e) => {\r\n lerCaps(e);\r\n onKeyDown?.(e);\r\n }}\r\n onKeyUp={(e) => {\r\n lerCaps(e);\r\n onKeyUp?.(e);\r\n }}\r\n sufixo={\r\n revelavel && !disabled ? (\r\n <button\r\n type=\"button\"\r\n className=\"lp-ctl-suffix\"\r\n aria-label={visivel ? 'Ocultar senha' : 'Mostrar senha'}\r\n aria-pressed={visivel}\r\n onClick={() => setVisivel((x) => !x)}\r\n >\r\n <Icone icone={visivel ? 'eye-off' : 'eye'} />\r\n </button>\r\n ) : undefined\r\n }\r\n />\r\n {forca && (\r\n <div className=\"lp-senha-forca\" data-nivel={f.nivel} aria-live=\"polite\">\r\n <div className=\"lp-senha-barras\" aria-hidden=\"true\">\r\n {[1, 2, 3, 4].map((n) => (\r\n <span key={n} className={cx('lp-senha-barra', n <= f.score && 'is-on')} />\r\n ))}\r\n </div>\r\n {f.nivel !== 'vazia' && <span className=\"lp-senha-nivel\">Força: {ROTULO_NIVEL[f.nivel]}</span>}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useId, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { Sobreposicao } from './Sobreposicao';\r\nimport './Dialogo.css';\r\n\r\nexport type TamanhoDialogo = 'pequeno' | 'medio' | 'grande' | 'extragrande' | 'full';\r\n\r\n/** Efeito de entrada do diálogo central. */\r\nexport type AnimacaoDialogo =\r\n | 'padrao'\r\n | 'escala'\r\n | 'deslizar-direita'\r\n | 'deslizar-baixo'\r\n | 'jornal'\r\n | 'queda'\r\n | 'girar-horizontal'\r\n | 'girar-vertical'\r\n | 'super-escala'\r\n | 'placa'\r\n | 'girar-baixo'\r\n | 'girar-esquerda';\r\n\r\nexport interface DialogoProps {\r\n aberto: boolean;\r\n aoFechar: () => void;\r\n titulo: string;\r\n subtitulo?: string;\r\n icone?: IconeProp;\r\n tamanho?: TamanhoDialogo;\r\n /** Tela cheia só abaixo desta largura (`sm` 36rem · `md` 48rem · `lg` 64rem · `xl` 75rem · `xxl` 87.5rem). */\r\n telaCheiaAbaixo?: 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\n /**\r\n * `central` (padrão) · `lateral` = painel encostado à direita, altura\r\n * total (gaveta). No lateral, `full` cai para `grande`.\r\n */\r\n aparencia?: 'central' | 'lateral';\r\n /** Onde o diálogo central fica: `centro` (padrão) ou `topo`. */\r\n posicao?: 'centro' | 'topo';\r\n /**\r\n * Conteúdo longo: `corpo` (padrão) rola só o miolo, com cabeçalho e rodapé\r\n * fixos · `pagina` deixa o diálogo crescer e rola a máscara inteira.\r\n */\r\n rolagem?: 'corpo' | 'pagina';\r\n animacao?: AnimacaoDialogo;\r\n /** `escuro` = cabeçalho na cor da marca. */\r\n tom?: 'claro' | 'escuro';\r\n /** Esc / clique fora fecham (padrão: sim). */\r\n dispensavel?: boolean;\r\n /** Botões do rodapé. */\r\n rodape?: ReactNode;\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function Dialogo({\r\n aberto,\r\n aoFechar,\r\n titulo,\r\n subtitulo,\r\n icone,\r\n tamanho = 'medio',\r\n telaCheiaAbaixo,\r\n aparencia = 'central',\r\n posicao = 'centro',\r\n rolagem = 'corpo',\r\n animacao = 'padrao',\r\n tom = 'claro',\r\n dispensavel = true,\r\n rodape,\r\n children,\r\n className,\r\n}: DialogoProps) {\r\n const tituloId = useId();\r\n if (!aberto) return null;\r\n const lateral = aparencia === 'lateral';\r\n return (\r\n <Sobreposicao\r\n aoDispensar={aoFechar}\r\n dispensavel={dispensavel}\r\n rotuloId={tituloId}\r\n classeMascara={cx(\r\n lateral && 'lp-sobre--lateral',\r\n !lateral && posicao === 'topo' && 'lp-sobre--topo',\r\n !lateral && rolagem === 'pagina' && 'lp-sobre--rolar',\r\n telaCheiaAbaixo && `lp-sobre--cheia-${telaCheiaAbaixo}`,\r\n )}\r\n className={cx(\r\n 'lp-dlg',\r\n `lp-dlg--${lateral && tamanho === 'full' ? 'grande' : tamanho}`,\r\n lateral && 'lp-dlg--lateral',\r\n !lateral && rolagem === 'pagina' && 'lp-dlg--rolar-pagina',\r\n !lateral && animacao !== 'padrao' && `lp-dlg--anim-${animacao}`,\r\n telaCheiaAbaixo && `lp-dlg--cheia-${telaCheiaAbaixo}`,\r\n tom === 'escuro' && 'lp-dlg--escuro',\r\n className,\r\n )}\r\n >\r\n <div className=\"lp-dlg-cab\">\r\n {icone && (\r\n <span className=\"lp-dlg-ic\">\r\n <Icone icone={icone} />\r\n </span>\r\n )}\r\n <div className=\"lp-dlg-titulos\">\r\n <span className=\"lp-dlg-titulo\" id={tituloId}>\r\n {titulo}\r\n </span>\r\n {subtitulo && <span className=\"lp-dlg-sub\">{subtitulo}</span>}\r\n </div>\r\n <button type=\"button\" className=\"lp-dlg-fechar\" aria-label=\"Fechar\" title=\"Fechar\" onClick={aoFechar}>\r\n <Icone icone=\"x\" />\r\n </button>\r\n </div>\r\n <div className=\"lp-dlg-corpo\">{children}</div>\r\n {rodape && <div className=\"lp-dlg-rodape\">{rodape}</div>}\r\n </Sobreposicao>\r\n );\r\n}\r\n","import { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport type { Severidade } from '../../utils/tipos';\r\nimport './Status.css';\r\n\r\nexport interface StatusProps {\r\n rotulo: string;\r\n severidade?: Severidade;\r\n icone?: IconeProp;\r\n className?: string;\r\n}\r\n\r\n/** Selo de situação (Ativo, Pendente, Cancelado…). */\r\nexport function Status({ rotulo, severidade = 'neutral', icone, className }: StatusProps) {\r\n return (\r\n <span className={cx('lp-status', className)} data-sev={severidade}>\r\n <Icone icone={icone} />\r\n <span>{rotulo}</span>\r\n </span>\r\n );\r\n}\r\n","import { useId, useState, type FormEvent, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { Alerta } from '../Alerta/Alerta';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { CampoMarcacao } from '../CampoMarcacao/CampoMarcacao';\r\nimport { CampoSenha } from '../CampoSenha/CampoSenha';\r\nimport { CampoCpf, CampoEmail, CampoTexto } from '../CampoTexto/CampoTexto';\r\nimport { Dialogo } from '../Dialogo/Dialogo';\r\nimport { Dica } from '../Dica/Dica';\r\nimport type { Marca } from '../Estrutura/Estrutura';\r\nimport { usePreferenciasOpcional } from '../Preferencias/Preferencias';\r\nimport { Status } from '../Status/Status';\r\nimport './TelaLogin.css';\r\n\r\nexport interface CredenciaisLogin {\r\n usuario: string;\r\n senha: string;\r\n}\r\n\r\n/**\r\n * Resposta do `aoEntrar`: nada = entrou · `'codigo'` = pedir o código de\r\n * verificação em duas etapas · `{ erro }` = mensagem para o usuário.\r\n */\r\nexport type ResultadoLogin = void | 'codigo' | { erro: string };\r\n\r\n/** Painel institucional do modelo `conteudo`. */\r\nexport interface ApresentacaoLogin {\r\n /** Chamada em caixa alta acima do título (ex.: \"Plataforma comercial\"). */\r\n chamada?: string;\r\n titulo: string;\r\n descricao?: ReactNode;\r\n /** Até 3–4 pontos fortes do sistema, cada um com ícone. */\r\n destaques?: { icone: IconeProp; texto: string }[];\r\n /** Conteúdo livre abaixo dos destaques (ilustração, gráfico, depoimento). */\r\n extra?: ReactNode;\r\n}\r\n\r\nexport interface TelaLoginProps {\r\n marca: Marca;\r\n /**\r\n * `conteudo` (padrão) = apresentação do sistema à esquerda + cartão do\r\n * formulário · `formulario` = só o cartão, centralizado.\r\n */\r\n modelo?: 'conteudo' | 'formulario';\r\n /** Conteúdo da lateral esquerda no modelo `conteudo` (some em telas estreitas). */\r\n apresentacao?: ApresentacaoLogin;\r\n /** Selo de ambiente sob o subtítulo (Homologação, Treinamento…). Produção: omita. */\r\n ambiente?: { rotulo: string; severidade?: 'warn' | 'err' | 'info' | 'neutral' };\r\n /** Como o usuário se identifica (padrão: CPF). */\r\n identificador?: 'cpf' | 'email' | 'usuario';\r\n titulo?: string;\r\n descricao?: string;\r\n aoEntrar: (credenciais: CredenciaisLogin) => Promise<ResultadoLogin> | ResultadoLogin;\r\n /** Confirma o código de 6 dígitos; devolva `{ erro }` para manter o diálogo aberto. */\r\n aoConfirmarCodigo?: (codigo: string, confiarDispositivo: boolean) => Promise<void | { erro: string }> | void | { erro: string };\r\n /** Mostra \"Confiar neste dispositivo\" no diálogo do código (padrão: sim). */\r\n confiarDispositivo?: boolean;\r\n /** Onde o usuário encontra o código (ex.: \"Abra o aplicativo autenticador no celular…\"). */\r\n instrucaoCodigo?: string;\r\n /** Link sob a senha, alinhado à direita (ex.: \"Esqueci minha senha\"). */\r\n linkSenha?: ReactNode;\r\n /** Links ou botões abaixo do Entrar. */\r\n acoes?: ReactNode;\r\n rodape?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst TAMANHO_CODIGO = 6;\r\n\r\n/** Tela de login institucional: imagem + painel com identificação, senha e 2FA. */\r\nexport function TelaLogin({\r\n marca,\r\n modelo = 'conteudo',\r\n apresentacao,\r\n ambiente,\r\n identificador = 'cpf',\r\n titulo = 'Acesse sua conta',\r\n descricao = 'Entre com suas credenciais institucionais.',\r\n aoEntrar,\r\n aoConfirmarCodigo,\r\n confiarDispositivo = true,\r\n instrucaoCodigo = 'Digite o código de 6 dígitos gerado no aplicativo de autenticação.',\r\n linkSenha,\r\n acoes,\r\n rodape,\r\n className,\r\n}: TelaLoginProps) {\r\n const [usuario, setUsuario] = useState('');\r\n const [senha, setSenha] = useState('');\r\n const [entrando, setEntrando] = useState(false);\r\n const [erro, setErro] = useState('');\r\n const [tentou, setTentou] = useState(false);\r\n const [pedindoCodigo, setPedindoCodigo] = useState(false);\r\n const [codigo, setCodigo] = useState('');\r\n const [confiar, setConfiar] = useState(false);\r\n const [erroCodigo, setErroCodigo] = useState('');\r\n const [confirmando, setConfirmando] = useState(false);\r\n const prefs = usePreferenciasOpcional();\r\n const tituloId = useId();\r\n const comConteudo = modelo === 'conteudo' && !!apresentacao;\r\n\r\n const entrar = async (e: FormEvent) => {\r\n e.preventDefault();\r\n setTentou(true);\r\n if (!usuario.trim() || !senha) return;\r\n setErro('');\r\n setEntrando(true);\r\n try {\r\n const r = await aoEntrar({ usuario, senha });\r\n if (r === 'codigo') {\r\n setCodigo('');\r\n setConfiar(false);\r\n setErroCodigo('');\r\n setPedindoCodigo(true);\r\n } else if (r && typeof r === 'object') setErro(r.erro);\r\n } catch {\r\n setErro('Não foi possível entrar agora. Tente de novo em instantes.');\r\n } finally {\r\n setEntrando(false);\r\n }\r\n };\r\n\r\n const confirmar = async (e?: FormEvent) => {\r\n e?.preventDefault();\r\n if (codigo.length !== TAMANHO_CODIGO) {\r\n setErroCodigo(`Informe os ${TAMANHO_CODIGO} dígitos`);\r\n return;\r\n }\r\n setConfirmando(true);\r\n try {\r\n const r = await aoConfirmarCodigo?.(codigo, confiar);\r\n if (r && typeof r === 'object') setErroCodigo(r.erro);\r\n else setPedindoCodigo(false);\r\n } catch {\r\n setErroCodigo('Não foi possível validar o código. Tente de novo.');\r\n } finally {\r\n setConfirmando(false);\r\n }\r\n };\r\n\r\n const obrig = (v: string) => (tentou && !v.trim() ? 'Campo obrigatório' : undefined);\r\n const propsUsuario = { valor: usuario, aoMudar: setUsuario, obrigatorio: true, erro: obrig(usuario), autoFocus: true };\r\n\r\n return (\r\n <div className={cx('lp-login', comConteudo ? 'lp-login--conteudo' : 'lp-login--formulario', className)}>\r\n {/* fundo decorativo: duas manchas desfocadas + grade que some nas bordas */}\r\n <div className=\"lp-login-fundo\" aria-hidden=\"true\">\r\n <span className=\"lp-login-mancha lp-login-mancha--1\" />\r\n <span className=\"lp-login-mancha lp-login-mancha--2\" />\r\n <span className=\"lp-login-grade\" />\r\n </div>\r\n\r\n <header className=\"lp-login-cab\">\r\n <div className=\"lp-login-marca\">\r\n {marca.logo ? (\r\n <img src={marca.logo} alt=\"\" className=\"lp-login-logo\" />\r\n ) : (\r\n <span className=\"lp-login-escudo\" aria-hidden=\"true\">\r\n <Icone icone=\"shield\" />\r\n </span>\r\n )}\r\n <div>\r\n <div className=\"lp-login-nome\">{marca.nome}</div>\r\n {marca.subtitulo && <div className=\"lp-login-sub\">{marca.subtitulo}</div>}\r\n </div>\r\n {ambiente?.rotulo && ambiente.rotulo !== '#' && <Status rotulo={ambiente.rotulo} severidade={ambiente.severidade ?? 'err'} />}\r\n </div>\r\n {prefs && (\r\n <Dica texto={prefs.escuro ? 'Tema claro' : 'Tema escuro'}>\r\n <button type=\"button\" className=\"lp-login-tema\" aria-label={prefs.escuro ? 'Tema claro' : 'Tema escuro'} onClick={prefs.alternarTema}>\r\n <Icone icone={prefs.escuro ? 'sun' : 'moon'} />\r\n </button>\r\n </Dica>\r\n )}\r\n </header>\r\n\r\n <main className=\"lp-login-main\">\r\n {comConteudo && apresentacao && (\r\n <section className=\"lp-login-apres\" aria-label=\"Sobre o sistema\">\r\n {apresentacao.chamada && <p className=\"lp-login-chamada\">{apresentacao.chamada}</p>}\r\n <h2 className=\"lp-login-apres-titulo\">{apresentacao.titulo}</h2>\r\n {apresentacao.descricao && <p className=\"lp-login-apres-desc\">{apresentacao.descricao}</p>}\r\n {!!apresentacao.destaques?.length && (\r\n <ul className=\"lp-login-destaques\">\r\n {apresentacao.destaques.map((d) => (\r\n <li key={d.texto}>\r\n <span className=\"lp-login-destaque-ic\" aria-hidden=\"true\">\r\n <Icone icone={d.icone} />\r\n </span>\r\n {d.texto}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n {apresentacao.extra && <div className=\"lp-login-extra\">{apresentacao.extra}</div>}\r\n </section>\r\n )}\r\n\r\n <section className=\"lp-login-cartao density-cozy\" aria-labelledby={tituloId}>\r\n <div className=\"lp-login-cartao-cab\">\r\n <span className=\"lp-login-filete\" aria-hidden=\"true\" />\r\n <h1 className=\"lp-login-titulo\" id={tituloId}>\r\n {titulo}\r\n </h1>\r\n {descricao && <p className=\"lp-login-desc\">{descricao}</p>}\r\n </div>\r\n\r\n {erro && <Alerta severidade=\"err\" mensagem={erro} />}\r\n\r\n <form className=\"lp-login-form\" onSubmit={entrar} noValidate>\r\n {identificador === 'cpf' ? (\r\n <CampoCpf rotulo=\"CPF\" autoComplete=\"username\" {...propsUsuario} />\r\n ) : identificador === 'email' ? (\r\n <CampoEmail rotulo=\"E-mail\" autoComplete=\"username\" placeholder=\"voce@empresa.com.br\" {...propsUsuario} />\r\n ) : (\r\n <CampoTexto rotulo=\"Usuário\" autoComplete=\"username\" icone=\"user\" {...propsUsuario} />\r\n )}\r\n <div className=\"lp-login-senha\">\r\n <CampoSenha rotulo=\"Senha\" placeholder=\"••••••••\" valor={senha} aoMudar={setSenha} obrigatorio erro={obrig(senha)} />\r\n {linkSenha && <div className=\"lp-login-link-senha\">{linkSenha}</div>}\r\n </div>\r\n <Botao type=\"submit\" rotulo={entrando ? 'Entrando…' : 'Entrar'} icone=\"log-in\" bloco carregando={entrando} />\r\n </form>\r\n\r\n {acoes && <div className=\"lp-login-acoes\">{acoes}</div>}\r\n {rodape && <div className=\"lp-login-rodape\">{rodape}</div>}\r\n </section>\r\n </main>\r\n\r\n <Dialogo\r\n aberto={pedindoCodigo}\r\n aoFechar={() => setPedindoCodigo(false)}\r\n titulo=\"Verificação em duas etapas\"\r\n subtitulo=\"Precisamos confirmar que é você\"\r\n icone=\"lock\"\r\n tamanho=\"pequeno\"\r\n dispensavel={!confirmando}\r\n rodape={\r\n <>\r\n <Botao rotulo=\"Cancelar\" severidade=\"secundario\" disabled={confirmando} onClick={() => setPedindoCodigo(false)} />\r\n <Botao rotulo=\"Confirmar\" icone=\"check\" carregando={confirmando} onClick={() => confirmar()} />\r\n </>\r\n }\r\n >\r\n <form className=\"lp-login-otp\" onSubmit={confirmar} noValidate>\r\n <p className=\"lp-login-desc\">{instrucaoCodigo}</p>\r\n <CampoTexto\r\n rotulo=\"Código\"\r\n className=\"lp-login-otp-campo\"\r\n mascara=\"000000\"\r\n inputMode=\"numeric\"\r\n autoComplete=\"one-time-code\"\r\n data-foco-inicial\r\n valor={codigo}\r\n aoMudar={(v) => {\r\n setCodigo(v);\r\n setErroCodigo('');\r\n }}\r\n erro={erroCodigo || undefined}\r\n />\r\n {confiarDispositivo && (\r\n <CampoMarcacao\r\n rotulo=\"Confiar neste dispositivo\"\r\n dica=\"O código não será pedido de novo neste computador.\"\r\n valor={confiar}\r\n aoMudar={setConfiar}\r\n />\r\n )}\r\n </form>\r\n </Dialogo>\r\n </div>\r\n );\r\n}\r\n","import type { ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport type { Marca } from '../Estrutura/Estrutura';\r\nimport './TelaErro.css';\r\n\r\nexport interface TelaErroProps {\r\n /** Código grande em destaque (ex.: 404). */\r\n codigo: string | number;\r\n /** Frase principal (vira o `h1` da página). */\r\n titulo: string;\r\n descricao?: ReactNode;\r\n /** Ícone no selo acima do código. */\r\n icone?: IconeProp;\r\n /** Cor do código: `pri` (padrão) · `warn` · `err`. */\r\n cor?: 'pri' | 'warn' | 'err';\r\n /** Botões (voltar, tentar de novo, entrar…). */\r\n acoes?: ReactNode;\r\n /** Informação técnica miúda (ex.: código do incidente para o suporte). */\r\n detalhe?: ReactNode;\r\n /** Marca no topo, como na tela de login. */\r\n marca?: Marca;\r\n /** `cheia` (padrão) ocupa a janela; `contida` cabe dentro da moldura do sistema. */\r\n tela?: 'cheia' | 'contida';\r\n className?: string;\r\n}\r\n\r\n/** Página de erro (401, 404, 500…) com código em destaque e caminhos de saída. */\r\nexport function TelaErro({ codigo, titulo, descricao, icone, cor = 'pri', acoes, detalhe, marca, tela = 'cheia', className }: TelaErroProps) {\r\n return (\r\n <div className={cx('lp-erro', `lp-erro--${tela}`, cor !== 'pri' && `lp-erro--${cor}`, className)}>\r\n <div className=\"lp-erro-fundo\" aria-hidden=\"true\">\r\n <span className=\"lp-erro-mancha lp-erro-mancha--1\" />\r\n <span className=\"lp-erro-mancha lp-erro-mancha--2\" />\r\n <span className=\"lp-erro-grade\" />\r\n </div>\r\n\r\n {marca && tela === 'cheia' && (\r\n <header className=\"lp-erro-cab\">\r\n {marca.logo ? (\r\n <img className=\"lp-erro-logo\" src={marca.logo} alt=\"\" />\r\n ) : (\r\n <span className=\"lp-erro-escudo\" aria-hidden=\"true\">\r\n <Icone icone=\"shield\" />\r\n </span>\r\n )}\r\n <span className=\"lp-erro-marca\">\r\n <strong>{marca.nome}</strong>\r\n {marca.subtitulo && <span>{marca.subtitulo}</span>}\r\n </span>\r\n </header>\r\n )}\r\n\r\n <main className=\"lp-erro-main\">\r\n {icone && (\r\n <span className=\"lp-erro-selo\" aria-hidden=\"true\">\r\n <Icone icone={icone} />\r\n </span>\r\n )}\r\n <p className=\"lp-erro-codigo\" aria-hidden=\"true\">\r\n {codigo}\r\n </p>\r\n <h1 className=\"lp-erro-titulo\">\r\n <span className=\"lp-sr\">Erro {codigo}: </span>\r\n {titulo}\r\n </h1>\r\n {descricao && <div className=\"lp-erro-desc\">{descricao}</div>}\r\n {acoes && <div className=\"lp-erro-acoes\">{acoes}</div>}\r\n {detalhe && <div className=\"lp-erro-detalhe\">{detalhe}</div>}\r\n </main>\r\n </div>\r\n );\r\n}\r\n","import type { JSX, ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport type { IconeProp } from '../../utils/Icone';\r\nimport { Botao, PadroesBotaoCtx, type BotaoProps, type PadroesBotao } from '../Botao/Botao';\r\nimport './GrupoBotoes.css';\r\n\r\nexport interface GrupoBotoesProps extends PadroesBotao {\r\n children: ReactNode;\r\n orientacao?: 'horizontal' | 'vertical';\r\n /** Nome do grupo para leitor de tela (ex.: \"Controles do player\"). */\r\n rotulo?: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Botões colados num bloco só. `severidade`, `aparencia`, `formato` e\r\n * `tamanho` viram o padrão dos botões de dentro (cada um pode sobrescrever).\r\n */\r\nexport function GrupoBotoes({ children, orientacao = 'horizontal', rotulo, className, ...padroes }: GrupoBotoesProps) {\r\n return (\r\n <PadroesBotaoCtx.Provider value={padroes}>\r\n <div role=\"group\" aria-label={rotulo} className={cx('lp-grupo-btn', orientacao === 'vertical' && 'lp-grupo-btn--vertical', className)}>\r\n {children}\r\n </div>\r\n </PadroesBotaoCtx.Provider>\r\n );\r\n}\r\n\r\nexport interface OpcaoAlternancia<V> {\r\n valor: V;\r\n rotulo?: string;\r\n icone?: IconeProp;\r\n /** Obrigatória quando a opção é só ícone. */\r\n dica?: string;\r\n desabilitada?: boolean;\r\n}\r\n\r\ninterface BaseAlternancia<V> extends Omit<GrupoBotoesProps, 'children'> {\r\n opcoes: OpcaoAlternancia<V>[];\r\n /** Aparência das opções desmarcadas (as marcadas ficam sólidas). Padrão: `contorno`. */\r\n aparencia?: BotaoProps['aparencia'];\r\n}\r\n\r\nexport interface GrupoAlternanciaUnicoProps<V> extends BaseAlternancia<V> {\r\n multiplo?: false;\r\n valor?: V | null;\r\n aoMudar?: (valor: V) => void;\r\n}\r\n\r\nexport interface GrupoAlternanciaMultiploProps<V> extends BaseAlternancia<V> {\r\n multiplo: true;\r\n valor?: V[];\r\n aoMudar?: (valor: V[]) => void;\r\n}\r\n\r\nexport type GrupoAlternanciaProps<V> = GrupoAlternanciaUnicoProps<V> | GrupoAlternanciaMultiploProps<V>;\r\n\r\n/**\r\n * Grupo de botões de seleção: única (como rádio) ou múltipla (como caixas de\r\n * marcação). Cada opção é um botão de alternância (`aria-pressed`).\r\n */\r\nexport function GrupoAlternancia<V = string>(props: GrupoAlternanciaMultiploProps<V>): JSX.Element;\r\nexport function GrupoAlternancia<V = string>(props: GrupoAlternanciaUnicoProps<V>): JSX.Element;\r\nexport function GrupoAlternancia<V = string>(props: GrupoAlternanciaProps<V>): JSX.Element {\r\n const { opcoes, aparencia = 'contorno', ...grupo } = props;\r\n const marcados: V[] = props.multiplo ? (props.valor ?? []) : props.valor == null ? [] : [props.valor];\r\n const marcado = (v: V) => marcados.some((m) => Object.is(m, v));\r\n\r\n const alternar = (v: V) => {\r\n if (props.multiplo) props.aoMudar?.(marcado(v) ? marcados.filter((m) => !Object.is(m, v)) : [...marcados, v]);\r\n else props.aoMudar?.(v);\r\n };\r\n\r\n const { multiplo: _m, valor: _v, aoMudar: _a, ...resto } = grupo as GrupoAlternanciaProps<V>;\r\n return (\r\n <GrupoBotoes {...resto}>\r\n {opcoes.map((o, i) => (\r\n <Botao\r\n key={i}\r\n rotulo={o.rotulo}\r\n icone={o.icone}\r\n dica={o.dica}\r\n aria-label={o.rotulo ? undefined : o.dica}\r\n disabled={o.desabilitada}\r\n aparencia={marcado(o.valor) ? 'solido' : aparencia}\r\n pressionado={marcado(o.valor)}\r\n onClick={() => alternar(o.valor)}\r\n />\r\n ))}\r\n </GrupoBotoes>\r\n );\r\n}\r\n\r\nexport interface BarraBotoesProps {\r\n children: ReactNode;\r\n /** Nome da barra para leitor de tela. */\r\n rotulo?: string;\r\n /** `inicio` (padrão) · `entre` = espalha os grupos de ponta a ponta. */\r\n distribuicao?: 'inicio' | 'entre';\r\n className?: string;\r\n}\r\n\r\n/** Barra de ferramentas: vários grupos (e campos) lado a lado. */\r\nexport function BarraBotoes({ children, rotulo, distribuicao = 'inicio', className }: BarraBotoesProps) {\r\n return (\r\n <div role=\"toolbar\" aria-label={rotulo} className={cx('lp-barra-btn', distribuicao === 'entre' && 'lp-barra-btn--entre', className)}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import { useCallback, useEffect, useId, useLayoutEffect, useRef, useState, type KeyboardEvent, type ReactNode, type RefObject } from 'react';\r\nimport { portal } from '../../utils/portal';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { useCliqueFora } from '../../utils/useCliqueFora';\r\nimport { Botao, type BotaoProps, type PadroesBotao, type SeveridadeBotao } from '../Botao/Botao';\r\nimport { GrupoBotoes } from '../GrupoBotoes/GrupoBotoes';\r\nimport './MenuSuspenso.css';\r\n\r\nexport interface ItemMenuSuspenso {\r\n /** Devolvido em `aoEscolher` (sem id, vai o rótulo). */\r\n id?: string;\r\n /** `item` (padrão) · `titulo` = cabeçalho de seção · `divisor` · `texto` = linha não clicável. */\r\n tipo?: 'item' | 'titulo' | 'divisor' | 'texto';\r\n rotulo?: string;\r\n icone?: IconeProp;\r\n /** Texto miúdo à direita (atalho, contagem). */\r\n extra?: string;\r\n /** Vira link (`<a href>`) em vez de botão. */\r\n href?: string;\r\n ativo?: boolean;\r\n desabilitado?: boolean;\r\n destrutivo?: boolean;\r\n}\r\n\r\nexport type DirecaoMenu = 'baixo' | 'cima' | 'direita' | 'esquerda';\r\nexport type AlinhamentoMenu = 'inicio' | 'centro' | 'fim';\r\n/**\r\n * Quando o menu fecha sozinho: `sempre` (escolher item ou clicar fora) ·\r\n * `dentro` (só ao escolher item) · `fora` (só ao clicar fora) · `manual`\r\n * (só pelo próprio botão ou Esc).\r\n */\r\nexport type FechamentoMenu = 'sempre' | 'dentro' | 'fora' | 'manual';\r\n\r\n/** Props que um gatilho próprio (`gatilho`) deve espalhar no seu botão. */\r\nexport interface PropsGatilhoMenu {\r\n ref: RefObject<HTMLButtonElement | null>;\r\n 'aria-haspopup': 'menu' | 'dialog';\r\n 'aria-expanded': boolean;\r\n 'aria-controls'?: string;\r\n disabled?: boolean;\r\n onClick: () => void;\r\n onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => void;\r\n}\r\n\r\nexport interface MenuSuspensoProps extends PadroesBotao {\r\n rotulo?: string;\r\n icone?: IconeProp;\r\n /** Balão de dica — use em gatilhos só com ícone. */\r\n dica?: string;\r\n 'aria-label'?: string;\r\n itens?: ItemMenuSuspenso[];\r\n aoEscolher?: (id: string) => void;\r\n /** Conteúdo livre no painel (texto, formulário). A função recebe `fechar`. */\r\n children?: ReactNode | ((fechar: () => void) => ReactNode);\r\n /** Botão dividido: ação principal + seta que abre o menu. */\r\n dividido?: boolean;\r\n aoClicarPrincipal?: () => void;\r\n /** Para onde o painel abre; vira para o lado oposto se não couber. */\r\n direcao?: DirecaoMenu;\r\n alinhamento?: AlinhamentoMenu;\r\n /** Alinhamento a partir de 64rem (o anterior vale abaixo disso). */\r\n alinhamentoTelaGrande?: AlinhamentoMenu;\r\n fechamento?: FechamentoMenu;\r\n /** `[ao longo, afastando]` em px (ex.: `[10, 20]`). */\r\n deslocamento?: [number, number];\r\n /** No dividido, `pai` ancora o painel no grupo inteiro em vez de só na seta. */\r\n referencia?: 'gatilho' | 'pai';\r\n /** Painel escuro. */\r\n escuro?: boolean;\r\n /** Cor do item em foco/ativo (painel colorido). */\r\n cor?: SeveridadeBotao;\r\n sombra?: BotaoProps['sombra'];\r\n /** Esconde a seta do gatilho. */\r\n semSeta?: boolean;\r\n /** Largura mínima do painel (ex.: `'16rem'`). */\r\n larguraMenu?: string;\r\n desabilitado?: boolean;\r\n /** Gatilho próprio no lugar do `Botao` (ex.: uma aba). Espalhe as props no `<button>`. */\r\n gatilho?: (props: PropsGatilhoMenu, aberto: boolean) => ReactNode;\r\n className?: string;\r\n}\r\n\r\ninterface Pos {\r\n top: number;\r\n left: number;\r\n direcao: DirecaoMenu;\r\n}\r\n\r\nconst SETA: Record<DirecaoMenu, string> = {\r\n baixo: 'chevron-down',\r\n cima: 'chevron-up',\r\n direita: 'chevron-right',\r\n esquerda: 'chevron-left',\r\n};\r\nconst MARGEM = 8;\r\nconst SELETOR_ITEM = '[role=\"menuitem\"]:not([aria-disabled=\"true\"])';\r\nconst SELETOR_FOCAVEL = 'a[href], button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex=\"-1\"])';\r\n\r\nfunction posicionar(r: DOMRect, w: number, h: number, direcao: DirecaoMenu, alinh: AlinhamentoMenu, [ao, afasta]: [number, number]): Pos {\r\n const vw = window.innerWidth;\r\n const vh = window.innerHeight;\r\n const gap = 4 + afasta;\r\n let dir = direcao;\r\n // vira para o lado oposto quando não cabe e do outro lado cabe\r\n if (dir === 'baixo' && r.bottom + gap + h > vh && r.top - gap - h >= 0) dir = 'cima';\r\n else if (dir === 'cima' && r.top - gap - h < 0 && r.bottom + gap + h <= vh) dir = 'baixo';\r\n else if (dir === 'direita' && r.right + gap + w > vw && r.left - gap - w >= 0) dir = 'esquerda';\r\n else if (dir === 'esquerda' && r.left - gap - w < 0 && r.right + gap + w <= vw) dir = 'direita';\r\n\r\n let top: number;\r\n let left: number;\r\n if (dir === 'baixo' || dir === 'cima') {\r\n top = dir === 'baixo' ? r.bottom + gap : r.top - gap - h;\r\n left = alinh === 'inicio' ? r.left : alinh === 'fim' ? r.right - w : r.left + r.width / 2 - w / 2;\r\n left += ao;\r\n } else {\r\n left = dir === 'direita' ? r.right + gap : r.left - gap - w;\r\n top = alinh === 'fim' ? r.bottom - h : alinh === 'centro' ? r.top + r.height / 2 - h / 2 : r.top;\r\n top += ao;\r\n }\r\n // nunca sai da janela\r\n left = Math.max(MARGEM, Math.min(left, vw - w - MARGEM));\r\n top = Math.max(MARGEM, Math.min(top, vh - h - MARGEM));\r\n return { top, left, direcao: dir };\r\n}\r\n\r\n/**\r\n * Menu suspenso (dropdown): botão que abre uma lista de ações, ou um painel\r\n * livre (texto, formulário). Dividido, em 4 direções, alinhável, com\r\n * fechamento configurável e navegação por setas.\r\n */\r\nexport function MenuSuspenso({\r\n rotulo,\r\n icone,\r\n dica,\r\n 'aria-label': ariaLabel,\r\n itens,\r\n aoEscolher,\r\n children,\r\n dividido = false,\r\n aoClicarPrincipal,\r\n direcao = 'baixo',\r\n alinhamento = 'inicio',\r\n alinhamentoTelaGrande,\r\n fechamento = 'sempre',\r\n deslocamento = [0, 0],\r\n referencia = 'gatilho',\r\n escuro = false,\r\n cor,\r\n sombra,\r\n semSeta = false,\r\n larguraMenu,\r\n desabilitado,\r\n gatilho: gatilhoProprio,\r\n className,\r\n severidade,\r\n aparencia,\r\n formato,\r\n tamanho,\r\n}: MenuSuspensoProps) {\r\n const id = useId();\r\n const raiz = useRef<HTMLSpanElement>(null);\r\n const gatilho = useRef<HTMLButtonElement>(null);\r\n const painel = useRef<HTMLDivElement>(null);\r\n const [aberto, setAberto] = useState(false);\r\n const [pos, setPos] = useState<Pos | null>(null);\r\n // foco ao abrir: primeiro ou último item (seta para cima no gatilho)\r\n const focoInicial = useRef<'primeiro' | 'ultimo'>('primeiro');\r\n const ehMenu = !!itens?.length;\r\n const [ao, afasta] = deslocamento;\r\n\r\n const fechar = useCallback((devolverFoco = true) => {\r\n setAberto(false);\r\n if (devolverFoco) gatilho.current?.focus();\r\n }, []);\r\n\r\n const medir = useCallback(() => {\r\n const ancora = referencia === 'pai' ? raiz.current : gatilho.current;\r\n const el = painel.current;\r\n if (!ancora || !el) return;\r\n const grande = alinhamentoTelaGrande && window.matchMedia('(min-width: 64rem)').matches;\r\n setPos(posicionar(ancora.getBoundingClientRect(), el.offsetWidth, el.offsetHeight, direcao, grande ? alinhamentoTelaGrande : alinhamento, [ao, afasta]));\r\n }, [referencia, direcao, alinhamento, alinhamentoTelaGrande, ao, afasta]);\r\n\r\n useLayoutEffect(() => {\r\n if (!aberto) {\r\n setPos(null);\r\n return;\r\n }\r\n medir();\r\n window.addEventListener('scroll', medir, true);\r\n window.addEventListener('resize', medir);\r\n return () => {\r\n window.removeEventListener('scroll', medir, true);\r\n window.removeEventListener('resize', medir);\r\n };\r\n }, [aberto, medir]);\r\n\r\n // depois de posicionado, leva o foco para dentro do painel\r\n const posicionado = !!pos;\r\n useEffect(() => {\r\n if (!posicionado || !painel.current) return;\r\n const lista = painel.current.querySelectorAll<HTMLElement>(ehMenu ? SELETOR_ITEM : SELETOR_FOCAVEL);\r\n const alvo = focoInicial.current === 'ultimo' ? lista[lista.length - 1] : lista[0];\r\n (alvo ?? painel.current).focus({ preventScroll: true });\r\n }, [posicionado, ehMenu]);\r\n\r\n useCliqueFora([raiz, painel], aberto && (fechamento === 'sempre' || fechamento === 'fora'), () => fechar(false));\r\n\r\n // Esc fecha mesmo com o foco fora do painel (ex.: fechamento manual)\r\n useEffect(() => {\r\n if (!aberto) return;\r\n const esc = (e: globalThis.KeyboardEvent) => e.key === 'Escape' && fechar();\r\n document.addEventListener('keydown', esc);\r\n return () => document.removeEventListener('keydown', esc);\r\n }, [aberto, fechar]);\r\n\r\n const alternar = () => {\r\n focoInicial.current = 'primeiro';\r\n setAberto((a) => !a);\r\n };\r\n\r\n const teclaGatilho = (e: KeyboardEvent<HTMLButtonElement>) => {\r\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return;\r\n e.preventDefault();\r\n focoInicial.current = e.key === 'ArrowUp' ? 'ultimo' : 'primeiro';\r\n setAberto(true);\r\n };\r\n\r\n const teclaPainel = (e: KeyboardEvent<HTMLDivElement>) => {\r\n if (e.key === 'Escape') {\r\n e.stopPropagation();\r\n fechar();\r\n return;\r\n }\r\n const el = painel.current;\r\n if (!el) return;\r\n if (e.key === 'Tab') {\r\n // sair do painel com Tab fecha e devolve o foco à ordem normal da página\r\n const focaveis = Array.from(el.querySelectorAll<HTMLElement>(ehMenu ? SELETOR_ITEM : SELETOR_FOCAVEL));\r\n const atual = document.activeElement;\r\n if (ehMenu || !focaveis.length || (e.shiftKey ? atual === focaveis[0] : atual === focaveis[focaveis.length - 1])) {\r\n if (e.shiftKey) e.preventDefault();\r\n fechar();\r\n }\r\n return;\r\n }\r\n if (!ehMenu) return;\r\n const lista = Array.from(el.querySelectorAll<HTMLElement>(SELETOR_ITEM));\r\n if (!lista.length) return;\r\n const i = lista.indexOf(document.activeElement as HTMLElement);\r\n let prox: number | null = null;\r\n if (e.key === 'ArrowDown') prox = (i + 1) % lista.length;\r\n else if (e.key === 'ArrowUp') prox = (i - 1 + lista.length) % lista.length;\r\n else if (e.key === 'Home') prox = 0;\r\n else if (e.key === 'End') prox = lista.length - 1;\r\n if (prox === null) return;\r\n e.preventDefault();\r\n lista[prox].focus();\r\n };\r\n\r\n const escolher = (item: ItemMenuSuspenso) => {\r\n if (item.desabilitado) return;\r\n aoEscolher?.(item.id ?? item.rotulo ?? '');\r\n if (fechamento === 'sempre' || fechamento === 'dentro') fechar();\r\n };\r\n\r\n const seta = !semSeta && <Icone icone={SETA[direcao]} className=\"lp-menu-sus-seta\" />;\r\n const propsGatilho: PropsGatilhoMenu = {\r\n ref: gatilho,\r\n 'aria-haspopup': ehMenu ? 'menu' : 'dialog',\r\n 'aria-expanded': aberto,\r\n 'aria-controls': aberto ? id : undefined,\r\n disabled: desabilitado,\r\n onClick: alternar,\r\n onKeyDown: teclaGatilho,\r\n };\r\n const padroes = { severidade, aparencia, formato, tamanho, sombra };\r\n\r\n let botao: ReactNode;\r\n if (gatilhoProprio) {\r\n botao = gatilhoProprio(propsGatilho, aberto);\r\n } else if (dividido) {\r\n const botaoSeta = (\r\n <Botao\r\n {...propsGatilho}\r\n className={cx('lp-menu-sus-divisor', aberto && 'is-aberto')}\r\n icone={SETA[direcao]}\r\n aria-label={ariaLabel ?? (rotulo ? `Mais opções de ${rotulo}` : 'Mais opções')}\r\n />\r\n );\r\n botao = (\r\n <GrupoBotoes severidade={severidade} aparencia={aparencia} formato={formato} tamanho={tamanho} rotulo={rotulo}>\r\n {direcao === 'esquerda' && botaoSeta}\r\n <Botao rotulo={rotulo} icone={icone} sombra={sombra} disabled={desabilitado} onClick={aoClicarPrincipal} />\r\n {direcao !== 'esquerda' && botaoSeta}\r\n </GrupoBotoes>\r\n );\r\n } else {\r\n botao = (\r\n <Botao {...propsGatilho} {...padroes} icone={icone} dica={dica} aria-label={ariaLabel ?? (!rotulo ? dica : undefined)} className={cx(aberto && 'is-aberto')}>\r\n {rotulo || seta ? (\r\n <>\r\n {direcao === 'esquerda' && seta}\r\n {rotulo}\r\n {direcao !== 'esquerda' && seta}\r\n </>\r\n ) : undefined}\r\n </Botao>\r\n );\r\n }\r\n\r\n return (\r\n <span ref={raiz} className={cx('lp-menu-sus', className)}>\r\n {botao}\r\n {aberto &&\r\n portal(\r\n <div\r\n ref={painel}\r\n id={id}\r\n role={ehMenu ? 'menu' : 'dialog'}\r\n aria-label={rotulo ?? ariaLabel ?? dica}\r\n tabIndex={-1}\r\n className={cx(\r\n 'lp-menu-sus-painel',\r\n escuro && 'lp-menu-sus-painel--escuro',\r\n cor && 'lp-menu-sus-painel--colorido',\r\n cor && cor !== 'pri' && `lp-menu-sus-painel--${cor}`,\r\n pos && `lp-menu-sus-painel--${pos.direcao}`,\r\n )}\r\n style={{ top: pos?.top ?? 0, left: pos?.left ?? 0, minWidth: larguraMenu, visibility: pos ? undefined : 'hidden' }}\r\n onKeyDown={teclaPainel}\r\n >\r\n {itens?.map((item, i) => {\r\n const tipo = item.tipo ?? 'item';\r\n if (tipo === 'divisor') return <div key={i} role=\"separator\" className=\"lp-menu-sus-ln\" />;\r\n if (tipo === 'titulo')\r\n return (\r\n <div key={i} role=\"presentation\" className=\"lp-menu-sus-titulo\">\r\n {item.rotulo}\r\n </div>\r\n );\r\n if (tipo === 'texto')\r\n return (\r\n <div key={i} role=\"presentation\" className=\"lp-menu-sus-texto\">\r\n <Icone icone={item.icone} />\r\n {item.rotulo}\r\n </div>\r\n );\r\n const conteudo = (\r\n <>\r\n <Icone icone={item.icone} />\r\n <span className=\"lp-menu-sus-rotulo\">{item.rotulo}</span>\r\n {item.extra && <span className=\"lp-menu-sus-extra\">{item.extra}</span>}\r\n </>\r\n );\r\n const props = {\r\n role: 'menuitem',\r\n tabIndex: -1,\r\n className: cx('lp-menu-sus-item', item.ativo && 'is-ativo', item.destrutivo && 'is-destrutivo'),\r\n 'aria-current': item.ativo ? ('true' as const) : undefined,\r\n 'aria-disabled': item.desabilitado || undefined,\r\n onClick: () => escolher(item),\r\n };\r\n return item.href && !item.desabilitado ? (\r\n <a key={item.id ?? i} href={item.href} {...props}>\r\n {conteudo}\r\n </a>\r\n ) : (\r\n <button key={item.id ?? i} type=\"button\" {...props}>\r\n {conteudo}\r\n </button>\r\n );\r\n })}\r\n {typeof children === 'function' ? children(() => fechar()) : children}\r\n </div>,\r\n )}\r\n </span>\r\n );\r\n}\r\n","import { Children, isValidElement, useId, useRef, useState, type KeyboardEvent, type ReactElement, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { MenuSuspenso } from '../MenuSuspenso/MenuSuspenso';\r\nimport './Abas.css';\r\n\r\nexport interface AbaProps {\r\n valor: string;\r\n rotulo: string;\r\n icone?: IconeProp;\r\n desabilitada?: boolean;\r\n /** Número de pendências (chip âmbar na aba). */\r\n pendentes?: number;\r\n /** Selo livre depois do rótulo (ex.: `<Badge>`). */\r\n badge?: ReactNode;\r\n /** Abas vizinhas com o mesmo grupo viram uma aba com menu suspenso. */\r\n grupo?: string;\r\n children?: ReactNode;\r\n}\r\n\r\n/** Painel de uma aba. Só funciona dentro de `<Abas>`. */\r\nexport function Aba(_props: AbaProps): null {\r\n return null;\r\n}\r\n\r\n/**\r\n * `sublinhado` (padrão) · `classica` = aba com borda colada no painel ·\r\n * `pilulas` = ativa sólida · `suave` = ativa em fundo claro · `contorno` =\r\n * todas com borda, ativa sólida · `segmentado` = trilho cinza com a ativa\r\n * destacada · `passos` = círculos numerados · `cartao` = ativa e painel na\r\n * mesma cor · `blocos` = caixas com ícone em cima e seta para o painel.\r\n */\r\nexport type VarianteAbas = 'sublinhado' | 'classica' | 'pilulas' | 'suave' | 'contorno' | 'segmentado' | 'passos' | 'cartao' | 'blocos';\r\n\r\n/** `preencher` = abas crescem conforme o rótulo · `justificado` = todas da mesma largura. */\r\nexport type AlinhamentoAbas = 'inicio' | 'centro' | 'fim' | 'preencher' | 'justificado';\r\n\r\nexport interface AbasProps {\r\n /** Aba ativa (controlado). Sem ele, começa na primeira. */\r\n ativa?: string;\r\n aoMudar?: (valor: string) => void;\r\n /** Nome acessível da lista de abas. */\r\n rotulo?: string;\r\n variante?: VarianteAbas;\r\n /** Padrão: `preencher` no sublinhado, `inicio` nas demais. */\r\n alinhamento?: AlinhamentoAbas;\r\n /** `responsiva` = empilha as abas abaixo de 36rem. */\r\n orientacao?: 'horizontal' | 'vertical' | 'responsiva';\r\n /** Ícone acima do rótulo. */\r\n iconeAcima?: boolean;\r\n /** `caixa` = painel com borda e respiro. */\r\n painel?: 'livre' | 'caixa';\r\n /** `base` = abas abaixo do painel (rodapé). */\r\n posicaoBarra?: 'topo' | 'base';\r\n /** Título à esquerda, na mesma linha das abas. */\r\n cabecalho?: ReactNode;\r\n /** Modo página: cabeçalho com Voltar + título acima das abas. */\r\n titulo?: string;\r\n identidade?: string;\r\n aoVoltar?: () => void;\r\n acoes?: ReactNode;\r\n children: ReactNode;\r\n className?: string;\r\n}\r\n\r\ntype Entrada = { aba: ReactElement<AbaProps>; i: number } | { grupo: string; abas: Array<ReactElement<AbaProps>> };\r\n\r\nexport function Abas({\r\n ativa,\r\n aoMudar,\r\n rotulo,\r\n variante = 'sublinhado',\r\n alinhamento,\r\n orientacao = 'horizontal',\r\n iconeAcima = false,\r\n painel = 'livre',\r\n posicaoBarra = 'topo',\r\n cabecalho,\r\n titulo,\r\n identidade,\r\n aoVoltar,\r\n acoes,\r\n children,\r\n className,\r\n}: AbasProps) {\r\n const base = useId().replace(/:/g, '');\r\n const barra = useRef<HTMLDivElement>(null);\r\n const abas = Children.toArray(children).filter(\r\n (c): c is ReactElement<AbaProps> => isValidElement(c) && c.type === Aba,\r\n );\r\n const [interna, setInterna] = useState(abas[0]?.props.valor);\r\n const atual = ativa ?? interna;\r\n const pagina = !!titulo;\r\n const vertical = orientacao === 'vertical';\r\n const alinha = alinhamento ?? (variante === 'sublinhado' ? 'preencher' : 'inicio');\r\n\r\n const selecionar = (v: string) => {\r\n setInterna(v);\r\n aoMudar?.(v);\r\n };\r\n\r\n const aoTeclar = (e: KeyboardEvent<HTMLButtonElement>) => {\r\n const lista = Array.from(barra.current?.querySelectorAll<HTMLButtonElement>('.lp-abas-tab') ?? []);\r\n const n = lista.length;\r\n const i = lista.indexOf(e.currentTarget);\r\n let j = -1;\r\n if (e.key === (vertical ? 'ArrowDown' : 'ArrowRight')) j = (i + 1) % n;\r\n else if (e.key === (vertical ? 'ArrowUp' : 'ArrowLeft')) j = (i - 1 + n) % n;\r\n else if (e.key === 'Home') j = 0;\r\n else if (e.key === 'End') j = n - 1;\r\n if (j < 0) return;\r\n e.preventDefault();\r\n lista[j]?.focus();\r\n };\r\n\r\n // abas vizinhas do mesmo grupo viram uma entrada só (aba com menu)\r\n const entradas: Entrada[] = [];\r\n abas.forEach((aba, i) => {\r\n const g = aba.props.grupo;\r\n const ultima = entradas[entradas.length - 1];\r\n if (g && ultima && 'grupo' in ultima && ultima.grupo === g) ultima.abas.push(aba);\r\n else if (g) entradas.push({ grupo: g, abas: [aba] });\r\n else entradas.push({ aba, i });\r\n });\r\n\r\n const temPainel = (p: AbaProps) => p.children !== undefined && p.children !== null && p.children !== false;\r\n\r\n const conteudoTab = (p: AbaProps, i: number) => (\r\n <>\r\n {variante === 'passos' && <span className=\"lp-abas-num\">{i + 1}</span>}\r\n {p.icone && (\r\n <span className=\"lp-abas-ic\">\r\n <Icone icone={p.icone} />\r\n </span>\r\n )}\r\n <span className=\"lp-abas-rot\">{p.rotulo}</span>\r\n {p.badge}\r\n {!!p.pendentes && (\r\n <span className=\"lp-abas-pend\">\r\n {p.pendentes}\r\n <span className=\"lp-sr\"> pendência(s) nesta aba</span>\r\n </span>\r\n )}\r\n </>\r\n );\r\n\r\n const lista = (\r\n <div\r\n className=\"lp-abas-barra\"\r\n role=\"tablist\"\r\n aria-label={rotulo ?? titulo}\r\n aria-orientation={vertical ? 'vertical' : undefined}\r\n ref={barra}\r\n >\r\n {entradas.map((en) => {\r\n if ('grupo' in en) {\r\n const on = en.abas.some((a) => a.props.valor === atual);\r\n const escolhida = en.abas.find((a) => a.props.valor === atual);\r\n return (\r\n <MenuSuspenso\r\n key={`grupo-${en.grupo}`}\r\n rotulo={en.grupo}\r\n itens={en.abas.map((a) => ({\r\n id: a.props.valor,\r\n rotulo: a.props.rotulo,\r\n icone: a.props.icone,\r\n desabilitado: a.props.desabilitada,\r\n ativo: a.props.valor === atual,\r\n }))}\r\n aoEscolher={selecionar}\r\n className=\"lp-abas-grupo\"\r\n gatilho={(props, aberto) => (\r\n <button\r\n {...props}\r\n type=\"button\"\r\n className={cx('lp-abas-tab', on && 'is-on', aberto && 'is-aberto')}\r\n onKeyDown={(e) => {\r\n props.onKeyDown(e);\r\n if (!e.defaultPrevented) aoTeclar(e);\r\n }}\r\n >\r\n <span className=\"lp-abas-rot\">{escolhida ? `${en.grupo}: ${escolhida.props.rotulo}` : en.grupo}</span>\r\n <Icone icone=\"chevron-down\" className=\"lp-abas-seta\" />\r\n </button>\r\n )}\r\n />\r\n );\r\n }\r\n const p = en.aba.props;\r\n const on = p.valor === atual;\r\n return (\r\n <button\r\n key={p.valor}\r\n type=\"button\"\r\n role=\"tab\"\r\n id={`${base}-tab-${p.valor}`}\r\n aria-controls={temPainel(p) ? `${base}-painel-${p.valor}` : undefined}\r\n aria-selected={on}\r\n aria-disabled={p.desabilitada || undefined}\r\n tabIndex={on ? 0 : -1}\r\n className={cx('lp-abas-tab', on && 'is-on', p.desabilitada && 'is-off')}\r\n onClick={() => !p.desabilitada && selecionar(p.valor)}\r\n onKeyDown={aoTeclar}\r\n >\r\n {conteudoTab(p, en.i)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n\r\n const paineis = abas.filter((a) => temPainel(a.props));\r\n\r\n return (\r\n <div\r\n className={cx(\r\n 'lp-abas',\r\n `lp-abas--${variante}`,\r\n `lp-abas--alinha-${alinha}`,\r\n orientacao !== 'horizontal' && `lp-abas--${orientacao}`,\r\n iconeAcima && 'lp-abas--icone-acima',\r\n painel === 'caixa' && 'lp-abas--painel-caixa',\r\n posicaoBarra === 'base' && 'lp-abas--barra-base',\r\n pagina && 'lp-abas--pagina',\r\n className,\r\n )}\r\n >\r\n {pagina ? (\r\n <div className=\"lp-abas-banda\">\r\n <header className=\"lp-abas-cab\">\r\n {aoVoltar && (\r\n <button type=\"button\" className=\"lp-voltar\" aria-label=\"Voltar\" title=\"Voltar\" onClick={aoVoltar}>\r\n <Icone icone=\"arrow-left\" />\r\n </button>\r\n )}\r\n <div className=\"lp-abas-titulos\">\r\n <h2 className=\"lp-abas-titulo\">{titulo}</h2>\r\n {identidade && <span className=\"lp-abas-ident\">{identidade}</span>}\r\n </div>\r\n {acoes && <div className=\"lp-abas-acoes\">{acoes}</div>}\r\n </header>\r\n {lista}\r\n </div>\r\n ) : cabecalho ? (\r\n <div className=\"lp-abas-topo\">\r\n <div className=\"lp-abas-cabecalho\">{cabecalho}</div>\r\n {lista}\r\n </div>\r\n ) : (\r\n lista\r\n )}\r\n {paineis.length > 0 && (\r\n <div className=\"lp-abas-paineis\">\r\n {paineis.map((a) => (\r\n <div\r\n key={a.props.valor}\r\n role=\"tabpanel\"\r\n id={`${base}-painel-${a.props.valor}`}\r\n aria-labelledby={a.props.grupo ? undefined : `${base}-tab-${a.props.valor}`}\r\n aria-label={a.props.grupo ? a.props.rotulo : undefined}\r\n className=\"lp-abas-painel\"\r\n hidden={a.props.valor !== atual}\r\n >\r\n {a.props.children}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useId, useState, type HTMLAttributes, type KeyboardEvent, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone } from '../../utils/Icone';\r\nimport type { Severidade } from '../../utils/tipos';\r\nimport './Card.css';\r\n\r\n/** Mesmas cores do `Alerta`/`Badge`. */\r\nexport type CorCard = Severidade | 'pri' | 'destaque';\r\n\r\nexport interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'title'> {\r\n /** Capa que sangra até a borda (imagem, mapa…). */\r\n midia?: ReactNode;\r\n /**\r\n * Onde fica a mídia: `topo` (padrão) · `base` · `esquerda`/`direita`\r\n * (card horizontal) · `fundo` (texto sobre a imagem, com véu escuro).\r\n */\r\n posicaoMidia?: 'topo' | 'base' | 'esquerda' | 'direita' | 'fundo';\r\n /** Título do cabeçalho (com linha embaixo). */\r\n titulo?: ReactNode;\r\n subtitulo?: ReactNode;\r\n /** Conteúdo à direita do título (botões, badge). */\r\n ferramentas?: ReactNode;\r\n /** Botão de recolher/expandir o corpo no cabeçalho. */\r\n recolhivel?: boolean;\r\n /** Começa recolhido (com `recolhivel`). */\r\n recolhidoInicial?: boolean;\r\n /** Botão de fechar no cabeçalho: o card sai da tela. */\r\n dispensavel?: boolean;\r\n aoFechar?: () => void;\r\n /** Botão que abre o card em tela cheia (Esc volta). */\r\n telaCheia?: boolean;\r\n /** Ações flutuantes no canto superior direito (aparecem no hover). */\r\n acoes?: ReactNode;\r\n rodape?: ReactNode;\r\n /** Fundo na cor (texto claro/escuro conforme o contraste). */\r\n cor?: CorCard;\r\n /** Borda na cor, fundo normal. */\r\n borda?: CorCard;\r\n alinhamento?: 'esquerda' | 'centro' | 'direita';\r\n /** Corpo sem espaçamento interno (listas, tabelas, imagem inteira). */\r\n corpoSemEspaco?: boolean;\r\n /**\r\n * Painel de leitura que COBRE o card ao passar o mouse ou focar (ex.: algumas\r\n * linhas de `<Detalhes>`). Enriquecimento rápido, não substitui a ficha.\r\n */\r\n detalhes?: ReactNode;\r\n /** Torna o card inteiro clicável (role=button + Enter/Espaço). */\r\n aoClicar?: () => void;\r\n children?: ReactNode;\r\n}\r\n\r\nexport function Card({\r\n midia,\r\n posicaoMidia = 'topo',\r\n titulo,\r\n subtitulo,\r\n ferramentas,\r\n recolhivel = false,\r\n recolhidoInicial = false,\r\n dispensavel = false,\r\n aoFechar,\r\n telaCheia = false,\r\n acoes,\r\n rodape,\r\n cor,\r\n borda,\r\n alinhamento,\r\n corpoSemEspaco = false,\r\n detalhes,\r\n aoClicar,\r\n children,\r\n className,\r\n ...resto\r\n}: CardProps) {\r\n const [recolhido, setRecolhido] = useState(recolhidoInicial);\r\n const [fechado, setFechado] = useState(false);\r\n const [cheio, setCheio] = useState(false);\r\n const corpoId = useId();\r\n\r\n // tela cheia: Esc volta e a página atrás não rola\r\n useEffect(() => {\r\n if (!cheio) return;\r\n const h = (e: globalThis.KeyboardEvent) => e.key === 'Escape' && setCheio(false);\r\n document.addEventListener('keydown', h);\r\n const antes = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n return () => {\r\n document.removeEventListener('keydown', h);\r\n document.body.style.overflow = antes;\r\n };\r\n }, [cheio]);\r\n\r\n if (fechado) return null;\r\n\r\n const interativo = !!aoClicar;\r\n const aoTeclar = (e: KeyboardEvent<HTMLDivElement>) => {\r\n if (e.target !== e.currentTarget) return;\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n aoClicar?.();\r\n }\r\n };\r\n\r\n const comFerramentas = recolhivel || dispensavel || telaCheia || !!ferramentas;\r\n const cabecalho = (titulo || subtitulo || comFerramentas) && (\r\n <div className=\"lp-card-cab\">\r\n <div className=\"lp-card-titulos\">\r\n {titulo && <div className=\"lp-card-titulo\">{titulo}</div>}\r\n {subtitulo && <div className=\"lp-card-subtitulo\">{subtitulo}</div>}\r\n </div>\r\n {comFerramentas && (\r\n <div className=\"lp-card-ferramentas\" onClick={(e) => e.stopPropagation()}>\r\n {ferramentas}\r\n {recolhivel && (\r\n <button type=\"button\" className=\"lp-card-ferr\" aria-expanded={!recolhido} aria-controls={corpoId} aria-label={recolhido ? 'Expandir' : 'Recolher'} title={recolhido ? 'Expandir' : 'Recolher'} onClick={() => setRecolhido((x) => !x)}>\r\n <Icone icone={recolhido ? 'chevron-down' : 'chevron-up'} />\r\n </button>\r\n )}\r\n {telaCheia && (\r\n <button type=\"button\" className=\"lp-card-ferr\" aria-pressed={cheio} aria-label={cheio ? 'Sair da tela cheia' : 'Tela cheia'} title={cheio ? 'Sair da tela cheia' : 'Tela cheia'} onClick={() => setCheio((x) => !x)}>\r\n <Icone icone={cheio ? 'minimize' : 'maximize'} />\r\n </button>\r\n )}\r\n {dispensavel && (\r\n <button\r\n type=\"button\"\r\n className=\"lp-card-ferr\"\r\n aria-label=\"Fechar\"\r\n title=\"Fechar\"\r\n onClick={() => {\r\n aoFechar?.();\r\n setFechado(true);\r\n }}\r\n >\r\n <Icone icone=\"x\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n const fundo = posicaoMidia === 'fundo';\r\n const horizontal = posicaoMidia === 'esquerda' || posicaoMidia === 'direita';\r\n const conteudo = (\r\n <>\r\n {cabecalho}\r\n <div id={corpoId} className={cx('lp-card-corpo', corpoSemEspaco && 'lp-card-corpo--sem-espaco')} hidden={recolhido}>\r\n {children}\r\n </div>\r\n {rodape && !recolhido && <div className=\"lp-card-rodape\">{rodape}</div>}\r\n </>\r\n );\r\n\r\n return (\r\n <div\r\n className={cx(\r\n 'lp-card',\r\n interativo && 'lp-card--interativo',\r\n !!midia && `lp-card--midia-${posicaoMidia}`,\r\n cor && 'lp-card--cor',\r\n borda && 'lp-card--borda',\r\n alinhamento && alinhamento !== 'esquerda' && `lp-card--${alinhamento}`,\r\n cheio && 'lp-card--cheio',\r\n className,\r\n )}\r\n data-cor={cor ?? borda}\r\n role={interativo ? 'button' : undefined}\r\n tabIndex={interativo ? 0 : undefined}\r\n onClick={aoClicar}\r\n onKeyDown={interativo ? aoTeclar : undefined}\r\n {...resto}\r\n >\r\n {acoes && (\r\n <div className=\"lp-card-acoes\" onClick={(e) => e.stopPropagation()}>\r\n {acoes}\r\n </div>\r\n )}\r\n {midia && posicaoMidia !== 'base' && posicaoMidia !== 'direita' && <div className=\"lp-card-midia\">{midia}</div>}\r\n {horizontal || fundo ? <div className=\"lp-card-conteudo\">{conteudo}</div> : conteudo}\r\n {midia && (posicaoMidia === 'base' || posicaoMidia === 'direita') && <div className=\"lp-card-midia\">{midia}</div>}\r\n {detalhes && (\r\n <div className=\"lp-card-detalhes\" tabIndex={0} role=\"group\" aria-label=\"Detalhes\">\r\n {detalhes}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/** Cards colados lado a lado, com a mesma altura (vira coluna em tela estreita). */\r\nexport function GrupoCards({ children, className }: { children: ReactNode; className?: string }) {\r\n return <div className={cx('lp-grupo-cards', className)}>{children}</div>;\r\n}\r\n","import type { ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport './Recolhivel.css';\r\n\r\nexport interface RecolhivelProps {\r\n aberto: boolean;\r\n children: ReactNode;\r\n /** `vertical` (padrão) anima a altura; `horizontal`, a largura. */\r\n orientacao?: 'vertical' | 'horizontal';\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Mostra/esconde o conteúdo com animação. Fechado, o conteúdo sai da ordem de\r\n * foco e do leitor de tela (`inert`).\r\n */\r\nexport function Recolhivel({ aberto, children, orientacao = 'vertical', id, className }: RecolhivelProps) {\r\n return (\r\n <div id={id} className={cx('lp-recolhivel', orientacao === 'horizontal' && 'lp-recolhivel--horizontal', aberto && 'is-aberto', className)} inert={!aberto}>\r\n <div className=\"lp-recolhivel-interno\">{children}</div>\r\n </div>\r\n );\r\n}\r\n","import { useCallback, useEffect, useRef, useState, type KeyboardEvent, type PointerEvent, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone } from '../../utils/Icone';\r\nimport './Carrossel.css';\r\n\r\nexport interface SlideCarrossel {\r\n imagem: string;\r\n alt: string;\r\n titulo?: ReactNode;\r\n descricao?: ReactNode;\r\n /** Tempo deste slide, em ms (sobrepõe o `intervalo` do carrossel). */\r\n intervalo?: number;\r\n}\r\n\r\nexport interface CarrosselProps {\r\n slides: SlideCarrossel[];\r\n /** Nome do carrossel para leitor de tela. */\r\n rotulo: string;\r\n /** Avança sozinho. Desligado para quem prefere menos movimento. */\r\n automatico?: boolean;\r\n /** Tempo de cada slide, em ms. */\r\n intervalo?: number;\r\n /** Setas de anterior/próximo. */\r\n controles?: boolean;\r\n /** Tracinhos que levam a cada slide. */\r\n indicadores?: boolean;\r\n /** `deslizar` (padrão) ou `esmaecer`. */\r\n transicao?: 'deslizar' | 'esmaecer';\r\n /** Controles e legendas escuros, para imagens claras. */\r\n escuro?: boolean;\r\n /** Arrastar para os lados no toque/mouse troca o slide. */\r\n arrastar?: boolean;\r\n /** Proporção da área (ex.: `'16 / 9'`). */\r\n proporcao?: string;\r\n className?: string;\r\n}\r\n\r\nconst prefereMenosMovimento = () => typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n\r\n/** Carrossel de imagens com legendas, setas, indicadores e avanço automático. */\r\nexport function Carrossel({\r\n slides,\r\n rotulo,\r\n automatico = true,\r\n intervalo = 5000,\r\n controles = false,\r\n indicadores = false,\r\n transicao = 'deslizar',\r\n escuro = false,\r\n arrastar = true,\r\n proporcao = '16 / 10',\r\n className,\r\n}: CarrosselProps) {\r\n const n = slides.length;\r\n const [atual, setAtual] = useState(0);\r\n const [pausadoUsuario, setPausadoUsuario] = useState(() => prefereMenosMovimento());\r\n const [pausadoHover, setPausadoHover] = useState(false);\r\n const inicioArraste = useRef<number | null>(null);\r\n\r\n const ir = useCallback((i: number) => setAtual(((i % n) + n) % n), [n]);\r\n // a partir do estado mais recente: cliques seguidos não usam um índice velho\r\n const proximo = useCallback(() => setAtual((a) => (a + 1) % n), [n]);\r\n const anterior = () => setAtual((a) => (a - 1 + n) % n);\r\n\r\n const rodando = automatico && !pausadoUsuario && !pausadoHover && n > 1;\r\n useEffect(() => {\r\n if (!rodando) return;\r\n const t = window.setTimeout(proximo, slides[atual]?.intervalo ?? intervalo);\r\n return () => window.clearTimeout(t);\r\n }, [rodando, proximo, atual, slides, intervalo]);\r\n\r\n const aoTeclar = (e: KeyboardEvent) => {\r\n if (e.key === 'ArrowRight') proximo();\r\n else if (e.key === 'ArrowLeft') anterior();\r\n else return;\r\n e.preventDefault();\r\n };\r\n\r\n const aoPressionar = (e: PointerEvent) => {\r\n if (arrastar) inicioArraste.current = e.clientX;\r\n };\r\n const aoSoltar = (e: PointerEvent) => {\r\n const x0 = inicioArraste.current;\r\n inicioArraste.current = null;\r\n if (x0 === null) return;\r\n const dx = e.clientX - x0;\r\n if (dx < -40) proximo();\r\n else if (dx > 40) anterior();\r\n };\r\n\r\n return (\r\n <section\r\n className={cx('lp-carrossel', `lp-carrossel--${transicao}`, escuro && 'lp-carrossel--escuro', !arrastar && 'lp-carrossel--sem-arraste', className)}\r\n aria-roledescription=\"carrossel\"\r\n aria-label={rotulo}\r\n onMouseEnter={() => setPausadoHover(true)}\r\n onMouseLeave={() => setPausadoHover(false)}\r\n onFocus={() => setPausadoHover(true)}\r\n onBlur={(e) => !e.currentTarget.contains(e.relatedTarget as Node | null) && setPausadoHover(false)}\r\n onKeyDown={aoTeclar}\r\n >\r\n <div\r\n className=\"lp-carrossel-janela\"\r\n style={{ aspectRatio: proporcao }}\r\n // anúncio só quando a troca vem do usuário: com avanço automático, silêncio\r\n aria-live={rodando ? 'off' : 'polite'}\r\n onPointerDown={aoPressionar}\r\n onPointerUp={aoSoltar}\r\n onPointerCancel={() => (inicioArraste.current = null)}\r\n >\r\n <div className=\"lp-carrossel-trilho\" style={transicao === 'deslizar' ? { transform: `translateX(${-atual * 100}%)` } : undefined}>\r\n {slides.map((s, i) => (\r\n <div\r\n key={i}\r\n className={cx('lp-carrossel-slide', i === atual && 'is-atual')}\r\n role=\"group\"\r\n aria-roledescription=\"slide\"\r\n aria-label={`${i + 1} de ${n}`}\r\n inert={i !== atual}\r\n >\r\n <img src={s.imagem} alt={s.alt} draggable={false} />\r\n {(s.titulo || s.descricao) && (\r\n <div className=\"lp-carrossel-legenda\">\r\n {s.titulo && <strong>{s.titulo}</strong>}\r\n {s.descricao && <span>{s.descricao}</span>}\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {controles && n > 1 && (\r\n <>\r\n <button type=\"button\" className=\"lp-carrossel-seta lp-carrossel-seta--ant\" aria-label=\"Slide anterior\" onClick={anterior}>\r\n <Icone icone=\"chevron-left\" />\r\n </button>\r\n <button type=\"button\" className=\"lp-carrossel-seta lp-carrossel-seta--prox\" aria-label=\"Próximo slide\" onClick={proximo}>\r\n <Icone icone=\"chevron-right\" />\r\n </button>\r\n </>\r\n )}\r\n {indicadores && n > 1 && (\r\n <div className=\"lp-carrossel-indicadores\">\r\n {slides.map((_, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n className={cx('lp-carrossel-ind', i === atual && 'is-atual')}\r\n aria-label={`Ir para o slide ${i + 1}`}\r\n aria-current={i === atual ? 'true' : undefined}\r\n onClick={() => ir(i)}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n {automatico && n > 1 && (\r\n <button\r\n type=\"button\"\r\n className=\"lp-carrossel-pausa\"\r\n aria-label={pausadoUsuario ? 'Retomar a troca automática' : 'Pausar a troca automática'}\r\n onClick={() => setPausadoUsuario((p) => !p)}\r\n >\r\n <Icone icone={pausadoUsuario ? 'play' : 'pause'} />\r\n </button>\r\n )}\r\n </section>\r\n );\r\n}\r\n","import { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type PointerEvent, type ReactNode } from 'react';\r\nimport { portal } from '../../utils/portal';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone } from '../../utils/Icone';\r\nimport './QuadroArrastavel.css';\r\n\r\nexport interface ColunaArrastavel<T> {\r\n id: string;\r\n /** Nome da coluna (anunciado ao mover pelo teclado). */\r\n titulo?: string;\r\n itens: T[];\r\n}\r\n\r\nexport interface QuadroArrastavelProps<T extends { id: string }> {\r\n colunas: ColunaArrastavel<T>[];\r\n /** Recebe as colunas já reordenadas. */\r\n aoMudar: (colunas: ColunaArrastavel<T>[]) => void;\r\n /** Desenha o item; ponha a `alca` (botão de arrastar) onde quiser, ex.: no cabeçalho do card. */\r\n renderItem: (item: T, alca: ReactNode) => ReactNode;\r\n /** Nome de cada item para leitor de tela (ex.: o título do card). */\r\n nomeItem: (item: T) => string;\r\n className?: string;\r\n}\r\n\r\ninterface Arraste {\r\n id: string;\r\n x: number;\r\n y: number;\r\n dx: number;\r\n dy: number;\r\n largura: number;\r\n}\r\n\r\ntype Posicao = { coluna: number; indice: number };\r\n\r\nfunction localizar<T extends { id: string }>(colunas: ColunaArrastavel<T>[], id: string): Posicao | null {\r\n for (let c = 0; c < colunas.length; c++) {\r\n const i = colunas[c].itens.findIndex((x) => x.id === id);\r\n if (i >= 0) return { coluna: c, indice: i };\r\n }\r\n return null;\r\n}\r\n\r\nfunction mover<T extends { id: string }>(colunas: ColunaArrastavel<T>[], de: Posicao, para: Posicao): ColunaArrastavel<T>[] {\r\n const novas = colunas.map((c) => ({ ...c, itens: [...c.itens] }));\r\n const [item] = novas[de.coluna].itens.splice(de.indice, 1);\r\n novas[para.coluna].itens.splice(Math.min(para.indice, novas[para.coluna].itens.length), 0, item);\r\n return novas;\r\n}\r\n\r\n/**\r\n * Colunas de itens (cards) que se reordenam arrastando, entre colunas\r\n * inclusive. Mouse, toque e teclado: na alça, Espaço pega/solta, setas movem,\r\n * Esc devolve ao lugar de origem.\r\n */\r\nexport function QuadroArrastavel<T extends { id: string }>({ colunas, aoMudar, renderItem, nomeItem, className }: QuadroArrastavelProps<T>) {\r\n const [arraste, setArraste] = useState<Arraste | null>(null);\r\n const [pego, setPego] = useState<{ id: string; origem: ColunaArrastavel<T>[] } | null>(null);\r\n const [anuncio, setAnuncio] = useState('');\r\n const refsColunas = useRef<Array<HTMLDivElement | null>>([]);\r\n\r\n const nomeColuna = (c: number) => colunas[c]?.titulo ?? `coluna ${c + 1}`;\r\n const item = (id: string) => colunas.flatMap((c) => c.itens).find((x) => x.id === id);\r\n\r\n // ---- ponteiro (mouse e toque) ----\r\n const aoPressionar = (e: PointerEvent<HTMLButtonElement>, id: string) => {\r\n if (e.button !== 0) return;\r\n const el = e.currentTarget.closest<HTMLElement>('[data-quadro-item]');\r\n if (!el) return;\r\n e.preventDefault();\r\n const r = el.getBoundingClientRect();\r\n setArraste({ id, x: e.clientX, y: e.clientY, dx: e.clientX - r.left, dy: e.clientY - r.top, largura: r.width });\r\n };\r\n\r\n // ouvido na janela: ao trocar de coluna a alça é remontada e perderia o ponteiro\r\n const aoMoverPonteiro = useRef<(e: globalThis.PointerEvent) => void>(() => {});\r\n aoMoverPonteiro.current = (e) => {\r\n if (!arraste) return;\r\n const { clientX: x, clientY: y } = e;\r\n setArraste({ ...arraste, x, y });\r\n // coluna sob o ponteiro (ou a mais próxima; em tela estreita elas ficam empilhadas)\r\n let alvo = -1;\r\n let menor = Infinity;\r\n refsColunas.current.forEach((col, c) => {\r\n if (!col) return;\r\n const r = col.getBoundingClientRect();\r\n const fora = (v: number, min: number, max: number) => (v < min ? min - v : v > max ? v - max : 0);\r\n const dist = fora(x, r.left, r.right) + fora(y, r.top, r.bottom);\r\n if (dist < menor) {\r\n menor = dist;\r\n alvo = c;\r\n }\r\n });\r\n const col = refsColunas.current[alvo];\r\n const de = localizar(colunas, arraste.id);\r\n if (!col || !de) return;\r\n // posição: quantos itens (fora o arrastado) têm o meio acima do ponteiro\r\n const outros = Array.from(col.querySelectorAll<HTMLElement>('[data-quadro-item]')).filter((el) => el.dataset.quadroItem !== arraste.id);\r\n const indice = outros.filter((el) => {\r\n const r = el.getBoundingClientRect();\r\n return r.top + r.height / 2 < y;\r\n }).length;\r\n if (de.coluna !== alvo || de.indice !== indice) aoMudar(mover(colunas, de, { coluna: alvo, indice }));\r\n };\r\n\r\n const arrastando = !!arraste;\r\n useEffect(() => {\r\n if (!arrastando) return;\r\n const mover_ = (e: globalThis.PointerEvent) => aoMoverPonteiro.current(e);\r\n const soltar = () => setArraste(null);\r\n window.addEventListener('pointermove', mover_);\r\n window.addEventListener('pointerup', soltar);\r\n window.addEventListener('pointercancel', soltar);\r\n return () => {\r\n window.removeEventListener('pointermove', mover_);\r\n window.removeEventListener('pointerup', soltar);\r\n window.removeEventListener('pointercancel', soltar);\r\n };\r\n }, [arrastando]);\r\n\r\n // pelo teclado, trocar de coluna remonta a alça: devolve o foco a ela\r\n useLayoutEffect(() => {\r\n if (!pego) return;\r\n const alca = document.querySelector<HTMLElement>(`[data-quadro-item=\"${CSS.escape(pego.id)}\"] .lp-quadro-alca`);\r\n if (alca && document.activeElement !== alca) alca.focus();\r\n }, [colunas, pego]);\r\n\r\n // ---- teclado ----\r\n const aoTeclar = (e: KeyboardEvent<HTMLButtonElement>, id: string) => {\r\n const nome = nomeItem(item(id)!);\r\n if (e.key === ' ' || e.key === 'Enter') {\r\n e.preventDefault();\r\n if (pego) {\r\n const p = localizar(colunas, id)!;\r\n setPego(null);\r\n setAnuncio(`${nome} solto em ${nomeColuna(p.coluna)}, posição ${p.indice + 1}.`);\r\n } else {\r\n setPego({ id, origem: colunas });\r\n setAnuncio(`${nome} pego. Use as setas para mover, Espaço para soltar, Esc para cancelar.`);\r\n }\r\n return;\r\n }\r\n if (!pego || pego.id !== id) return;\r\n if (e.key === 'Escape') {\r\n e.preventDefault();\r\n aoMudar(pego.origem);\r\n setPego(null);\r\n setAnuncio(`Movimento cancelado. ${nome} voltou ao lugar.`);\r\n return;\r\n }\r\n const de = localizar(colunas, id);\r\n if (!de) return;\r\n let para: Posicao | null = null;\r\n if (e.key === 'ArrowUp' && de.indice > 0) para = { coluna: de.coluna, indice: de.indice - 1 };\r\n else if (e.key === 'ArrowDown' && de.indice < colunas[de.coluna].itens.length - 1) para = { coluna: de.coluna, indice: de.indice + 1 };\r\n else if (e.key === 'ArrowLeft' && de.coluna > 0) para = { coluna: de.coluna - 1, indice: de.indice };\r\n else if (e.key === 'ArrowRight' && de.coluna < colunas.length - 1) para = { coluna: de.coluna + 1, indice: de.indice };\r\n if (!e.key.startsWith('Arrow')) return;\r\n e.preventDefault();\r\n if (!para) return;\r\n const novas = mover(colunas, de, para);\r\n aoMudar(novas);\r\n const final = localizar(novas, id)!;\r\n setAnuncio(`${nome} em ${nomeColuna(final.coluna)}, posição ${final.indice + 1} de ${novas[final.coluna].itens.length}.`);\r\n };\r\n\r\n const alca = (it: T) => (\r\n <button\r\n type=\"button\"\r\n className={cx('lp-quadro-alca', pego?.id === it.id && 'is-pego')}\r\n aria-label={`Mover ${nomeItem(it)}`}\r\n aria-pressed={pego?.id === it.id}\r\n title=\"Arrastar\"\r\n onPointerDown={(e) => aoPressionar(e, it.id)}\r\n onKeyDown={(e) => aoTeclar(e, it.id)}\r\n onBlur={() => {\r\n // adiado: se a alça só foi remontada, o foco volta a ela antes disto rodar\r\n window.setTimeout(() => {\r\n const ativo = document.activeElement as HTMLElement | null;\r\n if (pego?.id === it.id && ativo?.closest('[data-quadro-item]')?.getAttribute('data-quadro-item') !== it.id) setPego(null);\r\n }, 0);\r\n }}\r\n >\r\n <Icone icone=\"grip-vertical\" />\r\n </button>\r\n );\r\n\r\n const fantasma = arraste && item(arraste.id);\r\n\r\n return (\r\n <div className={cx('lp-quadro', arraste && 'is-arrastando', className)}>\r\n {colunas.map((col, c) => (\r\n <div key={col.id} ref={(el) => void (refsColunas.current[c] = el)} className=\"lp-quadro-coluna\" aria-label={col.titulo} role={col.titulo ? 'group' : undefined}>\r\n {col.itens.map((it) => (\r\n <div\r\n key={it.id}\r\n data-quadro-item={it.id}\r\n className={cx('lp-quadro-item', arraste?.id === it.id && 'is-vazio', pego?.id === it.id && 'is-pego')}\r\n >\r\n {renderItem(it, alca(it))}\r\n </div>\r\n ))}\r\n </div>\r\n ))}\r\n <div className=\"lp-sr\" aria-live=\"assertive\">\r\n {anuncio}\r\n </div>\r\n {arraste &&\r\n fantasma &&\r\n portal(\r\n <div\r\n className=\"lp-quadro-fantasma\"\r\n style={{ left: arraste.x - arraste.dx, top: arraste.y - arraste.dy, width: arraste.largura } as CSSProperties}\r\n aria-hidden=\"true\"\r\n inert\r\n >\r\n {renderItem(fantasma, <span className=\"lp-quadro-alca\">{<Icone icone=\"grip-vertical\" />}</span>)}\r\n </div>,\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { createContext, useContext, useId, useState, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { Recolhivel } from '../Recolhivel/Recolhivel';\r\nimport './Acordeao.css';\r\n\r\nexport type CorAcordeao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\r\n/**\r\n * `padrao` = caixa com borda · `sem-borda` = encostado no container ·\r\n * `solido` = cabeçalho aberto na cor · `suave` = cabeçalho aberto em tom\r\n * claro · `contorno` = borda na cor.\r\n */\r\nexport type VarianteAcordeao = 'padrao' | 'sem-borda' | 'solido' | 'suave' | 'contorno';\r\n\r\ninterface Ctx {\r\n abertos: string[];\r\n alternar: (valor: string) => void;\r\n icone: 'seta' | 'mais' | 'nenhum';\r\n}\r\nconst AcordeaoCtx = createContext<Ctx | null>(null);\r\n\r\nexport interface AcordeaoProps {\r\n children: ReactNode;\r\n /** Vários itens abertos ao mesmo tempo. */\r\n multiplo?: boolean;\r\n /** Itens abertos (controlado). */\r\n abertos?: string[];\r\n /** Itens abertos de início (não controlado). */\r\n padraoAbertos?: string[];\r\n aoMudar?: (abertos: string[]) => void;\r\n variante?: VarianteAcordeao;\r\n cor?: CorAcordeao;\r\n /** Itens soltos, com espaço entre eles. */\r\n separado?: boolean;\r\n /** `seta` (padrão) · `mais` = + / − · `nenhum`. */\r\n icone?: 'seta' | 'mais' | 'nenhum';\r\n /** Lado do ícone. */\r\n posicaoIcone?: 'fim' | 'inicio';\r\n className?: string;\r\n}\r\n\r\n/** Lista de seções que abrem e fecham (acordeão). */\r\nexport function Acordeao({\r\n children,\r\n multiplo = false,\r\n abertos: controlado,\r\n padraoAbertos = [],\r\n aoMudar,\r\n variante = 'padrao',\r\n cor,\r\n separado = false,\r\n icone = 'seta',\r\n posicaoIcone = 'fim',\r\n className,\r\n}: AcordeaoProps) {\r\n const [interno, setInterno] = useState(padraoAbertos);\r\n const abertos = controlado ?? interno;\r\n\r\n const alternar = (valor: string) => {\r\n const aberto = abertos.includes(valor);\r\n const novos = aberto ? abertos.filter((v) => v !== valor) : multiplo ? [...abertos, valor] : [valor];\r\n setInterno(novos);\r\n aoMudar?.(novos);\r\n };\r\n\r\n return (\r\n <AcordeaoCtx.Provider value={{ abertos, alternar, icone }}>\r\n <div\r\n className={cx(\r\n 'lp-acord',\r\n `lp-acord--${variante}`,\r\n cor && cor !== 'pri' && `lp-acord--${cor}`,\r\n separado && 'lp-acord--separado',\r\n posicaoIcone === 'inicio' && 'lp-acord--icone-inicio',\r\n className,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </AcordeaoCtx.Provider>\r\n );\r\n}\r\n\r\nexport interface ItemAcordeaoProps {\r\n valor: string;\r\n titulo: ReactNode;\r\n /** Ícone antes do título. */\r\n icone?: IconeProp;\r\n /** Cor só deste item (sobrepõe a do acordeão). */\r\n cor?: CorAcordeao;\r\n desabilitado?: boolean;\r\n children: ReactNode;\r\n}\r\n\r\n/** Seção de um `Acordeao`. */\r\nexport function ItemAcordeao({ valor, titulo, icone, cor, desabilitado = false, children }: ItemAcordeaoProps) {\r\n const ctx = useContext(AcordeaoCtx);\r\n const id = useId();\r\n if (!ctx) throw new Error('ItemAcordeao precisa estar dentro de <Acordeao>.');\r\n const aberto = ctx.abertos.includes(valor);\r\n\r\n return (\r\n <div className={cx('lp-acord-item', cor && `lp-acord--${cor}`, aberto && 'is-aberto', desabilitado && 'is-desabilitado')}>\r\n <h3 className=\"lp-acord-cab\">\r\n <button\r\n type=\"button\"\r\n id={`${id}-cab`}\r\n className=\"lp-acord-botao\"\r\n aria-expanded={aberto}\r\n aria-controls={`${id}-painel`}\r\n disabled={desabilitado}\r\n onClick={() => ctx.alternar(valor)}\r\n >\r\n {icone && <Icone icone={icone} className=\"lp-acord-ic-titulo\" />}\r\n <span className=\"lp-acord-titulo\">{titulo}</span>\r\n {ctx.icone !== 'nenhum' && (\r\n <span className={cx('lp-acord-indicador', ctx.icone === 'seta' && 'lp-acord-indicador--seta')} aria-hidden=\"true\">\r\n <Icone icone={ctx.icone === 'mais' ? (aberto ? 'minus' : 'plus') : 'chevron-down'} />\r\n </span>\r\n )}\r\n </button>\r\n </h3>\r\n <Recolhivel aberto={aberto}>\r\n <div id={`${id}-painel`} role=\"region\" aria-labelledby={`${id}-cab`} className=\"lp-acord-corpo\">\r\n {children}\r\n </div>\r\n </Recolhivel>\r\n </div>\r\n );\r\n}\r\n","import type { ButtonHTMLAttributes } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { Dica } from '../Dica/Dica';\r\nimport './AcaoLinha.css';\r\n\r\nexport interface AcaoLinhaProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\r\n icone: IconeProp;\r\n /** Nome da ação: vira dica e aria-label. */\r\n rotulo: string;\r\n /** `pri` = azul · `destaque` = laranja · `err` = vermelho. */\r\n severidade?: 'neutra' | 'pri' | 'destaque' | 'err';\r\n carregando?: boolean;\r\n}\r\n\r\n/** Botão-ícone compacto para ações de linha de tabela/card. */\r\nexport function AcaoLinha({\r\n icone,\r\n rotulo,\r\n severidade = 'neutra',\r\n carregando = false,\r\n disabled,\r\n className,\r\n type = 'button',\r\n ...resto\r\n}: AcaoLinhaProps) {\r\n return (\r\n <Dica texto={rotulo}>\r\n <button\r\n type={type}\r\n className={cx('lp-acao', severidade !== 'neutra' && `lp-acao--${severidade}`, className)}\r\n aria-label={rotulo}\r\n aria-busy={carregando || undefined}\r\n disabled={disabled || carregando}\r\n {...resto}\r\n >\r\n {carregando ? <Icone icone=\"loader-circle\" girar /> : <Icone icone={icone} />}\r\n </button>\r\n </Dica>\r\n );\r\n}\r\n","import {\r\n cloneElement,\r\n isValidElement,\r\n useCallback,\r\n useEffect,\r\n useId,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type ReactElement,\r\n type ReactNode,\r\n} from 'react';\r\nimport { portal } from '../../utils/portal';\r\nimport { cx } from '../../utils/cx';\r\nimport { useCliqueFora } from '../../utils/useCliqueFora';\r\nimport './Balao.css';\r\n\r\nexport type PosicaoBalao = 'cima' | 'direita' | 'baixo' | 'esquerda';\r\nexport type CorBalao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\r\n/** `padrao` · `cabecalho` = só o título na cor · `solido` = balão todo na cor · `suave` = fundo claro da cor. */\r\nexport type AparenciaBalao = 'padrao' | 'cabecalho' | 'solido' | 'suave';\r\n/**\r\n * `clique` = abre/fecha no clique; fecha também ao clicar fora ou Esc ·\r\n * `foco` = fecha no próximo clique em qualquer lugar · `passar` = abre com o\r\n * mouse em cima ou com o foco do teclado.\r\n */\r\nexport type GatilhoBalao = 'clique' | 'foco' | 'passar';\r\n\r\nexport interface BalaoProps {\r\n /** O elemento que abre o balão (botão, ícone, avatar…). */\r\n children: ReactNode;\r\n titulo?: ReactNode;\r\n conteudo: ReactNode;\r\n /** Lado preferido; vira para o oposto se não couber. */\r\n posicao?: PosicaoBalao;\r\n cor?: CorBalao;\r\n aparencia?: AparenciaBalao;\r\n gatilho?: GatilhoBalao;\r\n /** Largura máxima (padrão `17rem`). */\r\n largura?: string;\r\n className?: string;\r\n}\r\n\r\ninterface Pos {\r\n top: number;\r\n left: number;\r\n lado: PosicaoBalao;\r\n /** deslocamento da seta ao longo do lado, em px */\r\n seta: number;\r\n}\r\n\r\nconst OPOSTO: Record<PosicaoBalao, PosicaoBalao> = { cima: 'baixo', baixo: 'cima', direita: 'esquerda', esquerda: 'direita' };\r\nconst DISTANCIA = 10;\r\nconst MARGEM = 8;\r\n\r\nfunction cabe(r: DOMRect, w: number, h: number, lado: PosicaoBalao) {\r\n if (lado === 'cima') return r.top - DISTANCIA - h >= MARGEM;\r\n if (lado === 'baixo') return r.bottom + DISTANCIA + h <= window.innerHeight - MARGEM;\r\n if (lado === 'esquerda') return r.left - DISTANCIA - w >= MARGEM;\r\n return r.right + DISTANCIA + w <= window.innerWidth - MARGEM;\r\n}\r\n\r\nfunction posicionar(r: DOMRect, w: number, h: number, preferido: PosicaoBalao): Pos {\r\n const lado = cabe(r, w, h, preferido) || !cabe(r, w, h, OPOSTO[preferido]) ? preferido : OPOSTO[preferido];\r\n const vw = window.innerWidth;\r\n const vh = window.innerHeight;\r\n const cx_ = r.left + r.width / 2;\r\n const cy = r.top + r.height / 2;\r\n let top: number;\r\n let left: number;\r\n if (lado === 'cima' || lado === 'baixo') {\r\n top = lado === 'cima' ? r.top - DISTANCIA - h : r.bottom + DISTANCIA;\r\n left = Math.max(MARGEM, Math.min(cx_ - w / 2, vw - w - MARGEM));\r\n return { top, left, lado, seta: cx_ - left };\r\n }\r\n left = lado === 'esquerda' ? r.left - DISTANCIA - w : r.right + DISTANCIA;\r\n top = Math.max(MARGEM, Math.min(cy - h / 2, vh - h - MARGEM));\r\n return { top, left, lado, seta: cy - top };\r\n}\r\n\r\n/**\r\n * Balão com título e conteúdo (popover), ancorado num elemento. Abre no\r\n * clique, no foco ou ao passar o mouse; nas 4 direções e em cores.\r\n */\r\nexport function Balao({\r\n children,\r\n titulo,\r\n conteudo,\r\n posicao = 'cima',\r\n cor = 'pri',\r\n aparencia = 'padrao',\r\n gatilho = 'clique',\r\n largura,\r\n className,\r\n}: BalaoProps) {\r\n const id = useId();\r\n const alvo = useRef<HTMLSpanElement>(null);\r\n const balao = useRef<HTMLDivElement>(null);\r\n const timer = useRef<number | undefined>(undefined);\r\n const [aberto, setAberto] = useState(false);\r\n const [pos, setPos] = useState<Pos | null>(null);\r\n\r\n const medir = useCallback(() => {\r\n const a = alvo.current;\r\n const b = balao.current;\r\n if (!a || !b) return;\r\n // mede o próprio filho (o span-alvo pode ser maior que ele)\r\n const el = (a.firstElementChild as HTMLElement | null) ?? a;\r\n setPos(posicionar(el.getBoundingClientRect(), b.offsetWidth, b.offsetHeight, posicao));\r\n }, [posicao]);\r\n\r\n useLayoutEffect(() => {\r\n if (!aberto) {\r\n setPos(null);\r\n return;\r\n }\r\n medir();\r\n window.addEventListener('scroll', medir, true);\r\n window.addEventListener('resize', medir);\r\n return () => {\r\n window.removeEventListener('scroll', medir, true);\r\n window.removeEventListener('resize', medir);\r\n };\r\n }, [aberto, medir]);\r\n\r\n // Esc fecha; no gatilho `foco`, qualquer clique fecha\r\n useEffect(() => {\r\n if (!aberto) return;\r\n const esc = (e: KeyboardEvent) => e.key === 'Escape' && setAberto(false);\r\n document.addEventListener('keydown', esc);\r\n if (gatilho !== 'foco') return () => document.removeEventListener('keydown', esc);\r\n // adiado: o próprio clique que abriu não pode fechar\r\n const t = window.setTimeout(() => document.addEventListener('pointerdown', fechar), 0);\r\n function fechar(e: PointerEvent) {\r\n if (alvo.current?.contains(e.target as Node)) return;\r\n setAberto(false);\r\n }\r\n return () => {\r\n window.clearTimeout(t);\r\n document.removeEventListener('keydown', esc);\r\n document.removeEventListener('pointerdown', fechar);\r\n };\r\n }, [aberto, gatilho]);\r\n\r\n useCliqueFora([alvo, balao], aberto && gatilho === 'clique', () => setAberto(false));\r\n useEffect(() => () => window.clearTimeout(timer.current), []);\r\n\r\n const passar = gatilho === 'passar';\r\n const abrirLogo = () => {\r\n window.clearTimeout(timer.current);\r\n setAberto(true);\r\n };\r\n // atraso ao sair: dá tempo de levar o mouse até o balão\r\n const fecharDepois = () => {\r\n window.clearTimeout(timer.current);\r\n timer.current = window.setTimeout(() => setAberto(false), 120);\r\n };\r\n\r\n const filhoDesabilitado = isValidElement<{ disabled?: boolean }>(children) && !!children.props.disabled;\r\n const filho = isValidElement(children)\r\n ? cloneElement(children as ReactElement<Record<string, unknown>>, {\r\n 'aria-expanded': passar ? undefined : aberto,\r\n 'aria-describedby': aberto ? id : undefined,\r\n })\r\n : children;\r\n\r\n return (\r\n <span\r\n ref={alvo}\r\n className=\"lp-balao-alvo\"\r\n // botão desabilitado não recebe foco nem eventos: o próprio alvo assume\r\n tabIndex={filhoDesabilitado ? 0 : undefined}\r\n onClick={passar ? undefined : () => setAberto((a) => !a)}\r\n onMouseEnter={passar ? abrirLogo : undefined}\r\n onMouseLeave={passar ? fecharDepois : undefined}\r\n onFocus={passar ? abrirLogo : undefined}\r\n onBlur={passar ? fecharDepois : undefined}\r\n >\r\n {filho}\r\n {aberto &&\r\n portal(\r\n <div\r\n ref={balao}\r\n id={id}\r\n role={passar ? 'tooltip' : 'dialog'}\r\n aria-label={typeof titulo === 'string' ? titulo : undefined}\r\n className={cx(\r\n 'lp-balao',\r\n cor !== 'pri' && `lp-balao--${cor}`,\r\n aparencia !== 'padrao' && `lp-balao--${aparencia}`,\r\n pos && `lp-balao--${pos.lado}`,\r\n className,\r\n )}\r\n style={\r\n {\r\n top: pos?.top ?? 0,\r\n left: pos?.left ?? 0,\r\n maxWidth: largura,\r\n visibility: pos ? undefined : 'hidden',\r\n '--balao-seta': pos ? `${pos.seta}px` : undefined,\r\n } as CSSProperties\r\n }\r\n onMouseEnter={passar ? abrirLogo : undefined}\r\n onMouseLeave={passar ? fecharDepois : undefined}\r\n // o portal ainda borbulha no React: sem isto, clicar no balão o fecharia pelo alvo\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <span className=\"lp-balao-seta\" aria-hidden=\"true\" />\r\n {titulo && <div className=\"lp-balao-titulo\">{titulo}</div>}\r\n <div className=\"lp-balao-corpo\">{conteudo}</div>\r\n </div>,\r\n )}\r\n </span>\r\n );\r\n}\r\n","import { createContext, useContext, useEffect, useId, useState, type CSSProperties, type FormEvent, type MouseEvent, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { tituloDeEntidade, type Entidade, type Modo } from '../../utils/entidade';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { Trilha, type ItemTrilha } from '../Trilha/Trilha';\r\nimport { RevelarCamposCtx } from '../Campo/Campo';\r\nimport { Dialogo, type TamanhoDialogo } from '../Dialogo/Dialogo';\r\nimport './Form.css';\r\n\r\ninterface CtxForm {\r\n arranjo: 'pagina' | 'modal';\r\n}\r\n\r\nconst FormCtx = createContext<CtxForm>({ arranjo: 'pagina' });\r\n\r\n/** Item do menu lateral: cada um leva a um formulário do mesmo cadastro. */\r\nexport interface ItemMenuForm {\r\n id: string;\r\n rotulo: string;\r\n icone?: IconeProp;\r\n /** Com `href` o item vira link (ex.: `#/pedidos/novo/itens`). */\r\n href?: string;\r\n /** Chip de pendências ao lado do rótulo. */\r\n pendencias?: number;\r\n desabilitado?: boolean;\r\n}\r\n\r\nexport interface FormProps {\r\n /** `pagina` = tela cheia com menu lateral opcional · `modal` = dentro de diálogo. */\r\n arranjo?: 'pagina' | 'modal';\r\n /**\r\n * Título do cabeçalho. Com `entidade`, pode ser omitido: vira\r\n * \"Cadastrar/Editar/Visualizar <entidade>\" conforme o `modo`.\r\n */\r\n titulo?: string;\r\n /** Entidade do cadastro (`'veículo'` ou `{ nome, novo: 'Firmar contrato' }`). */\r\n entidade?: string | Entidade;\r\n /** Fase do registro na tela (padrão: `novo`). Em `leitura` some o Salvar. */\r\n modo?: Modo;\r\n /**\r\n * Página: trilha de navegação abaixo do título. `true` = caminho automático\r\n * do menu; lista = automático + estes passos no fim.\r\n */\r\n trilha?: boolean | ItemTrilha[];\r\n /** Identificação do registro (ex.: \"Protocolo 2026/0012\"). */\r\n identidade?: string;\r\n icone?: IconeProp;\r\n /** Modal: controla a abertura. */\r\n aberto?: boolean;\r\n tamanho?: TamanhoDialogo;\r\n aoSalvar?: () => void;\r\n aoCancelar?: () => void;\r\n salvando?: boolean;\r\n /** Quantos campos faltam corrigir — mostrado no rodapé. */\r\n pendencias?: number;\r\n /** Página: menu lateral com os formulários do cadastro. */\r\n menu?: ItemMenuForm[];\r\n /** Título do card do menu (padrão: \"Formulários\"). */\r\n menuTitulo?: string;\r\n /** `id` do item do menu que corresponde a este formulário. */\r\n menuAtivo?: string;\r\n /** Clique num item do menu; num item com `href`, chame `preventDefault` para navegar por conta própria. */\r\n aoEscolherMenu?: (id: string, evento: MouseEvent) => void;\r\n /** Botões extras no rodapé, antes de Cancelar/Salvar. */\r\n acoes?: ReactNode;\r\n /** Cancelar + Salvar no rodapé (padrão: sim). */\r\n acoesPadrao?: boolean;\r\n /**\r\n * Página: onde ficam os botões. `secao` (padrão) = card logo abaixo das\r\n * seções · `fixo` = barra presa ao pé da tela.\r\n */\r\n posicaoAcoes?: 'secao' | 'fixo';\r\n rotuloSalvar?: string;\r\n children: ReactNode;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Formulário de cadastro. Agrupe os campos em `<FormSecao>`; a grade de\r\n * colunas, o menu lateral e o rodapé com Salvar/Cancelar vêm prontos.\r\n */\r\nexport function Form({\r\n arranjo = 'pagina',\r\n titulo: tituloProp,\r\n entidade,\r\n modo = 'novo',\r\n trilha,\r\n identidade,\r\n icone,\r\n aberto = true,\r\n tamanho = 'grande',\r\n aoSalvar,\r\n aoCancelar,\r\n salvando = false,\r\n pendencias,\r\n menu,\r\n menuTitulo = 'Formulários',\r\n menuAtivo,\r\n aoEscolherMenu,\r\n acoes,\r\n acoesPadrao = true,\r\n posicaoAcoes = 'secao',\r\n rotuloSalvar = 'Salvar',\r\n children,\r\n className,\r\n}: FormProps) {\r\n const formId = `lp-form-${useId().replace(/:/g, '')}`;\r\n const titulo = tituloProp ?? (entidade ? tituloDeEntidade(entidade, modo) : '');\r\n const leitura = modo === 'leitura';\r\n // cada envio revela as pendências de todos os campos; reabrir zera\r\n const [tentativas, setTentativas] = useState(0);\r\n useEffect(() => {\r\n if (aberto) setTentativas(0);\r\n }, [aberto]);\r\n\r\n const aoSubmeter = (e: FormEvent) => {\r\n e.preventDefault();\r\n setTentativas((n) => n + 1);\r\n if (!salvando) aoSalvar?.();\r\n };\r\n\r\n const rodape = (\r\n <div className=\"lp-form-rodape\">\r\n {pendencias !== undefined && (\r\n <span className={cx('lp-form-pend', pendencias ? 'is-warn' : 'is-ok')} role=\"status\">\r\n <Icone icone={pendencias ? 'circle-alert' : 'circle-check'} />\r\n {pendencias ? `${pendencias} campo(s) a corrigir` : 'Pronto para salvar'}\r\n </span>\r\n )}\r\n <span className=\"lp-form-rodape-esp\" />\r\n {acoes}\r\n {acoesPadrao && (\r\n <>\r\n <Botao rotulo={leitura ? 'Fechar' : 'Cancelar'} severidade=\"secundario\" disabled={salvando} onClick={aoCancelar} />\r\n {!leitura && <Botao type=\"submit\" form={formId} rotulo={rotuloSalvar} icone=\"save\" carregando={salvando} />}\r\n </>\r\n )}\r\n </div>\r\n );\r\n\r\n const corpo = (\r\n <form id={formId} className=\"lp-form-secoes\" onSubmit={aoSubmeter} noValidate>\r\n <RevelarCamposCtx.Provider value={tentativas}>\r\n {leitura ? (\r\n <fieldset className=\"lp-form-leitura\" disabled>\r\n {children}\r\n </fieldset>\r\n ) : (\r\n children\r\n )}\r\n </RevelarCamposCtx.Provider>\r\n </form>\r\n );\r\n\r\n const ctx: CtxForm = { arranjo };\r\n\r\n if (arranjo === 'modal') {\r\n return (\r\n <FormCtx.Provider value={ctx}>\r\n <Dialogo\r\n aberto={aberto}\r\n aoFechar={() => aoCancelar?.()}\r\n titulo={titulo}\r\n subtitulo={identidade}\r\n icone={icone}\r\n tamanho={tamanho}\r\n dispensavel={!salvando}\r\n rodape={acoesPadrao || acoes ? rodape : undefined}\r\n className={className}\r\n >\r\n {corpo}\r\n </Dialogo>\r\n </FormCtx.Provider>\r\n );\r\n }\r\n\r\n if (!aberto) return null;\r\n const comMenu = !!menu?.length;\r\n const temAcoes = acoesPadrao || !!acoes;\r\n\r\n return (\r\n <FormCtx.Provider value={ctx}>\r\n <div className={cx('lp-form-pagina', className)}>\r\n <header className=\"lp-form-cab\">\r\n {aoCancelar && (\r\n <button type=\"button\" className=\"lp-voltar\" aria-label=\"Voltar\" title=\"Voltar\" onClick={aoCancelar}>\r\n <Icone icone=\"arrow-left\" />\r\n </button>\r\n )}\r\n {icone && (\r\n <span className=\"lp-form-cab-ic\">\r\n <Icone icone={icone} />\r\n </span>\r\n )}\r\n <div className=\"lp-form-titulos-col\">\r\n <div className=\"lp-form-titulos\">\r\n <h2 className=\"lp-form-titulo\">{titulo}</h2>\r\n {identidade && <span className=\"lp-form-ident\">{identidade}</span>}\r\n </div>\r\n {trilha && <Trilha extras={Array.isArray(trilha) ? trilha : undefined} className=\"lp-form-trilha\" />}\r\n </div>\r\n </header>\r\n\r\n <div className={cx('lp-form-corpo', !comMenu && 'sem-menu')}>\r\n {comMenu && (\r\n <aside className=\"lp-form-menu\">\r\n <div className=\"lp-form-menu-cab\">\r\n <h3 className=\"lp-form-menu-titulo\">{menuTitulo}</h3>\r\n </div>\r\n <nav className=\"lp-form-menu-nav\" aria-label={menuTitulo}>\r\n {menu.map((item) => {\r\n const on = item.id === menuAtivo;\r\n const conteudo = (\r\n <>\r\n <Icone icone={item.icone} />\r\n <span className=\"lp-form-menu-rot\">{item.rotulo}</span>\r\n {!!item.pendencias && <span className=\"lp-form-pendchip\">{item.pendencias}</span>}\r\n </>\r\n );\r\n const props = {\r\n className: cx('lp-form-menu-item', on && 'is-on'),\r\n 'aria-current': on ? ('page' as const) : undefined,\r\n onClick: (e: MouseEvent) => aoEscolherMenu?.(item.id, e),\r\n };\r\n return item.href && !item.desabilitado ? (\r\n <a key={item.id} href={item.href} {...props}>\r\n {conteudo}\r\n </a>\r\n ) : (\r\n <button key={item.id} type=\"button\" disabled={item.desabilitado} {...props}>\r\n {conteudo}\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </aside>\r\n )}\r\n <div className=\"lp-form-col\">\r\n {corpo}\r\n {temAcoes && posicaoAcoes === 'secao' && <div className=\"lp-fsec lp-form-acoes\">{rodape}</div>}\r\n </div>\r\n </div>\r\n\r\n {temAcoes && posicaoAcoes === 'fixo' && (\r\n <footer className=\"lp-form-pe\">\r\n <div className=\"lp-form-pe-col\">{rodape}</div>\r\n </footer>\r\n )}\r\n </div>\r\n </FormCtx.Provider>\r\n );\r\n}\r\n\r\nexport interface FormSecaoProps {\r\n legenda: string;\r\n icone?: IconeProp;\r\n /** Botões no cabeçalho da seção. */\r\n acoes?: ReactNode;\r\n /** Colunas da grade (padrão: 4 na página, 3 no modal). */\r\n colunas?: number;\r\n children: ReactNode;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Seção de formulário: card com título e grade de campos.\r\n * Larguras: `className=\"lp-col-2\"`, `lp-col-3` ou `lp-col-full` no campo.\r\n */\r\nexport function FormSecao({ legenda, icone, acoes, colunas, children, className }: FormSecaoProps) {\r\n const { arranjo } = useContext(FormCtx);\r\n const id = `lp-sec-${useId().replace(/:/g, '')}`;\r\n\r\n const estilo = colunas ? ({ '--lp-colunas': colunas } as CSSProperties) : undefined;\r\n const grade = (\r\n <div className={cx('lp-fsec-grade', !!colunas && 'tem-colunas')} style={estilo}>\r\n {children}\r\n </div>\r\n );\r\n\r\n if (arranjo === 'modal') {\r\n return (\r\n <fieldset id={id} className={cx('lp-fsec lp-fsec--modal', !!acoes && 'tem-acoes', className)}>\r\n <legend className=\"lp-fsec-legenda-up\">\r\n <Icone icone={icone} />\r\n {legenda}\r\n </legend>\r\n {acoes && <div className=\"lp-fsec-acoes lp-fsec-acoes--borda\">{acoes}</div>}\r\n {grade}\r\n </fieldset>\r\n );\r\n }\r\n\r\n return (\r\n <section id={id} className={cx('lp-fsec lp-fsec--pagina', className)} aria-labelledby={`${id}-t`}>\r\n <div className=\"lp-fsec-legenda\">\r\n <Icone icone={icone} />\r\n <span className=\"lp-fsec-legenda-txt\" id={`${id}-t`}>\r\n {legenda}\r\n </span>\r\n {acoes && <span className=\"lp-fsec-acoes\">{acoes}</span>}\r\n </div>\r\n {grade}\r\n </section>\r\n );\r\n}\r\n","import { forwardRef, type ChangeEvent, type TextareaHTMLAttributes } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Campo, descricaoDe, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\r\nimport './CampoTextarea.css';\r\n\r\ntype TextareaNativo = Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'value' | 'className'>;\r\n\r\nexport interface CampoTextareaProps extends Omit<CampoBaseProps, 'variante'>, TextareaNativo {\r\n valor?: string;\r\n aoMudar?: (valor: string) => void;\r\n /** Com `maxLength`, mostra o contador `n/máx` no canto. */\r\n contador?: boolean;\r\n}\r\n\r\nexport const CampoTextarea = forwardRef<HTMLTextAreaElement, CampoTextareaProps>(function CampoTextarea(\r\n { rotulo, dica, erro, aviso, obrigatorio, className, id: idExterno, valor, aoMudar, onChange, maxLength, contador = true, rows = 3, ...resto },\r\n ref,\r\n) {\r\n const { id, msgId } = useCampoIds(idExterno);\r\n const comContador = contador && !!maxLength;\r\n const tamanho = valor?.length ?? 0;\r\n const pct = maxLength ? tamanho / maxLength : 0;\r\n\r\n const aoDigitar = (e: ChangeEvent<HTMLTextAreaElement>) => {\r\n aoMudar?.(e.target.value);\r\n onChange?.(e);\r\n };\r\n\r\n return (\r\n <Campo rotulo={rotulo} dica={dica} erro={erro} aviso={aviso} obrigatorio={obrigatorio} className={className} htmlFor={id} msgId={msgId}>\r\n <div className=\"lp-ta\">\r\n <textarea\r\n ref={ref}\r\n id={id}\r\n rows={rows}\r\n className={cx('lp-input', comContador && 'lp-ta--contador')}\r\n value={valor}\r\n onChange={aoDigitar}\r\n maxLength={maxLength}\r\n required={obrigatorio}\r\n aria-required={obrigatorio || undefined}\r\n aria-invalid={erro ? true : undefined}\r\n aria-describedby={descricaoDe({ erro, aviso, dica }, msgId)}\r\n {...resto}\r\n />\r\n {comContador && (\r\n <span\r\n className={cx('lp-ta-contador', pct >= 1 ? 'is-err' : pct >= 0.9 && 'is-warn')}\r\n aria-hidden=\"true\"\r\n >\r\n {tamanho}/{maxLength}\r\n </span>\r\n )}\r\n </div>\r\n </Campo>\r\n );\r\n});\r\n","import { useCallback, useLayoutEffect, useState, type RefObject } from 'react';\r\n\r\nexport interface PosicaoFlutuante {\r\n top: number;\r\n left: number;\r\n width: number;\r\n /** true quando abriu para CIMA por falta de espaço embaixo */\r\n acima: boolean;\r\n}\r\n\r\n/**\r\n * Posição `fixed` de um painel flutuante ancorado num elemento (select,\r\n * dica). Recalcula em scroll (de qualquer container) e resize.\r\n */\r\nexport function usePosicaoFlutuante(\r\n ancora: RefObject<HTMLElement | null>,\r\n aberto: boolean,\r\n alturaEstimada = 260,\r\n espaco = 4,\r\n): PosicaoFlutuante | null {\r\n const [pos, setPos] = useState<PosicaoFlutuante | null>(null);\r\n\r\n const medir = useCallback(() => {\r\n const el = ancora.current;\r\n if (!el) return;\r\n const r = el.getBoundingClientRect();\r\n const abaixo = window.innerHeight - r.bottom;\r\n const acima = abaixo < alturaEstimada && r.top > abaixo;\r\n setPos({\r\n top: acima ? r.top - espaco : r.bottom + espaco,\r\n left: r.left,\r\n width: r.width,\r\n acima,\r\n });\r\n }, [ancora, alturaEstimada, espaco]);\r\n\r\n useLayoutEffect(() => {\r\n if (!aberto) {\r\n setPos(null);\r\n return;\r\n }\r\n medir();\r\n window.addEventListener('scroll', medir, true);\r\n window.addEventListener('resize', medir);\r\n return () => {\r\n window.removeEventListener('scroll', medir, true);\r\n window.removeEventListener('resize', medir);\r\n };\r\n }, [aberto, medir]);\r\n\r\n return pos;\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { useCallback, useEffect, useRef, useState, type KeyboardEvent } from 'react';\r\nimport { portal } from '../../utils/portal';\r\nimport { cx } from '../../utils/cx';\r\nimport { normalizar } from '../../utils/texto';\r\nimport type { Opcao } from '../../utils/tipos';\r\nimport { useCliqueFora } from '../../utils/useCliqueFora';\r\nimport { usePosicaoFlutuante } from '../../utils/usePosicaoFlutuante';\r\nimport { Campo, descricaoDe, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\r\nimport './CampoSelect.css';\r\n\r\ninterface BaseSelectProps<V> extends CampoBaseProps {\r\n opcoes: Opcao<V>[];\r\n placeholder?: string;\r\n /** Digitar filtra as opções. */\r\n comBusca?: boolean;\r\n /** Mostra o \"×\" para limpar quando há valor. */\r\n botaoLimpar?: boolean;\r\n disabled?: boolean;\r\n id?: string;\r\n}\r\n\r\nexport interface CampoSelectProps<V = string> extends BaseSelectProps<V> {\r\n valor?: V | null;\r\n aoMudar?: (valor: V | null) => void;\r\n}\r\n\r\nexport interface CampoSelectMultiploProps<V = string> extends BaseSelectProps<V> {\r\n valor?: V[];\r\n aoMudar?: (valor: V[]) => void;\r\n}\r\n\r\n\r\ninterface InternoProps<V> extends BaseSelectProps<V> {\r\n multiplo: boolean;\r\n selecionados: V[];\r\n alternar: (o: Opcao<V>) => void;\r\n limpar: () => void;\r\n}\r\n\r\nfunction SelectInterno<V>({\r\n rotulo,\r\n dica,\r\n erro,\r\n aviso,\r\n obrigatorio,\r\n variante = 'campo',\r\n className,\r\n id: idExterno,\r\n opcoes,\r\n placeholder = 'Selecione',\r\n comBusca = false,\r\n botaoLimpar = false,\r\n disabled = false,\r\n multiplo,\r\n selecionados,\r\n alternar,\r\n limpar,\r\n}: InternoProps<V>) {\r\n const { id, msgId } = useCampoIds(idExterno);\r\n const listaId = `${id}-lista`;\r\n const inline = variante === 'inline';\r\n\r\n const moldura = useRef<HTMLDivElement>(null);\r\n const painel = useRef<HTMLDivElement>(null);\r\n const gatilho = useRef<HTMLDivElement & HTMLInputElement>(null);\r\n\r\n const [aberto, setAberto] = useState(false);\r\n const [ativo, setAtivo] = useState(-1);\r\n const [termo, setTermo] = useState('');\r\n\r\n const pos = usePosicaoFlutuante(moldura, aberto);\r\n const estaSel = (o: Opcao<V>) => selecionados.some((v) => Object.is(v, o.valor));\r\n\r\n const visiveis = comBusca && termo.trim()\r\n ? opcoes.filter((o) => normalizar(o.rotulo).includes(normalizar(termo.trim())))\r\n : opcoes;\r\n\r\n const rotuloSelecao = opcoes\r\n .filter(estaSel)\r\n .map((o) => o.rotulo)\r\n .join(', ');\r\n\r\n const fechar = useCallback(() => {\r\n setAberto(false);\r\n setTermo('');\r\n setAtivo(-1);\r\n }, []);\r\n\r\n const abrir = () => {\r\n if (disabled) return;\r\n const idx = opcoes.findIndex(estaSel);\r\n setAtivo(idx >= 0 ? idx : 0);\r\n setAberto(true);\r\n };\r\n\r\n useCliqueFora([moldura, painel], aberto, fechar);\r\n\r\n // mantém a opção ativa visível ao navegar por teclado\r\n useEffect(() => {\r\n if (aberto && ativo >= 0) document.getElementById(`${id}-op-${ativo}`)?.scrollIntoView({ block: 'nearest' });\r\n }, [aberto, ativo, id]);\r\n\r\n const mover = (passo: number) => {\r\n if (!visiveis.length) return;\r\n let i = ativo;\r\n for (let n = 0; n < visiveis.length; n++) {\r\n i = (i + passo + visiveis.length) % visiveis.length;\r\n if (!visiveis[i].desabilitada) break;\r\n }\r\n setAtivo(i);\r\n };\r\n\r\n const escolher = (o: Opcao<V>) => {\r\n if (o.desabilitada) return;\r\n alternar(o);\r\n if (!multiplo) {\r\n fechar();\r\n gatilho.current?.focus();\r\n } else {\r\n setTermo('');\r\n }\r\n };\r\n\r\n const aoTeclar = (e: KeyboardEvent) => {\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n if (aberto) mover(1);\r\n else abrir();\r\n break;\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n if (aberto) mover(-1);\r\n else abrir();\r\n break;\r\n case 'Home':\r\n if (aberto) {\r\n e.preventDefault();\r\n setAtivo(0);\r\n }\r\n break;\r\n case 'End':\r\n if (aberto) {\r\n e.preventDefault();\r\n setAtivo(visiveis.length - 1);\r\n }\r\n break;\r\n case 'Enter':\r\n e.preventDefault();\r\n if (aberto && visiveis[ativo]) escolher(visiveis[ativo]);\r\n else if (!aberto) abrir();\r\n break;\r\n case ' ':\r\n if (comBusca) break;\r\n e.preventDefault();\r\n if (aberto && visiveis[ativo]) escolher(visiveis[ativo]);\r\n else abrir();\r\n break;\r\n case 'Escape':\r\n if (aberto) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n fechar();\r\n }\r\n break;\r\n case 'Tab':\r\n if (aberto) fechar();\r\n break;\r\n }\r\n };\r\n\r\n const ariaComum = {\r\n id,\r\n role: 'combobox',\r\n 'aria-expanded': aberto,\r\n 'aria-controls': listaId,\r\n 'aria-haspopup': 'listbox' as const,\r\n 'aria-activedescendant': aberto && ativo >= 0 ? `${id}-op-${ativo}` : undefined,\r\n 'aria-required': obrigatorio || undefined,\r\n 'aria-invalid': erro ? true : undefined,\r\n 'aria-describedby': descricaoDe({ erro, aviso, dica }, msgId),\r\n 'aria-disabled': disabled || undefined,\r\n onKeyDown: aoTeclar,\r\n };\r\n\r\n return (\r\n <Campo\r\n rotulo={rotulo}\r\n dica={dica}\r\n erro={erro}\r\n aviso={aviso}\r\n obrigatorio={obrigatorio}\r\n variante={variante}\r\n className={className}\r\n htmlFor={id}\r\n msgId={msgId}\r\n >\r\n <div\r\n ref={moldura}\r\n className={cx('lp-sel', !inline && 'lp-ctl-frame', erro && 'is-invalid', disabled && 'is-disabled')}\r\n >\r\n {comBusca ? (\r\n <input\r\n ref={gatilho}\r\n {...ariaComum}\r\n className=\"lp-input lp-input--bare lp-sel-input\"\r\n aria-autocomplete=\"list\"\r\n autoComplete=\"off\"\r\n disabled={disabled}\r\n placeholder={rotuloSelecao || placeholder}\r\n value={aberto ? termo : rotuloSelecao}\r\n onChange={(e) => {\r\n setTermo(e.target.value);\r\n setAtivo(0);\r\n if (!aberto) setAberto(true);\r\n }}\r\n onClick={() => !aberto && abrir()}\r\n />\r\n ) : (\r\n <div\r\n ref={gatilho}\r\n {...ariaComum}\r\n tabIndex={disabled ? -1 : 0}\r\n className=\"lp-sel-gatilho\"\r\n onClick={() => (aberto ? fechar() : abrir())}\r\n >\r\n <span className={cx('lp-sel-texto', !rotuloSelecao && 'lp-sel-ph')}>{rotuloSelecao || placeholder}</span>\r\n </div>\r\n )}\r\n {botaoLimpar && selecionados.length > 0 && !disabled && (\r\n <button type=\"button\" className=\"lp-ctl-suffix\" aria-label=\"Limpar seleção\" onClick={limpar}>\r\n <Icone icone=\"x\" />\r\n </button>\r\n )}\r\n <button\r\n type=\"button\"\r\n className=\"lp-ctl-suffix lp-sel-seta\"\r\n tabIndex={-1}\r\n aria-hidden=\"true\"\r\n disabled={disabled}\r\n onClick={() => {\r\n if (aberto) fechar();\r\n else {\r\n abrir();\r\n gatilho.current?.focus();\r\n }\r\n }}\r\n >\r\n <Icone icone={aberto ? 'chevron-up' : 'chevron-down'} />\r\n </button>\r\n </div>\r\n\r\n {aberto &&\r\n pos &&\r\n portal(\r\n <div\r\n ref={painel}\r\n className=\"lp-sel-painel\"\r\n style={{\r\n top: pos.top,\r\n left: pos.left,\r\n width: pos.width,\r\n transform: pos.acima ? 'translateY(-100%)' : undefined,\r\n }}\r\n >\r\n <ul id={listaId} role=\"listbox\" className=\"lp-sel-lista\" aria-multiselectable={multiplo || undefined}>\r\n {visiveis.map((o, i) => {\r\n const sel = estaSel(o);\r\n return (\r\n <li\r\n key={i}\r\n id={`${id}-op-${i}`}\r\n role=\"option\"\r\n aria-selected={sel}\r\n aria-disabled={o.desabilitada || undefined}\r\n data-ativo={i === ativo || undefined}\r\n className=\"lp-sel-op\"\r\n onMouseDown={(e) => e.preventDefault()}\r\n onMouseEnter={() => setAtivo(i)}\r\n onClick={() => escolher(o)}\r\n >\r\n {multiplo && <span className=\"lp-sel-check\" aria-hidden=\"true\" />}\r\n {o.rotulo}\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {!visiveis.length && (\r\n <div className=\"lp-sel-nada\" role=\"status\">\r\n Nenhum resultado encontrado\r\n </div>\r\n )}\r\n </div>,\r\n )}\r\n </Campo>\r\n );\r\n}\r\n\r\n/** Select de opção única. */\r\nexport function CampoSelect<V = string>({ valor, aoMudar, ...p }: CampoSelectProps<V>) {\r\n const temValor = valor !== null && valor !== undefined;\r\n return (\r\n <SelectInterno<V>\r\n {...p}\r\n multiplo={false}\r\n selecionados={temValor ? [valor] : []}\r\n alternar={(o) => aoMudar?.(o.valor)}\r\n limpar={() => aoMudar?.(null)}\r\n />\r\n );\r\n}\r\n\r\n/** Select de várias opções (com caixas de marcação). */\r\nexport function CampoSelectMultiplo<V = string>({ valor = [], aoMudar, ...p }: CampoSelectMultiploProps<V>) {\r\n return (\r\n <SelectInterno<V>\r\n {...p}\r\n multiplo\r\n selecionados={valor}\r\n alternar={(o) =>\r\n aoMudar?.(valor.some((v) => Object.is(v, o.valor)) ? valor.filter((v) => !Object.is(v, o.valor)) : [...valor, o.valor])\r\n }\r\n limpar={() => aoMudar?.([])}\r\n />\r\n );\r\n}\r\n","import { ESTADOS, TIPOS_PESSOA } from '../../utils/constantes';\r\nimport { CampoSelect, CampoSelectMultiplo, type CampoSelectMultiploProps, type CampoSelectProps } from '../CampoSelect/CampoSelect';\r\n\r\ntype SemOpcoes<P> = Omit<P, 'opcoes'>;\r\n\r\nexport interface CampoUfProps extends SemOpcoes<CampoSelectProps<string>> {\r\n /** `sigla` = \"PR\" · `completo` = \"PR — Paraná\" (padrão). */\r\n exibicao?: 'sigla' | 'completo';\r\n}\r\n\r\nconst opcoesUf = (exibicao: CampoUfProps['exibicao']) =>\r\n ESTADOS.map((e) => ({ valor: e.uf, rotulo: exibicao === 'sigla' ? e.uf : `${e.uf} — ${e.descricao}` }));\r\n\r\n/** UF (estado) a partir de `ESTADOS`; o valor é a sigla. */\r\nexport function CampoUf({ exibicao = 'completo', comBusca = true, placeholder = 'UF', ...p }: CampoUfProps) {\r\n return <CampoSelect<string> opcoes={opcoesUf(exibicao)} comBusca={comBusca} placeholder={placeholder} {...p} />;\r\n}\r\n\r\nexport interface CampoUfMultiploProps extends SemOpcoes<CampoSelectMultiploProps<string>> {\r\n exibicao?: 'sigla' | 'completo';\r\n}\r\n\r\n/** Várias UFs; o valor é a lista de siglas. */\r\nexport function CampoUfMultiplo({ exibicao = 'completo', comBusca = true, placeholder = 'UFs', ...p }: CampoUfMultiploProps) {\r\n return <CampoSelectMultiplo<string> opcoes={opcoesUf(exibicao)} comBusca={comBusca} placeholder={placeholder} {...p} />;\r\n}\r\n\r\nexport type CampoTipoPessoaProps = SemOpcoes<CampoSelectProps<'F' | 'J'>>;\r\n\r\n/** Pessoa física (`F`) ou jurídica (`J`). */\r\nexport function CampoTipoPessoa({ placeholder = 'Selecione', ...p }: CampoTipoPessoaProps) {\r\n return <CampoSelect<'F' | 'J'> opcoes={[...TIPOS_PESSOA]} placeholder={placeholder} {...p} />;\r\n}\r\n","import { useRef, type KeyboardEvent } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport type { Opcao } from '../../utils/tipos';\r\nimport { Campo, descricaoDe, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\r\nimport './Escolha.css';\r\n\r\nexport interface EscolhaProps<V = string> extends Omit<CampoBaseProps, 'variante' | 'aviso'> {\r\n opcoes: Opcao<V>[];\r\n valor?: V | null;\r\n aoMudar?: (valor: V) => void;\r\n /** `segmentado` = botões colados · `radio` = lista de bolinhas. */\r\n aparencia?: 'segmentado' | 'radio';\r\n disabled?: boolean;\r\n ariaLabel?: string;\r\n id?: string;\r\n}\r\n\r\n/** Escolha única entre poucas opções (radiogroup). */\r\nexport function Escolha<V = string>({\r\n rotulo,\r\n dica,\r\n erro,\r\n obrigatorio,\r\n className,\r\n opcoes,\r\n valor,\r\n aoMudar,\r\n aparencia = 'segmentado',\r\n disabled = false,\r\n ariaLabel,\r\n id: idExterno,\r\n}: EscolhaProps<V>) {\r\n const { id, msgId } = useCampoIds(idExterno);\r\n const grupo = useRef<HTMLDivElement>(null);\r\n const idxSel = opcoes.findIndex((o) => Object.is(o.valor, valor));\r\n const idxFoco = idxSel >= 0 ? idxSel : 0;\r\n\r\n const aoTeclar = (e: KeyboardEvent, i: number) => {\r\n const passo = e.key === 'ArrowRight' || e.key === 'ArrowDown' ? 1 : e.key === 'ArrowLeft' || e.key === 'ArrowUp' ? -1 : 0;\r\n if (!passo) return;\r\n e.preventDefault();\r\n let j = i;\r\n for (let n = 0; n < opcoes.length; n++) {\r\n j = (j + passo + opcoes.length) % opcoes.length;\r\n if (!opcoes[j].desabilitada) break;\r\n }\r\n aoMudar?.(opcoes[j].valor);\r\n grupo.current?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]')[j]?.focus();\r\n };\r\n\r\n return (\r\n <Campo rotulo={rotulo} dica={dica} erro={erro} obrigatorio={obrigatorio} className={cx('lp-escolha-campo', className)} msgId={msgId}>\r\n <div\r\n ref={grupo}\r\n id={id}\r\n role=\"radiogroup\"\r\n className={cx('lp-esc', aparencia === 'radio' && 'lp-esc--radio')}\r\n aria-label={rotulo ?? ariaLabel}\r\n aria-required={obrigatorio || undefined}\r\n aria-invalid={erro ? true : undefined}\r\n aria-describedby={descricaoDe({ erro, dica }, msgId)}\r\n >\r\n {opcoes.map((o, i) => {\r\n const on = i === idxSel;\r\n return (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n role=\"radio\"\r\n aria-checked={on}\r\n className={cx('lp-esc-op', on && 'is-on')}\r\n tabIndex={i === idxFoco ? 0 : -1}\r\n disabled={disabled || o.desabilitada}\r\n onClick={() => aoMudar?.(o.valor)}\r\n onKeyDown={(e) => aoTeclar(e, i)}\r\n >\r\n {aparencia === 'radio' && <span className=\"lp-esc-dot\" aria-hidden=\"true\" />}\r\n {o.rotulo}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </Campo>\r\n );\r\n}\r\n","import { useId, useState, type CSSProperties, type MouseEvent } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone } from '../../utils/Icone';\r\nimport './Avaliacao.css';\r\n\r\nexport interface AvaliacaoProps {\r\n /** Nota atual (0 = sem nota). */\r\n valor: number;\r\n /**\r\n * Muda a nota. Se devolver uma Promise (ex.: salvar no servidor), o\r\n * componente fica ocupado até ela terminar.\r\n */\r\n aoMudar?: (valor: number) => void | Promise<unknown>;\r\n /** Quantidade de estrelas. */\r\n max?: number;\r\n /** `1` = estrelas inteiras · `0.5` = meias estrelas. */\r\n passo?: 1 | 0.5;\r\n /** Só mostra a nota (aceita fração, ex.: 3.7). */\r\n somenteLeitura?: boolean;\r\n /** Nome para leitor de tela (ex.: \"Avaliação do produto\"). */\r\n rotulo: string;\r\n icone?: 'star' | 'heart';\r\n tamanho?: 'pequeno' | 'medio' | 'grande';\r\n /** Texto para cada nota inteira (índice 0 = 1 estrela), mostrado ao lado. */\r\n mensagens?: string[];\r\n /** Chamado ao passar o mouse (com a nota sob o ponteiro, ou `null` ao sair). */\r\n aoPassar?: (valor: number | null) => void;\r\n /** Botão para limpar a nota. */\r\n limpavel?: boolean;\r\n /** Texto enquanto `aoMudar` não termina. */\r\n textoOcupado?: string;\r\n className?: string;\r\n}\r\n\r\nconst fmt = (v: number) => v.toLocaleString('pt-BR', { maximumFractionDigits: 1 });\r\n\r\n/** Avaliação por estrelas (ou corações): editável, com meias estrelas, ou só leitura. */\r\nexport function Avaliacao({\r\n valor,\r\n aoMudar,\r\n max = 5,\r\n passo = 1,\r\n somenteLeitura = false,\r\n rotulo,\r\n icone = 'star',\r\n tamanho = 'medio',\r\n mensagens,\r\n aoPassar,\r\n limpavel = false,\r\n textoOcupado = 'Salvando...',\r\n className,\r\n}: AvaliacaoProps) {\r\n const nome = useId();\r\n const [sob, setSob] = useState<number | null>(null);\r\n const [ocupado, setOcupado] = useState(false);\r\n const exibido = sob ?? valor;\r\n const bloqueado = somenteLeitura || ocupado;\r\n\r\n const escolher = async (v: number) => {\r\n if (bloqueado) return;\r\n const r = aoMudar?.(v);\r\n if (r instanceof Promise) {\r\n setOcupado(true);\r\n try {\r\n await r;\r\n } finally {\r\n setOcupado(false);\r\n }\r\n }\r\n };\r\n\r\n // nota sob o ponteiro: com meias estrelas, a metade esquerda vale x,5\r\n const notaNoPonteiro = (e: MouseEvent<HTMLSpanElement>, i: number) => {\r\n if (passo === 1) return i + 1;\r\n const r = e.currentTarget.getBoundingClientRect();\r\n return e.clientX - r.left < r.width / 2 ? i + 0.5 : i + 1;\r\n };\r\n const passar = (v: number | null) => {\r\n if (bloqueado) return;\r\n setSob(v);\r\n aoPassar?.(v);\r\n };\r\n\r\n const estrelas = Array.from({ length: max }, (_, i) => {\r\n const preenchido = Math.max(0, Math.min(1, exibido - i)) * 100;\r\n return (\r\n <span\r\n key={i}\r\n className=\"lp-aval-estrela\"\r\n style={{ '--aval-pct': `${preenchido}%` } as CSSProperties}\r\n onMouseMove={bloqueado ? undefined : (e) => passar(notaNoPonteiro(e, i))}\r\n onClick={bloqueado ? undefined : (e) => escolher(notaNoPonteiro(e, i))}\r\n aria-hidden=\"true\"\r\n >\r\n <Icone icone={icone} className=\"lp-aval-fundo\" />\r\n <span className=\"lp-aval-cheia\">\r\n <Icone icone={icone} />\r\n </span>\r\n </span>\r\n );\r\n });\r\n\r\n const mensagem = mensagens && exibido > 0 ? mensagens[Math.ceil(exibido) - 1] : undefined;\r\n const classes = cx('lp-aval', `lp-aval--${tamanho}`, icone === 'heart' && 'lp-aval--coracao', ocupado && 'is-ocupado', className);\r\n\r\n if (somenteLeitura)\r\n return (\r\n <span className={classes} role=\"img\" aria-label={`${rotulo}: ${fmt(valor)} de ${max}`}>\r\n <span className=\"lp-aval-estrelas\">{estrelas}</span>\r\n </span>\r\n );\r\n\r\n // rádios escondidos: setas, Tab e leitor de tela funcionam sem código extra\r\n const opcoes: number[] = [];\r\n for (let v = passo; v <= max; v += passo) opcoes.push(v);\r\n\r\n return (\r\n <span className={classes}>\r\n <span className=\"lp-aval-estrelas\" role=\"radiogroup\" aria-label={rotulo} aria-busy={ocupado || undefined} onMouseLeave={() => passar(null)}>\r\n {estrelas}\r\n <span className=\"lp-sr\">\r\n {opcoes.map((v) => (\r\n <label key={v}>\r\n <input\r\n type=\"radio\"\r\n name={nome}\r\n value={v}\r\n checked={valor === v}\r\n disabled={ocupado}\r\n onChange={() => escolher(v)}\r\n onFocus={() => setSob(null)}\r\n />\r\n {fmt(v)} de {max}\r\n </label>\r\n ))}\r\n </span>\r\n </span>\r\n {ocupado ? (\r\n <span className=\"lp-aval-msg\" role=\"status\">\r\n {textoOcupado}\r\n </span>\r\n ) : (\r\n mensagem && <span className=\"lp-aval-msg\">{mensagem}</span>\r\n )}\r\n {limpavel && valor > 0 && !ocupado && (\r\n <button type=\"button\" className=\"lp-aval-limpar\" onClick={() => escolher(0)}>\r\n Limpar\r\n </button>\r\n )}\r\n </span>\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { cx } from '../../utils/cx';\r\nimport './Chip.css';\r\n\r\nexport interface ChipProps {\r\n rotulo: string;\r\n /** Nome do que está etiquetado (ex.: \"Protocolo\" → PROTOCOLO: 123). */\r\n campo?: string;\r\n /** Mostra o \"×\" e dispara `aoRemover`. */\r\n aoRemover?: () => void;\r\n /** `false` tira o \"×\" da ordem do Tab (chips dentro de controles compostos). */\r\n focavel?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport function Chip({ rotulo, campo, aoRemover, focavel = true, className }: ChipProps) {\r\n return (\r\n <span className={cx('lp-chip', className)}>\r\n {campo && <span className=\"lp-chip-campo\">{campo}:</span>}\r\n <span className=\"lp-chip-rotulo\">{rotulo}</span>\r\n {aoRemover && (\r\n <button\r\n type=\"button\"\r\n className=\"lp-chip-remover\"\r\n tabIndex={focavel ? undefined : -1}\r\n aria-label={`Remover ${campo ? `${campo}: ` : ''}${rotulo}`}\r\n onClick={aoRemover}\r\n >\r\n <Icone icone=\"x\" />\r\n </button>\r\n )}\r\n </span>\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport type { FormEvent, ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Alerta } from '../Alerta/Alerta';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { Chip } from '../Chip/Chip';\r\nimport './Filtros.css';\r\n\r\nexport interface FiltroAplicado {\r\n campo: string;\r\n rotulo: string;\r\n aoRemover?: () => void;\r\n}\r\n\r\nexport interface FiltrosProps {\r\n /** Campos de filtro — de preferência com `variante=\"inline\"`. */\r\n children: ReactNode;\r\n aoConsultar: () => void;\r\n aoLimpar?: () => void;\r\n /** Chips dos filtros já aplicados. */\r\n aplicados?: FiltroAplicado[];\r\n /** Há mudanças ainda não consultadas (ponto âmbar + aviso). */\r\n alterado?: boolean;\r\n consultando?: boolean;\r\n /** `barra` = linha única em card · `secao` = moldura com legenda \"Filtros\". */\r\n aparencia?: 'barra' | 'secao';\r\n className?: string;\r\n}\r\n\r\n/** Barra de filtros de listagem: campos + Consultar + Limpar + chips. */\r\nexport function Filtros({\r\n children,\r\n aoConsultar,\r\n aoLimpar,\r\n aplicados = [],\r\n alterado,\r\n consultando,\r\n aparencia = 'barra',\r\n className,\r\n}: FiltrosProps) {\r\n const aoSubmeter = (e: FormEvent) => {\r\n e.preventDefault();\r\n aoConsultar();\r\n };\r\n return (\r\n <div className={cx('lp-filtros', className)}>\r\n <form onSubmit={aoSubmeter} noValidate>\r\n <fieldset className={cx('lp-ff', aparencia === 'secao' && 'lp-ff--secao')}>\r\n {aparencia === 'secao' && (\r\n <legend className=\"lp-ff-leg\">\r\n <Icone icone=\"funnel\" />\r\n Filtros\r\n </legend>\r\n )}\r\n <div className={cx('lp-fb', aparencia === 'secao' && 'lp-fb--secao')}>\r\n <div className=\"lp-fb-campos\">{children}</div>\r\n <div className=\"lp-fb-acoes\">\r\n <span className=\"lp-fb-consultar\">\r\n <Botao\r\n type=\"submit\"\r\n rotulo=\"Consultar\"\r\n icone=\"search\"\r\n carregando={consultando}\r\n aria-label={alterado ? 'Consultar, filtros alterados' : 'Consultar'}\r\n />\r\n {alterado && <span className=\"lp-fb-ponto\" aria-hidden=\"true\" />}\r\n </span>\r\n {aoLimpar && (\r\n <Botao icone=\"funnel-x\" severidade=\"secundario\" aria-label=\"Limpar filtros\" dica=\"Limpar filtros\" onClick={aoLimpar} />\r\n )}\r\n </div>\r\n </div>\r\n </fieldset>\r\n </form>\r\n {alterado && (\r\n <div className=\"lp-fb-avisos\">\r\n <Alerta severidade=\"warn\" mensagem=\"Filtros alterados — clique em Consultar para atualizar a lista.\" />\r\n </div>\r\n )}\r\n {aplicados.length > 0 && (\r\n <div className=\"lp-fb-chips\" role=\"list\" aria-label=\"Filtros aplicados\">\r\n {aplicados.map((f) => (\r\n <span role=\"listitem\" key={f.campo}>\r\n <Chip campo={f.campo} rotulo={f.rotulo} aoRemover={f.aoRemover} />\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { useContext, useRef, useState, type DragEvent, type KeyboardEvent, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport {\r\n filtrarItens,\r\n moverParaAlvo,\r\n moverParaFonte,\r\n normalizarPicklistValor,\r\n reordenarLista,\r\n type PicklistValor,\r\n} from '../../utils/picklist';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { Campo, MSG_OBRIGATORIO, RevelarCamposCtx, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\r\nimport './Picklist.css';\r\n\r\nexport interface PicklistProps<T> extends Omit<CampoBaseProps, 'variante'> {\r\n valor?: PicklistValor<T>;\r\n aoMudar?: (valor: PicklistValor<T>) => void;\r\n rotuloFonte?: string;\r\n rotuloAlvo?: string;\r\n /** Texto do item (linha, filtro e anúncios). Obrigatório para objetos. */\r\n paraRotulo?: (item: T) => string;\r\n /** Linha customizada; padrão = `paraRotulo(item)`. */\r\n renderItem?: (item: T) => ReactNode;\r\n /** Campo de busca no topo de cada lista. */\r\n filtro?: boolean;\r\n /** Arrastar e soltar como caminho ADICIONAL (o teclado sempre funciona). */\r\n dragdrop?: boolean;\r\n /** Reordenar dentro da lista (Alt + setas, ou arrastando). */\r\n reordenar?: boolean;\r\n alturaLista?: string;\r\n disabled?: boolean;\r\n id?: string;\r\n}\r\n\r\ntype Lado = 'fonte' | 'alvo';\r\n\r\n/**\r\n * Transferência entre duas listas (disponíveis × selecionados). Teclado:\r\n * setas movem o foco, Espaço marca, Enter transfere, Alt+setas reordena;\r\n * duplo clique também transfere.\r\n */\r\nexport function Picklist<T>({\r\n rotulo,\r\n dica,\r\n erro,\r\n aviso,\r\n obrigatorio,\r\n className,\r\n id: idExterno,\r\n valor: valorBruto,\r\n aoMudar,\r\n rotuloFonte = 'Disponíveis',\r\n rotuloAlvo = 'Selecionados',\r\n paraRotulo = (i) => (typeof i === 'string' ? i : String(i)),\r\n renderItem,\r\n filtro = false,\r\n dragdrop = true,\r\n reordenar = true,\r\n alturaLista = '15rem',\r\n disabled = false,\r\n}: PicklistProps<T>) {\r\n const { id, msgId } = useCampoIds(idExterno);\r\n const valor = normalizarPicklistValor(valorBruto);\r\n const [sel, setSel] = useState<{ fonte: Set<T>; alvo: Set<T> }>({ fonte: new Set(), alvo: new Set() });\r\n const [termo, setTermo] = useState({ fonte: '', alvo: '' });\r\n const [foco, setFoco] = useState({ fonte: 0, alvo: 0 });\r\n const [anuncio, setAnuncio] = useState('');\r\n const [mexido, setMexido] = useState(false);\r\n const tentativas = useContext(RevelarCamposCtx);\r\n const arrastado = useRef<{ lado: Lado; item: T } | null>(null);\r\n\r\n const visiveis = {\r\n fonte: filtrarItens(valor.fonte, termo.fonte, paraRotulo),\r\n alvo: filtrarItens(valor.alvo, termo.alvo, paraRotulo),\r\n };\r\n\r\n const mudar = (v: PicklistValor<T>, msg: string) => {\r\n setMexido(true);\r\n setAnuncio(msg);\r\n aoMudar?.(v);\r\n };\r\n\r\n const transferir = (de: Lado, itens: readonly T[]) => {\r\n if (!itens.length || disabled) return;\r\n const v = de === 'fonte' ? moverParaAlvo(valor, itens) : moverParaFonte(valor, itens);\r\n setSel({ fonte: new Set(), alvo: new Set() });\r\n const destino = de === 'fonte' ? rotuloAlvo : rotuloFonte;\r\n mudar(v, itens.length === 1 ? `${paraRotulo(itens[0])} movido para ${destino}` : `${itens.length} itens movidos para ${destino}`);\r\n };\r\n\r\n const marcar = (lado: Lado, item: T, aditivo: boolean) => {\r\n setSel((s) => {\r\n const atual = new Set(aditivo ? s[lado] : []);\r\n if (aditivo && atual.has(item)) atual.delete(item);\r\n else atual.add(item);\r\n return { ...s, [lado]: atual };\r\n });\r\n };\r\n\r\n const reordenarItem = (lado: Lado, item: T, passo: number) => {\r\n const lista = valor[lado];\r\n const i = lista.indexOf(item);\r\n const j = i + passo;\r\n if (i < 0 || j < 0 || j >= lista.length) return;\r\n mudar({ ...valor, [lado]: reordenarLista(lista, i, j) }, `${paraRotulo(item)} na posição ${j + 1}`);\r\n };\r\n\r\n const aoTeclar = (lado: Lado) => (e: KeyboardEvent<HTMLUListElement>) => {\r\n const lista = visiveis[lado];\r\n const i = Math.min(foco[lado], lista.length - 1);\r\n const item = lista[i];\r\n const focar = (n: number) => setFoco((f) => ({ ...f, [lado]: Math.max(0, Math.min(lista.length - 1, n)) }));\r\n if (e.altKey && reordenar && item && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\r\n e.preventDefault();\r\n if (termo[lado]) return; // reordenar com filtro ativo embaralharia a posição real\r\n const passo = e.key === 'ArrowUp' ? -1 : 1;\r\n reordenarItem(lado, item, passo);\r\n focar(i + passo);\r\n return;\r\n }\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n focar(i + 1);\r\n break;\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n focar(i - 1);\r\n break;\r\n case 'Home':\r\n e.preventDefault();\r\n focar(0);\r\n break;\r\n case 'End':\r\n e.preventDefault();\r\n focar(lista.length - 1);\r\n break;\r\n case ' ':\r\n e.preventDefault();\r\n if (item) marcar(lado, item, true);\r\n break;\r\n case 'Enter': {\r\n e.preventDefault();\r\n const marcados = lista.filter((x) => sel[lado].has(x));\r\n transferir(lado, marcados.length ? marcados : item ? [item] : []);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const soltar = (lado: Lado, antesDe?: T) => (e: DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const a = arrastado.current;\r\n arrastado.current = null;\r\n if (!a || disabled) return;\r\n if (a.lado !== lado) {\r\n transferir(a.lado, [a.item]);\r\n return;\r\n }\r\n if (!reordenar || antesDe === undefined || antesDe === a.item) return;\r\n const lista = valor[lado];\r\n mudar({ ...valor, [lado]: reordenarLista(lista, lista.indexOf(a.item), lista.indexOf(antesDe)) }, `${paraRotulo(a.item)} reordenado`);\r\n };\r\n\r\n const erroFinal = erro || (obrigatorio && !valor.alvo.length && (mexido || tentativas > 0) ? MSG_OBRIGATORIO : undefined);\r\n\r\n const coluna = (lado: Lado, titulo: string) => {\r\n const lista = visiveis[lado];\r\n const listaId = `${id}-${lado}`;\r\n const ativo = Math.min(foco[lado], lista.length - 1);\r\n return (\r\n <div className=\"lp-pick-col\">\r\n <div className=\"lp-pick-cab\">\r\n <span id={`${listaId}-t`}>{titulo}</span>\r\n <span className=\"lp-contador\">{valor[lado].length}</span>\r\n </div>\r\n {filtro && (\r\n <div className=\"lp-pick-filtro\">\r\n <Icone icone=\"search\" />\r\n <input\r\n className=\"lp-input lp-input--bare\"\r\n placeholder=\"Buscar\"\r\n aria-label={`Buscar em ${titulo}`}\r\n disabled={disabled}\r\n value={termo[lado]}\r\n onChange={(e) => {\r\n setTermo((t) => ({ ...t, [lado]: e.target.value }));\r\n setFoco((f) => ({ ...f, [lado]: 0 }));\r\n }}\r\n />\r\n </div>\r\n )}\r\n <ul\r\n id={listaId}\r\n role=\"listbox\"\r\n aria-multiselectable=\"true\"\r\n aria-labelledby={`${listaId}-t`}\r\n aria-activedescendant={lista.length ? `${listaId}-${ativo}` : undefined}\r\n aria-disabled={disabled || undefined}\r\n tabIndex={disabled ? -1 : 0}\r\n className=\"lp-pick-lista\"\r\n style={{ height: alturaLista }}\r\n onKeyDown={aoTeclar(lado)}\r\n onDragOver={(e) => dragdrop && e.preventDefault()}\r\n onDrop={soltar(lado)}\r\n >\r\n {lista.map((item, i) => (\r\n <li\r\n key={i}\r\n id={`${listaId}-${i}`}\r\n role=\"option\"\r\n aria-selected={sel[lado].has(item)}\r\n data-ativo={i === ativo || undefined}\r\n className=\"lp-pick-item\"\r\n draggable={dragdrop && !disabled}\r\n onDragStart={() => (arrastado.current = { lado, item })}\r\n onDragOver={(e) => dragdrop && e.preventDefault()}\r\n onDrop={soltar(lado, item)}\r\n onClick={(e) => {\r\n if (disabled) return;\r\n setFoco((f) => ({ ...f, [lado]: i }));\r\n marcar(lado, item, e.ctrlKey || e.metaKey);\r\n }}\r\n onDoubleClick={() => transferir(lado, [item])}\r\n >\r\n {dragdrop && !disabled && <Icone icone=\"menu\" className=\"lp-pick-alca\" />}\r\n <span className=\"lp-pick-rot\">{renderItem ? renderItem(item) : paraRotulo(item)}</span>\r\n </li>\r\n ))}\r\n {!lista.length && <li className=\"lp-pick-vazio\">{termo[lado] ? 'Nada encontrado' : 'Nenhum item'}</li>}\r\n </ul>\r\n </div>\r\n );\r\n };\r\n\r\n const marcadosFonte = visiveis.fonte.filter((x) => sel.fonte.has(x));\r\n const marcadosAlvo = visiveis.alvo.filter((x) => sel.alvo.has(x));\r\n\r\n return (\r\n <Campo rotulo={rotulo} dica={dica} erro={erroFinal} aviso={aviso} obrigatorio={obrigatorio} className={className} msgId={msgId}>\r\n <div className={cx('lp-pick', disabled && 'is-disabled', erroFinal && 'is-invalid')} aria-describedby={erroFinal || aviso || dica ? msgId : undefined}>\r\n {coluna('fonte', rotuloFonte)}\r\n <div className=\"lp-pick-acoes\">\r\n <Botao icone=\"chevron-right\" severidade=\"secundario\" aparencia=\"contorno\" dica=\"Mover selecionados\" aria-label=\"Mover selecionados\" disabled={disabled || !marcadosFonte.length} onClick={() => transferir('fonte', marcadosFonte)} />\r\n <Botao icone=\"chevrons-right\" severidade=\"secundario\" aparencia=\"contorno\" dica=\"Mover todos\" aria-label=\"Mover todos\" disabled={disabled || !visiveis.fonte.length} onClick={() => transferir('fonte', visiveis.fonte)} />\r\n <Botao icone=\"chevron-left\" severidade=\"secundario\" aparencia=\"contorno\" dica=\"Devolver selecionados\" aria-label=\"Devolver selecionados\" disabled={disabled || !marcadosAlvo.length} onClick={() => transferir('alvo', marcadosAlvo)} />\r\n <Botao icone=\"chevrons-left\" severidade=\"secundario\" aparencia=\"contorno\" dica=\"Devolver todos\" aria-label=\"Devolver todos\" disabled={disabled || !visiveis.alvo.length} onClick={() => transferir('alvo', visiveis.alvo)} />\r\n </div>\r\n {coluna('alvo', rotuloAlvo)}\r\n <span className=\"lp-sr\" aria-live=\"polite\">\r\n {anuncio}\r\n </span>\r\n </div>\r\n </Campo>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from 'react';\r\n\r\n/** Espera padrão entre a última tecla e a busca (ms). */\r\nexport const BUSCA_ATRASO_MS = 300;\r\n\r\nexport interface OpcoesBuscaAssincrona<T> {\r\n /** A busca é do módulo: termo → registros. */\r\n buscar: (termo: string) => Promise<T[]>;\r\n /** Só busca enquanto `true` (ex.: painel aberto). Ao ligar, busca na hora, sem espera. */\r\n ativo?: boolean;\r\n /** Mínimo de caracteres; abaixo dele limpa sem chamar a API. */\r\n minimo?: number;\r\n atraso?: number;\r\n}\r\n\r\n/**\r\n * Busca remota com espera de digitação e descarte de resposta velha: só a\r\n * requisição MAIS RECENTE escreve o resultado (\"ab\" que volta depois de\r\n * \"abc\" é ignorada). Erro da API vira lista vazia.\r\n */\r\nexport function useBuscaAssincrona<T>({ buscar, ativo = true, minimo = 0, atraso = BUSCA_ATRASO_MS }: OpcoesBuscaAssincrona<T>) {\r\n const [termo, setTermo] = useState('');\r\n const [resultados, setResultados] = useState<T[]>([]);\r\n const [carregando, setCarregando] = useState(false);\r\n const seq = useRef(0);\r\n const buscarRef = useRef(buscar);\r\n buscarRef.current = buscar;\r\n const estavaAtivo = useRef(false);\r\n\r\n useEffect(() => {\r\n if (!ativo) {\r\n estavaAtivo.current = false;\r\n seq.current++;\r\n setCarregando(false);\r\n return;\r\n }\r\n const primeira = !estavaAtivo.current;\r\n estavaAtivo.current = true;\r\n if (termo.trim().length < minimo) {\r\n seq.current++;\r\n setResultados([]);\r\n setCarregando(false);\r\n return;\r\n }\r\n const minha = ++seq.current;\r\n setCarregando(true);\r\n const t = setTimeout(\r\n () => {\r\n buscarRef\r\n .current(termo.trim())\r\n .then((r) => minha === seq.current && setResultados(r))\r\n .catch(() => minha === seq.current && setResultados([]))\r\n .finally(() => minha === seq.current && setCarregando(false));\r\n },\r\n primeira ? 0 : atraso,\r\n );\r\n return () => clearTimeout(t);\r\n }, [termo, ativo, minimo, atraso]);\r\n\r\n // desmontou: nenhuma promessa pendente escreve mais\r\n useEffect(() => () => void seq.current++, []);\r\n\r\n return { termo, setTermo, resultados, carregando };\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { useCallback, useContext, useEffect, useRef, useState, type KeyboardEvent, type Key } from 'react';\r\nimport { portal } from '../../utils/portal';\r\nimport { cx } from '../../utils/cx';\r\nimport { useBuscaAssincrona, BUSCA_ATRASO_MS } from '../../utils/useBuscaAssincrona';\r\nimport { useCliqueFora } from '../../utils/useCliqueFora';\r\nimport { usePosicaoFlutuante } from '../../utils/usePosicaoFlutuante';\r\nimport { Campo, descricaoDe, MSG_OBRIGATORIO, RevelarCamposCtx, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\r\nimport '../CampoSelect/CampoSelect.css';\r\nimport './CampoBusca.css';\r\n\r\nexport interface CampoBuscaProps<T> extends CampoBaseProps {\r\n /** A busca do módulo: termo → registros. */\r\n buscar: (termo: string) => Promise<T[]>;\r\n /** Texto do registro (no campo e em cada linha do painel). */\r\n paraRotulo: (item: T) => string;\r\n /** Linha secundária opcional no painel (ex.: CPF, lotação). */\r\n paraDetalhe?: (item: T) => string | undefined;\r\n /** Chave de cada resultado (padrão: `item.id` ou o rótulo). */\r\n chave?: (item: T) => Key;\r\n /** O REGISTRO escolhido — texto digitado sem escolha não é valor. */\r\n valor?: T | null;\r\n aoMudar?: (valor: T | null) => void;\r\n /** Mínimo de caracteres para buscar (padrão: 1). */\r\n minimo?: number;\r\n atraso?: number;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n id?: string;\r\n /** Mensagem quando a busca não acha nada. */\r\n vazioTexto?: string;\r\n}\r\n\r\n/**\r\n * Autocompletar com busca no servidor: o jeito canônico de buscar e vincular\r\n * uma entidade (pessoa, servidor, fornecedor…) grande demais para carregar inteira.\r\n */\r\nexport function CampoBusca<T>({\r\n rotulo,\r\n dica,\r\n erro,\r\n aviso,\r\n obrigatorio,\r\n variante = 'campo',\r\n className,\r\n id: idExterno,\r\n buscar,\r\n paraRotulo,\r\n paraDetalhe,\r\n chave = (i) => ((i as { id?: Key }).id ?? paraRotulo(i)) as Key,\r\n valor = null,\r\n aoMudar,\r\n minimo = 1,\r\n atraso = BUSCA_ATRASO_MS,\r\n placeholder = 'Buscar…',\r\n disabled = false,\r\n vazioTexto = 'Nenhum resultado encontrado',\r\n}: CampoBuscaProps<T>) {\r\n const { id, msgId } = useCampoIds(idExterno);\r\n const listaId = `${id}-lista`;\r\n const inline = variante === 'inline';\r\n const moldura = useRef<HTMLDivElement>(null);\r\n const painel = useRef<HTMLDivElement>(null);\r\n const input = useRef<HTMLInputElement>(null);\r\n\r\n const [editando, setEditando] = useState(false);\r\n const [ativo, setAtivo] = useState(0);\r\n const [revelado, setRevelado] = useState(false);\r\n const tentativas = useContext(RevelarCamposCtx);\r\n\r\n const { termo, setTermo, resultados, carregando } = useBuscaAssincrona({ buscar, ativo: editando, minimo, atraso });\r\n const aberto = editando && termo.trim().length >= minimo;\r\n const pos = usePosicaoFlutuante(moldura, aberto);\r\n\r\n const fechar = useCallback(() => {\r\n setEditando(false);\r\n setTermo('');\r\n }, [setTermo]);\r\n useCliqueFora([moldura, painel], editando, fechar);\r\n\r\n useEffect(() => setAtivo(0), [resultados]);\r\n useEffect(() => {\r\n if (aberto) document.getElementById(`${id}-op-${ativo}`)?.scrollIntoView({ block: 'nearest' });\r\n }, [aberto, ativo, id]);\r\n\r\n const escolher = (item: T) => {\r\n aoMudar?.(item);\r\n fechar();\r\n input.current?.focus();\r\n };\r\n\r\n const aoTeclar = (e: KeyboardEvent) => {\r\n if (e.key === 'ArrowDown' && aberto) {\r\n e.preventDefault();\r\n setAtivo((i) => Math.min(i + 1, resultados.length - 1));\r\n } else if (e.key === 'ArrowUp' && aberto) {\r\n e.preventDefault();\r\n setAtivo((i) => Math.max(i - 1, 0));\r\n } else if (e.key === 'Enter' && aberto && resultados[ativo]) {\r\n e.preventDefault();\r\n escolher(resultados[ativo]);\r\n } else if (e.key === 'Escape' && editando) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n fechar();\r\n } else if (e.key === 'Tab') {\r\n fechar();\r\n }\r\n };\r\n\r\n const erroFinal = erro || (obrigatorio && !valor && (revelado || tentativas > 0) ? MSG_OBRIGATORIO : undefined);\r\n\r\n return (\r\n <Campo\r\n rotulo={rotulo}\r\n dica={dica}\r\n erro={erroFinal}\r\n aviso={aviso}\r\n obrigatorio={obrigatorio}\r\n variante={variante}\r\n className={className}\r\n htmlFor={id}\r\n msgId={msgId}\r\n >\r\n <div ref={moldura} className={cx('lp-sel', !inline && 'lp-ctl-frame', erroFinal && 'is-invalid', disabled && 'is-disabled')}>\r\n <Icone icone=\"search\" className=\"lp-busca-campo-ic\" />\r\n <input\r\n ref={input}\r\n id={id}\r\n role=\"combobox\"\r\n aria-expanded={aberto}\r\n aria-controls={listaId}\r\n aria-autocomplete=\"list\"\r\n aria-activedescendant={aberto && resultados.length ? `${id}-op-${ativo}` : undefined}\r\n aria-required={obrigatorio || undefined}\r\n aria-invalid={erroFinal ? true : undefined}\r\n aria-describedby={descricaoDe({ erro: erroFinal, aviso, dica }, msgId)}\r\n autoComplete=\"off\"\r\n className=\"lp-input lp-input--bare lp-sel-input\"\r\n disabled={disabled}\r\n placeholder={placeholder}\r\n value={editando ? termo : valor ? paraRotulo(valor) : ''}\r\n onChange={(e) => {\r\n setEditando(true);\r\n setTermo(e.target.value);\r\n // texto digitado não casa mais com o registro escolhido\r\n if (valor) aoMudar?.(null);\r\n }}\r\n onKeyDown={aoTeclar}\r\n onBlur={() => setRevelado(true)}\r\n />\r\n {carregando && editando && (\r\n <span role=\"status\" className=\"lp-busca-campo-carregando\">\r\n <Icone icone=\"loader-circle\" girar />\r\n <span className=\"lp-sr\">Buscando</span>\r\n </span>\r\n )}\r\n {valor && !disabled && !editando && (\r\n <button type=\"button\" className=\"lp-ctl-suffix\" aria-label=\"Limpar seleção\" onClick={() => aoMudar?.(null)}>\r\n <Icone icone=\"x\" />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {aberto &&\r\n pos &&\r\n portal(\r\n <div\r\n ref={painel}\r\n className=\"lp-sel-painel\"\r\n style={{ top: pos.top, left: pos.left, width: pos.width, transform: pos.acima ? 'translateY(-100%)' : undefined }}\r\n >\r\n <ul id={listaId} role=\"listbox\" className=\"lp-sel-lista\" aria-busy={carregando || undefined}>\r\n {resultados.map((item, i) => (\r\n <li\r\n key={chave(item)}\r\n id={`${id}-op-${i}`}\r\n role=\"option\"\r\n aria-selected={i === ativo}\r\n data-ativo={i === ativo || undefined}\r\n className=\"lp-sel-op lp-busca-campo-op\"\r\n onMouseDown={(e) => e.preventDefault()}\r\n onMouseEnter={() => setAtivo(i)}\r\n onClick={() => escolher(item)}\r\n >\r\n <span>{paraRotulo(item)}</span>\r\n {paraDetalhe?.(item) && <span className=\"lp-busca-campo-det\">{paraDetalhe(item)}</span>}\r\n </li>\r\n ))}\r\n </ul>\r\n {!resultados.length && (\r\n <div className=\"lp-sel-nada\" role=\"status\">\r\n {carregando ? 'Buscando…' : vazioTexto}\r\n </div>\r\n )}\r\n </div>,\r\n )}\r\n </Campo>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from 'react';\r\nimport { normalizar } from '../../utils/texto';\r\nimport type { CampoBaseProps } from '../Campo/Campo';\r\nimport { CampoTexto } from '../CampoTexto/CampoTexto';\r\nimport { CampoBusca } from './CampoBusca';\r\n\r\nexport interface Municipio {\r\n id: string | number;\r\n nome: string;\r\n}\r\n\r\nexport interface CampoCidadeProps extends CampoBaseProps {\r\n /** UF que filtra os municípios (`''` = nenhuma). Trocar de UF limpa a cidade. */\r\n uf: string;\r\n /**\r\n * Municípios da UF. Sem esta função o campo vira texto livre\r\n * (continua utilizável, só não sugere).\r\n */\r\n buscarPorUf?: (uf: string) => Promise<Municipio[]>;\r\n /** O município escolhido — ou o texto digitado, no modo texto livre. */\r\n valor?: Municipio | string | null;\r\n aoMudar?: (valor: Municipio | string | null) => void;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Município filtrado pela UF, com a cascata UF → cidade embutida: quando a\r\n * UF muda, a cidade da UF anterior é limpa pelo próprio campo.\r\n */\r\nexport function CampoCidade({ uf, buscarPorUf, valor = null, aoMudar, placeholder = 'Município', disabled, ...p }: CampoCidadeProps) {\r\n const [lista, setLista] = useState<Municipio[]>([]);\r\n const ufAnterior = useRef(uf);\r\n\r\n useEffect(() => {\r\n if (!buscarPorUf || !uf) {\r\n setLista([]);\r\n return;\r\n }\r\n let vivo = true;\r\n buscarPorUf(uf)\r\n .then((l) => vivo && setLista(l))\r\n .catch(() => vivo && setLista([]));\r\n return () => {\r\n vivo = false;\r\n };\r\n // a função costuma ser recriada a cada render; a lista depende só da UF\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [uf, !!buscarPorUf]);\r\n\r\n // cascata: a cidade escolhida sob outra UF deixa de valer\r\n useEffect(() => {\r\n if (ufAnterior.current !== uf) {\r\n ufAnterior.current = uf;\r\n if (valor) aoMudar?.(null);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [uf]);\r\n\r\n if (!buscarPorUf) {\r\n return (\r\n <CampoTexto\r\n {...p}\r\n disabled={disabled}\r\n placeholder={placeholder}\r\n valor={typeof valor === 'string' ? valor : valor?.nome ?? ''}\r\n aoMudar={(t) => aoMudar?.(t || null)}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <CampoBusca<Municipio>\r\n {...p}\r\n disabled={disabled || !uf}\r\n placeholder={uf ? placeholder : 'Escolha a UF primeiro'}\r\n minimo={1}\r\n atraso={0}\r\n buscar={async (termo) => {\r\n const t = normalizar(termo);\r\n return lista.filter((m) => normalizar(m.nome).includes(t)).slice(0, 50);\r\n }}\r\n paraRotulo={(m) => m.nome}\r\n chave={(m) => m.id}\r\n valor={typeof valor === 'object' ? valor : null}\r\n aoMudar={aoMudar}\r\n />\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { cx } from '../../utils/cx';\r\nimport './Paginacao.css';\r\n\r\nexport interface PaginacaoProps {\r\n total: number;\r\n /** Página atual, começando em 1. */\r\n pagina: number;\r\n tamanho: number;\r\n tamanhoOpcoes?: number[];\r\n aoMudarPagina: (pagina: number) => void;\r\n aoMudarTamanho?: (tamanho: number) => void;\r\n /** Sem borda própria (dentro do card da tabela). */\r\n embutida?: boolean;\r\n className?: string;\r\n}\r\n\r\ntype Item = number | '…';\r\n\r\nfunction listaPaginas(atual: number, total: number): Item[] {\r\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\r\n if (atual <= 4) return [1, 2, 3, 4, 5, '…', total];\r\n if (atual >= total - 3) return [1, '…', total - 4, total - 3, total - 2, total - 1, total];\r\n return [1, '…', atual - 1, atual, atual + 1, '…', total];\r\n}\r\n\r\nexport function Paginacao({\r\n total,\r\n pagina,\r\n tamanho,\r\n tamanhoOpcoes = [10, 20, 50, 100],\r\n aoMudarPagina,\r\n aoMudarTamanho,\r\n embutida,\r\n className,\r\n}: PaginacaoProps) {\r\n const totalPaginas = Math.max(1, Math.ceil(total / tamanho));\r\n const atual = Math.min(Math.max(1, pagina), totalPaginas);\r\n const ini = total ? (atual - 1) * tamanho + 1 : 0;\r\n const fim = Math.min(atual * tamanho, total);\r\n const ir = (p: number) => p >= 1 && p <= totalPaginas && p !== atual && aoMudarPagina(p);\r\n\r\n return (\r\n <nav className={cx('lp-pag', embutida && 'lp-pag--embutida', className)} aria-label=\"Paginação\">\r\n <span className=\"lp-pag-exibindo\">\r\n Exibindo <strong>{total ? `${ini}–${fim}` : '0'}</strong> de {total}\r\n </span>\r\n <div className=\"lp-pag-dir\">\r\n {aoMudarTamanho && tamanhoOpcoes.length > 0 && (\r\n <label className=\"lp-pag-por\">\r\n Por página:\r\n <select className=\"lp-pag-sel\" value={tamanho} onChange={(e) => aoMudarTamanho(Number(e.target.value))}>\r\n {tamanhoOpcoes.map((n) => (\r\n <option key={n} value={n}>\r\n {n}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n )}\r\n <div className=\"lp-pag-paginas\">\r\n <button type=\"button\" className=\"lp-pag-bt\" aria-label=\"Página anterior\" disabled={atual === 1} onClick={() => ir(atual - 1)}>\r\n <Icone icone=\"chevron-left\" />\r\n </button>\r\n {listaPaginas(atual, totalPaginas).map((p, i) =>\r\n p === '…' ? (\r\n <span key={`g${i}`} className=\"lp-pag-bt lp-pag-gap\" aria-hidden=\"true\">\r\n …\r\n </span>\r\n ) : (\r\n <button\r\n key={p}\r\n type=\"button\"\r\n className={cx('lp-pag-bt', p === atual && 'is-on')}\r\n aria-current={p === atual ? 'page' : undefined}\r\n onClick={() => ir(p)}\r\n >\r\n {p}\r\n </button>\r\n ),\r\n )}\r\n <button\r\n type=\"button\"\r\n className=\"lp-pag-bt\"\r\n aria-label=\"Próxima página\"\r\n disabled={atual === totalPaginas}\r\n onClick={() => ir(atual + 1)}\r\n >\r\n <Icone icone=\"chevron-right\" />\r\n </button>\r\n </div>\r\n </div>\r\n </nav>\r\n );\r\n}\r\n","import type { CSSProperties } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport './Skeleton.css';\r\n\r\nexport interface SkeletonProps {\r\n largura?: string;\r\n altura?: string;\r\n formato?: 'retangulo' | 'circulo';\r\n className?: string;\r\n}\r\n\r\n/** Silhueta de carregamento. */\r\nexport function Skeleton({ largura = '100%', altura = '1rem', formato = 'retangulo', className }: SkeletonProps) {\r\n const estilo: CSSProperties = { width: largura, height: altura };\r\n return <div className={cx('lp-skel', formato === 'circulo' && 'lp-skel--circulo', className)} style={estilo} aria-hidden=\"true\" />;\r\n}\r\n","import type { ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport './Vazio.css';\r\n\r\nexport interface VazioProps {\r\n titulo: string;\r\n descricao?: string;\r\n icone?: IconeProp;\r\n /** Botões de ação abaixo do texto. */\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\n/** Estado vazio (lista sem registros, busca sem resultado…). */\r\nexport function Vazio({ titulo, descricao, icone = 'inbox', children, className }: VazioProps) {\r\n return (\r\n <div className={cx('lp-vazio', className)}>\r\n <div className=\"lp-vazio-ic\">\r\n <Icone icone={icone} />\r\n </div>\r\n <div className=\"lp-vazio-titulo\">{titulo}</div>\r\n {descricao && <div className=\"lp-vazio-desc\">{descricao}</div>}\r\n {children && <div className=\"lp-vazio-acoes\">{children}</div>}\r\n </div>\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { useEffect, useRef, type Key, type MouseEvent, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { lerCampo } from '../../utils/texto';\r\nimport type { Severidade } from '../../utils/tipos';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { Paginacao, type PaginacaoProps } from '../Paginacao/Paginacao';\r\nimport { Skeleton } from '../Skeleton/Skeleton';\r\nimport { Status } from '../Status/Status';\r\nimport { Vazio } from '../Vazio/Vazio';\r\nimport './Tabela.css';\r\n\r\nexport interface Coluna<T> {\r\n /** Chave do campo no registro (aceita caminho com ponto: `endereco.cidade`). */\r\n campo: string;\r\n rotulo: string;\r\n ordenavel?: boolean;\r\n alinhamento?: 'esquerda' | 'centro' | 'direita';\r\n /** Texto forte (coluna principal). */\r\n destaque?: boolean;\r\n maiuscula?: boolean;\r\n largura?: string;\r\n /** Formata o valor cru da célula. */\r\n formato?: (valor: unknown, linha: T) => ReactNode;\r\n /** Renderiza a célula como selo de situação. */\r\n severidade?: (linha: T) => Severidade;\r\n /** Célula totalmente customizada. */\r\n render?: (linha: T) => ReactNode;\r\n}\r\n\r\nexport interface Ordenacao {\r\n campo: string;\r\n direcao: 'asc' | 'desc';\r\n}\r\n\r\nexport interface TabelaProps<T> {\r\n colunas: Coluna<T>[];\r\n registros: T[];\r\n /** Chave de cada linha (padrão: `linha.id` ou o índice). */\r\n chave?: (linha: T, indice: number) => Key;\r\n /** Botões de ação por linha (use `<AcaoLinha>`), na última coluna. */\r\n acoes?: (linha: T) => ReactNode;\r\n aparencia?: 'listrada' | 'grade';\r\n rotulo?: string;\r\n /** Primeira carga: silhuetas no lugar das linhas. */\r\n carregando?: boolean;\r\n /** Recarga (paginar/ordenar): mantém a tabela esmaecida. */\r\n atualizando?: boolean;\r\n erro?: string | boolean;\r\n aoRecarregar?: () => void;\r\n vazioTitulo?: string;\r\n vazioDescricao?: string;\r\n vazioIcone?: string;\r\n vazioAcoes?: ReactNode;\r\n ordenacao?: Ordenacao | null;\r\n aoOrdenar?: (campo: string) => void;\r\n selecao?: 'unica' | 'multipla';\r\n selecionados?: Key[];\r\n aoMudarSelecao?: (chaves: Key[]) => void;\r\n aoClicarLinha?: (linha: T) => void;\r\n /** Paginação controlada (servidor). */\r\n paginacao?: Omit<PaginacaoProps, 'embutida' | 'className'>;\r\n className?: string;\r\n}\r\n\r\n/** Mantido por compatibilidade: é o `lerCampo` dos utilitários. */\r\nexport const valorDoCampo = lerCampo;\r\n\r\nfunction CaixaSelecao({ marcado, indeterminado, rotulo, aoMudar }: { marcado: boolean; indeterminado?: boolean; rotulo: string; aoMudar: () => void }) {\r\n const ref = useRef<HTMLInputElement>(null);\r\n useEffect(() => {\r\n if (ref.current) ref.current.indeterminate = !!indeterminado;\r\n }, [indeterminado]);\r\n return (\r\n <label className=\"lp-tbl-sel\" onClick={(e) => e.stopPropagation()}>\r\n <input ref={ref} type=\"checkbox\" className=\"lp-tbl-sel-in\" checked={marcado} onChange={aoMudar} aria-label={rotulo} />\r\n <span className=\"lp-tbl-sel-visual\" aria-hidden=\"true\" />\r\n </label>\r\n );\r\n}\r\n\r\nconst LARGURAS = ['70%', '55%', '82%', '64%', '48%'];\r\n\r\nexport function Tabela<T>({\r\n colunas,\r\n registros,\r\n chave = (l, i) => ((l as { id?: Key }).id ?? i) as Key,\r\n acoes,\r\n aparencia = 'listrada',\r\n rotulo = 'Tabela de dados',\r\n carregando,\r\n atualizando,\r\n erro,\r\n aoRecarregar,\r\n vazioTitulo = 'Nenhum registro encontrado',\r\n vazioDescricao,\r\n vazioIcone = 'inbox',\r\n vazioAcoes,\r\n ordenacao,\r\n aoOrdenar,\r\n selecao,\r\n selecionados = [],\r\n aoMudarSelecao,\r\n aoClicarLinha,\r\n paginacao,\r\n className,\r\n}: TabelaProps<T>) {\r\n const chaves = registros.map(chave);\r\n const sel = new Set(selecionados);\r\n const todos = chaves.length > 0 && chaves.every((k) => sel.has(k));\r\n const alguns = !todos && chaves.some((k) => sel.has(k));\r\n\r\n const alternar = (k: Key) => {\r\n if (selecao === 'unica') aoMudarSelecao?.(sel.has(k) ? [] : [k]);\r\n else aoMudarSelecao?.(sel.has(k) ? selecionados.filter((s) => s !== k) : [...selecionados, k]);\r\n };\r\n const alternarTodos = () => {\r\n if (todos) aoMudarSelecao?.(selecionados.filter((s) => !chaves.includes(s)));\r\n else aoMudarSelecao?.([...new Set([...selecionados, ...chaves])]);\r\n };\r\n\r\n const aoClicar = (linha: T, k: Key, e: MouseEvent) => {\r\n if ((e.target as HTMLElement).closest('button, a, input, label')) return;\r\n if (selecao) alternar(k);\r\n else aoClicarLinha?.(linha);\r\n };\r\n\r\n const alinh = (c: Coluna<T>) => (c.alinhamento === 'centro' ? 'is-centro' : c.alinhamento === 'direita' ? 'is-direita' : undefined);\r\n\r\n const iconeOrdem = (c: Coluna<T>) => {\r\n if (ordenacao?.campo !== c.campo) return <Icone icone=\"arrow-up-down\" />;\r\n return <Icone icone={ordenacao.direcao === 'asc' ? 'arrow-up-narrow-wide' : 'arrow-down-wide-narrow'} className=\"is-on\" />;\r\n };\r\n\r\n let corpo: ReactNode;\r\n if (carregando) {\r\n corpo = (\r\n <div className=\"lp-tbl-carregando\" role=\"status\" aria-busy=\"true\" aria-label=\"Carregando registros\">\r\n <div className=\"lp-tbl-carregando-cab\" />\r\n {Array.from({ length: Math.min(paginacao?.tamanho ?? 5, 8) }, (_, i) => (\r\n <div className=\"lp-tbl-carregando-lin\" key={i}>\r\n <Skeleton largura={LARGURAS[i % LARGURAS.length]} altura=\"0.6875rem\" />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n } else if (erro) {\r\n corpo = (\r\n <div className=\"lp-tbl-vazio\">\r\n <Vazio\r\n icone=\"triangle-alert\"\r\n titulo=\"Não foi possível carregar\"\r\n descricao={typeof erro === 'string' ? erro : 'Verifique a conexão e tente de novo.'}\r\n >\r\n {aoRecarregar && <Botao rotulo=\"Tentar de novo\" icone=\"refresh-cw\" severidade=\"secundario\" onClick={aoRecarregar} />}\r\n </Vazio>\r\n </div>\r\n );\r\n } else if (!registros.length) {\r\n corpo = (\r\n <div className=\"lp-tbl-vazio\">\r\n <Vazio icone={vazioIcone} titulo={vazioTitulo} descricao={vazioDescricao}>\r\n {vazioAcoes}\r\n </Vazio>\r\n </div>\r\n );\r\n } else {\r\n corpo = (\r\n <div className={cx('lp-tbl-scroll', atualizando && 'is-atualizando')} tabIndex={0} role=\"region\" aria-label={rotulo} aria-busy={atualizando || undefined}>\r\n <table className={cx('lp-tbl', aparencia === 'grade' && 'lp-tbl--grade')}>\r\n <thead>\r\n <tr>\r\n {selecao && (\r\n <th className=\"lp-tbl-col-sel\" scope=\"col\">\r\n {selecao === 'multipla' ? (\r\n <CaixaSelecao marcado={todos} indeterminado={alguns} rotulo=\"Selecionar todos os visíveis\" aoMudar={alternarTodos} />\r\n ) : (\r\n <span className=\"lp-sr\">Seleção</span>\r\n )}\r\n </th>\r\n )}\r\n {colunas.map((c) => (\r\n <th\r\n key={c.campo}\r\n scope=\"col\"\r\n className={alinh(c)}\r\n style={c.largura ? { width: c.largura } : undefined}\r\n aria-sort={\r\n ordenacao?.campo === c.campo ? (ordenacao.direcao === 'asc' ? 'ascending' : 'descending') : undefined\r\n }\r\n >\r\n {c.ordenavel && aoOrdenar ? (\r\n <button type=\"button\" className=\"lp-tbl-ordenar\" onClick={() => aoOrdenar(c.campo)}>\r\n {c.rotulo}\r\n {iconeOrdem(c)}\r\n </button>\r\n ) : (\r\n c.rotulo\r\n )}\r\n </th>\r\n ))}\r\n {acoes && (\r\n <th className=\"lp-tbl-col-acoes\" scope=\"col\">\r\n Ações\r\n </th>\r\n )}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {registros.map((linha, i) => {\r\n const k = chaves[i];\r\n const marcado = !!selecao && sel.has(k);\r\n return (\r\n <tr\r\n key={k}\r\n className={cx((selecao || aoClicarLinha) && 'is-clicavel', marcado && 'is-sel')}\r\n onClick={(e) => aoClicar(linha, k, e)}\r\n >\r\n {selecao && (\r\n <td className=\"lp-tbl-col-sel\">\r\n <CaixaSelecao marcado={marcado} rotulo={`Selecionar linha ${i + 1}`} aoMudar={() => alternar(k)} />\r\n </td>\r\n )}\r\n {colunas.map((c) => {\r\n const v = valorDoCampo(linha, c.campo);\r\n let cel: ReactNode;\r\n if (c.render) cel = c.render(linha);\r\n else if (c.severidade) cel = <Status rotulo={String(c.formato ? c.formato(v, linha) : v ?? '')} severidade={c.severidade(linha)} />;\r\n else if (c.formato) cel = c.formato(v, linha);\r\n else cel = v === null || v === undefined || v === '' ? '—' : String(v);\r\n return (\r\n <td key={c.campo} className={cx(alinh(c), c.destaque && 'is-destaque', c.maiuscula && 'is-maiuscula')}>\r\n {cel}\r\n </td>\r\n );\r\n })}\r\n {acoes && (\r\n <td className=\"lp-tbl-col-acoes\">\r\n <div className=\"lp-tbl-acoes\">{acoes(linha)}</div>\r\n </td>\r\n )}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cx('lp-tbl-card', className)}>\r\n {corpo}\r\n {paginacao && !carregando && !erro && paginacao.total > 0 && <Paginacao embutida {...paginacao} />}\r\n </div>\r\n );\r\n}\r\n","import type { MouseEvent, ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport './Lista.css';\r\n\r\nexport type CorItemLista = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\r\n\r\nexport interface ListaProps {\r\n children: ReactNode;\r\n /** `padrao` = caixa com borda · `sem-borda` = encostada no container (dentro de card). */\r\n variante?: 'padrao' | 'sem-borda';\r\n /** Numera os itens (1, 2, 3…). */\r\n numerada?: boolean;\r\n /** Itens lado a lado; com breakpoint, só a partir dele (`sm` 36rem · `md` 48rem · `lg` 64rem · `xl` 75rem). */\r\n horizontal?: boolean | 'sm' | 'md' | 'lg' | 'xl';\r\n /** Nome da lista para leitor de tela. */\r\n rotulo?: string;\r\n className?: string;\r\n}\r\n\r\n/** Grupo de itens empilhados (list group): lista simples, de links, de seleção… */\r\nexport function Lista({ children, variante = 'padrao', numerada = false, horizontal = false, rotulo, className }: ListaProps) {\r\n const Tag = numerada ? 'ol' : 'ul';\r\n return (\r\n <Tag\r\n aria-label={rotulo}\r\n className={cx(\r\n 'lp-lista',\r\n variante === 'sem-borda' && 'lp-lista--sem-borda',\r\n numerada && 'lp-lista--numerada',\r\n horizontal === true && 'lp-lista--horizontal',\r\n typeof horizontal === 'string' && `lp-lista--horizontal-${horizontal}`,\r\n className,\r\n )}\r\n >\r\n {children}\r\n </Tag>\r\n );\r\n}\r\n\r\nexport interface ItemListaProps {\r\n /** Conteúdo principal (ou a descrição, quando há `titulo`). */\r\n children?: ReactNode;\r\n /** Linha em negrito acima do conteúdo. */\r\n titulo?: ReactNode;\r\n /** Ícone à esquerda (atalho para `inicio`). */\r\n icone?: IconeProp;\r\n /** Conteúdo à esquerda: avatar, ícone em caixa… */\r\n inicio?: ReactNode;\r\n /** Conteúdo à direita: badge, contagem, data… */\r\n fim?: ReactNode;\r\n ativo?: boolean;\r\n desabilitado?: boolean;\r\n /** Tom do item: fundo claro da cor, ou sólido com `solido`. */\r\n cor?: CorItemLista;\r\n solido?: boolean;\r\n /** Vira link. */\r\n href?: string;\r\n /** Vira botão. */\r\n onClick?: (e: MouseEvent<HTMLElement>) => void;\r\n /** Vira item de seleção: caixa de marcação ou rádio. */\r\n marcacao?: 'caixa' | 'radio';\r\n marcado?: boolean;\r\n aoMarcar?: (marcado: boolean) => void;\r\n /** Nome do grupo de rádios. */\r\n nome?: string;\r\n className?: string;\r\n}\r\n\r\n/** Item de `Lista`. Estático, link (`href`), botão (`onClick`) ou seleção (`marcacao`). */\r\nexport function ItemLista({\r\n children,\r\n titulo,\r\n icone,\r\n inicio,\r\n fim,\r\n ativo = false,\r\n desabilitado = false,\r\n cor,\r\n solido = false,\r\n href,\r\n onClick,\r\n marcacao,\r\n marcado,\r\n aoMarcar,\r\n nome,\r\n className,\r\n}: ItemListaProps) {\r\n const esquerda = inicio ?? (icone ? <Icone icone={icone} className=\"lp-lista-icone\" /> : null);\r\n const conteudo = (\r\n <>\r\n {marcacao && (\r\n <input\r\n type={marcacao === 'radio' ? 'radio' : 'checkbox'}\r\n className=\"lp-lista-marca\"\r\n name={nome}\r\n checked={marcado ?? false}\r\n disabled={desabilitado}\r\n onChange={(e) => aoMarcar?.(e.target.checked)}\r\n />\r\n )}\r\n {esquerda && <span className=\"lp-lista-inicio\">{esquerda}</span>}\r\n <span className=\"lp-lista-meio\">\r\n {titulo && <span className=\"lp-lista-titulo\">{titulo}</span>}\r\n {children && <span className={titulo ? 'lp-lista-desc' : 'lp-lista-texto'}>{children}</span>}\r\n </span>\r\n {fim && <span className=\"lp-lista-fim\">{fim}</span>}\r\n </>\r\n );\r\n\r\n let corpo: ReactNode;\r\n if (marcacao) corpo = <label className=\"lp-lista-corpo lp-lista-corpo--acao\">{conteudo}</label>;\r\n else if (href && !desabilitado)\r\n corpo = (\r\n <a className=\"lp-lista-corpo lp-lista-corpo--acao\" href={href} aria-current={ativo ? 'page' : undefined} onClick={onClick}>\r\n {conteudo}\r\n </a>\r\n );\r\n else if (onClick || href)\r\n corpo = (\r\n <button type=\"button\" className=\"lp-lista-corpo lp-lista-corpo--acao\" disabled={desabilitado} aria-pressed={onClick ? ativo : undefined} onClick={onClick}>\r\n {conteudo}\r\n </button>\r\n );\r\n else corpo = <div className=\"lp-lista-corpo\">{conteudo}</div>;\r\n\r\n return (\r\n <li\r\n className={cx(\r\n 'lp-lista-it',\r\n cor && `lp-lista-it--${cor}`,\r\n cor && solido && 'lp-lista-it--solido',\r\n ativo && 'is-ativo',\r\n desabilitado && 'is-desabilitado',\r\n className,\r\n )}\r\n aria-current={ativo && !href && !onClick ? 'true' : undefined}\r\n aria-disabled={desabilitado && !onClick && !href && !marcacao ? true : undefined}\r\n >\r\n {corpo}\r\n </li>\r\n );\r\n}\r\n","import type { CSSProperties, Key, ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { Paginacao, type PaginacaoProps } from '../Paginacao/Paginacao';\r\nimport { Skeleton } from '../Skeleton/Skeleton';\r\nimport { Vazio } from '../Vazio/Vazio';\r\nimport './ListaCards.css';\r\n\r\nexport interface ListaCardsProps<T> {\r\n itens: T[];\r\n /** Monta o card de cada item (normalmente um `<Card>` composto pelo módulo). */\r\n card: (item: T, indice: number) => ReactNode;\r\n chave?: (item: T, indice: number) => Key;\r\n /** Largura mínima de cada célula (padrão: 16rem) — define quantas colunas cabem. */\r\n larguraMin?: string;\r\n /** Altura das silhuetas: calibre pela altura do SEU card (padrão: 8.5rem). */\r\n alturaCard?: string;\r\n /** Nome acessível da grade. */\r\n rotulo?: string;\r\n /** Primeira carga: silhuetas no lugar dos cards. */\r\n carregando?: boolean;\r\n /** Recarga: mantém a grade esmaecida. */\r\n atualizando?: boolean;\r\n erro?: string | boolean;\r\n aoRecarregar?: () => void;\r\n vazioTitulo?: string;\r\n vazioDescricao?: string;\r\n vazioIcone?: string;\r\n vazioAcoes?: ReactNode;\r\n paginacao?: Omit<PaginacaoProps, 'embutida' | 'className'>;\r\n className?: string;\r\n}\r\n\r\n/** Listagem em grade de cards, irmã da `Tabela` (a ordenação fica na barra de filtros). */\r\nexport function ListaCards<T>({\r\n itens,\r\n card,\r\n chave = (i, n) => ((i as { id?: Key }).id ?? n) as Key,\r\n larguraMin = '16rem',\r\n alturaCard = '8.5rem',\r\n rotulo,\r\n carregando,\r\n atualizando,\r\n erro,\r\n aoRecarregar,\r\n vazioTitulo = 'Nenhum registro encontrado',\r\n vazioDescricao,\r\n vazioIcone = 'inbox',\r\n vazioAcoes,\r\n paginacao,\r\n className,\r\n}: ListaCardsProps<T>) {\r\n const estilo = { '--lp-cards-min': larguraMin } as CSSProperties;\r\n\r\n let corpo: ReactNode;\r\n if (carregando) {\r\n corpo = (\r\n <div className=\"lp-cards\" style={estilo} role=\"status\" aria-busy=\"true\" aria-label=\"Carregando registros\">\r\n {Array.from({ length: Math.min(paginacao?.tamanho ?? 6, 12) }, (_, i) => (\r\n <Skeleton key={i} altura={alturaCard} />\r\n ))}\r\n </div>\r\n );\r\n } else if (erro) {\r\n corpo = (\r\n <Vazio icone=\"triangle-alert\" titulo=\"Não foi possível carregar\" descricao={typeof erro === 'string' ? erro : 'Verifique a conexão e tente de novo.'}>\r\n {aoRecarregar && <Botao rotulo=\"Tentar de novo\" icone=\"refresh-cw\" severidade=\"secundario\" onClick={aoRecarregar} />}\r\n </Vazio>\r\n );\r\n } else if (!itens.length) {\r\n corpo = (\r\n <Vazio icone={vazioIcone} titulo={vazioTitulo} descricao={vazioDescricao}>\r\n {vazioAcoes}\r\n </Vazio>\r\n );\r\n } else {\r\n corpo = (\r\n <div\r\n className={cx('lp-cards', atualizando && 'is-atualizando')}\r\n style={estilo}\r\n role={rotulo ? 'group' : undefined}\r\n aria-label={rotulo || undefined}\r\n aria-busy={atualizando || undefined}\r\n >\r\n {itens.map((item, i) => (\r\n <div key={chave(item, i)} className=\"lp-cards-cel\">\r\n {card(item, i)}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cx('lp-cards-lista', className)}>\r\n {corpo}\r\n {paginacao && !carregando && !erro && paginacao.total > 0 && <Paginacao {...paginacao} />}\r\n </div>\r\n );\r\n}\r\n","import type { CSSProperties, ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport { Skeleton } from '../Skeleton/Skeleton';\r\nimport './Indicador.css';\r\n\r\nexport interface IndicadorProps {\r\n rotulo: string;\r\n valor: number | string;\r\n icone?: IconeProp;\r\n /** Cor de destaque (qualquer cor CSS, de preferência um token: `var(--ok-solid)`). */\r\n cor?: string;\r\n /** Torna o card um link. */\r\n href?: string;\r\n aoClicar?: () => void;\r\n carregando?: boolean;\r\n /** Variação em % (ex.: `1.31` ou `-9.26`): seta e cor ao lado do valor. */\r\n variacao?: number;\r\n /** Qual direção é boa (verde). Padrão: `alta`; use `baixa` para despesas, rejeições… */\r\n variacaoBoa?: 'alta' | 'baixa';\r\n /** Linha miúda abaixo do valor (ex.: \"há 6 min\"). */\r\n descricao?: ReactNode;\r\n /** Rodapé (variação, comparação…). */\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst NUM = new Intl.NumberFormat('pt-BR');\r\nconst PCT = new Intl.NumberFormat('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\r\n\r\n/** Card de KPI para dashboards. */\r\nexport function Indicador({ rotulo, valor, icone, cor, href, aoClicar, carregando, variacao, variacaoBoa = 'alta', descricao, children, className }: IndicadorProps) {\r\n const texto = typeof valor === 'number' ? NUM.format(valor) : valor;\r\n const subiu = (variacao ?? 0) >= 0;\r\n const boa = subiu === (variacaoBoa === 'alta');\r\n const estilo = cor ? ({ '--ind-cor': cor } as CSSProperties) : undefined;\r\n const acionavel = !!href || !!aoClicar;\r\n return (\r\n <div className={cx('lp-ind', cor && 'lp-ind--cor', acionavel && 'lp-ind--link', className)} style={estilo}>\r\n {href ? (\r\n <a className=\"lp-ind-link\" href={href} onClick={aoClicar} aria-label={`${rotulo}: ${texto}`} />\r\n ) : aoClicar ? (\r\n <button type=\"button\" className=\"lp-ind-link\" onClick={aoClicar} aria-label={`${rotulo}: ${texto}`} />\r\n ) : null}\r\n <div className=\"lp-ind-topo\">\r\n <span className=\"lp-ind-rotulo\">{rotulo}</span>\r\n {icone && (\r\n <span className=\"lp-ind-tile\">\r\n <Icone icone={icone} />\r\n </span>\r\n )}\r\n </div>\r\n {carregando ? (\r\n <Skeleton largura=\"4.5rem\" altura=\"1.8rem\" />\r\n ) : variacao === undefined ? (\r\n <div className=\"lp-ind-valor\">{texto}</div>\r\n ) : (\r\n <div className=\"lp-ind-linha\">\r\n <span className=\"lp-ind-valor\">{texto}</span>\r\n <span className={cx('lp-ind-var', boa ? 'is-boa' : 'is-ruim')}>\r\n <Icone icone={subiu ? 'arrow-up' : 'arrow-down'} />\r\n {PCT.format(Math.abs(variacao))}%<span className=\"lp-sr\">{subiu ? ' de alta' : ' de queda'}</span>\r\n </span>\r\n </div>\r\n )}\r\n {descricao && <div className=\"lp-ind-desc\">{descricao}</div>}\r\n {children && <div className=\"lp-ind-rodape\">{children}</div>}\r\n </div>\r\n );\r\n}\r\n\r\n/** Grade responsiva de indicadores. */\r\nexport function Indicadores({ children, className }: { children: ReactNode; className?: string }) {\r\n return <div className={cx('lp-inds', className)}>{children}</div>;\r\n}\r\n","import type { ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport './Detalhes.css';\r\n\r\nexport interface DetalhesProps {\r\n rotulo: string;\r\n /** Valor em texto; `children` substitui. Vazio mostra travessão. */\r\n valor?: ReactNode;\r\n /** `coluna` = rótulo em cima · `linha` = rótulo à esquerda, valor à direita. */\r\n disposicao?: 'coluna' | 'linha';\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\n/** Par rótulo/valor para telas de visualização. */\r\nexport function Detalhes({ rotulo, valor, disposicao = 'coluna', children, className }: DetalhesProps) {\r\n const conteudo = children ?? (valor === undefined || valor === null || valor === '' ? '—' : valor);\r\n return (\r\n <div className={cx('lp-det', disposicao === 'linha' && 'lp-det--linha', className)}>\r\n <span className=\"lp-det-rotulo\">{rotulo}</span>\r\n <span className=\"lp-det-valor\">{conteudo}</span>\r\n </div>\r\n );\r\n}\r\n","import type { ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport type { Severidade } from '../../utils/tipos';\r\nimport './Badge.css';\r\n\r\n/** Mesmas cores do `Alerta`: severidades + `pri` (azul) e `destaque` (laranja). */\r\nexport type CorBadge = Severidade | 'pri' | 'destaque';\r\n\r\nexport interface BadgeProps {\r\n cor?: CorBadge;\r\n /**\r\n * `solido` (padrão) · `suave` = fundo claro · `contorno` = só a borda ·\r\n * `gradiente` · `inverso` = fundo da superfície com texto colorido (para\r\n * usar dentro de um botão sólido da mesma cor).\r\n */\r\n aparencia?: 'solido' | 'suave' | 'contorno' | 'gradiente' | 'inverso';\r\n /** `pilula` = cantos totalmente arredondados. */\r\n formato?: 'padrao' | 'pilula';\r\n /** `herdar` = acompanha o tamanho do texto em volta (títulos). */\r\n tamanho?: 'pequeno' | 'medio' | 'herdar';\r\n icone?: IconeProp;\r\n /** Texto do badge (ou use `children`). */\r\n rotulo?: ReactNode;\r\n children?: ReactNode;\r\n className?: string;\r\n}\r\n\r\n/** Etiqueta curta: contagem, rótulo de novidade, categoria. */\r\nexport function Badge({ cor = 'pri', aparencia = 'solido', formato = 'padrao', tamanho = 'pequeno', icone, rotulo, children, className }: BadgeProps) {\r\n return (\r\n <span\r\n className={cx('lp-badge', `lp-badge--${aparencia}`, formato === 'pilula' && 'lp-badge--pilula', `lp-badge--${tamanho}`, className)}\r\n data-cor={cor}\r\n >\r\n <Icone icone={icone} />\r\n {rotulo}\r\n {children}\r\n </span>\r\n );\r\n}\r\n\r\nexport interface ComBadgeProps {\r\n /** Elemento que recebe o badge (avatar, botão, ícone). */\r\n children: ReactNode;\r\n /** Contagem ou texto no canto; com `ponto`, é ignorado. */\r\n conteudo?: ReactNode;\r\n /** Acima disto vira \"N+\" (só para números; padrão: 99). */\r\n max?: number;\r\n /** Só um ponto (ex.: \"online\", \"não lido\"). */\r\n ponto?: boolean;\r\n cor?: CorBadge;\r\n /** Canto do badge (padrão: superior direito). */\r\n posicao?: 'superior-direita' | 'inferior-direita' | 'superior-esquerda' | 'inferior-esquerda';\r\n /** Texto para leitor de tela (ex.: \"99 mensagens não lidas\"). */\r\n descricao?: string;\r\n className?: string;\r\n}\r\n\r\n/** Posiciona um badge (ou ponto) no canto de outro elemento. */\r\nexport function ComBadge({ children, conteudo, max = 99, ponto = false, cor = 'err', posicao = 'superior-direita', descricao, className }: ComBadgeProps) {\r\n const vazio = conteudo === undefined || conteudo === null || conteudo === false || conteudo === '';\r\n const texto = typeof conteudo === 'number' && conteudo > max ? `${max}+` : conteudo;\r\n return (\r\n <span className={cx('lp-com-badge', className)}>\r\n {children}\r\n {(ponto || !vazio) && (\r\n <span className={cx('lp-com-badge-marca', `is-${posicao}`, ponto ? 'lp-com-badge-ponto' : 'lp-badge lp-badge--solido lp-badge--pilula lp-badge--pequeno')} data-cor={cor}>\r\n {!ponto && texto}\r\n {descricao && <span className=\"lp-sr\">{descricao}</span>}\r\n </span>\r\n )}\r\n </span>\r\n );\r\n}\r\n","import { cx } from '../../utils/cx';\r\nimport './Placa.css';\r\n\r\nexport interface PlacaProps {\r\n /** Número da placa (ex.: `QBX-7H42`) — sempre exibido em maiúsculas. */\r\n numero: string;\r\n /** UF da faixa superior (padrão: PR). */\r\n uf?: string;\r\n className?: string;\r\n}\r\n\r\n/** Arte da placa de veículo (faixa BRASIL/UF + número), só leitura. */\r\nexport function Placa({ numero, uf = 'PR', className }: PlacaProps) {\r\n const n = (numero ?? '').toUpperCase();\r\n const u = (uf ?? '').toUpperCase();\r\n return (\r\n <span className={cx('lp-placa', className)} role=\"img\" aria-label={`Placa ${n}${u ? `, ${u}` : ''}`}>\r\n <span className=\"lp-placa-faixa\" aria-hidden=\"true\">\r\n <span>BRASIL</span>\r\n {u && <span className=\"lp-placa-uf\">{u}</span>}\r\n </span>\r\n <span className=\"lp-placa-numero\" aria-hidden=\"true\">\r\n {n}\r\n </span>\r\n </span>\r\n );\r\n}\r\n","import type { ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone, type IconeProp } from '../../utils/Icone';\r\nimport './Citacao.css';\r\n\r\nexport type CorCitacao = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\r\n\r\nexport interface CitacaoProps {\r\n /** O texto citado. */\r\n children: ReactNode;\r\n /** Quem disse. */\r\n autor?: ReactNode;\r\n /** De onde veio (livro, discurso…), em itálico depois do autor. */\r\n fonte?: ReactNode;\r\n cor?: CorCitacao;\r\n /** `simples` = filete na lateral · `cartao` = fundo claro da cor, ícone e aspas. */\r\n aparencia?: 'simples' | 'cartao';\r\n alinhamento?: 'inicio' | 'centro' | 'fim';\r\n /** Ícone no canto do cartão (só na aparência `cartao`). */\r\n icone?: IconeProp;\r\n className?: string;\r\n}\r\n\r\n/** Citação (blockquote) com autor e fonte. */\r\nexport function Citacao({ children, autor, fonte, cor = 'pri', aparencia = 'simples', alinhamento = 'inicio', icone = 'info', className }: CitacaoProps) {\r\n return (\r\n <figure\r\n className={cx(\r\n 'lp-citacao',\r\n cor !== 'pri' && `lp-citacao--${cor}`,\r\n `lp-citacao--${aparencia}`,\r\n alinhamento !== 'inicio' && `lp-citacao--${alinhamento}`,\r\n className,\r\n )}\r\n >\r\n {aparencia === 'cartao' && <Icone icone={icone} className=\"lp-citacao-ic\" />}\r\n <blockquote className=\"lp-citacao-texto\">{children}</blockquote>\r\n {(autor || fonte) && (\r\n <figcaption className=\"lp-citacao-autor\">\r\n — {autor}\r\n {fonte && <> {autor && 'em '}<cite>{fonte}</cite></>}\r\n </figcaption>\r\n )}\r\n </figure>\r\n );\r\n}\r\n","import type { CSSProperties, ImgHTMLAttributes, ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport './Imagem.css';\r\n\r\n/** `reto` · `arredondado` = cantos do card · `circulo` = pílula/círculo. */\r\nexport type CantosImagem = 'reto' | 'arredondado' | 'circulo';\r\n/** `esquerda`/`direita` = flutua com o texto em volta · `centro` = bloco centralizado. */\r\nexport type AlinhamentoImagem = 'esquerda' | 'centro' | 'direita';\r\n\r\nexport interface ImagemProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'alt' | 'width'> {\r\n src: string;\r\n /** Texto alternativo. Use `''` só para imagem decorativa. */\r\n alt: string;\r\n /** Encolhe para caber no container (largura máx. 100%). Padrão: true. */\r\n responsiva?: boolean;\r\n cantos?: CantosImagem;\r\n /** Moldura de miniatura: borda fina e respiro em volta. */\r\n miniatura?: boolean;\r\n alinhamento?: AlinhamentoImagem;\r\n /** Recorta na proporção dada (ex.: `'1 / 1'`, `'16 / 9'`) sem distorcer. */\r\n proporcao?: string;\r\n /** Largura (ex.: `'12rem'`, `'50%'`). */\r\n largura?: string;\r\n}\r\n\r\n/** Imagem responsiva com cantos, miniatura, recorte e alinhamento. */\r\nexport function Imagem({\r\n responsiva = true,\r\n cantos = 'reto',\r\n miniatura = false,\r\n alinhamento,\r\n proporcao,\r\n largura,\r\n loading = 'lazy',\r\n className,\r\n style,\r\n ...resto\r\n}: ImagemProps) {\r\n return (\r\n <img\r\n loading={loading}\r\n className={cx(\r\n 'lp-img',\r\n responsiva && 'lp-img--responsiva',\r\n cantos !== 'reto' && `lp-img--${cantos}`,\r\n miniatura && 'lp-img--miniatura',\r\n alinhamento && `lp-img--${alinhamento}`,\r\n proporcao && 'lp-img--recorte',\r\n className,\r\n )}\r\n style={{ aspectRatio: proporcao, width: largura, ...style }}\r\n {...resto}\r\n />\r\n );\r\n}\r\n\r\nexport interface FiguraProps {\r\n src: string;\r\n alt: string;\r\n /** Legenda abaixo da imagem. */\r\n legenda?: ReactNode;\r\n alinhamentoLegenda?: 'inicio' | 'centro' | 'fim';\r\n cantos?: CantosImagem;\r\n miniatura?: boolean;\r\n proporcao?: string;\r\n /** Posição da figura inteira (imagem + legenda). */\r\n alinhamento?: AlinhamentoImagem;\r\n /** Largura da figura (ex.: `'14rem'`). */\r\n largura?: string;\r\n className?: string;\r\n style?: CSSProperties;\r\n}\r\n\r\n/** Imagem com legenda (`<figure>` + `<figcaption>`). */\r\nexport function Figura({\r\n src,\r\n alt,\r\n legenda,\r\n alinhamentoLegenda = 'inicio',\r\n cantos = 'arredondado',\r\n miniatura,\r\n proporcao,\r\n alinhamento,\r\n largura,\r\n className,\r\n style,\r\n}: FiguraProps) {\r\n return (\r\n <figure className={cx('lp-figura', alinhamento && `lp-figura--${alinhamento}`, className)} style={{ width: largura, ...style }}>\r\n <Imagem src={src} alt={alt} cantos={cantos} miniatura={miniatura} proporcao={proporcao} largura=\"100%\" />\r\n {legenda && <figcaption className={cx('lp-figura-legenda', alinhamentoLegenda !== 'inicio' && `lp-figura-legenda--${alinhamentoLegenda}`)}>{legenda}</figcaption>}\r\n </figure>\r\n );\r\n}\r\n","import type { ButtonHTMLAttributes } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone } from '../../utils/Icone';\r\nimport './BotaoFechar.css';\r\n\r\nexport interface BotaoFecharProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\r\n /** `claro` = para fundos escuros. */\r\n variante?: 'padrao' | 'claro';\r\n tamanho?: 'pequeno' | 'medio';\r\n /** Nome para leitor de tela (padrão: \"Fechar\"). */\r\n rotulo?: string;\r\n}\r\n\r\n/** O × de fechar (avisos, diálogos, painéis), com o nome acessível. */\r\nexport function BotaoFechar({ variante = 'padrao', tamanho = 'medio', rotulo = 'Fechar', className, type = 'button', ...resto }: BotaoFecharProps) {\r\n return (\r\n <button\r\n type={type}\r\n className={cx('lp-fechar', variante === 'claro' && 'lp-fechar--claro', tamanho === 'pequeno' && 'lp-fechar--pequeno', className)}\r\n aria-label={rotulo}\r\n title={rotulo}\r\n {...resto}\r\n >\r\n <Icone icone=\"x\" />\r\n </button>\r\n );\r\n}\r\n","import { useEffect, useRef } from 'react';\r\nimport { portal } from '../../utils/portal';\r\nimport { cx } from '../../utils/cx';\r\nimport './Carregando.css';\r\n\r\nexport interface CarregandoProps {\r\n mensagem?: string;\r\n /** Imagem da marca (ex.: logo) no lugar do anel. */\r\n logo?: string;\r\n /** Cobre a página inteira com máscara e bloqueia interação. */\r\n bloqueante?: boolean;\r\n className?: string;\r\n}\r\n\r\n/** Indicador de espera de seção/página. Para listas, prefira Skeleton. */\r\nexport function Carregando({ mensagem = 'Carregando', logo, bloqueante = false, className }: CarregandoProps) {\r\n const painel = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!bloqueante) return;\r\n const anterior = document.activeElement as HTMLElement | null;\r\n painel.current?.focus();\r\n return () => anterior?.focus?.();\r\n }, [bloqueante]);\r\n\r\n const conteudo = (\r\n <div\r\n className={cx('lp-carr', bloqueante && 'lp-carr--overlay', className)}\r\n role=\"status\"\r\n aria-busy={bloqueante || undefined}\r\n onKeyDown={bloqueante ? (e) => e.key === 'Tab' && e.preventDefault() : undefined}\r\n >\r\n <div className=\"lp-carr-painel\" ref={painel} tabIndex={-1}>\r\n <span className=\"lp-carr-pilha\">\r\n {logo ? <img className=\"lp-carr-logo\" src={logo} alt=\"\" aria-hidden=\"true\" /> : <span className=\"lp-carr-anel\" aria-hidden=\"true\" />}\r\n <span className=\"lp-carr-traco\" aria-hidden=\"true\" />\r\n <span className=\"lp-carr-txt\">\r\n <span>{mensagem}</span>\r\n <span className=\"lp-carr-pontos\" aria-hidden=\"true\">\r\n <span />\r\n <span />\r\n <span />\r\n </span>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n\r\n return bloqueante ? portal(conteudo) : conteudo;\r\n}\r\n","import type { CSSProperties } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport './Girador.css';\r\n\r\n/** `atual` = cor do texto em volta (para usar dentro de botões). */\r\nexport type CorGirador = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro' | 'atual';\r\n\r\nexport interface GiradorProps {\r\n /** `anel` = gira · `pulso` = cresce e some · `pontos` = três pontos piscando. */\r\n tipo?: 'anel' | 'pulso' | 'pontos';\r\n cor?: CorGirador;\r\n /** Escala pronta, ou qualquer medida CSS (ex.: `'3rem'`). */\r\n tamanho?: 'pequeno' | 'medio' | 'grande' | (string & {});\r\n /** Texto para leitor de tela (e visível com `mostrarRotulo`). */\r\n rotulo?: string;\r\n mostrarRotulo?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst ESCALA: Record<string, string> = { pequeno: '1rem', medio: '1.75rem', grande: '2.75rem' };\r\n\r\n/** Indicador de atividade em linha (spinner). Para espera de seção inteira, use `Carregando`. */\r\nexport function Girador({ tipo = 'anel', cor = 'pri', tamanho = 'medio', rotulo = 'Carregando...', mostrarRotulo = false, className }: GiradorProps) {\r\n return (\r\n <span\r\n role=\"status\"\r\n className={cx('lp-girador', `lp-girador--${tipo}`, cor !== 'pri' && `lp-girador--${cor}`, className)}\r\n style={{ '--gir-tam': ESCALA[tamanho] ?? tamanho } as CSSProperties}\r\n >\r\n <span className=\"lp-girador-forma\" aria-hidden=\"true\">\r\n {tipo === 'pontos' && (\r\n <>\r\n <span />\r\n <span />\r\n <span />\r\n </>\r\n )}\r\n </span>\r\n <span className={mostrarRotulo ? 'lp-girador-rotulo' : 'lp-sr'}>{rotulo}</span>\r\n </span>\r\n );\r\n}\r\n","import type { CSSProperties } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport './Progresso.css';\r\n\r\nexport type CorProgresso = 'pri' | 'secundario' | 'ok' | 'warn' | 'err' | 'info' | 'destaque' | 'escuro';\r\n\r\nexport interface SegmentoProgresso {\r\n valor: number;\r\n cor?: CorProgresso;\r\n /** Nome do segmento (leitor de tela e texto `dentro`). */\r\n rotulo?: string;\r\n}\r\n\r\nexport interface ProgressoProps {\r\n /** Valor atual (0 a `max`). Ignorado quando há `segmentos`. */\r\n valor?: number;\r\n max?: number;\r\n /** Várias barras empilhadas na mesma trilha. */\r\n segmentos?: SegmentoProgresso[];\r\n cor?: CorProgresso;\r\n /** `listrado` = faixas diagonais · `gradiente` = clareia no começo. */\r\n aparencia?: 'solido' | 'listrado' | 'gradiente';\r\n /** Faixas em movimento (com `listrado`). */\r\n animado?: boolean;\r\n /** A barra cresce do zero ao aparecer. */\r\n entrada?: boolean;\r\n altura?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n /**\r\n * Onde mostrar o valor: `dentro` da barra · no `fim` da linha · `balao`\r\n * acima da ponta · `pilula` na ponta da barra.\r\n */\r\n mostrarValor?: 'nenhum' | 'dentro' | 'fim' | 'balao' | 'pilula';\r\n /** Bolinha na ponta da barra. */\r\n marcador?: boolean;\r\n /** Pontos de marco ao longo da trilha (valores, ex.: `[25, 50, 75]`). */\r\n marcos?: number[];\r\n /** Trilha com o tom claro da cor. */\r\n trilhaColorida?: boolean;\r\n /** Selo colorido no começo da barra (ex.: \"Celulares\"). */\r\n etiqueta?: string;\r\n /** Nome acessível (ex.: \"Envio do arquivo\"). */\r\n rotulo?: string;\r\n /** Formata o valor exibido (padrão: porcentagem). */\r\n formatar?: (valor: number, max: number) => string;\r\n className?: string;\r\n}\r\n\r\nconst pct = (v: number, max: number) => Math.max(0, Math.min(100, (v / max) * 100));\r\nconst PADRAO = (v: number, max: number) => `${Math.round(pct(v, max))}%`;\r\n\r\n/** Barra de progresso: simples, listrada, em gradiente, com marcos, balão de valor ou várias barras. */\r\nexport function Progresso({\r\n valor = 0,\r\n max = 100,\r\n segmentos,\r\n cor = 'pri',\r\n aparencia = 'solido',\r\n animado = false,\r\n entrada = false,\r\n altura = 'md',\r\n mostrarValor = 'nenhum',\r\n marcador = false,\r\n marcos,\r\n trilhaColorida = false,\r\n etiqueta,\r\n rotulo,\r\n formatar = PADRAO,\r\n className,\r\n}: ProgressoProps) {\r\n const p = pct(valor, max);\r\n const texto = formatar(valor, max);\r\n const classeBarra = (c: CorProgresso) =>\r\n cx(\r\n 'lp-prog-barra',\r\n // sempre explícita: num segmento `pri` dentro de barra de outra cor\r\n `lp-prog--${c}`,\r\n aparencia !== 'solido' && `lp-prog-barra--${aparencia}`,\r\n animado && 'lp-prog-barra--animado',\r\n entrada && 'lp-prog-barra--entrada',\r\n );\r\n\r\n return (\r\n <div\r\n className={cx(\r\n 'lp-prog',\r\n cor !== 'pri' && `lp-prog--${cor}`,\r\n `lp-prog--${altura}`,\r\n trilhaColorida && 'lp-prog--trilha-colorida',\r\n mostrarValor === 'balao' && 'lp-prog--com-balao',\r\n className,\r\n )}\r\n >\r\n {etiqueta && <span className=\"lp-prog-etiqueta\">{etiqueta}</span>}\r\n {segmentos ? (\r\n <div className=\"lp-prog-trilha\" role=\"group\" aria-label={rotulo}>\r\n {segmentos.map((s, i) => (\r\n <div\r\n key={i}\r\n className={classeBarra(s.cor ?? cor)}\r\n style={{ width: `${pct(s.valor, max)}%` }}\r\n role=\"progressbar\"\r\n aria-label={s.rotulo}\r\n aria-valuenow={s.valor}\r\n aria-valuemin={0}\r\n aria-valuemax={max}\r\n >\r\n {mostrarValor === 'dentro' && <span className=\"lp-prog-texto\">{formatar(s.valor, max)}</span>}\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <div\r\n className=\"lp-prog-trilha\"\r\n role=\"progressbar\"\r\n aria-label={rotulo ?? etiqueta}\r\n aria-valuenow={valor}\r\n aria-valuemin={0}\r\n aria-valuemax={max}\r\n aria-valuetext={texto}\r\n style={{ '--prog-pct': `${p}%` } as CSSProperties}\r\n >\r\n <div className={classeBarra(cor)} style={{ width: `${p}%` }}>\r\n {mostrarValor === 'dentro' && <span className=\"lp-prog-texto\">{texto}</span>}\r\n </div>\r\n {marcos?.map((m) => (\r\n <span key={m} className={cx('lp-prog-marco', m <= valor && 'is-atingido')} style={{ left: `${pct(m, max)}%` }} aria-hidden=\"true\" />\r\n ))}\r\n {marcador && <span className=\"lp-prog-marcador\" aria-hidden=\"true\" />}\r\n {mostrarValor === 'balao' && (\r\n <span className=\"lp-prog-balao\" aria-hidden=\"true\">\r\n {texto}\r\n </span>\r\n )}\r\n {mostrarValor === 'pilula' && (\r\n <span className=\"lp-prog-pilula\" aria-hidden=\"true\">\r\n {texto}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n {mostrarValor === 'fim' && (\r\n <span className=\"lp-prog-valor\" aria-hidden=\"true\">\r\n {segmentos ? formatar(segmentos.reduce((t, s) => t + s.valor, 0), max) : texto}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { Children, isValidElement, useCallback, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { Vazio } from '../Vazio/Vazio';\r\nimport './Conversa.css';\r\n\r\nexport interface ConversaProps {\r\n /** As mensagens (`Mensagem`), da mais antiga para a mais nova. */\r\n children?: ReactNode;\r\n /** Mostrado quando não há mensagens. Padrão: um `Vazio`. */\r\n vazio?: ReactNode;\r\n /** Campo de envio fixo abaixo da rolagem (normalmente um `CampoMensagem`). */\r\n campo?: ReactNode;\r\n /** Largura máxima das mensagens e do campo, centralizados (ex.: `48rem` numa página inteira). */\r\n larguraMaxima?: string;\r\n /** Nome da conversa para leitores de tela. */\r\n rotulo?: string;\r\n rotuloIrParaFim?: string;\r\n className?: string;\r\n}\r\n\r\n/** distância do fim (px) que ainda conta como \"no fim\" */\r\nconst LIMIAR = 24;\r\n\r\n/**\r\n * Área rolável de uma conversa. Acompanha o fim quando chegam mensagens ou a\r\n * última cresce (streaming); se a pessoa rolar para cima, para de puxar e\r\n * mostra \"Ir para o fim\". Ocupa a altura do contêiner pai.\r\n */\r\nexport function Conversa({\r\n children,\r\n vazio,\r\n campo,\r\n larguraMaxima,\r\n rotulo = 'Conversa',\r\n rotuloIrParaFim = 'Ir para o fim',\r\n className,\r\n}: ConversaProps) {\r\n const rolagem = useRef<HTMLDivElement>(null);\r\n const lista = useRef<HTMLDivElement>(null);\r\n // ref para a lógica (o ResizeObserver não vê estado novo); estado para o botão\r\n const noFim = useRef(true);\r\n const [longe, setLonge] = useState(false);\r\n const filhos = Children.toArray(children);\r\n const semMensagens = filhos.length === 0;\r\n const quantas = useRef(filhos.length);\r\n // a mensagem que a própria pessoa acabou de enviar sempre leva ao fim\r\n const novaDoUsuario =\r\n filhos.length > quantas.current &&\r\n filhos.slice(quantas.current).some((f) => isValidElement<{ autor?: string }>(f) && f.props.autor === 'usuario');\r\n\r\n const irParaFim = useCallback(() => {\r\n const el = rolagem.current;\r\n if (!el) return;\r\n el.scrollTop = el.scrollHeight;\r\n noFim.current = true;\r\n setLonge(false);\r\n }, []);\r\n\r\n // conteúdo ou caixa mudou de tamanho: se estava no fim, continua no fim\r\n useLayoutEffect(() => {\r\n const el = rolagem.current;\r\n const ls = lista.current;\r\n if (!el || !ls) return;\r\n irParaFim();\r\n const ro = new ResizeObserver(() => {\r\n if (noFim.current) el.scrollTop = el.scrollHeight;\r\n });\r\n ro.observe(el);\r\n ro.observe(ls);\r\n return () => ro.disconnect();\r\n }, [irParaFim, semMensagens]);\r\n\r\n useLayoutEffect(() => {\r\n quantas.current = filhos.length;\r\n if (novaDoUsuario) irParaFim();\r\n });\r\n\r\n const aoRolar = () => {\r\n const el = rolagem.current;\r\n if (!el) return;\r\n const fim = el.scrollHeight - el.scrollTop - el.clientHeight <= LIMIAR;\r\n noFim.current = fim;\r\n setLonge(!fim);\r\n };\r\n\r\n const estilo = larguraMaxima ? ({ '--conversa-largura': larguraMaxima } as CSSProperties) : undefined;\r\n\r\n return (\r\n <div className={cx('lp-conversa', className)} style={estilo}>\r\n <div className=\"lp-conversa-area\">\r\n <div ref={rolagem} className=\"lp-conversa-rolagem\" tabIndex={0} aria-label={rotulo} onScroll={aoRolar}>\r\n <div ref={lista} className=\"lp-conversa-lista\" role=\"log\" aria-live=\"polite\">\r\n {semMensagens ? (\r\n <div className=\"lp-conversa-vazio\">\r\n {vazio ?? <Vazio titulo=\"Nenhuma mensagem ainda\" descricao=\"Envie uma mensagem para começar a conversa.\" icone=\"message-square\" />}\r\n </div>\r\n ) : (\r\n children\r\n )}\r\n </div>\r\n </div>\r\n {longe && !semMensagens && (\r\n <Botao\r\n className=\"lp-conversa-fim\"\r\n rotulo={rotuloIrParaFim}\r\n icone=\"arrow-down\"\r\n severidade=\"secundario\"\r\n tamanho=\"pequeno\"\r\n sombra=\"media\"\r\n onClick={irParaFim}\r\n />\r\n )}\r\n </div>\r\n {campo && <div className=\"lp-conversa-campo\">{campo}</div>}\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { formatDataHoraBr, formatHoraBr } from '../../utils/datas';\r\nimport { Icone } from '../../utils/Icone';\r\nimport { Avatar } from '../Avatar/Avatar';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { useToastOpcional } from '../Toast/Toast';\r\nimport './Mensagem.css';\r\n\r\n/** `usuario` = à direita, em destaque · `assistente` = à esquerda, neutra · `sistema` = aviso centralizado. */\r\nexport type AutorMensagem = 'usuario' | 'assistente' | 'sistema';\r\n/**\r\n * `enviando` = ainda não confirmada · `gerando` = a resposta está chegando\r\n * (sem conteúdo, mostra os três pontos) · `concluida` · `erro`.\r\n */\r\nexport type EstadoMensagem = 'enviando' | 'gerando' | 'concluida' | 'erro';\r\n\r\nexport interface MensagemProps {\r\n autor?: AutorMensagem;\r\n /** O conteúdo. Texto puro preserva as quebras de linha; Markdown chega já renderizado pelo app. */\r\n children?: ReactNode;\r\n /** Nome de quem escreveu, acima da bolha. */\r\n nome?: string;\r\n /** `true` = iniciais do `nome` · texto = URL da foto · ou um nó próprio (`<Avatar>`, ícone). */\r\n avatar?: ReactNode;\r\n /** Quando foi enviada. `Date` vira `HH:mm` (hoje) ou `dd/mm/aaaa HH:mm`; texto aparece como veio. */\r\n hora?: Date | string;\r\n estado?: EstadoMensagem;\r\n /** Texto do erro, com `estado=\"erro\"`. */\r\n erro?: ReactNode;\r\n /** Mostra \"Tentar novamente\" no erro. */\r\n aoTentarNovamente?: () => void;\r\n /** Botão que copia o texto da mensagem. */\r\n copiavel?: boolean;\r\n /** O que copiar, quando o conteúdo não é texto puro. Padrão: o texto visível. */\r\n textoCopia?: string;\r\n /** Outras ações abaixo da bolha (botões pequenos). */\r\n acoes?: ReactNode;\r\n /** Abaixo do conteúdo, dentro da bolha (ex.: `Referencias`). */\r\n rodape?: ReactNode;\r\n rotuloTentarNovamente?: string;\r\n rotuloCopiar?: string;\r\n /** Lido pelo leitor de tela no lugar dos três pontos. */\r\n rotuloGerando?: string;\r\n rotuloEnviando?: string;\r\n className?: string;\r\n}\r\n\r\nfunction formatarHora(d: Date) {\r\n return d.toDateString() === new Date().toDateString() ? formatHoraBr(d) : formatDataHoraBr(d);\r\n}\r\n\r\n/** Uma mensagem da `Conversa`: bolha com autor, hora, estado e ações. */\r\nexport function Mensagem({\r\n autor = 'assistente',\r\n children,\r\n nome,\r\n avatar,\r\n hora,\r\n estado = 'concluida',\r\n erro,\r\n aoTentarNovamente,\r\n copiavel = false,\r\n textoCopia,\r\n acoes,\r\n rodape,\r\n rotuloTentarNovamente = 'Tentar novamente',\r\n rotuloCopiar = 'Copiar mensagem',\r\n rotuloGerando = 'Gerando resposta',\r\n rotuloEnviando = 'Enviando',\r\n className,\r\n}: MensagemProps) {\r\n const toast = useToastOpcional();\r\n const conteudo = useRef<HTMLDivElement>(null);\r\n const timer = useRef<number | undefined>(undefined);\r\n const [copiado, setCopiado] = useState(false);\r\n useEffect(() => () => window.clearTimeout(timer.current), []);\r\n\r\n const vazio = children === undefined || children === null || children === false || children === '';\r\n const texto = typeof children === 'string';\r\n const gerando = estado === 'gerando';\r\n const comErro = estado === 'erro';\r\n\r\n const copiar = async () => {\r\n const valor = textoCopia ?? (texto ? children : (conteudo.current?.innerText ?? ''));\r\n try {\r\n await navigator.clipboard.writeText(valor);\r\n toast?.ok('Mensagem copiada');\r\n setCopiado(true);\r\n window.clearTimeout(timer.current);\r\n timer.current = window.setTimeout(() => setCopiado(false), 2000);\r\n } catch {\r\n toast?.err('Não foi possível copiar', 'O navegador bloqueou o acesso à área de transferência.');\r\n }\r\n };\r\n\r\n if (autor === 'sistema') {\r\n return (\r\n <div className={cx('lp-mensagem', 'lp-mensagem--sistema', className)}>\r\n <div className=\"lp-mensagem-conteudo\" ref={conteudo}>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const blocoAvatar =\r\n avatar === true ? (\r\n <Avatar nome={nome} tom={autor === 'usuario' ? 'escuro' : 'claro'} />\r\n ) : typeof avatar === 'string' ? (\r\n <Avatar foto={avatar} nome={nome} />\r\n ) : (\r\n avatar\r\n );\r\n const comAcoes = (copiavel && !vazio && !gerando) || !!acoes;\r\n const dataHora = hora instanceof Date ? hora.toISOString() : undefined;\r\n\r\n return (\r\n <div\r\n className={cx('lp-mensagem', `lp-mensagem--${autor}`, `is-${estado}`, className)}\r\n // a resposta ainda está mudando: o leitor de tela espera ela terminar\r\n aria-busy={gerando || undefined}\r\n >\r\n {blocoAvatar && <div className=\"lp-mensagem-avatar\">{blocoAvatar}</div>}\r\n <div className=\"lp-mensagem-coluna\">\r\n {(nome || hora) && (\r\n <div className=\"lp-mensagem-meta\">\r\n {nome && <span className=\"lp-mensagem-nome\">{nome}</span>}\r\n {hora && <time dateTime={dataHora}>{hora instanceof Date ? formatarHora(hora) : hora}</time>}\r\n </div>\r\n )}\r\n {/* erro antes de qualquer conteúdo: só a faixa de erro, sem bolha vazia */}\r\n {(!vazio || gerando || rodape) && (\r\n <div className=\"lp-mensagem-bolha\">\r\n {gerando && vazio ? (\r\n <span className=\"lp-mensagem-digitando\">\r\n <span className=\"lp-sr\">{rotuloGerando}</span>\r\n <span aria-hidden=\"true\" />\r\n <span aria-hidden=\"true\" />\r\n <span aria-hidden=\"true\" />\r\n </span>\r\n ) : (\r\n <div className={cx('lp-mensagem-conteudo', texto && 'lp-mensagem-conteudo--texto')} ref={conteudo}>\r\n {children}\r\n {gerando && <span className=\"lp-mensagem-cursor\" aria-hidden=\"true\" />}\r\n </div>\r\n )}\r\n {rodape && <div className=\"lp-mensagem-rodape\">{rodape}</div>}\r\n </div>\r\n )}\r\n {estado === 'enviando' && <div className=\"lp-mensagem-situacao\">{rotuloEnviando}…</div>}\r\n {comErro && (\r\n <div className=\"lp-mensagem-erro\" role=\"alert\">\r\n <Icone icone=\"circle-alert\" className=\"lp-mensagem-erro-ic\" />\r\n <span className=\"lp-mensagem-erro-txt\">{erro ?? 'Não foi possível concluir esta mensagem.'}</span>\r\n {aoTentarNovamente && (\r\n <Botao rotulo={rotuloTentarNovamente} icone=\"refresh-cw\" severidade=\"err\" aparencia=\"texto\" tamanho=\"pequeno\" onClick={aoTentarNovamente} />\r\n )}\r\n </div>\r\n )}\r\n {comAcoes && (\r\n <div className=\"lp-mensagem-acoes\">\r\n {copiavel && !vazio && !gerando && (\r\n <Botao\r\n icone={copiado ? 'check' : 'copy'}\r\n aria-label={rotuloCopiar}\r\n dica={rotuloCopiar}\r\n severidade=\"secundario\"\r\n aparencia=\"texto\"\r\n tamanho=\"pequeno\"\r\n onClick={copiar}\r\n />\r\n )}\r\n {acoes}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { forwardRef, useCallback, useImperativeHandle, useLayoutEffect, useRef, type KeyboardEvent, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { useCampoIds } from '../Campo/Campo';\r\nimport './CampoMensagem.css';\r\n\r\nexport interface CampoMensagemProps {\r\n valor: string;\r\n aoMudar: (valor: string) => void;\r\n /** Recebe o texto sem espaços nas pontas; nunca é chamado com texto vazio. */\r\n aoEnviar: (texto: string) => void;\r\n /** Uma resposta está chegando: o Enviar vira Parar. */\r\n gerando?: boolean;\r\n /** Chamado pelo botão Parar (sem ele, o Parar fica desabilitado). */\r\n aoParar?: () => void;\r\n desabilitado?: boolean;\r\n placeholder?: string;\r\n /** Limite de caracteres; o contador aparece perto do limite. */\r\n maxCaracteres?: number;\r\n /** Até quantas linhas o campo cresce antes de rolar. */\r\n linhasMaximas?: number;\r\n autoFocus?: boolean;\r\n /** Botões próprios do app à esquerda do Enviar (anexar, escolher documentos…). */\r\n acoesExtras?: ReactNode;\r\n /** Rótulo do campo para leitores de tela. */\r\n rotulo?: string;\r\n rotuloEnviar?: string;\r\n rotuloParar?: string;\r\n id?: string;\r\n className?: string;\r\n}\r\n\r\n/** a partir de que fração do limite o contador aparece */\r\nconst AVISO_CONTADOR = 0.8;\r\n\r\n/**\r\n * Campo de envio de mensagem: Enter envia, Shift+Enter quebra a linha. Cresce\r\n * com o texto até `linhasMaximas` e depois rola.\r\n */\r\nexport const CampoMensagem = forwardRef<HTMLTextAreaElement, CampoMensagemProps>(function CampoMensagem(\r\n {\r\n valor,\r\n aoMudar,\r\n aoEnviar,\r\n gerando = false,\r\n aoParar,\r\n desabilitado = false,\r\n placeholder = 'Escreva uma mensagem',\r\n maxCaracteres,\r\n linhasMaximas = 6,\r\n autoFocus,\r\n acoesExtras,\r\n rotulo = 'Mensagem',\r\n rotuloEnviar = 'Enviar mensagem',\r\n rotuloParar = 'Parar',\r\n id: idExterno,\r\n className,\r\n },\r\n ref,\r\n) {\r\n const { id } = useCampoIds(idExterno);\r\n const campo = useRef<HTMLTextAreaElement>(null);\r\n useImperativeHandle(ref, () => campo.current as HTMLTextAreaElement);\r\n\r\n const texto = valor.trim();\r\n const podeEnviar = !desabilitado && !gerando && texto !== '' && (!maxCaracteres || valor.length <= maxCaracteres);\r\n const pct = maxCaracteres ? valor.length / maxCaracteres : 0;\r\n\r\n // altura = conteúdo, até o limite de linhas; daí em diante, rola\r\n const ajustarAltura = useCallback(() => {\r\n const el = campo.current;\r\n if (!el) return;\r\n const cs = getComputedStyle(el);\r\n const linha = parseFloat(cs.lineHeight) || parseFloat(cs.fontSize) * 1.5;\r\n const max = linha * linhasMaximas + parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom);\r\n el.style.height = 'auto';\r\n el.style.height = `${Math.min(el.scrollHeight, max)}px`;\r\n el.style.overflowY = el.scrollHeight > max ? 'auto' : 'hidden';\r\n }, [linhasMaximas]);\r\n\r\n useLayoutEffect(ajustarAltura, [valor, ajustarAltura]);\r\n\r\n // largura mudou (janela, painel): as linhas quebram em outro ponto\r\n useLayoutEffect(() => {\r\n const el = campo.current;\r\n if (!el) return;\r\n let largura = el.clientWidth;\r\n const ro = new ResizeObserver(() => {\r\n if (el.clientWidth === largura) return;\r\n largura = el.clientWidth;\r\n ajustarAltura();\r\n });\r\n ro.observe(el);\r\n return () => ro.disconnect();\r\n }, [ajustarAltura]);\r\n\r\n const enviar = () => {\r\n if (!podeEnviar) return;\r\n aoEnviar(texto);\r\n };\r\n\r\n const aoTeclar = (e: KeyboardEvent<HTMLTextAreaElement>) => {\r\n if (e.key !== 'Enter' || e.shiftKey) return;\r\n // Enter que confirma a composição do IME (japonês, chinês…) não envia\r\n if (e.nativeEvent.isComposing || e.keyCode === 229) return;\r\n e.preventDefault();\r\n enviar();\r\n };\r\n\r\n return (\r\n <div className={cx('lp-campo-mensagem', desabilitado && 'is-disabled', className)} onClick={() => campo.current?.focus()}>\r\n <label className=\"lp-sr\" htmlFor={id}>\r\n {rotulo}\r\n </label>\r\n <textarea\r\n ref={campo}\r\n id={id}\r\n rows={1}\r\n className=\"lp-campo-mensagem-texto\"\r\n value={valor}\r\n placeholder={placeholder}\r\n maxLength={maxCaracteres}\r\n disabled={desabilitado}\r\n autoFocus={autoFocus}\r\n enterKeyHint=\"send\"\r\n onChange={(e) => aoMudar(e.target.value)}\r\n onKeyDown={aoTeclar}\r\n />\r\n <div className=\"lp-campo-mensagem-barra\" onClick={(e) => e.stopPropagation()}>\r\n {acoesExtras && <div className=\"lp-campo-mensagem-extras\">{acoesExtras}</div>}\r\n {maxCaracteres && pct >= AVISO_CONTADOR && (\r\n <span className={cx('lp-campo-mensagem-contador', pct >= 1 ? 'is-err' : pct >= 0.9 && 'is-warn')} aria-hidden=\"true\">\r\n {valor.length}/{maxCaracteres}\r\n </span>\r\n )}\r\n {gerando ? (\r\n <Botao\r\n \r\n icone=\"square\"\r\n aria-label={rotuloParar}\r\n dica={rotuloParar}\r\n severidade=\"secundario\"\r\n disabled={!aoParar}\r\n onClick={aoParar}\r\n />\r\n ) : (\r\n <Botao icone=\"send\" aria-label={rotuloEnviar} dica={rotuloEnviar} disabled={!podeEnviar} onClick={enviar} />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n});\r\n","import { useId, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\r\nimport { cx } from '../../utils/cx';\r\nimport { Icone } from '../../utils/Icone';\r\nimport { Recolhivel } from '../Recolhivel/Recolhivel';\r\nimport './Referencias.css';\r\n\r\nexport interface ItemReferencia {\r\n id: string;\r\n /** Nome da fonte (documento, página, artigo…). */\r\n titulo: ReactNode;\r\n /** Linha curta ao lado do título (ex.: \"Página 3\"). */\r\n detalhe?: ReactNode;\r\n /** Trecho citado; aparece truncado, com opção de expandir. */\r\n trecho?: ReactNode;\r\n /** Torna o título um link (abre em nova aba). */\r\n href?: string;\r\n}\r\n\r\nexport interface ReferenciasProps {\r\n itens: ItemReferencia[];\r\n /** Começa aberta. */\r\n abertoInicial?: boolean;\r\n /** Texto do botão que abre a lista. Padrão: \"3 fontes\". */\r\n rotulo?: (quantidade: number) => ReactNode;\r\n rotuloMostrarMais?: string;\r\n rotuloMostrarMenos?: string;\r\n className?: string;\r\n}\r\n\r\nconst rotuloPadrao = (n: number) => (n === 1 ? '1 fonte' : `${n} fontes`);\r\n\r\nfunction Trecho({ children, mais, menos }: { children: ReactNode; mais: string; menos: string }) {\r\n const el = useRef<HTMLDivElement>(null);\r\n const [aberto, setAberto] = useState(false);\r\n const [cortado, setCortado] = useState(false);\r\n\r\n // só oferece \"mostrar mais\" se o trecho passar das linhas visíveis\r\n useLayoutEffect(() => {\r\n const t = el.current;\r\n if (!t) return;\r\n const medir = () => !aberto && setCortado(t.scrollHeight > t.clientHeight + 1);\r\n medir();\r\n const ro = new ResizeObserver(medir);\r\n ro.observe(t);\r\n return () => ro.disconnect();\r\n }, [aberto, children]);\r\n\r\n return (\r\n <>\r\n <div ref={el} className={cx('lp-referencias-trecho', aberto && 'is-aberto')}>\r\n {children}\r\n </div>\r\n {(cortado || aberto) && (\r\n <button type=\"button\" className=\"lp-referencias-mais\" aria-expanded={aberto} onClick={() => setAberto((a) => !a)}>\r\n {aberto ? menos : mais}\r\n </button>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\n/** Lista recolhível de fontes/citações de uma mensagem (vai no `rodape` da `Mensagem`). */\r\nexport function Referencias({\r\n itens,\r\n abertoInicial = false,\r\n rotulo = rotuloPadrao,\r\n rotuloMostrarMais = 'Mostrar trecho completo',\r\n rotuloMostrarMenos = 'Mostrar menos',\r\n className,\r\n}: ReferenciasProps) {\r\n const id = useId();\r\n const [aberto, setAberto] = useState(abertoInicial);\r\n if (!itens.length) return null;\r\n\r\n return (\r\n <div className={cx('lp-referencias', aberto && 'is-aberto', className)}>\r\n <button type=\"button\" className=\"lp-referencias-gatilho\" aria-expanded={aberto} aria-controls={id} onClick={() => setAberto((a) => !a)}>\r\n <Icone icone=\"file-text\" />\r\n <span>{rotulo(itens.length)}</span>\r\n <Icone icone=\"chevron-down\" className=\"lp-referencias-seta\" />\r\n </button>\r\n <Recolhivel aberto={aberto} id={id}>\r\n <ol className=\"lp-referencias-lista\">\r\n {itens.map((item, i) => (\r\n <li key={item.id} className=\"lp-referencias-item\">\r\n <span className=\"lp-referencias-num\" aria-hidden=\"true\">\r\n {i + 1}\r\n </span>\r\n <div className=\"lp-referencias-corpo\">\r\n <div className=\"lp-referencias-cab\">\r\n {item.href ? (\r\n <a className=\"lp-referencias-titulo\" href={item.href} target=\"_blank\" rel=\"noopener noreferrer\">\r\n {item.titulo}\r\n <Icone icone=\"external-link\" />\r\n </a>\r\n ) : (\r\n <span className=\"lp-referencias-titulo\">{item.titulo}</span>\r\n )}\r\n {item.detalhe && <span className=\"lp-referencias-detalhe\">{item.detalhe}</span>}\r\n </div>\r\n {item.trecho && (\r\n <Trecho mais={rotuloMostrarMais} menos={rotuloMostrarMenos}>\r\n {item.trecho}\r\n </Trecho>\r\n )}\r\n </div>\r\n </li>\r\n ))}\r\n </ol>\r\n </Recolhivel>\r\n </div>\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { useRef, useState, type KeyboardEvent, type PointerEvent } from 'react';\r\nimport { formatBytes, iconeArquivo, tipoDeArquivo, type Anexo } from '../../utils/anexos';\r\nimport { cx } from '../../utils/cx';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { Vazio } from '../Vazio/Vazio';\r\nimport './Arquivo.css';\r\n\r\nexport interface VisualizadorArquivoProps {\r\n arquivo: Anexo | null;\r\n /** A imagem/vídeo/áudio falhou ao carregar (URL expirada, 404, codec). */\r\n aoFalhar?: (arquivo: Anexo) => void;\r\n className?: string;\r\n}\r\n\r\nconst NIVEIS = [1, 1.5, 2, 3, 4];\r\n\r\n/**\r\n * Superfície de exibição de UM anexo: imagem (zoom, giro, arrasto), PDF,\r\n * vídeo e áudio nativos; o resto cai num estado com botão \"Baixar\".\r\n */\r\nexport function VisualizadorArquivo({ arquivo, aoFalhar, className }: VisualizadorArquivoProps) {\r\n // a identidade do anexo zera zoom/giro/arrasto ao trocar de arquivo\r\n const chave = arquivo ? `${arquivo.url ?? ''}|${arquivo.nome}` : 'vazio';\r\n return (\r\n <div className={cx('lp-visu', className)}>\r\n <Conteudo key={chave} arquivo={arquivo} aoFalhar={aoFalhar} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction Conteudo({ arquivo, aoFalhar }: Omit<VisualizadorArquivoProps, 'className'>) {\r\n const [falhou, setFalhou] = useState(false);\r\n const url = arquivo?.url?.trim();\r\n const tipo = arquivo ? tipoDeArquivo(arquivo.tipo, arquivo.nome) : 'outro';\r\n const falhar = () => {\r\n setFalhou(true);\r\n if (arquivo) aoFalhar?.(arquivo);\r\n };\r\n\r\n if (!arquivo || !url || falhou || tipo === 'outro') {\r\n const detalhe = [arquivo?.nome, arquivo?.tamanho ? formatBytes(arquivo.tamanho) : ''].filter(Boolean).join(' · ');\r\n return (\r\n <div className=\"lp-visu-indisponivel\">\r\n <Vazio\r\n icone={arquivo ? iconeArquivo(arquivo.tipo, arquivo.nome) : 'file'}\r\n titulo={url ? 'Pré-visualização indisponível' : 'Arquivo indisponível'}\r\n descricao={detalhe || undefined}\r\n >\r\n {url && (\r\n <a className=\"lp-visu-baixar\" href={url} download={arquivo?.nome} target=\"_blank\" rel=\"noreferrer\">\r\n <Icone icone=\"download\" />\r\n Baixar\r\n </a>\r\n )}\r\n </Vazio>\r\n </div>\r\n );\r\n }\r\n\r\n if (tipo === 'imagem') return <Imagem url={url} nome={arquivo.nome} aoFalhar={falhar} />;\r\n if (tipo === 'pdf') return <iframe className=\"lp-visu-pdf\" src={url} title={arquivo.nome || 'Documento PDF'} />;\r\n if (tipo === 'video')\r\n return (\r\n <video className=\"lp-visu-video\" src={url} controls preload=\"metadata\" onError={falhar}>\r\n <track kind=\"captions\" />\r\n </video>\r\n );\r\n return (\r\n <div className=\"lp-visu-audio\">\r\n <Icone icone=\"volume-2\" />\r\n <span className=\"lp-visu-audio-nome\">{arquivo.nome}</span>\r\n <audio src={url} controls preload=\"metadata\" onError={falhar} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction Imagem({ url, nome, aoFalhar }: { url: string; nome: string; aoFalhar: () => void }) {\r\n const [nivel, setNivel] = useState(0);\r\n const [giro, setGiro] = useState(0);\r\n const [pan, setPan] = useState({ x: 0, y: 0 });\r\n const palco = useRef<HTMLDivElement>(null);\r\n const arrasto = useRef<{ x: number; y: number; px: number; py: number } | null>(null);\r\n const zoom = NIVEIS[nivel];\r\n\r\n const limitar = (x: number, y: number) => {\r\n const r = palco.current?.getBoundingClientRect();\r\n if (!r) return { x, y };\r\n // a imagem nunca sai inteira da área visível\r\n const mx = (r.width * (zoom - 1)) / 2 + r.width * 0.25;\r\n const my = (r.height * (zoom - 1)) / 2 + r.height * 0.25;\r\n return { x: Math.max(-mx, Math.min(mx, x)), y: Math.max(-my, Math.min(my, y)) };\r\n };\r\n\r\n const mudarNivel = (n: number) => {\r\n const novo = Math.max(0, Math.min(NIVEIS.length - 1, n));\r\n setNivel(novo);\r\n if (novo === 0) setPan({ x: 0, y: 0 });\r\n };\r\n const ajustar = () => {\r\n setNivel(0);\r\n setPan({ x: 0, y: 0 });\r\n };\r\n const girar = () => {\r\n setGiro((g) => (g + 90) % 360);\r\n setPan({ x: 0, y: 0 });\r\n };\r\n\r\n const aoTeclar = (e: KeyboardEvent) => {\r\n if (e.key === '+' || e.key === '=') mudarNivel(nivel + 1);\r\n else if (e.key === '-' || e.key === '_') mudarNivel(nivel - 1);\r\n else if (e.key === '0') ajustar();\r\n else if (e.key === 'r' || e.key === 'R') girar();\r\n else return;\r\n e.preventDefault();\r\n };\r\n\r\n const aoPressionar = (e: PointerEvent) => {\r\n if (zoom <= 1) return;\r\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\r\n arrasto.current = { x: e.clientX, y: e.clientY, px: pan.x, py: pan.y };\r\n };\r\n const aoMover = (e: PointerEvent) => {\r\n const a = arrasto.current;\r\n if (!a) return;\r\n setPan(limitar(a.px + e.clientX - a.x, a.py + e.clientY - a.y));\r\n };\r\n\r\n return (\r\n <div className=\"lp-visu-img\">\r\n <div\r\n ref={palco}\r\n className={cx('lp-visu-palco', zoom > 1 && 'is-ampliado')}\r\n tabIndex={0}\r\n role=\"img\"\r\n aria-label={nome ? `Imagem ${nome}` : 'Imagem'}\r\n onKeyDown={aoTeclar}\r\n onDoubleClick={() => (nivel === 0 ? setNivel(NIVEIS.indexOf(2)) : ajustar())}\r\n onPointerDown={aoPressionar}\r\n onPointerMove={aoMover}\r\n onPointerUp={() => (arrasto.current = null)}\r\n onPointerCancel={() => (arrasto.current = null)}\r\n >\r\n <img\r\n src={url}\r\n alt=\"\"\r\n draggable={false}\r\n onError={aoFalhar}\r\n style={{ transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom}) rotate(${giro}deg)` }}\r\n />\r\n </div>\r\n <div className=\"lp-visu-barra\" role=\"toolbar\" aria-label=\"Controles da imagem\">\r\n <Botao icone=\"zoom-out\" severidade=\"secundario\" aparencia=\"texto\" dica=\"Reduzir\" aria-label=\"Reduzir\" disabled={nivel === 0} onClick={() => mudarNivel(nivel - 1)} />\r\n <span className=\"lp-visu-zoom\" aria-live=\"polite\">\r\n {Math.round(zoom * 100)}%\r\n </span>\r\n <Botao\r\n icone=\"zoom-in\"\r\n severidade=\"secundario\"\r\n aparencia=\"texto\"\r\n dica=\"Ampliar\" aria-label=\"Ampliar\"\r\n disabled={nivel === NIVEIS.length - 1}\r\n onClick={() => mudarNivel(nivel + 1)}\r\n />\r\n <Botao icone=\"maximize\" severidade=\"secundario\" aparencia=\"texto\" dica=\"Ajustar à tela\" aria-label=\"Ajustar à tela\" onClick={ajustar} />\r\n <Botao icone=\"refresh-cw\" severidade=\"secundario\" aparencia=\"texto\" dica=\"Girar 90 graus\" aria-label=\"Girar 90 graus\" onClick={girar} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useEffect } from 'react';\r\nimport { formatBytes, type Anexo } from '../../utils/anexos';\r\nimport { Botao } from '../Botao/Botao';\r\nimport { Dialogo } from '../Dialogo/Dialogo';\r\nimport { VisualizadorArquivo } from './VisualizadorArquivo';\r\nimport './Arquivo.css';\r\n\r\nexport interface DialogoArquivoProps {\r\n aberto: boolean;\r\n aoFechar: () => void;\r\n /** A lista INTEIRA; aponte o item clicado com `indice`. */\r\n arquivos: readonly Anexo[];\r\n indice: number;\r\n aoMudarIndice: (indice: number) => void;\r\n}\r\n\r\n// setas pertencem ao controle quando o foco está num destes\r\nconst CONTROLES = 'video, audio, input, textarea, select, [contenteditable=\"\"], [contenteditable=\"true\"]';\r\n\r\n/** Visualizador em tela cheia que folheia uma lista de anexos (botões ou ← →). */\r\nexport function DialogoArquivo({ aberto, aoFechar, arquivos, indice, aoMudarIndice }: DialogoArquivoProps) {\r\n const total = arquivos.length;\r\n const i = Math.max(0, Math.min(indice, total - 1));\r\n const atual = arquivos[i] ?? null;\r\n\r\n useEffect(() => {\r\n if (!aberto || total < 2) return;\r\n const h = (e: KeyboardEvent) => {\r\n if ((e.target as HTMLElement | null)?.closest?.(CONTROLES)) return;\r\n if (e.key === 'ArrowLeft' && i > 0) aoMudarIndice(i - 1);\r\n else if (e.key === 'ArrowRight' && i < total - 1) aoMudarIndice(i + 1);\r\n };\r\n document.addEventListener('keydown', h);\r\n return () => document.removeEventListener('keydown', h);\r\n }, [aberto, total, i, aoMudarIndice]);\r\n\r\n return (\r\n <Dialogo\r\n aberto={aberto}\r\n aoFechar={aoFechar}\r\n tamanho=\"full\"\r\n icone=\"paperclip\"\r\n titulo={atual?.nome || 'Anexo'}\r\n subtitulo={atual?.tamanho ? formatBytes(atual.tamanho) : undefined}\r\n className=\"lp-dlg-arq\"\r\n rodape={\r\n total > 1 ? (\r\n <>\r\n <span className=\"lp-dlg-arq-pos\" aria-live=\"polite\">\r\n {i + 1} de {total}\r\n </span>\r\n <Botao rotulo=\"Anterior\" icone=\"chevron-left\" severidade=\"secundario\" disabled={i === 0} onClick={() => aoMudarIndice(i - 1)} />\r\n <Botao\r\n rotulo=\"Próximo\"\r\n icone=\"chevron-right\"\r\n posicaoIcone=\"direita\"\r\n severidade=\"secundario\"\r\n disabled={i === total - 1}\r\n onClick={() => aoMudarIndice(i + 1)}\r\n />\r\n </>\r\n ) : undefined\r\n }\r\n >\r\n <VisualizadorArquivo arquivo={atual} />\r\n </Dialogo>\r\n );\r\n}\r\n","import { Icone } from '../../utils/Icone';\r\nimport { forwardRef, useContext, useEffect, useImperativeHandle, useRef, useState, type DragEvent } from 'react';\r\nimport { formatBytes, iconeArquivo, tipoDeArquivo, type Anexo } from '../../utils/anexos';\r\nimport { cx } from '../../utils/cx';\r\nimport { listaPorExtenso } from '../../utils/texto';\r\nimport { AcaoLinha } from '../AcaoLinha/AcaoLinha';\r\nimport { Campo, RevelarCamposCtx, useCampoIds, type CampoBaseProps } from '../Campo/Campo';\r\nimport { DialogoArquivo } from './DialogoArquivo';\r\nimport './Arquivo.css';\r\n\r\nexport interface CampoAnexoProps extends Omit<CampoBaseProps, 'variante' | 'obrigatorio'> {\r\n /** Lista serializável de anexos (sem o `File`). */\r\n valor?: Anexo[];\r\n aoMudar?: (valor: Anexo[]) => void;\r\n /** Filtro do seletor nativo (ex.: `image/*,.pdf`). */\r\n accept?: string;\r\n /** Vários arquivos (padrão: sim). Com `false`, a nova escolha substitui. */\r\n multiple?: boolean;\r\n /** Tamanho máximo por arquivo, em bytes (0 = sem limite). */\r\n maxTamanho?: number;\r\n /** Mínimo de anexos; acima de zero o campo é obrigatório. */\r\n minimo?: number;\r\n disabled?: boolean;\r\n id?: string;\r\n}\r\n\r\n/** O que a `ref` do `CampoAnexo` expõe. */\r\nexport interface CampoAnexoRef {\r\n /** O `File` da sessão por trás do anexo, ou `null` (anexo já salvo no backend). */\r\n arquivoDe: (anexo: Pick<Anexo, 'nome' | 'tamanho'>) => File | null;\r\n}\r\n\r\nconst chaveDe = (a: Pick<Anexo, 'nome' | 'tamanho'>) => `${a.nome}|${a.tamanho}`;\r\n\r\n/**\r\n * Zona de anexos (clicar ou arrastar). O valor é `Anexo[]`; o `File` real fica\r\n * na sessão e sai por `ref.current.arquivoDe(anexo)` na hora do upload.\r\n */\r\nexport const CampoAnexo = forwardRef<CampoAnexoRef, CampoAnexoProps>(function CampoAnexo({\r\n rotulo,\r\n dica,\r\n erro,\r\n aviso,\r\n className,\r\n id: idExterno,\r\n valor = [],\r\n aoMudar,\r\n accept,\r\n multiple = true,\r\n maxTamanho = 0,\r\n minimo = 0,\r\n disabled = false,\r\n}, ref) {\r\n const { id, msgId } = useCampoIds(idExterno);\r\n const input = useRef<HTMLInputElement>(null);\r\n const arquivos = useRef(new Map<string, File>());\r\n const urls = useRef(new Map<string, string>());\r\n const [sobre, setSobre] = useState(false);\r\n const [recusados, setRecusados] = useState('');\r\n const [visualizando, setVisualizando] = useState<number | null>(null);\r\n const [mexido, setMexido] = useState(false);\r\n const tentativas = useContext(RevelarCamposCtx);\r\n\r\n useImperativeHandle(ref, () => ({ arquivoDe: (a) => arquivos.current.get(chaveDe(a)) ?? null }), []);\r\n\r\n // libera as URLs de pré-visualização ao desmontar\r\n useEffect(() => () => urls.current.forEach((u) => URL.revokeObjectURL(u)), []);\r\n\r\n const adicionar = (lista: FileList | null) => {\r\n if (!lista?.length || disabled) return;\r\n setMexido(true);\r\n const aceitos: Anexo[] = [];\r\n const grandes: string[] = [];\r\n for (const f of Array.from(lista)) {\r\n if (maxTamanho && f.size > maxTamanho) {\r\n grandes.push(f.name);\r\n continue;\r\n }\r\n const k = chaveDe({ nome: f.name, tamanho: f.size });\r\n arquivos.current.set(k, f);\r\n let url = urls.current.get(k);\r\n if (!url) {\r\n url = URL.createObjectURL(f);\r\n urls.current.set(k, url);\r\n }\r\n aceitos.push({ nome: f.name, tamanho: f.size, tipo: f.type, url });\r\n }\r\n setRecusados(grandes.length ? `${listaPorExtenso(grandes)} excede${grandes.length > 1 ? 'm' : ''} ${formatBytes(maxTamanho)}.` : '');\r\n if (!aceitos.length) return;\r\n if (!multiple) aoMudar?.(aceitos.slice(0, 1));\r\n else {\r\n const existentes = new Set(valor.map(chaveDe));\r\n aoMudar?.([...valor, ...aceitos.filter((a) => !existentes.has(chaveDe(a)))]);\r\n }\r\n };\r\n\r\n const remover = (a: Anexo) => {\r\n setMexido(true);\r\n aoMudar?.(valor.filter((x) => chaveDe(x) !== chaveDe(a)));\r\n };\r\n\r\n const aoSoltar = (e: DragEvent) => {\r\n e.preventDefault();\r\n setSobre(false);\r\n adicionar(e.dataTransfer.files);\r\n };\r\n\r\n const faltam = minimo > 0 && valor.length < minimo && (mexido || tentativas > 0);\r\n const erroFinal =\r\n erro ||\r\n recusados ||\r\n (faltam ? (minimo === 1 ? 'Anexe pelo menos um arquivo' : `Anexe pelo menos ${minimo} arquivos`) : undefined);\r\n\r\n return (\r\n <Campo\r\n rotulo={rotulo}\r\n dica={dica}\r\n erro={erroFinal}\r\n aviso={aviso}\r\n obrigatorio={minimo > 0}\r\n className={className}\r\n htmlFor={id}\r\n msgId={msgId}\r\n >\r\n <div\r\n className={cx('lp-anexo-zona', sobre && 'is-sobre', erroFinal && 'is-invalid', disabled && 'is-disabled')}\r\n onClick={() => input.current?.click()}\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n if (!disabled) setSobre(true);\r\n }}\r\n onDragLeave={() => setSobre(false)}\r\n onDrop={aoSoltar}\r\n >\r\n <Icone icone=\"cloud-upload\" />\r\n <span>\r\n <strong>Clique para escolher</strong> ou arraste {multiple ? 'os arquivos' : 'o arquivo'} até aqui\r\n </span>\r\n {maxTamanho > 0 && <small>Até {formatBytes(maxTamanho)} por arquivo</small>}\r\n <input\r\n ref={input}\r\n id={id}\r\n type=\"file\"\r\n className=\"lp-sr\"\r\n accept={accept}\r\n multiple={multiple}\r\n disabled={disabled}\r\n aria-describedby={erroFinal || aviso || dica ? msgId : undefined}\r\n aria-invalid={erroFinal ? true : undefined}\r\n onClick={(e) => e.stopPropagation()}\r\n onChange={(e) => {\r\n adicionar(e.target.files);\r\n e.target.value = '';\r\n }}\r\n />\r\n </div>\r\n\r\n {valor.length > 0 && (\r\n <ul className=\"lp-anexo-lista\">\r\n {valor.map((a, i) => (\r\n <li key={chaveDe(a)} className=\"lp-anexo-item\">\r\n <button type=\"button\" className=\"lp-anexo-abrir\" onClick={() => setVisualizando(i)} title={`Visualizar ${a.nome}`}>\r\n <span className=\"lp-anexo-thumb\">\r\n {tipoDeArquivo(a.tipo, a.nome) === 'imagem' && a.url ? (\r\n <img src={a.miniatura ?? a.url} alt=\"\" />\r\n ) : (\r\n <Icone icone={iconeArquivo(a.tipo, a.nome)} />\r\n )}\r\n </span>\r\n <span className=\"lp-anexo-txt\">\r\n <span className=\"lp-anexo-nome\">{a.nome}</span>\r\n <span className=\"lp-anexo-tam\">{formatBytes(a.tamanho)}</span>\r\n </span>\r\n </button>\r\n {!disabled && <AcaoLinha icone=\"x\" rotulo={`Remover ${a.nome}`} severidade=\"err\" onClick={() => remover(a)} />}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n\r\n <DialogoArquivo\r\n aberto={visualizando !== null}\r\n aoFechar={() => setVisualizando(null)}\r\n arquivos={valor}\r\n indice={visualizando ?? 0}\r\n aoMudarIndice={setVisualizando}\r\n />\r\n </Campo>\r\n );\r\n});\r\n","import { Icone } from '../../utils/Icone';\r\nimport { useState, type CSSProperties, type ReactNode } from 'react';\r\nimport type { Anexo } from '../../utils/anexos';\r\nimport { cx } from '../../utils/cx';\r\nimport { Avatar } from '../Avatar/Avatar';\r\nimport { DialogoArquivo } from './DialogoArquivo';\r\nimport './Arquivo.css';\r\n\r\nexport type EntradaFoto = string | Anexo | readonly (string | Anexo)[] | null | undefined;\r\n\r\nexport interface FotoProps {\r\n /** A foto ou a coleção: URL, `Anexo` ou lista misturando os dois. */\r\n fotos?: EntradaFoto;\r\n /** De quem é a foto: vira o `alt` e as iniciais do avatar sem foto. */\r\n nome: string;\r\n tamanho?: 'sm' | 'md' | 'lg';\r\n /** Válvulas de escape da escala (ex.: `13rem`). */\r\n altura?: string;\r\n largura?: string;\r\n /** Clique abre a galeria em tela cheia. Não use dentro de outro alvo clicável. */\r\n ampliavel?: boolean;\r\n /** Qual foto da coleção (padrão: 0). */\r\n indice?: number;\r\n aoMudarIndice?: (indice: number) => void;\r\n aoAmpliar?: (indice: number) => void;\r\n /** Substitui o avatar padrão quando não há foto (ex.: \"Foto indisponível\"). */\r\n semFoto?: ReactNode;\r\n /** Conteúdo sobre a imagem (selo, marca d'água). */\r\n sobreposto?: ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst AVATAR = { sm: '3rem', md: '4.5rem', lg: '6rem' };\r\n\r\nconst normalizarFotos = (f: EntradaFoto): Anexo[] =>\r\n (f == null ? [] : Array.isArray(f) ? f : [f])\r\n .map((x) => (typeof x === 'string' ? { nome: '', tamanho: 0, tipo: 'image/*', url: x } : x))\r\n .filter((x): x is Anexo => !!x?.url?.trim());\r\n\r\n/**\r\n * Moldura de foto em tamanho de leitura: fundo desfocado da própria foto,\r\n * sombra e anel. Entre o `Avatar` (miniatura) e o `DialogoArquivo` (tela cheia).\r\n */\r\nexport function Foto({\r\n fotos,\r\n nome,\r\n tamanho = 'md',\r\n altura,\r\n largura,\r\n ampliavel = false,\r\n indice: indiceExterno,\r\n aoMudarIndice,\r\n aoAmpliar,\r\n semFoto,\r\n sobreposto,\r\n className,\r\n}: FotoProps) {\r\n const lista = normalizarFotos(fotos);\r\n const [indiceInterno, setIndiceInterno] = useState(0);\r\n const [aberto, setAberto] = useState(false);\r\n const indice = Math.max(0, Math.min(indiceExterno ?? indiceInterno, lista.length - 1));\r\n const mudar = (i: number) => {\r\n setIndiceInterno(i);\r\n aoMudarIndice?.(i);\r\n };\r\n const atual = lista[indice];\r\n const estilo: CSSProperties = { height: altura, width: largura };\r\n\r\n if (!atual) {\r\n return (\r\n <div className={cx('lp-foto', `lp-foto--${tamanho}`, className)} style={estilo}>\r\n {semFoto ?? <Avatar nome={nome} tom=\"escuro\" formato=\"quadrado\" tamanho={AVATAR[tamanho]} />}\r\n {sobreposto && <div className=\"lp-foto-sobreposto\">{sobreposto}</div>}\r\n </div>\r\n );\r\n }\r\n\r\n const exibida = atual.miniatura ?? atual.url!;\r\n return (\r\n <div className={cx('lp-foto', `lp-foto--${tamanho}`, className)} style={estilo}>\r\n {/* fundo: a menor versão disponível, já que vai desfocada */}\r\n <div className=\"lp-foto-fundo\" style={{ backgroundImage: `url(\"${exibida}\")` }} aria-hidden=\"true\" />\r\n <img className=\"lp-foto-img\" src={exibida} alt={nome ? `Fotografia de ${nome}` : 'Fotografia'} />\r\n {ampliavel && (\r\n <button\r\n type=\"button\"\r\n className=\"lp-foto-ampliar\"\r\n aria-label={`Ampliar fotografia${nome ? ` de ${nome}` : ''}`}\r\n onClick={() => {\r\n aoAmpliar?.(indice);\r\n setAberto(true);\r\n }}\r\n >\r\n <span className=\"lp-foto-lupa\" aria-hidden=\"true\">\r\n <Icone icone=\"zoom-in\" />\r\n </span>\r\n </button>\r\n )}\r\n {sobreposto && <div className=\"lp-foto-sobreposto\">{sobreposto}</div>}\r\n {ampliavel && (\r\n <DialogoArquivo\r\n aberto={aberto}\r\n aoFechar={() => setAberto(false)}\r\n arquivos={lista.map((a, i) => ({ ...a, nome: a.nome || `Fotografia ${lista.length > 1 ? i + 1 : ''}`.trim() }))}\r\n indice={indice}\r\n aoMudarIndice={mudar}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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"}
|