/* =========================================================================
   Planeta Cursos — Portal do Aluno (E5B.1)
   Tema PRÓPRIO do portal, separado do painel operacional (app.css). CSS local,
   sem CDN. Identidade: claro/arejado/educacional para navegar; escuro imersivo
   no Player e no Modo Aula (foco). Acento índigo/violeta usado com parcimônia.
   ========================================================================= */

/* Ponte com os tokens compartilhados (static/css/tokens.css, carregado ANTES
   deste arquivo). O vocabulário `--pc-*` do Portal fica INTACTO de propósito:
   são ~26 KB de regras que continuam consumindo estes nomes sem uma linha
   alterada. O que muda é só de onde vem o valor. O Portal mantém o acento
   índigo/sky próprio — a diferença em relação ao painel é intencional. */
:root {
  /* base clara */
  --pc-bg: var(--gx-gray-060);
  --pc-surface: var(--gx-white);
  --pc-surface-2: var(--gx-gray-070);
  --pc-ink: var(--gx-ink-850);
  --pc-muted: var(--gx-ink-510);
  --pc-border: var(--gx-line-210);
  /* acento */
  --pc-primary: var(--gx-indigo-500);      /* índigo/violeta */
  --pc-primary-600: var(--gx-indigo-600);
  --pc-primary-soft: var(--gx-indigo-050);
  --pc-accent: var(--gx-sky-500);          /* toque educacional (sky) */
  /* progresso/estados — compartilhados com o painel */
  --pc-green: var(--gx-ok);
  --pc-green-soft: var(--gx-ok-soft);
  --pc-amber: var(--gx-warn);
  --pc-amber-soft: var(--gx-warn-soft);
  --pc-neutral-soft: var(--gx-neutral-soft);
  /* escuro imersivo (player/modo aula) — tema de FOCO de tela, não dark mode */
  --pc-dark-bg: var(--gx-focus-bg);
  --pc-dark-surface: var(--gx-focus-surface);
  --pc-dark-surface-2: var(--gx-focus-surface-2);
  --pc-dark-ink: var(--gx-focus-ink);
  --pc-dark-muted: var(--gx-focus-ink-muted);
  --pc-dark-border: var(--gx-focus-line);
  /* forma */
  --pc-radius: var(--gx-radius-xl);
  --pc-radius-sm: var(--gx-radius-lg);
  --pc-shadow: var(--gx-shadow-card);
  --pc-shadow-hover: var(--gx-shadow-hover);
  --pc-topbar-h: var(--gx-topbar-h-portal);
  --pc-font: var(--gx-font-portal);
  /* Anel de foco. Vira variável porque no escuro o `--pc-primary-soft` (quase
     branco no claro) fica escuro e sumiria contra o fundo. UI-QA-2 · Bloco 3. */
  --pc-focus-ring: var(--pc-primary-soft);
}

/* =========================================================================
   TEMA ESCURO DO PORTAL  (UI-QA-2 · Bloco 3 — piloto)

   Este bloco vive AQUI, no CSS da superfície, e não em tokens.css. É a regra
   central da fase: quem não escreve o próprio bloco escuro não escurece. Por
   isso `app.css`, `master.css`, `publico.css` e o caminho de impressão seguem
   claros mesmo que alguém coloque `data-tema` no `<html>` deles por engano.

   O atributo só é renderizado pelos templates do Portal (`base.html`,
   `login.html`, `trocar_senha.html`), a partir do cookie lido no servidor.

   O que muda e o que NÃO muda:
     - mudam as SUPERFÍCIES (fundo, card, borda, tinta) e os pares de estado;
     - NÃO muda o acento de marca em PREENCHIMENTO (`--pc-primary`, `--pc-accent`):
       o índigo→sky dos gradientes da capa e do logo é identidade do Portal e
       funciona sobre fundo escuro. O que clareia é o acento usado como TEXTO
       (`--pc-primary-600`, em links, abas e rótulos), que a 4,7:1 sobre o card
       escuro seria ilegível no valor claro.

   Escala suavizada no microbloco 3.1 (ver a nota da camada 7 em tokens.css):
   piso menos preto, moldura pela metade, sombra curta. A separação entre card
   e página passou a vir da SUPERFÍCIE; a borda só insinua.

   Contrastes medidos (WCAG), todos sobre `--pc-surface` escuro:
     ink 11,71:1 · muted 6,43:1 · primary-600 7,22:1 · verde 8,26:1 · âmbar 8,63:1
     badge neutro (muted/neutral-soft) 5,50:1 · avatar (600/soft) 6,28:1
   O Modo Aula (`--pc-dark-*` → `--gx-focus-*`) NÃO é tocado: continua sendo a
   superfície mais escura do produto, para que entrar nele siga sendo uma
   mudança perceptível de foco.
   ========================================================================= */
