/* ══════════════════════════════════════════════════════════════════════════
   STUDIO — a moldura em volta do curso.

   A regra visual desta tela é uma só: ela não pode competir com o curso. O
   palco do meio mostra o motor de verdade, com as cores do curso; tudo em
   volta é cinza-escuro e discreto, para o autor julgar o que o ALUNO vai ver e
   não o que a ferramenta pinta por cima.

   Sem framework e sem CDN, pela mesma razão do motor: a ferramenta precisa
   abrir numa rede com bloqueio e continuar abrindo daqui a três anos.
   ══════════════════════════════════════════════════════════════════════════ */

/* ─── A FONTE DA MARCA, SERVIDA DAQUI ──────────────────────────────────────
   Inter, nos quatro pesos que o manual da Kursix especifica. Os arquivos já
   existiam em `Curso/motor/fonts/` — o motor os embarca pela mesma razão que o
   Studio: curso SCORM roda em rede de escola com bloqueio, e no app do Moodle
   offline. Um <link> para o Google Fonts funcionaria na minha máquina e
   falharia na sala de aula, trocando a tipografia da marca pela do sistema sem
   avisar ninguém.

   `font-display: swap` para o texto aparecer com a fonte do sistema enquanto o
   arquivo chega: uma tela em branco por 200ms é pior do que um reflow. */
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('/cursos/motor/fonts/inter-latin-400-normal.woff2') format('woff2');
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 500; font-display: swap;
  src: url('/cursos/motor/fonts/inter-latin-500-normal.woff2') format('woff2');
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 600; font-display: swap;
  src: url('/cursos/motor/fonts/inter-latin-600-normal.woff2') format('woff2');
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 700; font-display: swap;
  src: url('/cursos/motor/fonts/inter-latin-700-normal.woff2') format('woff2');
}
@font-face {
  font-family: 'JetBrains Mono'; font-style: normal; font-weight: 500; font-display: swap;
  src: url('/cursos/motor/fonts/jetbrains-mono-latin-500-normal.woff2') format('woff2');
}

/* ─── OS TOKENS DA KURSIX ───────────────────────────────────────────────────
   Direto do manual da marca (Maio de 2026):

     Primary   Deep Indigo #334155     Accent   Teal   #0F766E
     Secondary Slate       #64748B     Success  Green  #15803D
     Neutros   Dark        #0F172A     Warning  Amber  #D97706
               Gray 300    #CBD5E1     Danger   Red    #B91C1C
               Gray 100    #F1F5F9

   O QUE NÃO É CÓPIA LITERAL, E POR QUÊ: os quatro semânticos do manual foram
   escolhidos para texto sobre BRANCO. Sobre a moldura navy do modo escuro,
   #0F766E e #15803D caem para contraste de 2,x:1 — ilegíveis. Então o tema
   escuro usa os irmãos CLAROS da mesma família (teal 400, green 500…), e o
   tema claro usa os valores do manual sem tocar. Mesma marca, contraste
   honesto nos dois; a alternativa seria uma paleta bonita no manual e ilegível
   na tela. */
:root {
  --fundo: #0b1220;           /* o chão, mais fundo que os painéis  */
  --painel: #111a2e;
  --painel-alto: #18233c;
  --borda: #1e293b;
  --borda-forte: #334155;     /* Primary do manual                  */
  --texto: #f8fafc;           /* Light                              */
  --texto-fraco: #cbd5e1;     /* Gray 300                           */
  /* Gray 500 do manual (#64748B) dá 3,64:1 sobre o painel navy — reprova o AA
     de texto pequeno, e este token pinta justamente os rótulos de 10,5px. Slate
     400 é o vizinho de cima na mesma escala e sobe para 5,5:1. Medido, não
     estimado. */
  --texto-tenue: #94a3b8;
  /* ── OS DOIS ACENTOS, E POR QUE ELES NÃO PODEM SER PARECIDOS ────────────
     Reajustados em 31/08/2026, depois de o Cristiano apontar que a pílula
     Editar|Simular e o seletor de tela — dois controles a dois centímetros um
     do outro — pintavam de índigo e de teal ao dizer a MESMA coisa: "este
     está ativo".

     O problema não era de tom, era semântico, e a correção é de papel:

         --ativo         UM estado ativo, UMA cor. Pílula do modo, tela
                         escolhida, item selecionado.
         --acento-forte  a AÇÃO TERMINAL, e só ela: Pacote SCORM. É o único
                         botão preenchido de teal da tela inteira, e é o que
                         faz o olho achá-lo sem procurar.
         --acento        traço fino: foco, link, borda de campo ativo. Nunca
                         preenchimento.

     E OS TRÊS SAEM DO LOGO, MEDIDOS. O que estava aqui não saía: o índigo
     anterior (#4f46e5) ficava a 13° de matiz do braço da marca (#304193) e com
     24 pontos a MAIS de saturação — era o índigo do Tailwind, não o da Kursix,
     e é por isso que ele gritava ao lado do teal. O teal anterior (#2dd4bf)
     tinha S=66 contra os S=85 do #0da4a4 do manual: virou hortelã.

     Os valores do escuro são os irmãos CLAROS das peças do logo, porque as
     originais são mais escuras que o painel navy e sumiriam nele. Medido,
     e não estimado — a conta está no comentário de cada linha. */

  /* Traço fino. H=179 contra os 180 do teal-brilho da marca. Contra o painel
     navy dá 8,20:1, e contra o fundo 8,85:1. */
  --acento: #22c6c2;
  /* Preenchimento do Pacote SCORM, com texto branco por cima. É o cruzamento
     das duas peças teal do logo — H=180 e S=85 do brilho, L=26 do fundo — e é
     o único ponto da faixa que passa nos DOIS testes ao mesmo tempo: branco
     por cima 5,08:1 (precisa de 4,5) e contra o painel 3,41:1 (precisa de 3).
     Mais escuro que isto e o botão some no navy; mais claro e o branco some
     nele. */
  --acento-forte: #0a7b7b;
  /* O braço do logo (#304193, H=230 S=51) clareado até destacar do painel:
     H=229, S=56. Branco por cima 5,42:1, contra o painel 3,20:1. */
  --marca-indigo: #4a61cc;
  /* O PAPEL, e não a cor. As regras de estado pedem `--ativo`; quem decide
     que hoje ele é o índigo é esta linha, e é aqui que se muda de ideia sem
     caçar dezoito seletores. */
  --ativo: var(--marca-indigo);

  /* AS QUATRO PEÇAS DO K, na ordem em que aparecem no logotipo.
     No manual elas são fixas — #041b3f na haste, #042c5f no losango, o
     degradê #086f7e→#0da4a4 na diagonal de cima e #304193 na de baixo. Só que
     as duas primeiras são MAIS ESCURAS que o painel do tema escuro (#111a2e):
     usadas como estão, a haste do K virava um buraco na barra e o losango
     sumia. Aqui valem os irmãos claros da mesma família, e o tema claro logo
     abaixo recebe os valores do manual sem tocar. Mesma decisão dos
     semânticos, pelo mesmo motivo. */
  --marca-k-haste: #e2e8f0;
  --marca-k-junta: #4364b4;
  --marca-k-teal-fundo: #0f9aa8;
  --marca-k-teal-brilho: #22c6c2;
  --marca-k-braco: #5b6fdd;
  --ok: #22c55e;
  --alerta: #f59e0b;
  --erro: #f87171;

  /* Raio e sombra, escala do manual (6 · 14 · pill). */
  --raio: 8px;
  --raio-g: 14px;
  --raio-pill: 999px;
  --sombra-1: 0 1px 2px rgba(2, 6, 23, .28);
  --sombra-2: 0 4px 14px rgba(2, 6, 23, .34);
  --sombra-3: 0 18px 48px rgba(2, 6, 23, .48);

  /* 48px, e não os 56px de antes. A barra tem 16 controles e o autor passa a
     sessão inteira olhando para o palco, não para ela: cada pixel que ela
     devolve é pixel de curso. 48 é a altura que o desenho do redesenho propôs
     e que o botão mais alto daqui (6px de padding + 12,5px de texto ≈ 31px)
     ainda deixa respirar. Abaixo disso o clique começa a ficar apertado. */
  --barra-altura: 48px;

  /* 28px. Ele carrega migalha, estado de gravacao e as duas versoes - tudo
     texto de 10 a 11px, que se le de relance e nao se clica. Mais alto que
     isso seria faixa; mais baixo, o texto encostaria nas bordas. */
  --rodape-altura: 28px;

  /* Não há segunda barra. Houve por uma versão, e ela custava 40px em toda a
     largura da tela — três faixas empilhadas antes do conteúdo. O que ela
     carregava passou para a barra do palco, que já existia: a divisão em
     camadas continua, mas a camada do curso divide uma linha em vez de pedir
     uma só para ela. */

  /* ── CORES DE ESTADO ──────────────────────────────────────────────────────
     Estas existem porque cor cravada numa regra não troca de tema. O Studio já
     ficou com o hover escuro dentro da moldura clara exatamente por isso: a
     superfície mudava, o realce não. Toda cor que muda entre os dois temas
     mora aqui — e nenhuma regra abaixo escreve hexadecimal. */
  --realce: #1c2740;          /* superfície sob o ponteiro                    */
  --selecao: #23305a;         /* o item escolhido, que continua escolhido     */
  --campo-fundo: #0b1220;     /* caixa de texto, código, miniatura            */
  --palco-fundo: #080e1a;     /* atrás da prévia                              */
  --palco-aparelho: #060b16;  /* a mesa em volta do celular simulado          */
  --gatilho-fundo: #0e1729;
  --aviso-fundo: #2a1f0c;
  --alerta-texto: #fcd34d;
  --erro-texto: #fca5a5;
  --sombra: rgba(2, 6, 23, .55);

  /* Os quatro tons que separam os tipos. No tema claro eles escurecem: o mesmo
     azul que se lê bem sobre cinza-escuro some sobre branco. */
  --cor-pagina: #60a5fa;
  --cor-avaliacao: #fbbf24;
  --cor-menu: #a78bfa;
  --cor-home: #34d399;

  /* Inter é a tipografia da marca. O resto da pilha é o que aparece nos ~200ms
     até o woff2 chegar, e num sistema onde ele falhe. */
  font-family: 'Inter', system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-feature-settings: 'cv05' 1, 'ss03' 1;   /* l com cauda, a de bico */
}

/* ─── O TEMA DO STUDIO ─────────────────────────────────────────────────────
   Duas moldura possíveis, e as duas obedecem à mesma regra: NÃO competir com o
   curso. O palco do meio traz as cores que o autor está julgando; em volta há
   cinzas neutros e um único acento, usado só onde é preciso apontar alguma
   coisa. Nada de superfície colorida, nada de contraste alto na periferia — a
   moldura que chama atenção rouba a decisão que o autor veio tomar.

   O tema é do STUDIO. O modo visual do CURSO (claro/escuro/colorido) é outra
   coisa, é escolha do ALUNO, e por isso mora nos controles do palco.

   No tema CLARO os semânticos são os do manual, sem ajuste: eles foram
   escolhidos para viver sobre branco, que é exatamente o caso aqui. */
:root[data-tema="claro"] {
  --fundo: #f1f5f9;           /* Gray 100 */
  --painel: #f8fafc;          /* Light    */
  --painel-alto: #ffffff;     /* White    */
  --borda: #e2e8f0;
  --borda-forte: #cbd5e1;     /* Gray 300 */
  --texto: #0f172a;           /* Dark     */
  --texto-fraco: #334155;     /* Gray 700 */
  --texto-tenue: #64748b;     /* Gray 500 */
  /* No claro os semânticos são os do manual, sem ajuste: eles foram escolhidos
     para viver sobre branco, que é exatamente o caso aqui.
       --acento         Accent Teal do manual. Sobre o painel dá 5,23:1.
       --acento-forte   idem, como preenchimento: branco por cima 5,47:1.
       --marca-indigo   o hex EXATO do braço do logo. Antes era #4338ca, que é
                        o índigo do Tailwind — 15° de matiz fora da marca.
                        Branco por cima 9,12:1, contra o painel 8,71:1. */
  --acento: #0f766e;
  --acento-forte: #0f766e;
  --marca-indigo: #304193;
  --ativo: var(--marca-indigo);
  /* As cores do manual, sem ajuste: o K sobre branco é o caso para o qual elas
     foram escolhidas. */
  --marca-k-haste: #041b3f;
  --marca-k-junta: #042c5f;
  --marca-k-teal-fundo: #086f7e;
  --marca-k-teal-brilho: #0da4a4;
  --marca-k-braco: #304193;
  --ok: #15803d;              /* Success  */
  /* Warning do manual é #D97706, e ele dá 3,04:1 sobre a superfície clara —
     serve para ÍCONE e borda (o piso de gráfico é 3:1), não para texto de
     11px, que é como o Studio o usa (o estado "salvando", o selo de só
     leitura). Amber 700 fica na mesma família e passa em 4,9:1. */
  --alerta: #b45309;
  --erro: #b91c1c;            /* Danger   */

  --realce: #eef2f7;
  --selecao: #dbeae8;
  --campo-fundo: #f8fafc;
  --palco-fundo: #e2e8f0;
  --palco-aparelho: #cbd5e1;
  --gatilho-fundo: #f1f5f9;
  --aviso-fundo: #fef6e7;
  --alerta-texto: #92400e;
  --erro-texto: #991b1b;
  --sombra: rgba(15, 23, 42, .13);
  --sombra-1: 0 1px 2px rgba(15, 23, 42, .07);
  --sombra-2: 0 4px 14px rgba(15, 23, 42, .09);
  --sombra-3: 0 18px 48px rgba(15, 23, 42, .16);

  --cor-pagina: #1d4ed8;
  --cor-avaliacao: #b45309;
  --cor-menu: #6d28d9;
  --cor-home: #14713a;
}

