/* =====================================================================
 * bim-revit.css — A casca do módulo BIM: aparência de programa de desktop (fita, navegador de projeto, propriedades, barra de status).
 *
 * Decisão do Rogério (25/jul): o BIM tem cara de programa de projeto, não a do resto
 * do OrçaPRO. O engenheiro que abre isto já sabe onde tudo fica — a fita
 * em cima, Propriedades à esquerda, Navegador de Projeto embaixo dela,
 * ViewCube no canto, barra de status no rodapé.
 *
 * As cores vivem em variáveis PRÓPRIAS (--rv-*), presas ao .bim-revit.
 * Nada aqui vaza para o resto do app, e o tema do app não pinta isto.
 *
 * Tema claro = o do print que ele mandou.
 * Tema escuro = o grafite, para quem trabalha à noite.
 * ===================================================================== */

.bim-revit {
  /* ---- claro (padrão, igual ao print) ---- */
  --rv-titulo-bg: #2f2f2f;
  --rv-titulo-tx: #f0f0f0;
  --rv-fita-bg: #f0f0f0;
  --rv-fita-tx: #1a1a1a;
  --rv-aba-bg: transparent;
  --rv-aba-ativa-bg: #f0f0f0;
  --rv-aba-ativa-linha: #1a6cb5;
  --rv-abas-bg: #e4e4e4;
  --rv-arquivo-bg: #1a6cb5;
  --rv-arquivo-tx: #ffffff;
  --rv-painel-bg: #f0f0f0;
  --rv-painel-tx: #1a1a1a;
  --rv-painel-cab: #e1e1e1;
  --rv-linha: #d4d4d4;
  --rv-linha-forte: #b4b4b4;
  --rv-tela: #ffffff;           /* a área de desenho é BRANCA */
  --rv-tela-2: #f7f9fb;
  --rv-hover: #d8e6f2;
  --rv-ativo: #cce4f7;
  --rv-ativo-borda: #7aaddc;
  --rv-sel: #cce8ff;
  --rv-tx-fraco: #6a6a6a;
  --rv-tx-off: #a0a0a0;
  --rv-status-bg: #f0f0f0;
  --rv-foco: #1a6cb5;
  --rv-sombra: rgba(0,0,0,.18);

  position: relative;
  display: flex;
  flex-direction: column;
  /* o ambiente ocupa a tela como um programa de projeto, não como um cartão:
     sem altura fixa o palco colapsa e o 3D some */
  /* a altura vem de Gestao._bimAjustarAltura: do ponto onde a janela começa
     até o pé da tela (sem a faixa vazia que sobrava embaixo); o min() é o
     valor de antes, para quando a medida ainda não rodou */
  height: var(--rv-altura, min(84vh, 900px));
  background: var(--rv-fita-bg);
  color: var(--rv-fita-tx);
  border: 1px solid var(--rv-linha-forte);
  border-radius: 4px;
  overflow: hidden;
  font-size: var(--t-micro);
  /* a fonte é a de sistema, para não parecer "site" */
  font-family: var(--fonte);
  -webkit-font-smoothing: antialiased;
}

/* Tema escuro, para quem trabalha à noite. A estrutura é a mesma; só a
   paleta muda — inclusive a área de desenho, que fica cinza-escura. */
.bim-revit[data-rv-tema="escuro"] {
  --rv-titulo-bg: #1c1c1c;
  --rv-titulo-tx: #e6e6e6;
  --rv-fita-bg: #383838;
  --rv-fita-tx: #e6e6e6;
  --rv-aba-ativa-bg: #383838;
  --rv-aba-ativa-linha: #4a9fe0;
  --rv-abas-bg: #2b2b2b;
  --rv-arquivo-bg: #1a6cb5;
  --rv-painel-bg: #383838;
  --rv-painel-tx: #e6e6e6;
  --rv-painel-cab: #454545;
  --rv-linha: #4a4a4a;
  --rv-linha-forte: #5a5a5a;
  --rv-tela: #3f3f3f;
  --rv-tela-2: #363636;
  --rv-hover: #4c5a66;
  --rv-ativo: #2d4d68;
  --rv-ativo-borda: #4a9fe0;
  --rv-sel: #2d4d68;
  --rv-tx-fraco: #a8a8a8;
  --rv-tx-off: #6e6e6e;
  --rv-status-bg: #383838;
  --rv-sombra: rgba(0,0,0,.45);
}

/* ---------------------------------------------------------------- TÍTULO */
.rv-titulo {
  display: flex; align-items: center; gap: 8px;
  height: 30px; padding: 0 8px;
  background: var(--rv-titulo-bg); color: var(--rv-titulo-tx);
  font-size: var(--t-micro); flex: 0 0 auto;
}
.rv-titulo-nome {
  flex: 1; text-align: center;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  opacity: .95;
}
.rv-qat { display: flex; align-items: center; gap: 1px; }
.rv-qat button {
  width: 24px; height: 22px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; border: 1px solid transparent; border-radius: 3px;
  color: var(--rv-titulo-tx); cursor: pointer; opacity: .85;
}
.rv-qat button:hover { background: rgba(255,255,255,.14); opacity: 1; }
.rv-qat button:disabled { opacity: .3; cursor: default; }
.rv-qat button svg { width: 15px; height: 15px; }

/* ------------------------------------------------------------------ ABAS */
.rv-abas {
  display: flex; align-items: flex-end; gap: 0;
  background: var(--rv-abas-bg);
  border-bottom: 1px solid var(--rv-linha-forte);
  padding: 0 6px; flex: 0 0 auto;
  overflow-x: auto; scrollbar-width: thin;
}
.rv-abas::-webkit-scrollbar { height: 5px; }
.rv-abas::-webkit-scrollbar-thumb { background: var(--rv-linha-forte); border-radius: 3px; }
.rv-aba {
  appearance: none;
  padding: 6px 13px 7px; margin: 0;
  background: var(--rv-aba-bg); color: var(--rv-fita-tx);
  border: 0; border-bottom: 2px solid transparent;
  font-size: var(--t-micro); font-family: inherit; white-space: nowrap;
  cursor: pointer;
}
.rv-aba:hover { background: var(--rv-hover); }
.rv-aba[aria-selected="true"] {
  background: var(--rv-aba-ativa-bg);
  border-bottom-color: var(--rv-aba-ativa-linha);
  font-weight: var(--p-forte);
}
.rv-aba.rv-aba-arquivo {
  background: var(--rv-arquivo-bg); color: var(--rv-arquivo-tx);
  font-weight: var(--p-forte); margin-right: 4px;
  border-radius: 3px 3px 0 0;
}
.rv-aba.rv-aba-arquivo:hover { filter: brightness(1.12); }
.rv-aba:focus-visible { outline: 2px solid var(--rv-foco); outline-offset: -2px; }

/* ------------------------------------------------------------------ FITA */
.rv-fita {
  display: flex; align-items: stretch; gap: 0;
  background: var(--rv-fita-bg);
  border-bottom: 1px solid var(--rv-linha-forte);
  padding: 4px 6px 0; min-height: 92px; flex: 0 0 auto;
  overflow-x: auto; scrollbar-width: thin;
}
.rv-fita::-webkit-scrollbar { height: 6px; }
.rv-fita::-webkit-scrollbar-thumb { background: var(--rv-linha-forte); border-radius: 3px; }

/* um painel da fita: comandos em cima, nome embaixo, filete à direita */
.rv-painel {
  display: flex; flex-direction: column;
  padding: 0 8px; position: relative;
  border-right: 1px solid var(--rv-linha);
  flex: 0 0 auto;
}
.rv-painel:last-child { border-right: 0; }
.rv-painel-corpo {
  display: flex; align-items: flex-start; gap: 2px;
  flex: 1; padding: 2px 0 4px;
}
.rv-painel-nome {
  text-align: center; font-size: var(--t-mini); color: var(--rv-tx-fraco);
  padding: 2px 0 4px; user-select: none;
}

/* botão grande: ícone em cima, rótulo em duas linhas embaixo */
.rv-cmd {
  appearance: none; font-family: inherit;
  display: flex; flex-direction: column; align-items: center; justify-content: flex-start;
  gap: 3px; width: 62px; min-height: 62px; padding: 5px 3px 4px;
  background: transparent; border: 1px solid transparent; border-radius: 3px;
  color: var(--rv-fita-tx); cursor: pointer; text-align: center;
}
.rv-cmd:hover:not(:disabled) { background: var(--rv-hover); border-color: var(--rv-ativo-borda); }
.rv-cmd:active:not(:disabled) { background: var(--rv-ativo); }
.rv-cmd[aria-pressed="true"] {
  background: var(--rv-ativo); border-color: var(--rv-ativo-borda);
  box-shadow: inset 0 1px 2px var(--rv-sombra);
}
.rv-cmd:disabled { color: var(--rv-tx-off); cursor: default; }
.rv-cmd:disabled .rv-cmd-ico { opacity: .35; }
.rv-cmd:focus-visible { outline: 2px solid var(--rv-foco); outline-offset: -2px; }
.rv-cmd-ico { display: flex; align-items: center; justify-content: center; height: 26px; }
.rv-cmd-ico svg { width: 24px; height: 24px; }
.rv-cmd-rot {
  font-size: var(--t-mini); line-height: 1.15; letter-spacing: -.1px;
  display: flex; flex-direction: column;
}
/* botão pequeno: ícone e rótulo lado a lado, três por coluna */
.rv-cmd.rv-cmd-sm {
  flex-direction: row; align-items: center; justify-content: flex-start;
  width: auto; min-width: 96px; min-height: 0; height: 22px;
  padding: 2px 6px; gap: 5px; text-align: left;
}
.rv-cmd.rv-cmd-sm .rv-cmd-ico { height: 16px; }
.rv-cmd.rv-cmd-sm .rv-cmd-ico svg { width: 15px; height: 15px; }
.rv-cmd.rv-cmd-sm .rv-cmd-rot { flex-direction: row; gap: 3px; font-size: var(--t-mini); }
.rv-col { display: flex; flex-direction: column; gap: 1px; }
/* seta de menu embaixo do botão */
.rv-cmd-seta { font-size: var(--t-mini); line-height: 1; opacity: .65; margin-top: -1px; }
/* selo de recurso do plano pago */
.rv-cmd-pro {
  position: absolute; top: 2px; right: 2px;
  font-size: var(--t-mini); font-weight: var(--p-forte); letter-spacing: .3px;
  background: #f59e0b; color: #1a1a1a; border-radius: 2px; padding: 0 3px;
}
.rv-cmd { position: relative; }

