/* nuvem.css — tela de login/administração e o travamento de tela por papel.
   É tudo aditivo: não redefine nada do app original, só soma. */

#nuvemGate, #nuvemGate *{ box-sizing:border-box; }
/* Pedido do usuário (16/09/2026): fundo da tela de login branco, e a caixa com a
   mesma cara das barras azuis de dentro do app (.proj-bar/#projBar e companhia —
   mesmo gradiente), em vez do azul-marinho quase preto de antes. */
#nuvemGate{
  position:fixed; inset:0; z-index:999999;
  background:#fff; color:#eef2f7;
  display:flex; align-items:center; justify-content:center;
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;
  padding:20px; overflow:auto;
}
.nv-caixa{
  width:100%; max-width:400px; padding:44px 26px 28px;
  background:linear-gradient(120deg,#0d47a1,#1565c0); border-radius:14px;
  box-shadow:0 10px 40px rgba(13,71,161,.35);
}
.nv-caixa.larga{ max-width:640px; }
/* a logo fica centralizada, acima de tudo — título, aviso e formulário.
   Pedido do usuário (16/09/2026): logo um pouco maior, mais respiro no topo
   (desce um pouco dentro da caixa); o slogan chegou a ser removido da tela
   de login e depois voltou (ver seção "Tela de login redesenhada" no fim
   deste doc) — o que ficou valendo é o slogan de volta, com a logo com mais
   destaque (maior) do que ele (menor). */
.nv-logo{ display:block; height:64px; width:auto; margin:0 auto 20px; border-radius:8px; }
.nv-titulo{ font-size:16px; font-weight:700; margin:0 0 4px; text-align:center; }
/* só na tela de login: sem o "Entre com seu email e senha..." abaixo do
   slogan (pedido do usuário, 16/09/2026), então o slogan ganha mais espaço
   embaixo antes do formulário, e a letra fica um pouco menor (dá mais
   destaque à logo, que é o elemento maior/de cima) */
.nv-titulo-login{ font-size:14px; font-weight:600; opacity:.92; margin-bottom:22px; }
.nv-sub{ font-size:13px; color:rgba(255,255,255,.78); margin:0 0 20px; line-height:1.5; text-align:center; }
.nv-campo{ margin-bottom:14px; }
.nv-campo label{ display:block; font-size:12.5px; color:#b9c8d8; margin-bottom:5px; }
.nv-campo input, .nv-campo select{
  width:100%; padding:10px 11px; border-radius:8px; border:1px solid #2c4863;
  background:#0d1e30; color:#eef2f7; font-size:14px; font-family:inherit;
}
.nv-campo input:focus, .nv-campo select:focus{ outline:2px solid #4f9ddb; border-color:#4f9ddb; }
/* Bug corrigido (23/09/2026, relatado com print — "essa parte na seleção de
   obras ficou bagunçada e confusa"): a regra ".nv-campo input" acima foi
   pensada só pra campo de texto/select (por isso o width:100%) — mas um
   <input type="radio"> dentro de um <label> que também está dentro de um
   ".nv-campo" (caso de "Vê obras específicas"/"Vê todas as obras de um
   escopo", em abrirObrasDoUsuario) herdava esse MESMO width:100%, e como
   ".nv-campo label" é display:block (a linha de baixo, pra rótulos comuns
   tipo "Nome"), o <label> vira um bloco com largura definida — contra essa
   largura definida, o width:100% do rádio deixa de ser ignorado (não é mais
   um container "shrink-to-fit") e o rádio estica até ocupar a largura toda
   do formulário, empurrando o texto pra longe do círculo. Esta regra reseta
   qualquer <input type="radio"/checkbox"> dentro de ".nv-campo" de volta ao
   tamanho normal, não importa a profundidade do aninhamento — mais
   específica que a regra genérica acima (tipo+classe vs. só classe), então
   ganha sem precisar mexer em cada tela que usa rádio/checkbox dentro de um
   ".nv-campo".  */
.nv-campo input[type="radio"], .nv-campo input[type="checkbox"]{
  width:auto; padding:0; border:none; background:none; border-radius:0;
}
.nv-bt{
  padding:11px 16px; border:none; border-radius:8px; background:#2f7fd1; color:#fff;
  font-size:14.5px; font-weight:600; cursor:pointer;
}
.nv-bt.full{ width:100%; margin-top:6px; }
.nv-bt:hover{ background:#3a8fe0; }
.nv-bt:disabled{ opacity:.55; cursor:default; }
.nv-bt.fraco{ background:#20415e; }
.nv-bt.fraco:hover{ background:#285175; }
.nv-bt.perigo{ background:#a13a3a; }
.nv-bt.perigo:hover{ background:#bf4747; }
.nv-erro{ background:#4a1d24; color:#ffb4bd; border-radius:8px; padding:9px 11px; font-size:13px; margin-bottom:14px; display:none; }
.nv-erro.on{ display:block; }
.nv-ok{ background:#1d4a2c; color:#b6f0c7; border-radius:8px; padding:9px 11px; font-size:13px; margin-bottom:14px; display:none; }
.nv-ok.on{ display:block; }
.nv-troca{ text-align:center; margin-top:16px; font-size:12.5px; color:rgba(255,255,255,.7); }
.nv-troca button{ background:none; border:none; color:#fff; text-decoration-color:rgba(255,255,255,.5); cursor:pointer; font-size:12.5px; text-decoration:underline; padding:0; }
.nv-spin{ text-align:center; padding:34px 0; color:rgba(255,255,255,.85); font-size:13.5px; }
/* botão principal (Entrar / Criar administrador master / Tentar de novo): branco
   sobre o azul, no mesmo padrão de destaque que "Revisões" já usa nas barras
   internas do app — só nas telas do portão, o resto do app (#nuvemAdmin) continua
   com as cores de botão de sempre. */
#nuvemGate .nv-bt{ background:#fff; color:#0d47a1; font-weight:700; }
#nuvemGate .nv-bt:hover{ background:#e3f2fd; }

/* Aviso de cookies (21/09/2026) — barra fixa no rodapé, por cima de tudo
   (inclusive de #nuvemGate, a tela de login): z-index maior que o dele
   (999999). Só aparece no primeiro acesso deste navegador (ver
   mostrarAvisoCookies em nuvem.js). */
#nvCookies, #nvCookies *{ box-sizing:border-box; }
#nvCookies{
  position:fixed; left:0; right:0; bottom:0; z-index:1000000;
  display:flex; flex-wrap:wrap; align-items:center; justify-content:center; gap:16px;
  background:linear-gradient(120deg,#0d47a1,#1565c0); color:#eef2f7;
  padding:14px 20px; box-shadow:0 -4px 18px rgba(13,71,161,.35);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;
}
.nv-cookies-txt{ flex:1 1 420px; max-width:760px; font-size:13px; line-height:1.5; color:rgba(255,255,255,.92); }
.nv-cookies-bts{ display:flex; gap:10px; flex:0 0 auto; }
.nv-cookies-bt{
  padding:10px 18px; border-radius:8px; border:none; cursor:pointer;
  font-size:13.5px; font-weight:700; white-space:nowrap;
  background:#fff; color:#0d47a1;
}
.nv-cookies-bt:hover{ background:#e3f2fd; }
.nv-cookies-bt.fraco{ background:rgba(255,255,255,.14); color:#fff; }
.nv-cookies-bt.fraco:hover{ background:rgba(255,255,255,.24); }
@media (max-width:560px){
  #nvCookies{ justify-content:flex-start; }
  .nv-cookies-bts{ width:100%; }
  .nv-cookies-bt{ flex:1 1 0; }
}

/* Avisinho discreto de "atualizando dados" depois de um carregamento
   instantâneo (F5 dentro de uma obra — ver tentarRestaurarInstantaneo em
   nuvem.js, pedido do usuário 17/09/2026). Não cobre nada da tela, só um
   selo pequeno num canto, que some sozinho quando o dado de verdade chega.
   Ajuste (21/09/2026): o aviso de presença (#nvPresenca, logo abaixo) virou
   o único selinho fixo do canto e passou a ocupar o canto inferior direito
   de verdade (bottom:16px) — pedido do usuário. Este aqui (que só aparece
   por um instante, ao abrir uma obra) subiu para bottom:64px, pra não ficar
   embaixo do aviso de presença nos raros momentos em que os dois coincidem. */
#nvAtualizando{
  position:fixed; right:16px; bottom:calc(64px + var(--tarja-altura, 0px)); z-index:900000;
  display:flex; align-items:center; gap:8px;
  background:#0d47a1; color:#eef2f7; font-size:12.5px; font-weight:600;
  padding:8px 14px; border-radius:20px; box-shadow:0 4px 14px rgba(13,71,161,.35);
}
#nvAtualizando .nv-pontinho{
  width:7px; height:7px; border-radius:50%; background:#7ec8ff; flex:none;
  animation:nvAtualizandoPisca 1s ease-in-out infinite;
}
@keyframes nvAtualizandoPisca{ 0%,100%{ opacity:.35; } 50%{ opacity:1; } }
#nvAtualizando.erro{ background:#4a1d24; color:#ffb4bd; }
#nvAtualizando.erro button{
  background:rgba(255,255,255,.16); color:#fff; border:1px solid rgba(255,255,255,.4);
  border-radius:6px; padding:3px 8px; font-size:12px; cursor:pointer;
}
#nvAtualizando.erro button:hover{ background:rgba(255,255,255,.28); }

/* Pedido do usuário (20/09/2026): enquanto o avisinho "Atualizando dados…"
   está na tela, o que aparece por baixo dele é só o retrato salvo no cache
   (ver tentarRestaurarInstantaneo em nuvem.js) — pode estar um pouco
   desatualizado até o dado de verdade chegar do servidor. Sem nenhum aviso
   visual além do selinho no canto, uma troca repentina de números/texto no
   meio da tela (quando o dado real substitui o retrato) passava a impressão
   de bug. Borrar o conteúdo nesse intervalo deixa claro que aquilo ainda não
   é definitivo — e também impede clique sem querer em algo que já vai mudar.
   #nvAtualizando/#nvPresenca/#nuvemGate ficam de fora da borradura de
   propósito (são os próprios avisos, nunca "dado da obra").
   Ajuste (22/09/2026, bug relatado pelo usuário): "#nvCookies" (o aviso de
   cookies do primeiro acesso, ver mostrarAvisoCookies em nuvem.js) também é
   filho direto do body e ainda NÃO tinha entrado nessa lista — ficava
   borrado e com pointer-events:none junto com o resto assim que o
   carregamento otimista começava (ex.: batendo o F5 ou entrando com uma
   obra já em cache), tornando os botões "Aceitar"/"Recusar" impossíveis de
   clicar até o carregamento terminar. Entrou na lista de exceções pelo
   mesmo motivo dos outros três: não é "dado da obra", é um aviso do
   próprio site.
   Ajuste (23/09/2026): "#nvPedidoEdicao" (a janelinha de pedido de edição,
   ver "5.8bis" em nuvem.js) entrou na lista pelo mesmíssimo motivo — os
   botões "Permitir"/"Recusar" precisam continuar clicáveis mesmo durante um
   carregamento otimista. */
body.nv-carregando-otimista > *:not(#nvAtualizando):not(#nvPresenca):not(#nuvemGate):not(#nvCookies):not(#nvPedidoEdicao){
  filter: blur(3px);
  pointer-events: none;
  user-select: none;
  transition: filter .15s ease-out;
}

/* Aviso de presença — "tem outra pessoa nesta aba agora?" (pedido do usuário,
   20/09/2026). Mesmo formato do #nvAtualizando acima (selinho discreto, não
   cobre nada da tela) — com uma cor diferente (roxo), pra não parecer um
   erro nem se confundir com o vermelho de conflito. Reaproveita a mesma
   bolinha piscando (.nv-pontinho / @keyframes nvAtualizandoPisca, já
   definidas acima).
   Ajuste (21/09/2026, pedido do usuário: "quero deixar apenas o aviso de
   que alguém está na mesma aba (...) e que esse aviso fique o mais à
   direita e o mais inferior, ou seja, canto inferior direito") — o aviso de
   "fulano atualizou esta obra" (#nvNovidade) foi removido de vez (ver "5.9"
   em nuvem.js), e este aqui — o único selinho fixo que sobrou — passou a
   ocupar o canto inferior direito de verdade (bottom:16px, o mais embaixo e
   mais à direita possível). #nvAtualizando (selo curto de "carregando", que
   só aparece por um instante ao abrir a obra) subiu pra bottom:64px, pra não
   ficar embaixo dele nos raros momentos em que os dois aparecem juntos.
   Bug relatado pelo usuário (24/09/2026, print): com o cronograma travado, a
   tarja verde "Modo visualização" (#soLeituraTarja, index.html — fixa no
   rodapé, por cima de tudo) ficava colada/sobreposta neste aviso e no
   #nvAtualizando, os dois presos nos mesmos 16px/64px de sempre sem saber
   que a tarja também mora ali embaixo agora. `var(--tarja-altura)` soma a
   altura real da tarja (medida em __atualizarAlturaTarja, index.html, e
   0px quando ela não está visível) ao bottom de sempre — ver o mesmo
   ajuste em `.toast` (index.html) e em #nvAtualizando, logo acima. */
#nvPresenca{
  position:fixed; right:16px; bottom:calc(16px + var(--tarja-altura, 0px)); z-index:900000;
  display:flex; align-items:flex-start; gap:8px;
  background:#4a2f7a; color:#f1ecff; font-size:12.5px; font-weight:600;
  padding:10px 14px; border-radius:16px; box-shadow:0 4px 14px rgba(74,47,122,.35);
  max-width:min(360px, calc(100vw - 32px));
}
#nvPresenca .nv-pontinho{
  width:7px; height:7px; border-radius:50%; background:#c9a6ff; flex:none;
  margin-top:5px;
  animation:nvAtualizandoPisca 1s ease-in-out infinite;
}
#nvPresenca b{ font-weight:700; }
/* Ajuste (23/09/2026, pedido do usuário): o aviso passou a listar QUALQUER
   editor presente em qualquer aba do Planejamento (não só a mesma aba que
   você) — cada linha traz o nome e, embaixo/ao lado, a aba dessa pessoa
   (ver pintarAvisoPresenca em nuvem.js). */
#nvPresenca .nv-presenca-txt{ line-height:1.55; }
#nvPresenca .nv-presenca-aba{ opacity:.75; font-weight:500; }

/* Pedido de autorização de edição (pedido do usuário, 23/09/2026): "deve
   vir como uma pequena janela no canto direito" — janelinha pequena, no
   canto INFERIOR direito. Ajuste (mesmo dia, mais tarde, pedido seguinte do
   usuário: "deve aparecer mais a baixo acima um pouco do aviso de que
   alguem esta no cronograma e o de atualizando dados ao dar o refresh") —
   morava no canto SUPERIOR direito antes; agora mora no MESMO canto que
   #nvPresenca/#nvAtualizando, empilhada por CIMA dos dois — o `bottom` é
   calculado em JS (reposicionarPedidoEdicao, nuvem.js) porque a altura de
   #nvPresenca varia (pode ter uma linha ou uma lista inteira de gente).
   Dois formatos conforme NV.pedidoEdicao.papel (ver
   pintarPainelPedidoEdicao em nuvem.js): 'recebido' (pra quem já está
   editando, com Permitir/Recusar — cor azul, pede uma decisão) e 'enviado'
   (pra quem pediu, só aguardando/Cancelar — cor neutra, sem decisão nenhuma
   a tomar aqui). */
#nvPedidoEdicao{
  position:fixed; right:16px; bottom:16px; z-index:900010;
  background:#173b5e; color:#eaf2ff; font-size:13px;
  padding:14px 16px; border-radius:12px; box-shadow:0 6px 20px rgba(0,0,0,.35);
  max-width:min(320px, calc(100vw - 32px));
}
#nvPedidoEdicao.nv-pe-aguardando{ background:#3a3320; color:#fff0d6; }
#nvPedidoEdicao .nv-pe-msg{ margin:0 0 10px; line-height:1.4; }
#nvPedidoEdicao .nv-pe-bts{ display:flex; gap:8px; }
#nvPedidoEdicao button{
  border:none; border-radius:8px; padding:8px 10px; font-weight:700;
  cursor:pointer; font-size:12.5px; font-family:inherit;
}
#nvPedidoEdicao .nv-pe-bts button{ flex:1; }
#nvPedidoEdicao .nv-pe-aceitar{ background:#1f8f4e; color:#fff; }
#nvPedidoEdicao .nv-pe-aceitar:hover{ background:#26a75d; }
#nvPedidoEdicao .nv-pe-recusar{ background:rgba(255,255,255,.14); color:#fff; }
#nvPedidoEdicao .nv-pe-recusar:hover{ background:rgba(255,255,255,.24); }
#nvPedidoEdicao .nv-pe-cancelar{ background:rgba(255,255,255,.14); color:#fff; width:100%; }
#nvPedidoEdicao .nv-pe-cancelar:hover{ background:rgba(255,255,255,.24); }

/* Faixinha de percentual dos 60s (pedido do usuário, 23/09/2026) — encolhe
   de 100% a 0% (ver iniciarContadorPedidoEdicao em nuvem.js); some junto
   com a janelinha quando esvazia por completo. */
#nvPedidoEdicao .nv-pe-barra{
  margin-top:10px; height:4px; border-radius:2px; overflow:hidden;
  background:rgba(255,255,255,.18);
}
#nvPedidoEdicao .nv-pe-barra-fill{
  height:100%; width:100%; border-radius:2px; background:#7fb8ff;
  transition:width .25s linear;
}
#nvPedidoEdicao.nv-pe-aguardando .nv-pe-barra-fill{ background:#ffcf7a; }

/* Aviso de "há atualizações" (#nvNovidade, "fulano atualizou esta obra") —
   REMOVIDO em 21/09/2026, pedido do usuário: "quero deixar apenas o aviso
   de que alguém está na mesma aba". Ver o comentário de #nvPresenca acima e
   a seção "5.9" em nuvem.js pra o histórico completo. */

/* ------------------------- avisos (conflito / obra ainda não salva) ------------------------- */
/* Pedido do usuário (16/09/2026): a barrinha flutuante com nome/papel/Administração/
   Sair virou só o círculo de perfil, encaixado dentro de cada barra azul (ver mais
   abaixo) — os dois avisos abaixo não fazem parte disso (não são "quem é o usuário",
   são alertas de sincronização), então viraram um bloco pequeno e discreto, fixo no
   topo central da tela, que só aparece quando tem algo pra avisar. */
#nuvemAlertas{
  position:fixed; top:8px; left:50%; transform:translateX(-50%); z-index:9000;
  display:flex; gap:8px; font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;
}
#nuvemAlertas .nv-conflito, #nuvemAlertas .nv-naocriada{
  display:none; background:#a13a3a; color:#fff; border-radius:999px; padding:6px 14px;
  font-size:12px; font-weight:600; box-shadow:0 3px 12px rgba(0,0,0,.25);
}
#nuvemAlertas .nv-conflito.on, #nuvemAlertas .nv-naocriada.on{ display:inline-block; }
/* .nv-conflito virou um <button> (23/09/2026, ver garantirAlertas em
   nuvem.js — clique recarrega a página, que é a própria instrução que o
   aviso dá) — reset dos estilos padrão de botão do navegador pra continuar
   com a MESMA cara de pílula vermelha que já tinha como <span>. */
#nuvemAlertas .nv-conflito{ border:none; font-family:inherit; cursor:pointer; }
#nuvemAlertas .nv-conflito:hover{ background:#bf4747; }
/* enquanto uma gravação está em andamento, os avisos (se algum estiver na tela)
   ficam meio apagados — antes era a barrinha inteira que fazia isso */
body.nv-salvando #nuvemAlertas{ opacity:.65; }

/* --------------------------- círculo de perfil (avatar) --------------------------- */
/* Uma cópia deste círculo (ver novoAvatarWrap()/garantirAvatares() em nuvem.js) fica
   encaixada em cada uma das 5 barras azuis do app (lista de obras, Planejamento,
   Check in, Restrições, Minhas Restrições) — nunca mais de uma visível ao mesmo
   tempo, já que só uma dessas telas aparece por vez. Fica só o círculo com as
   iniciais (sem nome/papel à mostra); clicar abre um menu com Administração/Sair,
   na mesma cor azul do fundo da barra. */
.nv-avatar-wrap{ position:relative; display:flex; align-items:center; gap:8px; }
/* nessas três barras nada mais empurra pra direita (o #projPrazo de #projBar já
   faz isso sozinho com margin-left:auto — duplicar aqui abriria um vão indevido
   entre o texto e o círculo), então o círculo mesmo precisa se empurrar */
#ckBar .nv-avatar-wrap, #rsBar .nv-avatar-wrap, #mrBar .nv-avatar-wrap{ margin-left:auto; }
.nv-avatar{
  position:relative; width:30px; height:30px; border-radius:9px; flex-shrink:0;
  background:#fff; color:#0d47a1; border:none;
  font-size:12px; font-weight:800; letter-spacing:.3px;
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;
  display:flex; align-items:center; justify-content:center;
  padding:0; cursor:pointer; box-shadow:0 1px 4px rgba(0,0,0,.25);
}
.nv-avatar:hover{ background:#e3f2fd; }
/* Pedido do usuário (21/09/2026): "ao invés do sininho, quero uma bolinha
   colorida no ícone com as iniciais do nome" — trocou o sino (botão à
   parte) por uma bolinha vermelha encaixada no canto do próprio círculo de
   perfil; sem número dentro (só "tem coisa nova" ou não), igual o ponto
   vermelho de notificação do Gmail/apps de celular. Ver pintarPainelNotificacoes()
   em nuvem.js.*/
.nv-avatar-dot{
  display:none; position:absolute; top:-3px; right:-3px;
  width:11px; height:11px; border-radius:50%;
  background:#e53935; box-shadow:0 0 0 2px #fff;
}
.nv-avatar-dot.on{ display:block; }
/* Painel de notificações (21/09/2026) — mora DENTRO do mesmo menu do
   círculo de perfil (.nv-menu, embaixo), acima de Administração/Sair, em
   vez de ser um dropdown à parte (era o antigo .nv-notif-menu, do sino).
   Cartão branco (não azul) mesmo dentro do menu azul: a lista tem nome de
   obra + descrição, mais legível em texto escuro sobre fundo claro. */
.nv-menu-notif{
  display:none; flex-direction:column;
  background:#fff; color:#263238;
  border-radius:8px; margin:0 0 4px; overflow:hidden;
  max-height:min(320px, 50vh); overflow-y:auto;
}
.nv-menu-notif.on{ display:flex; }
.nv-notif-tit{
  padding:10px 12px; font-size:12.5px; font-weight:700; color:#0d47a1;
  border-bottom:1px solid #e3e8ec; position:sticky; top:0; background:#fff;
}
/* Pedido do usuário (22/09/2026): "um x do lado direito da notificação" —
   .nv-notif-item deixou de ser o <button> clicável em si (não dá pra ter um
   botão dentro de outro botão) e virou um <div> que só organiza os DOIS
   botões lado a lado: o corpo (.nv-notif-corpo, a mesma aparência/clique de
   sempre) e o "x" (.nv-notif-x). Especificidade ".nv-menu-notif .nv-notif-*"
   de propósito — precisa vencer ".nv-menu button" (o menu azul por fora já
   teria texto branco/sem fundo por padrão pros botões dele). */
.nv-menu-notif .nv-notif-item{
  display:flex; align-items:stretch; border-bottom:1px solid #f0f2f4;
}
.nv-menu-notif .nv-notif-item:last-child{ border-bottom:none; }
.nv-menu-notif .nv-notif-item:hover{ background:#f2f7fd; }
.nv-menu-notif .nv-notif-corpo{
  display:flex; flex-direction:column; gap:2px; text-align:left; flex:1; min-width:0;
  background:none; border:none; border-radius:0; padding:9px 4px 9px 12px;
  font-size:12.5px; cursor:pointer; font-family:inherit;
}
.nv-notif-corpo b{ font-size:12px; color:#0d47a1; font-weight:700; display:block; }
.nv-notif-corpo span{ color:#37474f; display:block; }
.nv-notif-corpo i{ font-style:normal; color:#78909c; font-size:11px; display:block; }
/* "x" — flex-shrink:0 pra nunca espremer/quebrar linha por causa do texto
   ao lado; cor neutra até passar o mouse, aí sim fica vermelho (mesmo
   raciocínio de "ação destrutiva só chama atenção quando relevante" usado
   no resto do app). */
.nv-menu-notif .nv-notif-x{
  flex-shrink:0; align-self:center; width:26px; height:26px; margin-right:6px;
  border:none; background:none; border-radius:50%; cursor:pointer;
  font-size:18px; line-height:1; color:#90a4ae; font-family:inherit;
  display:flex; align-items:center; justify-content:center;
}
.nv-menu-notif .nv-notif-x:hover{ background:#ffebee; color:#c62828; }
/* Aviso de migração pendente (21/09/2026) — ver colunaIndisponivel em
   api.mjs/nuvem.js: some sozinho assim que a migração rodar. */
.nv-notif-aviso{ padding:8px 12px; font-size:11px; color:#a56b00; background:#fff8e6; border-top:1px solid #ffe08a; }
/* Pedido do usuário (22/09/2026): "ter na parte de baixo central da parte
   branca de notificação uma opção limpar todas" — rodapé centralizado,
   dentro do mesmo cartão branco (.nv-menu-notif), só aparece quando há
   alguma notificação (ver o "rodape" condicional em pintarPainelNotificacoes,
   nuvem.js). position:sticky (igual .nv-notif-tit no topo) pra continuar
   visível mesmo com a lista rolando, quando tem muita notificação. */
.nv-notif-rodape{
  padding:8px 12px; text-align:center; border-top:1px solid #e3e8ec;
  position:sticky; bottom:0; background:#fff;
}
/* Especificidade ".nv-menu-notif .nv-notif-limpar" de propósito, pelo mesmo
   motivo do comentário acima (22/09/2026) sobre .nv-notif-item/-corpo/-x:
   sem o prefixo ".nv-menu-notif", ".nv-menu button{ color:#fff }" (mais
   específico que ".nv-notif-limpar" sozinho) ganhava e o texto ficava
   branco sobre o rodapé branco — só ficava legível no :hover, porque aí sim
   ".nv-notif-limpar:hover" (duas classes) vencia ".nv-menu button" (classe +
   elemento). Bug relatado pelo usuário (22/09/2026): botão "Limpar todas"
   em branco, só aparecia passando o mouse por cima. */
.nv-menu-notif .nv-notif-limpar{
  border:none; background:none; color:#78909c; font-size:11.5px;
  font-family:inherit; cursor:pointer; padding:4px 10px; border-radius:6px;
}
.nv-menu-notif .nv-notif-limpar:hover{ background:#f2f7fd; color:#0d47a1; }
/* Pedido do usuário (17/09/2026): `position:fixed` em vez de `absolute` — dentro
   de uma obra o menu abria escondido atrás do cronograma, cortado pelo
   `overflow:hidden` de #topArea (o wrapper de #projBar). `top`/`right` são
   calculados e escritos aqui via JS na hora de abrir (ver o clique de
   `.nv-avatar` em novoAvatarWrap(), nuvem.js) — fixed escapa de qualquer
   overflow:hidden/auto de ancestral, ao contrário de absolute. */
.nv-menu{
  display:none; flex-direction:column; gap:2px;
  position:fixed; z-index:9001;
  background:linear-gradient(120deg,#0d47a1,#1565c0); color:#fff;
  border-radius:10px; padding:6px; min-width:190px;
  /* min-width maior (21/09/2026) — o painel de notificações que passou a
     morar aqui dentro (.nv-menu-notif) tem nome de obra + descrição, que
     precisam de mais espaço do que só "Administração"/"Sair" pediam. */
  width:max-content; max-width:min(320px, calc(100vw - 32px));
  box-shadow:0 10px 26px rgba(0,0,0,.35);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;
}
.nv-menu.on{ display:flex; }
.nv-menu-quem{
  padding:8px 10px 9px; margin-bottom:2px; border-bottom:1px solid rgba(255,255,255,.25);
  display:flex; flex-direction:column; gap:1px;
}
.nv-menu-quem b{ font-size:13px; font-weight:600; }
.nv-menu-quem span{ font-size:11.5px; opacity:.8; }
.nv-menu button{
  width:100%; text-align:left; background:none; border:none; color:#fff;
  border-radius:7px; padding:9px 10px; font-size:13px; cursor:pointer; font-family:inherit;
}
.nv-menu button:hover{ background:rgba(255,255,255,.16); }

/* nas barras de duas linhas (Planejamento — título+abas embaixo, botões+prazo
   embaixo), o círculo entra na MESMA linha do texto de prazo (#projPrazo, o último
   item de #projBar antes do círculo) — dando um respiro à direita do texto pra ele
   não ficar colado no círculo. #projPrazo já tem `margin-left:auto` (CSS do próprio
   app, index.html), e por vir logo antes do círculo no DOM empurra os dois juntos
   pro canto — MAS só enquanto tiver conteúdo. */
#projBar #projPrazo{ margin-right:6px; }
/* Pedido do usuário (17/09/2026): numa obra nova (sem cronograma calculado ainda),
   #projPrazo fica vazio e com `display:none` — sem conteúdo, não tem largura, e
   como é ELE quem carrega o `margin-left:auto` que empurra o par pro canto, nada
   mais empurra o círculo, que ficava colado no botão "Modo visualização". Nesse
   caso (e só nesse caso — daí o `:has(#projPrazo:empty)`, pra não duplicar a
   margem automática quando o prazo já tem texto e já faz esse trabalho sozinho)
   o círculo passa a se empurrar sozinho. */
#projBar:has(#projPrazo:empty) .nv-avatar-wrap{ margin-left:auto; }

/* ------------------------------ admin ------------------------------ */
/* Corrigido (02/10/2026, pedido do usuário: "o aviso da primeira vez apareceu
   muito em cima no app quero ele mais centralizado tanto na horizontal quanto
   na vertical" — sobre o lembrete de ativar o 2FA, mostrarLembrete2FA, mais
   acima) — era `align-items:flex-start`, que colava o cartão branco no topo
   (só sobrava 5vh de margem). "safe center" centraliza verticalmente um
   cartão pequeno (o caso do lembrete de 2FA, do aviso de trocar senha etc.),
   mas AUTOMATICAMENTE volta a se comportar como flex-start pra um cartão
   mais alto que a tela (a tabela de Administração, "Editar usuário" com
   muitos setores etc.) — sem isso ("center" puro, sem "safe"), um cartão alto
   cortaria o topo sem dar pra rolar até lá. Vale pra TODAS as telas deste
   painel (#nuvemAdmin é reaproveitado por todas, ver garantirModalAdmin em
   nuvem.js), não só o lembrete de 2FA. */
#nuvemAdminBg{
  position:fixed; inset:0; z-index:99998; background:rgba(6,14,22,.6);
  display:none; align-items:safe center; justify-content:center; padding:5vh 16px; overflow:auto;
}
#nuvemAdminBg.on{ display:flex; }
/* Bug relatado pelo usuário (24/09/2026): com o cronograma travado
   (body.so-leitura ligado), os campos dentro da Administração — o
   <select> de "Permissão" na tabela de usuários, e as checkboxes da
   árvore de "Obras…" (Por Empresa > Escopo > Tipo > Obra) — apareciam
   acinzentados, com o cursor de "proibido" ao passar o mouse, mesmo já
   sendo editáveis de verdade (dava pra escolher uma permissão nova e
   funcionava). #nuvemAdminBg já é liberado do BLOQUEIO DE CLIQUE desde
   21/09/2026 (window.__LIVRE, ver login-e-controle-de-acesso.md) — o que
   faltava liberar era só a APARÊNCIA: o app original tem uma regra
   genérica (index.html: "body.so-leitura input:not(.livre),
   select:not(.livre), textarea:not(.livre)") que escurece QUALQUER campo
   da página inteira sempre que soLeitura está ligado, sem saber que
   #nuvemAdminBg é uma exceção. Essa regra tem mais especificidade que
   ".nv-tabela select"/".nv-hier-nivel input[type=checkbox]" (as regras
   que estilizam esses campos normalmente), então vencia mesmo com
   #nuvemAdminBg carregado depois — por isso o seletor abaixo usa o ID
   #nuvemAdminBg, que tem mais especificidade que qualquer uma das duas e
   sempre vence, em qualquer ordem. Não mexe em quem está genuinamente
   desabilitado (:disabled) — ex.: o campo Email de "Editar usuário" pra
   quem não pode editá-lo continua acinzentado de propósito. */
body.so-leitura #nuvemAdminBg input:not(:disabled),
body.so-leitura #nuvemAdminBg select:not(:disabled),
body.so-leitura #nuvemAdminBg textarea:not(:disabled){
  background:#fff; color:#1a2733; cursor:auto;
}
/* Pedido do usuário (17/09/2026, corrigido no mesmo dia): fundo BRANCO, texto
   PRETO — a primeira tentativa (mesmo gradiente azul do cabeçalho das obras)
   não era o que o usuário queria. Como o resto do painel (`.nv-tabela`,
   `.nv-chip`, `.nv-import-*`, etc. — só usados aqui dentro, nunca fora de
   #nuvemAdmin) tinha cor pensada pra ficar em cima do fundo ESCURO de antes
   (texto claro, bordas claras), essas cores foram trocadas direto pra
   versões escuras/neutras que funcionam em cima de branco. Os botões
   (`.nv-bt`) não precisaram de ajuste: o azul padrão já contrasta bem com
   fundo branco (não precisava mais do tratamento branco-sobre-azul que a
   tentativa do gradiente tinha exigido). */
/* Pedido do usuário (21/09/2026): "alargar um pouco a janela para caber
   todos os botoes de ação em uma linha" — os botões de cada linha da
   tabela (Editar/Obras…/Nova senha/Desativar, ver acoesCel em nuvem.js)
   quebravam em duas linhas com 760px; 880px sobra o bastante sem esticar
   demais em telas menores (ainda cabe com folga em #nuvemAdminBg, que tem
   padding próprio — ver acima).
   Alargado de novo (25/09/2026, pedido do usuário, a partir de um print da
   tela "Edição de usuários"): a nova coluna "Setor" (ver linhaUsuarioHtml,
   nuvem.js) precisava de mais espaço pra não apertar o resto — 880px
   passou pra 1040px. */
#nuvemAdmin{
  width:100%; max-width:1040px; background:#fff; color:#1a2733; border-radius:14px;
  padding:24px 26px 26px; font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;
  box-shadow:0 10px 40px rgba(0,0,0,.3);
}
#nuvemAdmin h3{ margin:0 0 4px; font-size:18px; }
#nuvemAdmin .nv-fechar{ float:right; background:none; border:none; color:#5b6b7c; font-size:22px; line-height:1; cursor:pointer; }
#nuvemAdmin .nv-sub{ color:#5b6b7c; }
#nuvemAdmin .nv-campo label{ color:#5b6b7c; }
/* Pedido do usuário (17/09/2026): todos os botões do painel de administração
   azuis (mesmo azul do botão "Criar usuário" — antes os botões secundários
   como "Obras…", "Nova senha", "Voltar", "Reativar" e "Importar obras..."
   usavam um azul-marinho escuro, `.nv-bt.fraco`); e o botão "Desativar"
   (`.nv-bt.perigo`) num vermelho mais claro que o de antes. */
#nuvemAdmin .nv-bt.fraco{ background:#2f7fd1; }
#nuvemAdmin .nv-bt.fraco:hover{ background:#3a8fe0; }
#nuvemAdmin .nv-bt.perigo{ background:#e05c5c; }
#nuvemAdmin .nv-bt.perigo:hover{ background:#e97575; }
/* Pedido do usuário (17/09/2026): campos de digitar (nome, email, senha) com
   fundo branco e letras pretas — antes herdavam o estilo escuro de `.nv-campo
   input`/`.nv-campo select` pensado pra tela de login (caixa azul). O select
   por-linha da tabela (`.nv-tabela select`) já era branco (linha acima) e
   continua igual. */
#nuvemAdmin .nv-campo input,
#nuvemAdmin .nv-campo select{
  background:#fff; color:#1a2733; border:1px solid #c7d0da;
}
/* Campo Email de "Meus dados" (23/09/2026, pedido do usuário: campo antes do
   Nome, acinzentado, sem poder editar) — acinzentado de propósito, pra
   parecer visualmente diferente/bloqueado dos campos editáveis logo abaixo
   (Nome/Sobrenome/Celular), que continuam brancos. */
#nuvemAdmin .nv-campo input:disabled{
  background:#eef1f4; color:#7a8896; cursor:not-allowed;
}
.nv-tabela{ width:100%; border-collapse:collapse; margin:14px 0; font-size:13px; }
.nv-tabela th, .nv-tabela td{ text-align:left; padding:7px 8px; border-bottom:1px solid #dde3ea; }
.nv-tabela th{ color:#5b6b7c; font-weight:600; font-size:12px; }
/* Pedido do usuário (21/09/2026): os botões de ação de cada linha (Editar/
   Obras…/Nova senha/Desativar) cabendo numa linha só — junto com a janela
   um pouco mais larga (#nuvemAdmin, acima), evita que a última coluna
   quebre em duas linhas por falta de espaço. #nvAdminTabelaWrap ganha
   rolagem própria pra telas bem estreitas (celular), onde nem a janela
   mais larga é suficiente. */
#nvAdminTabelaWrap{ overflow-x:auto; }
.nv-tabela td:last-child{ white-space:nowrap; }
.nv-tabela select{ background:#fff; color:#1a2733; border:1px solid #c7d0da; border-radius:6px; padding:4px 6px; font-size:12.5px; }
/* Pedido do usuário (17/09/2026): status "ativo" verde, "inativo" vermelho
   (antes os dois eram tons de azul/vermelho escuros, pensados pro fundo
   escuro de antes — ver "fundo da Administração virou branco" acima). */
.nv-chip{ display:inline-block; padding:2px 8px; border-radius:999px; font-size:11px; background:#2e8b52; color:#fff; }
.nv-chip.inativo{ background:#e05c5c; color:#fff; }
.nv-linha-form{ display:flex; gap:8px; flex-wrap:wrap; align-items:flex-end; margin-top:16px; padding-top:14px; border-top:1px solid #dde3ea; }
.nv-linha-form .nv-campo{ margin-bottom:0; flex:1 1 140px; }
.nv-obras-lista{ max-height:220px; overflow:auto; border:1px solid #c7d0da; border-radius:8px; padding:8px 10px; margin-top:6px; }
/* Pedido do usuário (17/09/2026): buscar/filtrar/exportar/importar usuários —
   barra de ferramentas acima da tabela de Administração, e cabeçalhos
   clicáveis pra ordenar (ver renderizarTabelaAdmin/usuariosFiltrados em
   nuvem.js). */
#nuvemAdmin .nv-admin-ferramentas{ display:flex; flex-wrap:wrap; gap:8px; align-items:flex-end; margin-bottom:10px; }
#nuvemAdmin .nv-admin-ferramentas .nv-campo{ margin-bottom:0; flex:1 1 200px; min-width:160px; }
/* Botões abaixo da busca, em duas linhas (23/09/2026, pedido do usuário:
   "organizar melhor os botoes... a baixo do buscar colocar criar usuario
   importar e exportar e a baixo desses botoes colocar os outros") —
   ".secundarias" é a segunda linha (catálogos de apoio: setores/escopo e
   tipo/empresas), com uma réguazinha acima pra separar das ações do dia a
   dia (criar/importar/exportar) da primeira linha. */
#nuvemAdmin .nv-admin-acoes{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:10px; }
#nuvemAdmin .nv-admin-acoes.secundarias{ padding-top:10px; margin-top:2px; border-top:1px solid #eef1f4; margin-bottom:14px; }
/* Pedido do usuário (23/09/2026): "esses botoes na edição de usuarios
   ficaram muito grande diminuir tamanho" — ".nv-bt" é genérico (login,
   modais etc.), então o tamanho menor fica só aqui, nos botões de
   criar/importar/exportar/gerenciar-catálogos da Administração. */
#nuvemAdmin .nv-admin-acoes .nv-bt{ padding:7px 12px; font-size:12.5px; }
.nv-tabela th.nv-ord-th{ cursor:pointer; user-select:none; }
.nv-tabela th.nv-ord-th:hover{ color:#2f7fd1; }
.nv-obras-lista label{ display:flex; align-items:center; gap:8px; font-size:13px; padding:4px 0; cursor:pointer; }
/* Pedido do usuário (22/09/2026): "a parte de setores no editar usuário está
   desformatada" — a lista de setores (htmlSelecaoSetores, nuvem.js) reaproveita
   este mesmo checklist (.nv-obras-lista/.nv-obra-linha) só que dentro de um
   ".nv-campo" (pra ganhar o <label>"Setores"</label> de cima) — e ".nv-campo
   input, .nv-campo select" (bem acima neste arquivo) é a regra pensada pros
   CAMPOS DE TEXTO do formulário (width:100%, padding, fundo escuro do
   login/borda), que também casava com QUALQUER <input> aqui dentro, inclusive
   o <input type="checkbox"> de cada linha — esticando a caixinha pra ocupar a
   largura toda (padding:10px 11px também aumenta a área) e empurrando o nome
   do setor pro canto direito, com o texto emendado sem o gap do label (mesmo
   bug do checklist de "Obras…", só que lá nunca apareceu porque aquela lista
   nunca fica dentro de um ".nv-campo"). Restaura a aparência normal de
   checkbox aqui — mais específico que ".nv-campo input" (classe+atributo vs.
   classe+elemento) então ganha independente da ordem no arquivo. */
.nv-obras-lista input[type="checkbox"]{
  width:auto; height:auto; padding:0; margin:0; border:1px solid #c7d0da;
  background:#fff; flex:0 0 auto;
}

/* "Obras…" (abrirObrasDoUsuario, nuvem.js) — só a seleção de obras.
   display:flex (25/09/2026, bug corrigido): o checkbox "Gestor"
   (htmlSelecaoSetores, nuvem.js — .nv-setor-gestor-wrap, só em setor
   Corporativo) caía pra linha de baixo em vez de ficar do lado direito,
   porque o <label> do setor tem display:flex (ver ".nv-obras-lista label"
   logo abaixo) — um flex container é block-level por padrão, então ele
   sozinho já ocupava a largura inteira da linha, empurrando o "Gestor"
   (irmão seguinte, fora do <label>) pro final. Virando a própria
   .nv-obra-linha num flex row, o <label> passa a ser um ITEM de flex
   (encolhe pro tamanho do conteúdo em vez de ocupar a linha inteira) e o
   "Gestor" fica ao lado, colado na direita (justify-content:space-between).
   Não quebra a lista simples de "Obras…" (mesma classe .nv-obra-linha, sem
   "Gestor") — lá só tem o <label> mesmo, então vira o único item da linha,
   sem mudança visual. */
.nv-obra-linha{ padding:5px 0; border-bottom:1px solid #eef1f4; display:flex; align-items:center; justify-content:space-between; gap:10px; }
.nv-obra-linha:last-child{ border-bottom:none; }
.nv-obra-linha label{ padding:3px 0; }

/* Árvore "Por Empresa > Escopo > Tipo > Obra" (23/09/2026, pedido do
   usuário — ver htmlHierarquiaAcessos/desenharArvoreHierarquia, nuvem.js):
   mesmo bug/conserto do comentário logo acima sobre ".nv-obras-lista
   input[type=checkbox]" — o container #nvHierWrap É um ".nv-campo" (pra
   ganhar a margem/label padrão do formulário), então sem este reset as
   checkboxes de cada nível (escopo/tipo/obra) ficariam esticadas feito
   campo de texto. */
.nv-hier-nivel input[type="checkbox"],
#nvHierTodaEmpresa{
  width:auto; height:auto; padding:0; margin:0; border:1px solid #c7d0da;
  background:#fff; flex:0 0 auto;
}
.nv-hier-nivel input[type="checkbox"]:disabled{ opacity:.55; }
#nvHierArvore{ max-height:320px; overflow:auto; border:1px solid #c7d0da; border-radius:8px; padding:6px 12px; }
.nv-hier-nivel.nivel0{ border-top:1px solid #dde3ea; padding-top:8px; }
.nv-hier-nivel.nivel0:first-child{ border-top:none; padding-top:0; }
.nv-hier-nivel.nivel1{ color:#3a4652; }
.nv-hier-nivel.nivel2{ font-size:13px; opacity:.9; }
.nv-hier-nivel:hover{ color:#2f7fd1; }
/* seta de recolher/expandir um grupo de escopo ou de tipo de obra da árvore
   (23/09/2026, pedido do usuário: "conseguir recolher o infraestrutura e o
   drenagem e pavimentacao e o rodovia") — só a seta é clicável, não a linha
   inteira, pra não brigar com o clique de marcar a checkbox do lado. */
.nv-hier-seta{ flex:0 0 auto; width:14px; text-align:center; cursor:pointer; color:#90a4ae; font-size:11px; user-select:none; }
.nv-hier-seta:hover{ color:#2f7fd1; }
/* Pedido do usuário (21/09/2026): "Gerenciar setores…" (abrirGerenciarSetores,
   nuvem.js) — os dois radios (Matriz/Obra) do formulário de criar/editar um
   setor do catálogo, lado a lado (não empilhados como um <select> normal). */
.nv-setor-tipo{ display:flex; gap:14px; align-items:center; height:37px; font-size:13px; }
.nv-setor-tipo label{ display:flex; align-items:center; gap:5px; cursor:pointer; font-weight:400; }

/* ------------------------- importar de arquivo local ------------------------- */
#nvImportarArquivo{ display:block; margin:6px 0 4px; font-size:13px; color:#5b6b7c; }
.nv-import-lista{ max-height:260px; overflow:auto; border:1px solid #c7d0da; border-radius:8px; padding:8px 10px; margin-top:6px; }
.nv-import-linha{ display:flex; align-items:flex-start; gap:8px; font-size:13.5px; padding:5px 0; cursor:pointer; }
.nv-import-linha.nv-import-existente{ opacity:.7; }
.nv-import-aviso{ color:#8a6100; font-size:12px; }
#nvImportarProgresso{ margin-top:12px; font-size:13px; color:#5b6b7c; display:flex; flex-direction:column; gap:3px; }

/* ------------------------- travamento por papel ------------------------- */
/* leitor: sem indicação extra além do soLeitura forçado (o próprio app já
   pinta o cadeado). restricoes: só a tela de Minhas Restrições existe.
   Bug corrigido (29/09/2026, vídeos do usuário): "usuario apenas restricoes
   gestor de um setor... aparece o botao nova restricao e nao consegue
   apertar, fica travado" / "usuario somente restrições que recebe uma
   restrição não consegue abrir a restrição, ver detalhes, comentar, e nem
   consegue clicar em concluir e em devolver". Causa: #mrModalBg (o modal de
   nova/editar/ver detalhes de uma restrição), #mrFimBg (confirmar "Marcar
   como resolvida") e #mrDevBg (confirmar "Devolver") são criados como
   IRMÃOS de #telaMinhasRestricoes direto no <body> (ver o HTML montado em
   minhasRestricoesJs, index.html) — não filhos dela. A regra acima escondia
   TUDO que é filho direto do body e não é #telaMinhasRestricoes (nem os
   dois já liberados, #nuvemAlertas/#nuvemAdminBg) — então esses três
   modais SEMPRE ficavam com display:none!important, mesmo depois do
   próprio JS abrir eles de verdade (adicionar a classe "aberto") — o botão
   clicava, a função rodava, só a tela nunca aparecia. Sem exceção nenhuma
   por PAPEL: acontecia com qualquer usuário forçado pra "Minhas Restrições"
   (papel restricoes), Gestor de setor ou não. */
body.papel-restricoes > *:not(#telaMinhasRestricoes):not(#nuvemAlertas):not(#nuvemAdminBg):not(#mrModalBg):not(#mrFimBg):not(#mrDevBg):not(script):not(style){
  display:none !important;
}
body.papel-restricoes #telaMinhasRestricoes{ display:block !important; }
body.papel-restricoes #mrVoltar{ display:none !important; }

/* master só: esconde os botões de salvar HTML local pra quem não é master
   (a barreira de verdade é no servidor — isto é só a tela). #nvImportarObrasBtn
   (17/09/2026: "Importar obras", movido de dentro da Administração pra um
   botão próprio na tela de seleção de obras — ver garantirBotaoImportarObras
   em nuvem.js) segue a mesma regra: importar de um arquivo local continua
   exclusivo do Master. */
body.papel-nao-master #salvarBtn,
body.papel-nao-master #obSalvarBtn,
body.papel-nao-master #nvImportarObrasBtn{
  display:none !important;
}
/* master e admin: criar/duplicar/excluir obra (pedido do usuário, 17/09/2026,
   mesmo dia — antes disso era só master; ver exigirPodeGerenciarObra em
   netlify/functions/lib/auth.mjs pra barreira de verdade, no servidor) */
body.papel-sem-criar-obra #obNovaBtn,
body.papel-sem-criar-obra .ob-menu-pop [data-acao="duplicar"],
body.papel-sem-criar-obra .ob-menu-pop [data-acao="excluir"]{
  display:none !important;
}
/* edicao: cria baseline/cenário normalmente (isso é outro botão, não um
   destes) e continua vendo/replicando, mas perdeu renomear, excluir E
   marcar/desmarcar ★ oficial (pedido do usuário, 18/09/2026: "quem pode
   marcar a estrela de versão oficial e aprovada é apenas o administrador
   e o master") — ver exigirGerenciarRevisaoObra em
   netlify/functions/lib/auth.mjs pra barreira de verdade, no servidor. */
body.papel-sem-gerenciar-revisao [data-rv-acao="renomear"],
body.papel-sem-gerenciar-revisao [data-rv-acao="excluir"],
body.papel-sem-gerenciar-revisao [data-rv-acao="oficial"]{
  display:none !important;
}
/* leitor/restricoes: o botão "Destravar edição" da tarja de modo
   visualização (#soLeituraTarja) é da função ORIGINAL de travar o próprio
   arquivo com senha — pra esses dois papéis a trava é forçada pelo PAPEL,
   nunca reversível pela própria pessoa (bug relatado 18/09/2026: dava pra
   destravar mesmo assim — ver ligarTravaLeituraNaNuvem em nuvem.js pra
   barreira de verdade, em JS). Some o botão pra não sobrar um "destravar"
   que não faz nada — a tarja em si continua avisando o modo visualização.*/
body.papel-somente-leitura #destravarBtn{
  display:none !important;
}
/* "restricoes_checkin" (25/09/2026, pedido do usuário: "criar permissao
   Restrições e check in no qual o usuario entra na seleção de obras mas só
   consegue ter acesso ao minhas restrições, restrições das obras e check
   in, agora o planejamento nem deve aparecer pra ele... nas caixas das
   obras, restrições e check in, ele não deve ver o botão planejamento na
   seleção de obras e nem dentro das obras") — esconde só o botão
   "Planejamento" de cada card/linha da tela de obras (o seletor por
   data-acao="abrir" pega só esse botão — "Restrições"/"Check in" têm outras
   classes junto, .rs/.ck, e continuam aparecendo normalmente). O atalho de
   navegação entre módulos (pill "Planejamento" dentro de Restrições/
   Check-in) é escondido à parte, em JS — ver __moduloSwitchHtml em
   index.html, porque ali o HTML é montado dinamicamente por função, não dá
   pra travar só com CSS sem também esconder os outros pills. A barreira de
   verdade (mesmo que alguém chame a função de navegação direto pelo
   console) é sempre o servidor — este papel nunca tem a chave livre em
   chavesEditaveisPeloUsuario (auth.mjs), só 'restricoes'/'checkins'. */
body.papel-sem-planejamento .ob-abrir[data-acao="abrir"]{
  display:none !important;
}