* { box-sizing: border-box; }

/* `[hidden]` PRECISA DE REGRA EXPLÍCITA.
   O `display: none` que o navegador dá ao atributo `hidden` vem da folha do
   usuário-agente, e QUALQUER `display` declarado numa classe vence — mesmo
   sendo uma regra de especificidade baixa. O elemento continua ocupando a
   tela, invisível de tão vazio, e capturando clique.
   O motor deste projeto já pagou por isso (a janela do Tutor IA), e o Studio
   repetiu: `.palco-vazio` com `display: grid` cobria o iframe do curso com um
   retângulo opaco da cor do fundo. A prévia ficava preta, o DOM lá dentro
   estava certo, e não havia nada no console para explicar. */
[hidden] { display: none !important; }

html, body {
  height: 100%;
  margin: 0;
  background: var(--fundo);
  color: var(--texto);
  font-size: 14px;
  overflow: hidden;
}

button, select, input, textarea { font: inherit; color: inherit; }

/* ─── BARRA SUPERIOR ────────────────────────────────────────────────────── */

.barra {
  position: relative;      /* âncora do par Editar/Simular, centralizado */
  height: var(--barra-altura);
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 0 16px;
  background: var(--painel);
  /* Uma linha só, e não sombra: a barra encosta nos painéis, e sombra ali
     criaria uma faixa escura no topo de três colunas de uma vez. */
  border-bottom: 1px solid var(--borda);
}

/* A ASSINATURA: marca + produto.
   "Kursix" é a marca e leva o peso; "Studio" é o produto e vem em Medium,
   menor e mais claro — a hierarquia que o próprio mockup propõe. Emendar os
   dois no mesmo peso faria "KursixStudio" parecer um nome só. */
.marca { display: flex; align-items: center; gap: 9px; padding-inline-end: 4px; }
/* O logotipo é quase quadrado (79,3 × 84,0) e não tem margem interna nenhuma —
   o desenho encosta nas bordas do viewBox. O K anterior tinha folga dentro dos
   64px dele, então 26px aqui davam uns 20px de figura; repetir 26px agora
   deixaria a marca maior que o próprio nome ao lado. 22px de altura recolocam
   a figura no tamanho que ela tinha na tela. */
.marca-k { width: 21px; height: 22px; flex: 0 0 auto; }
.marca-k-grande { width: 52px; height: 55px; flex: 0 0 auto; }

/* AS QUATRO PEÇAS DO K PINTAM POR CLASSE, e não por `style=` no atributo.
   Eram seis atributos `style="fill:var(--…)"` no template, e eles eram a única
   coisa que ainda obrigava a política de segurança a aceitar `style-src
   'unsafe-inline'`. Como classe, o `_marca.html` é o mesmo desenho e o
   `style-src 'self'` passa a ser alcançável — que era a dívida anotada no
   `main.py`. */
.marca-k-haste { fill: var(--marca-k-haste); }
.marca-k-junta { fill: var(--marca-k-junta); }
.marca-k-braco { fill: var(--marca-k-braco); }
.marca-parada-fundo  { stop-color: var(--marca-k-teal-fundo); }
.marca-parada-brilho { stop-color: var(--marca-k-teal-brilho); }

.marca-nome { display: flex; align-items: baseline; gap: 6px; line-height: 1; }
.marca-nome strong {
  font-size: 15.5px; font-weight: 700; letter-spacing: -.015em; color: var(--texto);
}
.marca-sub {
  font-size: 12px; font-weight: 500; color: var(--texto-tenue); letter-spacing: .01em;
}
.campo-barra { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--texto-tenue); }
/* O rótulo "Curso"/"Template" some: o seletor já diz o que é, e duas palavras
   fixas a cada canto gastam a largura que os NOMES dos cursos precisam. */
.campo-barra > span:first-child {
  font-size: 10.5px; letter-spacing: .07em; text-transform: uppercase;
  color: var(--texto-tenue); margin-inline-end: 1px;
}
.ic-acao { display: inline-flex; padding: 5px; border-radius: 7px; }
.ic-acao svg { width: 16px; height: 16px; display: block; }

.campo-barra { min-width: 0; }
.campo-barra select {
  background: var(--campo-fundo); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 6px 9px; color: var(--texto);
  font-size: 12.5px; font-weight: 500;
  /* Encolhe em vez de empurrar. O minimo automatico de um <select> e o texto
     da opcao mais longa, e um nome de curso comprido esticava a barra ate o
     centro. */
  min-width: 0; max-width: 210px; text-overflow: ellipsis;
}
.campo-barra select:hover { border-color: var(--borda-forte); }
.campo-barra select:focus-visible { outline: 2px solid var(--acento); outline-offset: 1px; }

/* Botões de ação da barra: só o retângulo do hover, sem borda em repouso. */
.barra .icone-btn { color: var(--texto-tenue); }
.barra .icone-btn:hover { background: var(--realce); color: var(--texto); }

/* Editar | Simular no CENTRO da barra.
   É a troca mais frequente do Studio e a que muda o significado de todo clique
   na tela; no meio ela fica no caminho do olhar, e não perdida entre o seletor
   de curso e os botões de publicação. `translateX(-50%)` centra pelo eixo da
   janela, não pelo espaço que sobra — assim ela não se desloca quando o nome do
   curso é mais longo. */
/* OS TRÊS GRUPOS DA BARRA — e por que o do meio deixou de ser absoluto.
   Ele era `position: absolute; left: 50%`, o que o tirava do fluxo: nada
   reservava o espaço dele. Funcionou até a barra ganhar o seletor de idioma —
   aí o grupo da esquerda cresceu POR BAIXO do par Editar/Simular, e os dois
   ficaram sobrepostos.
   Com os dois lados em `flex: 1` e o centro em `auto`, os lados recebem
   metades iguais e o centro fica no meio da JANELA, que é o que se queria
   desde o início. Sem sobreposição possível, e sem depender de a barra ter
   exatamente os controles de hoje. */
.barra-esq {
  flex: 1 1 0; min-width: 0;
  display: flex; align-items: center; gap: 12px;
}
/* ─── EDITAR | SIMULAR, EM PÍLULA ──────────────────────────────────────────
   O bloco colorido DESLIZA por trás dos dois rótulos, em vez de o botão ativo
   trocar de cor no lugar. A diferença não é enfeite: o movimento diz para onde
   se foi, e num par que inverte o significado de todo clique da tela isso vale
   os 220ms.

   SEM UMA LINHA DE JAVASCRIPT, e é aí que esta versão difere da que veio de
   fora. Lá o deslize era feito medindo `offsetWidth`/`offsetLeft` a cada
   clique, com um `setTimeout(…, 50)` para posicionar na abertura — uma aposta
   na velocidade da máquina de quem abre, que falha calada quando a fonte
   demora e os botões ainda não têm a largura final.

   Aqui os dois botões são `flex: 1 1 50%` dentro do mesmo trilho: eles têm
   largura igual POR CONSTRUÇÃO, e a pílula é `width: 50%` que anda
   `translateX(100%)`. Não há o que medir, e funciona no primeiro quadro.

   O JavaScript só troca `data-modo` no trilho — um atributo, e o CSS faz o
   resto. */
.modo {
  position: relative;
  flex: 0 0 auto;
  display: flex; background: var(--campo-fundo);
  border: 1px solid var(--borda); border-radius: var(--raio-pill); padding: 3px;
  min-width: 232px;
}
.modo-pilula {
  position: absolute;
  inset-block: 3px; inset-inline-start: 3px;
  inline-size: calc(50% - 3px);
  background: var(--ativo); border-radius: var(--raio-pill);
  box-shadow: var(--sombra-1);
  transition: transform .22s cubic-bezier(.4, 0, .2, 1);
}
.modo[data-modo="simular"] .modo-pilula { transform: translateX(100%); }

.modo-btn {
  position: relative; z-index: 1;
  flex: 1 1 50%;
  display: flex; align-items: center; justify-content: center; gap: 6px;
  background: transparent; border: 0; border-radius: var(--raio-pill);
  padding: 5px 14px; cursor: pointer; color: var(--texto-fraco);
  font-size: 13px; font-weight: 500;
  transition: color .18s;
  white-space: nowrap;
}
.modo-btn:hover { color: var(--texto); }
.modo-btn svg { width: 15px; height: 15px; }
/* O ativo é ÍNDIGO, e não teal: o teal está reservado para a ação terminal
   (Pacote SCORM). Duas cores fortes disputando na mesma barra fariam o autor
   procurar qual é a principal — e a principal é publicar, não alternar modo. */
.modo-btn.ativo { color: #fff; font-weight: 600; }
.modo-btn:focus-visible { outline: 2px solid var(--acento); outline-offset: 2px; }

/* Quem pediu menos movimento recebe a troca sem o deslize — e continua vendo
   qual dos dois está ativo, porque a cor não depende da animação. */
@media (prefers-reduced-motion: reduce) {
  .modo-pilula { transition: none; }
}

.barra-acoes {
  flex: 1 1 0; min-width: 0;
  display: flex; align-items: center; justify-content: flex-end; gap: 7px;
}

.btn {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--painel-alto); border: 1px solid var(--borda-forte);
  border-radius: var(--raio); padding: 6px 11px; cursor: pointer;
  color: var(--texto); font-size: 12.5px; font-weight: 500; white-space: nowrap;
  transition: border-color .14s, background .14s, color .14s;
}
.btn:hover { border-color: var(--acento); background: var(--realce); }
.btn:disabled { opacity: .45; cursor: not-allowed; }
.btn:focus-visible { outline: 2px solid var(--acento); outline-offset: 1px; }

/* AS AÇÕES DA DIREITA SÃO FANTASMAS — menos uma.
   Desfazer, Tema, Progresso e Validar são conferências: acontecem muitas
   vezes, e uma borda em cada uma faz quatro caixas competindo. Só "Pacote
   SCORM" é terminal, e é a única com preenchimento — o teal da marca, usado
   uma vez na tela inteira. Acento que aparece em todo lugar deixa de apontar. */
.barra-acoes .btn {
  background: transparent; border-color: transparent; color: var(--texto-fraco);
}
.barra-acoes .btn:hover { background: var(--realce); color: var(--texto); }

.btn-forte {
  background: var(--acento-forte); border-color: var(--acento-forte);
  color: #fff; font-weight: 600; box-shadow: var(--sombra-1);
}
.barra-acoes .btn-forte {
  background: var(--acento-forte); border-color: var(--acento-forte); color: #fff;
}
.btn-forte:hover, .barra-acoes .btn-forte:hover {
  filter: brightness(1.12); background: var(--acento-forte); color: #fff;
}
.btn-mini { padding: 3px 8px; font-size: 11.5px; }
.btn-perigo:hover { border-color: var(--erro); color: var(--erro); }

/* A pílula `.estado` da barra saiu junto com o elemento que ela pintava: o
   estado de gravação vive só no pé do palco agora, e as cores dele estão em
   `.palco-salvo`. Regra de CSS sem elemento é a que sobrevive por anos e
   confunde quem procura de onde vem um estilo. */

/* ─── O AVATAR E O MENU DE PREFERÊNCIAS ─────────────────────────────────────
   O avatar é redondo porque redondo é a forma que a web inteira usa para
   "pessoa" — quadrado com canto arredondado, que é a forma de tudo o mais
   nesta barra, leria como mais um botão. É a única peça circular da tela, de
   propósito. */
.avatar-btn {
  display: grid; place-items: center;
  width: 28px; height: 28px; padding: 0;
  border-radius: var(--raio-pill);
  background: var(--painel-alto); border: 1px solid var(--borda-forte);
  color: var(--texto-fraco); cursor: pointer;
  transition: border-color .14s, color .14s;
}
.avatar-btn svg { width: 17px; height: 17px; }
.avatar-btn:hover { border-color: var(--acento); color: var(--texto); }
/* Enquanto o menu está aberto o avatar continua marcado: sem isso, o menu
   flutua sem dizer de onde saiu. */
.avatar-btn[aria-expanded="true"] { border-color: var(--acento); color: var(--texto); }

/* UM SÓ DESENHO DE MENU, usado pelo avatar e pelas ações de curso. Eram duas
   listas suspensas com a mesma função e nada garantia que continuassem
   parecidas: a segunda que alguém escrevesse divergiria da primeira em raio,
   sombra ou espaçamento, e ninguém notaria até vê-las abertas lado a lado.
   `.menu-ancora` é só o referencial de posição de quem abre. */
.menu-ancora { position: relative; display: flex; align-items: center; }

.menu-flutuante {
  position: absolute; top: calc(100% + 8px); z-index: 60;
  min-width: 224px; padding: 10px;
  display: flex; flex-direction: column; gap: 10px;
  background: var(--painel-alto); border: 1px solid var(--borda-forte);
  border-radius: var(--raio-g); box-shadow: var(--sombra-3);
}
/* O menu nasce alinhado pelo lado de DENTRO da tela: quem abre na ponta
   direita da barra cresce para a esquerda, e quem abre no meio cresce para a
   direita. Alinhar todos pelo mesmo lado jogaria o do avatar para fora da
   janela, porque ele é o último elemento da barra. */