:root[data-tema="escuro"] {
  /* Faz o navegador desenhar input, select e barra de rolagem no esquema
     escuro. Sem isto, os controles nativos ficam brancos e denunciam o tema
     improvisado — é o detalhe que mais aparece num Portal cheio de formulário. */
  color-scheme: dark;

  --pc-bg: var(--gx-dark-bg);
  --pc-surface: var(--gx-dark-surface);
  --pc-surface-2: var(--gx-dark-surface-2);
  --pc-ink: var(--gx-dark-ink);
  --pc-muted: var(--gx-dark-ink-muted);
  --pc-border: var(--gx-dark-line);

  /* Acento: preenchimento mantido, texto clareado (ver nota acima). O soft
     subiu com o card no microbloco 3.1 (L* 18 -> 21,5): no valor antigo a aba
     ativa e o avatar ficavam mais ESCUROS que o proprio card, e "ativo" lido
     como afundado inverte o sinal. */
  --pc-primary-600: #a5b4fc;
  --pc-primary-soft: #2a3252;
  --pc-focus-ring: var(--pc-primary-600);

  --pc-green: var(--gx-dark-ok);
  --pc-green-soft: var(--gx-dark-ok-soft);
  --pc-amber: var(--gx-dark-warn);
  --pc-amber-soft: var(--gx-dark-warn-soft);
  --pc-neutral-soft: var(--gx-dark-neutral-soft);

  /* Sombra no escuro é quase toda ilusão: preto sobre fundo escuro não desenha
     profundidade, só suja o entorno. Os borrões largos e opacos do Bloco 3
     (30–40px a 35–45%) cercavam cada card de um halo turvo — parte concreta da
     sensação de "pesado". Aqui ficam curtos e discretos, só para descolar o
     card do fundo; quem separa de fato é a superfície mais clara. */
  --pc-shadow: 0 1px 2px rgba(0, 0, 0, .28), 0 6px 16px rgba(0, 0, 0, .20);
  --pc-shadow-hover: 0 2px 4px rgba(0, 0, 0, .32), 0 10px 24px rgba(0, 0, 0, .26);
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
  font-family: var(--pc-font);
  background: var(--pc-bg);
  color: var(--pc-ink);
  font-size: 15px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}
a { color: var(--pc-primary-600); text-decoration: none; }
a:hover { opacity: .8; }
h1, h2, h3 { margin: 0 0 .4em; line-height: 1.25; }
.pc-muted { color: var(--pc-muted); }

/* ---- Botões ---- */
.pc-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 10px 18px; border-radius: var(--pc-radius-sm); border: 1px solid var(--pc-border);
  background: var(--pc-surface); color: var(--pc-ink); font: inherit; font-weight: 600;
  font-size: 14px; cursor: pointer; transition: background .15s, box-shadow .15s, transform .05s;
}
/* `.pc-btn` define display:inline-flex, que (regra de autor) venceria o `[hidden]` da
   folha do navegador. Esta regra garante que o atributo `hidden` realmente esconda o
   botão — ex.: "Próximo" some no último passo do Modo Aula; "Finalizar" some antes. */
.pc-btn[hidden] { display: none; }
.pc-btn:hover { text-decoration: none; box-shadow: var(--pc-shadow); }
.pc-btn:active { transform: translateY(1px); }
.pc-btn--primary { background: var(--pc-primary); border-color: var(--pc-primary); color: #fff; }
.pc-btn--primary:hover { background: var(--pc-primary-600); }
.pc-btn--ghost { background: transparent; }
.pc-btn--lg { padding: 13px 24px; font-size: 16px; }
.pc-btn:disabled, .pc-btn[disabled] { opacity: .5; cursor: not-allowed; }
.pc-btn:focus-visible, a:focus-visible, button:focus-visible {
  outline: 3px solid var(--pc-focus-ring); outline-offset: 2px;
}

/* ---- Topbar ---- */
.portal-topbar {
  height: var(--pc-topbar-h); background: var(--pc-surface);
  border-bottom: 1px solid var(--pc-border);
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 24px; position: sticky; top: 0; z-index: 50;
}
.portal-brand { display: flex; align-items: center; gap: 10px; font-weight: 700; color: var(--pc-ink); }
.portal-brand:hover { text-decoration: none; }
.portal-logo {
  width: 34px; height: 34px; border-radius: 50%;
  background: linear-gradient(135deg, var(--pc-primary), var(--pc-accent));
  color: #fff; display: inline-flex; align-items: center; justify-content: center;
  font-weight: 800; font-size: 16px;
}
/* Ações do topo: tema + menu do usuário. UI-QA-2 · Bloco 3. */
.portal-topbar__acoes { display: flex; align-items: center; gap: 6px; }

/* Controle de tema — discreto, mas com rótulo em texto. Um ícone sozinho
   (só a lua) obriga o aluno a adivinhar se ele mostra o estado atual ou a
   ação; o texto resolve a ambiguidade. Abaixo de 560px o rótulo some e fica
   só o ícone, com o `title` do botão preservando a leitura por acessibilidade. */
.portal-tema { margin: 0; display: flex; }
.portal-tema__btn {
  display: inline-flex; align-items: center; gap: 8px;
  background: transparent; border: 1px solid transparent; cursor: pointer;
  font: inherit; font-size: 14px; font-weight: 600; color: var(--pc-muted);
  padding: 7px 12px; border-radius: 999px;
  transition: background .15s, color .15s, border-color .15s;
}
.portal-tema__btn:hover { background: var(--pc-surface-2); color: var(--pc-ink); }
.portal-tema__ico { font-size: 15px; line-height: 1; }

.portal-usermenu { position: relative; }
.portal-usermenu__btn {
  display: flex; align-items: center; gap: 10px; background: transparent; border: 0;
  cursor: pointer; font: inherit; color: var(--pc-ink); padding: 6px 8px; border-radius: 999px;
}
.portal-usermenu__btn:hover { background: var(--pc-surface-2); }
.pc-avatar {
  width: 36px; height: 36px; border-radius: 50%; flex: none;
  background: var(--pc-primary-soft); color: var(--pc-primary-600);
  display: inline-flex; align-items: center; justify-content: center; font-weight: 700;
}
.portal-usermenu__name { font-size: 14px; font-weight: 600; }
.portal-usermenu__list {
  position: absolute; right: 0; top: calc(100% + 8px); min-width: 200px;
  background: var(--pc-surface); border: 1px solid var(--pc-border); border-radius: var(--pc-radius-sm);
  box-shadow: var(--pc-shadow-hover); padding: 6px; z-index: 60;
}
.portal-usermenu__list[hidden] { display: none; }
.portal-usermenu__list a {
  display: flex; align-items: center; gap: 8px; padding: 9px 12px; border-radius: 8px;
  color: var(--pc-ink); font-size: 14px;
}
.portal-usermenu__list a:hover { background: var(--pc-surface-2); text-decoration: none; }

/* ---- Conteúdo / container ---- */
.portal-content { max-width: 1080px; margin: 0 auto; padding: 28px 24px 64px; }
.pc-page-title { font-size: 24px; font-weight: 700; }
.pc-messages { list-style: none; margin: 0 0 16px; padding: 0; }
.pc-messages li { padding: 10px 14px; border-radius: var(--pc-radius-sm); margin-bottom: 8px; background: var(--pc-primary-soft); color: var(--pc-primary-600); }

/* ---- Faixa de boas-vindas / perfil ---- */
.welcome {
  display: flex; align-items: center; gap: 16px; background: var(--pc-surface);
  border: 1px solid var(--pc-border); border-radius: var(--pc-radius); padding: 18px 22px;
  box-shadow: var(--pc-shadow); margin-bottom: 26px; position: relative; overflow: hidden;
}
.welcome::before {
  content: ""; position: absolute; inset: 0 60% 0 0;
  background: linear-gradient(120deg, rgba(99,102,241,.10), transparent 70%); pointer-events: none;
}
.welcome .pc-avatar { width: 54px; height: 54px; font-size: 22px; }
.welcome__txt { flex: 1; position: relative; }
.welcome__hi { font-size: 19px; font-weight: 700; }
.welcome__close { position: absolute; top: 10px; right: 12px; border: 0; background: transparent; color: var(--pc-muted); font-size: 18px; cursor: pointer; }

/* ---- Abas ---- */
.pc-tabs { display: flex; gap: 6px; border-bottom: 1px solid var(--pc-border); margin: 0 0 20px; }
.pc-tab {
  border: 0; background: transparent; font: inherit; font-weight: 600; font-size: 14px;
  color: var(--pc-muted); padding: 10px 14px; cursor: pointer; border-bottom: 2px solid transparent;
}
.pc-tab.is-active { color: var(--pc-primary-600); border-bottom-color: var(--pc-primary); }
.pc-tabpane[hidden] { display: none; }

/* ---- Grade de cursos (cards) ---- */
.course-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 20px; }
.course-card {
  background: var(--pc-surface); border: 1px solid var(--pc-border); border-radius: var(--pc-radius);
  overflow: hidden; box-shadow: var(--pc-shadow); display: flex; flex-direction: column;
  transition: box-shadow .15s, transform .1s;
}
.course-card:hover { box-shadow: var(--pc-shadow-hover); transform: translateY(-2px); }
.course-card__cover {
  height: 120px; background: linear-gradient(135deg, var(--pc-primary), var(--pc-accent));
  display: flex; align-items: center; justify-content: center; color: #fff; font-size: 40px;
}
.course-card__cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.course-card__body { padding: 16px 18px 18px; display: flex; flex-direction: column; gap: 8px; flex: 1; }
.course-card__title { font-size: 16px; font-weight: 700; }
.course-card__foot { margin-top: auto; padding-top: 6px; }
/* Versão do conteúdo EAD (GIG-CURSOS-5): informativa e discreta — mesmo tamanho do
   rótulo de progresso, para não competir com título, progresso e ação principal. */