/* ------------------------------------------------------------- CORPO 3 COLUNAS */
.rv-corpo { display: flex; flex: 1; min-height: 0; }

/* coluna esquerda: Propriedades em cima, Navegador embaixo */
.rv-lateral {
  width: var(--rv-lat-w, 268px); flex: 0 0 var(--rv-lat-w, 268px);
  display: flex; flex-direction: column;
  background: var(--rv-painel-bg); color: var(--rv-painel-tx);
  border-right: 1px solid var(--rv-linha-forte);
  min-height: 0;
}
.rv-doca { display: flex; flex-direction: column; min-height: 0; }
/* Propriedades é o painel de trabalho — leva a maior fatia. O Navegador
   guarda um piso para nunca virar uma fresta. */
.rv-doca.rv-props { flex: 0 0 var(--rv-props-h, 62%); }
.rv-doca.rv-nav { flex: 1 1 auto; min-height: 90px; }
.rv-doca-cab {
  display: flex; align-items: center; gap: 6px;
  padding: 5px 8px; font-size: var(--t-micro); font-weight: var(--p-forte);
  background: var(--rv-painel-cab); border-bottom: 1px solid var(--rv-linha);
  flex: 0 0 auto;
}
.rv-doca-cab .rv-x {
  margin-left: auto; width: 18px; height: 18px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; border: 1px solid transparent; border-radius: 2px;
  color: inherit; cursor: pointer; font-size: var(--t-micro); line-height: 1;
}
.rv-doca-cab .rv-x:hover { background: var(--rv-hover); border-color: var(--rv-linha-forte); }
.rv-doca-corpo { flex: 1; overflow: auto; min-height: 0; }

/* cartão do tipo, no alto das Propriedades */
.rv-tipo {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 8px; border-bottom: 1px solid var(--rv-linha);
  background: var(--rv-tela-2);
}
.rv-tipo-mini {
  width: 42px; height: 42px; flex: 0 0 42px;
  display: flex; align-items: center; justify-content: center;
  background: var(--rv-tela); border: 1px solid var(--rv-linha);
  border-radius: 2px;
}
.rv-tipo-mini svg { width: 26px; height: 26px; opacity: .75; }
.rv-tipo-sel { flex: 1; min-width: 0; }
/* sem box-sizing o padding e a borda somam por fora dos 100% e a seta do
   select monta em cima do texto — foi o que apareceu no print da tela */
.rv-tipo-sel select { width: 100%; max-width: 100%; box-sizing: border-box; font-size: var(--t-mini); }
.rv-tipo-linha {
  display: flex; align-items: center; gap: 6px;
  padding: 5px 8px; border-bottom: 1px solid var(--rv-linha);
  font-size: var(--t-mini);
}
.rv-tipo-linha b { flex: 1; font-weight: var(--p-forte); }
.rv-btn-tipo {
  font-size: var(--t-mini); padding: 2px 8px;
  background: var(--rv-painel-cab); color: inherit;
  border: 1px solid var(--rv-linha-forte); border-radius: 2px; cursor: pointer;
}
.rv-btn-tipo:hover { background: var(--rv-hover); }

/* tabela de parâmetros */
.rv-params { width: 100%; border-collapse: collapse; font-size: var(--t-mini); }
.rv-params th {
  text-align: left; font-weight: var(--p-forte); font-size: var(--t-mini);
  background: var(--rv-painel-cab); color: var(--rv-painel-tx);
  padding: 4px 8px; border-top: 1px solid var(--rv-linha);
  border-bottom: 1px solid var(--rv-linha);
  position: sticky; top: 0; z-index: 1;
  cursor: pointer; user-select: none;
}
.rv-params th .rv-seta { font-size: var(--t-mini); margin-right: 4px; display: inline-block; }
.rv-params td { padding: 3px 8px; border-bottom: 1px solid var(--rv-linha); vertical-align: middle; }
.rv-params tr:nth-child(even) td { background: var(--rv-tela-2); }
.rv-params td.rv-p-nome { width: 47%; color: var(--rv-painel-tx); }
.rv-params tr.rv-p-off td.rv-p-nome,
.rv-params tr.rv-p-off td.rv-p-val { color: var(--rv-tx-off); }
.rv-params td.rv-p-val input[type="text"],
.rv-params td.rv-p-val input[type="number"],
.rv-params td.rv-p-val select {
  width: 100%; max-width: 100%; box-sizing: border-box; font-size: var(--t-mini); padding: 1px 3px;
  background: var(--rv-tela); color: var(--rv-painel-tx);
  border: 1px solid transparent; border-radius: 0;
  font-family: inherit;
}
.rv-params td.rv-p-val input:hover, .rv-params td.rv-p-val select:hover { border-color: var(--rv-linha-forte); }
.rv-params td.rv-p-val input:focus, .rv-params td.rv-p-val select:focus {
  border-color: var(--rv-foco); outline: none;
}
.rv-params td.rv-p-val .rv-p-ro { color: var(--rv-tx-fraco); padding: 1px 3px; display: block; }
.rv-p-motivo { font-size: var(--t-mini); color: var(--rv-tx-fraco); font-style: italic; }
/* Aviso de NORMA e pendência de DADO não podem parecer a mesma coisa: um diz
   que a parede está errada, o outro que falta informação para fechar a conta. */
.rv-p-aviso { font-size: var(--t-mini); line-height: 1.45; padding: 7px 9px; border-left: 3px solid #b45309;
  background: rgba(180, 83, 9, .10); color: var(--rv-tx); }
.rv-p-pend { font-size: var(--t-mini); line-height: 1.45; padding: 6px 9px; border-left: 3px solid var(--rv-linha);
  color: var(--rv-tx-fraco); }
.rv-props-pe {
  display: flex; align-items: center; gap: 6px;
  padding: 4px 8px; border-top: 1px solid var(--rv-linha);
  background: var(--rv-painel-cab); flex: 0 0 auto;
}
.rv-props-pe .rv-aplicar { margin-left: auto; }

/* navegador de projeto */
.rv-busca {
  display: flex; align-items: center; gap: 5px;
  padding: 4px 8px; border-bottom: 1px solid var(--rv-linha);
  flex: 0 0 auto;
}
.rv-busca input {
  flex: 1; font-size: var(--t-mini); padding: 2px 5px;
  background: var(--rv-tela); color: var(--rv-painel-tx);
  border: 1px solid var(--rv-linha-forte); border-radius: 2px;
  font-family: inherit;
}
.rv-arv { list-style: none; margin: 0; padding: 2px 0; font-size: var(--t-mini); }
.rv-arv ul { list-style: none; margin: 0; padding-left: 13px; }
.rv-no {
  display: flex; align-items: center; gap: 4px;
  padding: 2px 8px; cursor: pointer; user-select: none;
  white-space: nowrap;
}
.rv-no:hover { background: var(--rv-hover); }
.rv-no[aria-selected="true"] { background: var(--rv-sel); }
.rv-no-exp {
  width: 12px; flex: 0 0 12px; text-align: center;
  font-size: var(--t-mini); color: var(--rv-tx-fraco);
}
.rv-no-ico { width: 14px; flex: 0 0 14px; display: inline-flex; }
.rv-no-ico svg { width: 13px; height: 13px; }
.rv-no-tx { overflow: hidden; text-overflow: ellipsis; }
.rv-no-n { color: var(--rv-tx-fraco); font-size: var(--t-mini); margin-left: 3px; }

/* ------------------------------------------------------- ÁREA DE DESENHO */
.rv-area {
  flex: 1; position: relative; min-width: 0; min-height: 0;
  display: flex; flex-direction: column;
  background: var(--rv-tela);
}
.rv-docs {
  display: flex; align-items: stretch; gap: 1px;
  background: var(--rv-abas-bg);
  border-bottom: 1px solid var(--rv-linha-forte);
  padding: 2px 4px 0; flex: 0 0 auto;
}
.rv-doc {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 9px; font-size: var(--t-mini);
  background: var(--rv-painel-cab); color: var(--rv-fita-tx);
  border: 1px solid var(--rv-linha); border-bottom: 0;
  border-radius: 3px 3px 0 0; cursor: pointer;
}
.rv-doc[aria-selected="true"] { background: var(--rv-tela); font-weight: var(--p-forte); }
.rv-doc .rv-x { font-size: var(--t-mini); opacity: .6; }
.rv-doc .rv-x:hover { opacity: 1; }
.rv-palco { flex: 1; position: relative; min-height: 0; }