.menu-flutuante { inset-inline-start: 0; }
.menu-flutuante.pela-direita { inset-inline-start: auto; inset-inline-end: 0; }

/* `display: flex` numa classe VENCE o `[hidden]` padrão do navegador, e o
   resultado é um menu invisível que continua capturando cliques. Já aconteceu
   no motor, com a janela do Tutor IA; aqui a regra vai junto desde o começo. */
.menu-flutuante[hidden] { display: none; }

.menu-titulo {
  margin: 0; font-size: 10.5px; font-weight: 600; letter-spacing: .06em;
  text-transform: uppercase; color: var(--texto-tenue);
}
.menu-campo { display: flex; flex-direction: column; gap: 4px; font-size: 11.5px; color: var(--texto-fraco); }
.menu-campo select {
  background: var(--campo-fundo); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 6px 9px; color: var(--texto);
  font-size: 12.5px; font-weight: 500; width: 100%;
}
/* Um interruptor é uma LINHA, não uma coluna: a marca e o rótulo lado a lado,
   como em qualquer menu de preferências. O `.menu-campo` empilha porque foi
   feito para o par rótulo-em-cima/select-embaixo do idioma. */
.menu-campo-marca {
  flex-direction: row; align-items: center; gap: 8px;
  padding: 3px 0; cursor: pointer; user-select: none;
}
.menu-campo-marca input { width: auto; margin: 0; accent-color: var(--acento); }
.menu-campo-marca:hover { color: var(--texto); }

/* ─── OS TRÊS NÍVEIS DE TEXTO DE AJUDA ──────────────────────────────────────
   Escondidos por CSS, e não removidos do HTML, por três razões: a decisão fica
   num lugar só; volta na hora, sem redesenhar painel nenhum; e o texto continua
   no documento para quem chegar por busca do navegador.

   `display: none` e não `visibility`: o objetivo é a interface ENCOLHER — o
   autor que desliga isto quer o espaço de volta, não um vão onde havia texto. */
/* `.dica` SEM ESCOPO, e isto foi corrigido depois de olhar a tela: eu tinha
   escrito `.campo .dica`, e o painel da trilha tem uma `.dica` dentro de
   `.gatilho` que ficou aparecendo com o interruptor desligado. A classe é o
   contrato — onde ela estiver, é dica. */
:root[data-ajuda-dicas="0"] .dica { display: none; }
/* O `?` é o INVERSO da dica: existe só quando ela não está. Dois estados, nunca
   os dois — com a ajuda ligada o texto já está ali e o símbolo seria redundância.
   E revelar um campo específico vence o desligamento geral. */
.dica-abrir { display: none; }
:root[data-ajuda-dicas="0"] .dica-abrir { display: inline-flex; }
:root[data-ajuda-dicas="0"] .campo.dica-a-mostra .dica { display: block; }
.campo > label { display: flex; align-items: center; gap: 5px; }
.dica-abrir {
  align-items: center; justify-content: center;
  width: 14px; height: 14px; padding: 0; flex: 0 0 auto;
  background: transparent; color: var(--texto-tenue);
  border: 1px solid var(--borda); border-radius: 50%;
  font-size: 9.5px; line-height: 1; cursor: pointer;
}
.dica-abrir:hover { color: var(--texto); border-color: var(--acento); }
:root[data-ajuda-infos="0"] .nota:not(.aviso):not(.erro) { display: none; }
/* O AVISO DENTRO DO DIÁLOGO NÃO SE ESCONDE, e isto foi descoberto lendo onde os
   avisos realmente estão: dos cinco que existem hoje, QUATRO aparecem em
   `#janela`, no instante de uma ação de consequência — apagar pasta de mídia
   que o curso usa, renomear o curso (o identificador é a chave do progresso no
   LMS), gerar o pacote de conferência (que não pode ir para a turma), e a lista
   do que foi retirado do zip por apontar para arquivo inexistente.

   Esse texto não é ajuda: é a última coisa que o autor lê antes de confirmar.
   Um interruptor de preferência que o apagasse seria a ferramenta escondendo a
   consequência bem na hora de causá-la. O interruptor vale para os avisos
   AMBIENTES, os que ficam num painel enquanto se trabalha. */