.course-card__versao { font-size: 12px; }

/* ---- Seções de "Meus cursos" (C1.1) ---- */
.pc-section { margin: 0 0 28px; }
.pc-section__title { font-size: 17px; font-weight: 700; margin: 0 0 14px; color: var(--pc-ink); }
.course-card__aviso { margin-top: 2px; font-size: 13px; }
/* Bloqueado: card "apagado", capa neutra, sem ação de estudo. */
.course-card--bloqueado { opacity: .85; }
.course-card--bloqueado:hover { transform: none; }
.course-card--bloqueado .course-card__cover {
  background: linear-gradient(135deg, #94a3b8, #cbd5e1); font-size: 34px;
}
/* Concluído: capa em tom de "conquista", sem CTA de continuar. */
.course-card--concluido .course-card__cover {
  background: linear-gradient(135deg, #16a34a, #4ade80);
}

/* ---- Barra de progresso ---- */
.pc-progress { height: 9px; background: var(--pc-neutral-soft); border-radius: 999px; overflow: hidden; }
.pc-progress__bar { height: 100%; background: var(--pc-green); border-radius: 999px; transition: width .3s ease; }
.pc-progress__label { font-size: 12px; color: var(--pc-muted); }

/* ---- Badges de estado ---- */
.pc-badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 11px; font-weight: 700; }
.pc-badge--ok { background: var(--pc-green-soft); color: var(--pc-green); }
.pc-badge--andamento { background: var(--pc-amber-soft); color: var(--pc-amber); }
.pc-badge--neutro { background: var(--pc-neutral-soft); color: var(--pc-muted); }

.pc-empty { text-align: center; color: var(--pc-muted); padding: 48px 16px; }

/* =========================================================================
   Central do curso (hub)
   ========================================================================= */
.course-hub__back { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; margin-bottom: 14px; }
.course-header {
  background: var(--pc-surface); border: 1px solid var(--pc-border); border-radius: var(--pc-radius);
  box-shadow: var(--pc-shadow); padding: 24px; margin-bottom: 24px; position: relative; overflow: hidden;
}
.course-header::after {
  content: ""; position: absolute; right: -40px; top: -40px; width: 200px; height: 200px; border-radius: 50%;
  background: radial-gradient(circle, rgba(99,102,241,.12), transparent 70%);
}
.course-header__title { font-size: 26px; font-weight: 800; }
.course-header__meta { color: var(--pc-muted); font-size: 14px; margin: 6px 0 14px; }
.course-header__progress { display: flex; align-items: center; gap: 12px; max-width: 520px; margin-bottom: 18px; }
.course-header__progress .pc-progress { flex: 1; }
.course-header__actions { display: flex; gap: 10px; flex-wrap: wrap; }

.course-section-title { font-size: 16px; font-weight: 700; margin: 0 0 12px; }
.module { background: var(--pc-surface); border: 1px solid var(--pc-border); border-radius: var(--pc-radius); box-shadow: var(--pc-shadow); margin-bottom: 14px; overflow: hidden; }
.module__head {
  width: 100%; display: flex; align-items: center; gap: 12px; padding: 16px 20px;
  background: transparent; border: 0; font: inherit; cursor: pointer; text-align: left;
}
.module__head:hover { background: var(--pc-surface-2); }
/* Este `<button>` não declara `color`, então herda o `buttontext` do navegador.
   Sob `color-scheme: dark` esse padrão vira BRANCO PURO: os títulos de módulo
   escapavam de `--pc-ink` e ficavam com exatamente o halo que o microbloco 3.1
   tirou da tinta principal — e são o texto mais repetido da central do curso.
   A correção fica só no escuro porque só no escuro o problema existe: no claro
   `buttontext` é preto, o tema já foi aprovado assim, e mudá-lo aqui seria
   mexer em tema aprovado para resolver um defeito que ele não tem. */
:root[data-tema="escuro"] .module__head { color: var(--pc-ink); }
.module__title { font-weight: 700; flex: 1; }
.module__pct { font-size: 12px; color: var(--pc-muted); white-space: nowrap; }
.module__chevron { transition: transform .2s; color: var(--pc-muted); }
.module.is-open .module__chevron { transform: rotate(180deg); }
.module__bar { height: 4px; background: var(--pc-neutral-soft); }
.module__bar > i { display: block; height: 100%; background: var(--pc-green); }
.module__parts { list-style: none; margin: 0; padding: 6px 0 10px; }
.module.is-collapsed .module__parts { display: none; }
.part {
  display: flex; align-items: center; gap: 12px; padding: 11px 20px; color: var(--pc-ink); border-left: 3px solid transparent;
}
.part:hover { background: var(--pc-surface-2); text-decoration: none; }
.part.is-atual { border-left-color: var(--pc-primary); background: var(--pc-primary-soft); }
.part__icon { width: 22px; text-align: center; }
.part__title { flex: 1; }
.part__state { font-size: 12px; color: var(--pc-muted); }
.part.is-concluida .part__state { color: var(--pc-green); font-weight: 700; }
.part--disabled { color: var(--pc-muted); cursor: default; opacity: .8; }
.part--disabled:hover { background: transparent; }
.part-row { display: flex; align-items: stretch; }
.part-row .part { flex: 1; }
.part__modo-aula {
  align-self: center; margin-right: 14px; padding: 7px 14px; white-space: nowrap;
  border-radius: 999px; background: var(--pc-primary-soft); color: var(--pc-primary-600);
  font-size: 13px; font-weight: 700;
}
.part__modo-aula:hover { background: var(--pc-primary); color: #fff; text-decoration: none; }

/* (E5B.3.1) O antigo Player escuro (iframe + foco-modo-aula via postMessage) foi
   removido: o consumo virou páginas nativas por aula (claras), e o Modo Aula é a
   página própria de foco. CSS do Player e do foco-no-iframe removidos como resíduo. */

/* =========================================================================
   Autenticação (login / trocar senha) e perfil
   ========================================================================= */
/* UI-QA-2 · Bloco 5.3 — a entrada do Portal passou a usar o mesmo padrão de
   identidade do login do painel e do Master: campo escuro com a marca real,
   cartão central, assinatura embaixo. O aluno continua encontrando a mesma
   linguagem acolhedora DENTRO do cartão; o que mudou é quem assina a porta.

   O fundo é `--gx-brand-ink` fixo, nos dois temas, porque
   `gigantes-horizontal.png` é um PNG OPACO com exatamente essa cor de fundo —
   é isso que faz a logo encaixar sem retângulo aparente. Foi também por isso
   que o gradiente radial saiu: ele clareava justamente o topo, onde a marca
   fica, e deixaria a emenda visível.

   O CARTÃO segue o tema (Bloco 3), como antes. */
.auth-wrap { min-height: 100vh; display: flex; flex-direction: column; gap: 20px;
  align-items: center; justify-content: center; padding: 24px;
  background: var(--gx-brand-ink); }
.auth-marca { display: block; height: 40px; width: auto; }
.auth-rodape { margin: 0; font-size: 12px; letter-spacing: .02em; color: rgba(255, 255, 255, .55); }
.auth-card { width: 100%; max-width: 400px; background: var(--pc-surface); border: 1px solid var(--pc-border);
  border-radius: var(--pc-radius); box-shadow: 0 10px 30px rgba(0, 0, 0, .35); padding: 30px; }
.auth-card h1 { font-size: 22px; }

@media (max-width: 480px) {
  .auth-marca { height: 32px; }
  .auth-card { padding: 24px; }
}
.pc-field { margin-bottom: 14px; }
.pc-field label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 6px; }
.pc-field input {
  width: 100%; padding: 11px 12px; border: 1px solid var(--pc-border); border-radius: var(--pc-radius-sm);
  font: inherit; background: var(--pc-surface-2);
}
/* `--pc-surface`, não `#fff`: o campo focado precisa clarear em relação ao
   `--pc-surface-2` do estado normal nos DOIS temas. Literal aqui deixaria o
   input branco no escuro. UI-QA-2 · Bloco 3. */
.pc-field input:focus { outline: none; border-color: var(--pc-primary); background: var(--pc-surface); }
.auth-card .pc-btn--primary { width: 100%; padding: 12px; margin-top: 4px; }
.pc-error { background: var(--pc-amber-soft); color: var(--pc-amber); padding: 10px 12px; border-radius: var(--pc-radius-sm); margin-bottom: 14px; font-size: 14px; }

.profile-card { max-width: 560px; background: var(--pc-surface); border: 1px solid var(--pc-border); border-radius: var(--pc-radius); box-shadow: var(--pc-shadow); padding: 24px; }
.profile-id { display: flex; align-items: center; gap: 16px; margin-bottom: 20px; }
.profile-id .pc-avatar { width: 64px; height: 64px; font-size: 26px; }
.profile-row { display: flex; justify-content: space-between; padding: 12px 0; border-top: 1px solid var(--pc-border); font-size: 14px; }
.profile-row span { color: var(--pc-muted); }

/* =========================================================================
   Modo Aula — PÁGINA PRÓPRIA (E5B.2): foco total, escuro imersivo, sem distrações
   ========================================================================= */
/* E5B.3A: Modo Aula LIMPO — sem cabeçalho/sidebar/HUD. Só barra de progresso fina no
   topo, palco em foco e rodapé com contador discreto + botões. */
body.modoaula {
  background: var(--pc-dark-bg); color: var(--pc-dark-ink);
  min-height: 100vh; display: flex; flex-direction: column;
}
.modoaula-progress { height: 6px; background: var(--pc-dark-surface-2); }
.modoaula-progress__bar { height: 100%; width: 0; background: var(--pc-primary); transition: width .25s ease; }

.modoaula-palco {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 16px;
  padding: 40px 24px; min-height: 0;
}
.modoaula-conteudo { flex: 1; max-width: 820px; text-align: center; }
/* O selo "Leitura" (2026-08-23). Diz ao aluno que aquele passo e para LER, e nao
   para executar — sem ele, passo sem imagem parece imagem que nao carregou.
   ⚠️ Nasce com a regra `[hidden]` DO LADO, e nao 280 linhas depois. */
.modoaula-selo {
  display: inline-block; margin: 0 auto 14px; padding: 3px 12px;
  border-radius: 999px; font-size: 13px; font-weight: 700; letter-spacing: .04em;
  text-transform: uppercase; color: var(--pc-dark-ink);
  background: var(--pc-dark-surface-2); border: 1px solid var(--pc-dark-border);
}
.modoaula-selo[hidden] { display: none; }
.modoaula-titulo { font-size: 30px; font-weight: 800; margin: 0 0 22px; }
.modoaula-img {
  max-width: 100%; max-height: 56vh; height: auto; border-radius: 14px;
  border: 1px solid var(--pc-dark-border); background: #fff; display: block; margin: 0 auto;
}
/* 🔴 A QUARTA regra `[hidden]` deste arquivo, e a que faltava.
   `display: block` acima e regra de AUTOR: ela vence o `[hidden] { display:none }`
   da folha do navegador. O JS do Modo Aula punha `hidden` e nao acontecia nada —
   o aluno via uma barra branca com icone de imagem quebrada, e dentro dela o
   `alt` do passo ANTERIOR.

   ⚠️ O comentario da linha 139 ja explicava essa armadilha, E CITAVA O MODO AULA
   PELO NOME. Quem escreveu esta classe estava 280 linhas abaixo, no mesmo
   arquivo, trabalhando na tela do exemplo. Proximidade nao ajudou, relevancia
   nao ajudou, ser o mesmo arquivo nao ajudou.

   🔒 Comentario ensina quem le. So guarda protege quem nao le. Tres regras
   iguais e um caso; quatro e classe — a guarda que varre isto entra em frente
   propria, depois da fila da VPS. Achado por ele numa tela de verdade. */
.modoaula-img[hidden] { display: none; }
.modoaula-instrucao { font-size: 20px; line-height: 1.55; color: var(--pc-dark-ink); margin: 22px auto 0; max-width: 720px; }
.modoaula-seta {
  flex: 0 0 auto; width: 72px; height: 72px; border-radius: 50%; border: 0;
  background: var(--pc-dark-surface-2); color: var(--pc-dark-ink); font-size: 40px; cursor: pointer;
  transition: background .15s;
}
.modoaula-seta:hover { background: var(--pc-primary); }
.modoaula-seta:disabled { opacity: .3; cursor: default; }
.modoaula-rodape {
  display: flex; gap: 12px; justify-content: space-between; align-items: center;
  padding: 18px 24px; background: var(--pc-dark-surface); border-top: 1px solid var(--pc-dark-border);
}
.modoaula-contador { font-size: 13px; font-weight: 700; color: var(--pc-dark-muted); white-space: nowrap; }
.modoaula-rodape__acoes { display: flex; gap: 12px; align-items: center; justify-content: center; flex: 1; }
.modoaula-rodape .pc-btn { background: var(--pc-dark-surface-2); border-color: var(--pc-dark-border); color: var(--pc-dark-ink); }
.modoaula-rodape .pc-btn--ghost { background: transparent; }
.modoaula-rodape .pc-btn--primary { background: var(--pc-primary); border-color: var(--pc-primary); color: #fff; }
.modoaula-rodape .pc-btn--ok { background: var(--pc-green); border-color: var(--pc-green); color: #fff; }

@media (max-width: 640px) {
  .modoaula-seta { width: 54px; height: 54px; font-size: 30px; }
  .modoaula-titulo { font-size: 23px; }
  .modoaula-instrucao { font-size: 17px; }
  .modoaula-rodape { flex-wrap: wrap; }
  .modoaula-contador { order: 3; width: 100%; text-align: center; }
}

/* =========================================================================
   Antessala da apresentação guiada — SLIDESHOW-1 / Bloco 4: o corpo da PÁGINA
   NORMAL da aula quando ela é uma apresentação. Roteiro + um botão grande, na
   casca de estudo (`.pratica-*`), como o resto do EAD.
   ========================================================================= */
/* Bloco 5, segunda versão. A capa é DESENHADA aqui, não é o `assets/capa.svg`:
   aquele arquivo é uma capa pronta com o texto dentro, então recortá-lo cortava
   palavra no meio e escrever por cima dele duplicava tudo. Cada informação
   aparece uma vez só, e o botão é o destino da tela. */
.antessala { display: flex; flex-direction: column; gap: 26px; }
.antessala__capa {
  padding: 40px 40px 34px;
  border: 1px solid var(--pc-border); border-radius: var(--pc-radius);
  box-shadow: var(--pc-shadow);
  background:
    radial-gradient(120% 140% at 100% 0%, rgba(79, 70, 229, .16) 0%, rgba(79, 70, 229, 0) 55%),
    linear-gradient(135deg, var(--pc-surface) 0%, var(--pc-surface) 100%);
}
.antessala__curso {
  font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em;
  color: var(--pc-primary-600); margin: 0 0 10px;
}
.antessala__titulo {
  font-size: 40px; line-height: 1.08; margin: 0 0 16px; color: var(--pc-ink);
  letter-spacing: -.015em; max-width: 18ch;
}
.antessala__descricao {
  font-size: 16px; line-height: 1.6; color: var(--pc-muted); margin: 0 0 20px; max-width: 56ch;
}
.antessala__meta { font-size: 13.5px; color: var(--pc-muted); margin: 0 0 26px; }
/* O botão é a única coisa que ele elogiou no desenho original, então ele cresce
   em vez de encolher: é o destino da tela inteira. */
.antessala__cta { font-size: 17px; padding: 14px 30px; }

.antessala__roteiro-titulo {
  font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
  color: var(--pc-muted); margin: 0 0 12px;
}
/* Em COLUNAS, não em pilha: catorze títulos empilhados dominavam a tela e
   empurravam o botão para baixo da dobra. `auto-fill` decide o número de colunas
   pela largura, então o celular cai em uma sozinho, sem media query. */
.antessala__roteiro {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
  gap: 8px 22px;
}
.antessala__roteiro li {
  display: flex; gap: 9px; align-items: baseline;
  font-size: 14.5px; line-height: 1.45; color: var(--pc-ink);
}
.antessala__n {
  flex: 0 0 auto; min-width: 21px; height: 21px; border-radius: 999px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--pc-bg, #f4f6fb); border: 1px solid var(--pc-border);
  font-size: 11.5px; font-weight: 700; color: var(--pc-muted);
}
/* Onde o aluno parou, marcado no roteiro: o botão diz "Continuar do slide 3", e
   a linha 3 fica em destaque. Uma informação, dois lugares que concordam. */
.antessala__roteiro li.is-atual { font-weight: 700; color: var(--pc-primary-600); }
.antessala__roteiro li.is-atual .antessala__n {
  background: var(--pc-primary-600); border-color: var(--pc-primary-600); color: #fff;
}

@media (max-width: 720px) {
  /* No celular o que importa é o botão caber na primeira tela junto com o
     título: o resto encolhe para isso acontecer. */
  .antessala__capa { padding: 26px 22px 24px; }
  .antessala__titulo { font-size: 28px; max-width: none; }
  .antessala__descricao { font-size: 15px; margin-bottom: 16px; }
  .antessala__meta { margin-bottom: 20px; }
  .antessala__cta { width: 100%; justify-content: center; }
}

/* =========================================================================
   Apresentação guiada — SLIDESHOW-1 / Bloco 3: moldura limpa da plataforma com
   o slideshow do PACOTE ocupando todo o resto da tela.
   ========================================================================= */
/* `body` em coluna e a seção com `flex: 1` — e não `height: 100vh` na seção — é o
   que faz a MESMA tela servir as duas cascas: no Portal a seção é o único filho e
   ocupa a altura inteira; no preview do Master a faixa "nada é gravado" fica acima
   e a seção ocupa o que sobra, sem rolagem e sem cobrir a faixa. */
body.apresentacao { min-height: 100vh; display: flex; flex-direction: column; }
.apres { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.apres-barra {
  display: flex; align-items: center; gap: 12px; flex: none;
  padding: 10px 16px; background: var(--pc-surface);
  border-bottom: 1px solid var(--pc-border);
}
.apres-barra__titulo {
  flex: 1; min-width: 0; text-align: center; font-weight: 700; font-size: 15px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.apres-barra__acoes { display: flex; gap: 10px; align-items: center; flex: none; }
.apres-barra__sair { flex: none; }
.apres-palco { flex: 1; min-height: 0; display: flex; }
/* `--gx-white` nos dois temas, pela mesma razão de `.aula-frame`: é conteúdo do
   PACOTE, com fundo próprio. Escurecer a moldura criaria uma borda escura em volta
   do slide do autor. UI-QA-2 · Bloco 3. */
.apres-frame { flex: 1; width: 100%; border: 0; background: var(--gx-white); display: block; }

@media (max-width: 640px) {
  .apres-barra { flex-wrap: wrap; padding: 8px 10px; gap: 8px; }
  .apres-barra__titulo { order: 3; width: 100%; text-align: left; font-size: 14px; }
  .apres-barra__acoes { margin-left: auto; }
}

/* =========================================================================
   Prática NORMAL — página de estudo (E5B.3C): claro/profissional, sidebar +
   passos numerados em cards. Inspirado (não copiado) no exemplo "Word 2019".
   ========================================================================= */
.pratica-shell { display: flex; align-items: flex-start; max-width: 1180px; margin: 0 auto; gap: 0; }

.pratica-sidebar {
  width: 290px; flex: none; align-self: stretch; position: sticky; top: var(--pc-topbar-h);
  max-height: calc(100vh - var(--pc-topbar-h)); overflow: auto;
  background: var(--pc-surface); border-right: 1px solid var(--pc-border); padding: 20px 14px;
}
.pratica-sidebar__course { font-size: 12px; text-transform: uppercase; letter-spacing: .05em; color: var(--pc-muted); font-weight: 700; margin: 0 6px 16px; }
.pratica-sidebar__module { margin-bottom: 16px; }
.pratica-sidebar__module-title { font-size: 12px; font-weight: 700; color: var(--pc-ink); margin: 0 0 6px; padding: 0 6px; }
.pratica-sidebar ul { list-style: none; margin: 0; padding: 0; }
.pratica-nav-item__link { display: flex; align-items: center; gap: 10px; padding: 9px 10px; border-radius: 8px; color: var(--pc-ink); font-size: 14px; }
a.pratica-nav-item__link:hover { background: var(--pc-surface-2); text-decoration: none; }
.pratica-nav-item.is-atual > .pratica-nav-item__link { background: var(--pc-primary-soft); font-weight: 700; box-shadow: inset 3px 0 0 var(--pc-primary); }
.pratica-nav-item__icon { width: 18px; text-align: center; color: var(--pc-muted); flex: none; }
.pratica-nav-item.is-concluida .pratica-nav-item__icon { color: var(--pc-green); }
.pratica-nav-item__txt { flex: 1; min-width: 0; }
.pratica-nav-item.is-em-breve .pratica-nav-item__link { color: var(--pc-muted); cursor: default; }
.pratica-nav-item__tag { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; color: var(--pc-muted); background: var(--pc-neutral-soft); padding: 2px 7px; border-radius: 999px; }

.pratica-main { flex: 1; min-width: 0; padding: 24px 28px 64px; }
.pratica-back { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; margin-bottom: 14px; }
.pratica-head {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  background: var(--pc-surface); border: 1px solid var(--pc-border); border-radius: var(--pc-radius);
  box-shadow: var(--pc-shadow); padding: 22px 24px; margin-bottom: 24px;
}
.pratica-head__kicker { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--pc-primary-600); margin: 0 0 6px; }
.pratica-head__title { font-size: 24px; font-weight: 800; margin: 0 0 8px; }
.pratica-head__meta { color: var(--pc-muted); font-size: 14px; margin: 0; max-width: 560px; }
.pratica-modo-aula { align-self: center; white-space: nowrap; }

.pratica-passos { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 16px; }
.pratica-passo {
  display: flex; gap: 18px; background: var(--pc-surface); border: 1px solid var(--pc-border);
  border-radius: var(--pc-radius); box-shadow: var(--pc-shadow); padding: 20px 22px;
}
.pratica-passo.is-concluido { border-color: var(--pc-green); }
.pratica-passo__num {
  flex: none; width: 38px; height: 38px; border-radius: 50%;
  background: var(--pc-primary); color: #fff; font-weight: 800; font-size: 17px;
  display: inline-flex; align-items: center; justify-content: center;
}
.pratica-passo.is-concluido .pratica-passo__num { background: var(--pc-green); }
.pratica-passo__body { flex: 1; min-width: 0; }
.pratica-passo__titulo { font-size: 18px; font-weight: 700; margin: 2px 0 8px; }
.pratica-passo__check { color: var(--pc-green); }
.pratica-passo__instrucao { font-size: 15.5px; line-height: 1.6; color: var(--pc-ink); margin: 0 0 14px; }
/* `--gx-white` de propósito, nos dois temas: é a moldura de uma IMAGEM do
   conteúdo do curso (captura de tela de software, quase sempre com fundo
   claro). Escurecer criaria uma borda escura ao redor da própria imagem.
   Mesma decisão de `.aula-frame` e `.modoaula-img`. UI-QA-2 · Bloco 3. */
.pratica-passo__img {
  max-width: 100%; height: auto; border-radius: var(--pc-radius-sm);
  border: 1px solid var(--pc-border); background: var(--gx-white); display: block;
}
.pratica-foot { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 28px; }

/* Aula nativa (vídeo/conteúdo) — E5B.3.1: reaproveita a casca de estudo (.pratica-*). */
.aula-video { position: relative; width: 100%; aspect-ratio: 16 / 9; background: #000;
  border-radius: var(--pc-radius); overflow: hidden; border: 1px solid var(--pc-border); box-shadow: var(--pc-shadow); }
.aula-video iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.aula-placeholder { display: flex; align-items: center; justify-content: center; min-height: 260px;
  background: var(--pc-surface); border: 1px dashed var(--pc-border); border-radius: var(--pc-radius);
  color: var(--pc-muted); font-size: 16px; text-align: center; padding: 24px; }
.aula-frame-wrap { background: var(--pc-surface); border: 1px solid var(--pc-border);
  border-radius: var(--pc-radius); box-shadow: var(--pc-shadow); overflow: hidden; }
/* Idem: o iframe serve o pacote EAD, que tem CSS próprio e é claro. O fundo
   branco é do CONTEÚDO de terceiros, não da nossa superfície — a plataforma
   não tematiza o pacote. */
.aula-frame { width: 100%; height: 70vh; min-height: 420px; border: 0; display: block; background: var(--gx-white); }

/* Teste rápido (GIG-CURSOS-2B) — reaproveita a casca de estudo (.pratica-*). O estado
   "revisar" usa o âmbar de alerta, não vermelho de erro: é sinal pedagógico, não punição. */
.teste-resultado { border-radius: var(--pc-radius); border: 1px solid var(--pc-border);
  padding: 18px 22px; margin: 0 0 24px; background: var(--pc-surface); box-shadow: var(--pc-shadow); }
.teste-resultado.is-ok { background: var(--pc-green-soft); border-color: var(--pc-green); }
.teste-resultado.is-revisar { background: var(--pc-amber-soft); border-color: var(--pc-amber); }
.teste-resultado__tentativa { font-size: 12px; font-weight: 700; text-transform: uppercase;
  letter-spacing: .04em; color: var(--pc-muted); margin: 0 0 6px; }
.teste-resultado__placar { font-size: 20px; font-weight: 800; margin: 0 0 4px; }
.teste-resultado__melhor { font-weight: 700; margin: 0 0 4px; }
.teste-contador { margin: 0 0 16px; font-size: 14px; color: var(--pc-muted); }
.teste-encerrado { margin: 0; align-self: center; font-size: 14px; font-weight: 600;
  color: var(--pc-muted); }
.teste-resultado__estado { font-weight: 700; margin: 0 0 6px; }
.teste-resultado.is-ok .teste-resultado__estado { color: var(--pc-green); }
.teste-resultado.is-revisar .teste-resultado__estado { color: var(--pc-amber); }
.teste-resultado__nota { color: var(--pc-muted); font-size: 13px; margin: 0; }

.teste-perguntas { list-style: none; margin: 0; padding: 0; display: grid; gap: 16px; }
.teste-pergunta { display: flex; gap: 16px; background: var(--pc-surface);
  border: 1px solid var(--pc-border); border-radius: var(--pc-radius); padding: 18px 20px;
  box-shadow: var(--pc-shadow); }
.teste-pergunta.is-ok { border-left: 4px solid var(--pc-green); }
.teste-pergunta.is-erro { border-left: 4px solid var(--pc-amber); }
.teste-pergunta__num { flex: none; width: 34px; height: 34px; border-radius: 50%;
  background: var(--pc-primary-soft); color: var(--pc-primary-600);
  display: inline-flex; align-items: center; justify-content: center; font-weight: 800; }
.teste-pergunta__body { flex: 1; min-width: 0; border: 0; margin: 0; padding: 0; }
.teste-pergunta__enunciado { font-size: 16px; font-weight: 700; margin: 0 0 12px; padding: 0; }
.teste-pergunta__feedback { margin: 12px 0 0; font-size: 14px; color: var(--pc-muted); }
.teste-pergunta__branco { margin: 10px 0 0; font-size: 13px; font-weight: 600; color: var(--pc-amber); }

.teste-alternativas { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.teste-alternativa { border: 1px solid var(--pc-border); border-radius: var(--pc-radius-sm);
  background: var(--pc-surface-2); }
.teste-alternativa__label { display: flex; align-items: center; gap: 10px; padding: 11px 14px;
  cursor: pointer; }
/* No resultado a alternativa é estática (não há input para o label envolver). */
.teste-alternativa--estatica { display: flex; align-items: center; gap: 10px; padding: 11px 14px; }
.teste-alternativa__label:hover { border-color: var(--pc-primary); }
.teste-alternativa__letra { flex: none; width: 26px; height: 26px; border-radius: 50%;
  background: var(--pc-surface); border: 1px solid var(--pc-border); font-size: 12px;
  font-weight: 800; display: inline-flex; align-items: center; justify-content: center; }
.teste-alternativa__texto { flex: 1; min-width: 0; }
.teste-alternativa__marca { flex: none; font-size: 12px; font-weight: 700; }
.teste-alternativa.is-correta { background: var(--pc-green-soft); border-color: var(--pc-green); }
.teste-alternativa.is-correta .teste-alternativa__marca { color: var(--pc-green); }
.teste-alternativa.is-marcada-errada { background: var(--pc-amber-soft); border-color: var(--pc-amber); }
.teste-alternativa.is-marcada-errada .teste-alternativa__marca { color: var(--pc-amber); }

@media (max-width: 860px) {
  .pratica-shell { flex-direction: column; }
  .pratica-sidebar { width: auto; position: static; max-height: none; border-right: 0; border-bottom: 1px solid var(--pc-border); }
  .pratica-main { padding: 20px 16px 48px; }
}

/* =========================================================================
   Responsivo
   ========================================================================= */
@media (max-width: 560px) {
  .portal-content { padding: 18px 14px 48px; }
  .course-grid { grid-template-columns: 1fr; }
  .portal-usermenu__name { display: none; }
  .course-header__title { font-size: 22px; }
  /* Sobra pouco espaço na topbar: o botão de tema vira só o ícone. O `title`
     continua descrevendo a ação. UI-QA-2 · Bloco 3. */
  .portal-tema__txt { display: none; }
  .portal-tema__btn { padding: 7px 9px; }
}

/* ── A tela da liberação ("Correção de exercícios práticos") ─────────────────
   Ritmo pedagógico: a tela é um marco de conquista, não um muro. O selo e o
   espaçamento existem para o momento parecer CERIMÔNIA de correção — o aluno
   chama o professor, e os dois olham juntos. Usa só tokens do tema: acompanha
   claro/escuro como o resto do portal. */
.liberacao { display: flex; justify-content: center; padding: 48px 16px; }
.liberacao__card {
  width: 100%; max-width: 460px; background: var(--pc-surface);
  border: 1px solid var(--pc-border); border-radius: var(--pc-radius);
  box-shadow: var(--pc-shadow); padding: 34px; text-align: left;
}
.liberacao__selo {
  width: 52px; height: 52px; border-radius: 50%;
  background: var(--pc-primary); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 26px; margin-bottom: 18px;
}
.liberacao__card h1 { font-size: 22px; margin: 0 0 14px; }
.liberacao__conquista { margin: 0 0 6px; }
.liberacao__chamada { margin: 0 0 20px; }
.liberacao__vazio { color: var(--pc-muted); }
.liberacao__form select {
  width: 100%; padding: 10px 12px; font-size: 15px;
  background: var(--pc-bg); color: var(--pc-text);
  border: 1px solid var(--pc-border); border-radius: var(--pc-radius-sm);
}
.liberacao__form select:focus { outline: none; border-color: var(--pc-primary); }
.liberacao__avaliacao { margin: 6px 0 18px; }
.liberacao__avaliacao summary {
  cursor: pointer; color: var(--pc-muted); font-size: 14px; margin-bottom: 10px;
}
.liberacao__opcional { font-weight: 400; }
.liberacao__form .pc-btn--primary { width: 100%; }
