.ips-header { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-4); margin-bottom: var(--space-5); flex-wrap: wrap; } .ips-header h2 { font-size: 1.05rem; font-weight: 700; } .ips-header-actions { display: flex; gap: var(--space-3); } .ips-subtitle { font-size: 0.85rem; color: var(--text-muted); margin-top: 2px; } .ips-empty { text-align: center; color: var(--text-muted); font-size: 0.9rem; padding: var(--space-6); border: 1px dashed var(--border-subtle); border-radius: var(--radius-md); } /* Ordenação por coluna no histórico (#ips-list-table) — mesma linguagem visual do ícone ↕ estático de ramais-lookup.js, só que com classes próprias (esta página não carrega ramais-lookup.css). */ #ips-list-table th[data-sort] { cursor: pointer; user-select: none; white-space: nowrap; } .ips-sort-icon { color: var(--text-muted); font-size: 0.75rem; } #ips-list-table th[data-sort].is-sort-asc .ips-sort-icon, #ips-list-table th[data-sort].is-sort-desc .ips-sort-icon { color: var(--accent); } /* Paginação do histórico — só Anterior/Próxima + "Página X de Y", sem numeração de páginas (lista tende a ser curta; um seletor de tamanho de página, como em ramais-lookup.js, seria demais pra esse caso). */ .ips-list-pagination { display: flex; align-items: center; justify-content: center; gap: var(--space-3); margin-top: var(--space-4); } .ips-list-pagination__info { font-size: 0.85rem; color: var(--text-muted); } /* Quantidade de registros do histórico, abaixo da paginação. */ .ips-list-count { text-align: center; font-size: 0.8rem; color: var(--text-muted); margin-top: var(--space-2); } /* Coluna de checkbox de seleção (primeira do #ips-list-table). */ .ips-select-col { width: 36px; text-align: center; } /* Barra de exclusão em lote — só aparece com pelo menos 1 linha selecionada (ver updateBulkActionsUI em importacao-plano-saude.js). */ .ips-list-bulk-actions { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); margin-bottom: var(--space-3); padding: var(--space-3) var(--space-4); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); background: var(--bg-surface); } .ips-list-bulk-actions span { font-size: 0.85rem; color: var(--text-secondary); } /* Formulário de nova importação */ .ips-form { background: var(--bg-surface); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: var(--space-5); max-width: 640px; margin: 0 auto; } .ips-upload-box { border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: var(--space-3); margin-bottom: var(--space-3); } .ips-upload-box:last-child { margin-bottom: 0; } .ips-upload-box__title { font-size: 0.85rem; font-weight: 600; color: var(--text-primary); } .ips-upload-box__hint { font-size: 0.78rem; color: var(--text-muted); margin-top: 2px; margin-bottom: var(--space-3); } .ips-file-field { position: relative; display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; } .ips-file-field__btn { display: inline-flex; align-items: center; gap: var(--space-2); cursor: pointer; flex-shrink: 0; } .ips-file-field__input { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .ips-file-field__input:focus-visible + .ips-file-field__name { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm); } .ips-file-field__name { font-size: 0.85rem; color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 260px; } .ips-file-field__remove { flex-shrink: 0; } /* Resultado da pré-validação (endpoint /validar-arquivo/), abaixo do campo de upload — some enquanto não há arquivo anexado ou enquanto a validação está em andamento. */ .ips-file-field__status { font-size: 0.8rem; margin-top: var(--space-2); margin-bottom: 0; } .ips-file-field__status--pendente { color: var(--text-muted); } .ips-file-field__status--ok { color: #2f9e6e; } .ips-file-field__status--erro { color: var(--danger); } /* "Tipo de importação" fica visualmente bem separado do quadro "2. Arquivo da operadora" logo acima — sem esse respiro extra, os dois blocos ficavam colados o bastante pra confundir onde termina um e começa o outro. */ .ips-tipo-field { margin-top: var(--space-7); } /* Regra de custeio salva — fica no início do modal, antes até de "Operadora" (decisão explícita do usuário: aplicar uma regra já preenche a operadora junto, então escolher a regra é o primeiro passo natural do fluxo, não um apêndice no final). Por vir antes de tudo, a borda de separação fica embaixo (não em cima), pra separar do campo "Operadora" logo abaixo. */ .ips-regra-field { margin-bottom: var(--space-5); padding-bottom: var(--space-5); border-bottom: 1px solid var(--border-subtle); } .ips-regra-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; } .ips-regra-actions button, .ips-regra-actions label { display: inline-flex; align-items: center; gap: var(--space-2); } .ips-regra-actions__hint { font-size: 0.78rem; color: var(--text-muted); margin: 0; } /* Combobox pesquisável de "Regra de custeio salva" — o já herda o estilo padrão de .modal-field input (components.css); aqui só cuida do posicionamento (ocupa o espaço do antigo da tabela durante o arraste troca o cursor pra texto e pode selecionar conteúdo. */ body.is-resizing-column, body.is-resizing-column * { cursor: col-resize !important; user-select: none; } /* Clicar no cabeçalho ordena a tabela por aquela coluna (alterna asc/desc) — mesmo ícone ↕ estático de #ips-list-table (ver th[data-sort] mais acima), só que aqui aplicado a qualquer .ips-col-sortable. As colunas em si têm ordem fixa (não são mais arrastáveis) — só as linhas são reordenáveis, por ordenação. */ .ips-col-sortable { cursor: pointer; user-select: none; } .ips-col-sortable.is-sort-asc .ips-sort-icon, .ips-col-sortable.is-sort-desc .ips-sort-icon { color: var(--accent); } /* Coluna de ações fixa na primeira posição — fica visível mesmo rolando a tabela pra ver as colunas mais à direita (ex.: Descrição). */ .pa-table th.ips-table-actions, .pa-table td.ips-table-actions { position: sticky; left: 0; z-index: 1; text-align: center; } .pa-table td.ips-table-actions { background: var(--bg-surface); } .pa-table th.ips-table-actions { background: var(--bg-surface-raised); } .ips-remove-linha { width: 28px; height: 28px; } .ips-remove-linha:hover { color: var(--danger); } .ips-add-row { margin-top: var(--space-3); } .ips-add-row button { display: inline-flex; align-items: center; gap: var(--space-2); } .ips-auditoria-motivo { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: var(--radius-pill); font-size: 0.72rem; font-weight: 700; color: var(--danger); background: rgba(var(--danger-rgb), 0.14); white-space: nowrap; } /* Coluna "Ação" da aba Auditoria: botão pra vincular manualmente (motivos de leitura/grafia de nome) ou o selo de já resolvido — mesmo verde de .status-pill--ativo (perfis-acesso.css), pra reaproveitar a mesma linguagem visual de "confirmado/ativo" já usada no resto do portal. */ .ips-auditoria-resolvido { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: var(--radius-pill); font-size: 0.72rem; font-weight: 700; color: #2f9e6e; background: rgba(47, 158, 110, 0.14); white-space: normal; } .ips-empty-cell { color: var(--text-muted); } .ips-vincular-resumo { font-size: 0.85rem; color: var(--text-secondary); margin-bottom: var(--space-3); }