/* =============================================================================
   Portal do Servidor - camada unificada de interface
   -----------------------------------------------------------------------------
   Carregada DEPOIS de landing.css e portal.css. Antes deste arquivo o portal
   tinha duas linguagens visuais em paralelo: as telas novas usavam o sistema
   "portal-*" (verde institucional, raio 8px) e as telas antigas eram utilitarios
   Tailwind soltos com botoes indigo. Aqui ficam os tokens, os componentes
   compartilhados por todas as telas e a camada responsiva consolidada.

   Escala de breakpoints (unica em todo o portal):
     <= 480px  telefone estreito
     <= 768px  telefone grande / tablet em pe
     <= 1024px tablet deitado
     >  1024px desktop
   ========================================================================== */

:root {
    --portal-raio: 10px;
    --portal-raio-sm: 8px;
    --portal-raio-pill: 999px;

    --portal-gap: 1rem;
    --portal-gap-sm: 0.65rem;
    --portal-gap-lg: 1.5rem;

    --portal-sombra: 0 1px 2px rgba(16, 32, 51, 0.04), 0 8px 24px rgba(16, 32, 51, 0.06);
    --portal-sombra-forte: 0 2px 4px rgba(16, 32, 51, 0.06), 0 14px 34px rgba(16, 32, 51, 0.1);

    --portal-alvo-toque: 44px;

    --portal-sucesso: #147a4b;
    --portal-sucesso-fundo: #e9f8ef;
    --portal-sucesso-borda: #b7e4ca;
    --portal-atencao: #96620b;
    --portal-atencao-fundo: #fdf6e3;
    --portal-atencao-borda: #f0dda8;
    --portal-info: #185abd;
    --portal-info-fundo: #eef4ff;
    --portal-info-borda: #c3d7f7;
    --portal-erro: #b3261e;
    --portal-erro-fundo: #fdeceb;
    --portal-erro-borda: #f3c2be;
    --portal-neutro: #46586d;
    --portal-neutro-fundo: #f1f5f9;
    --portal-neutro-borda: #dbe4ec;
}

/* -----------------------------------------------------------------------------
   1. Estrutura de pagina
   -------------------------------------------------------------------------- */

.portal-app-body {
    /* Reserva a area do notch/gesture bar em telefones. */
    padding-bottom: env(safe-area-inset-bottom, 0);
}

.portal-app-frame,
.portal-standalone-page,
.portal-correction-page {
    width: min(100%, 1180px);
    margin-inline: auto;
    padding-inline: clamp(0.85rem, 3vw, 1.5rem);
}

.portal-standalone-page,
.portal-correction-page {
    padding-block: clamp(1rem, 3vw, 1.75rem) clamp(2rem, 5vw, 3rem);
}

/* Telas de conteudo (formulario, leitura) ficam mais estreitas que o painel
   inicial: linha de leitura longa demais cansa e o portal e usado no celular. */
.portal-standalone-page.is-leitura,
.portal-correction-page {
    width: min(100%, 940px);
}

.portal-app-frame {
    /* min-height antigo deixava um vazio enorme no desktop quando a tela era
       curta; o rodape compacto agora fecha a pagina. */
    min-height: 0;
    padding-block: clamp(1rem, 3vw, 1.75rem) clamp(1.5rem, 4vw, 2.5rem);
}

.portal-standalone-heading h1 {
    overflow-wrap: anywhere;
}

/* O aviso de flash usava o container de 1280px do site institucional e ficava
   desalinhado do conteudo do portal. */
.portal-flash-wrap {
    width: min(100%, 1180px);
    margin: clamp(0.85rem, 3vw, 1.5rem) auto 0;
    padding-inline: clamp(0.85rem, 3vw, 1.5rem);
}

/* -----------------------------------------------------------------------------
   2. Cabecalho e marca
   -------------------------------------------------------------------------- */

/* O nome do municipio vinha truncado com reticencias no celular
   ("Prefeitura M..."). Deixa quebrar em duas linhas. */
.portal-app-body .public-brand {
    min-height: var(--portal-alvo-toque);
}

.portal-app-body .public-brand > div {
    min-width: 0;
}

