/* =====================================================================
   GEOBIOS — Portal do Cliente no design system (ciclo 2, FASE 01, V12/V13)
   Carregado depois de styles.css e design-tokens.css, só no portal.html.
   Mesmos tokens (--ds-*), ícones SVG e padrões de abas da ADMIN; cabeçalho compacto;
   abas roláveis com indicação de "há mais"; piso de leitura de 12 px.
   ===================================================================== */
.portal-body{background:var(--ds-bg);color:var(--ds-ink);-webkit-font-smoothing:antialiased}
.ds-icon-sprite{position:absolute;width:0;height:0;overflow:hidden}
.portal-shell .ds-icon{width:20px;height:20px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.portal-shell :focus-visible{outline:none;box-shadow:var(--ds-focus)}

/* Cabeçalho compacto e fixo: marca | navegação | ações */
.portal-header-pro{position:sticky;top:0;z-index:30;min-height:64px;padding:10px 24px;gap:12px 18px;display:flex;align-items:center;flex-wrap:nowrap;background:linear-gradient(180deg,var(--ds-brand-800),var(--ds-brand-900));color:#fff;box-shadow:0 1px 0 rgba(255,255,255,.04),var(--ds-shadow-sm)}
.portal-header-pro .brand{flex:0 0 auto}
.portal-header-pro .brand-mark{width:36px;height:36px;border-radius:10px}
.portal-header-pro .brand strong{letter-spacing:.12em;font-size:14px}
.portal-header-pro .brand span{font-size:12px;color:#9fc4bc}
.portal-nav{flex:1 1 auto;min-width:0;overflow-x:auto;scrollbar-width:none;gap:2px}
.portal-nav::-webkit-scrollbar{display:none}
.portal-nav-link{flex:0 0 auto;white-space:nowrap;min-height:40px;padding:8px 12px;border-radius:9px;color:#c3d9d4;font-size:14px!important;font-weight:600}
.portal-nav-link.active{color:#fff;background:rgba(54,170,150,.24);box-shadow:inset 0 -2px 0 #5fd1b8}
.portal-header-actions{flex:0 0 auto;gap:8px}
.portal-header-pro .secondary{display:inline-flex;align-items:center;gap:6px;min-height:40px;padding:6px 12px;border-radius:10px;font-size:14px}
.portal-header-pro #portalNotificationsBadge{min-width:20px;padding:0 6px;border-radius:999px;background:var(--ds-accent);color:#1d1a10;font-size:12px;font-weight:700;line-height:20px;text-align:center}
.portal-text-controls button{min-width:36px;min-height:36px}
.portal-user-badge>span{width:36px;height:36px;font-size:13px}

/* Faixas roláveis (navegação e abas do imóvel): sombra indica que há mais itens. */
.ds-scroll-tabs{position:relative;-webkit-overflow-scrolling:touch;scroll-snap-type:x proximity}
.ds-scroll-tabs>button{scroll-snap-align:start}
.ds-scroll-tabs.can-scroll-right{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 40px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 40px),transparent)}
.ds-scroll-tabs.can-scroll-left{-webkit-mask-image:linear-gradient(90deg,transparent,#000 40px);mask-image:linear-gradient(90deg,transparent,#000 40px)}
.ds-scroll-tabs.can-scroll-left.can-scroll-right{-webkit-mask-image:linear-gradient(90deg,transparent,#000 40px,#000 calc(100% - 40px),transparent);mask-image:linear-gradient(90deg,transparent,#000 40px,#000 calc(100% - 40px),transparent)}

/* Abas do imóvel no padrão da ADMIN: uma linha, rolável no celular. */
.portal-tabs{display:flex;gap:4px;overflow-x:auto;scrollbar-width:thin;padding:4px;border:1px solid var(--ds-line);border-radius:var(--ds-radius);background:var(--ds-surface)}
.portal-tabs button{flex:0 0 auto;white-space:nowrap;min-height:40px;padding:8px 14px;border-radius:9px;color:var(--ds-ink-2);font-size:14px;font-weight:600}
.portal-tabs button.active{background:var(--ds-brand-50);color:var(--ds-brand-700);box-shadow:inset 0 0 0 1px var(--ds-brand-500)}
.portal-tabs button:last-child{grid-column:auto}

/* Indicadores com ícones SVG do design system */
.portal-kpi-card{border-color:var(--ds-line);border-radius:var(--ds-radius-lg);box-shadow:var(--ds-shadow-xs)}
.portal-kpi-card>span{background:var(--ds-brand-50);color:var(--ds-brand-600)}
.portal-kpi-card.warning>span{background:var(--ds-warning-bg);color:var(--ds-warning)}
.portal-kpi-card small{font-size:13px;color:var(--ds-ink-2)}
.portal-kpi-card em{font-size:12px!important;color:var(--ds-subtle)}
.portal-kpi-card.warning em{color:var(--ds-warning)}

/* Piso de leitura (vários blocos antigos usavam 7–10 px). */
.portal-shell :is(.portal-plan-card p,.portal-plan-card li,.portal-plan-card a,.portal-plan-card button,.portal-plan-card em,.portal-property-ids,.portal-property-location,.portal-card-status){font-size:max(12px,1em)}
.portal-shell .section-label{font-size:12px;letter-spacing:.12em}

@media(max-width:900px){
  .portal-header-pro{flex-wrap:wrap;padding:8px 14px 6px;gap:6px 10px}
  .portal-nav{order:3;flex:1 1 100%}
  .portal-header-actions{margin-left:auto;flex-wrap:nowrap}
  .portal-text-controls{padding:2px}
  .portal-text-controls button{min-width:40px;min-height:40px;padding:0 4px}
  .portal-shell :is(button,select,a.button){min-height:40px}
  .portal-forgot-link{min-height:40px}
  .portal-btn-text{display:none}
  .portal-header-pro .secondary{padding:6px 10px;min-width:40px;justify-content:center}
  .portal-user-badge>div{display:none}
}
@media(max-width:640px){
  .portal-kpi-row{grid-template-columns:1fr 1fr}
  .portal-welcome{padding:20px}
}

/* Piso de leitura medido no navegador (FASE 00: 7–10 px): rótulos/selos ≥ 12 px, texto ≥ 13 px.
   Respeita o controle A−/A/A+ (variáveis --portal-font-*). */
.portal-shell :is(.portal-welcome-kicker,.portal-property-client-badge,.portal-property-tags span,.portal-available-services-head span,.portal-focus-code,.portal-focus-meta span,.portal-contract-status,.portal-contract-meta span,.portal-contract-payment-label,.portal-service-status,.portal-alert-dot,.delivery-secure-badge,.monitor-rural-kicker,.monitor-price-badge,.portal-contract-finance,.portal-contract-step-dot,.portal-request-status,.portal-card-status,.portal-doc-release,.delivery-version){font-size:max(12px,var(--portal-font-xs,12px))!important}
.portal-main :is(p,li,.portal-quick-grid a,.monitor-secondary,.monitor-rural-features span,.monitor-rural-price-card span,.portal-document-request-upload button,.portal-positive b){font-size:max(13px,var(--portal-font-sm,13px))!important}
.portal-main :is(span,b,em):not([class]){font-size:max(12px,1em)}
.portal-property-ids,.portal-focus-meta{overflow-wrap:anywhere}
/* Botão de notificações: texto normal; só o contador é selo. */
.notification-trigger .portal-btn-text{min-width:0;height:auto;display:inline;background:none;color:inherit;font-size:14px;font-weight:600;padding:0;border-radius:0}
/* Cabeçalhos de bloco com contador: o contador quebra linha em vez de sair da tela (390 px). */
.portal-main :is(.portal-card-head,.portal-doc-category-head,.portal-repository-head):has(.portal-doc-count){flex-wrap:wrap;gap:8px}

/* Ajuda e dúvidas do cliente (06/11/2026). */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.portal-main.portal-help-mode>:not(#portalHelpView){display:none!important}
.portal-help{display:grid;gap:18px}
.portal-help.hidden{display:none}
.portal-help-hero{display:grid;grid-template-columns:minmax(0,1fr) minmax(240px,360px);gap:8px 24px;align-items:end;padding:24px;border-radius:20px;color:#fff;background:linear-gradient(135deg,var(--ds-brand-800),var(--ds-brand-600))}
.portal-help-hero .section-label{color:#bfe6dc}
.portal-help-hero h2{margin:4px 0 6px;font-size:clamp(22px,2.4vw,30px);color:#fff}
.portal-help-hero p{margin:0;color:#e2f2ee;line-height:1.5}
.portal-help-search input{width:100%;min-height:46px;border-radius:999px;border:1px solid rgba(255,255,255,.4);background:#fff;color:var(--ds-ink);padding:10px 18px;font:inherit}
.portal-help-count{grid-column:2;color:#e2f2ee;min-height:16px}
.portal-help-steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.portal-help-steps article{display:flex;gap:12px;padding:16px;border:1px solid var(--ds-line);border-radius:16px;background:#fff;box-shadow:var(--ds-shadow-xs)}
.portal-help-steps article>b{flex:0 0 32px;height:32px;border-radius:50%;display:grid;place-items:center;background:var(--ds-brand-100);color:var(--ds-brand-700);font-weight:800}
.portal-help-steps h3{margin:2px 0 4px;font-size:16px}
.portal-help-steps p{margin:0;color:var(--ds-ink-2);font-size:14px;line-height:1.45}
.portal-help-faq,.portal-help-glossary{padding:20px;border:1px solid var(--ds-line);border-radius:18px;background:#fff}
.portal-help-faq>h3,.portal-help-glossary>h3{margin:0 0 12px;font-size:20px}
.portal-help-group{margin-top:14px}
.portal-help-group.hidden{display:none}
.portal-help-group h4{margin:0 0 6px;font-size:13px;letter-spacing:.08em;text-transform:uppercase;color:var(--ds-brand-600)}
.portal-help details{border-top:1px solid var(--ds-line)}
.portal-help details.hidden,.portal-help-glossary div.hidden{display:none}
.portal-help summary{cursor:pointer;list-style:none;padding:13px 32px 13px 2px;font-weight:650;color:var(--ds-ink);position:relative;min-height:44px}
.portal-help summary::-webkit-details-marker{display:none}
.portal-help summary::after{content:"+";position:absolute;right:6px;top:10px;font-size:20px;color:var(--ds-brand-600)}
.portal-help details[open] summary::after{content:"−"}
.portal-help details p{margin:0 0 14px;color:var(--ds-ink-2);line-height:1.55}
.portal-help-empty{margin:16px 0 0;color:var(--ds-muted)}
.portal-help-empty.hidden{display:none}
.portal-help-glossary dl{margin:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:10px}
.portal-help-glossary dl>div{padding:12px 14px;border-radius:12px;background:var(--ds-surface-2);border:1px solid var(--ds-line)}
.portal-help-glossary dt{font-weight:750;color:var(--ds-ink)}
.portal-help-glossary dd{margin:4px 0 0;color:var(--ds-ink-2);line-height:1.45;font-size:14px}
.portal-help-contact{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px;border-radius:18px;background:var(--ds-brand-50);border:1px solid var(--ds-brand-100)}
.portal-help-contact h3{margin:0 0 4px}
.portal-help-contact p{margin:0;color:var(--ds-ink-2)}
.portal-help-contact a.primary{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:0 20px;border-radius:12px;background:var(--ds-brand-700);color:#fff;font-weight:700;text-decoration:none;white-space:nowrap}
.portal-login-help{display:block;margin-top:10px;text-align:center;font-size:13px;color:var(--ds-brand-700);font-weight:600}
@media(max-width:900px){.portal-help-steps{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:640px){
  .portal-help-hero{grid-template-columns:1fr;padding:18px}
  .portal-help-count{grid-column:1}
  .portal-help-steps{grid-template-columns:1fr}
  .portal-help-faq,.portal-help-glossary{padding:16px}
  .portal-help-contact{flex-direction:column;align-items:stretch}
}

/* Revisão visual do Portal (06/11/2026): só apresentação. */
/* Imóvel aberto: a saudação e os indicadores da carteira saem da frente (no celular ocupavam ~650 px
   antes do imóvel). Voltam ao retornar para "Meus imóveis". */
.portal-main:has(#portalPropertyView:not(.hidden))>:is(.portal-welcome,#portalKpis){display:none}
/* Piso de leitura de 12 px também no modal de contratação e nas sugestões. */
#portalContractModal :is(small,.section-label,span,label){font-size:max(12px,var(--portal-font-xs,12px))!important}
#portalContractModal :is(p,label span){font-size:max(13px,var(--portal-font-sm,13px));line-height:1.5}
#portalContractModal b{font-size:max(14px,1em)!important}
#portalContractModal input[type=checkbox]{width:20px;height:20px;flex:0 0 auto}
.portal-recommendation-kicker{font-size:12px}
/* Etapa atual do contrato com contraste AA. */
.portal-contract-step.current .portal-contract-step-dot{color:#8f5208}
/* Contador "N solicitações/documentos" não vira círculo quando o espaço aperta. */
.portal-doc-count{white-space:nowrap;flex:0 0 auto}
/* Alvos de toque de 40 px no celular. */
#closePortalNotifications,#closePortalContractModal{min-width:40px;min-height:40px}
.portal-login-help{padding:10px 0;min-height:40px}
/* O contador não estica até a altura do cabeçalho (virava um círculo grande). */
.portal-doc-count{align-self:flex-start}
/* Mensagem de vazio das listas curtas ocupa a linha (antes caía na coluna de 30 px do ícone). */
.portal-mini-list>.empty-data{display:block}
/* Seções abertas pelo menu não ficam escondidas sob o cabeçalho fixo. */
#portalPlans,#portalPropertiesView,#portalHelpView{scroll-margin-top:96px}
@media(max-width:640px){
  #portalPlans,#portalPropertiesView,#portalHelpView{scroll-margin-top:164px}
  /* Celular: saudação e indicadores mais compactos para "Meus imóveis" aparecer mais cedo. */
  .portal-welcome,.portal-welcome-overlay{min-height:0}
  .portal-welcome-overlay{padding:18px 18px}
  .portal-welcome h1{font-size:26px}
  .portal-welcome p{display:none}
  .portal-kpi-row{gap:8px}
  .portal-kpi-card{min-height:0;padding:10px 12px}
  .portal-kpi-card em{display:none}
  .portal-kpi-row>.portal-kpi-card:last-child:nth-child(odd){grid-column:1/-1}
}

/* PD2: miniatura do imóvel com a imagem de capa (antes era um quadro verde vazio com "GEOBIOS"). */
.portal-property-thumb,.portal-property-image{background:linear-gradient(160deg,rgba(10,43,39,.10),rgba(10,43,39,.45)),url("/assets/geobios-cover-premium.jpg") center/cover no-repeat}
.portal-property-thumb:after{content:none}
.portal-property-image-fallback{color:rgba(255,255,255,.85);font-size:40px;text-shadow:0 2px 10px rgba(0,0,0,.25)}
/* PD3: botão próprio para escolher o arquivo, com o nome do arquivo escolhido. */
.portal-file-pick{position:relative;display:flex;align-items:center;gap:10px;flex:1 1 260px;min-width:0;cursor:pointer}
.portal-file-pick input[type=file]{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}
.portal-file-button{flex:0 0 auto;display:inline-flex;align-items:center;min-height:40px;padding:0 14px;border-radius:10px;border:1px solid var(--ds-brand-600);color:var(--ds-brand-700);background:#fff;font-weight:650;font-size:14px}
.portal-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ds-muted);font-size:13px}
.portal-file-pick:focus-within .portal-file-button{box-shadow:var(--ds-focus)}
.portal-file-pick:hover .portal-file-button{background:var(--ds-brand-50)}
/* PD4: atalho da Ajuda na saudação no lugar da frase de efeito. */
.portal-welcome-help{cursor:pointer;text-align:left;font:inherit;color:inherit}
.portal-welcome-help:hover{background:rgba(255,255,255,.16)}
.portal-welcome-help>span{font-weight:800}
/* PD1: cabeçalho do celular em duas linhas (marca + ações; menu). */
.portal-text-toggle{display:none!important}
@media(max-width:640px){
  .portal-text-toggle{display:inline-flex!important;font-weight:800}
  .portal-header-pro .portal-text-controls{display:none;position:absolute;top:calc(100% - 4px);right:12px;z-index:40;padding:6px;border-radius:12px;background:var(--ds-brand-800);box-shadow:var(--ds-shadow-lg)}
  .portal-header-pro .portal-text-controls.open{display:flex!important}
  .portal-header-pro .notification-trigger .portal-btn-text{display:none}
  .portal-header-pro{flex-wrap:wrap;row-gap:4px}
  .portal-header-pro .brand span{display:none}
}
@media(max-width:640px){.portal-file-name{white-space:normal;overflow-wrap:anywhere}}

/* Revisão visual 2 do Portal (07/11/2026, pedido do proprietário): só apresentação. */
/* Cartão do imóvel: a capa já é imagem; a letra "G" de reserva ficava por cima dela. */
.portal-property-image-fallback{display:none}
/* CAR longo numa linha, com o texto inteiro no title. */
.portal-property-card .portal-property-ids{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.portal-property-card .portal-property-card-top small{display:block}
/* Ações rápidas: o link "Falar com a equipe" tinha fonte menor que os botões vizinhos. */
.portal-main .portal-quick-grid :is(button,a){font-size:14px!important;display:flex;align-items:center;justify-content:center}
/* Ícone do serviço: anel desenhado em CSS (o glifo anterior aparecia como "-"). */
.portal-service-icon:before{content:"";width:12px;height:12px;border-radius:50%;border:3px solid currentColor;border-right-color:transparent}
/* Repositório: o número em destaque e o rótulo discreto (estava invertido). */
.portal-main .delivery-summary span{font-size:12px;text-transform:none;letter-spacing:0}
.portal-main .delivery-summary b{font-size:24px;line-height:1.1}

/* PD5–PD8 (07/11/2026, pedido do proprietário): só apresentação. */
/* PD5: o Monitor Rural aparece uma vez só, na página Planos (ver "Menu com página própria" abaixo). */
/* PD8: "Não ativo" em texto, menor que os números dos outros cartões. */
.portal-main #kpiNextUpdate.portal-kpi-text{font-size:18px!important;line-height:1.3}

/* Menu com página própria por item (pedido do proprietário, 07/11/2026): cada página mostra só o seu conteúdo. */
.portal-main:not([data-portal-view="plans"])>:is(#portalPlans,#portalRecommendationsSection){display:none}
.portal-main[data-portal-view="plans"]>:not(#portalPlans):not(#portalRecommendationsSection){display:none!important}
.portal-main:is([data-portal-view="properties"],[data-portal-view="documents"])>:is(.portal-welcome,#portalKpis){display:none}
.portal-main #portalMonitorOffer{display:none}
.portal-main[data-portal-view="documents"]>#portalPlansCta,.portal-main[data-portal-view="properties"]:has(#portalPropertyView.hidden)>#portalPlansCta{display:none}
.portal-main[data-portal-view="plans"]>#portalPlans{margin-top:0}
.portal-main[data-portal-view="plans"]>#portalRecommendationsSection{margin-top:18px}
/* Atalho compacto para Planos (Início e página do imóvel), no lugar dos blocos de venda. */
.portal-plans-cta{display:flex;align-items:center;justify-content:space-between;gap:18px;margin-top:18px;padding:18px 22px;border:1px solid #cfe6df;border-radius:18px;background:linear-gradient(120deg,#f2faf7,#ffffff)}
.portal-plans-cta h3{margin:4px 0 4px;font-size:18px;color:#123a33}
.portal-plans-cta p{margin:0;color:#4f6661}
.portal-plans-cta button{flex:0 0 auto;min-height:44px;padding:0 22px;border-radius:12px;font-weight:800}
@media(max-width:600px){.portal-plans-cta{flex-direction:column;align-items:stretch}}
/* Página Planos: cabeçalho com o seletor de imóvel. */
.portal-plans-head{display:flex;align-items:flex-end;justify-content:space-between;gap:18px;flex-wrap:wrap}
.portal-plans-head h2{font-size:26px}
.portal-plans-property{display:grid;gap:6px;min-width:260px;font-weight:700;color:#315a51}
.portal-plans-property span{font-size:12px;letter-spacing:.06em;text-transform:uppercase}
.portal-plans-property select{min-height:44px;border:1px solid #cfe0db;border-radius:12px;padding:0 12px;background:#fff;font:inherit;color:#123a33}
@media(max-width:600px){.portal-plans-property{min-width:0;width:100%}}
/* Documentos: só o que é documento (plano e situação financeira ficam na página do imóvel). */
.portal-main[data-portal-view="documents"] #portalContractSummary{display:none!important}
/* Ícone do serviço: anel completo com ponto central (o anel aberto lembrava a letra "C"). */
.portal-service-icon:before{border-right-color:currentColor;box-shadow:inset 0 0 0 2px #e4f7f1,inset 0 0 0 6px currentColor}

/* =====================================================================
   Portal premium (UX P7, 08/11/2026): só apresentação. Verde-escuro da marca com o dourado
   GEOBIOS (--ds-accent) como acento; a hierarquia vem de divisórias e peso, não de cor.
   Respeita o controle A−/A/A+: tamanhos de texto seguem as variáveis --portal-font-*.
   ===================================================================== */
#portalLogin{background:linear-gradient(135deg,rgba(10,43,39,.94),rgba(13,54,49,.82)),url("/assets/geobios-cover-premium.jpg") center/cover no-repeat}
#portalLogin .login-card{border-top:3px solid var(--ds-accent)}
#portalLogin .login-mark,.portal-header-pro .brand-mark{background:var(--ds-accent);color:var(--ds-brand-900)}
#portalLogin input{border-color:var(--ds-line-strong)}
#portalLogin input:focus{border-color:var(--ds-brand-500);box-shadow:var(--ds-focus)}
#portalLogin .portal-forgot-link{display:inline-flex;align-items:center;min-height:40px;font-size:14px}

.portal-nav-link{transition:background .15s var(--ds-ease),color .15s var(--ds-ease)}
.portal-nav-link:hover:not(.active){color:#fff;background:rgba(255,255,255,.07)}
.portal-nav-link.active{background:rgba(201,169,106,.16);box-shadow:inset 0 -2px 0 var(--ds-accent)}
.portal-welcome-kicker{color:#e8d6ac}
.portal-welcome-message>span{background:var(--ds-accent);color:var(--ds-brand-900)}
.portal-plan-monitor>em{background:var(--ds-accent);color:var(--ds-brand-900)}
.portal-property-card.featured{border-color:var(--ds-accent)}

/* Painéis: mesma borda, sombra e cabeçalho com divisória. */
.portal-main :is(.portal-dashboard-card,.portal-repository-panel,.portal-property-focus){border-color:var(--ds-line);border-radius:var(--ds-radius-lg);box-shadow:var(--ds-shadow-xs)}
.portal-main .portal-dashboard-card{padding:20px}
.portal-main .portal-card-head{align-items:flex-start;flex-wrap:wrap;gap:8px 12px;padding-bottom:12px;margin-bottom:14px;border-bottom:1px solid var(--ds-line)}
.portal-main .portal-card-head>div:first-child{flex:1 1 240px;min-width:0}

/* Visão geral: "Próxima ação" e a conclusão técnica vêm primeiro (o espaço vazio ao lado dos serviços some). */
.portal-dashboard-grid:has(>.portal-dashboard-stack){grid-template-columns:minmax(0,1fr)}
.portal-dashboard-stack{order:-1}
.portal-dashboard-stack>article:first-child{border-left:3px solid var(--ds-accent)}
@media(min-width:901px){.portal-dashboard-stack{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}
/* Plano e situação financeira ocupam a largura (a terceira coluna ficava vazia). */
@media(min-width:651px){#portalContractSummary{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr)}}
/* Celular: a linha do processo não tem ícone, então a primeira coluna de 36 px espremia o título. */
@media(max-width:650px){
  .portal-main .portal-process-row{grid-template-columns:minmax(0,1fr)}
  .portal-main .portal-process-row>*{grid-column:1}
}

/* Repositório: número limpo, sem o círculo decorativo. */
.portal-main .delivery-summary>div{background:var(--ds-surface-2)}
.portal-main .delivery-summary>div:after{content:none}

/* Formulários do Portal: mesma borda e foco visível. */
.portal-shell :is(input:not([type=checkbox]):not([type=radio]):not([type=file]),select){border:1px solid var(--ds-line-strong);border-radius:10px;background:var(--ds-surface)}
.portal-shell :is(input:not([type=checkbox]):not([type=radio]):not([type=file]),select):hover,
.portal-shell :is(input:not([type=checkbox]):not([type=radio]):not([type=file]),select):focus-visible{border-color:var(--ds-brand-500)}
.portal-document-toolbar{background:var(--ds-surface-2);border-color:var(--ds-line)}

/* Gratuito × pago: a tela só informa, quem protege o conteúdo é o servidor. */
.portal-access-tag{display:inline-flex;align-items:center;gap:5px;min-height:24px;padding:2px 10px;border-radius:999px;border:1px solid transparent;font-size:12px;font-weight:750;line-height:1.3;white-space:nowrap;flex:0 0 auto}
.portal-access-tag[hidden]{display:none}
.portal-access-tag .ds-icon{width:13px;height:13px}
.portal-access-tag[data-access-tag="free"],.portal-access-tag[data-access="free"]{background:var(--ds-success-bg);border-color:#bfe3cd;color:#14603a}
.portal-access-tag[data-access-tag="paid"],.portal-access-tag[data-access="paid"],.portal-access-tag[data-access-tag="mixed"]{background:#fff4dc;border-color:#ecd9ae;color:#7a5209}
.portal-access-tag.is-released{background:var(--ds-brand-50);border-color:var(--ds-brand-100);color:var(--ds-brand-700)}
.portal-access-tag.is-released .ds-icon{display:none}
.section-label+.portal-access-tag{margin-left:8px;vertical-align:middle}
.portal-access-legend{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 24px;margin:0 0 12px;padding:12px 16px;border:1px solid var(--ds-line);border-radius:var(--ds-radius);background:var(--ds-surface)}
.portal-access-legend[hidden]{display:none}
.portal-access-legend>div{display:flex;align-items:center;gap:10px;min-width:0}
.portal-access-legend p{margin:0;color:var(--ds-ink-2);line-height:1.45}
.portal-paid-notice{display:flex;align-items:flex-start;gap:12px;margin:0 0 16px;padding:16px 18px;border:1px solid #ecd9ae;border-left:4px solid var(--ds-accent);border-radius:var(--ds-radius);background:#fff9ec;color:#5f4410;line-height:1.55}
.portal-paid-notice .ds-icon{color:#94620f;margin-top:1px}
.portal-main .delivery-item.locked{opacity:1;background:var(--ds-surface-2)}
.portal-main .delivery-item.locked .portal-doc-release{display:inline-flex;align-items:center;gap:5px;background:#fff4dc;color:#7a5209}
.portal-main .delivery-item.locked .portal-doc-release .ds-icon{width:13px;height:13px}
.portal-quick-lock{display:none;width:15px;height:15px;margin-right:6px}
[data-paid-locked] .portal-quick-lock{display:inline-block}
@media(max-width:640px){
  .portal-access-legend{grid-template-columns:1fr;padding:12px}
  .portal-access-legend>div{align-items:flex-start;flex-direction:column;gap:4px}
  .portal-main .portal-dashboard-card{padding:16px}
}

/* Revisão de acessibilidade do P7 (checklist por prioridade). */
html{scroll-padding-top:96px}
.portal-shell{touch-action:manipulation}
.portal-skip-link{position:fixed;top:8px;left:8px;z-index:60;padding:10px 16px;border-radius:10px;background:var(--ds-surface);color:var(--ds-brand-800);font-weight:700;transform:translateY(-200%)}
.portal-skip-link:focus-visible{transform:none}
.portal-main:focus{outline:none}
/* Foco com contraste: o anel translúcido sumia sobre o cabeçalho escuro. */
.portal-shell :focus-visible{box-shadow:0 0 0 2px var(--ds-surface),0 0 0 4px var(--ds-brand-600)}
.portal-header-pro :focus-visible{box-shadow:0 0 0 2px var(--ds-brand-900),0 0 0 4px var(--ds-accent)}
.portal-main :is(.portal-kpi-card b,.delivery-summary b){font-variant-numeric:tabular-nums}
.modal{overscroll-behavior:contain}
@media(max-width:640px){html{scroll-padding-top:164px}}
@media(prefers-reduced-motion:reduce){
  .portal-shell *,.portal-shell *::before,.portal-shell *::after{transition:none;animation:none;scroll-behavior:auto}
  .portal-property-card:hover{transform:none}
}

/* UX P11 (09/11/2026) — Portal no celular (Design System GEOBIOS §8):
   - navegação principal vira barra inferior fixa com ícone e rótulo (5 destinos, toque de 52 px);
   - nada de rótulo cortado ("Planos", "Ajuda" ficavam fora da tela);
   - o conteúdo ganha espaço no fim para não ficar atrás da barra;
   - curvas de nível no cartão de boas-vindas no lugar da foto genérica (assinatura de marca). */
.portal-nav-icon{display:none}
.portal-nav-icon svg{width:22px;height:22px}
@media(max-width:640px){
  .portal-header-pro .portal-nav{position:fixed;left:0;right:0;bottom:0;z-index:35;order:0;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:2px;
    padding:6px max(6px,env(safe-area-inset-left,0px)) calc(6px + env(safe-area-inset-bottom,0px)) max(6px,env(safe-area-inset-right,0px));
    overflow:visible;background:var(--ds-brand-900);border-top:1px solid rgba(255,255,255,.1);box-shadow:0 -8px 24px rgba(10,43,39,.18)}
  .portal-header-pro .portal-nav-link{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-height:52px;padding:6px 2px;
    border-radius:10px;line-height:1.15;white-space:normal;text-align:center;color:#c3d9d4}
  /* O tamanho vai no rótulo (span): o botão mantém a regra forçada de 14 px da navegação desktop. */
  .portal-header-pro .portal-nav-link .portal-nav-label{font-size:12px}
  .portal-header-pro .portal-nav-link.active{color:#fff;background:rgba(201,169,106,.16);box-shadow:inset 0 3px 0 var(--ds-accent)}
  .portal-header-pro .portal-nav-icon{display:block;line-height:0}
  .portal-shell .portal-main-pro{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
}
.portal-shell .portal-welcome{position:relative;isolation:isolate;background:var(--ds-brand-900);color:var(--ds-accent)}
.portal-shell .portal-welcome::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:currentColor;opacity:.22;
  -webkit-mask:url("/geobios-curvas-de-nivel.svg") right center/cover no-repeat;mask:url("/geobios-curvas-de-nivel.svg") right center/cover no-repeat}
.portal-shell .portal-welcome-overlay{color:#fff}
@media(max-width:640px){
  /* Abas do imóvel ficam à mão enquanto o cliente rola a página. */
  /* A máscara de esmaecimento das abas roláveis deixaria o fundo transparente sobre o conteúdo; aqui a barra fica opaca. */
  .portal-shell #portalTabs{position:sticky;top:var(--portal-header-h,64px);z-index:20;background:var(--ds-surface);box-shadow:0 6px 12px -8px rgba(10,43,39,.25);-webkit-mask-image:none;mask-image:none}
}