/* barra de controle da vista, no rodapé da área */
.rv-vistabar {
  display: flex; align-items: center; gap: 3px;
  padding: 2px 6px; flex: 0 0 auto;
  background: var(--rv-painel-bg);
  border-top: 1px solid var(--rv-linha);
  font-size: var(--t-mini); overflow-x: auto;
}
.rv-vistabar .rv-vb-rot { color: var(--rv-tx-fraco); margin-right: 6px; white-space: nowrap; }
.rv-vb {
  width: 22px; height: 20px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; border: 1px solid transparent; border-radius: 2px;
  color: var(--rv-fita-tx); cursor: pointer; flex: 0 0 auto;
}
.rv-vb:hover:not(:disabled) { background: var(--rv-hover); border-color: var(--rv-ativo-borda); }
.rv-vb[aria-pressed="true"] { background: var(--rv-ativo); border-color: var(--rv-ativo-borda); }
.rv-vb:disabled { opacity: .35; cursor: default; }
.rv-vb svg { width: 14px; height: 14px; }

/* --------------------------------------------------------- BARRA DE STATUS */
.rv-status {
  display: flex; align-items: center; gap: 10px;
  padding: 3px 8px; flex: 0 0 auto;
  background: var(--rv-status-bg);
  border-top: 1px solid var(--rv-linha-forte);
  font-size: var(--t-mini); color: var(--rv-painel-tx);
}
.rv-status-sel { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rv-status-dir { display: flex; align-items: center; gap: 10px; color: var(--rv-tx-fraco); white-space: nowrap; }
.rv-status-dir b { color: var(--rv-painel-tx); font-variant-numeric: tabular-nums; }

/* --------------------------------------------------------------- MOBILE */
/* No celular a fita vira uma folha que sobe pelo botão Ferramentas, e as
   colunas laterais viram gavetas — nenhum comando fica inalcançável. */
@media (max-width: 900px) {
  .rv-lateral {
    position: absolute; left: 0; top: 0; bottom: 0; z-index: 12;
    width: min(300px, 88%); flex-basis: auto;
    box-shadow: 4px 0 18px var(--rv-sombra);
    transform: translateX(-102%); transition: transform .18s ease;
  }
  .bim-revit[data-rv-lateral="1"] .rv-lateral { transform: none; }
  .rv-fita {
    position: absolute; left: 0; right: 0; bottom: 0; z-index: 14;
    max-height: 62%; overflow-y: auto; flex-wrap: wrap;
    background: var(--rv-fita-bg);
    border-top: 1px solid var(--rv-linha-forte);
    box-shadow: 0 -6px 20px var(--rv-sombra);
    transform: translateY(102%); transition: transform .18s ease;
  }
  .bim-revit[data-rv-fita="1"] .rv-fita { transform: none; }
  .rv-painel { border-right: 0; border-bottom: 1px solid var(--rv-linha); width: 100%; }
  .rv-painel-corpo { flex-wrap: wrap; }
  .rv-titulo-nome { font-size: var(--t-mini); }
}

/* tela cheia: abaixo de modal (z-50), busca (z-70) e toast */
.bim-revit[data-rv-cheia="1"] {
  position: fixed; inset: 0; z-index: 48;
  border-radius: 0; border: 0;
}

/* ------------------------------------------------- ESCONDER A COLUNA LATERAL
 * No celular a lateral já era gaveta. No COMPUTADOR ela era fixa: 268px de
 * Propriedades e Navegador ocupados o tempo todo, mesmo quando a pessoa só
 * quer olhar o modelo. Numa tela de notebook isso é um quinto da largura útil
 * do 3D. Agora fecha e abre pelo mesmo botão, em qualquer tamanho de tela. */
.bim-revit[data-rv-lateral-off="1"] .rv-lateral { display: none; }

/* ------------------------------------------------------------- MODO FOCO
 * "Tela cheia" só esticava o quadro — a fita, a lateral e a barra de status
 * continuavam lá, e a tela seguia poluída. O modo FOCO tira tudo o que não é
 * o modelo: sobra o 3D e o dock de ferramentas do próprio visualizador, que
 * é onde mora a ferramenta selecionada.
 * Sai com Esc ou pelo mesmo botão — e o aviso no rodapé diz isso, porque
 * modo que se entra sem saber como sair é armadilha. */
.bim-revit[data-rv-foco="1"] .rv-titulo,
.bim-revit[data-rv-foco="1"] .rv-abas,
.bim-revit[data-rv-foco="1"] .rv-fita,
.bim-revit[data-rv-foco="1"] .rv-lateral,
.bim-revit[data-rv-foco="1"] .rv-docs,
.bim-revit[data-rv-foco="1"] .rv-status { display: none !important; }
/* a `rv-vistabar` FICA: ela é a barra do próprio 3D (perspectiva, sol,
   enquadrar) — tirar ela seria tirar a ferramenta junto com a poluição. */
.bim-revit[data-rv-foco="1"] .rv-corpo { padding: 0; }

/* a saída fica sempre à vista, sobre o modelo */
.rv-foco-sair {
  position: absolute; right: 12px; top: 12px; z-index: 60;
  display: none; align-items: center; gap: 7px;
  padding: 7px 13px; border-radius: 9px; cursor: pointer;
  background: rgba(15, 39, 64, .92); color: #dbe8f5;
  border: 1px solid #24435f; font-size: var(--t-micro); font-weight: var(--p-forte);
}
.bim-revit[data-rv-foco="1"] .rv-foco-sair { display: inline-flex; }
.rv-foco-sair:hover { background: rgba(15, 39, 64, 1); }

@media (prefers-reduced-motion: reduce) {
  .rv-lateral, .rv-fita { transition: none; }
}


/* =====================================================================
 * TOQUE E TELA PEQUENA
 * O gate achou duas coisas que só doem no celular: a tabela de níveis
 * espremia o campo "Nome" a 37 px (ela rola E o campo colapsa, o pior dos
 * dois mundos), e toda a justificativa dos pesos vivia em `title`, que
 * não existe em aparelho de toque.
 * ===================================================================== */
@media (max-width: 720px) {
  /* a tabela rola em vez de espremer: cada coluna guarda um mínimo legível */
  #modal-bg .modal .body table.tbl { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }
  #modal-bg .modal .body table.tbl th,
  #modal-bg .modal .body table.tbl td { white-space: nowrap; }
  #modal-bg .modal .body table.tbl input[type="text"] { min-width: 150px; }
  #modal-bg .modal .body table.tbl input[type="number"] { min-width: 88px; }
  /* alvo de toque: 1px de borda não se acerta com o dedo */
  #modal-bg .modal .body .btn.sm { min-height: 34px; min-width: 34px; }
}

/* A nota da peça deixa de ser só tooltip: vira linha visível abaixo do nome.
   Em tela grande fica discreta; no toque é a ÚNICA forma de ler. */
.rv-nota-peca { display: block; font-size: var(--t-mini); line-height: 1.4; color: var(--rv-tx-fraco, #6a6a6a);
  margin-top: 2px; max-width: 46ch; }
@media (min-width: 721px) { .rv-nota-peca { display: none; } }

/* ------------------------------------------------------------------
 * PAGINAÇÃO E ELEVAÇÃO — a tabela de números no celular.
 * Em duas colunas numa tela de 390 px o rótulo tem nota longa, come a
 * linha toda e o VALOR — que é o que o cara foi ali ver — some para
 * fora. Em tela estreita as duas células viram linhas empilhadas.
 * ------------------------------------------------------------------ */
@media (max-width: 620px) {
  .pag-num td { display: block; width: auto !important; padding: 4px 8px !important; }
  .pag-num td:first-child { padding-bottom: 0 !important; }
  .pag-num td:last-child { padding-top: 2px !important; font-weight: var(--p-forte); }
  .pag-num tr { display: block; border-bottom: 1px solid var(--linha); }
}

/* =====================================================================
 * SIMULAÇÃO 4D — a casca enquanto o painel 4D está aberto (Gestao._b4Casca)
 * - b4-sem-lateral: a coluna Propriedades/Navegador sai do caminho (com a
 *   gaveta de 640 px ela deixava o 3D com menos de 500 px). É classe
 *   própria, não o `data-rv-lateral-off` — esse é a preferência guardada da
 *   pessoa, e fechar o painel 4D não pode mudá-la.
 * - b4-largo-on: painel largo (ou 3D na outra janela) — a fita e as abas
 *   também saem e a lista de atividades ganha a altura.
 * ===================================================================== */
.bim-revit.b4-sem-lateral .rv-lateral { display: none; }
.bim-revit.b4-largo-on .rv-fita,
.bim-revit.b4-largo-on .rv-abas,
.bim-revit.b4-largo-on .rv-docs { display: none !important; }

/* =====================================================================
 * TOPO ORGANIZADO (30/09/2026) — pedido do Rogério: nada flutuando em
 * cima do 3D, tudo no alto da janela.
 * ===================================================================== */

/* as ações da página, na barra de título (antes: duas linhas acima da janela) */
.rv-titulo-acoes { display: flex; align-items: center; gap: 4px; margin-right: 6px; }
.rv-qat .rv-tacao {
  width: auto; height: 22px; padding: 0 8px; gap: 5px;
  display: inline-flex; align-items: center;
  border: 1px solid rgba(255,255,255,.2); border-radius: 3px;
  background: transparent; color: var(--rv-titulo-tx);
  font: inherit; font-size: var(--t-mini); white-space: nowrap; opacity: .92; cursor: pointer;
}
.rv-qat .rv-tacao:hover { background: rgba(255,255,255,.14); opacity: 1; }
.rv-qat .rv-tacao-pri { background: #1a6cb5; border-color: #1a6cb5; opacity: 1; }
.rv-qat .rv-tacao svg { width: 14px; height: 14px; flex: 0 0 auto; }
/* tela mais estreita: só os ícones (o nome fica na dica) — a barra não quebra */
@media (max-width: 1560px) { .rv-qat .rv-tacao .rv-tacao-rot { display: none; } .rv-qat .rv-tacao { padding: 0 6px; } }
/* PRANCHAS à vista (09/10/2026): o nome sempre escrito — o dono não achava onde ficam as pranchas */
.rv-qat .rv-tacao.rv-qat-pranchas { margin-left: 8px; }
@media (max-width: 1560px) { .rv-qat .rv-tacao.rv-qat-pranchas .rv-tacao-rot { display: inline; } .rv-qat .rv-tacao.rv-qat-pranchas { padding: 0 8px; } }

/* os botões rápidos, à direita das abas (o que flutuava em cima do 3D) */
.rv-abas-dir { margin-left: auto; display: flex; align-items: center; gap: 4px; padding: 3px 4px 3px 12px; flex: 0 0 auto; }
.rv-rap {
  display: inline-flex; align-items: center; gap: 5px;
  height: 26px; padding: 0 9px;
  border: 1px solid var(--rv-linha-forte); border-radius: 4px;
  background: var(--rv-fita-bg); color: var(--rv-fita-tx);
  font: inherit; font-size: var(--t-micro); white-space: nowrap; cursor: pointer;
}
.rv-rap:hover:not(:disabled) { background: var(--rv-hover); }
.rv-rap[aria-pressed="true"] { background: var(--rv-ativo); border-color: var(--rv-ativo-borda); }
.rv-rap:disabled { opacity: .45; cursor: default; }
.rv-rap svg { width: 14px; height: 14px; flex: 0 0 auto; }
.rv-rap-pri { background: var(--rv-arquivo-bg); border-color: var(--rv-arquivo-bg); color: var(--rv-arquivo-tx); }
.rv-rap-pri:hover:not(:disabled) { background: #155a98; }
.rv-rap-sep { width: 1px; height: 18px; background: var(--rv-linha-forte); margin: 0 4px; }
@media (max-width: 1280px) { .rv-rap:not(.rv-rap-pri) .rv-rap-rot { display: none; } }

/* ⚠ A BARRA FLUTUANTE SAI DE CIMA DO 3D no computador: cada botão dela tem
   comando na fita (Gestao._bimCascaAcoes → BIM.botao). Ela CONTINUA no DOM
   (o estado e o despacho moram nela). No celular (≤ 640 px) e no modo foco
   (Maximizar 3D, janela do 3D) — onde a fita some — ela volta a aparecer. */
@media (min-width: 641px) {
  .bim-revit:not([data-rv-foco="1"]) .rv-palco [data-bim-barra],
  .bim-revit:not([data-rv-foco="1"]) .rv-palco [data-bim-barra-toggle] { display: none !important; }
}

/* a etiqueta do painel minimizado / levado para outra janela */
.bim-drawer-pill {
  position: absolute; top: 10px; right: 10px; z-index: 7;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px; border-radius: 999px;
  border: 1px solid var(--rv-ativo-borda, #7aaddc); background: var(--surface, #fff); color: var(--texto, #1a1a1a);
  font-size: var(--t-micro); font-weight: var(--p-forte); cursor: pointer; box-shadow: 0 4px 14px rgba(0,0,0,.25);
}
.bim-drawer-pill:hover { filter: brightness(.97); }

/* o painel na OUTRA JANELA (Gestao._bimPopAbrir) */
.bim-pop { display: flex; flex-direction: column; min-height: 100vh; background: var(--surface, #fff); }
.bim-pop-cab {
  position: sticky; top: 0; z-index: 5;
  display: flex; align-items: center; gap: 8px;
  padding: 10px 14px; border-bottom: 2px solid var(--linha, #d4d4d4); background: var(--surface, #fff);
}
.bim-pop-corpo { flex: 1; padding: 12px 14px; }

/* =====================================================================
 * AMBIENTE DE PROGRAMA (30/09/2026) — pedido do Rogério, com as capturas de
 * um programa de projeto como referência: o BIM abre como um programa (tela inteira),
 * Propriedades e Navegador recolhem numa aba com a seta e têm largura de
 * arrastar, as ferramentas abrem numa janela À DIREITA (ao lado do 3D, não
 * por cima), e as vistas abrem em abas, lado a lado ou em outra janela.
 * ===================================================================== */

/* ⚠ MODO PROGRAMA: some o menu e o topo do OrçaPRO, a janela do BIM ocupa a
   tela inteira. Só no computador — no celular o BIM já tem o seu modo. A
   volta é o botão "OrçaPRO" no canto da barra de título. */
@media (min-width: 641px) {
  body.bim-app { overflow: hidden; }
  body.bim-app .sidebar, body.bim-app .topbar { display: none !important; }
  body.bim-app .bim-revit:not([data-rv-cheia="1"]) {
    position: fixed; inset: 0; height: auto !important; z-index: 40;
    border: 0; border-radius: 0;
  }
}

/* barra de título: volta ao OrçaPRO e a obra */
.rv-sair {
  display: inline-flex; align-items: center; gap: 5px; height: 22px; padding: 0 9px 0 6px; margin-right: 4px;
  border: 1px solid rgba(255,255,255,.22); border-radius: 3px; background: rgba(255,255,255,.06);
  color: var(--rv-titulo-tx); font: inherit; font-size: var(--t-mini); font-weight: var(--p-forte); cursor: pointer;
}
.rv-sair:hover { background: rgba(255,255,255,.16); }
.rv-sair svg { width: 13px; height: 13px; }
.rv-titulo-nome { display: flex; align-items: center; justify-content: center; gap: 6px; min-width: 0; }
/* ⚠ especificidade alta de propósito: o <select> global do app (altura 38px,
   padding e fundo branco) cortava o nome da obra na barra de 30px */
.bim-revit .rv-titulo select.rv-obra {
  max-width: 340px; width: auto; height: 22px; min-height: 0; line-height: 18px; margin: 0;
  padding: 1px 22px 1px 8px; font: inherit; font-size: var(--t-micro); font-weight: var(--p-forte);
  color: var(--rv-titulo-tx); background-color: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.2);
  border-radius: 3px; box-shadow: none; cursor: pointer;
}
.bim-revit .rv-titulo select.rv-obra option { color: #1a1a1a; background: #fff; }
/* ⚠ tablet: o app força 16px em todo campo no toque (senão o Safari amplia a
   tela a cada toque — css/app.css, "hover: none and pointer: coarse"); com
   22px de altura o nome da obra saía cortado embaixo na barra de título */
@media (hover: none) and (pointer: coarse) {
  .bim-revit .rv-titulo select.rv-obra { height: 26px; line-height: 22px; padding-top: 0; padding-bottom: 0; }
}
.rv-titulo-app { opacity: .75; white-space: nowrap; }

/* o tamanho da interface (Vista → Tamanho da interface): letras e botões, nunca o 3D */
.bim-revit .rv-titulo, .bim-revit .rv-abas, .bim-revit .rv-fita, .bim-revit .rv-lateral, .bim-revit .rv-lat-aba,
.bim-revit .rv-docs, .bim-revit .rv-vistabar, .bim-revit .rv-status, .bim-revit .rv-direita { zoom: var(--rv-ui, 1); }

/* lateral: seta de recolher, divisória Propriedades/Navegador, alça de largura, aba de volta */
.rv-doca-cab .rv-recolher { margin-left: auto; font-size: var(--t-mini); }
.rv-split-h { flex: 0 0 5px; cursor: row-resize; background: var(--rv-linha); border-top: 1px solid var(--rv-linha-forte); }
.rv-split-h:hover, .rv-alca:hover { background: var(--rv-ativo-borda); }
.rv-alca { flex: 0 0 5px; width: 5px; cursor: col-resize; background: var(--rv-linha); z-index: 3; }
.bim-revit[data-rv-lateral-off="1"] .rv-alca-lat { display: none; }
.rv-lat-aba {
  display: none; flex: 0 0 22px; width: 22px; padding: 8px 0; margin: 0;
  flex-direction: column; align-items: center; gap: 8px;
  background: var(--rv-painel-cab); color: var(--rv-painel-tx);
  border: 0; border-right: 1px solid var(--rv-linha-forte); cursor: pointer; font: inherit;
}
.rv-lat-aba:hover { background: var(--rv-hover); }
.rv-lat-aba-seta { font-size: var(--t-mini); }
.rv-lat-aba-rot { writing-mode: vertical-rl; font-size: var(--t-mini); font-weight: var(--p-forte); letter-spacing: .3px; }
.bim-revit[data-rv-lateral-off="1"] .rv-lat-aba { display: flex; }
@media (max-width: 900px) { .rv-lat-aba, .rv-alca-lat { display: none !important; } }

/* a janela da direita (as ferramentas abertas pela fita), ao lado do 3D */
.rv-direita { display: none; flex: 0 0 var(--rv-dir-w, 440px); width: var(--rv-dir-w, 440px); min-width: 0; flex-direction: column; background: var(--surface, #fff); }
.rv-alca-dir { display: none; }
.bim-revit[data-rv-direita="1"] .rv-direita { display: flex; }
.bim-revit[data-rv-direita="1"] .rv-alca-dir { display: block; }
.rv-direita > #bim-drawer { position: relative !important; inset: auto !important; width: auto !important; flex: 1; min-height: 0; box-shadow: none !important; border-left: 1px solid var(--rv-linha-forte) !important; }
.bim-revit.b4-largo-on[data-rv-direita="1"] .rv-direita { flex-basis: 72%; width: 72%; }
/* arrastando uma alça: o 3D não rouba o ponteiro */
.bim-revit[data-rv-arrastando="1"] .rv-palco, .bim-revit[data-rv-arrastando="1"] .rv-direita { pointer-events: none; }
.bim-revit[data-rv-arrastando="1"] { cursor: col-resize; user-select: none; }

/* abas de vista: botões à direita e o menu do botão direito */
.rv-docs { align-items: flex-end; }
.rv-docs-dir { margin-left: auto; display: flex; align-items: center; gap: 4px; padding: 0 4px 3px; }
.rv-docs-bt {
  display: inline-flex; align-items: center; gap: 4px; height: 20px; padding: 0 7px;
  border: 1px solid var(--rv-linha-forte); border-radius: 3px; background: var(--rv-fita-bg); color: var(--rv-fita-tx);
  font: inherit; font-size: var(--t-mini); cursor: pointer;
}
.rv-docs-bt:hover { background: var(--rv-hover); }
.rv-docs-bt[aria-pressed="true"] { background: var(--rv-ativo); border-color: var(--rv-ativo-borda); }
.rv-docs-bt svg { width: 12px; height: 12px; }
.rv-doc[data-rv-fora="1"] { font-style: italic; opacity: .8; }
.rv-menu-doc {
  position: fixed; z-index: 80; min-width: 220px; background: #fff; color: #1a1a1a;
  border: 1px solid #b4b4b4; box-shadow: 0 6px 18px rgba(0,0,0,.22); padding: 4px 0;
  font: var(--t-micro) var(--fonte);
}
.rv-menu-doc div { padding: 5px 14px; cursor: pointer; white-space: nowrap; }
.rv-menu-doc div:hover { background: #d8e6f2; }
/* SELECIONAR TODAS AS INSTÂNCIAS (js/bimselinst.js): o menu do clique direito com o submenu de critérios */
.rv-menu-doc.bsi-menu { min-width: 250px; max-width: 340px; z-index: 120; }   /* acima dos recados (.toasts, 100): o recado da peça criada cobria o fim do menu */
.rv-menu-doc.bsi-menu div { padding: 0; white-space: normal; }
.rv-menu-doc.bsi-menu div:hover { background: transparent; }
.bsi-menu .bsi-cab { padding: 4px 14px 6px !important; font-weight: var(--p-forte); color: #1a1a1a; border-bottom: 1px solid #e2e2e2; margin-bottom: 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap !important; }
.bsi-menu .bsi-fraco { font-weight: var(--p-normal); color: #5b6b7c; }
.bsi-menu .bsi-item { position: relative; padding: 5px 14px !important; cursor: pointer; display: flex; align-items: center; gap: 6px; white-space: nowrap !important; }
.bsi-menu .bsi-item:hover, .bsi-menu .bsi-item.bsi-aberto { background: #d8e6f2 !important; }
.bsi-menu .bsi-item.bsi-off { color: #9aa3ad; cursor: default; }
.bsi-menu .bsi-item.bsi-off:hover { background: transparent !important; }
.bsi-menu .bsi-seta { margin-left: auto; color: #5b6b7c; }
.bsi-menu .bsi-tecla { margin-left: auto; padding-left: 16px; color: #7a8590; font-size: var(--t-mini); }
.bsi-menu .bsi-sep { height: 1px; background: #e2e2e2; margin: 3px 0; }
.bsi-menu .bsi-sub { display: none; position: absolute; left: 100%; top: -5px; width: 320px; background: #fff; color: #1a1a1a; border: 1px solid #b4b4b4; box-shadow: 0 6px 18px rgba(0,0,0,.22); padding: 6px 0 !important; cursor: default; }
.bsi-menu.bsi-sub-esq .bsi-sub { left: auto; right: 100%; }
.bsi-menu .bsi-item.bsi-aberto > .bsi-sub, .bsi-menu .bsi-temsub:hover > .bsi-sub { display: block; }
.bsi-menu .bsi-crit { padding: 5px 12px !important; border-bottom: 1px solid #f0f0f0; }
.bsi-menu .bsi-crit:last-of-type { border-bottom: 0; }
.bsi-menu .bsi-crit-nome { font-weight: var(--p-forte); margin-bottom: 4px !important; white-space: nowrap !important; overflow: hidden; text-overflow: ellipsis; }
.bsi-menu .bsi-crit-bts { display: flex; gap: 6px; }
.bsi-menu .bsi-bt { flex: 1; font: inherit; font-size: var(--t-mini); padding: 4px 6px; border: 1px solid #b4c3d2; background: #f4f8fb; color: #1a2b3c; border-radius: 4px; cursor: pointer; }
.bsi-menu .bsi-bt:hover { background: #d8e6f2; border-color: #2d6a9c; }
.bsi-menu .bsi-bt:focus-visible { outline: 2px solid #2d6a9c; outline-offset: 1px; }
.bsi-menu .bsi-bt[disabled] { opacity: .5; cursor: default; }
.bsi-menu .bsi-dica { padding: 4px 12px 0 !important; color: #7a8590; font-size: var(--t-mini); }
.bp1-lote { margin: 0 0 6px; padding: 4px 8px; border-radius: 4px; background: var(--rv-hover, #e8f0f7); font-size: var(--t-mini); font-weight: var(--p-forte); }

/* as vistas no palco: uma por vez (abas) ou em grade (lado a lado) */
.bim-grade { position: absolute; inset: 0; display: grid; gap: 3px; background: var(--rv-linha-forte); }
.bim-grade > .bim-tela { position: relative; min-width: 0; min-height: 0; overflow: hidden; background: var(--rv-tela); }
.bim-grade[data-modo="abas"] > .bim-tela:not([data-ativa="1"]) { display: none !important; }
.bim-grade[data-modo="lado"] > .bim-tela[data-ativa="1"] { box-shadow: inset 0 0 0 2px #1a6cb5; }
.bim-tela-rot {
  display: none; position: absolute; left: 8px; bottom: 6px; z-index: 6; pointer-events: none;
  font-size: var(--t-mini); font-weight: var(--p-forte); color: #1a1a1a; background: rgba(255,255,255,.82); padding: 1px 7px; border-radius: 3px;
}
.bim-grade[data-modo="lado"] .bim-tela-rot { display: block; }
.bim-tela-fora {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; flex-direction: column; gap: 8px;
  color: var(--rv-tx-fraco); font-size: var(--t-micro); z-index: 5; background: var(--rv-tela-2);
}

/* ---------- VISTAS 2D: planta e corte em desenho técnico (js/bim2dui.js + js/desenho2d.js) ----------
   Papel e tinta seguem o tema do BIM (claro = papel branco, escuro = cinza do tema escuro).
   A espessura da linha mora no SVG (penas fina/média/grossa, non-scaling-stroke). */
.bim-grade > .bim-tela.bim-tela-2d { --d2-papel: #ffffff; --d2-tinta: #111111; --d2-fraco: #2b2b2b; --d2-sel: #1a6cb5; background: var(--d2-papel); }
.bim-revit[data-rv-tema="escuro"] .bim-grade > .bim-tela.bim-tela-2d { --d2-papel: #232323; --d2-tinta: #ececec; --d2-fraco: #d2d2d2; --d2-sel: #4a9fe0; }
.d2-vista-tela { position: absolute; inset: 0; overflow: hidden; cursor: default; touch-action: none; user-select: none; }
/* SELECIONAR (js/bimselecao.js, 09/10/2026): seta no padrão; a mão só com a Mão ligada e durante o mover */
.d2-vista-tela[data-d2-mao] { cursor: grab; }
.d2-vista-tela[data-d2-arrasta] { cursor: grabbing; }
.d2-vista-tela[data-d2-pick] { cursor: crosshair; }
.d2-vista-tela svg { width: 100%; height: 100%; display: block; }
.d2-papel { fill: var(--d2-papel); }
.d2-corte { stroke: var(--d2-tinta); stroke-linejoin: miter; }
.d2-vista { stroke: var(--d2-fraco); fill: none; stroke-linecap: round; }
.d2-cota line, .d2-eixo, .d2-nivel-l, .d2-tit-l { stroke: var(--d2-tinta); }
.d2-cota-tx, .d2-nivel-tx, .d2-tit-tx, .d2-tit-esc, .d2-marca-tx { fill: var(--d2-tinta); font-family: var(--fonte); }
.d2-tit-tx, .d2-marca-tx { font-weight: var(--p-forte); }
.d2-cota-pt, .d2-marca-seta, .d2-nivel-tri { fill: var(--d2-tinta); }
.d2-marca-circ { fill: var(--d2-papel); stroke: var(--d2-tinta); }
.d2-marca { cursor: pointer; }
.d2-marca:hover .d2-marca-circ, .d2-marca:hover .d2-marca-seta { stroke: var(--d2-sel); fill: var(--d2-sel); }
.d2-marca:hover .d2-marca-tx { fill: #fff; }
.d2-svg pattern line { stroke: var(--d2-tinta); }
/* ACIMA DO CORTE (js/desenho2d.js Acima, 14/10/2026): a projeção tracejada da peça acima do plano, em cinza */
.bim-grade > .bim-tela.bim-tela-2d { --d2-acima: #6b7480; }
.bim-revit[data-rv-tema="escuro"] .bim-grade > .bim-tela.bim-tela-2d { --d2-acima: #a3acb7; }
.d2-acima-l { stroke: var(--d2-acima, #6b7480); fill: none; stroke-linecap: butt; }
.d2-acima-tx { fill: var(--d2-acima, #6b7480); font-family: var(--fonte); }
/* P6 (js/bimmodelovista.js): estilos de objeto RA — meio-tom, marcas de elevação e de chamada, região de recorte */
.bim-grade > .bim-tela.bim-tela-2d { --d2-meiotom: #9aa0a6; }
.bim-revit[data-rv-tema="escuro"] .bim-grade > .bim-tela.bim-tela-2d { --d2-meiotom: #7c838b; }
.d2-p6-l { fill: none; stroke-linecap: round; }
.d2-p6-chamada-l, .d2-p6-recorte { stroke: var(--d2-tinta); fill: none; }
.d2-p6-elev, .d2-p6-chamada { cursor: pointer; }
.d2-p6-elev:hover .d2-marca-circ, .d2-p6-elev:hover .d2-marca-seta, .d2-p6-chamada:hover .d2-marca-circ { stroke: var(--d2-sel); fill: var(--d2-sel); }
.d2-p6-elev:hover .d2-marca-tx, .d2-p6-chamada:hover .d2-marca-tx { fill: #fff; }
.d2-p6-chamada:hover .d2-p6-chamada-l { stroke: var(--d2-sel); }
.d2-pick { stroke: var(--d2-sel); stroke-width: 2; stroke-dasharray: 6 4; }
.d2-vazio { position: absolute; inset: 0; display: grid; place-items: center; color: var(--d2-fraco); font-size: var(--t-peq); padding: 20px; text-align: center; }
/* vínculo CAD na planta: meio-tom, por baixo do modelo */
.d2-cad-l { stroke: #9aa3ad; fill: none; stroke-linecap: round; }
.d2-cad-tx { fill: #9aa3ad; font-family: var(--fonte); }
.bim-revit[data-rv-tema="escuro"] .d2-cad-l { stroke: #6f7780; }
.bim-revit[data-rv-tema="escuro"] .d2-cad-tx { fill: #6f7780; }
/* AMBIENTES na planta (P2-D, js/bimambienteui.js): identificador (nome; número · área),
   esquema de cores (tokens --d2-amb-N: claro no papel branco, escuro no papel do tema escuro) e legenda */
.bim-grade > .bim-tela.bim-tela-2d {
  --d2-amb-0: #e3e5e8; --d2-amb-1: #f6c9a8; --d2-amb-2: #b9dcf2; --d2-amb-3: #c8e6b5; --d2-amb-4: #f3e3a2; --d2-amb-5: #dcc8ef; --d2-amb-6: #f5bfcf;
  --d2-amb-7: #b5e3dc; --d2-amb-8: #e8d3b9; --d2-amb-9: #c9d3f5; --d2-amb-10: #e2efa8; --d2-amb-11: #f2c2b0; --d2-amb-12: #c4e0ee; --d2-amb-av: #b42318;
}
.bim-revit[data-rv-tema="escuro"] .bim-grade > .bim-tela.bim-tela-2d {
  --d2-amb-0: #3a3d42; --d2-amb-1: #7a4f33; --d2-amb-2: #2f5c7a; --d2-amb-3: #3f6634; --d2-amb-4: #6e6127; --d2-amb-5: #5a4774; --d2-amb-6: #74404f;
  --d2-amb-7: #2f6a62; --d2-amb-8: #6a5843; --d2-amb-9: #3f4c7a; --d2-amb-10: #5c6a27; --d2-amb-11: #74493a; --d2-amb-12: #355f72; --d2-amb-av: #ff8a7a;
}
.d2-amb-cor { stroke: none; }
.d2-amb-tx, .d2-amb-leg-tit, .d2-amb-leg-tx { fill: var(--d2-tinta); font-family: var(--fonte); }
.d2-amb-nome, .d2-amb-leg-tit { font-weight: var(--p-forte); }
.d2-amb-av { fill: var(--d2-amb-av); }
.d2-amb-alvo { fill: transparent; stroke: none; cursor: pointer; }
.d2-amb-tag:hover .d2-amb-alvo { fill: var(--d2-sel); fill-opacity: .08; }
.d2-amb-sel .d2-amb-tx { fill: var(--d2-sel); }
.d2-amb-sel-l { stroke: var(--d2-sel); }
.d2-amb-sep { stroke: var(--d2-fraco); }
.d2-amb-leg-cor { stroke: var(--d2-tinta); }
.d2-amb-previa { fill: var(--d2-sel); fill-opacity: .14; stroke: var(--d2-sel); stroke-width: 2; pointer-events: none; }
.d2-amb-previa[data-estado="redundante"] { fill: #d97706; stroke: #d97706; }
.d2-vista-tela[data-d2-amb-ferr] { cursor: crosshair; }

/* ---------- FAMÍLIAS PARAMÉTRICAS: biblioteca e editor (js/familiaui.js) ---------- */
.fe-topo { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-bottom: 8px; }
.fe-busca { flex: 1 1 140px; min-width: 120px; height: 28px; padding: 0 8px; border: 1px solid var(--rv-linha); border-radius: 6px; background: var(--rv-painel-bg); color: var(--rv-painel-tx); }
.fe-ajuda, .fe-dica { font-size: var(--t-mini); color: var(--rv-tx-fraco); margin: 6px 0; line-height: 1.45; }
.fe-vazio { color: var(--rv-tx-fraco); font-size: var(--t-micro); text-align: center; padding: 18px 0; }
.fe-grupo { margin-bottom: 10px; }
.fe-grupo-t { font-size: var(--t-mini); font-weight: var(--p-forte); letter-spacing: .06em; text-transform: uppercase; color: var(--rv-tx-fraco); margin: 8px 0 4px; }
.fe-card { border: 1px solid var(--rv-linha); border-radius: 8px; padding: 8px 10px; margin-bottom: 6px; background: var(--rv-painel-bg); }
.fe-card:hover { border-color: var(--rv-linha-forte); }
.fe-card-l1 { display: flex; justify-content: space-between; gap: 8px; align-items: center; }
.fe-card-d { font-size: var(--t-mini); color: var(--rv-tx-fraco); margin: 2px 0 4px; }
.fe-card-l2 { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-top: 4px; }
.fe-card-l2 select { height: 26px; max-width: 170px; }
.fe-badge { font-size: var(--t-mini); font-weight: var(--p-forte); padding: 1px 7px; border-radius: 99px; background: var(--rv-hover); color: var(--rv-painel-tx); white-space: nowrap; }
.fe-b-ra { background: #1a6cb5; color: #fff; }
.fe-b-importada { background: #7a5a12; color: #fff; }
/* FAMIMPORT: família do mercado (js/familiaimportui.js) — miniatura à esquerda e o aviso de geometria pendente */
.fe-card-imp { display: grid; grid-template-columns: 48px 1fr; column-gap: 8px; }
.fe-card-imp > :not(.fe-mini) { grid-column: 2; }
.fe-mini { grid-row: 1 / span 4; width: 48px; height: 48px; border-radius: 6px; border: 1px solid var(--rv-linha); background: var(--rv-tela-2); display: flex; align-items: center; justify-content: center; overflow: hidden; color: var(--rv-tx-fraco); font-weight: var(--p-forte); }
.fe-mini img { width: 100%; height: 100%; object-fit: contain; image-rendering: auto; }
.fe-b-pendente { background: #b45309; color: #fff; }
.fe-ed label { display: flex; flex-direction: column; gap: 2px; font-size: var(--t-mini); color: var(--rv-tx-fraco); }
.fe-ed input, .fe-ed select, .fe-ed textarea { font-size: var(--t-micro); padding: 3px 6px; border: 1px solid var(--rv-linha); border-radius: 5px; background: var(--rv-painel-bg); color: var(--rv-painel-tx); min-width: 0; }
.fe-ed textarea { font-family: var(--fonte-num); }
.fe-form { font-family: var(--fonte-num); }
.fe-prev { position: relative; border: 1px solid var(--rv-linha); border-radius: 8px; overflow: hidden; margin-bottom: 8px; background: var(--rv-tela-2); }
.fe-canvas { display: block; width: 100%; height: 230px; touch-action: none; }
.fe-prev-l { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 4px 8px; border-top: 1px solid var(--rv-linha); background: var(--rv-painel-bg); }
.fe-prev-l label { flex-direction: row; align-items: center; gap: 6px; }
.fe-msgs { margin-bottom: 8px; }
.fe-erro, .fe-ok, .fe-aviso { font-size: var(--t-micro); padding: 6px 9px; border-radius: 6px; margin-bottom: 4px; line-height: 1.4; }
.fe-erro { background: #fde8e8; color: #8a1c1c; border: 1px solid #f3b4b4; }
.fe-ok { background: #e6f5ea; color: #1c5e2e; border: 1px solid #b6dfc0; }
.fe-aviso { background: #fff5dd; color: #6b4b00; border: 1px solid #f0d58a; }
.fe-sec { border: 1px solid var(--rv-linha); border-radius: 8px; margin-bottom: 8px; background: var(--rv-painel-bg); }
.fe-sec > summary { cursor: pointer; padding: 7px 10px; font-weight: var(--p-forte); font-size: var(--t-micro); background: var(--rv-painel-cab); border-radius: 8px 8px 0 0; }
.fe-sec > summary small { color: var(--rv-tx-fraco); font-weight: var(--p-normal); margin-left: 4px; }
.fe-sec > :not(summary) { margin-left: 10px; margin-right: 10px; }
.fe-sec > :last-child { margin-bottom: 10px; }
.fe-grade2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px 10px; margin-top: 8px; }
.fe-grade4 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px 8px; margin-top: 6px; }
.fe-larga { grid-column: 1 / -1; }
.fe-tab-env { overflow-x: auto; margin: 8px 10px 6px; }
.fe-tab { border-collapse: collapse; width: 100%; font-size: var(--t-micro); }
.fe-tab th { text-align: left; font-weight: var(--p-forte); font-size: var(--t-mini); color: var(--rv-tx-fraco); padding: 3px 4px; border-bottom: 1px solid var(--rv-linha); white-space: nowrap; }
.fe-tab td { padding: 2px 3px; border-bottom: 1px solid var(--rv-linha); }
.fe-tab input, .fe-tab select { width: 100%; min-width: 64px; }
.fe-sol { border: 1px dashed var(--rv-linha-forte); border-radius: 7px; padding: 6px 8px; margin: 8px 10px 6px; }
.fe-sol-cab { display: flex; gap: 6px; align-items: center; }
.fe-sol-cab input { flex: 1 1 auto; }
.bim-revit[data-rv-tema="escuro"] .fe-erro { background: #4a1f1f; color: #ffd0d0; border-color: #7a3030; }
.bim-revit[data-rv-tema="escuro"] .fe-ok { background: #1d3a26; color: #c8f0d2; border-color: #2f5e3c; }
.bim-revit[data-rv-tema="escuro"] .fe-aviso { background: #3e3214; color: #f6e2a8; border-color: #6b5520; }
@media (max-width: 720px) { .fe-grade4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .fe-grade2 { grid-template-columns: 1fr; } }

/* ESTILO VISUAL (prévia, 07/10/2026): o menu dos quatro estilos.
   Mora no <body> (como o menu das abas) e é claro sempre, como as outras janelas. */
.rv-menu-estilo { min-width: 300px; padding: 4px 0 6px; }
.rv-menu-estilo .rv-me-tit { padding: 6px 14px 4px; font-weight: var(--p-forte); font-size: var(--t-mini); color: #5b6570; text-transform: uppercase; letter-spacing: .04em; cursor: default; }
.rv-menu-estilo .rv-me-tit:hover { background: transparent; }
.rv-menu-estilo .rv-me-sep { height: 1px; margin: 4px 10px; padding: 0; background: #d6d6d6; cursor: default; }
.rv-menu-estilo button { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 40px; padding: 5px 14px; border: 0; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer; }
.rv-menu-estilo button:hover, .rv-menu-estilo button:focus-visible { background: #d8e6f2; outline: none; }
.rv-menu-estilo button[aria-checked="true"] { box-shadow: inset 3px 0 0 #1a6cb5; background: #eef4fa; }
.rv-menu-estilo .rv-me-txt { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.rv-menu-estilo .rv-me-txt small { color: #5b6570; font-size: var(--t-mini); white-space: normal; line-height: 1.3; }
/* a amostra de cada estilo: um cubinho desenhado só com CSS */
.rv-me-amostra { flex: 0 0 26px; height: 26px; border: 1px solid #8a8f96; border-radius: 3px; }
.rv-me-amostra[data-amostra="linha"] { background: #fff; box-shadow: inset 0 0 0 4px #fff, inset 0 0 0 5px #222; }
.rv-me-amostra[data-amostra="sombreado"] { background: linear-gradient(135deg, #cbb89a 0 50%, #9c8a6c 50% 100%); }
.rv-me-amostra[data-amostra="textura"] { background: repeating-linear-gradient(0deg, #b9653d 0 5px, #e8dccb 5px 6px); }
.rv-me-amostra[data-amostra="realista"] { background: radial-gradient(circle at 30% 25%, #f3d2b3 0 18%, transparent 19%), repeating-linear-gradient(0deg, #a5502c 0 5px, #d9c5ad 5px 6px); box-shadow: inset -6px -6px 8px rgba(0,0,0,.35); }
.rv-me-amostra[data-amostra="desenho"] { background: #e9e9e9; box-shadow: inset 0 0 0 5px #e9e9e9, inset 0 0 0 6px #111; }
.rv-vb.rv-vb-estilo { width: auto; padding: 0 7px; gap: 5px; display: inline-flex; align-items: center; }
.rv-vb-estilo span { max-width: 96px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: inherit; }

/* P8 — FOLHA numa aba de vista (js/bimfolhaui.js, prévia do modelador). O papel é
   sempre branco (prancha é papel); a mesa em volta escurece com o tema. */
.bim-grade > .bim-tela.bim-tela-folha { background: var(--rv-tela); }
.pv-tela { position: absolute; inset: 0; overflow: auto; padding: 16px; outline: none; touch-action: none; background: color-mix(in srgb, var(--rv-tela) 82%, #000 18%); }
.pv-papel-wrap { position: relative; margin: 0 auto; }
.pv-papel { position: absolute; left: 0; top: 0; transform-origin: 0 0; background: #fff; box-shadow: 0 2px 14px rgba(0, 0, 0, .35); }
.pv-papel .folha { margin: 0 !important; box-shadow: none !important; }
.pv-papel [data-pv-vp] { cursor: move; }
.pv-papel [data-pv-bloco][data-pv-sel] { outline: 0.6mm solid #1a6cb5; outline-offset: 0.6mm; }
.rv-no[data-rv-arrasta] { cursor: grab; }
.pv-dica { position: sticky; top: 0; z-index: 2; margin: 0 auto 10px; max-width: 520px; padding: 6px 12px; border-radius: 6px; background: var(--rv-painel-bg); color: var(--rv-painel-tx); font-size: var(--t-micro); text-align: center; box-shadow: 0 1px 4px rgba(0,0,0,.18); }

/* =====================================================================
 * DISCIPLINA DA MODELAGEM (09/10/2026, js/bimdisciplinas.js) — pedido do
 * Rogério: cada disciplina com a sua cor, para que o PRINT da tela diga de
 * longe em qual módulo a pessoa estava. A casca põe na raiz:
 *   --rv-disc        fundo (aba Arquivo, aba ativa, selo)
 *   --rv-disc-texto  letra sobre o fundo (AA conferido; elétrica = letra escura)
 *   --rv-disc-acento linha, ícone e foco (≥ 3:1 sobre a fita, outro no escuro)
 * e `data-rv-disc-on` quando a disciplina NÃO é "Todas" — sem ele, nada
 * aqui muda o que já existia (as e2e da fita medem a cor de sempre).
 * ===================================================================== */
.bim-revit[data-rv-disc-on] {
  --rv-aba-ativa-linha: var(--rv-disc-acento);
  --rv-arquivo-bg: var(--rv-disc);
  --rv-arquivo-tx: var(--rv-disc-texto);
  --rv-foco: var(--rv-disc-acento);
  --rv-ativo-borda: var(--rv-disc-acento);
}
/* a faixa da disciplina embaixo da barra de título */
.bim-revit[data-rv-disc-on] .rv-titulo { box-shadow: inset 0 -3px 0 var(--rv-disc); }
.bim-revit[data-rv-disc-on] .rv-aba[aria-selected="true"] { border-bottom-width: 3px; }
/* o botão grande em foco (ou aceso) com a borda da disciplina */
.bim-revit[data-rv-disc-on] .rv-cmd[aria-pressed="true"] { box-shadow: inset 0 -3px 0 var(--rv-disc-acento), inset 0 1px 2px var(--rv-sombra); }

/* o seletor, à esquerda do Arquivo */
.rv-disc-sel {
  appearance: none; font-family: inherit; flex: 0 0 auto;
  display: inline-flex; align-items: center; gap: 6px;
  align-self: center; margin: 2px 6px 2px 0; padding: 3px 9px 3px 7px; min-height: 26px;
  background: var(--rv-tela); color: var(--rv-fita-tx);
  border: 1px solid var(--rv-linha-forte); border-left: 4px solid var(--rv-disc, #2d6a9c); border-radius: 4px;
  font-size: var(--t-micro); font-weight: var(--p-forte); white-space: nowrap; cursor: pointer;
}
.rv-disc-sel:hover { background: var(--rv-hover); }
.rv-disc-sel:focus-visible { outline: 2px solid var(--rv-foco); outline-offset: 1px; }
.rv-disc-ponto { flex: 0 0 auto; width: 10px; height: 10px; border-radius: 50%; background: var(--rv-disc, #2d6a9c); box-shadow: 0 0 0 1px rgba(0,0,0,.18); }
.rv-disc-seta { font-size: var(--t-mini); opacity: .7; }
.rv-disc-menu {
  position: absolute; z-index: 60; min-width: 250px; padding: 4px 0;
  background: var(--rv-painel-bg); color: var(--rv-painel-tx);
  border: 1px solid var(--rv-linha-forte); border-radius: 6px;
  box-shadow: 0 10px 28px var(--rv-sombra);
}
.bim-revit[data-rv-tema="escuro"] .rv-disc-menu { background: #2b2b2b; }
.rv-disc-op {
  appearance: none; font: inherit; display: flex; align-items: center; gap: 10px;
  width: 100%; min-height: 34px; padding: 4px 14px; border: 0; background: transparent; color: inherit;
  text-align: left; cursor: pointer;
}
.rv-disc-op:hover, .rv-disc-op:focus-visible { background: var(--rv-hover); outline: none; }
.rv-disc-op[aria-checked="true"] { font-weight: var(--p-forte); box-shadow: inset 3px 0 0 var(--rv-disc-acento, #2d6a9c); }
.rv-disc-op .rv-disc-ponto { width: 12px; height: 12px; }
.rv-disc-op-nome { flex: 1; }
.rv-disc-op[data-rv-disc-trancada] { color: var(--rv-tx-fraco); }
.rv-disc-cadeado { display: inline-flex; color: var(--rv-tx-fraco); }
.rv-disc-cadeado svg { width: 13px; height: 13px; }

/* o SELO no canto da vista: sai no print da tela; não pega clique */
.rv-disc-selo {
  position: absolute; left: 10px; bottom: 10px; z-index: 5;
  padding: 4px 11px; border-radius: 999px;
  background: var(--rv-disc, #2d6a9c); color: var(--rv-disc-texto, #fff);
  font-size: var(--t-mini); font-weight: var(--p-forte); letter-spacing: .01em; white-space: nowrap;
  box-shadow: 0 2px 8px rgba(0,0,0,.28);
  pointer-events: none; user-select: none;
}
.rv-disc-selo:empty { display: none; }
@media print { .rv-disc-selo { display: none; } }

/* =====================================================================
 * SELECIONAR (js/bimselecao.js, 09/10/2026): realce da seleção e do que está sob o
 * cursor na vista 2D, as alças da parede, o fantasma do arrasto e a JANELA — da
 * esquerda para a direita (só o que está inteiro dentro) em linha contínua; da
 * direita para a esquerda (o que toca) tracejada. O 3D usa a mesma regra.
 * ===================================================================== */
.sl-cam { pointer-events: none; }
.sl-cam .sl-sel { fill: none; stroke: var(--d2-sel, #1a6cb5); stroke-width: 3; stroke-linejoin: round; opacity: .9; }
.sl-cam .sl-hover { fill: none; stroke: var(--d2-sel, #1a6cb5); stroke-width: 2; opacity: .45; }
.sl-cam .sl-alca { fill: var(--d2-papel, #fff); stroke: var(--d2-sel, #1a6cb5); stroke-width: 2; pointer-events: all; cursor: move; }
.sl-cam .sl-alca:hover { fill: var(--d2-sel, #1a6cb5); }
.sl-cam .sl-fantasma { stroke: #2fbf71; stroke-width: 1.6; fill: none; }
.sl-cam .sl-guia { stroke: #d99a1e; stroke-width: 1.2; stroke-dasharray: 5 4; fill: none; }
.sl-cam .sl-janela { fill: rgba(26, 108, 181, .08); stroke: var(--d2-sel, #1a6cb5); stroke-width: 1.4; }
.sl-cam .sl-janela-cruzando { fill: rgba(22, 163, 74, .08); stroke: #16a34a; stroke-dasharray: 6 4; }
.bim-sel-janela { position: absolute; z-index: 19; pointer-events: none; display: none; box-sizing: border-box; border: 1.5px solid #1a6cb5; background: rgba(26, 108, 181, .10); }
.bim-sel-janela[data-modo="cruzando"] { border: 1.5px dashed #16a34a; background: rgba(22, 163, 74, .10); }
html[data-bim-mao="1"] canvas[data-bim-nav] { cursor: grab !important; }
canvas[data-bim-nav][data-bim-pan] { cursor: grabbing !important; }

/* =====================================================================
 * PAINÉIS FLUTUANTES DA PRIMEIRA VERSÃO DO VISUALIZADOR (auditoria das
 * ferramentas da fita, 12/10/2026 — docs/bim/AUDITORIA-FERRAMENTAS.md).
 * Plano de corte 3D, Corte 3D livre, Visibilidade, Pavimentos, Cores por
 * sistema, Realidade virtual, Requisitar material, Blocok, Snap e o editor
 * nascem no js/bim.js com a cor em linha; ela passou para os tokens
 * (--card-bg, --linha, --texto, --aco) e a classe `bim-flut` dá o resto do
 * padrão atual (o mesmo dos Snaps do editor, css/bimprecisao.css). O
 * tools/e2e-bim-ferramentas.js reprova painel da fita sem ela ou com a cor
 * da primeira versão de volta.
 * ===================================================================== */
.bim-flut { box-shadow: var(--sombra, 0 10px 28px -14px rgba(15,30,50,.25)); font-family: var(--fonte); line-height: 1.45; }
.bim-flut b { font-weight: var(--p-forte); }
.bim-flut input[type="range"] { accent-color: var(--aco, #2d6a9c); }
/* na casca o canto de baixo à esquerda é do selo da disciplina: os painéis de
   baixo sobem acima dele (antes o último botão do Plano de corte ficava atrás) */
.rv-palco .bim-flut.bim-flut-baixo { bottom: 46px !important; max-height: calc(100% - 120px); overflow: auto; }
/* o carimbo da data do 4D também sobe acima do selo (os dois se cobriam) */
.rv-palco .b4-hud { left: 10px; bottom: 46px; }
/* o balão de dica (js/bim.js S._hint): pílula grafite do padrão, não o verde-limão da 1ª versão */
.bim-dica { font-family: var(--fonte); letter-spacing: .005em; }

/* AVISO DENTRO DAS TELAS DO BIM (Níveis, Conferência de alvenaria, Paginar, Elevação,
   Gerar de desenho): eram caixas com o hex escrito em linha (#dc262618, #f59e0b18…). O
   desenho é o do Modulo.aviso (faixa colorida à esquerda), pelos tokens — claro e escuro. */
.bim-aviso { padding: 8px 10px; border-radius: var(--raio-sm, 8px); border: 1px solid var(--linha); border-left: 4px solid var(--aco); background: var(--card-bg); color: var(--texto); font-size: var(--t-peq); line-height: 1.5; }
.bim-aviso-erro { border-left-color: var(--vermelho); }
.bim-aviso-alerta { border-left-color: var(--amarelo); }
.bim-aviso-info { border-left-color: var(--aco); }
.bim-aviso-ok { border-left-color: var(--verde); }
td.bim-aviso { border-radius: 0; border-width: 0 0 0 4px; }

/* CAMPOS CRUS DAS TELAS DO BIM: o app só desenha select/busca/data fora do `.field`, e os
   quadros do BIM (Níveis, Conferência de alvenaria, Paginar, Elevação, Novo projeto…) têm
   <input> de número e texto soltos — saíam com a caixa fina do navegador ao lado de selects
   do padrão. Mesmo desenho do select do app (css/app.css). */
body.bim-app .modal .body input:not([type]):not(.cell),
body.bim-app .modal .body input[type="text"]:not(.cell),
body.bim-app .modal .body input[type="number"]:not(.cell) {
  background-color: var(--surface); border: 1px solid var(--linha); border-radius: var(--raio-sm);
  padding: 5px 9px; color: var(--texto); line-height: 1.4; font: inherit;
}
body.bim-app .modal .body input:not([type]):not(.cell):focus-visible,
body.bim-app .modal .body input[type="text"]:not(.cell):focus-visible,
body.bim-app .modal .body input[type="number"]:not(.cell):focus-visible { border-color: var(--aco); outline: none; box-shadow: var(--anel); }
/* VÍNCULOS (js/bimvinculos.js, 14/10/2026): no arraste, as peças que ACOMPANHAM (o fantasma da que anda é o verde) */
.sl-cam .sl-vinculo { stroke: #f59e0b; stroke-width: 1.6; stroke-dasharray: 6 3; fill: none; }