.portal-app-body .public-brand span:last-child {
    max-width: none;
    overflow: visible;
    white-space: normal;
    text-overflow: clip;
    line-height: 1.15;
}

.portal-header-actions {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    flex: 0 0 auto;
}

.portal-header-notification-button,
.portal-header-logout-button,
.portal-header-home-button {
    min-width: var(--portal-alvo-toque);
    min-height: var(--portal-alvo-toque);
}

.portal-header-home-button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    padding: 0 0.85rem;
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio-sm);
    background: #ffffff;
    color: #31465e;
    font-weight: 700;
    text-decoration: none;
}

.portal-header-home-button:hover {
    border-color: var(--portal-info);
    background: var(--portal-info-fundo);
    color: var(--portal-info);
}

/* -----------------------------------------------------------------------------
   3. Botoes e alvos de toque
   -------------------------------------------------------------------------- */

.portal-primary-action,
.portal-secondary-action,
.portal-danger-action,
.portal-back-button,
.portal-result-action,
.portal-attachment-button,
.assinatura-link-button,
.portal-tab-button {
    min-height: var(--portal-alvo-toque);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 0.6rem 1.05rem;
    border-radius: var(--portal-raio-sm);
    font-family: inherit;
    font-size: 0.92rem;
    font-weight: 700;
    line-height: 1.25;
    text-decoration: none;
    cursor: pointer;
    transition: background-color 0.16s ease, border-color 0.16s ease, color 0.16s ease;
}

.portal-primary-action {
    border: 1px solid var(--portal-sucesso);
    background: var(--portal-sucesso);
    color: #ffffff;
}

.portal-primary-action:hover {
    background: #0e5f38;
    border-color: #0e5f38;
    color: #ffffff;
}

.portal-secondary-action {
    border: 1px solid var(--portal-neutro-borda);
    background: #ffffff;
    color: var(--public-ink);
}

.portal-secondary-action:hover {
    border-color: var(--portal-info);
    background: var(--portal-info-fundo);
    color: var(--portal-info);
}

.portal-danger-action {
    border: 1px solid var(--portal-erro-borda);
    background: var(--portal-erro-fundo);
    color: var(--portal-erro);
}

.portal-danger-action:hover {
    border-color: var(--portal-erro);
    background: #fbdcd9;
    color: var(--portal-erro);
}

.portal-back-button {
    align-self: start;
    justify-content: flex-start;
    padding-inline: 0.75rem 1rem;
    border: 1px solid transparent;
    background: transparent;
    color: var(--portal-info);
}

.portal-back-button:hover {
    border-color: var(--portal-info-borda);
    background: var(--portal-info-fundo);
}

.portal-actions-row {
    display: flex;
    flex-wrap: wrap;
    gap: var(--portal-gap-sm);
}

.portal-actions-row > * {
    flex: 0 1 auto;
}

/* Um form usado so para embrulhar um botao (logout, cancelar) nao deve virar
   um item de layout proprio: senao o botao de dentro nao acompanha os irmaos. */
.portal-actions-row > form {
    display: contents;
}

/* Acessibilidade de teclado uniforme em todo o portal. */
.portal-app-body a:focus-visible,
.portal-app-body button:focus-visible,
.portal-app-body input:focus-visible,
.portal-app-body select:focus-visible,
.portal-app-body textarea:focus-visible,
.portal-app-body [tabindex]:focus-visible {
    outline: 3px solid rgba(24, 90, 189, 0.45);
    outline-offset: 2px;
}

/* -----------------------------------------------------------------------------
   4. Cartoes, blocos de leitura e formularios
   -------------------------------------------------------------------------- */

.portal-card {
    display: grid;
    gap: var(--portal-gap);
    padding: clamp(1rem, 2.6vw, 1.4rem);
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio);
    background: #ffffff;
    box-shadow: var(--portal-sombra);
}

.portal-card > h2,
.portal-card > h3 {
    margin: 0;
    color: var(--public-ink);
    font-size: 1.05rem;
    font-weight: 800;
}

.portal-card-sub {
    margin: -0.6rem 0 0;
    color: var(--public-muted);
    font-size: 0.88rem;
    line-height: 1.55;
}