:root[data-ajuda-avisos="0"] .nota.aviso:not(#janela .nota.aviso) { display: none; }

/* O botão de tema ocupa a linha inteira do menu, alinhado à esquerda como um
   item de lista — e não centrado como um botão de ação. Dentro de um menu, o
   que se alinha à esquerda se lê como opção; o que se centra se lê como
   confirmação. */
.menu-acao {
  display: flex; align-items: center; gap: 8px; width: 100%;
  background: transparent; border: 1px solid transparent; border-radius: var(--raio);
  padding: 7px 8px; cursor: pointer;
  color: var(--texto); font-size: 12.5px; font-weight: 500; text-align: start;
  transition: background .12s;
}
.menu-acao svg { width: 16px; height: 16px; flex: 0 0 auto; }
.menu-acao:hover:not(:disabled) { background: var(--realce); }
/* Curso somente-leitura desliga Renomear e Importar. Continuam VISÍVEIS e
   apagados, em vez de sumirem: um menu que muda de tamanho conforme o curso
   faz o autor procurar o item que ele lembra ter visto. Apagado ele ainda
   responde ao `title`, que diz por que não dá. */
.menu-acao:disabled { opacity: .4; cursor: not-allowed; }

/* ─── GRADE DE TRÊS COLUNAS ─────────────────────────────────────────────── */


/* 256 e 320, medidas do redesenho. As duas colunas laterais devolvem 44px ao
   palco, que é a única parte da tela onde o autor JULGA o resultado — as
   laterais ele opera, não contempla.

   O preço está na árvore: os nomes de página já truncam em 290px e truncam um
   pouco mais agora. Foi conferido na tela antes de ficar; se um dia a árvore
   passar a mostrar caminho completo, esta é a primeira medida a rever. */
/* A ALTURA QUE SOBRA, agora com o rodape descontado tambem.
   O rodape saiu de dentro do palco e virou faixa da JANELA (ver o comentario
   no studio.html), entao ele deixou de ser problema do palco e passou a ser
   uma das tres faixas fixas: barra, grade, rodape. */
.grade {
  height: calc(100% - var(--barra-altura) - var(--rodape-altura));
  display: grid;
  grid-template-columns: 256px minmax(0, 1fr) 320px;
}

.painel {
  background: var(--painel);
  display: flex; flex-direction: column; min-height: 0;
}
.painel-esq { border-inline-end: 1px solid var(--borda); }
.painel-dir { border-inline-start: 1px solid var(--borda); }

.painel-topo {
  display: flex; align-items: center; justify-content: space-between;
  padding: 11px 12px 11px 14px; border-bottom: 1px solid var(--borda);
}
.painel-topo h2 {
  margin: 0; font-size: 10.5px; font-weight: 600; letter-spacing: .1em;
  text-transform: uppercase; color: var(--texto-tenue);
}
/* "+ Trilha" é uma pílula contornada, como no mockup: ele é uma ação de
   criação e merece a forma de botão, não a de ícone solto entre dois. */
.painel-topo .btn-mini {
  border-radius: var(--raio-pill); padding: 4px 11px; font-weight: 500;
  border-color: var(--borda-forte);
}

/* ─── ÁRVORE DE TRILHAS E PÁGINAS ───────────────────────────────────────── */

.arvore { flex: 1; overflow-y: auto; padding: 8px; }

.trilha {
  margin-bottom: 10px; border: 1px solid var(--borda);
  border-radius: 10px; overflow: hidden; background: var(--painel);
}
.trilha.arrastando { opacity: .4; }
/* A BARRA COLORIDA À ESQUERDA identifica a trilha à distância — é a pista que
   o mockup usa, e a única que sobrevive quando a coluna está estreita e os
   nomes cortados. Cada trilha herda a sua cor de `--cor-trilha`. */
.trilha-topo {
  display: flex; align-items: center; gap: 6px;
  padding: 9px 9px 9px 7px; background: var(--painel-alto);
  border-inline-start: 3px solid var(--cor-trilha, var(--acento));
  position: relative;          /* âncora do que precisar; as ações voltaram ao fluxo */
}
.trilha-topo .trilha-nome {
  font-size: 11.5px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
}
.pegar { cursor: grab; color: var(--texto-tenue); user-select: none; padding: 0 2px; }
.pegar:active { cursor: grabbing; }
.trilha-nome {
  flex: 1; background: transparent; border: 1px solid transparent;
  border-radius: 5px; padding: 2px 5px; font-weight: 600; min-width: 0;
}
.trilha-nome:focus { border-color: var(--acento); outline: none; background: var(--fundo); }
/* AS AÇÕES DA TRILHA FLUTUAM — não ocupam a linha.
   `opacity: 0` esconde mas NÃO devolve o espaço: os botões reservavam 125px
   dos 222px da linha o tempo todo, invisíveis, e como `.trilha-nome` é
   `flex: 1` ele ficava com a sobra — 29px na coluna de 256px, o bastante para
   escrever "ES" no lugar de "ESTRUTURA". O nome é o DADO da linha; os botões
   são secundários e só existem sob o ponteiro. Agora eles saem do fluxo e se
   sobrepõem ao fim da linha, com o fundo do cabeçalho atrás para não se
   misturarem ao texto que passa por baixo. */
/* ELES SAEM DO FLUXO QUANDO ESCONDIDOS, E VOLTAM PARA ELE QUANDO APARECEM.
   E os dois lados dessa frase são necessários.

   Sair do fluxo resolvia o problema original: com `opacity: 0` os botões
   reservavam 125px dos 222px da linha o tempo todo, invisíveis, e como
   `.trilha-nome` é `flex: 1` ele ficava com a sobra — 29px, o bastante para
   escrever "ES" no lugar de "ESTRUTURA".

   Só que `position: absolute` os deixava POR CIMA do nome quando apareciam. E
   o nome é um `<input>`: renomear a trilha é clicar nele. Medido: o campo ia
   de x=62 a x=237 e os seis botões de x=111 a x=237 — sobravam 49px
   clicáveis, e o gesto de apontar para a trilha revelava justamente os botões
   que impediam o clique. O `padding-inline-end: 0` daqui tentava resolver e
   não podia: padding não encolhe a CAIXA de um `flex: 1`.

   `inline-size: 0` com `overflow: hidden` faz as duas coisas: largura zero
   enquanto escondidos (o nome fica com a linha inteira, que era o ponto), e
   largura real ao aparecer, empurrando o campo em vez de cobri-lo. O nome
   encolhe sob o ponteiro — e é isso que o torna clicável. */
.trilha-acoes {
  display: flex; gap: 3px; flex: 0 0 auto;
  inline-size: 0; overflow: hidden; opacity: 0;
  transition: opacity .12s;
}
.trilha-topo:hover .trilha-acoes,
.trilha-topo:focus-within .trilha-acoes { inline-size: auto; opacity: 1; }
.icone-btn {
  background: transparent; border: 0; cursor: pointer;
  color: var(--texto-tenue); padding: 2px 4px; border-radius: 4px; font-size: 12px;
}
/* SEM ESTA LINHA O ÍCONE NÃO APARECE — e o botão fica com 8px de padding e
   nada dentro, clicável e invisível.
   Ela faltava porque `.icone-btn` nasceu para botões de CARACTERE (⊟ ⊞ ⤢), que
   se dimensionam pela fonte. Quando os primeiros SVGs entraram aqui — capa,
   desfazer, resetar progresso —, um <svg> sem width e sem height dentro de um
   flex container resolve para zero, e some sem erro nenhum: não há aviso no
   console, o clique continua funcionando, e a única pista é um espaço vazio
   onde deveria haver um desenho. Os outros botões desenhados do Studio têm
   cada um a sua regra (.ic-acao, .tela-btn, .modo-btn, .avatar-btn); esta
   fechava o buraco que sobrava. */
.icone-btn svg { width: 16px; height: 16px; display: block; }
.icone-btn:hover { background: var(--borda); color: var(--texto); }
.icone-btn.perigo:hover { color: var(--erro); }

/* O gatilho EMPILHA, não fica lado a lado.
   Com dois selects e um campo de nota na mesma linha, dentro de uma coluna de
   290px, cada um ficava com ~70px: o autor via "Ao p…" e "AVAL…" e tinha de
   adivinhar o que escolheu. Empilhado, cada controle usa a largura inteira e
   mostra o nome da página por extenso, que é a informação que importa. */
/* Trilha recolhida: o cabeçalho fica, o resto sai. O gatilho some junto — ele
   é do miolo da trilha, e mantê-lo visível numa lista recolhida devolveria a
   altura que o autor quis economizar. */
.trilha.recolhida > *:not(.trilha-topo) { display: none; }
.seta-recolher { width: 16px; text-align: center; flex: 0 0 auto; }
.painel-acoes { display: flex; align-items: center; gap: 3px; }

.trilha-eco {
  margin: 0; padding: 3px 10px 5px;
  font-size: 10.5px; color: var(--texto-tenue);
  background: var(--painel-alto); cursor: pointer;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.trilha-eco:hover { color: var(--acento); }

.gatilho {
  display: flex; flex-direction: column; align-items: stretch; gap: 5px;
  padding: 7px 8px; background: var(--gatilho-fundo); border-bottom: 1px solid var(--borda);
  font-size: 11.5px; color: var(--texto-fraco);
}
.gatilho select, .gatilho input {
  background: var(--painel-alto); border: 1px solid var(--borda-forte);
  border-radius: 5px; padding: 4px 6px; font-size: 11.5px;
  width: 100%; max-width: 100%; color: var(--texto);
}
.gatilho-linha { display: flex; align-items: center; gap: 5px; }
.gatilho-linha input[type="number"] { width: 62px; }
.gatilho-rotulo {
  display: flex; align-items: center; gap: 5px;
  font-size: 10.5px; letter-spacing: .04em; text-transform: uppercase;
  color: var(--texto-tenue);
}
/* ── O GATILHO RECOLHIDO ─────────────────────────────────────────────
   O resumo empurra o botão para a direita e encolhe primeiro: numa coluna de
   ~230px o que precisa caber inteiro é o [+], não a frase. Sem caixa alta aqui —
   o rótulo ao lado já está em versalete, e dois níveis de caixa alta na mesma
   linha viram uma linha só de ruído. */
.gatilho-resumo {
  /* LINHA PRÓPRIA, abaixo do rótulo. Na mesma linha o rótulo em caixa alta
     comia a largura e a frase saía cortada em "inicia a…" — e um resumo
     cortado no meio não informa nada, que era o único motivo de ele existir.
     Duas linhas contra as cinco dos controles continua sendo o ganho. */
  display: block; margin-top: 1px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  text-transform: none; letter-spacing: 0; font-style: italic;
  font-size: 11px; color: var(--texto-fraco);
}
.gatilho-abrir {
  flex: 0 0 auto; margin-inline-start: auto;
  width: 17px; height: 17px; line-height: 1; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; color: var(--texto-tenue);
  border: 1px solid var(--borda); border-radius: 4px;
  font-size: 12px; cursor: pointer;
}
.gatilho-abrir:hover { color: var(--texto); border-color: var(--borda-forte); }
.gatilho-corpo[hidden] { display: none; }
.gatilho-corpo {
  display: flex; flex-direction: column; align-items: stretch; gap: 5px;
}
.gatilho.quebrado { box-shadow: inset 3px 0 0 var(--erro); }

.paginas { list-style: none; margin: 0; padding: 4px; min-height: 10px; }
.pagina-item {
  display: flex; align-items: center; gap: 7px; position: relative;
  padding: 6px 8px; border-radius: 7px; cursor: pointer; font-size: 12.5px;
  border: 1px solid transparent; transition: background .12s;
}
.pagina-item:hover { background: var(--realce); }
/* A PÁGINA ABERTA é uma pílula preenchida com uma marca de acento na ponta.
   Só a borda azul de antes se perdia numa lista de dez linhas; o preenchimento
   diz "você está aqui" sem o autor precisar procurar. */
.pagina-item.ativa {
  background: var(--selecao); border-color: transparent;
  color: var(--texto); font-weight: 500;
}
.pagina-item.ativa::before {
  content: ''; position: absolute; inset-inline-start: 0; top: 6px; bottom: 6px;
  width: 3px; background: var(--acento);
  /* O filete é arredondado no lado de DENTRO da linha, qualquer que seja ele. */
  border-start-end-radius: 3px; border-end-end-radius: 3px;
}
.pagina-item.arrastando { opacity: .35; }
/* Os ícones da árvore. A cor separa os tipos de longe; a FORMA os separa para
   quem não distingue as cores — as duas pistas dizem a mesma coisa. */
.ic { display: inline-flex; flex: 0 0 auto; width: 15px; height: 15px; }
.ic svg { width: 100%; height: 100%; display: block; }
.ic-pagina    { color: var(--cor-pagina); }   /* documento com linhas  · azul     */
.ic-avaliacao { color: var(--cor-avaliacao); }   /* prancheta com ✓       · âmbar    */
.ic-menu      { color: var(--cor-menu); }   /* pasta                 · violeta  */
.ic-home      { color: var(--cor-home); }
/* A figura herda a cor do texto: ela aparece no CABEÇALHO do painel, ao lado
   da palavra, e não numa lista onde precisasse se distinguir de outros três. */
.ic-imagem    { color: currentColor; }
.btn .ic { margin-inline-end: 4px; vertical-align: -3px; }

/* O TAMANHO DO ICONE DENTRO DE UM BOTAO — a regra que faltava na base.
   `.modo-btn`, `.icone-btn`, `.tela-btn` e `.avatar-btn` tinham a sua; `.btn`,
   que e o botao mais usado da tela, nao tinha. Passou despercebido enquanto
   todos os `.btn` da barra eram `flex` numa LINHA, onde o svg herda a altura do
   texto. Na tela de boas-vindas eles viraram uma COLUNA, e ai o
   `align-items: stretch` padrao esticou o svg ate a altura inteira do botao:
   um "+" de 40px dentro de um botao de 40px. (Visto pelo Cristiano em
   31/08/2026.) */
.btn svg { inline-size: 16px; block-size: 16px; flex: 0 0 auto; }

.pagina-item .rotulo { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pagina-item .marca { font-size: 11px; color: var(--texto-tenue); }
/* Mesma correção das ações de trilha, pela mesma razão: 78px dos 214px da
   linha ficavam reservados para botões invisíveis, e o rótulo — que é o nome
   da página — recebia a sobra.

   `background-color: inherit` em vez de um token fixo porque o fundo do item
   MUDA: transparente em repouso, `--realce` sob o ponteiro, `--selecao` na
   página aberta. Cravar uma cor aqui deixaria a tarja das ações destoando
   justamente na página em que o autor está trabalhando. */
.pagina-acoes {
  position: absolute; inset-inline-end: 8px; top: 50%; translate: 0 -50%;
  display: flex; gap: 2px; opacity: 0;
  background-color: inherit; padding-inline-start: 8px;
}
.pagina-item:hover .pagina-acoes { opacity: 1; }
.alvo-solta { border-top: 2px solid var(--acento) !important; }
.novo-item { display: flex; gap: 5px; padding: 5px 4px 2px; }
.novo-item .btn { flex: 1; padding: 4px 6px; }

/* A capa deixou de ser uma linha no rodapé da árvore e virou o primeiro botão
   da barra do curso. O `.ativa` continua sendo aplicado pelo studio.js quando
   a página aberta é a home — é a única pista de que o botão diz respeito a
   onde você está, e não só para onde ele leva. */
#ir-home.ativa { color: var(--acento); border-color: var(--acento); }

/* AS DUAS VERSÕES, no rodapé da coluna esquerda.
   `--texto-tenue` e 10,5px: elas têm de ser LEGÍVEIS e não notáveis. Informação
   que se consulta uma vez por mês não pode disputar atenção com a árvore, que
   se lê o tempo todo. Números em `tabular-nums` para os dígitos ficarem no
   mesmo lugar quando a versão mudar — sem isso a linha "dança" a cada
   publicação, e o olho registra movimento onde não houve mudança de conteúdo
   que interesse. */
.versoes {
  margin: 0; flex: 0 0 auto;
  display: flex; flex-wrap: wrap; gap: 3px 12px;
  padding: 8px 14px; border-top: 1px solid var(--borda);
  font-size: 10.5px; color: var(--texto-tenue); cursor: default;
}
.versoes b { font-weight: 600; font-variant-numeric: tabular-nums; }

.conferencia { padding: 8px 10px; border-bottom: 1px solid var(--borda); background: var(--aviso-fundo); }
.conferencia .prob { font-size: 11.5px; line-height: 1.45; margin: 3px 0; display: flex; gap: 6px; }
.conferencia .prob[data-g="erro"] { color: var(--erro-texto); }
.conferencia .prob[data-g="aviso"] { color: var(--alerta-texto); }

/* ─── PALCO ─────────────────────────────────────────────────────────────── */

/* `min-height: 0` PORQUE ELE É ITEM DE GRADE.
   O mínimo automático de um item de grade é a altura do conteúdo, e isso
   impede a coluna de encolher: com o pé acrescentado, o palco passou a medir
   mais que a linha e empurrou a barra de estado para FORA da janela. */
.palco {
  display: flex; flex-direction: column; min-width: 0; min-height: 0;
  background: var(--palco-fundo);
}
.palco-topo {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 14px; border-bottom: 1px solid var(--borda);
  background: var(--painel); font-size: 12px;
}
/* O NOME DO CURSO, na vaga que era do titulo da pagina. Ele nao cede espaco
   (`flex: 0 0 auto` no selo) mas o nome em si encolhe com reticencias: um curso
   chamado "curso-braelea-22-potencia e energia em corrente alternada" nao pode
   empurrar o seletor de tela para fora da barra. */
.palco-topo .curso-atual {
  display: flex; align-items: center; gap: 7px; min-width: 0;
  padding-inline-end: 4px;
  border-inline-start: 0;
}
.palco-topo .curso-nome { font-size: 12.5px; max-inline-size: 34ch; }

/* O SELO DE SIMULAÇÃO usa a cor de alerta, e não a de acento: ele avisa que o
   que está na tela NÃO é o modo de trabalho — é o mesmo papel do 🔒 do curso
   somente-leitura, e por isso tem a mesma forma de pílula. Ele encolhe antes
   dos controles da direita, que são clicáveis; texto que some é recuperável
   trocando de modo, botão que sai da tela não. */
/* No pé do palco, encostado à direita: a migalha cresce e empurra o selo para
   o canto oposto ao "onde estou", que é onde o olho já procura estado.

   Sem `text-overflow` agora — a frase inteira cabe nesta linha, e era lá em
   cima, disputando espaço com o zoom e o seletor de tela, que ela vinha sendo
   cortada em reticências. `margin-inline-start: auto` faz o empurrão sem
   precisar de um elemento vazio no meio. */
.selo-simulacao {
  flex: 0 0 auto; margin-inline-start: auto;
  padding: 3px 9px; border-radius: var(--raio-pill);
  border: 1px solid var(--alerta); color: var(--alerta-texto);
  font-size: 11px;
}
.selo-simulacao[hidden] { display: none; }

/* ─── AS BARRAS DE ROLAGEM ──────────────────────────────────────────────────
   A do sistema é clara, larga e com setas nas pontas — desenhada para janela
   de aplicativo do Windows, não para uma moldura escura. Ao lado da árvore ela
   era a coisa mais clara da coluna, e puxava o olho para o canto onde não há
   nada para decidir.

   Duas declarações porque nenhuma sozinha cobre todo mundo: `scrollbar-width`
   e `scrollbar-color` são o padrão (Firefox, e Chrome recente), e o
   `::-webkit-scrollbar` é o que os Chrome mais antigos ainda entendem. Quem
   suporta as duas usa a padrão e ignora a outra.

   A cor vem dos tokens, então ela acompanha o tema claro sem uma segunda
   regra — que é o defeito que a barra do sistema tinha: ela não trocava. */
* {
  scrollbar-width: thin;
  scrollbar-color: var(--borda-forte) transparent;
}
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: var(--borda-forte); border-radius: var(--raio-pill);
  /* A borda transparente com `background-clip` afina o polegar sem afinar a
     ÁREA CLICÁVEL: pegar uma barra de 4px é irritante, e uma de 10px come
     largura da coluna. Assim ela parece fina e continua fácil de agarrar. */
  border: 3px solid transparent; background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover { background: var(--texto-tenue); background-clip: padding-box; }
/* O canto onde as duas barras se encontram fica com o fundo do sistema se não
   for declarado — um quadradinho claro no canto do painel escuro. */
::-webkit-scrollbar-corner { background: transparent; }

/* ─── A GAVETA DE MÍDIA ─────────────────────────────────────────────────────
   Fechada, ela é uma barra de ~34px. Aberta, um painel de altura fixa que sai
   do palco — e não do pé, que precisa continuar visível: o estado de gravação
   e a migalha respondem "salvou?" e "onde estou?", e as duas perguntas não
   deixam de existir porque a galeria está aberta. */
.gaveta-midia {
  flex: 0 0 auto; display: flex; flex-direction: column; min-height: 0;
  background: var(--painel); border-top: 1px solid var(--borda);
}
.gaveta-topo {
  display: flex; align-items: center; gap: 7px;
  padding: 8px 14px; background: transparent; border: 0; cursor: pointer;
  color: var(--texto-fraco); font-size: 11px; font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase; text-align: start;
}
.gaveta-topo:hover { color: var(--texto); }
.gaveta-seta { width: 15px; height: 15px; flex: 0 0 auto; transition: rotate .16s; }
/* A seta aponta para CIMA quando fechada — para onde a gaveta vai se mover ao
   abrir. Apontar para o conteúdo escondido é a leitura que não exige explicar. */
.gaveta-topo[aria-expanded="false"] .gaveta-seta { rotate: 180deg; }

/* A GAVETA SOBE E DESCE, em vez de aparecer de uma vez.
   Era `display: none` -> `display: flex`, e `display` nao anima: a gaveta
   brotava na tela e o iframe do palco dava um salto de 300px num quadro so. O
   olho perde o lugar, e num painel que se abre e fecha o tempo todo isso cansa.
   Ideia boa que veio da versao 0.1.0-alpha.37, e a unica coisa que ela precisa
   e que a altura seja um numero nos dois estados — por isso `height: 0` no
   lugar de `display: none`.

   COLUNA FLEX, e a rolagem sai daqui para DENTRO. Era `display: block` com
   `overflow-y: auto` na propria gaveta: quem rolava era ela inteira, levando
   junto a area de soltar e a coluna de pastas. Com o explorador quem tem de
   rolar e so a grade de arquivos — a pasta escolhida precisa continuar a vista
   enquanto se procura o arquivo nela. */
.gaveta-corpo {
  display: flex; flex-direction: column;
  block-size: 0; padding-block: 0; padding-inline: 14px;
  overflow: hidden; opacity: 0;
  /* A altura e o padding no mesmo tempo, a opacidade um pouco mais curta: o
     conteudo termina de aparecer com a gaveta ja quase parada, em vez de
     deslizar visivel e chamar atencao para o movimento. */
  transition: block-size .26s cubic-bezier(.2, 0, 0, 1),
              padding-block .26s cubic-bezier(.2, 0, 0, 1),
              opacity .18s ease;
}
.gaveta-midia[data-aberta="true"] .gaveta-corpo {
  block-size: 300px; padding-block: 0 12px; opacity: 1;
}

/* Quem pediu menos movimento recebe a gaveta como ela era: aparece e some, sem
   deslize. O conteudo continua todo la — o que se desliga e a viagem. */
@media (prefers-reduced-motion: reduce) {
  .gaveta-corpo { transition: none; }
}

/* A galeria ganha largura aqui embaixo — na coluna de 320px do inspetor cabiam
   duas miniaturas por linha, e é para isso que a gaveta serve. `auto-fill` em
   vez de um número de colunas: quem tem a janela larga vê mais numa olhada, e
   nada precisa saber quanto mede a tela. */
.gaveta-corpo .galeria-grade {
  grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
}

/* ─── A BARRA DE ESTADO, NO PÉ DO PALCO ────────────────────────────────────
   Vinda do mockup, e ela resolve uma pergunta real: "onde eu estou?". A
   trilha da migalha responde isso sem o autor ter de procurar na coluna da
   esquerda qual linha está acesa — e o estado de salvamento fica no campo de
   visão de quem está olhando o conteúdo, não lá no canto oposto da tela. */
.palco-pe {
  display: flex; align-items: center; gap: 10px; flex: 0 0 auto;
  padding: 7px 14px; border-top: 1px solid var(--borda);
  background: var(--painel); font-size: 11.5px; color: var(--texto-tenue);
}
.palco-migalha {
  display: flex; align-items: center; gap: 6px; min-width: 0;
  overflow: hidden; white-space: nowrap;
}
.palco-migalha span { overflow: hidden; text-overflow: ellipsis; }
.palco-migalha .sep { color: var(--borda-forte); flex: 0 0 auto; }

/* O DEGRAU ATUAL NAO CEDE, e isso deixou de ser detalhe em 31/08/2026.
   Ate ali a pagina atual aparecia DUAS vezes — aqui, no fim da migalha, e
   escrita de novo na barra do palco. Com a segunda removida (ela era a versao
   pobre, sem a trilha e sem os degraus clicaveis), esta virou a unica.
   E numa flexbox com `overflow: hidden` quem some primeiro e o FIM da linha:
   sem este `flex: 0 0 auto`, o unico lugar que responde "que pagina e esta?"
   seria justamente o primeiro a sumir numa janela estreita. Os degraus
   anteriores encolhem no lugar dele. */
.palco-migalha .aqui {
  color: var(--texto-fraco); font-weight: 500;
  flex: 0 0 auto; max-inline-size: 28ch;
}
.migalha-ir {
  background: transparent; border: 0; padding: 2px 4px; border-radius: 5px;
  color: inherit; font: inherit; cursor: pointer; max-width: 190px;
  flex: 0 1 auto; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.migalha-ir:hover { color: var(--acento); background: var(--realce); }

/* OS DEGRAUS DESENHADOS — a capa e o hub — precisam de regra própria: sem
   `flex: 0 0 auto` eles encolheriam junto com os degraus de texto quando a
   migalha ficasse apertada, e um ícone espremido vira mancha. São os degraus
   mais curtos e mais estáveis da trilha — são os que menos devem ceder.

   O hub entrou aqui junto com a casa porque o papel dele também é fixo e o
   nome dele não é escolha do autor. Escrito, ele custava duas vezes: a largura
   de "HUB DA TRILHA" e a palavra "trilha" repetida logo depois do nome dela. */
.palco-migalha .icone {
  display: inline-flex; align-items: center; flex: 0 0 auto;
  max-width: none; padding-inline: 3px;
}
.palco-migalha .icone svg { width: 14px; height: 14px; display: block; }

/* O DEGRAU DE PAPEL é o que o Studio nomeia — "BLOCO · TEXTO", "CARTÃO 2" —,
   e não o que o professor batizou. A maiúscula é o único sinal que separa os
   dois no rodapé, e ela fica no CSS de propósito: `text-transform` respeita o
   idioma, enquanto `toUpperCase()` no JavaScript estragaria o texto de uma
   língua que o Studio ainda vai falar. O nome que o autor digitou sai na tela
   exatamente como ele o digitou. */
.palco-migalha .papel { text-transform: uppercase; letter-spacing: .02em; }

/* A PRÉVIA DA FIGURA, no painel dela. Ver o desenho vale mais do que ler
   `videoaula.png` — o mesmo argumento da miniatura do seletor de ícone. O
   xadrez atrás revela transparência: um PNG de fundo transparente sobre fundo
   branco parece ter fundo branco, e o autor só descobre no tema escuro do
   aluno. `contain` porque a figura aqui é para CONFERIR, e cortar esconderia
   justamente o canto que se quer ver. */
.previa-figura {
  margin: 0 0 12px; padding: 8px; border: 1px solid var(--borda);
  border-radius: 8px; background: var(--painel);
  background-image:
    linear-gradient(45deg, var(--realce) 25%, transparent 25%, transparent 75%, var(--realce) 75%),
    linear-gradient(45deg, var(--realce) 25%, transparent 25%, transparent 75%, var(--realce) 75%);
  background-size: 14px 14px;
  background-position: 0 0, 7px 7px;
}
.previa-figura img {
  display: block; max-width: 100%; max-height: 160px;
  margin-inline: auto; object-fit: contain;
}

/* O BOTÃO DE SUBIR UM NÍVEL, no alto do painel de propriedades. Maiúsculo
   porque o rótulo dele é um DESTINO, e destino em botão se lê de relance. */
.btn-subir {
  margin-bottom: 10px; max-width: 100%;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  text-transform: uppercase; letter-spacing: .02em;
}
.palco-salvo { display: flex; align-items: center; gap: 5px; flex: 0 0 auto; }
.palco-salvo svg { width: 13px; height: 13px; }
.palco-salvo[data-estado="salvo"] { color: var(--ok); }
.palco-salvo[data-estado="salvando"] { color: var(--alerta); }
.palco-salvo[data-estado="erro"] { color: var(--erro); }
/* REGRA, e nao falha: o curso nao aceita escrita (a vitrine, ou o curso de
   outra pessoa). Cor de atencao, nao de erro -- nada quebrou. */
.palco-salvo[data-estado="regra"] { color: var(--alerta); }
/* ─── O QUADRO, A MOLDURA E O ZOOM ────────────────────────────────────────
   O iframe recebe a largura de VERDADE do aparelho escolhido — 390px num
   celular em pé — porque é isso que faz as regras responsivas do motor
   dispararem. Escalar um iframe largo até parecer estreito mostraria o template
   de desktop encolhido, que é exatamente a mentira que se quer evitar.

   O zoom entra por cima, com `transform`. Como `transform` não muda o espaço
   que o elemento ocupa, quem carrega o tamanho final é a MOLDURA — sem ela, um
   quadro a 50% continuaria reservando o dobro do espaço e criaria barras de
   rolagem para uma área vazia. */
.palco-quadro {
  flex: 1; position: relative; min-height: 0; overflow: auto;
  display: flex; justify-content: center; align-items: flex-start;
  /* O CURSO FLUTUA SOBRE O CHÃO ESCURO, como no mockup. O respiro em volta é
     o que faz a prévia parecer o documento que ela é, em vez de um painel
     encaixado entre dois outros. Custa 18px de largura útil e devolve a
     leitura de "isto aqui é o curso, aquilo em volta é a ferramenta". */
  padding: 18px;
}
.palco-quadro[data-tela="retrato"],
.palco-quadro[data-tela="paisagem"] { background: var(--palco-aparelho); }

.palco-moldura {
  position: relative; flex: 0 0 auto;
  width: calc(var(--largura, 100%) * var(--zoom, 1));
  height: calc(var(--altura, 100%) * var(--zoom, 1));
  border-radius: var(--raio-g); overflow: hidden;
  box-shadow: var(--sombra-3);
}
/* O celular ganha a moldura de aparelho por cima da sombra do cartão. */
.palco-quadro[data-tela="retrato"] .palco-moldura,
.palco-quadro[data-tela="paisagem"] .palco-moldura {
  box-shadow: 0 0 0 8px var(--painel-alto), var(--sombra-3);
}

#curso {
  position: absolute; top: 0; left: 0;
  width: var(--largura, 100%); height: var(--altura, 100%);
  border: 0; display: block; background: var(--palco-fundo);
  transform: scale(var(--zoom, 1)); transform-origin: top left;
}

.palco-controles { margin-inline-start: auto; display: flex; align-items: center; gap: 8px; }
.grupo-telas, .grupo-zoom {
  display: flex; align-items: center; gap: 1px;
  background: var(--painel-alto); border: 1px solid var(--borda-forte);
  border-radius: var(--raio); padding: 2px;
}
.tela-btn {
  background: transparent; border: 0; cursor: pointer; color: var(--texto-tenue);
  padding: 3px 7px; border-radius: 5px; font-size: 13px; line-height: 1;
}
.tela-btn:hover { background: var(--borda); color: var(--texto); }
/* A TELA ESCOLHIDA usa `--ativo`, e não mais o teal do Pacote SCORM.
   Eram dois controles a dois centímetros um do outro dizendo "este está
   ativo" com cores diferentes — e o teal preenchido aqui roubava a distinção
   do único botão que devia tê-la. */
.tela-btn.ativo { background: var(--ativo); color: #fff; }
.tela-btn svg { width: 16px; height: 16px; display: block; }
.zoom-valor {
  background: transparent; border: 0; cursor: pointer; color: var(--texto-fraco);
  font-size: 11.5px; min-width: 42px; text-align: center; padding: 3px 2px;
}
.zoom-valor:hover { color: var(--texto); }
.palco-vazio {
  position: absolute; inset: 0; display: grid; place-items: center;
  background: var(--fundo); color: var(--texto-fraco); padding: 40px; text-align: center;
}

/* ─── INSPETOR ──────────────────────────────────────────────────────────── */

.abas-inspetor { display: flex; border-bottom: 1px solid var(--borda); padding: 0 4px; }
.aba {
  flex: 1; background: transparent; border: 0; cursor: pointer;
  padding: 12px 4px 10px; color: var(--texto-tenue);
  font-size: 12.5px; font-weight: 500;
  border-bottom: 2px solid transparent; transition: color .14s;
}
.aba:hover { color: var(--texto-fraco); }
.aba.ativa { color: var(--texto); border-bottom-color: var(--acento); font-weight: 600; }
.inspetor-corpo { flex: 1; overflow-y: auto; }
.aba-conteudo { padding: 12px; }

.secao-inspetor { margin-bottom: 18px; }
.secao-inspetor > h3 {
  margin: 0 0 8px; font-size: 10.5px; font-weight: 600; letter-spacing: .1em;
  text-transform: uppercase; color: var(--texto-tenue);
}

/* ─── A PALETA EM LADRILHOS ────────────────────────────────────────────────
   Três colunas, ícone em cima e nome embaixo, como no mockup. A versão
   anterior era de duas colunas com nome + resumo em cada peça: doze parágrafos
   curtos empilhados, que se leem como um texto corrido e não como uma paleta.
   O resumo passou para o `title` — ele é consulta, não leitura. */
.paleta-grade { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; }
.peca {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  background: var(--painel-alto); border: 1px solid var(--borda);
  border-radius: 10px; padding: 11px 6px 9px; cursor: grab; text-align: center;
  color: var(--texto); transition: border-color .14s, background .14s, transform .1s;
}
.peca:hover {
  border-color: var(--acento); background: var(--realce);
  transform: translateY(-1px);
}
.peca:active { cursor: grabbing; transform: none; }
.peca:focus-visible { outline: 2px solid var(--acento); outline-offset: 1px; }
.peca .peca-icone { font-size: 17px; display: block; }
/* A cor agrupa por FAMÍLIA, não por item: quatro cores se aprendem, doze não. */
.ic-grande { width: 21px; height: 21px; }
.fam-org   { color: var(--cor-pagina); }   /* organiza texto      */
.fam-int   { color: var(--cor-menu); }   /* o aluno interage    */
.fam-ext   { color: var(--cor-avaliacao); }   /* vem de fora         */
.fam-quest { color: var(--cor-home); }   /* tipos de questão    */
.peca .peca-nome {
  font-weight: 500; font-size: 11.5px; display: block; line-height: 1.25;
}
/* O resumo vira `title`: ele explica, e explicação em doze ladrilhos ao mesmo
   tempo vira parede de texto. Continua no DOM para leitor de tela. */
.peca .peca-resumo {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap;
}

/* ─── BUSCAR COMPONENTE ────────────────────────────────────────────────────
   Do mockup, e ela ganha valor com o tamanho da paleta: são doze blocos mais
   cinco tipos de questão, e procurar "carrossel" com o olho numa grade de três
   colunas é mais lento do que digitar "car". */
.busca-peca { position: relative; margin-bottom: 14px; }
.busca-peca input {
  width: 100%; background: var(--campo-fundo); border: 1px solid var(--borda);
  border-radius: var(--raio); color: var(--texto);
  padding-block: 8px; padding-inline-start: 32px; padding-inline-end: 44px;
  font-size: 12.5px;
}
.busca-peca input:focus { outline: none; border-color: var(--acento); }
.busca-peca .lupa {
  position: absolute; inset-inline-start: 10px; top: 50%; transform: translateY(-50%);
  width: 14px; height: 14px; color: var(--texto-tenue); pointer-events: none;
}
.busca-peca .atalho {
  position: absolute; inset-inline-end: 8px; top: 50%; transform: translateY(-50%);
  font-size: 10px; color: var(--texto-tenue); pointer-events: none;
  border: 1px solid var(--borda); border-radius: 4px; padding: 1px 5px;
}
.sem-resultado { font-size: 11.5px; color: var(--texto-tenue); padding: 6px 2px; }

/* ─── TEXTO DE AJUDA vs. ALERTA ────────────────────────────────────────────
   A `.nota` era uma caixa preenchida, e o painel tem várias — três empilhadas
   numa coluna de 330px viravam três cartões cinzentos disputando atenção com a
   paleta, que é o que o autor veio usar. Pior: davam a MESMA forma de um
   alerta, então "arraste para dentro do hub" parecia um aviso de problema.

   Agora explicação é TEXTO, com um filete discreto à esquerda. Só o que é
   alerta de verdade — `.aviso` e `.erro` — mantém fundo, porque aí a forma
   está dizendo algo: isto aqui precisa da sua atenção. */
.nota {
  font-size: 11.5px; line-height: 1.55; color: var(--texto-fraco);
  border-inline-start: 2px solid var(--borda); background: transparent;
  padding: 2px 0 2px 10px; margin: 8px 0;
}
.nota b { color: var(--texto); font-weight: 600; }
.nota code {
  background: var(--campo-fundo); border-radius: 4px; padding: 0 4px;
  font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 10.5px;
}
.nota.aviso, .nota.erro {
  background: var(--aviso-fundo); padding: 9px 11px;
  border-inline-start-width: 3px;
  border-start-end-radius: 8px; border-end-end-radius: 8px;
}
.nota.aviso { border-inline-start-color: var(--alerta); color: var(--alerta-texto); }
.nota.erro { border-inline-start-color: var(--erro); color: var(--erro-texto); }
.nota.aviso b, .nota.erro b { color: inherit; }

.campo { margin-bottom: 11px; }
.campo > label { display: block; font-size: 11.5px; color: var(--texto-fraco); margin-bottom: 3px; }
.campo input[type="text"], .campo input[type="number"], .campo input[type="url"],
.campo select, .campo textarea {
  width: 100%; background: var(--fundo); border: 1px solid var(--borda-forte);
  border-radius: 6px; padding: 6px 8px; color: var(--texto);
}
.campo textarea { min-height: 72px; resize: vertical; font-family: ui-monospace, "JetBrains Mono", monospace; font-size: 12px; }
.campo input:focus, .campo select:focus, .campo textarea:focus { outline: none; border-color: var(--acento); }
.campo .dica { font-size: 10.5px; color: var(--texto-tenue); line-height: 1.4; margin-top: 3px; }
.campo-linha { display: flex; align-items: center; gap: 7px; }
.campo-linha input[type="checkbox"] { width: auto; }

/* `min-width: auto` é o padrão de um item de flex, e o mínimo automático de um
   <select> é o texto da opção MAIS LONGA. Com os nomes de pasta na lista, o
   seletor deixava de encolher, empurrava o "+ pasta" para fora do painel e
   punha uma barra de rolagem horizontal na coluna inteira. */
.campo-linha select { min-width: 0; flex: 1 1 auto; text-overflow: ellipsis; }
.campo-linha .btn { flex: 0 0 auto; white-space: nowrap; }

.lista-itens { list-style: none; margin: 0 0 8px; padding: 0; }
.item-linha {
  display: flex; align-items: center; gap: 6px; padding: 5px 7px;
  background: var(--painel-alto); border: 1px solid var(--borda);
  border-radius: 6px; margin-bottom: 4px; font-size: 12px; cursor: pointer;
}
.item-linha:hover { border-color: var(--borda-forte); }
.item-linha.ativa { border-color: var(--acento); }
.item-linha .rotulo { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* A biblioteca em grupos que abrem e fecham. Num curso com quarenta imagens,
   encontrar a da aula 3 sem isso é rolagem cega. */
.galeria { display: block; }
.galeria-grade { display: grid; grid-template-columns: 1fr 1fr; gap: 7px; }
.grupo-midia { margin-bottom: 10px; }
.grupo-midia.fechada .galeria-grade { display: none; }
.grupo-midia-topo {
  display: flex; align-items: center; gap: 6px; width: 100%;
  background: var(--painel-alto); border: 1px solid var(--borda);
  border-radius: 6px; padding: 5px 8px; margin-bottom: 6px;
  cursor: pointer; color: var(--texto-fraco); font-size: 11.5px;
}
.grupo-midia-topo:hover { color: var(--texto); border-color: var(--borda-forte); }
.grupo-midia-topo .grupo-abrir {
  flex: 1; display: flex; align-items: center; gap: 6px;
  background: transparent; border: 0; cursor: pointer; color: inherit;
  font: inherit; padding: 0; text-align: start;
}
/* A pasta que vai receber o arquivo arrastado. */
.grupo-midia.recebendo > .grupo-midia-topo {
  border-color: var(--acento); background: var(--selecao); color: var(--texto);
}
.alerta-midia { cursor: help; }
.grupo-midia-topo .grupo-nome { flex: 1; text-align: start; font-family: ui-monospace, monospace; }
.grupo-midia-topo .grupo-conta {
  background: var(--borda); border-radius: 10px; padding: 0 6px; font-size: 10.5px;
}
.galeria figure {
  margin: 0; background: var(--painel-alto); border: 1px solid var(--borda);
  border-radius: 6px; padding: 5px; cursor: pointer; text-align: center;
}
.galeria figure:hover { border-color: var(--acento); }
.galeria img { width: 100%; height: 60px; object-fit: contain; background: var(--campo-fundo); border-radius: 4px; }
.galeria figcaption { font-size: 10px; color: var(--texto-tenue); margin-top: 4px; word-break: break-all; }

.solta-arquivo {
  border: 1.5px dashed var(--borda-forte); border-radius: var(--raio);
  padding: 16px 10px; text-align: center; color: var(--texto-tenue);
  font-size: 12px; cursor: pointer; margin-bottom: 10px;
}
.solta-arquivo.sobre { border-color: var(--acento); color: var(--acento); }
/* ─── A BIBLIOTECA COMO EXPLORADOR ─────────────────────────────────────────
   Pasta à esquerda, arquivos à direita — o modelo do Explorador do Windows.
   A razão de copiá-lo é a que vale para o Studio inteiro: que a pessoa saiba
   operar sem explicação nenhuma.

   `min-height: 0` nas duas colunas não é adorno: sem ele um filho de grid não
   encolhe abaixo do próprio conteúdo, o `overflow-y` nunca entra em ação e
   quem rola é a gaveta inteira — a barra lateral que o Cristiano pediu
   simplesmente não aparece. */
.explorador {
  display: grid; grid-template-columns: minmax(140px, 190px) 1fr;
  gap: 10px; min-height: 0; flex: 1 1 auto;
}
.explorador-pastas {
  min-height: 0; overflow-y: auto; padding-inline-end: 4px;
  border-inline-end: 1px solid var(--borda);
}
.explorador-arquivos { display: flex; flex-direction: column; min-height: 0; gap: 8px; }

.pasta-linha {
  display: flex; align-items: center; gap: 2px; border-radius: 5px;
  border: 1px solid transparent;
}
.pasta-linha:hover { background: var(--realce); }
.pasta-linha.escolhida { background: var(--selecao); border-color: var(--borda-forte); }
.pasta-linha.recebendo { border-color: var(--acento); background: var(--realce); }
.pasta-linha.filha { padding-inline-start: 12px; }
.pasta-abrir {
  flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px;
  background: transparent; border: 0; cursor: pointer; text-align: start;
  color: var(--texto-fraco); font-size: 11.5px; padding: 5px 6px;
}
.pasta-linha.escolhida .pasta-abrir { color: var(--texto); }
.pasta-icone { flex: 0 0 auto; font-size: 12px; }
.pasta-nome {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; font-family: ui-monospace, monospace;
}
.pasta-conta {
  flex: 0 0 auto; font-size: 10px; color: var(--texto-tenue);
  background: var(--campo-fundo); border-radius: 8px; padding: 0 5px;
}

.explorador-barra { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }
.busca-midia {
  flex: 1 1 auto; min-width: 0;
  background: var(--campo-fundo); border: 1px solid var(--borda-forte);
  border-radius: 5px; padding: 5px 8px; color: var(--texto); font-size: 11.5px;
}
.busca-midia:focus { outline: none; border-color: var(--acento); }
.explorador-barra select {
  flex: 0 0 auto; background: var(--campo-fundo); border: 1px solid var(--borda-forte);
  border-radius: 5px; padding: 5px 6px; color: var(--texto); font-size: 11.5px;
}
.explorador-conta { flex: 0 0 auto; font-size: 10.5px; color: var(--texto-tenue); }

/* A GRADE ROLA, e é ela que tem a barra lateral. */
.explorador-arquivos .galeria-grade {
  flex: 1 1 auto; min-height: 0; overflow-y: auto;
  grid-template-columns: repeat(auto-fill, minmax(108px, 1fr));
  align-content: start; padding-inline-end: 4px;
}
.explorador-arquivos figure {
  position: relative;
  margin: 0; background: var(--painel-alto); border: 1px solid var(--borda);
  border-radius: 6px; padding: 5px; cursor: pointer; text-align: center;
}
.explorador-arquivos figure:hover { border-color: var(--acento); }
.explorador-arquivos img {
  width: 100%; height: 68px; object-fit: contain;
  background: var(--campo-fundo); border-radius: 4px;
}
.explorador-arquivos figcaption {
  font-size: 10px; color: var(--texto-tenue); margin-top: 4px; word-break: break-all;
}
.cartao-doc, .cartao-audio {
  height: 68px; display: grid; place-items: center; font-size: 26px;
  background: var(--campo-fundo); border-radius: 4px;
}
/* O tocador nativo é largo por natureza; aqui ele encolhe para caber no
   cartão sem empurrar a grade. */
.explorador-arquivos audio { width: 100%; height: 26px; margin-top: 4px; }
.cartao-peso {
  position: absolute; top: 6px; inset-inline-end: 6px;
  font-size: 9px; color: var(--texto-tenue);
  background: var(--painel); border-radius: 6px; padding: 0 4px;
}

/* A ÁREA DE SOLTAR OCUPA A LARGURA INTEIRA — pedido do Cristiano. Ela era um
   quadrado no topo de uma coluna estreita, e um alvo de arrastar pequeno é um
   alvo que se erra. */
.solta-larga { padding: 20px 12px; margin-bottom: 12px; flex: 0 0 auto; }


/* ─── AVISOS FLUTUANTES ─────────────────────────────────────────────────── */

.avisos { position: fixed; inset-inline-end: 16px; bottom: 16px; display: flex; flex-direction: column; gap: 8px; z-index: 60; }
.aviso {
  background: var(--painel-alto); border: 1px solid var(--borda-forte);
  border-inline-start-width: 3px; border-radius: var(--raio); padding: 9px 13px;
  font-size: 12.5px; max-width: 380px; box-shadow: 0 8px 24px var(--sombra);
  animation: entra .16s ease-out;
}
.aviso[data-t="ok"] { border-inline-start-color: var(--ok); }
.aviso[data-t="erro"] { border-inline-start-color: var(--erro); }
.aviso[data-t="alerta"] { border-inline-start-color: var(--alerta); }
@keyframes entra { from { transform: translateY(6px); opacity: 0; } }

/* ─── JANELA (validação, exportação) ────────────────────────────────────── */

.janela {
  border: 1px solid var(--borda-forte); border-radius: 10px;
  background: var(--painel); color: var(--texto);
  padding: 0; width: min(760px, 92vw); max-height: 84vh;
}
.janela::backdrop { background: #000b; }
.janela-topo {
  display: flex; align-items: center; justify-content: space-between;
  padding: 12px 14px; border-bottom: 1px solid var(--borda);
}
.janela-topo h3 { margin: 0; font-size: 14px; }
.janela-corpo { padding: 14px; overflow: auto; max-height: 68vh; }
.janela-corpo pre {
  background: var(--campo-fundo); border: 1px solid var(--borda); border-radius: 6px;
  padding: 10px; font-size: 11.5px; line-height: 1.5; overflow-x: auto;
  white-space: pre-wrap; word-break: break-word;
}

/* Os dois tipos de página lado a lado no inspetor do hub. Empilhados eles
   pareceriam um botão e um "extra"; em linha ficam claros como duas escolhas
   equivalentes — que é o que são. */
.inserir-pagina { display: flex; gap: 6px; flex-wrap: wrap; }
.inserir-pagina .btn { flex: 1 1 auto; justify-content: center; }

/* CURSO SOMENTE-LEITURA (a vitrine curso-standard).
   O selo diz o estado; `.curso-travado` apaga o botão de Editar, que é o que
   o autor clicaria por reflexo. Ele continua visível de propósito — botão que
   some deixa a pessoa procurando o que sumiu. */
.selo-leitura {
  font-size: 11px; letter-spacing: .04em; padding: 3px 8px; border-radius: 20px;
  color: var(--alerta); border: 1px solid currentColor; white-space: nowrap;
}
.curso-travado #modo-editar { opacity: .4; pointer-events: none; }
.curso-travado .icone-btn[disabled] { opacity: .3; pointer-events: none; }

/* A miniatura do ícone ao lado do seletor. Ver o desenho decide mais rápido do
   que ler "videoaula.png" — e é a única forma de o autor notar que escolheu o
   ícone errado antes de o aluno ver o botão. */
.previa-icone {
  width: 22px; height: 22px; object-fit: contain; flex: 0 0 auto;
  background: var(--campo-fundo); border-radius: 4px; padding: 2px;
}

/* ═══════════════════════════════════════════════════════════════════════════
   A PORTA — a tela de entrar e a de criar a primeira conta.

   Ela usa os MESMOS tokens, os mesmos `.campo` e os mesmos `.btn` do resto do
   Studio, e é por isso que ela cabe aqui embaixo em setenta linhas em vez de
   pedir uma folha própria. A versão que veio de fora resolveu esta tela com
   Tailwind + UIkit + Franken UI + Google Fonts: quatro terceiros, ~700 KB, e
   uma segunda paleta por cima da nossa.

   O vidro fosco do cartão veio de lá e é bom — é o único empréstimo visual, e
   ele é feito com `backdrop-filter`, que o navegador já traz.
   ═══════════════════════════════════════════════════════════════════════════ */

.tela-porta {
  min-height: 100vh;
  margin: 0;
  display: flex; align-items: center; justify-content: center;
  background: var(--fundo);
  color: var(--texto-fraco);
  /* AS DUAS AURAS. É a única decoração da tela, e ela existe para o cartão ter
     de onde se destacar: sobre o navy chapado, um cartão translúcido não tem o
     que embaçar e o vidro fosco vira só uma borda mais clara. Ficam presas ao
     fundo (`fixed`) e fora do alcance do ponteiro. */
  position: relative; overflow: hidden;
}
.tela-porta::before, .tela-porta::after {
  content: ''; position: fixed; pointer-events: none; border-radius: 50%;
  filter: blur(120px); opacity: .16;
}
.tela-porta::before {
  inset-block-start: -22%; inset-inline-start: -12%;
  inline-size: 46%; block-size: 52%; background: var(--marca-indigo);
}
.tela-porta::after {
  inset-block-end: 6%; inset-inline-end: -12%;
  inline-size: 38%; block-size: 58%; background: var(--acento-forte);
}

.porta-canto {
  position: fixed; inset-block-start: 14px; inset-inline-end: 16px;
  display: flex; align-items: center; gap: 8px; z-index: 2;
}
.porta-idioma select {
  background: var(--campo-fundo); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 5px 8px;
  color: var(--texto-fraco); font: inherit; font-size: 12px;
}
.porta-idioma select:hover { border-color: var(--borda-forte); }
.porta-idioma select:focus-visible { outline: 2px solid var(--acento); outline-offset: 1px; }

.porta {
  position: relative; z-index: 1;
  display: flex; flex-direction: column; align-items: center; gap: 18px;
  inline-size: min(100% - 2.5rem, 25rem);
}

.porta-cartao {
  inline-size: 100%;
  padding: 30px 28px 26px;
  background: color-mix(in srgb, var(--painel) 76%, transparent);
  -webkit-backdrop-filter: blur(16px);
  backdrop-filter: blur(16px);
  border: 1px solid var(--borda);
  border-radius: var(--raio-g);
  box-shadow: var(--sombra-3);
}

.porta-marca {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  margin-block-end: 22px; text-align: center;
}
.porta-nome { margin: 6px 0 0; display: flex; align-items: baseline; gap: 6px; }
.porta-nome strong { font-size: 19px; font-weight: 700; letter-spacing: -.02em; color: var(--texto); }
.porta-linha {
  margin: 0; font-size: 12.5px; color: var(--texto-tenue);
  max-inline-size: 30ch; line-height: 1.5; text-wrap: balance;
}

/* O ERRO É VERMELHO E É TEXTO — não um ícone, não um toast que some. Quem
   errou a senha precisa lê-lo no tempo dele, e ele tem de continuar na tela
   enquanto a pessoa digita de novo. */
.porta-erro {
  margin: 0 0 16px; padding: 9px 12px;
  background: color-mix(in srgb, var(--erro) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--erro) 38%, transparent);
  border-radius: var(--raio);
  color: var(--erro-texto); font-size: 12.5px; line-height: 1.45;
}

.porta-forma { display: flex; flex-direction: column; gap: 2px; }
.porta-forma .campo { margin-block-end: 14px; }
.porta-forma .campo > span { display: block; font-size: 11.5px; color: var(--texto-fraco); margin-block-end: 4px; }
.porta-forma input {
  inline-size: 100%; box-sizing: border-box;
  background: var(--campo-fundo); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 9px 11px;
  color: var(--texto); font: inherit; font-size: 13.5px;
}
.porta-forma input::placeholder { color: var(--texto-tenue); opacity: .7; }
.porta-forma input:focus { outline: none; border-color: var(--acento); }
.porta-forma .dica { display: block; font-size: 10.5px; color: var(--texto-tenue); margin-block-start: 4px; }

.porta-entrar {
  inline-size: 100%; justify-content: center;
  padding-block: 9px; font-size: 13.5px; margin-block-start: 4px;
}

.porta-nota {
  margin: 18px 0 0; padding-block-start: 14px;
  border-block-start: 1px solid var(--borda);
  font-size: 11px; line-height: 1.5; color: var(--texto-tenue);
}

.porta-rodape {
  margin: 0; font-size: 10.5px; color: var(--texto-tenue);
  display: flex; align-items: center; gap: 8px;
}
.porta-rodape b { color: var(--texto-fraco); font-weight: 600; }
.porta-ponto { inline-size: 3px; block-size: 3px; border-radius: 50%; background: var(--borda-forte); }

/* O rótulo que existe só para o leitor de tela. Não é `display:none` nem
   `visibility:hidden` — os dois tiram o elemento da árvore de acessibilidade
   junto, que é exatamente o contrário do que se quer aqui. */
.visualmente-oculto {
  position: absolute; inline-size: 1px; block-size: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap; border: 0;
}


/* ═══════════════════════════════════════════════════════════════════════════
   A CASCA DA 0.1.0-alpha.37 — menus nomeados, rodapé de janela, boas-vindas.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ─── OS MENUS NOMEADOS ────────────────────────────────────────────────────
   `Arquivo` e `Ajuda`, escritos. Antes eram um botão de três pontinhos: um
   menu sem nome, que só se descobre clicando. A palavra diz o que tem dentro
   antes de abrir, e é o vocabulário que qualquer pessoa traz de qualquer outro
   editor.

   São DOIS, e não os quatro que a versão de fora propôs. "Exibir" repetiria os
   controles de tela, zoom e tema que a barra do palco já mostra, e "Editar"
   repetiria o Desfazer que mora lá. Menu que repete o que está visível ao lado
   não acrescenta caminho — acrescenta um segundo lugar para desandar. */
.menus { display: flex; align-items: center; gap: 2px; }
.menu-btn {
  background: transparent; border: 0; border-radius: var(--raio);
  padding: 6px 11px; cursor: pointer;
  color: var(--texto-fraco); font: inherit; font-size: 13px; font-weight: 500;
  white-space: nowrap; transition: background .14s, color .14s;
}
.menu-btn:hover { background: var(--realce); color: var(--texto); }
.menu-btn[aria-expanded="true"] { background: var(--realce); color: var(--texto); }
.menu-btn:focus-visible { outline: 2px solid var(--acento); outline-offset: 1px; }

.menu-risco {
  block-size: 0; margin: 5px 0; border: 0;
  border-block-start: 1px solid var(--borda);
}
/* A ÚNICA AÇÃO VERMELHA DE CADA MENU, e só no ponteiro. Vermelho em repouso
   faria a saída gritar mais alto que o trabalho; vermelho no hover confirma o
   que vai acontecer no instante em que ainda dá para desistir. */
.menu-acao-saida:hover:not(:disabled) { color: var(--erro); }

/* ─── O NOME DO CURSO ABERTO ───────────────────────────────────────────────
   Texto, e não um `<select>`. O seletor gastava a largura da opção mais longa
   para mostrar algo que muda uma ou duas vezes por sessão, e o nome — que se lê
   o tempo todo — era o que truncava. */
.curso-atual {
  display: flex; align-items: center; gap: 7px; min-width: 0;
  padding-inline-start: 10px;
  border-inline-start: 1px solid var(--borda);
}
.curso-nome {
  background: transparent; border: 0; padding: 4px 6px; border-radius: var(--raio);
  color: var(--texto); font: inherit; font-size: 13px; font-weight: 600;
  cursor: pointer; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  max-inline-size: 30ch;
}
.curso-nome:hover { background: var(--realce); color: var(--acento); }
.curso-nome:focus-visible { outline: 2px solid var(--acento); outline-offset: 1px; }

/* ─── O AVATAR ─────────────────────────────────────────────────────────────
   A foto de quem está usando — e, sem foto, as INICIAIS do nome, não um boneco
   genérico. A diferença aparece no dia em que houver duas contas na mesma
   máquina: um boneco não responde "esta sessão é minha?", duas letras
   respondem.

   As iniciais vêm prontas do `contas.perfil()`. Recortá-las aqui daria uma
   segunda regra, que discordaria da primeira no dia em que alguém tiver nome
   do meio. */
.avatar-btn {
  inline-size: 30px; block-size: 30px; flex: 0 0 auto;
  display: grid; place-items: center;
  padding: 0; cursor: pointer;
  background: var(--painel-alto); color: var(--texto-fraco);
  border: 1px solid var(--borda-forte); border-radius: 50%;
  overflow: hidden;
  transition: border-color .16s, color .16s;
}
.avatar-btn:hover { border-color: var(--acento); color: var(--texto); }
.avatar-btn:focus-visible { outline: 2px solid var(--acento); outline-offset: 2px; }
.avatar-btn[aria-expanded="true"] { border-color: var(--acento); }
.avatar-foto {
  inline-size: 100%; block-size: 100%;
  object-fit: cover; display: block;
}
.avatar-iniciais {
  font-size: 11.5px; font-weight: 600; letter-spacing: .02em;
  line-height: 1; user-select: none;
}

.conta-cabeca {
  display: flex; flex-direction: column; gap: 2px;
  margin: 0; padding: 4px 8px 8px;
}
.conta-nome { font-size: 12.5px; font-weight: 600; color: var(--texto); }
.conta-email {
  font-size: 11px; color: var(--texto-tenue);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  max-inline-size: 24ch;
}

/* ─── O RODAPÉ DA JANELA ───────────────────────────────────────────────────
   Ele era `.palco-pe`, dentro do `<section class="palco">`, e por isso subia e
   descia junto com a gaveta de mídia. Migalha é orientação — "onde eu estou" —
   e orientação que muda de lugar deixa de orientar. Colada na janela, ela fica
   no mesmo pixel o tempo todo. */
.rodape {
  block-size: var(--rodape-altura);
  display: flex; align-items: center; gap: 10px;
  padding-inline: 14px;
  background: var(--painel);
  border-block-start: 1px solid var(--borda);
  font-size: 11px; color: var(--texto-tenue);
}
.rodape .palco-migalha { min-width: 0; overflow: hidden; }
.rodape-dir {
  margin-inline-start: auto;
  display: flex; align-items: center; gap: 9px; flex: 0 0 auto;
}
.rodape-versao { font-size: 10.5px; white-space: nowrap; }
.rodape-versao b { color: var(--texto-fraco); font-weight: 600; }
.rodape-risco { inline-size: 1px; block-size: 12px; background: var(--borda); }
.rodape-ponto {
  inline-size: 3px; block-size: 3px; border-radius: 50%; background: var(--borda-forte);
}
.rodape .palco-salvo { font-size: 11px; }
.rodape .selo-simulacao { margin-inline-start: 0; }

/* ─── A TELA DE BOAS-VINDAS ────────────────────────────────────────────────
   Ela cobre a janela inteira porque o que está por baixo não é utilizável: sem
   curso aberto, a árvore está vazia, o palco não tem o que mostrar e o painel
   de propriedades não tem seleção. Um overlay translúcido sobre uma tela oca
   convida ao clique que não vai responder.

   O vidro fosco é o empréstimo visual da versão que veio de fora, e é o único.
   Ele é feito com `backdrop-filter`, que o navegador já traz — não com uma
   biblioteca de 500 KB. */
.boas-vindas {
  position: fixed; inset: 0; z-index: 40;
  display: grid; place-items: center;
  padding: 24px;
  background: color-mix(in srgb, var(--fundo) 82%, transparent);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}
.boas-vindas[hidden] { display: none; }

.boas-vindas-cartao {
  inline-size: min(100%, 27rem);
  padding: 34px 30px 28px;
  background: var(--painel);
  border: 1px solid var(--borda);
  border-radius: var(--raio-g);
  box-shadow: var(--sombra-3);
  text-align: center;
}
.boas-vindas-marca {
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  margin-block-end: 26px;
}
.boas-vindas-titulo {
  margin: 8px 0 0; font-size: 20px; font-weight: 500; letter-spacing: -.015em;
  color: var(--texto-tenue);
}
.boas-vindas-titulo strong { font-weight: 700; color: var(--texto); }
/* O respiro entre "Kursix" e "Studio". Na barra ele vem do `gap: 6px` do
   `.marca-nome`, que e flex; aqui o titulo e um <h1> corrido, e sem esta linha
   os dois saiam colados — "KursixStudio", que le como um nome so. */
.boas-vindas-titulo .marca-sub { margin-inline-start: 5px; }
.boas-vindas-linha {
  margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--texto-tenue);
  max-inline-size: 32ch; text-wrap: balance;
}

.boas-vindas-acoes { display: flex; flex-direction: column; gap: 10px; }
.bv-acao { inline-size: 100%; justify-content: center; padding-block: 9px; font-size: 13.5px; }

/* O "ou" com um filete de cada lado: ele separa as duas ações de trabalho do
   terceiro caminho, que é conhecer a vitrine. Sem a separação os três pareciam
   três opções do mesmo peso, e a vitrine não é — ela é a saída de quem ainda
   não sabe o que quer fazer. */
.bv-ou {
  display: flex; align-items: center; gap: 10px;
  margin: 4px 0; color: var(--texto-tenue); font-size: 11px;
}
.bv-ou::before, .bv-ou::after {
  content: ''; flex: 1 1 0; block-size: 1px; background: var(--borda);
}

.bv-vitrine {
  display: flex; align-items: center; justify-content: center; gap: 7px;
  padding: 7px; border-radius: var(--raio);
  color: var(--texto-tenue); font-size: 12.5px; text-decoration: none;
  transition: color .14s, background .14s;
}
.bv-vitrine:hover { color: var(--acento); background: var(--realce); }
.bv-vitrine svg { inline-size: 15px; block-size: 15px; }

/* A LISTA DE CURSOS do diálogo "Abrir curso". Uma linha por curso, com o nome
   inteiro legível — que é justamente o que o `<select>` da barra não dava. */
.lista-cursos { display: flex; flex-direction: column; gap: 4px; }
.curso-item {
  display: flex; align-items: center; gap: 9px;
  inline-size: 100%; padding: 9px 11px;
  background: var(--campo-fundo); border: 1px solid var(--borda);
  border-radius: var(--raio); cursor: pointer;
  color: var(--texto); font: inherit; font-size: 13px; text-align: start;
  transition: border-color .14s, background .14s;
}
.curso-item:hover { border-color: var(--acento); background: var(--realce); }
.curso-item:focus-visible { outline: 2px solid var(--acento); outline-offset: 1px; }
.curso-item svg { inline-size: 16px; block-size: 16px; flex: 0 0 auto; color: var(--texto-tenue); }
.curso-item.atual { border-color: var(--acento); }
.curso-item .curso-item-marca {
  margin-inline-start: auto; font-size: 10.5px; color: var(--acento);
  text-transform: uppercase; letter-spacing: .07em;
}


/* ═══════════════════════════════════════════════════════════════════════════
   ADMINISTRAÇÃO — a lista de quem tem conta neste Studio.
   ═══════════════════════════════════════════════════════════════════════════ */

.lista-usuarios { display: flex; flex-direction: column; gap: 6px; margin-block-end: 20px; }

.usuario-linha {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 11px;
  background: var(--campo-fundo); border: 1px solid var(--borda);
  border-radius: var(--raio);
}

/* A MESMA FACE DA BARRA — foto, ou as iniciais. Repetir o desenho do avatar
   aqui não é enfeite: numa lista de contas, a cara que a pessoa vê no canto da
   tela dela é o que liga uma linha desta lista a alguém de verdade. */
.usuario-face {
  inline-size: 30px; block-size: 30px; flex: 0 0 auto;
  display: grid; place-items: center; overflow: hidden;
  background: var(--painel-alto); border: 1px solid var(--borda-forte);
  border-radius: 50%;
  font-size: 11.5px; font-weight: 600; color: var(--texto-fraco);
}
.usuario-face img { inline-size: 100%; block-size: 100%; object-fit: cover; display: block; }

.usuario-quem { display: flex; flex-direction: column; gap: 1px; min-width: 0; flex: 1 1 auto; }
.usuario-quem b { font-size: 13px; font-weight: 600; color: var(--texto); }
.usuario-quem small {
  font-size: 11px; color: var(--texto-tenue);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.usuario-acoes { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }
.usuario-selo {
  font-size: 10px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
  padding: 2px 7px; border-radius: var(--raio-pill);
  background: color-mix(in srgb, var(--ativo) 18%, transparent);
  color: var(--ativo);
}

.forma-conta {
  padding-block-start: 16px;
  border-block-start: 1px solid var(--borda);
}
/* O ROTULO EM CIMA, E A CAIXA OCUPANDO A LINHA.
   Sem isto o `<span>` do rotulo e o `<input>` ficam lado a lado, e a dica de
   senha se enrola em volta da caixa — o `.campo` da barra e feito para caber
   numa linha, e este formulario e uma coluna. Mesma correcao que a tela de
   entrar ja tinha. */
.forma-conta .campo > span {
  display: block; font-size: 11.5px; color: var(--texto-fraco);
  margin-block-end: 4px;
}
.forma-conta .campo input[type="text"],
.forma-conta .campo input[type="password"] {
  inline-size: 100%; box-sizing: border-box;
}
.forma-conta .campo .dica { display: block; margin-block-start: 4px; }
.forma-conta .campo-linha { margin-block: 10px; }
.forma-conta .btn-forte { inline-size: 100%; justify-content: center; margin-block-start: 6px; }

/* O DONO, ao lado do nome do curso no diálogo de abrir. Ele só aparece quando
   o curso NÃO é seu: escrever "de você" em cada linha própria seria ruído numa
   lista onde a maioria costuma ser sua. */
.curso-item-dono {
  margin-inline-start: auto; flex: 0 0 auto;
  font-size: 10.5px; color: var(--texto-tenue);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-inline-size: 16ch;
}


/* CONTINUAR EDITANDO — o unico dos quatro cujo rotulo tem tamanho variavel.
   O nome do curso e uma segunda linha, menor: na mesma linha ele empurraria o
   verbo para fora em nomes como
   "curso-braelea-22-potencia e energia em corrente alternada". */
.bv-continuar { text-align: start; }
.bv-continuar-texto {
  display: flex; flex-direction: column; gap: 1px; min-width: 0; line-height: 1.25;
}
.bv-continuar-texto b {
  font-weight: 600; font-size: 11.5px; color: var(--acento);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}


/* AS CORES DA ABA, no dialogo de criar trilha. Seis quadrados, e nao um
   <select> com os nomes escritos: a cor e a coisa, e ler "ambar" para descobrir
   qual e custa mais do que ver. Os tokens sao os mesmos que o motor usa para
   pintar a aba, entao o que se escolhe aqui e exatamente o que aparece la. */
.cores-trilha { display: flex; gap: 7px; flex-wrap: wrap; }
.cor-trilha {
  inline-size: 26px; block-size: 26px; border-radius: 50%;
  border: 2px solid transparent; cursor: pointer; padding: 0;
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.12);
}
.cor-trilha:focus-visible { outline: 2px solid var(--acento); outline-offset: 2px; }
.cor-trilha.ativa { border-color: var(--texto); }
/* Sem uma regra por nome de cor: quem pinta cada quadrado e o `CORES_CSS` do
   studio.js, pelo `style.background`. Uma cor nova no motor entra sozinha. */


/* O CABECALHO DA TRILHA ACESO — quando o palco mostra a primeira tela dela.
   E a mesma marca que a linha de uma pagina aberta recebe, porque agora e a
   mesma natureza de coisa: clicar no cabecalho abre uma tela, como clicar numa
   pagina. Sem isto, abrir a primeira tela de uma trilha nao acendia nada na
   arvore e o autor perdia o "onde estou". */
.trilha-topo.aberta { background: var(--selecao); }

/* O ICONE DA TRILHA, que abre a primeira tela dela. Ele pinta com a cor da
   aba — a mesma que o filete da esquerda usa —, entao a linha inteira diz de
   que trilha se trata sem ler o nome. */
.abrir-trilha { padding: 2px; flex: 0 0 auto; color: var(--cor-trilha, var(--acento)); }
.abrir-trilha .ic { display: block; }
.abrir-trilha svg { width: 15px; height: 15px; display: block; }
.abrir-trilha:hover { background: var(--realce); }


/* ═══════════════════════════════════════════════════════════════════════════
   O SELETOR DE TEMA — botão na barra, galeria no diálogo
   ═══════════════════════════════════════════════════════════════════════════

   Substituiu o `<select>` em 09/09/2026. Tema se escolhe OLHANDO: uma lista
   suspensa oferecia três nomes que não descrevem tela nenhuma, e a única forma
   de comparar era escolher, esperar a prévia recarregar, e escolher de novo.

   A DECISÃO [D9] do guia da extração previu esta tela e a adiou de propósito —
   o `preview.png` já viajava no pacote do tema desde a fase 1, e quem o exibe
   viria num pedido próprio, para não fazer a entrega dos templates depender de
   uma tela nova ficar boa. */

/* Na barra o botão tem o mesmo teto de largura que o `<select>` tinha, e pela
   mesma razão escrita lá: o espaço é do título da página e da migalha, que são
   o que se lê. A miniatura entra como uma tira de 3:1 — o suficiente para
   distinguir um rail de um fichário de abas, sem virar figura. */
.campo-template .botao-template {
  display: flex; align-items: center; gap: 6px;
  max-inline-size: 152px; padding: 3px 7px 3px 3px;
  background: var(--campo-fundo); border: 1px solid var(--borda);
  border-radius: var(--raio); cursor: pointer;
  color: var(--texto); font: inherit; font-size: 12px;
  transition: border-color .14s, background .14s;
}
.campo-template .botao-template:hover:not(:disabled) {
  border-color: var(--acento); background: var(--realce);
}
.campo-template .botao-template:focus-visible {
  outline: 2px solid var(--acento); outline-offset: 1px;
}
.campo-template .botao-template:disabled { opacity: .4; cursor: not-allowed; }
/* 44×18, e o recorte é do CANTO SUPERIOR ESQUERDO de propósito: é ali que os
   três temas se distinguem — a aba colorida do fichário, a tira fina do base, o
   rail do corporate. Um recorte central mostraria a mesma coluna de texto nos
   três, e a miniatura viraria enfeite. */
.campo-template .botao-template img {
  inline-size: 44px; block-size: 18px; flex: 0 0 auto;
  object-fit: cover; object-position: top left;
  border-radius: 2px;
}
.campo-template .botao-template span {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* O tema que o curso PEDE e que não está instalado: o botão continua dizendo o
   que o curso diz, e a cor é a segunda pista — o texto já traz o ⚠️. */
.campo-template .botao-template.template-ausente { border-color: var(--alerta); }

/* A galeria. `auto-fill` com piso de 208px: com três temas cabem dois por
   linha no diálogo, e um acervo maior continua legível sem media query. */
.galeria-templates {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(208px, 1fr));
  gap: 10px;
}

.template-ficha {
  display: flex; flex-direction: column; align-items: stretch; gap: 5px;
  padding: 7px; text-align: start;
  background: var(--campo-fundo); border: 1px solid var(--borda);
  border-radius: var(--raio); cursor: pointer;
  color: var(--texto); font: inherit;
  transition: border-color .14s, background .14s;
}
.template-ficha:hover:not(:disabled) { border-color: var(--acento); background: var(--realce); }
.template-ficha:focus-visible { outline: 2px solid var(--acento); outline-offset: 1px; }
.template-ficha.atual { border-color: var(--acento); }
.template-ficha:disabled { opacity: .5; cursor: not-allowed; }

/* A moldura guarda a proporção 640×270 do `preview.png` mesmo antes de a
   imagem chegar — sem ela a grade pula de altura conforme as três carregam,
   e um `lazy` numa lista curta chega quase junto. */
.template-ficha-imagem {
  aspect-ratio: 640 / 270;
  display: grid; place-items: center; overflow: hidden;
  background: var(--painel-alto); border: 1px solid var(--borda);
  border-radius: 3px;
}
.template-ficha-imagem img {
  inline-size: 100%; block-size: 100%; object-fit: cover; object-position: top left;
}
.template-ficha-sem-imagem {
  font-size: 10.5px; color: var(--texto-tenue);
  text-transform: uppercase; letter-spacing: .07em;
}

.template-ficha strong { font-size: 12.5px; font-weight: 600; }
.template-ficha-descricao {
  font-size: 11.5px; line-height: 1.35; color: var(--texto-fraco);
}
.template-ficha-marca {
  font-size: 10.5px; color: var(--acento);
  text-transform: uppercase; letter-spacing: .07em;
}
.template-ficha.incompativel .template-ficha-marca { color: var(--texto-tenue); }
