body[data-page] > .app { visibility: visible; }
body[data-page]::before{display:none!important;content:none!important}
html:not(.v2-ready) body[data-page] .main{position:relative;min-height:100vh}
html:not(.v2-ready) body[data-page] .main > :not(.topbar){visibility:hidden}
html:not(.v2-ready) body[data-page] .main::after{content:'';position:absolute;z-index:2;top:106px;left:clamp(24px,4vw,58px);right:clamp(24px,4vw,58px);height:min(610px,calc(100vh - 140px));border-radius:18px;background:linear-gradient(100deg,rgba(238,237,247,.78) 20%,rgba(249,249,253,.98) 38%,rgba(238,237,247,.78) 56%) 0 0/220% 100%,linear-gradient(#fff,#fff);box-shadow:0 0 0 1px rgba(225,222,239,.72);animation:v2-skeleton 1.25s ease-in-out infinite}
html:not(.v2-ready) body[data-page] .profile>*,html:not(.v2-ready) body[data-page] .top-actions>.aps-avatar{visibility:hidden}
@keyframes v2-skeleton{to{background-position:-220% 0}}
/* Ponto vermelho de notificacao nao lida no sino do topbar. */
.aps-icon-btn{position:relative}
.v2-notif-count{position:absolute;top:2px;right:1px;display:grid;place-items:center;min-width:18px;height:18px;padding:0 4px;border:2px solid #fff;border-radius:999px;background:#d92d4d;color:#fff;font-size:10px;font-weight:800;line-height:1}
.v2-notif-count[hidden]{display:none}
/* Acao sem funcao real por tras (Fase 2.1): fica visivel, mas some do foco/
   clique e ganha um selo de texto — opacidade sozinha nao bastava para
   deixar claro que a acao ainda nao existe. */
.v2-action-unavailable{position:relative;opacity:.6;cursor:not-allowed;pointer-events:none}
.v2-soon-badge{display:inline-block;margin-left:7px;padding:2px 7px;border-radius:999px;color:var(--aps-text-muted,#77728c);background:var(--aps-surface-subtle,#f0eef8);font-size:11px;font-weight:800;letter-spacing:.01em;vertical-align:middle}
/* Toast unico (Fase 3): sempre acima da barra inferior fixa (68px) e de
   qualquer rodape sticky de acao — nunca cobre o botao Salvar. */
.v2-toast-host{position:fixed;left:0;right:0;bottom:24px;z-index:9500;display:flex;flex-direction:column;align-items:center;gap:8px;padding:0 16px;pointer-events:none}
.v2-toast{display:flex;align-items:center;gap:10px;max-width:min(420px,100%);padding:12px 14px;border-radius:12px;color:#fff;background:#292361;box-shadow:0 12px 30px rgba(20,16,65,.28);font-size:14px;font-weight:700;line-height:1.35;pointer-events:auto;animation:v2-toast-in .2s ease both}
.v2-toast--success{background:#047857}
.v2-toast--error{background:#b91c1c}
.v2-toast--warning{background:#8f570d}
.v2-toast--info{background:#292361}
.v2-toast-close{flex:none;width:22px;height:22px;border:0;border-radius:6px;color:inherit;background:rgba(255,255,255,.18);cursor:pointer;font-size:14px;line-height:1}
@keyframes v2-toast-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.v2-toast{animation:none}}
/* Onda 2 (Pre-Production Hardening): aviso de sessão perto de expirar/
   expirada. Banner fixo no TOPO (o toast já ocupa o rodapé) — nunca um
   modal: fica acima do conteúdo mas não bloqueia nem prende foco, a pessoa
   continua podendo copiar/salvar o que estava preenchendo por trás dele.
   z-index acima de todos os modais do produto (o maior existente é 14500)
   porque o risco de perder conteúdo é mais urgente que qualquer modal aberto
   no momento. */
.v2-session-warning{position:fixed;top:max(12px,env(safe-area-inset-top));left:50%;transform:translateX(-50%);z-index:14800;display:flex;flex-wrap:wrap;align-items:center;gap:12px;max-width:min(560px,calc(100vw - 24px));padding:14px 16px;border-radius:14px;color:#fff;background:#8f570d;box-shadow:0 14px 34px rgba(20,16,65,.28);font:13px/1.4 Inter,system-ui,sans-serif;animation:v2-toast-in .2s ease both}
.v2-session-warning[hidden]{display:none}
.v2-session-warning-text{flex:1 1 220px;font-weight:700}
.v2-session-warning-actions{display:flex;flex-wrap:wrap;gap:8px}
.v2-session-warning-actions button{min-height:44px;padding:9px 14px;border:0;border-radius:9px;cursor:pointer;font-weight:800;font-size:12.5px}
.v2-session-warning-actions button:focus-visible{outline:3px solid rgba(255,255,255,.7);outline-offset:2px}
.v2-session-warning-actions button[data-action="renovar"],.v2-session-warning-actions button[data-action="entrar"]{color:#8f570d;background:#fff}
.v2-session-warning-actions button[data-action="continuar"]{color:#fff;background:rgba(255,255,255,.2)}
@media(prefers-reduced-motion:reduce){.v2-session-warning{animation:none}}
@media(max-width:560px){.v2-session-warning{left:12px;right:12px;transform:none;max-width:none}}
@media(max-width:780px){
  /* 68px da barra inferior + folga para o rodape sticky de acao que
     algumas telas (Plano/Escalas/Minha Pagina/Configuracoes/Horarios) ja
     mantem logo acima dela — Configuracoes empilha Salvar/Descartar em
     duas linhas abaixo de 560px, chegando a ~120px de altura, por isso
     a folga cobre o pior caso e nao so o rodape de uma linha so. */
  body[data-page] .v2-toast-host{bottom:calc(196px + env(safe-area-inset-bottom))}
}
/* ===== Entrada compartilhada de sobreposicoes (Fase 4) =====
   Todos os modais do painel alternam display:none <-> grid. Com display,
   uma transition nunca roda (o elemento nasce ja no estado final), entao
   aqui se usa animation, que dispara na primeira renderizacao. Fundo
   escurece, painel sobe de leve — mesma direcao para todo modal. */
@keyframes v2-overlay-in{from{opacity:0}to{opacity:1}}
@keyframes v2-overlay-panel-in{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.modal-backdrop.open,.cancel-modal-bg.open,.v2-edit-modal.open,.v2-clinical-modal.open,
.v2-message-modal.open,.v2-booking-qr-modal.open,.modal-bg.open{animation:v2-overlay-in .16s ease both}
.modal-backdrop.open>.modal,.cancel-modal-bg.open>.cancel-modal,.v2-edit-modal.open>section,
.v2-clinical-modal.open>article,.v2-message-modal.open>section,.v2-booking-qr-modal.open>section,
.modal-bg.open>.modal{animation:v2-overlay-panel-in .2s cubic-bezier(.2,.75,.25,1) both}
/* Menus contextuais e paineis flutuantes: mesma ideia, mais curto —
   sao respostas diretas a um toque e nao podem parecer lentos. */
@keyframes v2-pop-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.context.open .context-menu,.record-more-wrap.open .context-menu,
.v2-account-menu.open,.v2-notifications.open{animation:v2-pop-in .14s ease both}
@media(prefers-reduced-motion:reduce){
  .modal-backdrop.open,.cancel-modal-bg.open,.v2-edit-modal.open,.v2-clinical-modal.open,
  .v2-message-modal.open,.v2-booking-qr-modal.open,.modal-bg.open,
  .modal-backdrop.open>.modal,.cancel-modal-bg.open>.cancel-modal,.v2-edit-modal.open>section,
  .v2-clinical-modal.open>article,.v2-message-modal.open>section,.v2-booking-qr-modal.open>section,
  .modal-bg.open>.modal,
  .context.open .context-menu,.record-more-wrap.open .context-menu,
  .v2-account-menu.open,.v2-notifications.open{animation:none}
}
/* Entrada de pagina (Fase 4).
   Antes havia aqui um @view-transition cross-document. Medido: ele nunca
   chegava a rodar — o evento pagereveal do destino sempre trazia
   viewTransition ausente e o navegador registrava "Transition was skipped"
   no console a cada navegacao. Causa: estas telas so ficam pintaveis depois
   das chamadas de API (o esqueleto html:not(.v2-ready) segura o conteudo),
   e a transicao cross-document expira antes disso.
   Em vez de manter uma animacao morta que so gerava erro, a entrada agora
   acompanha o proprio momento em que o conteudo fica pronto: o esqueleto
   entrega o lugar ao conteudo real com um fade curto. Nao atrasa nada —
   comeca exatamente quando havia conteudo para mostrar. */
@keyframes v2-page-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
html.v2-ready body[data-page] .main>:not(.topbar){animation:v2-page-in .2s cubic-bezier(.2,.75,.25,1) both}
@media(prefers-reduced-motion:reduce){
  html.v2-ready body[data-page] .main>:not(.topbar){animation:none}
}
body[data-page] .sidebar{width:252px!important;padding:24px 18px 18px!important;background:linear-gradient(180deg,#26215c,#1d1949)!important}
body[data-page] .main{margin-left:252px!important}
body[data-page] .topbar{min-height:72px!important;padding:0 30px!important;background:rgba(250,250,254,.94)!important}
body[data-page] .brand{display:flex!important;margin-bottom:18px!important}
body[data-page] .brand-official{display:block!important;width:100%!important;max-width:216px!important;height:auto!important;border-radius:14px!important}
body[data-page] .sidebar .nav{display:flex!important;flex-direction:column!important;gap:3px!important}
body[data-page] .sidebar .aps-nav-item{position:relative;display:flex!important;align-items:center!important;gap:12px!important;width:100%;min-height:44px!important;padding:0 12px!important;border:0!important;border-radius:11px!important;color:rgba(255,255,255,.72)!important;background:none!important;cursor:pointer;font:500 14px/1.2 var(--aps-font-body,Inter,sans-serif)!important;text-align:left!important}
body[data-page] .sidebar .aps-nav-item:hover{color:#fff!important;background:rgba(255,255,255,.07)!important}
body[data-page] .sidebar .aps-nav-item.active{color:#fff!important;background:rgba(127,119,221,.36)!important}
body[data-page] .sidebar .aps-nav-item.active::before{content:'';position:absolute;left:-18px;top:8px;width:3px;height:28px;border-radius:0 4px 4px 0;background:#8f83ff}
body[data-page] .sidebar .nav-icon{width:18px!important;height:18px!important;flex:0 0 18px!important;color:rgba(255,255,255,.62)!important}
body[data-page] .sidebar .aps-nav-item.active .nav-icon{color:#fff!important}
body[data-page] .sidebar-spacer{flex:1!important}
body[data-page] .profile-card{display:flex!important;align-items:center!important;gap:10px!important;padding:14px 10px 4px!important;border-top:1px solid rgba(255,255,255,.1)!important}
body[data-page] .profile-card .profile-name{color:#fff!important;font-size:13px!important;font-weight:750!important}
body[data-page] .profile-card .profile-meta{margin-top:3px;color:rgba(255,255,255,.55)!important;font-size:12px!important}
body[data-page] .topbar .search{display:flex!important;align-items:center!important;width:min(420px,38vw)!important;height:42px!important;padding:0 13px!important;border:1px solid var(--aps-border,#e3e1ef)!important;border-radius:12px!important;background:#fff!important}
body[data-page] .topbar .search svg{width:17px!important;height:17px!important;color:var(--aps-text-muted,#77728c)!important}
body[data-page] .topbar .search input{width:100%!important;height:auto!important;padding:0 0 0 9px!important;border:0!important;outline:0!important;background:transparent!important}
body[data-page] .topbar .top-actions{display:flex!important;align-items:center!important;gap:9px!important}
body[data-page] .topbar .mobile-menu{display:none}
body[data-page] .bottom-nav{display:none}
.v2-mobile-head{display:none}
/* So aparece no mobile: no desktop o "Nova consulta" do topbar ja cobre isto,
   duplicar aqui competiria com "Abrir prontuario" sem necessidade. */
.v2-attend-secondary{display:none}
@media(max-width:780px){
body[data-page]{padding-bottom:76px}
body[data-page] .main{margin-left:0!important}
body[data-page] .sidebar{display:none!important}
body[data-page] .topbar{padding:max(8px,env(safe-area-inset-top)) 13px 8px!important;gap:8px!important}
body[data-page] .topbar .top-actions{gap:7px!important}
body[data-page] .topbar .aps-icon-btn{width:44px;height:44px;border-radius:13px}
body[data-page] .topbar .topbar-icon{width:21px;height:21px}
body[data-page] .topbar .top-actions>.aps-avatar{width:44px!important;height:44px!important;border-radius:14px!important;font-size:13px!important}
body[data-page] .topbar .search{display:none!important}
/* O "+" do cabecalho era global e ambiguo: em toda tela a acao principal ja
   aparece no conteudo, entao no mobile ele nao aparece. Desktop segue igual. */
body[data-page] .topbar .top-actions>.aps-btn{display:none!important}
body[data-page] .v2-mobile-head{display:flex!important;align-items:center;gap:6px;flex:1;min-width:0}
body[data-page] .v2-mobile-back{display:grid;place-items:center;flex:none;width:44px;height:44px;margin-left:-10px;border:0;border-radius:12px;color:#292361;background:none;cursor:pointer}
body[data-page] .v2-mobile-back svg{width:22px;height:22px}
body[data-page] .v2-mobile-back[hidden]{display:none}
body[data-page] .v2-mobile-back:active{background:#f0eeff}
body[data-page] .v2-mobile-titles{display:grid;min-width:0}
body[data-page] .v2-mobile-title{overflow:hidden;color:#292361;font:750 16px/1.25 var(--aps-font-display,inherit);text-overflow:ellipsis;white-space:nowrap}
body[data-page] .v2-mobile-subtitle{overflow:hidden;margin-top:1px;color:var(--aps-text-secondary);font-size:12.5px;line-height:1.2;text-overflow:ellipsis;white-space:nowrap}
body[data-page] .v2-mobile-subtitle[hidden]{display:none}
/* Telas internas: sem sino e sem avatar, so voltar + contexto do paciente */
body[data-page="prontuarios"] .topbar .top-actions,
body[data-page="paciente"] .topbar .top-actions,
body[data-page="solicitacao"] .topbar .top-actions{display:none!important}
body[data-page] .bottom-nav{position:fixed;left:0;right:0;bottom:0;z-index:80;display:grid!important;grid-template-columns:repeat(5,1fr);min-height:68px;padding:7px max(8px,env(safe-area-inset-right)) calc(6px + env(safe-area-inset-bottom)) max(8px,env(safe-area-inset-left));border-top:1px solid var(--aps-border,#e3e1ef);background:rgba(255,255,255,.97);box-shadow:0 -10px 30px rgba(35,29,88,.08);backdrop-filter:blur(16px);transition:transform .2s ease}
body[data-page] .bottom-nav button{display:grid!important;place-items:center;gap:3px;min-height:52px;padding:4px 2px;border:0;border-radius:13px;color:#8b86a0;background:none}
body[data-page] .bottom-nav button .nav-icon{width:23px;height:23px;flex:none}
body[data-page] .bottom-nav button small{font-size:11px;font-weight:700;letter-spacing:.01em}
body[data-page] .bottom-nav button.active{color:#4c3fb8;background:#ebe7ff}
body[data-page] .bottom-nav button.active small{font-weight:800}
html:not(.v2-ready) body[data-page] .bottom-nav{visibility:hidden}
body.v2-keyboard-open .bottom-nav{transform:translateY(120%)}
body[data-page] .text-button{display:inline-flex;align-items:center;min-height:44px;padding:0 4px}
/* [hidden] do navegador perde para o display:inline-flex acima (a regra
   com body[data-page] tem especificidade maior que .text-button[hidden]
   sozinha, então o override aqui precisa do mesmo prefixo) — mesmo padrão
   do fix de .aps-badge[hidden]/.aps-btn[hidden] (Onda 3). Sem isso,
   "Limpar filtros" (agenda.html, pacientes.html), "Limpar filtro"
   (financeiro.html) e "Ver financeiro completo →" (paciente.html) ficavam
   visíveis mesmo com o atributo hidden presente. */
body[data-page] .text-button[hidden]{display:none}
body[data-page] .tab-btn{min-height:44px}
body[data-page] .context-menu button{min-height:44px}
body[data-page] .v2-document button[data-delete-document]{width:40px;height:40px}
body[data-page="agenda"] .period-tabs button{min-height:44px}
body[data-page="financeiro"] .period{flex-wrap:wrap;row-gap:8px}
body[data-page="financeiro"] .period .new-charge{width:100%}
body[data-page="minha-pagina"] .editor{grid-template-columns:minmax(0,1fr)}
body[data-page] .topbar{min-height:58px!important}
body[data-page] .v2-mobile-title{font-size:17px}
body[data-page] .topbar .top-actions>.aps-avatar{display:grid!important;width:36px;height:36px;border-radius:12px;font-size:12px}
body[data-page="dashboard"] .content{display:flex;flex-direction:column;gap:12px;width:calc(100% - 24px)!important;padding:14px 0 90px!important}
/* Fase B (Dashboard 4.0): esta regra vinha de um layout mobile anterior do
   Dashboard (cards "v2-simple-metrics"/"#attend-card"/".v2-attention-item"
   etc., linhas seguintes deste bloco) que não existe mais no DOM real de
   painel.html — foi substituído pelo shell .dd-* (dashboard-2.0.css), única
   fonte de estilo desta tela. .v2-simple-welcome continua no HTML atual só
   porque o runtime escreve saudação/subtítulo nela via querySelector, mas é
   o MESMO elemento que carrega .dd-greeting/.aps4-page-header — ocultá-la
   apagava o cabeçalho inteiro (h1 + subtítulo + CTA "Nova consulta") no
   mobile, sem nenhuma tela substituta assumindo o lugar (bug real, achado
   durante QA visual da Fase B, não introduzido por ela). O resto deste
   bloco (linhas abaixo) também está morto pelo mesmo motivo, mas fica fora
   do escopo desta correção pontual. */
body[data-page="dashboard"] .v2-simple-workspace,body[data-page="dashboard"] .v2-simple-sidebar{display:contents}
body[data-page="dashboard"] #attend-card{order:1;padding:20px 18px!important}
body[data-page="dashboard"] #attend-card.is-empty{padding:17px 18px!important}
body[data-page="dashboard"] .v2-attend-name{font-size:21px}
body[data-page="dashboard"] #attend-card.is-empty .v2-attend-name{font-size:18px}
body[data-page="dashboard"] #attend-card.is-empty .v2-attend-empty p{margin-top:5px;font-size:13px}
body[data-page="dashboard"] #attend-card.is-empty .v2-attend-actions{margin-top:13px}
body[data-page="dashboard"] .v2-attend-countdown{font-size:29px}
body[data-page="dashboard"] .v2-attend-actions{margin-top:15px;gap:9px}
body[data-page="dashboard"] .v2-attend-actions .aps-btn{flex:1 1 0;min-height:48px;font-size:14px!important}
.v2-attend-secondary{display:inline-flex}
body[data-page="dashboard"] .v2-simple-metrics{order:2;grid-template-columns:1fr 1fr;gap:9px;margin:0}
body[data-page="dashboard"] .v2-simple-card{display:grid;grid-template-columns:30px minmax(0,1fr);column-gap:9px;align-items:center;min-height:66px;padding:11px}
body[data-page="dashboard"] .v2-simple-card::before{width:3px}
body[data-page="dashboard"] .v2-simple-icon{grid-row:1/3;width:30px;height:30px;margin:0;font-size:13px}
body[data-page="dashboard"] .v2-simple-value{align-self:end;font-size:20px;letter-spacing:-.045em}
/* Receita cabe em "R$ 25,00" a 20px, mas nao em "R$ 12.500,00" numa metade
   de tela de 360px — so este card reduz, os outros tres seguem iguais. */
body[data-page="dashboard"] .v2-simple-metrics>:nth-child(4) .v2-simple-value{font-size:17px}
body[data-page="dashboard"] .v2-simple-label{align-self:start;margin-top:3px;color:var(--aps-text-secondary);font-size:12.5px;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
body[data-page="dashboard"] .v2-simple-workspace>.panel{order:3}
body[data-page="dashboard"] .v2-simple-sidebar>.panel{order:4}
body[data-page="dashboard"] .v2-perf-compact{order:5;gap:14px;padding:13px 15px!important}
body[data-page="dashboard"] .v2-perf-donut-wrap{width:54px;height:54px}
body[data-page="dashboard"] .panel{padding:15px}
body[data-page="dashboard"] .panel-header{margin-bottom:11px}
body[data-page="dashboard"] .panel-title{font-size:15px}
body[data-page="dashboard"] .v2-simple-agenda-item{gap:11px;padding:11px 12px}
body[data-page="dashboard"] .v2-attention-item{align-items:flex-start;gap:11px;min-height:56px;padding:12px 6px}
body[data-page="dashboard"] .v2-attention-dot{margin-top:6px}
body[data-page="dashboard"] .v2-attention-title{font-size:14px}
body[data-page="dashboard"] .v2-attention-meta{margin-top:3px;color:var(--aps-text-secondary);font-size:12.5px}
body[data-page="dashboard"] .v2-attention-arrow{margin-top:2px}
body[data-page="dashboard"].v2-day-empty .v2-simple-workspace>.panel{display:none}
body[data-page="dashboard"] .aps-empty{min-height:0;padding:8px 4px 4px}
body[data-page="dashboard"] .aps-empty .aps-btn{width:100%}
}
/* visibility em vez de display:none — com display, o painel nasce ja no
   estado final e a transicao declarada nunca chega a rodar (nao existe
   quadro inicial para animar). A saida atrasa o visibility ate o painel
   terminar de descer. */
.v2-mais-sheet{position:fixed;inset:0;z-index:9000;visibility:hidden;transition:visibility 0s linear .2s}
.v2-mais-sheet.open{visibility:visible;transition-delay:0s}
.v2-mais-backdrop{position:absolute;inset:0;background:rgba(26,22,67,.5);backdrop-filter:blur(4px);opacity:0;transition:opacity .2s ease}
.v2-mais-sheet.open .v2-mais-backdrop{opacity:1}
.v2-mais-panel{position:absolute;left:0;right:0;bottom:0;max-height:80vh;overflow-y:auto;padding:8px 10px calc(14px + env(safe-area-inset-bottom));border-radius:20px 20px 0 0;background:#fff;box-shadow:0 -20px 50px rgba(20,16,65,.25);transform:translateY(100%);transition:transform .2s cubic-bezier(.2,.75,.25,1)}
.v2-mais-sheet.open .v2-mais-panel{transform:translateY(0)}
.v2-mais-handle{display:flex;justify-content:center;padding:10px 0 6px}
.v2-mais-handle::before{content:'';width:36px;height:4px;border-radius:99px;background:#e3e1ef}
.v2-mais-item{display:flex;align-items:center;gap:14px;width:100%;min-height:52px;padding:0 12px;border:0;border-radius:12px;background:none;color:#292361;font-size:15px;font-weight:700;text-align:left;cursor:pointer}
.v2-mais-item:active{background:#f3f1fb}
.v2-mais-ic{display:grid;place-items:center;width:34px;height:34px;border-radius:10px;color:#5146b8;background:#ece9ff;font-size:15px;flex:none}
.v2-mais-ic svg{width:19px;height:19px}
@media(prefers-reduced-motion:reduce){.v2-mais-panel,.v2-mais-backdrop,body[data-page] .bottom-nav,.v2-filter-panel,.v2-filter-backdrop{transition:none}}
/* Folha de filtros (mobile) */
.v2-filter-sheet{position:fixed;inset:0;z-index:9000;visibility:hidden;transition:visibility 0s linear .2s}
.v2-filter-sheet.open{visibility:visible;transition-delay:0s}
.v2-filter-backdrop{position:absolute;inset:0;background:rgba(26,22,67,.5);backdrop-filter:blur(4px);opacity:0;transition:opacity .2s ease}
.v2-filter-sheet.open .v2-filter-backdrop{opacity:1}
.v2-filter-panel{position:absolute;left:0;right:0;bottom:0;display:flex;flex-direction:column;max-height:82vh;border-radius:20px 20px 0 0;background:#fff;box-shadow:0 -20px 50px rgba(20,16,65,.25);transform:translateY(100%);transition:transform .2s cubic-bezier(.2,.75,.25,1)}
.v2-filter-sheet.open .v2-filter-panel{transform:translateY(0)}
.v2-filter-panel header{flex:none;padding:2px 18px 12px}
.v2-filter-panel header strong{color:#292361;font-size:17px}
.v2-filter-body{flex:1;min-height:0;overflow-y:auto;padding:0 18px 6px;display:grid;gap:14px}
.v2-filter-field{display:grid;gap:7px;color:#514d67;font-size:13.5px;font-weight:700}
/* display:block e necessario: agenda.html esconde .compact-select no mobile
   com um seletor que continua valendo depois de o campo ser movido para ca. */
.v2-filter-field select{display:block;width:100%;min-height:48px;padding:0 12px;border:1px solid #ddd9ed;border-radius:11px;background:#fff;color:#292361;font-size:16px}
.v2-filter-panel footer{flex:none;padding:14px 18px calc(14px + env(safe-area-inset-bottom));border-top:1px solid #eceaf4}
.v2-filter-panel footer .aps-btn{width:100%;min-height:50px}
.v2-filter-trigger{display:none}
@media(max-width:780px){
  body[data-page] .v2-filter-trigger{display:inline-flex;align-items:center;gap:7px;min-height:44px}
  body[data-page] .v2-filter-trigger svg{width:17px;height:17px}
  body[data-page] .v2-filter-trigger.has-filter{border-color:#8f7ee0;color:#4c3fb8;background:#f2f0ff}
  body[data-page] .v2-filter-trigger.has-filter::after{content:'';width:7px;height:7px;border-radius:50%;background:#5146b8}
}
/* Feedback de acao em andamento: spinner, rotulo e bloqueio de toque duplo */
.v2-pending{position:relative;display:inline-flex!important;align-items:center;justify-content:center;gap:9px;cursor:wait;opacity:.9}
.v2-pending:disabled{opacity:.9}
.v2-spinner{flex:none;width:15px;height:15px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:.85;animation:v2-spin .7s linear infinite}
/* Resposta imediata ao toque, antes mesmo da rede responder */
body[data-page] .aps-btn:not(:disabled):active,body[data-page] .aps-icon-btn:not(:disabled):active,body[data-page] .v2-mais-item:active,body[data-page] .bottom-nav button:active{filter:brightness(.94)}
.v2-inline-skeleton{display:inline-block;width:min(230px,60%);height:13px;border-radius:6px;background:linear-gradient(100deg,#eceaf6 20%,#f7f6fb 40%,#eceaf6 60%);background-size:220% 100%;animation:v2-skeleton 1.1s infinite;vertical-align:middle}
.v2-inline-skeleton--sm{width:34px;height:15px}
@media(prefers-reduced-motion:reduce){.v2-spinner,.v2-inline-skeleton{animation:none}}
.v2-load-error{display:flex;align-items:center;gap:12px;margin:16px;padding:14px 16px;border:1px solid #ffd0d8;border-radius:12px;background:#fff4f6;color:#8e2438;font:14px Inter,system-ui,sans-serif}.v2-load-error span{flex:1}.v2-load-error button{padding:8px 12px;border:0;border-radius:8px;background:#5b4fc2;color:#fff;font-weight:700;cursor:pointer}
/* Erro escopado a uma secao (troca de paciente/mes que falhou), sem
   derrubar o resto da tela nem o banner generico de recarregar pagina. */
.v2-section-error{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:16px;border:1px solid #ffd0d8;border-radius:12px;background:#fff4f6;color:#8e2438;font-size:14px}
.v2-section-error strong{flex:1;min-width:200px;font-weight:700}
.v2-section-error button{padding:8px 12px;border:0;border-radius:8px;background:#5b4fc2;color:#fff;font-weight:700;cursor:pointer;flex:none}
/* Estrutura neutra exibida no lugar de linhas/cartoes reais enquanto a
   requisicao ainda nao respondeu. Reaproveita a classe real da linha
   (.appointment/.patient-card/.transaction/.occurrence) para herdar
   altura minima, padding e raio — so o layout interno vira flex, para
   nao depender das colunas do grid real, que so fazem sentido com o
   conteudo verdadeiro. */
.v2-skel-row{display:flex!important;align-items:center;gap:13px;pointer-events:none;cursor:default}
.v2-skel-row .patient-side,.v2-skel-row .appointment-actions,.v2-skel-row .aps-badge,.v2-skel-row .context{display:none!important}
.v2-skel-avatar{flex:none;width:42px;height:42px;border-radius:12px;background:linear-gradient(100deg,#eceaf6 20%,#f7f6fb 40%,#eceaf6 60%);background-size:220% 100%;animation:v2-skeleton 1.1s infinite}
.v2-skel-lines{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
.v2-skel-bar{height:11px;border-radius:6px;background:linear-gradient(100deg,#eceaf6 20%,#f7f6fb 40%,#eceaf6 60%);background-size:220% 100%;animation:v2-skeleton 1.1s infinite}
.v2-skel-bar--100{width:100%}.v2-skel-bar--70{width:70%}.v2-skel-bar--50{width:50%}.v2-skel-bar--35{width:35%}
@media(prefers-reduced-motion:reduce){.v2-skel-avatar,.v2-skel-bar{animation:none}}
.aps-empty { display:grid; place-items:center; min-height:150px; padding:24px; color:var(--aps-text-muted); text-align:center; }
.aps-empty strong { color:var(--aps-primary); font-size:15px; }
.aps-empty p { margin:6px 0 0; font-size:13px; }
.aps-empty .aps-btn { margin-top:14px; }
/* Slot de icone dos estados vazios (Fase 6). .aps-empty nao tinha nenhum —
   so texto — entao um estado vazio era indistinguivel de um erro ou de um
   bloco ainda carregando. Mesma linguagem do .aps-state__icon ja existente. */
.v2-empty-icon{display:grid;place-items:center;width:42px;height:42px;margin:0 auto 12px;border-radius:13px;color:var(--aps-cta);background:var(--aps-accent-soft,#efedff)}
.v2-empty-icon svg{width:21px;height:21px}
/* Tom calmo para estados que sao boa noticia ("nenhuma pendencia"), para
   nao parecerem falta de dado. */
.v2-empty-icon--ok{color:#087b5b;background:#e3f7ef}
/* Tamanho dos SVGs que substituiram os glifos (Fase 6). Os slots ja
   existiam dimensionados para texto (font-size), que nao vale para SVG. */
.v2-simple-icon svg{width:17px;height:17px}
.summary-icon svg{width:19px;height:19px}
.aps-state__icon svg{width:21px;height:21px}
.tx-icon svg{width:15px;height:15px}
.shortcut-icon svg,.health-icon svg{width:19px;height:19px}
.text-button { margin-top:6px; padding:0; border:0; color:var(--aps-cta); background:none; cursor:pointer; font-size:12px; font-weight:750; }
.v2-account-menu,.v2-notifications{position:fixed;top:76px;right:22px;display:none;z-index:10020;border:1px solid #e4e1f1;border-radius:14px;background:#fff;box-shadow:0 18px 50px rgba(35,29,88,.18)}.v2-account-menu.open,.v2-notifications.open{display:grid}.v2-account-menu{width:190px;padding:7px}.v2-account-menu button{padding:11px 12px;border:0;border-radius:9px;background:none;color:#342f5f;text-align:left;cursor:pointer}.v2-account-menu button:hover{background:#f3f1ff}
.v2-notifications{grid-template-rows:auto auto minmax(0,1fr) auto;width:min(410px,calc(100vw - 24px));max-height:min(620px,calc(100vh - 96px));overflow:hidden}
.v2-notifications header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:13px 14px;background:#fff;border-bottom:1px solid #eeecf6}
.v2-notif-header-actions{display:flex;align-items:center;gap:6px}
.v2-notifications header button,.v2-notifications footer button{min-height:36px;border:0;border-radius:8px;background:none;color:#5b4fc2;font-weight:700;cursor:pointer}
.v2-notifications header button:disabled{color:#aaa6b9;cursor:not-allowed}
.v2-notif-close{width:36px;font-size:21px;line-height:1}
.v2-notif-feedback:not(:empty){padding:9px 14px;border-bottom:1px solid #f2d6dc;background:#fff7f8;color:#a1263f;font-size:12px}
.v2-notif-list{min-height:0;overflow-y:auto;overscroll-behavior:contain}
.v2-notif-item{border-bottom:1px solid #f0eef7}
.v2-notif-item.unread{border-left:3px solid #5b4fc2;background:#faf9ff}
.v2-notif-item-main{display:grid;width:100%;gap:5px;padding:12px 14px;border:0;background:transparent;color:#342f5f;text-align:left;cursor:pointer}
.v2-notif-item-main.has-destination:hover,.v2-notif-item-main:hover{background:#f7f5ff}
.v2-notif-title{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.v2-notif-title b{font-size:13px}
.v2-notif-read-state{flex:0 0 auto;padding:2px 6px;border-radius:999px;background:#efedf7;color:#68627d;font-size:10px;font-weight:750}
.v2-notif-item.unread .v2-notif-read-state{background:#e9e5ff;color:#4d3daf}
.v2-notif-message{color:#6f6a80;font-size:12px;line-height:1.45;overflow-wrap:anywhere}
.v2-notif-item time{color:#8a8598;font-size:11px}
.v2-notifications footer:empty{display:none}
.v2-notifications footer{display:grid;padding:10px 14px;border-top:1px solid #eeecf6;background:#fff}
.v2-notif-more{background:#f3f1ff!important}
.v2-notif-state{display:grid;justify-items:center;gap:9px;padding:20px 14px;color:#77728c;text-align:center;font-size:13px}
.v2-notif-state p{margin:0}
.v2-notif-state button{min-height:38px;padding:0 13px;border:1px solid #d9d4ef;border-radius:9px;background:#fff;color:#5145ad;font-weight:700;cursor:pointer}
.v2-notifications button:focus-visible,[data-notifications-bell]:focus-visible{outline:3px solid rgba(91,79,194,.35);outline-offset:2px}
@media(max-width:560px){.v2-notifications{top:64px;right:8px;width:calc(100vw - 16px);max-height:calc(100dvh - 76px)}.v2-notifications header{padding:11px 12px}.v2-notif-read-all{font-size:12px}.v2-notif-item-main{min-height:48px;padding:12px}.v2-notif-message{font-size:13px}}
.v2-edit-modal{position:fixed;inset:0;z-index:11000;display:none;place-items:center;padding:20px;background:rgba(26,22,67,.5);backdrop-filter:blur(5px)}.v2-edit-modal.open{display:grid}.v2-edit-modal>section{display:flex;flex-direction:column;width:min(620px,100%);max-height:calc(100dvh - 40px);padding:23px}.v2-edit-modal header{flex:none;display:flex;align-items:center;justify-content:space-between}.v2-edit-modal h2{margin:0;color:#292361;font-size:20px}.v2-edit-body{flex:1;min-height:0;overflow-y:auto;padding-right:2px}.v2-edit-section-title{margin:20px 0 4px;color:#5146b8;font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.04em}.v2-edit-section-title:first-of-type{margin-top:4px}.v2-edit-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px;margin-top:10px}.v2-edit-grid label{display:grid;gap:6px;color:#514d67;font-size:13px;font-weight:700}.v2-edit-grid label.full{grid-column:1/-1}.v2-edit-grid input,.v2-edit-grid select{height:42px;padding:0 11px;border:1px solid #ddd9ed;border-radius:10px;background:#fff;font:14px/1 inherit;color:#292361}.v2-edit-modal footer{flex:none;display:flex;justify-content:flex-end;gap:8px;margin-top:16px;padding-top:16px;border-top:1px solid #e5e3f2}@media(max-width:560px){.v2-edit-modal{align-items:flex-end;padding:0}.v2-edit-modal>section{width:100%;max-height:calc(100dvh - env(safe-area-inset-top) - 12px);border-radius:20px 20px 0 0;padding:20px 16px calc(20px + env(safe-area-inset-bottom))}.v2-edit-grid{grid-template-columns:1fr}.v2-edit-grid label.full{grid-column:auto}}
.v2-patient-photo-editor{display:grid;grid-template-columns:82px 1fr;align-items:center;gap:16px;margin-top:18px;padding:15px;border:1px solid #e4e1f1;border-radius:14px;background:#faf9ff}.v2-patient-photo{display:grid;width:82px;height:82px;place-items:center;overflow:hidden;border:3px solid #fff;border-radius:22px;color:#574bc2;background:#ece9ff;box-shadow:0 0 0 1px #ddd8f5;font-size:19px;font-weight:800}.v2-patient-photo-editor strong{color:#292361;font-size:14px}.v2-patient-photo-editor p{margin:4px 0 10px;color:#77728c;font-size:12px}.v2-patient-photo-actions{display:flex;align-items:center;flex-wrap:wrap;gap:9px}.v2-patient-photo-actions .aps-btn{min-height:36px;padding:0 13px}.v2-remove-photo{padding:7px 4px;border:0;color:#a52b44;background:none;font-size:12px;font-weight:750;cursor:pointer}.v2-remove-photo:hover{text-decoration:underline}.v2-photo-status{display:block;min-height:18px;margin-top:8px;font-size:12px}.v2-photo-status.loading{color:#574bc2}.v2-photo-status.success{color:#087b5b}.v2-photo-status.error{color:#b42345}@media(max-width:560px){.v2-patient-photo-editor{grid-template-columns:64px 1fr;padding:12px}.v2-patient-photo{width:64px;height:64px;border-radius:18px}.v2-patient-photo-actions{align-items:flex-start;flex-direction:column;gap:3px}}
.v2-document{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 0;border-bottom:1px solid #eceaf4}.v2-document a{min-width:0;overflow:hidden;color:#5146b8;font-size:13px;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.v2-document button[data-open-document]{display:flex;flex-direction:column;align-items:flex-start;min-width:0;flex:1;gap:2px;padding:2px 0;border:0;background:none;text-align:left;cursor:pointer}.v2-document button[data-open-document] span{overflow:hidden;color:#5146b8;font-size:13px;font-weight:700;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.v2-document button[data-open-document] small{color:#8b86a3;font-size:11px}.v2-document button[data-delete-document]{flex:none;width:26px;height:26px;border:0;border-radius:7px;color:#a52b44;background:#fff0f3;cursor:pointer}.side-card .aps-btn{width:100%;margin-top:10px}#record-documents-arquivados{width:100%;margin-top:8px;text-align:center}#record-documents-arquivados-list .v2-document{border-bottom:1px dashed #eceaf4}.v2-document-filters{display:flex;flex-direction:column;gap:6px;margin-bottom:10px}.v2-document-filters input,.v2-document-filters select{padding:8px 10px;border:1px solid #e3e1ef;border-radius:9px;font-size:12px;font-family:inherit;color:#292361;background:#fff}.v2-document-filters input:focus,.v2-document-filters select:focus{outline:none;border-color:#8f7ee0}#record-documents-pagination{margin-top:4px;text-align:center}#record-documents-pagination .text-button{width:100%}
.context-menu button.v2-menu-danger{color:#a52b44}.context-menu button.v2-menu-danger:hover{color:#a52b44;background:#fff0f3}
.v2-clinical-sections p.v2-empty-field{color:#9c97ad;font-style:italic}
.v2-anamnese-nav{display:flex;flex-wrap:wrap;gap:6px;padding:14px 24px 0}.v2-anamnese-nav button{padding:5px 11px;border:1px solid #e3e1ef;border-radius:999px;color:#5146b8;background:#faf9ff;font-size:11px;font-weight:700;cursor:pointer}.v2-anamnese-nav button:hover,.v2-anamnese-nav button:focus-visible{background:#ece9ff;outline:none}
@media(max-width:560px){.v2-document-filters{flex-direction:column}.v2-anamnese-nav{padding:12px 17px 0}}
.v2-record-status{display:inline-flex;min-height:24px;margin-top:10px;padding:0 8px;align-items:center;border-radius:999px;font-size:11px;font-weight:800}.v2-record-status.success{color:#087b5b;background:#e3f7ef}.v2-record-status.pending,.v2-record-status.warning{color:#946000;background:#fff3d5}.v2-record-status.neutral{color:#68637b;background:#eceaf2}.v2-record-status.danger{color:#a52b44;background:#fff0f3}.v2-anamnese-actions{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.v2-anamnese-card{display:block;width:100%;color:inherit;text-align:left;cursor:pointer}.v2-anamnese-card:hover{border-color:#c9c3f2;background:#faf9ff}.v2-clinical-modal{position:fixed;inset:0;z-index:12000;display:none;overflow:auto;padding:28px;background:rgba(26,22,67,.55);backdrop-filter:blur(6px)}.v2-clinical-modal.open{display:grid;place-items:start center}.v2-clinical-modal>article{width:min(760px,100%);overflow:hidden}.v2-clinical-modal header{display:flex;padding:24px;align-items:flex-start;justify-content:space-between;gap:18px;border-bottom:1px solid #e7e4f1}.v2-clinical-modal h2{margin:5px 0 0;color:#292361;font-size:25px}.v2-clinical-modal header p{margin:6px 0 0;color:#77728c;font-size:13px}.v2-clinical-sections{display:grid;gap:0;padding:5px 24px 20px}.v2-clinical-sections section{padding:19px 0;border-bottom:1px solid #eeecf5}.v2-clinical-sections h3{margin:0 0 8px;color:#5146b8;font-size:12px;text-transform:uppercase;letter-spacing:.05em}.v2-clinical-sections p{margin:0;color:#35304f;font-size:14px;line-height:1.7;white-space:pre-wrap}.v2-clinical-modal footer{display:flex;padding:17px 24px;align-items:center;justify-content:space-between;gap:14px;color:#087b5b;background:#faf9fd;font-size:12px}@media(max-width:560px){.v2-clinical-modal{padding:12px}.v2-clinical-modal header,.v2-clinical-sections,.v2-clinical-modal footer{padding-left:17px;padding-right:17px}.v2-clinical-modal footer{align-items:stretch;flex-direction:column}.v2-clinical-modal footer .aps-btn{width:100%}}
.v2-search-results{position:absolute;z-index:120;top:calc(100% + 9px);left:0;right:0;display:none;overflow:hidden;padding:6px;border:1px solid #e3e1ef;border-radius:14px;background:#fff;box-shadow:0 18px 48px rgba(35,29,88,.16)}.v2-search-results.open{display:grid}.v2-search-results button{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:10px;padding:9px;border:0;border-radius:10px;color:#292361;background:none;text-align:left;cursor:pointer}.v2-search-results button:hover,.v2-search-results button.active{background:#f2f0ff}.v2-search-results .aps-avatar{width:34px;height:34px;font-size:11px}.v2-search-results strong,.v2-search-results small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v2-search-results strong{font-size:13px}.v2-search-results small{margin-top:3px;color:#77728c;font-size:11px}.v2-search-empty{padding:18px;color:#77728c;text-align:center;font-size:13px}
body[data-page]{font-feature-settings:'kern' 1,'liga' 1}body[data-page] p,body[data-page] .patient-meta,body[data-page] .panel-copy{line-height:1.55}body[data-page] .aps-card{border-color:rgba(222,219,238,.9)}body[data-page] .aps-badge{display:inline-flex;align-items:center;min-height:25px;padding-inline:9px;line-height:1.2;white-space:nowrap}body[data-page] .aps-btn,body[data-page] .aps-icon-btn{transition:transform .16s ease,box-shadow .16s ease,background-color .16s ease}body[data-page] .aps-btn:not(:disabled):active,body[data-page] .aps-icon-btn:not(:disabled):active{transform:translateY(1px)}body[data-page] input:focus-visible,body[data-page] select:focus-visible,body[data-page] textarea:focus-visible,body[data-page] button:focus-visible{outline:3px solid rgba(91,79,194,.18);outline-offset:2px}
body[data-page] .context.open .context-menu { display:block; }
body[data-page="prontuarios"] .patient>span:nth-child(2){display:grid;min-width:0;gap:4px}body[data-page="prontuarios"] .patient .pname,body[data-page="prontuarios"] .patient .pmeta{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}body[data-page="prontuarios"] .patient .pmeta{margin:0;font-size:12px}body[data-page="prontuarios"] .patient{column-gap:12px}
.v2-record-card{transition:border-color .16s,background .16s,box-shadow .16s,transform .16s}.v2-record-card:hover,.v2-record-card:focus-visible{border-color:#c9c3f2;background:#faf9ff;box-shadow:0 8px 24px rgba(35,29,88,.08);outline:none}.v2-record-card:focus-visible{box-shadow:0 0 0 3px rgba(91,79,194,.16),0 8px 24px rgba(35,29,88,.08)}.v2-open-hint{margin-right:auto}.v2-record-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.v2-record-form-grid .field{margin:0}.v2-record-form-grid .field.full{grid-column:1/-1}.v2-record-form-grid input,.v2-record-form-grid select,.v2-record-form-grid textarea{width:100%;min-height:44px;padding:10px 12px;border:1px solid #dedbea;border-radius:11px;color:#302a54;background:#fff}.v2-record-form-grid textarea{min-height:150px;line-height:1.6;resize:vertical}.v2-input-suffix{position:relative}.v2-input-suffix input{padding-right:46px}.v2-input-suffix span{position:absolute;top:50%;right:12px;color:#77728c;font-size:12px;transform:translateY(-50%)}.v2-field-help{color:#77728c;font-size:12px}.v2-anamnese-explain{padding:18px;border:1px solid #dedbea;border-radius:13px;background:#faf9ff}.v2-anamnese-explain strong{color:#292361}.v2-anamnese-explain p{margin:6px 0 0!important;line-height:1.6}.v2-detail-grid{display:grid!important;grid-template-columns:repeat(2,1fr);gap:12px}.v2-detail-grid>div{padding:13px;border:1px solid #e7e4f1;border-radius:11px;background:#faf9fd}.v2-detail-grid h3{margin-bottom:5px}.v2-detail-loading,.v2-detail-error{display:grid;min-height:300px;padding:35px;place-content:center;text-align:center}.v2-detail-loading span{width:38px;height:38px;margin:0 auto 14px;border:3px solid #ece9f8;border-top-color:#5b4fc2;border-radius:50%;animation:v2-spin .8s linear infinite}.v2-detail-error p{color:#77728c}.v2-detail-error button{margin:16px auto 0}.v2-legacy-note{margin-top:15px;padding:12px;border-radius:10px;color:#805700;background:#fff5d9;font-size:12px}.v2-file-actions{display:flex;gap:9px;margin-top:16px}@keyframes v2-spin{to{transform:rotate(360deg)}}@media(max-width:620px){.v2-record-form-grid,.v2-detail-grid{grid-template-columns:1fr}.v2-record-form-grid .field.full{grid-column:auto}.v2-file-actions{align-items:stretch;flex-direction:column}.v2-file-actions .aps-btn{width:100%}}
@media(max-width:780px){body[data-page="prontuarios"] .record-shell{width:100%;min-width:0;grid-template-columns:minmax(0,1fr)!important}body[data-page="prontuarios"] .record-shell>.patient-panel,body[data-page="prontuarios"] .record-shell>.record,body[data-page="prontuarios"] .record-body,body[data-page="prontuarios"] .body-grid,body[data-page="prontuarios"] .overview{width:100%;min-width:0}body[data-page="prontuarios"] .patient-list{max-width:100%;overflow-x:auto}body[data-page="prontuarios"] .entry-title{align-items:flex-start;flex-direction:column}body[data-page="prontuarios"] .entry-tags{flex-wrap:wrap}}
body[data-page="dashboard"] .next-card{color:#fff!important;background:radial-gradient(circle at 96% 0,rgba(150,140,255,.28),transparent 34%),linear-gradient(145deg,#342d76,#211c52)!important}
body[data-page="dashboard"] .next-card .next-patient,body[data-page="dashboard"] .next-card .next-time{color:#fff!important}
.v2-metric-action{position:relative;width:100%;border:1px solid var(--aps-border);color:inherit;text-align:left;font:inherit;cursor:pointer;transition:transform .16s,box-shadow .16s,border-color .16s}.v2-metric-action:hover{border-color:#c9c3f2;box-shadow:0 12px 28px rgba(35,29,88,.09);transform:translateY(-2px)}.v2-metric-action:active{transform:translateY(0)}.v2-metric-action:focus-visible{outline:3px solid rgba(91,79,194,.24);outline-offset:2px}.v2-card-link{display:block;margin-top:9px;color:#574bc2;font-size:11px;font-weight:800}.v2-attendance-row{display:flex;align-items:flex-end;justify-content:space-between;gap:10px}.v2-sparkline{width:92px;height:36px;overflow:visible}.v2-sparkline polyline{fill:none;stroke:#574bc2;stroke-linecap:round;stroke-linejoin:round;stroke-width:3}.v2-attendance-meta{min-height:30px;margin-top:7px;color:#77728c;font-size:11px;line-height:1.35}.v2-local-skeleton{min-height:110px;border-radius:12px;background:linear-gradient(100deg,#f3f1f9 20%,#faf9fd 40%,#f3f1f9 60%);background-size:220% 100%;animation:v2-skeleton 1.1s infinite}.next-card .v2-local-skeleton{background:linear-gradient(100deg,rgba(255,255,255,.07) 20%,rgba(255,255,255,.16) 40%,rgba(255,255,255,.07) 60%);background-size:220% 100%}@keyframes v2-skeleton{to{background-position:-220% 0}}.v2-dashboard-actions{display:flex;gap:6px}.v2-useful-empty>div{display:flex;justify-content:center;flex-wrap:wrap;gap:8px;margin-top:16px}.v2-useful-empty .aps-btn{min-height:40px}.booking-page-actions{display:flex;flex-wrap:wrap;gap:8px}
/* Titulo e data das pendencias eram <span> inline dentro de outro <span>:
   colavam numa linha so ("Maria ainda nao confirmou25 de jul."). */
.v2-attention-item>span:not([class]){display:grid;min-width:0}
.v2-attention-title,.v2-attention-meta{display:block;overflow-wrap:anywhere}
.v2-attend-top{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:22px}
.v2-attend-status{flex:none;padding:3px 10px;border-radius:999px;font-size:11px;font-weight:800;letter-spacing:.02em;white-space:nowrap}
.v2-attend-status.ok{color:#04503a;background:#a7f3d0}
.v2-attend-status.warn{color:#6b4700;background:#fde68a}
.v2-attend-name{overflow-wrap:anywhere}
.v2-message-modal{position:fixed;inset:0;z-index:14000;display:none;place-items:center;overflow:auto;padding:20px;background:rgba(26,22,67,.58);backdrop-filter:blur(6px)}.v2-message-modal.open{display:grid}.v2-message-modal>section{width:min(590px,100%);max-height:min(760px,calc(100dvh - 32px));overflow:auto;padding:24px}.v2-message-modal header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.v2-message-modal h2{margin:5px 0 0;color:#292361;font-size:23px}.v2-message-patient{display:flex;align-items:center;gap:12px;margin:19px 0;padding:13px;border:1px solid #e4e1f1;border-radius:13px;background:#faf9ff}.v2-message-patient strong,.v2-message-patient span{display:block}.v2-message-patient strong{color:#292361}.v2-message-patient div>span{margin-top:3px;color:#77728c;font-size:13px}.v2-message-field{display:grid;gap:7px;color:#514d67;font-size:13px;font-weight:750}.v2-message-field textarea{width:100%;min-height:138px;padding:12px;border:1px solid #dcd8ed;border-radius:12px;color:#302a54;background:#fff;font:14px/1.55 inherit;resize:vertical}.v2-message-field textarea:focus{border-color:#6659c7;outline:3px solid rgba(91,79,194,.14)}.v2-message-field small{text-align:right;color:#77728c;font-weight:500}.v2-message-preview{margin-top:14px;padding:13px;border:1px solid #e8e5f2;border-radius:12px;background:#f7f6fb}.v2-message-preview>span{color:#77728c;font-size:11px;font-weight:800;text-transform:uppercase}.v2-message-preview p{max-height:115px;overflow:auto;margin:7px 0 0;color:#35304f;font-size:13px;line-height:1.55;white-space:pre-wrap}.v2-message-feedback{min-height:20px;margin:12px 0 0;color:#68637b;font-size:12px}.v2-message-feedback.success{color:#087b5b}.v2-message-feedback.error{color:#b42345}.v2-message-feedback.loading{color:#574bc2}.v2-message-modal footer{display:flex;justify-content:flex-end;gap:9px;margin-top:17px;padding-top:16px;border-top:1px solid #e8e5f2}.v2-modal-open{overflow:hidden}
.v2-message-field select,.v2-message-field input[type="text"],.v2-message-field input[type="file"]{width:100%;padding:10px 12px;border:1px solid #dcd8ed;border-radius:12px;color:#302a54;background:#fff;font:14px/1.4 inherit}.v2-message-field select:focus,.v2-message-field input[type="text"]:focus{border-color:#6659c7;outline:3px solid rgba(91,79,194,.14)}.v2-message-field+.v2-message-field{margin-top:14px}
.v2-help-menu{display:grid;gap:10px;margin-top:6px}.v2-help-option{display:flex;align-items:center;gap:12px;width:100%;padding:14px;border:1px solid #e4e1f1;border-radius:13px;background:#faf9ff;color:#292361;text-align:left;font:inherit;cursor:pointer;text-decoration:none}.v2-help-option:hover,.v2-help-option:focus-visible{border-color:#6659c7;background:#f2effc}.v2-help-option-icon{flex:none;display:grid;place-items:center;width:38px;height:38px;border-radius:10px;background:#eeebfa;font-size:18px}.v2-help-option strong{display:block;color:#292361;font-size:14px}.v2-help-option small{display:block;margin-top:2px;color:#77728c;font-size:12.5px;font-weight:500}
.v2-help-sucesso{display:grid;gap:10px;color:#35304f;font-size:14px;line-height:1.55}.v2-help-sucesso a{color:#5b4fc2;font-weight:700}.v2-help-protocolo code{padding:2px 7px;border-radius:6px;background:#f2effc;color:#292361;font-size:13px}.v2-help-sucesso footer{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:9px;margin-top:6px;padding-top:14px;border-top:1px solid #e8e5f2}
.v2-help-chat{display:flex;flex-direction:column;gap:10px;min-height:0}.v2-help-chat-voltar{align-self:flex-start;padding:2px 0;border:0;background:none;color:#5b4fc2;font:inherit;font-weight:700;font-size:13px;cursor:pointer}.v2-help-chat-voltar:hover,.v2-help-chat-voltar:focus-visible{text-decoration:underline}
.v2-chat-banner{margin:0;padding:8px 12px;border-radius:10px;background:#f2effc;color:#514d67;font-size:12.5px;line-height:1.5}.v2-chat-banner--humano{background:#e3f8ef;color:#04503a}
.v2-help-chat-mensagens{display:flex;flex-direction:column;gap:9px;min-height:200px;max-height:340px;overflow-y:auto;padding:12px;border:1px solid #e8e5f2;border-radius:13px;background:#fbfaff}.v2-help-chat-vazio{margin:auto;max-width:34ch;color:#8a86a0;font-size:13px;text-align:center;line-height:1.5}.v2-help-chat-erro{margin:0;color:#b42345;font-size:12.5px}
.v2-chat-msg{max-width:82%;padding:9px 12px;border-radius:14px;font-size:13.5px;line-height:1.5;overflow-wrap:anywhere}.v2-chat-msg p{margin:0;white-space:pre-wrap}.v2-chat-msg-rotulo{display:block;margin-bottom:2px;color:inherit;font-size:10.5px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;opacity:.62}
.v2-chat-msg--voce{align-self:flex-end;border-bottom-right-radius:4px;background:#5b4fc2;color:#fff}.v2-chat-msg--bot,.v2-chat-msg--humano{align-self:flex-start;border-bottom-left-radius:4px;background:#eeebfa;color:#292361}.v2-chat-msg--humano{background:#e3f8ef;color:#054a37}
.v2-chat-msg--carregando{color:#77728c;animation:v2-chat-pulso 1.3s ease-in-out infinite}
@keyframes v2-chat-pulso{0%,100%{opacity:.55}50%{opacity:1}}
@media(prefers-reduced-motion:reduce){.v2-chat-msg--carregando{animation:none;opacity:.75}}
.v2-help-chat-form{display:flex;align-items:flex-end;gap:8px}.v2-help-chat-form textarea{flex:1;min-height:42px;max-height:120px;padding:10px 12px;border:1px solid #dcd8ed;border-radius:12px;color:#302a54;background:#fff;font:14px/1.4 inherit;resize:vertical}.v2-help-chat-form textarea:focus{border-color:#6659c7;outline:3px solid rgba(91,79,194,.14)}.v2-help-chat-form .aps-btn{flex:none}
.v2-help-chat-alt{margin:0;color:#9490a6;font-size:11.5px;text-align:center}.v2-help-chat-alt a{color:#8078b0}
@media(max-width:600px){.v2-help-option{padding:12px}}
@media(max-width:780px){body[data-page="dashboard"] .metrics{grid-template-columns:1fr 1fr!important}body[data-page="dashboard"] .workspace{grid-template-columns:1fr!important}body[data-page="dashboard"] .appointment{grid-template-columns:52px minmax(0,1fr) auto!important}body[data-page="dashboard"] .appointment .aps-badge{display:none}body[data-page="dashboard"] .content{width:calc(100% - 24px)!important}body[data-page="patient"] .main,body[data-page="paciente"] .main{margin-left:0!important}}
@media(max-width:520px){body[data-page="dashboard"] .metrics{grid-template-columns:1fr!important}.v2-metric-action{min-height:132px}.v2-attendance-card{min-height:170px}body[data-page="dashboard"] .appointment{grid-template-columns:48px minmax(0,1fr) auto!important;padding:11px 8px!important}.v2-dashboard-actions{flex-direction:column}.booking-page-actions .aps-btn{width:100%}.v2-message-modal{place-items:end center;padding:0}.v2-message-modal>section{width:100%;max-height:calc(100dvh - env(safe-area-inset-top) - 8px);padding:18px 16px calc(18px + env(safe-area-inset-bottom));border-radius:20px 20px 0 0}.v2-message-modal footer{position:sticky;bottom:-18px;margin-left:-16px;margin-right:-16px;padding:13px 16px calc(4px + env(safe-area-inset-bottom));background:#fff}.v2-message-modal footer .aps-btn{flex:1;min-height:46px}.v2-message-field textarea{min-height:120px;font-size:16px}.v2-message-preview{display:none}.v2-help-chat-mensagens{max-height:none;flex:1}.v2-help-chat-form{position:sticky;bottom:-18px;margin-left:-16px;margin-right:-16px;padding:10px 16px calc(4px + env(safe-area-inset-bottom));background:#fff}.v2-help-chat-form textarea{font-size:16px}}
@media(max-width:360px){body[data-page="dashboard"] .content{width:calc(100% - 16px)!important}.v2-useful-empty>div{display:grid}.v2-useful-empty .aps-btn{width:100%}.v2-message-modal footer{display:grid;grid-template-columns:1fr}.v2-message-modal footer .aps-btn{width:100%}}
@media (prefers-reduced-motion: reduce) { *,*::before,*::after { scroll-behavior:auto!important; transition-duration:.01ms!important; } }
body[data-page="dashboard"] .appointment .patient>div{min-width:0}body[data-page="dashboard"] .appointment .patient-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.v2-booking-qr-modal{position:fixed;inset:0;z-index:14500;display:none;place-items:center;overflow:auto;padding:18px;background:rgba(26,22,67,.6);backdrop-filter:blur(6px)}.v2-booking-qr-modal.open{display:grid}.v2-booking-qr-modal>section{width:min(460px,100%);max-height:calc(100dvh - 28px);overflow:auto;padding:23px;text-align:center}.v2-booking-qr-modal header{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;text-align:left}.v2-booking-qr-modal h2{margin:5px 0 0;color:#292361;font-size:21px}.v2-booking-qr-modal img{display:block;width:min(290px,82vw);height:auto;margin:20px auto 14px;border:1px solid #e4e1f1;border-radius:16px}.v2-booking-qr-modal>section>strong{display:block;color:#292361}.v2-booking-qr-modal>section>p{overflow-wrap:anywhere;margin:7px 0 0;color:#68637b;font-size:12px;line-height:1.5}.v2-booking-qr-modal footer{display:flex;justify-content:flex-end;gap:9px;margin-top:20px;padding-top:16px;border-top:1px solid #e8e5f2}@media(max-width:520px){.v2-booking-qr-modal{place-items:end center;padding:0}.v2-booking-qr-modal>section{width:100%;max-height:calc(100dvh - env(safe-area-inset-top) - 8px);padding:18px 16px calc(18px + env(safe-area-inset-bottom));border-radius:20px 20px 0 0}.v2-booking-qr-modal footer .aps-btn{flex:1;min-height:46px}}
.v2-draft-status{display:inline-flex;align-items:center;gap:6px;margin-top:8px;padding:3px 10px;border-radius:20px;color:#6b6580;background:#f1eff8;font-size:12px;font-weight:700}.v2-draft-status:empty{display:none}.v2-draft-status[data-tone="saving"]{color:#5146b8;background:#eeecff}.v2-draft-status[data-tone="saved"]{color:#0a7a4a;background:#e3f7ed}.v2-draft-status[data-tone="pending"]{color:#7a5400;background:#fff3d9}.v2-draft-status[data-tone="error"]{color:#a52b44;background:#fde8ec}.v2-draft-status[data-tone="conflict"]{color:#a52b44;background:#fde8ec}.v2-draft-save-now{display:inline-flex;margin-top:8px;margin-left:8px;padding:3px 10px;border:1px solid #d9d5ec;border-radius:20px;color:#5146b8;background:#fff;font-size:12px;font-weight:700;cursor:pointer}.v2-draft-save-now[hidden]{display:none}.v2-draft-reload{border-color:#f3c6d1;color:#a52b44}.v2-draft-reload:disabled{opacity:.6;cursor:wait}
.v2-draft-recovery p{margin:0 0 14px;color:#5b5570;font-size:14px}.v2-draft-list{display:flex;flex-direction:column;gap:10px;margin-bottom:16px}.v2-draft-item{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #e4e1f1;border-radius:14px;background:#faf9fe}.v2-draft-item strong{display:block;color:#292361;font-size:14px}.v2-draft-item span{display:block;margin-top:2px;color:#6b6580;font-size:12px}.v2-draft-item-actions{display:flex;gap:8px;flex:none}.v2-draft-new{width:100%}
@media(max-width:520px){.v2-draft-item{flex-direction:column;align-items:stretch}.v2-draft-item-actions{width:100%}.v2-draft-item-actions .aps-btn{flex:1}}
.v2-modelo-bar{display:flex;align-items:center;gap:8px;margin-bottom:14px;padding:10px 12px;border:1px solid #e4e1f1;border-radius:12px;background:#faf9fe}.v2-modelo-bar label{color:#6b6580;font-size:13px;font-weight:700;white-space:nowrap}.v2-modelo-bar select{flex:1;min-width:0;height:36px;padding:0 8px;border:1px solid #e4e1f1;border-radius:9px;background:#fff;font-size:13px}.v2-modelo-manage{flex:none;padding:6px 10px;border:1px solid #d9d5ec;border-radius:9px;color:#5146b8;background:#fff;font-size:12px;font-weight:700;cursor:pointer;white-space:nowrap}
.v2-modelo-manager{display:flex;flex-direction:column;gap:14px}.v2-modelo-list{display:flex;flex-direction:column;gap:10px}.v2-modelo-item{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #e4e1f1;border-radius:14px;background:#faf9fe}.v2-modelo-item strong{display:block;color:#292361;font-size:14px}.v2-modelo-item span{display:block;margin-top:2px;color:#6b6580;font-size:12px}.v2-modelo-item-actions{display:flex;gap:6px;flex:none}.v2-modelo-item-actions button{padding:5px 9px;border:1px solid #e4e1f1;border-radius:8px;color:#5146b8;background:#fff;font-size:12px;font-weight:700;cursor:pointer}.v2-modelo-empty{color:#6b6580;font-size:14px}.v2-modelo-voltar{width:100%}
.v2-modelo-form{display:flex;flex-direction:column;gap:14px}.v2-modelo-form textarea{min-height:120px;resize:vertical;padding:12px;border:1px solid #e4e1f1;border-radius:11px;font:inherit}.v2-modelo-favorito{display:flex;align-items:center;gap:8px;color:#6b6580;font-size:13px;font-weight:700}.v2-modelo-form-actions{display:flex;justify-content:flex-end;gap:9px}
.v2-proximo-extras{margin-top:16px;padding-top:16px;border-top:1px solid #e4e1f1}.v2-proximo-extras h4{margin:0 0 10px;color:#292361;font-size:14px}.v2-proximo-extras-list{display:flex;flex-direction:column;gap:8px}.v2-proximo-extras-item{padding:10px 12px;border:1px solid #e4e1f1;border-radius:12px;background:#faf9fe}.v2-proximo-extras-tag{display:inline-block;margin-bottom:4px;color:#5146b8;font-size:11px;font-weight:700;text-transform:uppercase}.v2-proximo-extras-item p{margin:0 0 8px;color:#292361;font-size:13px}.v2-proximo-extras-actions{display:flex;gap:8px}.v2-proximo-extras-actions button{padding:5px 9px;border:1px solid #e4e1f1;border-radius:8px;color:#5146b8;background:#fff;font-size:12px;font-weight:700;cursor:pointer}
.v2-vinculo-consulta{display:flex;align-items:center;gap:8px;margin-top:14px;color:#292361;font-size:13px;font-weight:700}
@media(max-width:520px){.v2-modelo-bar{flex-wrap:wrap}.v2-modelo-bar select{flex:1 1 100%}.v2-modelo-item{flex-direction:column;align-items:stretch}.v2-modelo-item-actions{flex-wrap:wrap}}
.v2-form-error{display:flex;align-items:center;gap:8px;margin:14px 0 0;padding:10px 12px;border:1px solid #f3c6d1;border-radius:11px;color:#7a1830;background:#fde8ec;font-size:13px;font-weight:700}.v2-form-error[hidden]{display:none}
body[data-page="prontuarios"] #modal .modal{display:flex;flex-direction:column;max-height:calc(100dvh - 40px)}body[data-page="prontuarios"] #modal .modal-head,body[data-page="prontuarios"] #modal .modal-actions{flex:none}body[data-page="prontuarios"] .v2-modal-body{flex:1;min-height:0;overflow-y:auto;padding-right:2px}
@media(max-width:768px){body[data-page="prontuarios"] .modal-backdrop{align-items:flex-end;padding:0}body[data-page="prontuarios"] #modal .modal{width:100%;max-height:calc(100dvh - env(safe-area-inset-top) - 12px);border-radius:20px 20px 0 0;padding:20px 16px calc(20px + env(safe-area-inset-bottom))}body[data-page="prontuarios"] .modal-actions{flex-wrap:wrap}body[data-page="prontuarios"] .modal-actions .aps-btn,body[data-page="prontuarios"] .modal-actions .v2-draft-discard{flex:1 1 100%;min-height:46px}}

/* ===== Fase E — E1: estrutura e hierarquia ===== */
body[data-page="prontuarios"] .record-shell{grid-template-columns:322px minmax(0,1fr)}
body[data-page="prontuarios"] .record-shell>.patient-panel{grid-column:1}
body[data-page="prontuarios"] .record-shell>.record{grid-column:2}
body[data-page="prontuarios"] .body-grid{grid-template-columns:minmax(0,1fr) 258px}
body[data-page="prontuarios"] .overview{gap:8px;margin-bottom:18px}
body[data-page="prontuarios"] .overview-item{padding:10px 13px}
body[data-page="prontuarios"] .record-shell.list-collapsed{grid-template-columns:0 minmax(0,1fr)!important}
body[data-page="prontuarios"] .record-shell.list-collapsed .patient-panel{display:none}
body[data-page="prontuarios"] .patient-panel-head{display:flex;justify-content:flex-end;gap:6px;margin-bottom:6px}
body[data-page="prontuarios"] .patient-panel-close{display:none}
body[data-page="prontuarios"] .record-toolbar{padding:0 24px}
/* Onda 1 do Mobile Hardening: #back-to-hub recebe
   `textContent="← Voltar para "+nome` (painel-2.0-runtime.js) — com o
   .aps-btn base (display:inline-flex;white-space:nowrap) e sem limite de
   largura, um nome de paciente longo ("Maria Aparecida dos Santos
   Nascimento Oliveira Fernandes") empurrava o botão pra ~550px de
   largura intrínseca dentro de um .record-toolbar de ~337px em mobile —
   cortado sem reticências pelo overflow do card pai, texto sumindo no
   meio da frase.
   Testado ao vivo em staging (375px, nome real de 55 caracteres):
   max-width + overflow:hidden + text-overflow:ellipsis em cima do
   display:inline-flex do .aps-btn NÃO bastou — a caixa (getBoundingClientRect)
   ficava corretamente contida, mas o texto continuava pintado além da
   borda direita (bug conhecido: text-overflow não é garantido em
   containers flex, mesmo com overflow:hidden). display:block resolve
   porque é exatamente a combinação clássica que todo navegador suporta
   (block + white-space:nowrap + overflow:hidden + text-overflow:ellipsis
   no MESMO elemento) — sem depender do algoritmo de flex. text-align:
   center mantém a aparência de botão centralizado que o inline-flex dava
   (não há ícone aqui, só texto, então não perde nada trocando de flex
   pra block).
   #switch-patient-btn ("☰ Trocar paciente") nunca teve esse problema —
   texto sempre fixo, sem interpolar nome — por isso não precisou do
   mesmo tratamento. */
body[data-page="prontuarios"] #back-to-hub{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}
body[data-page="prontuarios"] #switch-patient-btn{margin:14px 0 2px}
body[data-page="prontuarios"] #switch-patient-btn[hidden]{display:none}
@media(max-width:1120px){
  body[data-page="prontuarios"] .record-shell{grid-template-columns:minmax(0,1fr)!important}
  body[data-page="prontuarios"] .record-shell>.record{grid-column:1}
  body[data-page="prontuarios"] .body-grid{grid-template-columns:minmax(0,1fr)}
  body[data-page="prontuarios"] .patient-panel{display:none}
  body[data-page="prontuarios"] .patient-panel.open{display:flex;flex-direction:column;position:fixed;inset:0;z-index:200;padding:16px;overflow-y:auto;background:#fff;border-radius:0}
  body[data-page="prontuarios"] .patient-panel.open .patient-list{display:flex;flex-direction:column;overflow:visible}
  body[data-page="prontuarios"] .patient-panel.open .patient{min-width:0}
  body[data-page="prontuarios"] .patient-panel-close{display:inline-flex}
  body[data-page="prontuarios"] #toggle-patient-list{display:none}
  body[data-page="prontuarios"] #switch-patient-btn{display:inline-flex}
  body[data-page="prontuarios"] .record-toolbar{padding:12px 16px 0}
}

/* ===== Fase E — E2: densidade e organização ===== */
body[data-page="prontuarios"] .pendencias-section{margin-bottom:16px}
body[data-page="prontuarios"] .pendencias-head{display:flex;align-items:center;gap:8px;width:100%;padding:8px 2px;border:0;background:none;cursor:pointer;text-align:left;font:inherit}
body[data-page="prontuarios"] .pendencias-head:hover .pendencias-title,body[data-page="prontuarios"] .pendencias-head:focus-visible .pendencias-title{text-decoration:underline}
body[data-page="prontuarios"] .pendencias-head:focus-visible{outline:3px solid rgba(91,79,194,.18);outline-offset:2px;border-radius:8px}
body[data-page="prontuarios"] .pendencias-title{color:var(--aps-primary);font-size:14px;font-weight:750}
body[data-page="prontuarios"] .pendencias-count{padding:1px 9px;border-radius:999px;color:var(--aps-cta);background:var(--aps-accent-soft);font-size:12px;font-weight:800}
body[data-page="prontuarios"] .pendencias-chevron{margin-left:auto;color:var(--aps-text-muted);transition:transform .15s ease}
body[data-page="prontuarios"] .pendencias-head[aria-expanded="false"] .pendencias-chevron{transform:rotate(-90deg)}
body[data-page="prontuarios"] .pendencia-row{display:flex;align-items:center;gap:10px;width:100%;padding:10px 4px;border:0;border-bottom:1px solid var(--aps-border);background:none;cursor:pointer;text-align:left;font:inherit}
body[data-page="prontuarios"] .pendencia-row:last-child{border-bottom:0}
body[data-page="prontuarios"] .pendencia-row:hover,body[data-page="prontuarios"] .pendencia-row:focus-visible{background:var(--aps-surface-subtle);outline:none}
/* Sem min-width:0, um titulo comprido (ex.: "Anamnese respondida aguardando
   revisão") nunca encolhe dentro do flex row — empurra a tag e a acao pra
   fora da tela em qualquer largura mobile (achado ao vivo em 360/390px). */
body[data-page="prontuarios"] .pendencia-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body[data-page="prontuarios"] .pendencia-tag{flex:none}
body[data-page="prontuarios"] .pendencia-action{flex:none;color:var(--aps-cta);font-size:12px;font-weight:750;white-space:nowrap}
body[data-page="prontuarios"] .support-card{padding:14px}
body[data-page="prontuarios"] .support-divider{margin:14px 0;border-top:1px solid var(--aps-border)}
body[data-page="prontuarios"] .support-block h3{margin:0}
body[data-page="prontuarios"] .support-privacy-note{display:flex;align-items:center;gap:8px;margin:10px 2px 0;color:var(--aps-text-muted);font-size:12px;line-height:1.4}
body[data-page="prontuarios"] .timeline{padding-left:20px}
body[data-page="prontuarios"] .entry{padding-bottom:24px}
body[data-page="prontuarios"] .entry-card{border-color:rgba(222,219,238,.75)}
@media(max-width:1120px){body[data-page="prontuarios"] .side-context{grid-template-columns:1fr}}
@media(max-width:520px){body[data-page="prontuarios"] .pendencia-row{align-items:flex-start}}

/* ===== Fase E — E3: mobile e acessibilidade ===== */
body[data-page="prontuarios"] .support-block-head{display:flex;align-items:center;width:100%;border:0;background:none;cursor:pointer;text-align:left;font:inherit}
body[data-page="prontuarios"] .support-block-head:focus-visible{outline:3px solid rgba(91,79,194,.18);outline-offset:2px;border-radius:8px}
body[data-page="prontuarios"] .support-chevron{margin-left:auto;color:var(--aps-text-muted);transition:transform .15s ease}
body[data-page="prontuarios"] .support-block-head[aria-expanded="false"] .support-chevron{transform:rotate(-90deg)}
body[data-page="prontuarios"] .support-block-body{margin-top:8px}
@media(max-width:780px){
  body[data-page="prontuarios"] .patient-panel.open{padding-bottom:calc(16px + env(safe-area-inset-bottom))}
}
body[data-page="prontuarios"] .patient-list-empty{margin:18px 4px;color:var(--aps-text-muted);font-size:13px;text-align:center}

/* ===== Fix: cadência média e navegação da pendência "próximo encontro" ===== */
body[data-page="prontuarios"] .ovalue-hint{margin-top:3px;color:var(--aps-text-muted);font-size:11px;line-height:1.3}
body[data-page="prontuarios"] #proximo-card{scroll-margin-top:90px}
body[data-page="prontuarios"] #proximo-card-title:focus{outline:3px solid rgba(91,79,194,.28);outline-offset:3px;border-radius:4px}
@keyframes v2HighlightPulse{0%{box-shadow:0 0 0 3px rgba(91,79,194,.4)}100%{box-shadow:0 0 0 3px rgba(91,79,194,0)}}
body[data-page="prontuarios"] .v2-highlight-pulse{animation:v2HighlightPulse 1.4s ease-out}

/* =====================================================================
   Camada mobile compartilhada — aplica o padrao aprovado no Dashboard
   a todas as paginas do painel. Nada aqui vale acima de 780px.
   ===================================================================== */
@media(max-width:780px){
  /* Qualquer campo trazido para a tela (validacao, foco, deep-link) precisa
     parar ABAIXO do cabecalho fixo. Sem isto o navegador rolava o campo
     exatamente para o topo da janela — ou seja, para debaixo do topbar de
     61px, deixando o campo com erro pela metade ou invisivel. */
  body[data-page] input,body[data-page] select,body[data-page] textarea,
  body[data-page] .escala-item,body[data-page] .day-row,body[data-page] .field{scroll-margin-top:86px;scroll-margin-bottom:110px}

  /* --- Alvos de toque --- */
  body[data-page] .aps-btn{min-height:44px}
  body[data-page] .aps-icon-btn{min-width:44px;min-height:44px}
  body[data-page] .filter-tabs button,body[data-page] .period-tabs button,body[data-page] .chip,body[data-page] .reason-chip{min-height:44px}
  body[data-page] select,body[data-page] input[type="text"],body[data-page] input[type="email"],body[data-page] input[type="tel"],body[data-page] input[type="date"],body[data-page] input[type="time"],body[data-page] input[type="number"],body[data-page] input[type="password"],body[data-page] input[type="search"]{min-height:46px}
  /* 16px evita o zoom automatico do iOS ao focar um campo */
  body[data-page] input,body[data-page] select,body[data-page] textarea{font-size:16px}
  body[data-page] .text-button,body[data-page] .panel-link,body[data-page] .section-link{display:inline-flex;align-items:center;min-height:44px;padding-inline:6px}
  body[data-page] [data-delete-document],body[data-page] .remove-slot,body[data-page] .slot-remove{min-width:40px;min-height:40px}

  /* --- Formularios em grade viram coluna unica --- */
  body[data-page] .form-grid,body[data-page] .v2-record-form-grid,body[data-page] .v2-edit-grid,body[data-page] .settings-grid{grid-template-columns:minmax(0,1fr)!important}
  body[data-page] .form-grid .field.full,body[data-page] .v2-record-form-grid .field.full,body[data-page] .v2-edit-grid label.full{grid-column:auto}
  body[data-page] .field label,body[data-page] label{font-size:13.5px}

  /* --- Filtros em faixa rolavel horizontal, sem estourar a pagina --- */
  body[data-page] .filter-tabs,body[data-page] .period-tabs{display:flex;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
  body[data-page] .filter-tabs::-webkit-scrollbar,body[data-page] .period-tabs::-webkit-scrollbar{display:none}
  body[data-page] .filter-tabs button,body[data-page] .period-tabs button{flex:none;white-space:nowrap}

  /* --- Modais: formulario ocupa a tela, com rodape de acao sempre visivel --- */
  body[data-page] .modal-backdrop{align-items:flex-end;padding:0}
  body[data-page] .modal-backdrop.open{display:flex}
  body[data-page] .modal-backdrop>.modal{display:flex;flex-direction:column;width:100%;max-width:none;max-height:calc(100dvh - env(safe-area-inset-top) - 10px);margin:0;padding:0;border-radius:20px 20px 0 0}
  body[data-page] .modal-backdrop>.modal>.modal-head{flex:none;position:sticky;top:0;z-index:2;margin:0;padding:18px 16px 12px;border-bottom:1px solid var(--aps-border,#e3e1ef);background:#fff;border-radius:20px 20px 0 0}
  body[data-page] .modal-backdrop>.modal>.modal-head h2{font-size:18px}
  body[data-page] .modal-backdrop>.modal>:not(.modal-head):not(.modal-actions){flex:0 1 auto;overflow-y:auto;margin:0;padding:0 16px}
  body[data-page] .modal-backdrop>.modal>:nth-child(2){padding-top:14px}
  body[data-page] .modal-backdrop>.modal>.modal-actions{flex:none;position:sticky;bottom:0;z-index:2;flex-wrap:wrap;gap:8px;margin:0;padding:12px 16px calc(12px + env(safe-area-inset-bottom));border-top:1px solid var(--aps-border,#e3e1ef);background:#fff}
  body[data-page] .modal-backdrop>.modal>.modal-actions .aps-btn{flex:1 1 130px;min-height:48px}
  /* Confirmacoes curtas ficam centradas, nao ocupam a tela toda */
  body[data-page] .modal-backdrop.v2-confirm{align-items:center;padding:18px}
  /* Cancelamentos usa .cancel-modal-bg/.cancel-modal (nao .modal-backdrop/.modal),
     entao nao herdava nada da folha de rodape acima — "Salvar politica" e
     "Registrar e liberar horario" abriam num cartao so com scroll interno,
     sem area segura no rodape. Mesmo tratamento de folha inferior, adaptado
     a estrutura propria (h2/.cancel-modal-copy/.form-grid/footer diretos). */
  body[data-page="cancelamentos"] .cancel-modal-bg{align-items:flex-end;padding:0}
  body[data-page="cancelamentos"] .cancel-modal-bg.open{display:flex}
  body[data-page="cancelamentos"] .cancel-modal{display:flex;flex-direction:column;width:100%;max-width:none;max-height:calc(100dvh - env(safe-area-inset-top) - 10px);margin:0;padding:0;border-radius:20px 20px 0 0;overflow:hidden}
  body[data-page="cancelamentos"] .cancel-modal>h2{flex:none;margin:0;padding:18px 16px 4px;font-size:18px}
  body[data-page="cancelamentos"] .cancel-modal>.cancel-modal-copy{flex:none;margin:0;padding:0 16px 12px}
  body[data-page="cancelamentos"] .cancel-modal>.form-grid{flex:0 1 auto;overflow-y:auto;margin:0;padding:0 16px}
  body[data-page="cancelamentos"] .cancel-modal>.modal-actions{flex:none;position:sticky;bottom:0;z-index:2;margin:0;padding:12px 16px calc(12px + env(safe-area-inset-bottom));border-top:1px solid var(--aps-border,#e3e1ef);background:#fff}
  body[data-page="cancelamentos"] .cancel-modal>.modal-actions .aps-btn{flex:1 1 130px;min-height:48px}
  body[data-page] .modal-backdrop.v2-confirm>.modal{border-radius:18px;max-height:min(70dvh,520px)}

  /* --- Cabecalho de pagina ---
     O titulo da tela ja aparece na barra superior do app, entao o bloco
     "kicker + h1 + paragrafo" so repetia a informacao e custava ~140px de
     rolagem em cada pagina. O h1 continua no DOM para leitores de tela.
     paciente/solicitacao ficam de fora: la o h1 traz o nome, que a barra
     superior nao mostra. */
  body[data-page]:not([data-page="paciente"]):not([data-page="solicitacao"]) .page-head h1{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
  body[data-page]:not([data-page="paciente"]):not([data-page="solicitacao"]) .page-head .aps-kicker,
  body[data-page]:not([data-page="paciente"]):not([data-page="solicitacao"]) .page-head .page-copy,
  body[data-page]:not([data-page="paciente"]):not([data-page="solicitacao"]) .page-head>div>p{display:none}
  body[data-page] .page-head{margin-bottom:12px}
  body[data-page="paciente"] .page-head h1,body[data-page="solicitacao"] .page-head h1{font-size:22px!important;margin:2px 0 5px}
  body[data-page] .content{padding-top:14px!important}

  /* --- Cards de resumo no padrao 2x2 do Dashboard --- */
  body[data-page] .summary{grid-template-columns:1fr 1fr!important;gap:9px!important;margin-bottom:14px!important}
  body[data-page] .summary-card{gap:10px;min-height:66px!important;padding:11px!important}
  body[data-page] .summary-icon{width:30px!important;height:30px!important;font-size:13px!important}
  body[data-page] .summary-value{font-size:19px!important;letter-spacing:-.04em}
  body[data-page] .summary-label{margin-top:2px;color:var(--aps-text-secondary)!important;font-size:12px!important;line-height:1.25}

  /* Pista de que a faixa de abas rola para os lados. A sombra so aparece do
     lado em que ainda ha conteudo escondido. */
  body[data-page] .v2-scroll-start,body[data-page] .v2-scroll-end{position:relative;-webkit-mask-image:var(--v2-mask);mask-image:var(--v2-mask)}
  body[data-page] .v2-scroll-end{--v2-mask:linear-gradient(to right,#000 calc(100% - 26px),rgba(0,0,0,.15))}
  body[data-page] .v2-scroll-start{--v2-mask:linear-gradient(to left,#000 calc(100% - 26px),rgba(0,0,0,.15))}
  body[data-page] .v2-scroll-start.v2-scroll-end{--v2-mask:linear-gradient(to right,rgba(0,0,0,.15),#000 26px,#000 calc(100% - 26px),rgba(0,0,0,.15))}

  /* --- Estados vazios e feedback --- */
  body[data-page] .aps-empty{padding:22px 16px}
  body[data-page] .aps-empty .aps-btn{width:100%;margin-top:12px}
  body[data-page] .aps-state{padding:26px 16px}

  /* ===================== AGENDA ===================== */
  /* A moldura de card da agenda-shell vira container transparente: assim a
     barra de ferramentas, o proximo atendimento e a lista viram blocos
     irmaos, como no Dashboard, em vez de cards dentro de card. */
  body[data-page="agenda"] .agenda-shell{padding:0;border:0;background:none;box-shadow:none;overflow:visible}
  body[data-page="agenda"] .agenda-grid{display:flex;flex-direction:column;align-items:stretch;gap:12px;margin-top:12px}
  body[data-page="agenda"] .day-aside{display:contents}
  /* Proximo atendimento com o mesmo tratamento de heroi do Dashboard */
  body[data-page="agenda"] .aside-card{order:1;padding:18px;color:#fff;border:0;background:radial-gradient(circle at 96% 0,rgba(150,140,255,.3),transparent 38%),linear-gradient(150deg,#342d76,#211c52);box-shadow:0 18px 42px rgba(38,33,92,.19)}
  body[data-page="agenda"] .aside-card .aps-kicker{color:#bcb7ff}
  body[data-page="agenda"] .aside-card h3{margin:9px 0 0;color:#fff;font-size:20px}
  body[data-page="agenda"] .aside-card p{margin:5px 0 0;color:rgba(255,255,255,.74);font-size:13px}
  body[data-page="agenda"] .aside-card .aps-btn{width:100%;margin-top:14px;min-height:48px;color:#292361;border:0;background:#fff}
  body[data-page="agenda"] .schedule{order:2;min-width:0}
  body[data-page="agenda"] .head-actions{margin-top:0}
  body[data-page="agenda"] .head-actions .aps-btn{min-height:48px}

  /* Barra de ferramentas: periodo numa faixa, navegacao de data e filtros na outra */
  body[data-page="agenda"] .toolbar{order:0;flex-direction:column;align-items:stretch;gap:10px;padding:13px;border:1px solid var(--aps-border);border-radius:15px;background:#fff}
  body[data-page="agenda"] .toolbar-right{display:flex;align-items:center;gap:8px}
  body[data-page="agenda"] .date-nav{flex:1;justify-content:space-between}
  body[data-page="agenda"] .date-label{min-width:0;flex:1;font-size:13.5px}
  body[data-page="agenda"] .toolbar .aps-icon-btn{flex:none}
  /* O select de status nao some mais: vai para a folha de filtros */
  body[data-page="agenda"] .toolbar>.compact-select{display:none}

  /* Cartao de consulta: horario e status na primeira linha, paciente na
     segunda, acoes na terceira. Antes o status e o botao principal eram
     escondidos no mobile.
     :not(.agenda-popover-card) em .appointment e .aps-badge abaixo: bug
     real achado em produção (achado ao vivo por usuário real, ver
     MOBILE_HARDENING_POST_RELEASE.md) — o card do bottom sheet de evento
     da Agenda 4.0 (agendaPopoverAppointmentHtml) reaproveita a classe
     .appointment por herança histórica, mas tem uma estrutura de conteúdo
     totalmente diferente (cabeçalho/ações/status/outras ações, não
     appointment-time/patient/appointment-actions). O display:grid
     !important genérico aqui forçava esse card novo pra um grid de 2
     colunas que ele não foi desenhado pra usar: o cabeçalho
     (nome+horário+badge) virava um item de grid espremido contra os
     botões de ação (que ficam no outro lado), colapsando o nome do
     paciente pra 0px de largura — cada letra numa linha própria. */
  body[data-page="agenda"] .day-group+.day-group{margin-top:18px}
  body[data-page="agenda"] .day-date{font-size:14px}
  body[data-page="agenda"] .appointment-list{gap:9px}
  body[data-page="agenda"] .appointment:not(.agenda-popover-card){display:grid!important;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:9px 10px;min-height:0;padding:13px}
  body[data-page="agenda"] .appointment::before{inset:13px auto 13px 0}
  body[data-page="agenda"] .appointment .appointment-time{grid-column:1;grid-row:1;font-size:17px}
  body[data-page="agenda"] .appointment:not(.agenda-popover-card) .aps-badge{display:inline-flex!important;grid-column:2;grid-row:1;justify-self:end}
  body[data-page="agenda"] .appointment .patient{grid-column:1/-1;grid-row:2;gap:10px}
  body[data-page="agenda"] .appointment .patient-name{font-size:15px}
  body[data-page="agenda"] .appointment .patient-meta{font-size:12.5px;color:var(--aps-text-secondary)}
  body[data-page="agenda"] .appointment .appointment-actions{grid-column:1/-1;grid-row:3;display:flex;gap:8px;padding-top:2px}
  body[data-page="agenda"] .appointment .small-action{display:inline-flex!important;flex:1;min-height:44px;font-size:13.5px}
  body[data-page="agenda"] .appointment .context{flex:none}
  /* Por padrao o menu cai para baixo; sobe so quando nao ha espaco embaixo
     e cabe inteiro acima (classe posta por setupContextMenuFlip). */
  body[data-page] .context-menu,body[data-page] .record-more-wrap .context-menu{width:min(240px,calc(100vw - 32px))}
  body[data-page] .context.v2-menu-up .context-menu,
  body[data-page] .record-more-wrap.v2-menu-up .context-menu{top:auto;bottom:calc(100% + 6px)}

  /* ===================== PACIENTES ===================== */
  /* Tocar num paciente ja navega para paciente.html, que traz as mesmas
     acoes (prontuario, agendar, mensagem). O painel de detalhe da lista e
     um preview de desktop: no celular so repetia o primeiro paciente e
     custava ~1200px de rolagem depois da lista. */
  body[data-page="pacientes"] .detail-panel{display:none}
  body[data-page="pacientes"] .patients-shell{gap:0}
  body[data-page="pacientes"] .list-panel{padding:13px}
  body[data-page="pacientes"] .list-toolbar{flex-direction:column;align-items:stretch;gap:9px;margin-bottom:13px}
  /* .patient-search tem `flex:1 1 220px` (pacientes-3.0.css) pensado pro
     eixo principal HORIZONTAL do toolbar em desktop (220px é uma largura
     inicial razoável). Com flex-direction:column aqui no mobile, o eixo
     principal vira vertical — o mesmo flex-basis:220px passa a virar
     ALTURA, inflando a busca numa caixa de 220px. auto devolve a altura
     ao conteúdo real (~46px, como o input logo abaixo já define). */
  body[data-page="pacientes"] .patient-search{flex-basis:auto}
  body[data-page="pacientes"] .patient-search input{min-height:46px}
  /* O filtro de anamnese vai para a folha de filtros */
  body[data-page="pacientes"] .list-toolbar>.patient-anamnese-filter-label{display:none}
  body[data-page="pacientes"] .patient-list{gap:9px}
  body[data-page="pacientes"] .patient-card{grid-template-columns:44px minmax(0,1fr) auto;align-items:center;gap:11px;min-height:0;padding:12px}
  body[data-page="pacientes"] .patient-avatar{width:44px;height:44px;font-size:13px}
  body[data-page="pacientes"] .patient-name{flex-wrap:wrap;gap:6px;font-size:15px}
  body[data-page="pacientes"] .patient-meta{margin-top:4px;font-size:12.5px;white-space:normal}
  body[data-page="pacientes"] .patient-next{margin-top:4px;font-size:12.5px}
  body[data-page="pacientes"] .patient-side{display:grid;justify-items:end;gap:0}
  body[data-page="pacientes"] .patient-side .last-session{display:none}
  body[data-page="pacientes"] .patient-arrow{font-size:22px;color:var(--aps-text-muted)}

  /* Ficha do paciente (tela propria) */
  body[data-page="paciente"] .content{padding-top:12px!important}
  /* O cabecalho ja tem a seta de voltar; manter tambem o link no conteudo
     deixaria duas formas de fazer a mesma coisa na mesma tela. No desktop,
     que nao tem a seta, o link continua. */
  body[data-page] .back-link{display:none}
  body[data-page="paciente"] .hero-quick,body[data-page="paciente"] .patient-actions{display:flex;flex-wrap:wrap;gap:8px}
  body[data-page="paciente"] .hero-quick .aps-btn,body[data-page="paciente"] .patient-actions .aps-btn{flex:1 1 140px;min-height:46px}

  /* ===================== PRONTUARIO ===================== */
  /* Cabecalhos que abrem e fecham secoes clinicas: eram faixas de 23-37px,
     dificeis de acertar com o polegar. */
  body[data-page="prontuarios"] .pendencias-head,
  body[data-page="prontuarios"] .support-block-head{min-height:46px;padding-block:8px}
  body[data-page="prontuarios"] .support-chevron,
  body[data-page="prontuarios"] .pendencias-chevron{font-size:17px}
  body[data-page="prontuarios"] .pendencia-row{min-height:46px}
  /* Acoes dos itens do proximo encontro */
  body[data-page="prontuarios"] .proximo-item-actions{gap:8px}
  body[data-page="prontuarios"] .proximo-item-actions button{min-height:44px;padding-inline:12px}
  body[data-page="prontuarios"] .proximo-toggle{min-height:44px}
  body[data-page="prontuarios"] .proximo-toggle input[type="checkbox"]{width:20px;height:20px}
  /* Graficos das escalas acompanham a largura disponivel */
  body[data-page="prontuarios"] .escala-chart svg{display:block;width:100%;height:auto}
  body[data-page="prontuarios"] .escala-chart{padding:10px}
  /* Heroi do prontuario: acoes em linha propria, com toque confortavel */
  body[data-page="prontuarios"] .hero-actions{width:100%;gap:8px}
  body[data-page="prontuarios"] .hero-actions .aps-btn{min-height:46px}
  body[data-page="prontuarios"] .record-message-label{display:none}
  body[data-page="prontuarios"] .hero-actions .record-message,
  body[data-page="prontuarios"] .hero-actions .record-more{flex:0 0 46px;width:46px;min-width:46px;padding:0}
  body[data-page="prontuarios"] .hero-actions .aps-btn.primary{flex:1}
  body[data-page="prontuarios"] .overview{grid-template-columns:1fr 1fr;gap:8px}
  body[data-page="prontuarios"] .overview-item{padding:11px}
  /* As quatro areas clinicas ficavam numa faixa que rolava para os lados, e
     "Plano terapeutico" e "Escalas" nasciam fora da tela - no teste real o
     usuario nao percebeu que existiam. Viram grade 2x2: todas visiveis, sem
     deslizar. O filtro sai da mesma linha para nao concorrer com elas. */
  body[data-page="prontuarios"] .section-head{display:grid;gap:10px;margin-bottom:14px}
  body[data-page="prontuarios"] .tab-switch{display:grid!important;grid-template-columns:1fr 1fr;gap:5px;width:100%;max-width:none;padding:5px;overflow:visible!important;border-radius:14px}
  body[data-page="prontuarios"] .tab-btn{min-height:48px;padding:0 8px;border-radius:10px;font-size:13.5px;white-space:normal;line-height:1.2}
  body[data-page="prontuarios"] .tab-btn.active{box-shadow:0 4px 12px rgba(83,74,183,.28);font-weight:800}
  body[data-page="prontuarios"] #toggle-filters{width:100%;min-height:46px}

  /* Plano e Escalas sao formularios longos dentro do painel (nao em modal):
     a acao principal ficava la embaixo, fora de alcance enquanto se digita.
     Vira barra fixa acima da navegacao inferior. */
  /* flex-direction:row explicito porque escalas-clinicas.css empilha o rodape
     abaixo de 600px; sem isso o flex-basis vira altura e os botoes esticam. */
  body[data-page="prontuarios"] .plano-actions,
  body[data-page="prontuarios"] .escala-footer{position:sticky;bottom:calc(68px + env(safe-area-inset-bottom));z-index:20;display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:stretch;gap:8px;margin:14px -15px -15px;padding:11px 15px calc(11px + env(safe-area-inset-bottom));border-top:1px solid var(--aps-border);background:rgba(255,255,255,.97);backdrop-filter:blur(10px)}
  body[data-page="prontuarios"] .plano-actions .aps-btn,
  body[data-page="prontuarios"] .escala-footer .aps-btn{flex:1 1 0;width:auto;height:48px;min-height:48px;max-height:48px;padding-inline:10px;font-size:14px!important}
  body.v2-keyboard-open[data-page="prontuarios"] .plano-actions,
  body.v2-keyboard-open[data-page="prontuarios"] .escala-footer{bottom:0}
  /* Itens do PHQ-9/GAD-7: pergunta em cima, opcoes embaixo, sem espremer */
  body[data-page="prontuarios"] .escala-item{grid-template-columns:minmax(0,1fr);gap:9px;padding:13px 12px}
  body[data-page="prontuarios"] .escala-item select{min-height:48px}
  body[data-page="prontuarios"] .escala-history-item{padding:14px}
  body[data-page="prontuarios"] .plano-objetivo{padding:14px}
  body[data-page="prontuarios"] .plano-panel textarea,
  body[data-page="prontuarios"] .plano-panel input{font-size:16px}
  /* "Excluir" tinha a mesma aparencia de "Editar" na linha do tempo, no
     objetivo do Plano e na aplicacao de Escala — mesmo tom usado no menu
     de documentos (v2-menu-danger), para nao inventar uma terceira cor. */
  body[data-page="prontuarios"] [data-delete-session],
  body[data-page="prontuarios"] .objetivo-actions [data-delete],
  body[data-page="prontuarios"] .escala-history-actions [data-delete]{color:#a52b44}

  /* Leitura clinica no celular: a evolucao e o texto mais lido da tela e
     estava em 14px; rotulos de apoio estavam em 11px, abaixo do que se
     consegue ler com conforto. Contraste dos rotulos tambem sobe de
     #777792 (~4,7:1) para #5c5c7a (~7:1). */
  body[data-page="prontuarios"] .entry-text{font-size:15px;line-height:1.65}
  body[data-page="prontuarios"] .entry-card{padding:14px}
  body[data-page="prontuarios"] .entry{padding-bottom:18px}
  body[data-page="prontuarios"] .olabel,
  body[data-page="prontuarios"] .resumo-updated,
  body[data-page="prontuarios"] .pendencia-tag,
  body[data-page="prontuarios"] .support-privacy-note{color:var(--aps-text-secondary)}
  body[data-page="prontuarios"] .ovalue-hint,
  body[data-page="prontuarios"] .proximo-item-tag,
  body[data-page="prontuarios"] .v2-record-status,
  body[data-page="prontuarios"] .resumo-updated,
  body[data-page="prontuarios"] .pendencia-tag{font-size:12px}
  body[data-page="prontuarios"] .proximo-item-text{font-size:14px;line-height:1.55}
  body[data-page="prontuarios"] .side-card p,
  body[data-page="prontuarios"] .v2-clinical-sections p{font-size:14.5px;line-height:1.65}
  /* Respiro dos formularios clinicos */
  body[data-page="prontuarios"] .resumo-fields{gap:14px}
  body[data-page="prontuarios"] .resumo-fields textarea{min-height:96px;padding:11px 12px;font-size:16px;line-height:1.55}
  body[data-page="prontuarios"] .resumo-view .rline p{font-size:14.5px;line-height:1.65}
  body[data-page="prontuarios"] .resumo-view{gap:14px}
  /* Controles que so aparecem com o modal de nova evolucao aberto */
  body[data-page="prontuarios"] .v2-modelo-manage{min-height:44px}
  body[data-page="prontuarios"] .v2-modelo-bar{gap:8px}
  body[data-page="prontuarios"] .v2-proximo-extras-actions{flex-wrap:wrap;gap:8px}
  body[data-page="prontuarios"] .v2-proximo-extras-actions button{flex:1 1 140px;min-height:44px}

  /* ===================== FINANCEIRO ===================== */
  body[data-page="financeiro"] .period{display:grid;grid-template-columns:44px minmax(0,1fr) 44px;gap:8px}
  body[data-page="financeiro"] .period .aps-btn{min-width:44px;min-height:44px}
  body[data-page="financeiro"] .period .new-charge{grid-column:1/-1;min-height:48px}
  body[data-page="financeiro"] .tabs{display:flex;gap:6px;overflow-x:auto;scrollbar-width:none}
  body[data-page="financeiro"] .tabs::-webkit-scrollbar{display:none}
  body[data-page="financeiro"] .tabs button{flex:none;min-height:44px;white-space:nowrap}
  /* Linha de lancamento: excluir era um "x" de 22px, cinza como qualquer
     outro icone — mesmo tom usado nas outras exclusoes do prontuario. */
  body[data-page="financeiro"] .tx-actions{min-width:44px;min-height:44px;color:#a52b44}
  body[data-page="financeiro"] .tx{gap:10px;padding:12px}
  /* Sem flex-wrap, uma linha com valor+status+3 acoes (ex.: vencido com Pix
     disponivel: "Disponibilizar Pix"/"Marcar pago"/cancelar) nao cabia em
     375px e o botao de cancelar (44px, alvo de toque minimo) vazava a tela
     — achado ao vivo em 375px durante o QA do Financeiro 4.0. */
  body[data-page="financeiro"] .tx-side{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px}
  /* O ultimo lancamento da lista podia ficar embaixo da barra inferior fixa
     (68px), tornando "Marcar pago"/excluir daquele item inalcancavel. */
  body[data-page="financeiro"] #transactions{padding-bottom:24px}
  /* Mesmo problema com estado vazio: quando ele e o ultimo bloco da tela, o
     botao de acao caia atras da barra inferior e o toque acertava a barra.
     Medido em 360px: botao em 839-883px, barra comecando em 832px. */
  body[data-page] .aps-empty:last-child{padding-bottom:84px}
  /* Valores altos nao podem ser cortados */
  body[data-page="financeiro"] .tx-value,body[data-page="financeiro"] .metric-value{font-variant-numeric:tabular-nums;overflow-wrap:anywhere}

  /* ===================== MEUS HORARIOS ===================== */
  /* O "v" que liga e desliga o dia era um quadrado de 24px */
  body[data-page="horarios"] .day-name{gap:11px}
  /* Liga/desliga o dia da semana - controle principal desta tela.
     !important porque meus-horarios-functional-2.0.css trava 24px assim. */
  body[data-page="horarios"] .check{width:44px!important;height:44px!important;font-size:18px;border-radius:12px!important}
  body[data-page="horarios"] .day-name label,body[data-page="horarios"] .day-head{min-height:46px}
  body[data-page="horarios"] .add-window{width:100%;min-height:46px}
  body[data-page="horarios"] .window-row,body[data-page="horarios"] .pause-row{flex-wrap:wrap;gap:8px}
  body[data-page="horarios"] .window-row input[type="time"],body[data-page="horarios"] .pause-row input[type="time"]{flex:1 1 120px}
  /* O rodape ja era sticky, mas "bottom:12px" ficava atras da barra
     inferior fixa (68px) — mesmo ajuste ja usado no Plano/Escalas/Minha Pagina. */
  body[data-page="horarios"] .footer-actions{bottom:calc(68px + env(safe-area-inset-bottom))}

  /* ===================== CANCELAMENTOS ===================== */
  body[data-page="cancelamentos"] .filter-bar{display:flex;gap:7px;overflow-x:auto;scrollbar-width:none;padding-bottom:2px}
  body[data-page="cancelamentos"] .filter-bar::-webkit-scrollbar{display:none}
  body[data-page="cancelamentos"] .filter-button{flex:none;min-height:44px;white-space:nowrap}
  /* O icone de lapis no cabecalho do card ja abre a mesma edicao; o botao de
     texto ao final do resumo repetia a acao dentro do mesmo card. */
  body[data-page="cancelamentos"] .policy-summary>[data-open="policy"]{display:none}

  /* ===================== MINHA PAGINA PUBLICA ===================== */
  /* A chavinha de publicar servico tinha 38x21 */
  /* Chavinha no tamanho de um switch nativo (iOS usa 51x31). A area de
     toque e ampliada por um ::before invisivel, chegando a 56x46 sem
     engordar o controle. */
  body[data-page="minha-pagina"] .toggle{width:52px;height:30px}
  body[data-page="minha-pagina"] .toggle::after{left:4px;top:4px;width:22px;height:22px}
  body[data-page="minha-pagina"] .toggle.on::after{transform:translateX(22px)}
  body[data-page="minha-pagina"] .toggle::before{content:"";position:absolute;inset:-8px 0}
  body[data-page="minha-pagina"] .service-head{gap:12px;min-height:46px}
  body[data-page="minha-pagina"] .link-actions{display:flex;flex-wrap:wrap;gap:8px}
  body[data-page="minha-pagina"] .link-actions .aps-btn{flex:1 1 140px;min-height:46px}
  /* "Copiar link" ja aparece junto do endereco real, no bloco "Link publico";
     repetir no topo da pagina so duplicava a mesma acao. */
  body[data-page="minha-pagina"] #copyHero,body[data-page="minha-pagina"] #shareHero{display:none}
  body[data-page="minha-pagina"] .public-link{flex-direction:column;align-items:stretch;gap:10px}
  body[data-page="minha-pagina"] .phone-wrap{max-width:100%}

  /* ===================== CONFIGURACOES ===================== */
  /* Navegacao entre secoes vira faixa rolavel, sem espremer os rotulos */
  body[data-page="configuracoes"] .settings-nav{gap:6px;padding-bottom:2px;scrollbar-width:none}
  body[data-page="configuracoes"] .settings-nav::-webkit-scrollbar{display:none}
  body[data-page="configuracoes"] .settings-nav button{flex:none;min-height:46px;gap:8px;white-space:nowrap;font-size:13.5px}
  body[data-page="configuracoes"] .settings-nav button.active{color:#fff;background:var(--aps-cta);box-shadow:0 4px 12px rgba(83,74,183,.26);font-weight:800}
  body[data-page="configuracoes"] .settings-icon{display:inline-grid;place-items:center;width:19px;height:19px}
  body[data-page="configuracoes"] .settings-icon svg{width:19px;height:19px}

  /* ============ MINHA PAGINA PUBLICA ============ */
  /* Era uma pagina longa e plana; os blocos ganham cara de secao com
     cabecalho destacado, para dar hierarquia sem esconder nada. */
  body[data-page="minha-pagina"] .editor{gap:12px}
  body[data-page="minha-pagina"] .block{padding:15px}
  body[data-page="minha-pagina"] .block-head{display:grid;gap:3px;margin-bottom:12px;padding-bottom:11px;border-bottom:1px solid var(--aps-border)}
  body[data-page="minha-pagina"] .block-head h2,body[data-page="minha-pagina"] .block-head h3{font-size:16px}
  body[data-page="minha-pagina"] .block-head p{font-size:13px;line-height:1.5}
  body[data-page="minha-pagina"] .footer-save{position:sticky;bottom:calc(68px + env(safe-area-inset-bottom));z-index:20;display:flex;gap:8px;margin:0 -12px;padding:11px 12px calc(11px + env(safe-area-inset-bottom));border-top:1px solid var(--aps-border);background:rgba(255,255,255,.97);backdrop-filter:blur(10px)}
  body[data-page="minha-pagina"] .footer-save .aps-btn{flex:1;min-height:48px}
  body[data-page="configuracoes"] .settings-content{padding:15px}
  body[data-page="configuracoes"] .settings-section+.settings-section{margin-top:22px;padding-top:20px;border-top:1px solid var(--aps-border)}
  /* "Salvar alteracoes" so existia no rodape da lista de 9 secoes: numa
     aba longa (ex. Comunicacao), era preciso rolar ate o fim da pagina
     inteira pra salvar. Mesmo padrao sticky ja usado em Horarios/Minha Pagina. */
  body[data-page="configuracoes"] .footer-actions{position:sticky;bottom:calc(68px + env(safe-area-inset-bottom));z-index:20;margin:20px -15px 0;padding:11px 15px calc(11px + env(safe-area-inset-bottom));border-top:1px solid var(--aps-border);background:rgba(255,255,255,.97);backdrop-filter:blur(10px)}
  /* Com o teclado aberto a barra inferior some (regra global acima), mas
     estes 3 rodapes ainda reservavam os 68px dela — sobrava um vao vazio
     entre o campo focado e o botao Salvar. Mesmo ajuste ja feito para
     .plano-actions/.escala-footer do Prontuario. */
  body.v2-keyboard-open[data-page="horarios"] .footer-actions,
  body.v2-keyboard-open[data-page="configuracoes"] .footer-actions,
  body.v2-keyboard-open[data-page="minha-pagina"] .footer-save{bottom:0}
}

/* Faixa de tablet (781-1180px): o layout de desktop continua, mas a largura
   util encolhe por causa da sidebar fixa de 252px. Barras que ficam numa
   linha so no monitor precisam poder quebrar aqui. */
@media(min-width:781px) and (max-width:1180px){
  body[data-page] .toolbar,body[data-page] .toolbar-right,body[data-page] .list-toolbar,body[data-page] .page-head,body[data-page] .period{flex-wrap:wrap}
  body[data-page] .date-label{min-width:120px}
  /* O editor da pagina publica tem uma coluna que nao encolhe */
  body[data-page="minha-pagina"] .editor{grid-template-columns:minmax(0,1fr)}
  body[data-page="minha-pagina"] .public-link,body[data-page="minha-pagina"] .link-actions{flex-wrap:wrap}
  /* Valores monetarios nao podem ser cortados quando a coluna aperta */
  body[data-page="financeiro"] .forecast-value,body[data-page="financeiro"] .tx-value{white-space:normal;overflow-wrap:anywhere}
  body[data-page="financeiro"] .forecast{min-width:0}
  /* Quatro metricas em 4 colunas nao cabem quando a sidebar come 252px:
     "R$ 25,00" saia cortado. Duas colunas resolvem sem perder nada. */
  body[data-page="dashboard"] .v2-simple-metrics{grid-template-columns:1fr 1fr}
  /* Grade de duas colunas dos cancelamentos nao encolhe nesta faixa */
  /* cancelamentos-functional-2.0.css troca para uma coluna so em 800px,
     deixando 801-820 com duas colunas que nao cabem. */
  body[data-page="cancelamentos"] .cancel-layout,body[data-page="cancelamentos"] .cancel-side,body[data-page="cancelamentos"] .cancel-main{grid-template-columns:minmax(0,1fr)}
  body[data-page="cancelamentos"] .cancel-main,body[data-page="cancelamentos"] .cancel-side{min-width:0}
}

/* ===== Ditado por voz global (Voice Input Global) =====
   Botão de microfone injetado por voice-dictation.js em qualquer campo de
   texto livre elegível. @keyframes com nome próprio (dd-voice-mic-*) pra
   este arquivo funcionar sozinho em páginas sem assistente-3.0.css
   (ex.: solicitacao.html).
   Isto é DITADO POR VOZ PARA TEXTO, não um gravador de áudio — por isso o
   estado ativo nunca usa vermelho nem vira um quadrado de "stop": o
   microfone continua sendo o símbolo principal, só ganha a cor lilás do
   produto e uma pílula com "Ditando…" ao lado (vermelho fica reservado
   pra erro/alerta em outros componentes). */
.dd-voice-field-wrap{position:relative}
textarea.dd-voice-field-padded,input.dd-voice-field-padded{padding-right:42px!important}
.dd-voice-mic-btn{position:absolute;top:6px;right:6px;width:30px;height:30px;border-radius:999px;border:1px solid var(--dd-border,#e3e0f2);background:var(--dd-surface,#fff);color:var(--dd-ink-soft,#645f80);display:inline-flex;align-items:center;justify-content:center;gap:6px;cursor:pointer;padding:0;transition:border-color .15s,color .15s,background .15s,width .15s}
.dd-voice-mic-icon{display:flex;flex:none}
.dd-voice-mic-icon svg{width:15px;height:15px}
.dd-voice-status{display:none;font-size:11px;font-weight:700;line-height:1;white-space:nowrap}
.dd-voice-mic-btn:hover:not(:disabled){border-color:var(--dd-violet);color:var(--dd-violet)}
.dd-voice-mic-btn:focus-visible{outline:2px solid var(--dd-violet);outline-offset:2px}
.dd-voice-mic-btn:disabled{cursor:not-allowed;opacity:.55}
.dd-voice-mic-btn.is-recording,.dd-voice-mic-btn.is-transcribing{width:auto;padding:0 12px 0 8px;border-color:var(--dd-violet-line,#e2ddf8);background:var(--dd-violet-soft,#eeebfc);color:var(--dd-violet-dark,#5847c9)}
.dd-voice-mic-btn.is-recording{animation:dd-voice-mic-pulse 1.6s ease-in-out infinite}
.dd-voice-mic-btn.is-recording .dd-voice-status,.dd-voice-mic-btn.is-transcribing .dd-voice-status{display:inline}
.dd-voice-mic-btn.is-transcribing .dd-voice-mic-icon svg{animation:dd-voice-mic-spin .9s linear infinite}
input.dd-voice-field-padded+.dd-voice-mic-btn{top:50%;transform:translateY(-50%)}
/* Alvo de toque maior no mobile (mesmo tamanho do mic do Assistente,
   assistente-3.0.css) — 30px no desktop já é suficiente com o mouse, mas
   fica apertado pra dedo; 40px cobre a recomendação de toque sem
   atrapalhar textareas compactas no desktop. */
@media(max-width:780px){
  textarea.dd-voice-field-padded,input.dd-voice-field-padded{padding-right:50px!important}
  .dd-voice-mic-btn{width:40px;height:40px;top:4px;right:4px}
  .dd-voice-mic-icon svg{width:18px;height:18px}
  .dd-voice-status{font-size:12.5px}
}
@keyframes dd-voice-mic-pulse{0%,100%{box-shadow:0 0 0 0 rgba(109,92,224,.35)}50%{box-shadow:0 0 0 6px rgba(109,92,224,0)}}
@keyframes dd-voice-mic-spin{to{transform:rotate(360deg)}}
@media(prefers-reduced-motion:reduce){
  .dd-voice-mic-btn.is-recording{animation:none}
  .dd-voice-mic-btn.is-transcribing .dd-voice-mic-icon svg{animation:none}
}

/* ===== Skeleton mobile com cara de app (primeira carga) ===== */
@media(max-width:780px){
  html:not(.v2-ready) body[data-page] .main::after{top:calc(72px + env(safe-area-inset-top));left:12px;right:12px;height:158px;border-radius:20px;background:linear-gradient(100deg,rgba(52,45,118,.16) 20%,rgba(52,45,118,.08) 38%,rgba(52,45,118,.16) 56%) 0 0/220% 100%,linear-gradient(145deg,#e9e6f7,#efedf9);box-shadow:none}
  html:not(.v2-ready) body[data-page] .main::before{content:'';position:absolute;z-index:2;top:calc(244px + env(safe-area-inset-top));left:12px;right:12px;height:min(430px,calc(100vh - 400px));border-radius:16px;background:repeating-linear-gradient(180deg,#f0eef8 0 66px,transparent 66px 78px);animation:v2-skeleton-pulse 1.2s ease-in-out infinite alternate}
}
@keyframes v2-skeleton-pulse{from{opacity:1}to{opacity:.55}}

/* ===== Modal de confirmação 3.x (substitui confirm()/prompt() nativos) =====
   Missão de correção da jornada, FASE 5. Classes próprias, só com tokens
   --aps-* da fundação 2.0 (carregada em toda página deste runtime, inclusive
   as que ainda não migraram pro redesign 3.0, ex.: solicitacao.html) — não
   depende de nenhuma folha -3.0.css por página. */
.v2-confirm-backdrop{position:fixed;inset:0;z-index:200;display:none;place-items:center;padding:20px;background:rgba(26,26,46,.45);backdrop-filter:blur(4px)}
.v2-confirm-backdrop.open{display:grid;animation:v2-overlay-in .16s ease both}
.v2-confirm-box{width:min(100%,420px);padding:22px;background:var(--aps-surface,#fff);border:1px solid var(--aps-border,#eeedfe);border-radius:var(--aps-radius-xl,20px);box-shadow:var(--aps-shadow-lg,0 12px 40px rgba(26,26,46,.12));animation:v2-overlay-panel-in .2s cubic-bezier(.2,.75,.25,1) both}
.v2-confirm-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:16px}
.v2-confirm-head h2{margin:0;font-family:var(--aps-font-display);font-size:18px;font-weight:700;color:var(--aps-text,#1a1a2e)}
.v2-confirm-head p{margin:6px 0 0;color:var(--aps-text-secondary,#5c5c7a);font-size:13.5px;line-height:1.45}
.v2-confirm-field{display:grid;gap:6px;margin-bottom:16px}
/* [hidden] do navegador perde para o display:grid acima (mesma
   especificidade, .v2-confirm-field vence por vir depois) — sem isso, o
   campo de texto opcional (usado só quando pedirTexto=true, ex.: motivo de
   cancelamento) fica sempre visível e vazio em TODA chamada de
   confirmarAcao() sem pedirTexto (Suspender acesso, Cancelar consulta,
   Inativar paciente etc.) — mesmo bug de especificidade CSS do Bug #1 da
   Simulação Humana 2, achado ao vivo no Gate Final ao testar o fix do
   confirm() de "Suspender acesso". */
.v2-confirm-field[hidden]{display:none}
.v2-confirm-field label{font-size:13px;font-weight:600;color:var(--aps-text,#1a1a2e)}
.v2-confirm-field textarea{width:100%;padding:10px 12px;border:1px solid var(--aps-border-strong,#dedbf8);border-radius:var(--aps-radius-md,10px);font:inherit;color:var(--aps-text,#1a1a2e);resize:vertical}
.v2-confirm-field textarea:focus-visible{outline:0;box-shadow:var(--aps-shadow-focus)}
.v2-confirm-actions{display:flex;justify-content:flex-end;gap:10px}
.aps-btn--danger{color:#fff;background:var(--aps-danger,#ef4444)}
.aps-btn--danger:hover{background:#dc2626}
@media(max-width:480px){
  /* Onda 1 do Mobile Hardening: achado real testando "Inativar paciente"
     em 375px — o backdrop vira bottom-sheet (align-items:flex-end,
     padding:0) sem reservar espaço pra .dd-bottom-nav (barra fixa de
     ~67px, position:fixed;bottom:0;z-index:50 — presente em quase toda
     página do produto abaixo de 780px). O resultado: o botão primário
     ("Inativar paciente", vermelho) ficava posicionado na MESMA faixa
     vertical da bottom nav — mesmo com z-index maior (200 do backdrop >
     50 da nav) tecnicamente por cima, o box não cobre a largura total
     (16px de padding lateral) então a nav ficava visível, escurecida e
     borrada, colada embaixo/ao redor do botão — visual quebrado,
     confuso. padding-bottom aqui empurra o box inteiro (align-items:
     flex-end) pra cima da faixa da bottom nav, sem mexer no padding
     interno do próprio .v2-confirm-box (que já cuida do
     safe-area-inset-bottom do aparelho, uma preocupação diferente). */
  .v2-confirm-backdrop{align-items:flex-end;padding:0 0 76px}
  .v2-confirm-box{width:100%;border-radius:20px 20px 0 0;padding:20px 16px calc(20px + env(safe-area-inset-bottom))}
  .v2-confirm-actions{flex-wrap:wrap}
  .v2-confirm-actions .aps-btn{flex:1 1 100%;min-height:46px}
}