/* Grade de campos e de dados: uma coluna no celular, duas a partir de 560px de
   espaco util. auto-fit evita a cascata de media queries que existia antes. */
.portal-fields,
.portal-datalist {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr));
    gap: var(--portal-gap);
}

.portal-fields.is-single,
.portal-datalist.is-single {
    grid-template-columns: minmax(0, 1fr);
}

.portal-field {
    display: grid;
    gap: 0.35rem;
    min-width: 0;
}

.portal-field > label,
.portal-field > .portal-field-label {
    color: var(--public-ink);
    font-size: 0.82rem;
    font-weight: 700;
}

.portal-field-required {
    color: var(--portal-erro);
}

.portal-field > input,
.portal-field > select,
.portal-field > textarea {
    width: 100%;
    min-width: 0;
    min-height: var(--portal-alvo-toque);
    padding: 0.6rem 0.75rem;
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio-sm);
    background: #ffffff;
    color: var(--public-ink);
    font: inherit;
    font-size: 0.95rem;
}

.portal-field > textarea {
    min-height: 110px;
    resize: vertical;
}

.portal-field > input:focus,
.portal-field > select:focus,
.portal-field > textarea:focus {
    border-color: var(--portal-info);
}

.portal-field > input[readonly],
.portal-field > input:disabled {
    background: var(--portal-neutro-fundo);
    color: #46586d;
}

.portal-field-help {
    color: var(--public-muted);
    font-size: 0.78rem;
    line-height: 1.5;
}

/* input[type=date] tem largura intrinseca maior que a coluna e vazava em telas
   de 320-390px. */
.portal-field > input[type="date"],
.portal-field > input[type="datetime-local"],
.portal-field > input[type="time"] {
    -webkit-appearance: none;
    appearance: none;
}

.portal-datalist > div {
    min-width: 0;
    padding: 0.75rem 0.85rem;
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio-sm);
    background: var(--public-soft);
}

.portal-datalist dt,
.portal-datalist .portal-datalist-term {
    margin: 0;
    color: var(--public-muted);
    font-size: 0.72rem;
    font-weight: 800;
    letter-spacing: 0.02em;
    text-transform: uppercase;
}

.portal-datalist dd,
.portal-datalist .portal-datalist-value {
    margin: 0.25rem 0 0;
    color: var(--public-ink);
    font-weight: 700;
    line-height: 1.45;
    /* Valores longos sem espaco (hash, nome de arquivo, protocolo) vazavam. */
    overflow-wrap: anywhere;
}

.portal-datalist dd.is-mono,
.portal-prose code {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.85rem;
}

.portal-prose {
    margin: 0;
    color: #43566d;
    line-height: 1.65;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

/* -----------------------------------------------------------------------------
   5. Avisos, selos e estados
   -------------------------------------------------------------------------- */

.portal-note {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    align-items: start;
    gap: 0.7rem;
    padding: 0.85rem 1rem;
    border: 1px solid var(--portal-info-borda);
    border-radius: var(--portal-raio-sm);
    background: var(--portal-info-fundo);
    color: #1d3557;
    font-size: 0.9rem;
    line-height: 1.6;
}

.portal-note > .material-symbols-outlined {
    font-size: 1.25rem;
    line-height: 1.4;
    color: var(--portal-info);
}

.portal-note strong {
    display: block;
    margin-bottom: 0.15rem;
}

.portal-note p {
    margin: 0;
}

.portal-note a {
    font-weight: 700;
    text-decoration: underline;
}

.portal-note.is-atencao {
    border-color: var(--portal-atencao-borda);
    background: var(--portal-atencao-fundo);
    color: #6b4708;
}

.portal-note.is-atencao > .material-symbols-outlined {
    color: var(--portal-atencao);
}

.portal-note.is-sucesso {
    border-color: var(--portal-sucesso-borda);
    background: var(--portal-sucesso-fundo);
    color: #0d5233;
}

.portal-note.is-sucesso > .material-symbols-outlined {
    color: var(--portal-sucesso);
}

.portal-note.is-erro {
    border-color: var(--portal-erro-borda);
    background: var(--portal-erro-fundo);
    color: #8c1d17;
}

.portal-note.is-erro > .material-symbols-outlined {
    color: var(--portal-erro);
}

.portal-note.is-neutro {
    border-color: var(--portal-neutro-borda);
    background: var(--portal-neutro-fundo);
    color: #33475e;
}

.portal-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    max-width: 100%;
    padding: 0.3rem 0.7rem;
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio-pill);
    background: var(--portal-neutro-fundo);
    color: var(--portal-neutro);
    font-size: 0.76rem;
    font-weight: 800;
    line-height: 1.35;
    text-align: left;
    overflow-wrap: anywhere;
}

.portal-badge.tom-sucesso {
    border-color: var(--portal-sucesso-borda);
    background: var(--portal-sucesso-fundo);
    color: var(--portal-sucesso);
}

.portal-badge.tom-atencao {
    border-color: var(--portal-atencao-borda);
    background: var(--portal-atencao-fundo);
    color: var(--portal-atencao);
}

.portal-badge.tom-informativo {
    border-color: var(--portal-info-borda);
    background: var(--portal-info-fundo);
    color: var(--portal-info);
}

.portal-badge.tom-erro {
    border-color: var(--portal-erro-borda);
    background: var(--portal-erro-fundo);
    color: var(--portal-erro);
}

/* -----------------------------------------------------------------------------
   6. Linha do tempo do requerimento
   -------------------------------------------------------------------------- */

.portal-timeline {
    display: grid;
    gap: 0;
    margin: 0;
    padding: 0;
    list-style: none;
}

.portal-timeline > li {
    position: relative;
    display: grid;
    grid-template-columns: 28px minmax(0, 1fr);
    align-items: start;
    gap: 0.75rem;
    padding-bottom: 1rem;
}

.portal-timeline > li:last-child {
    padding-bottom: 0;
}

/* Linha ligando os marcadores. */
.portal-timeline > li:not(:last-child)::before {
    content: "";
    position: absolute;
    top: 28px;
    left: 13px;
    width: 2px;
    height: calc(100% - 28px);
    background: var(--portal-neutro-borda);
}

.portal-timeline-marca {
    width: 28px;
    height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 2px solid var(--portal-neutro-borda);
    border-radius: 50%;
    background: #ffffff;
    color: var(--public-muted);
    font-size: 0.78rem;
    font-weight: 800;
}

.portal-timeline-marca .material-symbols-outlined {
    font-size: 1rem;
}

.portal-timeline-texto strong {
    display: block;
    color: var(--public-ink);
    font-size: 0.92rem;
}

.portal-timeline-texto small {
    display: block;
    margin-top: 0.1rem;
    color: var(--public-muted);
    font-size: 0.8rem;
    line-height: 1.5;
}

.portal-timeline > li.is-concluida .portal-timeline-marca {
    border-color: var(--portal-sucesso);
    background: var(--portal-sucesso);
    color: #ffffff;
}

.portal-timeline > li.is-concluida:not(:last-child)::before {
    background: var(--portal-sucesso-borda);
}

.portal-timeline > li.is-atual .portal-timeline-marca {
    border-color: var(--portal-info);
    background: var(--portal-info-fundo);
    color: var(--portal-info);
}

.portal-timeline > li.is-atual .portal-timeline-texto strong {
    color: var(--portal-info);
}

.portal-timeline > li.is-interrompida .portal-timeline-marca {
    border-color: var(--portal-erro);
    background: var(--portal-erro-fundo);
    color: var(--portal-erro);
}

.portal-timeline > li.is-interrompida .portal-timeline-texto strong {
    color: var(--portal-erro);
}

/* -----------------------------------------------------------------------------
   7. Lista de anexos e documentos
   -------------------------------------------------------------------------- */

.portal-file-list {
    display: grid;
    gap: 0.5rem;
    margin: 0;
    padding: 0;
    list-style: none;
}

.portal-file-item {
    min-height: var(--portal-alvo-toque);
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    align-items: center;
    gap: 0.65rem;
    padding: 0.6rem 0.8rem;
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio-sm);
    background: var(--public-soft);
    color: var(--public-ink);
    font-size: 0.88rem;
    text-decoration: none;
}

.portal-file-item:hover {
    border-color: var(--portal-info);
    background: var(--portal-info-fundo);
    color: var(--public-ink);
}

.portal-file-item .material-symbols-outlined {
    font-size: 1.2rem;
    color: var(--portal-info);
}

.portal-file-item strong {
    min-width: 0;
    font-weight: 700;
    overflow-wrap: anywhere;
}

.portal-file-item small {
    color: var(--public-muted);
    font-weight: 700;
    white-space: nowrap;
}

/* -----------------------------------------------------------------------------
   8. Cartoes de escolha (selecao de perfil gov.br)
   -------------------------------------------------------------------------- */

.portal-choice-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
    gap: var(--portal-gap);
}

.portal-choice-card {
    display: grid;
    align-content: start;
    gap: 0.6rem;
    margin: 0;
    padding: 1.1rem;
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio);
    background: #ffffff;
    box-shadow: var(--portal-sombra);
}

.portal-choice-card.is-destaque {
    border-color: var(--portal-sucesso-borda);
    background: var(--portal-sucesso-fundo);
}

.portal-choice-icon {
    width: 42px;
    height: 42px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--portal-raio-sm);
    background: var(--portal-info-fundo);
    color: var(--portal-info);
}

.portal-choice-icon.is-verde {
    background: var(--portal-sucesso-fundo);
    color: var(--portal-sucesso);
}

.portal-choice-card h2 {
    margin: 0;
    color: var(--public-ink);
    font-size: 1.02rem;
    font-weight: 800;
}

.portal-choice-card p {
    margin: 0;
    color: var(--public-muted);
    font-size: 0.87rem;
    line-height: 1.55;
    overflow-wrap: anywhere;
}

.portal-choice-card .portal-primary-action,
.portal-choice-card .portal-secondary-action {
    justify-self: start;
    margin-top: 0.25rem;
}

/* -----------------------------------------------------------------------------
   8b. Vitrine de servicos da tela de entrada
   -------------------------------------------------------------------------- */

.portal-servicos-preview {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
    gap: var(--portal-gap);
    margin: 0;
    padding: 0;
    list-style: none;
}

.portal-servicos-preview > li {
    display: grid;
    align-content: start;
    gap: 0.45rem;
    padding: 1.1rem;
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio);
    background: #ffffff;
    box-shadow: var(--portal-sombra);
}

.portal-servicos-preview strong {
    color: var(--public-ink);
    font-size: 1rem;
}

.portal-servicos-preview small {
    color: var(--public-muted);
    font-size: 0.86rem;
    line-height: 1.55;
}

/* -----------------------------------------------------------------------------
   9. Filtro de protocolos
   -------------------------------------------------------------------------- */

.portal-filter-bar {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: end;
    gap: var(--portal-gap-sm);
    padding: 0.85rem;
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio);
    background: #ffffff;
    box-shadow: var(--portal-sombra);
}

.portal-filter-bar .portal-field {
    min-width: 0;
}

.portal-filter-chips {
    grid-column: 1 / -1;
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
}

.portal-filter-chip {
    min-height: 36px;
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.3rem 0.8rem;
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio-pill);
    background: #ffffff;
    color: var(--portal-neutro);
    font: inherit;
    font-size: 0.8rem;
    font-weight: 700;
    cursor: pointer;
}

.portal-filter-chip:hover {
    border-color: var(--portal-info);
    color: var(--portal-info);
}

.portal-filter-chip[aria-pressed="true"] {
    border-color: var(--portal-sucesso);
    background: var(--portal-sucesso-fundo);
    color: var(--portal-sucesso);
}

.portal-filter-count {
    color: var(--public-muted);
    font-size: 0.82rem;
    font-weight: 700;
}

.portal-request-result[hidden],
.portal-empty-state[hidden] {
    display: none !important;
}

/* Andamento recolhido dentro do cartao do protocolo: mostra a etapa sem ocupar
   a tela toda no celular. */
.portal-result-timeline {
    border: 1px solid var(--portal-neutro-borda);
    border-radius: var(--portal-raio-sm);
    background: var(--public-soft);
}

.portal-result-timeline > summary {
    min-height: var(--portal-alvo-toque);
    display: flex;
    align-items: center;
    gap: 0.45rem;
    padding: 0.55rem 0.85rem;
    color: var(--portal-info);
    font-size: 0.85rem;
    font-weight: 700;
    cursor: pointer;
    list-style: none;
}

.portal-result-timeline > summary::-webkit-details-marker {
    display: none;
}

.portal-result-timeline > summary .material-symbols-outlined {
    font-size: 1.1rem;
}

.portal-result-timeline[open] > summary {
    border-bottom: 1px solid var(--portal-neutro-borda);
}

.portal-result-timeline > .portal-timeline {
    padding: 0.9rem 0.95rem;
}

/* -----------------------------------------------------------------------------
   10. Rodape compacto do portal
   -------------------------------------------------------------------------- */

/* portal.css escondia o rodape inteiro, deixando politica de privacidade e
   termos de uso inalcancaveis de dentro do portal. */
.portal-app-body .portal-footer {
    display: block;
    margin-top: auto;
    padding: 1.25rem clamp(0.85rem, 3vw, 1.5rem) calc(1.25rem + env(safe-area-inset-bottom, 0));
    border-top: 1px solid var(--portal-neutro-borda);
    background: #ffffff;
}

.portal-footer-inner {
    width: min(100%, 1180px);
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.65rem;
    margin-inline: auto;
    color: var(--public-muted);
    font-size: 0.8rem;
}

.portal-footer-links {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem 1rem;
}

.portal-footer-links a {
    min-height: 40px;
    display: inline-flex;
    align-items: center;
    color: var(--public-muted);
    font-weight: 700;
}

.portal-footer-links a:hover {
    color: var(--portal-info);
}

/* -----------------------------------------------------------------------------
   11. Correcoes de bugs herdados
   -------------------------------------------------------------------------- */

/* O input de arquivo e escondido visualmente, mas
   `.portal-correction-form input[type="file"] { width: 100% }` (0,2,1) vencia a
   regra de esconder (0,1,0). Resultado: um input absoluto de largura total
   empurrando a pagina de correcao para o lado em TODAS as larguras. */
.portal-attachment-input,
.portal-scan-input,
.portal-correction-form input[type="file"].portal-attachment-input {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    min-width: 0 !important;
    min-height: 0 !important;
    padding: 0 !important;
    border: 0 !important;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    opacity: 0;
    pointer-events: none;
}

/* Rede de seguranca: contem qualquer filho que escape da largura util, para o
   portal nunca arrastar para o lado no celular.
   Nao esconde regressao do teste: `test:portal-servidor-ui` mede a caixa de cada
   elemento com getBoundingClientRect, que ignora este clipping. */
.portal-app-body {
    overflow-x: hidden;
}

/* Caixas de selecao no celular tinham 13px de lado. O rotulo inteiro ja e
   clicavel; o quadrado agora tambem tem tamanho de dedo. */
.portal-app-body input[type="checkbox"],
.portal-app-body input[type="radio"] {
    width: 22px;
    height: 22px;
    flex: 0 0 auto;
    accent-color: var(--portal-sucesso);
    cursor: pointer;
}

.portal-existing-attachment-list label {
    min-height: var(--portal-alvo-toque);
    cursor: pointer;
}

/* "Anexar arquivo" e "Escanear doc" sao duas opcoes do mesmo peso, mas a
   segunda era azul solido e disputava atencao com o botao verde de enviar.
   O portal usa verde para acao principal e azul apenas para link/informacao. */
.portal-attachment-button,
.portal-attachment-button.primary {
    border: 1px solid var(--portal-neutro-borda);
    background: #ffffff;
    color: var(--public-ink);
    font-weight: 700;
}

.portal-attachment-button.primary {
    border-color: var(--portal-info-borda);
    background: var(--portal-info-fundo);
    color: var(--portal-info);
}

.portal-attachment-button:hover,
.portal-attachment-button.primary:hover {
    border-color: var(--portal-info);
    background: var(--portal-info-fundo);
    color: var(--portal-info);
}

.portal-attachment-button:disabled {
    opacity: 0.55;
    cursor: not-allowed;
}

/* Foco programatico (troca de painel) nao deve desenhar o anel de foco: ele so
   existe para o leitor de tela. O anel continua nos alvos navegaveis. */
.portal-app-body [tabindex="-1"]:focus,
.portal-app-body [tabindex="-1"]:focus-visible {
    outline: none;
}

/* "Documento final ainda nao disponivel" era renderizado com cara de botao e
   parecia clicavel. E so um aviso. */
.portal-result-actions > .portal-result-unavailable {
    border: 0;
    background: transparent;
    color: var(--public-muted);
    font-size: 0.84rem;
    font-weight: 600;
    padding-inline: 0.25rem;
}

/* Valores longos vindos do banco (e-mail, tipo, status, hash) precisam quebrar.
   Um e-mail institucional sozinho empurrava o cartao de perfil para fora da
   tela a 320px. */
.portal-result-grid dd,
.portal-profile-card dd,
.portal-profile-card dt,
.portal-request-result h3,
.portal-protocol,
.assinatura-card-hash {
    min-width: 0;
    overflow-wrap: anywhere;
}

.portal-profile-card dl div,
.portal-profile-card .portal-profile-main {
    min-width: 0;
}

/* -----------------------------------------------------------------------------
   12. Camada responsiva consolidada
   -------------------------------------------------------------------------- */

/* Estes dois vinham de um @media (max-width: 1024px) declarado no meio do
   portal.css, que outras regras-base declaradas depois sobrescreviam em parte.
   O comportamento agora esta declarado de uma vez so, aqui.

   Mudanca proposital: o limite antigo era 1024px, o que jogava o formulario de
   consulta e os dados do perfil para uma unica coluna ja no tablet deitado,
   desperdicando metade da largura. */
@media (max-width: 768px) {
    .portal-profile-card dl {
        grid-template-columns: minmax(0, 1fr);
    }

    /* As tres colunas tem minimos fixos (190px + 220px + botao) e estouravam
       entre 620px e 768px, onde nenhuma regra antiga pegava. */
    .portal-consult-form {
        grid-template-columns: minmax(0, 1fr);
    }
}

@media (min-width: 1100px) {
    /* O painel inicial ficava em 2 colunas ate 1440px, sobrando metade da tela
       vazia. Em desktop largo cabe a terceira coluna. */
    .portal-overview-grid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (max-width: 768px) {
    .portal-filter-bar {
        grid-template-columns: minmax(0, 1fr);
    }

    .portal-actions-row > .portal-primary-action,
    .portal-actions-row > .portal-secondary-action,
    .portal-actions-row > .portal-danger-action {
        flex: 1 1 100%;
    }

    .portal-choice-card .portal-primary-action,
    .portal-choice-card .portal-secondary-action {
        justify-self: stretch;
        width: 100%;
    }
}

@media (max-width: 620px) {
    /* Em telefone estreito o cabecalho tem tres botoes disputando espaco com o
       nome do municipio. O botao de inicio vira so icone, como o de sair. */
    .portal-header-home-button {
        width: var(--portal-alvo-toque);
        padding: 0;
    }

    .portal-header-home-label {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip: rect(0 0 0 0);
        white-space: nowrap;
    }

    .portal-app-body .public-brand span:last-child {
        font-size: 0.8rem;
    }
}

@media (max-width: 480px) {
    .portal-fields,
    .portal-datalist,
    .portal-choice-grid {
        grid-template-columns: minmax(0, 1fr);
    }

    .portal-file-item {
        grid-template-columns: auto minmax(0, 1fr);
    }

    .portal-file-item small {
        grid-column: 2;
    }

    .portal-footer-inner {
        justify-content: center;
        text-align: center;
    }
}

/* Respeita quem desliga animacoes no sistema. */
@media (prefers-reduced-motion: reduce) {
    .portal-app-body *,
    .portal-app-body *::before,
    .portal-app-body *::after {
        animation-duration: 0.001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.001ms !important;
        scroll-behavior: auto !important;
    }
}
