/* ============================================================
   eGola — sistema visual (docs/design, "01 Sistema")

   Princípios:
   1. Retilíneo e plano — raio 0, sem sombras. A profundidade vem de
      bordas e contraste de superfície; sobreposições usam borda preta.
   2. Números primeiro — notas, contagens e datas em Geist Mono com
      algarismos tabulares, alinhados à direita.
   3. Laranja com parcimónia — marca "onde estou" e "o que fazer a seguir".
   4. Editar ≠ consultar — campos editáveis têm borda e fundo branco;
      dados só de leitura ficam sobre cinzento, sem borda.
   ============================================================ */

@font-face {
  font-family: 'Geist';
  src: url('/fonts/Geist-Variable.woff2') format('woff2');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: 'Geist Mono';
  src: url('/fonts/GeistMono-Variable.woff2') format('woff2');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

/* ============================================================
   Tokens
   ============================================================ */
:root {
  --ink: #0a0a0a;
  --ink-rgb: 10, 10, 10;
  --ink-2: #404040;
  --ink-3: #525252;
  --muted: #737373;
  --faint: #a3a3a3;
  --line-strong: #d4d4d4;
  --line: #e5e5e5;
  --line-soft: #f0f0f0;
  --surface: #fafafa;
  --surface-2: #f5f5f5;
  --paper: #ffffff;

  --accent: #c2410c;          /* texto laranja, links · 5,2:1 */
  --accent-fill: #ea580c;     /* marcas, réguas, quadrado */
  --accent-dark: #9a3412;
  --accent-tint: #fff7ed;
  --accent-soft: #fdba74;

  --ok: #15803d;
  --ok-bg: #f0fdf4;
  --ok-line: #bbf7d0;
  --ok-line-strong: #86efac;
  --danger: #dc2626;
  --danger-text: #b91c1c;
  --danger-bg: #fef2f2;
  --danger-line: #fecaca;
  --danger-line-strong: #fca5a5;
  --warn: #b45309;
  --warn-text: #92400e;
  --warn-bg: #fffbeb;
  --warn-line: #fde68a;
  --info: #1d4ed8;
  --info-bg: #eff6ff;
  --info-line: #bfdbfe;

  --veil: rgba(10, 10, 10, .45);

  --font-sans: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  --font-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  --header-h: 56px;
  --sidebar-width: 232px;
  --chat-panel-width: 360px;
  --bottom-nav-h: 64px;

  /* Nomes antigos ainda referidos em estilos inline das vistas. */
  --color-border: var(--line);
  --color-text: var(--ink);
  --color-text-muted: var(--muted);
  --color-bg: var(--paper);
  --color-bg-subtle: var(--surface);

  /* Bootstrap */
  --bs-body-bg: var(--surface);
  --bs-body-color: var(--ink);
  --bs-body-font-family: var(--font-sans);
  --bs-body-font-size: .875rem;
  --bs-body-line-height: 1.5;
  --bs-font-monospace: var(--font-mono);
  --bs-border-color: var(--line);
  --bs-border-radius: 0;
  --bs-border-radius-sm: 0;
  --bs-border-radius-lg: 0;
  --bs-border-radius-xl: 0;
  --bs-border-radius-pill: 0;
  --bs-box-shadow: none;
  --bs-box-shadow-sm: none;
  --bs-secondary-color: var(--muted);
  --bs-tertiary-bg: var(--surface-2);

  --bs-primary: var(--ink);
  --bs-primary-rgb: 10, 10, 10;
  --bs-secondary: var(--muted);
  --bs-secondary-rgb: 115, 115, 115;
  --bs-success: var(--ok);
  --bs-success-rgb: 21, 128, 61;
  --bs-danger: var(--danger);
  --bs-danger-rgb: 220, 38, 38;
  --bs-warning: var(--warn);
  --bs-warning-rgb: 180, 83, 9;
  --bs-info: var(--info);
  --bs-info-rgb: 29, 78, 216;

  --bs-link-color: var(--ink);
  --bs-link-color-rgb: 10, 10, 10;
  --bs-link-hover-color: var(--accent-dark);
  --bs-link-hover-color-rgb: 154, 52, 18;
  --bs-focus-ring-color: rgba(10, 10, 10, .9);
}

/* ============================================================
   Base
   ============================================================ */
html { font-size: 16px; -webkit-text-size-adjust: 100%; }
html, body { height: 100%; }
body {
  background: var(--surface);
  color: var(--ink);
  font-family: var(--font-sans);
  -webkit-font-smoothing: antialiased;
  font-feature-settings: "ss01";
}

a { color: var(--ink); text-underline-offset: 3px; }
a:hover { color: var(--accent-dark); }
p a, .alert a, .form-text a, .vazio a:not(.btn), .texto a { text-decoration: underline; }

h1, .h1 { font-size: 1.75rem; font-weight: 600; letter-spacing: -0.02em; line-height: 1.15; margin-bottom: .75rem; }
h2, .h2 { font-size: 1.25rem; font-weight: 600; letter-spacing: -0.01em; line-height: 1.2; }
h3, .h3 { font-size: 1.0625rem; font-weight: 600; line-height: 1.25; }
h4, .h4 { font-size: 1rem; font-weight: 600; line-height: 1.3; }
h5, .h5 { font-size: .9375rem; font-weight: 600; line-height: 1.3; }
h6, .h6 { font-size: .8125rem; font-weight: 600; }
@media (max-width: 767.98px) { h1, .h1 { font-size: 1.5rem; } }

small, .small { font-size: .8125rem; }
.text-muted, .text-body-secondary { color: var(--muted) !important; }
.text-danger { color: var(--danger-text) !important; }
.text-success { color: var(--ok) !important; }
.text-warning, .text-warning-emphasis { color: var(--warn-text) !important; }
.text-primary { color: var(--info) !important; }
.text-laranja { color: var(--accent) !important; }
.fw-medium { font-weight: 500 !important; }

/* Números: Geist Mono, algarismos tabulares. */
.mono, .num, code, kbd {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
}
.num { text-align: right; white-space: nowrap; }
code { color: inherit; font-size: .9em; }
kbd { background: var(--ink); border-radius: 0; font-size: .75rem; padding: .1rem .35rem; }

/* Nota abaixo da aprovação: cor + sublinhado, nunca só cor. */
.negativa { color: var(--danger) !important; text-decoration: underline; text-underline-offset: 3px; }
.por-lancar { color: var(--faint); }

/* Rótulo técnico em maiúsculas: "ANO LETIVO · TRIMESTRE". */
.rotulo {
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--muted);
}
.rotulo-laranja { color: var(--accent); }

/* O quadrado laranja é o sinal da marca. */
.marca { display: inline-block; width: 8px; height: 8px; background: var(--accent-fill); flex: none; }
.marca-lg { width: 40px; height: 40px; }
.marca-md { width: 32px; height: 32px; }

.secao-titulo {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 1.75rem 0 .75rem;
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--ink);
}
.secao-titulo::before { content: ""; width: 8px; height: 8px; background: var(--accent-fill); flex: none; }
.secao-titulo > .secao-acao { margin-left: auto; font-family: var(--font-sans); font-size: .8125rem; font-weight: 400; letter-spacing: 0; text-transform: none; }

/* Foco: anel 2 px preto com 2 px de afastamento. */
:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.btn:focus-visible, .form-control:focus-visible, .form-select:focus-visible { box-shadow: 0 0 0 2px #fff; }

.skip-link { position: fixed; top: -5rem; left: 1rem; z-index: 2000; background: #fff; color: var(--ink); padding: .75rem 1rem; border: 2px solid var(--ink); font-weight: 500; }
.skip-link:focus { top: .5rem; }

hr { border-color: var(--line); opacity: 1; }

/* ============================================================
   Botões — 40 px, 32 px pequeno, 48 px de toque
   ============================================================ */
.btn {
  --bs-btn-padding-y: 0;
  --bs-btn-padding-x: 1rem;
  --bs-btn-font-size: .875rem;
  --bs-btn-font-weight: 500;
  --bs-btn-border-radius: 0;
  --bs-btn-box-shadow: none;
  --bs-btn-focus-box-shadow: none;
  --bs-btn-disabled-opacity: 1;
  min-height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .5rem;
  white-space: nowrap;
  line-height: 1.2;
}
.btn-sm { --bs-btn-padding-x: .625rem; --bs-btn-font-size: .8125rem; min-height: 32px; }
.btn-lg { --bs-btn-padding-x: 1.25rem; --bs-btn-font-size: .9375rem; min-height: 48px; }
.btn:disabled, .btn.disabled { background: var(--surface-2) !important; border-color: var(--surface-2) !important; color: var(--faint) !important; }

.btn-primary, .btn-dark {
  --bs-btn-color: #fff; --bs-btn-bg: var(--ink); --bs-btn-border-color: var(--ink);
  --bs-btn-hover-color: #fff; --bs-btn-hover-bg: #262626; --bs-btn-hover-border-color: #262626;
  --bs-btn-active-color: #fff; --bs-btn-active-bg: #000; --bs-btn-active-border-color: #000;
}
/* Ação "a seguir" em destaque: + Nova Avaliação. */
.btn-accent {
  --bs-btn-color: #fff; --bs-btn-bg: var(--accent); --bs-btn-border-color: var(--accent);
  --bs-btn-hover-color: #fff; --bs-btn-hover-bg: var(--accent-dark); --bs-btn-hover-border-color: var(--accent-dark);
  --bs-btn-active-color: #fff; --bs-btn-active-bg: var(--accent-dark); --bs-btn-active-border-color: var(--accent-dark);
}
.btn-secondary, .btn-outline-secondary, .btn-light, .btn-outline-dark, .btn-outline-primary {
  --bs-btn-color: var(--ink); --bs-btn-bg: #fff; --bs-btn-border-color: var(--line-strong);
  --bs-btn-hover-color: var(--ink); --bs-btn-hover-bg: var(--surface); --bs-btn-hover-border-color: var(--ink);
  --bs-btn-active-color: var(--ink); --bs-btn-active-bg: var(--surface-2); --bs-btn-active-border-color: var(--ink);
}
.btn-outline-primary { --bs-btn-border-color: var(--ink); }
.btn-danger {
  --bs-btn-color: #fff; --bs-btn-bg: var(--danger); --bs-btn-border-color: var(--danger);
  --bs-btn-hover-color: #fff; --bs-btn-hover-bg: var(--danger-text); --bs-btn-hover-border-color: var(--danger-text);
  --bs-btn-active-color: #fff; --bs-btn-active-bg: #991b1b; --bs-btn-active-border-color: #991b1b;
}
.btn-outline-danger {
  --bs-btn-color: var(--danger-text); --bs-btn-bg: #fff; --bs-btn-border-color: var(--danger);
  --bs-btn-hover-color: #fff; --bs-btn-hover-bg: var(--danger); --bs-btn-hover-border-color: var(--danger);
  --bs-btn-active-color: #fff; --bs-btn-active-bg: var(--danger-text); --bs-btn-active-border-color: var(--danger-text);
}
.btn-success {
  --bs-btn-color: #fff; --bs-btn-bg: var(--ok); --bs-btn-border-color: var(--ok);
  --bs-btn-hover-color: #fff; --bs-btn-hover-bg: #166534; --bs-btn-hover-border-color: #166534;
  --bs-btn-active-color: #fff; --bs-btn-active-bg: #14532d; --bs-btn-active-border-color: #14532d;
}
.btn-outline-success {
  --bs-btn-color: var(--ok); --bs-btn-bg: #fff; --bs-btn-border-color: var(--ok);
  --bs-btn-hover-color: #fff; --bs-btn-hover-bg: var(--ok); --bs-btn-hover-border-color: var(--ok);
}
.btn-warning, .btn-outline-warning {
  --bs-btn-color: var(--warn-text); --bs-btn-bg: #fff; --bs-btn-border-color: var(--warn);
  --bs-btn-hover-color: #fff; --bs-btn-hover-bg: var(--warn-text); --bs-btn-hover-border-color: var(--warn-text);
  --bs-btn-active-color: #fff; --bs-btn-active-bg: var(--warn-text); --bs-btn-active-border-color: var(--warn-text);
}
.btn-link {
  --bs-btn-color: var(--ink); --bs-btn-hover-color: var(--accent-dark); --bs-btn-active-color: var(--ink);
  --bs-btn-padding-x: .75rem;
  text-decoration: underline;
}
.btn-close { border-radius: 0; opacity: .7; }

/* Carregamento: <button data-loading-text="A guardar…"> recebe aria-busy. */
.btn[aria-busy="true"]::before {
  content: ""; width: 12px; height: 12px; border: 2px solid currentColor; border-right-color: transparent;
  border-radius: 50%; animation: girar .7s linear infinite; flex: none;
}
@keyframes girar { to { transform: rotate(360deg); } }

.btn-icone { min-width: 44px; min-height: 44px; display: inline-flex; align-items: center; justify-content: center; background: transparent; border: 0; color: inherit; font-size: 1.25rem; padding: 0; }

/* ============================================================
   Formulários
   ============================================================ */
.form-standard { max-width: 720px; }
form.form-standard { background: #fff; border: 1px solid var(--line); padding: 24px; }
form.form-standard > .btn { margin-top: .5rem; }
form.form-standard > .btn + .btn, form.form-standard > .btn + a.btn { margin-left: .25rem; }
form.form-standard h5, form.form-standard .secao-form { font-family: var(--font-mono); font-size: .6875rem; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; margin: 1.5rem 0 .75rem; padding-top: 1.25rem; border-top: 1px solid var(--line); }
@media (max-width: 575.98px) { form.form-standard { padding: 16px; } }
.form-label { font-size: .8125rem; font-weight: 500; margin-bottom: 6px; display: flex; justify-content: space-between; gap: .5rem; }
.form-text { font-size: .75rem; color: var(--muted); margin-top: 5px; }
.form-control, .form-select {
  min-height: 40px;
  border: 1px solid var(--line-strong);
  border-radius: 0;
  background-color: #fff;
  color: var(--ink);
  font-size: .875rem;
  padding: .45rem .75rem;
  box-shadow: none;
}
textarea.form-control { min-height: 88px; line-height: 1.5; }
.form-control-sm, .form-select-sm { min-height: 32px; font-size: .8125rem; padding: .25rem .625rem; }
.form-control:focus, .form-select:focus {
  border-color: var(--ink);
  outline: 2px solid var(--ink);
  outline-offset: -1px;
  box-shadow: none;
}
.form-control::placeholder { color: var(--faint); }
.form-control.input-validation-error, .form-select.input-validation-error, .form-control.is-invalid { border-color: var(--danger); }
.field-validation-error, .invalid-feedback { display: block; font-size: .75rem; color: var(--danger-text) !important; margin-top: 5px; }
.field-validation-error:not(:empty)::before, .invalid-feedback::before { content: "× "; font-family: var(--font-mono); }
.validation-summary-errors ul { margin: 0; padding-left: 1.1rem; }
.validation-summary-errors {
  padding: 12px 14px; background: var(--danger-bg); border: 1px solid var(--danger-line); color: var(--ink) !important;
  font-size: .8125rem; margin-bottom: 1rem;
}
.validation-summary-valid { display: none; }

/* Só consulta: fundo cinzento, sem borda. */
.form-control[readonly], .form-control:disabled, .form-select:disabled, .campo-consulta {
  background: var(--surface-2);
  border-color: var(--surface-2);
  color: var(--ink-2);
}
.etiqueta-consulta { font-family: var(--font-mono); font-size: .625rem; font-weight: 500; letter-spacing: .06em; color: var(--muted); text-transform: uppercase; }

.form-check-input { width: 1.125rem; height: 1.125rem; border: 1px solid var(--faint); border-radius: 0 !important; margin-top: .15rem; }
.form-check-input:checked { background-color: var(--ink); border-color: var(--ink); }
.form-check-input:focus { box-shadow: none; outline: 2px solid var(--ink); outline-offset: 2px; border-color: var(--ink); }
.form-switch { padding-left: 2.875rem; }
.form-switch .form-check-input { margin-left: -2.875rem; }
.form-switch .form-check-input { width: 2.25rem; border-radius: 0 !important; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3crect x='-3' y='-3' width='6' height='6' fill='%23a3a3a3'/%3e%3c/svg%3e"); }
.form-switch .form-check-input:checked { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3crect x='-3' y='-3' width='6' height='6' fill='%23fff'/%3e%3c/svg%3e"); }
.form-check-label { font-size: .875rem; }

.input-group > .btn { min-height: 40px; border-color: var(--line-strong); }
.input-group-text { border-radius: 0; background: var(--surface-2); border-color: var(--line-strong); font-family: var(--font-mono); font-size: .8125rem; color: var(--ink-3); }

.form-control[type="file"]::file-selector-button {
  border: 0; border-right: 1px solid var(--line-strong); background: var(--surface-2); color: var(--ink);
  font-weight: 500; margin: -.45rem .75rem -.45rem -.75rem; padding: .6rem .75rem;
}

/* Campo numérico de nota: mono, alinhado à direita. */
.campo-nota {
  width: 88px; min-height: 40px; text-align: right; font-family: var(--font-mono); font-size: .9375rem; font-weight: 500;
  font-variant-numeric: tabular-nums;
}
.campo-nota.alterada { border-color: var(--accent-fill); background: var(--accent-tint); }
.campo-nota.vazia { border-style: dashed; border-color: var(--warn); background: var(--warn-bg); }
.campo-nota.negativa-valor { color: var(--danger); }
.campo-nota.fora-escala { border: 2px solid var(--danger); }
.campo-numero { font-family: var(--font-mono); text-align: right; font-variant-numeric: tabular-nums; }

/* Lista de requisitos da palavra-passe. */
.requisitos { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 12px; font-size: .75rem; margin-top: 8px; list-style: none; padding: 0; }
.requisitos li { color: var(--muted); }
.requisitos li::before { content: "○ "; font-family: var(--font-mono); }
.requisitos li.cumprido { color: var(--ok); }
.requisitos li.cumprido::before { content: "✓ "; }

@media (max-width: 767.98px) {
  /* 16 px evita o zoom automático do iOS ao focar. */
  .form-control, .form-select { font-size: 1rem; min-height: 44px; }
  .btn { min-height: 44px; }
  .btn-sm { min-height: 36px; }
}

/* Controlo segmentado: filtros, trimestres, vistas. */
.segmentos {
  display: inline-flex;
  flex-wrap: wrap;
  border: 1px solid var(--line-strong);
  background: #fff;
  font-size: .8125rem;
  max-width: 100%;
}
.segmentos > a, .segmentos > label, .segmentos > button, .segmentos > span {
  display: inline-flex; align-items: center; gap: .35rem;
  min-height: 38px; padding: 0 14px;
  color: var(--ink); text-decoration: none; background: #fff; border: 0; border-left: 1px solid var(--line);
  cursor: pointer; white-space: nowrap;
}
.segmentos > :first-child { border-left: 0; }
.segmentos > a:hover, .segmentos > label:hover { background: var(--surface); color: var(--ink); }
.segmentos > .ativo, .segmentos > [aria-current="page"], .segmentos > input:checked + label, .segmentos > [aria-pressed="true"] { background: var(--ink); color: #fff; }
.segmentos > .fechado { color: var(--muted); }
.segmentos > input { position: absolute; opacity: 0; pointer-events: none; }
.segmentos > input:focus-visible + label { outline: 2px solid var(--ink); outline-offset: -4px; }
.segmentos .contagem { font-family: var(--font-mono); font-size: .6875rem; opacity: .8; }
.segmentos-sm > a, .segmentos-sm > label, .segmentos-sm > button { min-height: 32px; padding: 0 10px; }
.segmentos-bloco { display: flex; }
.segmentos-bloco > * { flex: 1; justify-content: center; }

/* ============================================================
   Cabeçalho de página, migalhas, abas de contexto
   ============================================================ */
.pagina-cabecalho {
  display: flex;
  align-items: flex-end;
  flex-wrap: wrap;
  gap: .75rem 1rem;
  margin-bottom: 1.25rem;
}
.pagina-cabecalho > h1, .pagina-cabecalho > h2, .pagina-titulo > h1, .pagina-titulo > h2 { margin-bottom: 0; }
.pagina-titulo { display: flex; flex-direction: column; gap: .25rem; min-width: 0; }
.pagina-sobretitulo { font-family: var(--font-mono); font-size: .6875rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }
.pagina-subtitulo { font-size: .8125rem; color: var(--ink-3); }
.pagina-acoes { display: flex; flex-wrap: wrap; gap: .5rem; margin-left: auto; align-items: center; }
.pagina-resumo { font-size: .875rem; color: var(--ink-3); padding-bottom: 4px; }
.pagina-resumo b, .pagina-resumo strong { color: var(--ink); }

.contexto-migalhas { font-size: .8125rem; color: var(--muted); margin-bottom: .5rem; display: flex; flex-wrap: wrap; align-items: center; gap: 0 .4rem; }
.contexto-migalhas a { color: var(--muted); text-decoration: none; }
.contexto-migalhas a:hover { color: var(--ink); text-decoration: underline; }
.contexto-migalhas span[aria-hidden] { color: var(--faint); }
.contexto-migalhas .atual { color: var(--ink); font-weight: 500; }

.contexto-slug, .contexto-etiqueta {
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  padding: 3px 7px;
  border: 1px solid var(--line-strong);
  color: var(--ink-3);
  letter-spacing: .02em;
  white-space: nowrap;
}

.contexto-abas {
  display: flex;
  border-bottom: 1px solid var(--line);
  margin-bottom: 1.25rem;
  overflow-x: auto;
  scrollbar-width: none;
}
.contexto-abas::-webkit-scrollbar { display: none; }
.contexto-aba {
  display: inline-flex; align-items: center; gap: .4rem;
  padding: 10px 14px;
  min-height: 44px;
  font-size: .875rem;
  color: var(--ink-3);
  text-decoration: none;
  white-space: nowrap;
}
.contexto-aba:hover { color: var(--ink); background: var(--paper); }
.contexto-aba.ativa, .contexto-aba[aria-current="page"] { color: var(--ink); font-weight: 600; box-shadow: inset 0 -2px 0 var(--ink); }
.contexto-aba.inativa { color: var(--faint); }
.contexto-aba .contagem { font-family: var(--font-mono); font-size: .6875rem; font-weight: 500; color: var(--muted); }
.contexto-aba .contagem-laranja { font-family: var(--font-mono); font-size: .6875rem; font-weight: 600; color: var(--accent); }
.contexto-aba .aviso { font-family: var(--font-mono); font-size: .6875rem; color: var(--warn); }
.contexto-aba .estado-aba { font-family: var(--font-mono); font-size: .625rem; font-weight: 500; color: var(--ink-3); }
.contexto-aba .estado-aba.aberto { color: var(--ok); }
.contexto-aba.direita { margin-left: auto; }

/* ============================================================
   Superfícies: cartões, painéis, ficha de dados
   ============================================================ */
.card { --bs-card-border-color: var(--line); --bs-card-border-radius: 0; --bs-card-inner-border-radius: 0; --bs-card-bg: #fff; --bs-card-cap-bg: var(--surface); box-shadow: none; }
.card .card-body { padding: 1.25rem; }
.card-header { font-weight: 600; font-size: .875rem; }
.list-group { --bs-list-group-bg: #fff; --bs-list-group-border-radius: 0; --bs-list-group-border-color: var(--line-soft); }

.painel { background: #fff; border: 1px solid var(--line); }
.painel-forte { background: #fff; border: 1px solid var(--ink); }
.painel-corpo { padding: 20px; }
.painel-cabecalho { display: flex; align-items: center; gap: 10px; padding: 14px 16px; border-bottom: 1px solid var(--line-soft); }
.painel + .painel { margin-top: 1rem; }

.ficha-dados { display: grid; grid-template-columns: 160px 1fr; margin: 0; background: #fff; border: 1px solid var(--line); font-size: .875rem; }
.ficha-dados > div { display: contents; }
.ficha-dados dt { padding: 12px 14px; color: var(--muted); font-weight: 400; border-bottom: 1px solid var(--line-soft); }
.ficha-dados dd { padding: 12px 14px; margin: 0; white-space: pre-line; border-bottom: 1px solid var(--line-soft); }
.ficha-dados > div:last-child dt, .ficha-dados > div:last-child dd { border-bottom: 0; }
.ficha-dados dd.sem-valor { color: var(--faint); }
@media (max-width: 575.98px) { .ficha-dados { grid-template-columns: 1fr; } .ficha-dados dt { border-bottom: 0; padding-bottom: 0; } }

/* Cartões de indicador: grelha com divisórias, número em mono. */
.kpis {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  background: #fff;
  border: 1px solid var(--line);
  margin-bottom: 1.5rem;
}
.kpi {
  display: block;
  padding: 16px;
  border-right: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  margin: 0 -1px -1px 0;
  color: var(--ink);
  text-decoration: none;
  min-width: 0;
}
a.kpi:hover { background: var(--surface); color: var(--ink); }
.painel.kpi, a.painel.kpi { margin: 0; border: 1px solid var(--line); }
a.painel.kpi:hover { border-color: var(--ink); }
.kpi-rotulo { font-size: .75rem; color: var(--ink-3); }
.kpi-valor { font-family: var(--font-mono); font-size: 2rem; font-weight: 600; letter-spacing: -.02em; line-height: 1.1; margin: 6px 0; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
.kpi-valor small { font-size: 1rem; color: var(--faint); font-weight: 500; }
.kpi-valor.medio { font-size: 1.5rem; }
.kpi-acao { font-size: .75rem; font-weight: 500; }
.kpi-acao.info { color: var(--faint); font-weight: 400; }
.kpi.quente { background: var(--accent-tint); box-shadow: inset 0 3px 0 var(--accent-fill); }
.kpi.quente .kpi-rotulo, .kpi.quente .kpi-acao { color: var(--accent-dark); }
.kpi.quente .kpi-valor { color: var(--accent); }
.kpi.alerta { box-shadow: inset 0 3px 0 var(--warn); }
.kpi.alerta .kpi-valor { color: var(--warn); }
.kpi.alerta .painel.kpi, a.painel.kpi { margin: 0; border: 1px solid var(--line); }
a.painel.kpi:hover { border-color: var(--ink); }
.kpi-rotulo { color: var(--warn-text); font-family: var(--font-mono); font-size: .625rem; font-weight: 600; letter-spacing: .06em; }
.kpi.bom .kpi-valor { color: var(--ok); }
.kpi.bom .kpi-rotulo { color: var(--ok); font-family: var(--font-mono); font-size: .625rem; font-weight: 600; letter-spacing: .06em; }
.kpi.mau .kpi-valor { color: var(--danger-text); }
.kpi.mau { background: var(--danger-bg); }

/* Legado: .stat-cards com .card dentro passa a ter o mesmo aspeto. */
.stat-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); background: #fff; border: 1px solid var(--line); }
.stat-cards .card { border: 0; border-right: 1px solid var(--line); height: 100%; text-align: left !important; }
.stat-cards .card-body { padding: 16px; display: flex; flex-direction: column-reverse; justify-content: flex-end; }
.stat-cards .card-body .fs-3 { font-family: var(--font-mono); font-size: 2rem !important; font-weight: 600; letter-spacing: -.02em; }
.stat-cards .card-body .text-muted { font-size: .75rem; color: var(--ink-3) !important; }
a.card-navegavel { color: inherit; text-decoration: none; display: block; }
a.card-navegavel:hover .card { background: var(--surface); }

/* ============================================================
   Tabelas
   ============================================================ */
.table {
  --bs-table-bg: #fff;
  --bs-table-color: var(--ink);
  --bs-table-border-color: var(--line-soft);
  --bs-table-striped-bg: #fff;
  --bs-table-hover-bg: var(--surface);
  --bs-table-active-bg: var(--accent-tint);
  font-size: .875rem;
  margin-bottom: 0;
  font-variant-numeric: tabular-nums;
}
.table > :not(caption) > * > * { padding: .7rem .75rem; border-bottom-color: var(--line-soft); vertical-align: middle; }
.table > thead > tr > th, .table > thead > tr > td {
  background: var(--surface);
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--ink-3);
  padding-top: .6rem;
  padding-bottom: .6rem;
  border-bottom: 1px solid var(--line);
  white-space: nowrap;
}
.table > tbody > tr:hover > * { background: var(--surface); }
.table-sm > :not(caption) > * > * { padding: .45rem .6rem; }
@media (max-width: 575.98px) {
  .table > :not(caption) > * > * { padding: .6rem .5rem; }
  .table > :not(caption) > * > :first-child { padding-left: .75rem; }
  .table > :not(caption) > * > :last-child { padding-right: .75rem; }
}
.table-bordered > :not(caption) > * > * { border-width: 0 0 1px 1px; border-color: var(--line-soft); }
.table-bordered > :not(caption) > * > :first-child { border-left-width: 0; }
.table-bordered > thead > tr > * { border-color: var(--line); }
.table-striped > tbody > tr:nth-of-type(odd) > * { --bs-table-bg-type: transparent; }
.table > tbody > tr:last-child > * { border-bottom: 0; }
.table .num, .table td.text-end { font-family: var(--font-mono); }
.table td.text-end .btn, .table td.text-end .acoes-linha, .table td.text-end form { font-family: var(--font-sans); }
.table .col-destaque { background: var(--surface); font-weight: 600; }
.table .col-total { background: var(--surface-2); font-weight: 600; }
.table-danger > * { --bs-table-bg: var(--danger-bg) !important; --bs-table-color: var(--ink) !important; background: var(--danger-bg) !important; }
.table-warning > * { --bs-table-bg: var(--warn-bg) !important; --bs-table-color: var(--ink) !important; background: var(--warn-bg) !important; }
.table-secondary > *, .linha-atenuada > * { --bs-table-bg: #fff !important; color: var(--ink) !important; opacity: .55; }
.table-active, .table > tbody > tr.selecionada > * { background: var(--accent-tint) !important; }
.table thead th.table-active { background: var(--ink) !important; color: #fff; }
.table .table-secondary { background: var(--surface-2) !important; }

.table-responsive, .tabela {
  position: relative;
  background: #fff;
  border: 1px solid var(--line);
}
.table-responsive > .table { white-space: nowrap; }
.table-responsive > .table td.quebra, .table-responsive > .table td.small { white-space: normal; min-width: 12rem; }
.table-responsive.is-scrollable-end { box-shadow: inset -12px 0 10px -10px rgba(10, 10, 10, .18); }
.table-responsive:focus-visible { outline-offset: -2px; }
.tabela-nota { font-size: .75rem; color: var(--muted); margin-top: .5rem; }
.tabela-nota b { font-family: var(--font-mono); color: var(--ink); }

/* Colunas fixas nas pautas: N.º/Aluno à esquerda, M.G. à direita, régua preta de 2 px. */
.tabela-fixa { overflow: auto; max-width: 100%; }
.tabela-fixa .fixa-esq { position: sticky; left: 0; z-index: 2; background: #fff; }
.tabela-fixa .fixa-esq-2 { position: sticky; z-index: 2; background: #fff; box-shadow: inset -2px 0 0 var(--ink); }
.tabela-fixa .fixa-dir { position: sticky; right: 0; z-index: 2; background: #fff; box-shadow: inset 2px 0 0 var(--ink); }
.tabela-fixa thead .fixa-esq, .tabela-fixa thead .fixa-esq-2, .tabela-fixa thead .fixa-dir { background: var(--surface); z-index: 3; }
.tabela-fixa thead .fixa-dir.escuro, .table thead th.escuro { background: var(--ink); color: #fff; }
.tabela-fixa tbody tr:hover .fixa-esq, .tabela-fixa tbody tr:hover .fixa-esq-2, .tabela-fixa tbody tr:hover .fixa-dir { background: var(--surface); }
.table th.grupo { font-family: var(--font-sans); text-transform: none; letter-spacing: 0; font-size: .8125rem; font-weight: 600; color: var(--ink); border-left: 1px solid var(--line) !important; box-shadow: inset 0 -2px 0 var(--ink); }
.table th.grupo.fora { box-shadow: inset 0 -2px 0 var(--faint); color: var(--muted); }
.table thead th.nome-avaliacao { font-family: var(--font-sans); text-transform: none; letter-spacing: 0; font-size: .75rem; max-width: 9rem; white-space: normal; line-height: 1.25; vertical-align: bottom; }
.table thead th.nome-avaliacao .mono { font-size: .625rem; }
.table .sep-grupo { border-left: 1px solid var(--line) !important; }

/* Ações por linha: uma ação primária + menu ⋯. */
.acoes-linha { display: inline-flex; align-items: center; justify-content: flex-end; gap: 4px; flex-wrap: nowrap; }
.acoes-linha form { display: inline; margin: 0; }
.acoes-linha .separador { width: 1px; height: 20px; background: var(--line); margin: 0 4px; }
.btn-menu {
  width: 32px; min-width: 32px; padding: 0 !important; min-height: 32px;
  font-size: 1rem; line-height: 1; letter-spacing: -.05em;
}
.btn-menu[aria-expanded="true"] { border-color: var(--ink); background: var(--surface-2); }
.linha-clicavel { cursor: pointer; }

.dropdown-menu {
  --bs-dropdown-bg: #fff;
  --bs-dropdown-border-radius: 0;
  --bs-dropdown-border-color: var(--ink);
  --bs-dropdown-box-shadow: none;
  --bs-dropdown-font-size: .8125rem;
  --bs-dropdown-padding-y: 0;
  --bs-dropdown-item-padding-y: .55rem;
  --bs-dropdown-item-padding-x: .75rem;
  --bs-dropdown-link-active-bg: var(--surface-2);
  --bs-dropdown-link-active-color: var(--ink);
  --bs-dropdown-link-hover-bg: var(--surface);
  --bs-dropdown-divider-margin-y: 0;
  --bs-dropdown-divider-bg: var(--line);
  min-width: 12rem;
}
.dropdown-menu form { margin: 0; }
.dropdown-menu button.dropdown-item { width: 100%; text-align: left; background: none; border: 0; }
.dropdown-item.perigo, .dropdown-menu .perigo { color: var(--danger-text); }
.dropdown-item.perigo:hover { background: var(--danger-bg); color: var(--danger-text); }

/* ============================================================
   Estados: sigla/ícone + texto, nunca só cor
   ============================================================ */
.estado, .badge {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  min-height: 22px;
  padding: 1px 7px;
  font-family: var(--font-mono);
  font-size: .6875rem;
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: .01em;
  border: 1px solid var(--line-strong);
  border-radius: 0;
  color: var(--ink-3);
  background: #fff;
  white-space: nowrap;
  vertical-align: middle;
}
.estado-glifo { font-family: var(--font-mono); font-size: .6875rem; }
.estado-ok { color: var(--ok); background: var(--ok-bg); border-color: var(--ok-line); }
.estado-neutro { color: var(--ink-3); background: var(--surface-2); border-color: var(--line); }
.estado-pendente, .estado-aviso { color: var(--warn-text); background: var(--warn-bg); border-color: var(--warn-line); }
.estado-erro { color: var(--danger-text); background: var(--danger-bg); border-color: var(--danger-line); }
.estado-info { color: var(--info); background: var(--info-bg); border-color: var(--info-line); }
.estado-linha { color: var(--ink-3); background: #fff; border-color: var(--line-strong); }
.estado-perigo-cheio { color: #fff; background: var(--danger); border-color: var(--danger); }
.estado-ok-cheio { color: #fff; background: var(--ok); border-color: var(--ok); }
.estado-escuro { color: #fff; background: var(--ink); border-color: var(--ink); }
.estado-bloqueado { color: var(--ink-2); background: var(--surface-2); border-color: var(--line-strong); }
.estado-sigla { font-weight: 600; letter-spacing: .02em; }

/* Badges Bootstrap antigos passam para o mesmo sistema. */
.badge.bg-success, .badge.text-bg-success { color: var(--ok) !important; background: var(--ok-bg) !important; border-color: var(--ok-line); }
.badge.bg-danger, .badge.text-bg-danger { color: var(--danger-text) !important; background: var(--danger-bg) !important; border-color: var(--danger-line); }
.badge.bg-warning, .badge.text-bg-warning { color: var(--warn-text) !important; background: var(--warn-bg) !important; border-color: var(--warn-line); }
.badge.bg-secondary, .badge.text-bg-secondary { color: var(--ink-3) !important; background: var(--surface-2) !important; border-color: var(--line); }
.badge.bg-primary, .badge.text-bg-primary, .badge.bg-info { color: var(--info) !important; background: var(--info-bg) !important; border-color: var(--info-line); }
.badge.bg-dark { color: #fff !important; background: var(--ink) !important; border-color: var(--ink); }

/* Sigla em caixa preta: MAC, NPP, PDF. */
.sigla { display: inline-block; font-family: var(--font-mono); font-size: .6875rem; font-weight: 600; background: var(--ink); color: #fff; padding: 2px 6px; line-height: 1.3; letter-spacing: .02em; }
.sigla-clara { background: #fff; color: var(--ink); border: 1px solid var(--line-strong); padding: 1px 5px; }

/* ============================================================
   Alertas — glifo + texto. Erros persistem; sucesso desaparece.
   ============================================================ */
.alert {
  --bs-alert-border-radius: 0;
  --bs-alert-padding-x: 14px;
  --bs-alert-padding-y: 12px;
  --bs-alert-margin-bottom: 1rem;
  position: relative;
  padding-left: 40px;
  font-size: .8125rem;
  line-height: 1.5;
  color: var(--ink);
  border: 1px solid var(--line);
  background: var(--surface-2);
}
.alert::before {
  position: absolute; left: 15px; top: 12px;
  font-family: var(--font-mono); font-size: .75rem; font-weight: 600; line-height: 1.6;
  content: "i"; color: var(--ink-2);
}
.alert-success { background: var(--ok-bg); border-color: var(--ok-line); }
.alert-success::before { content: "✓"; color: var(--ok); }
.alert-danger { background: var(--danger-bg); border-color: var(--danger-line); }
.alert-danger::before { content: "!"; color: var(--danger-text); }
.alert-warning { background: var(--warn-bg); border-color: var(--warn-line); }
.alert-warning::before { content: "▲"; color: var(--warn-text); }
.alert-info { background: var(--surface-2); border-color: var(--line); }
.alert-secondary, .alert-bloqueado { background: var(--surface-2); border-color: var(--line-strong); }
.alert-secondary::before, .alert-bloqueado::before { content: "\1F512\FE0E"; font-size: .75rem; }
.alert-perigo-cheio { background: var(--danger); border-color: var(--danger); color: #fff; }
.alert-perigo-cheio::before { content: "■"; color: #fff; }
.alert-pendente::before { content: "◷"; color: var(--warn-text); }
.alert-pendente { background: var(--warn-bg); border-color: var(--warn-line); }
.alert a.alert-link, .alert .alert-link { font-weight: 500; color: inherit; text-decoration: underline; }
.alert .btn-close { position: absolute; top: 6px; right: 6px; padding: .75rem; width: 1.5rem; height: 1.5rem; }
.alert-dismissible { padding-right: 3rem; }
.alert b, .alert strong { font-weight: 600; }
.alert .alert-acao { margin-left: auto; font-weight: 500; text-decoration: underline; white-space: nowrap; }
.alert-linha { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.alert-linha > .alert-texto { flex: 1; min-width: 12rem; }

/* ============================================================
   Estados vazios — dois tipos
   ============================================================ */
.vazio {
  display: flex; gap: 20px; align-items: flex-start;
  background: #fff; border: 1px solid var(--line); padding: 28px; margin-bottom: 1rem;
}
.vazio::before { content: ""; width: 40px; height: 40px; background: var(--accent-fill); flex: none; }
.vazio-etiqueta { font-family: var(--font-mono); font-size: .6875rem; font-weight: 500; letter-spacing: .06em; color: var(--accent); margin-bottom: 6px; text-transform: uppercase; }
.vazio-titulo { font-size: 1.125rem; font-weight: 600; margin-bottom: 6px; line-height: 1.3; }
.vazio-texto { font-size: .8125rem; color: var(--ink-3); margin-bottom: 14px; max-width: 42rem; }
.vazio-texto:last-child { margin-bottom: 0; }
.vazio-acoes { display: flex; flex-wrap: wrap; gap: 8px; }
.vazio.critico { border-color: var(--danger); }
.vazio.critico::before { background: var(--danger); }
.vazio.critico .vazio-etiqueta { color: var(--danger-text); }
.vazio.positivo { border-color: var(--ok-line); background: var(--ok-bg); }
.vazio.positivo::before { display: none; }
.vazio.neutro::before { background: #fff; border: 1px solid var(--ink); }
@media (max-width: 575.98px) { .vazio { padding: 20px; flex-direction: column; gap: 14px; } .vazio::before { width: 32px; height: 32px; } }

.vazio-filtro {
  border: 1px dashed var(--line-strong); background: #fff; padding: 18px; font-size: .8125rem;
  color: var(--muted); text-align: center; margin-bottom: 1rem;
}
.vazio-filtro a { color: var(--ink); text-decoration: underline; }

/* Esqueleto de carregamento, com a forma do conteúdo. */
.esqueleto { display: flex; flex-direction: column; gap: 6px; }
.esqueleto > div { height: 36px; background: var(--surface-2); animation: pulsar 1.2s ease-in-out infinite; }
.esqueleto > .curto { height: 12px; width: 40%; background: var(--line-soft); }
@keyframes pulsar { 50% { opacity: .55; } }

/* Erro com tentar novamente. */
.form-status:empty { display: none; }

/* ============================================================
   Barra de guardar fixa
   ============================================================ */
.barra-guardar, .save-bar {
  position: sticky;
  bottom: 0;
  z-index: 5;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px 14px;
  background: #fff;
  border: 1px solid var(--ink);
  padding: 12px 16px;
  margin-top: 14px;
}
.barra-guardar::before, .save-bar::before { content: ""; width: 8px; height: 8px; background: var(--accent-fill); flex: none; }
.barra-guardar .barra-texto, .save-bar > span { flex: 1; font-size: .8125rem; min-width: 12rem; }
.barra-guardar .barra-texto b { font-weight: 600; }
.barra-guardar .barra-texto .text-muted { color: var(--muted); }
.barra-guardar.limpa::before { background: var(--line-strong); }
@media (max-width: 991.98px) { .barra-guardar { bottom: calc(var(--bottom-nav-h-atual, 0px)); } }

/* ============================================================
   Modal, offcanvas, diálogo de confirmação, toast
   ============================================================ */
.modal { --bs-modal-bg: #fff; --bs-modal-border-radius: 0; --bs-modal-inner-border-radius: 0; --bs-modal-border-color: var(--ink); --bs-modal-box-shadow: none; --bs-modal-header-border-color: var(--line); --bs-modal-footer-border-color: var(--line); --bs-modal-padding: 20px 24px; }
.modal-backdrop { --bs-backdrop-bg: #0a0a0a; --bs-backdrop-opacity: .45; }
.modal-content { border: 1px solid var(--ink); }
.modal-header { align-items: flex-start; padding: 20px 24px 14px; }
.modal-title { font-size: 1.0625rem; font-weight: 600; }
.modal-footer { padding: 14px 24px; gap: 8px; }
.modal-footer > * { margin: 0; }
.modal-body { font-size: .875rem; }

.offcanvas { --bs-offcanvas-bg: #fff; --bs-offcanvas-border-color: var(--ink); --bs-offcanvas-box-shadow: none; }
.offcanvas-backdrop { --bs-backdrop-opacity: .45; }
.offcanvas.painel-decisao { --bs-offcanvas-width: min(440px, 100vw); }
.offcanvas-header { min-height: 52px; padding: 14px 16px; border-bottom: 1px solid var(--line); }
.offcanvas-footer { padding: 16px 20px; border-top: 1px solid var(--line); display: flex; gap: 8px; }

#confirmModal .modal-dialog { max-width: 440px; }
#confirmModal .modal-header { border-bottom: 0; padding-bottom: 0; }
#confirmModal .modal-body { color: var(--ink-2); line-height: 1.5; padding-top: 8px; }
#confirmModal .modal-footer { border-top: 0; padding-top: 4px; }

.toast-container { z-index: 1090; }
.toast {
  --bs-toast-border-radius: 0; --bs-toast-bg: var(--ink); --bs-toast-color: #fff; --bs-toast-border-color: var(--ink);
  --bs-toast-box-shadow: none; --bs-toast-font-size: .8125rem; --bs-toast-max-width: 420px;
}
.toast .toast-body { display: flex; align-items: center; gap: 14px; padding: 12px 14px; }
.toast .toast-body .toast-texto { flex: 1; }
.toast .toast-body a { color: var(--accent-soft); font-weight: 600; text-decoration: underline; white-space: nowrap; }
.toast.toast-erro { --bs-toast-bg: var(--danger); --bs-toast-border-color: var(--danger); }
.toast .btn-close { filter: invert(1); opacity: .8; }

/* ============================================================
   Paginação
   ============================================================ */
.paginacao { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; font-size: .8125rem; margin-top: 12px; }
.paginacao .paginacao-resumo { color: var(--muted); font-family: var(--font-mono); font-size: .75rem; }
.pagination { --bs-pagination-border-radius: 0; --bs-pagination-color: var(--ink); --bs-pagination-border-color: var(--line); --bs-pagination-hover-bg: var(--surface); --bs-pagination-hover-color: var(--ink); --bs-pagination-hover-border-color: var(--line-strong); --bs-pagination-active-bg: var(--ink); --bs-pagination-active-border-color: var(--ink); --bs-pagination-focus-box-shadow: none; --bs-pagination-disabled-bg: transparent; --bs-pagination-disabled-border-color: transparent; gap: 4px; flex-wrap: wrap; margin: 0; font-family: var(--font-mono); font-size: .8125rem; }
.pagination .page-link { min-width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; padding: 0 8px; background: #fff; }
.pagination .page-item.active .page-link { background: var(--ink); color: #fff; }
.pagination .page-item.disabled .page-link { background: transparent; }
.page-item:not(:first-child) .page-link { margin-left: 0; }
@media (max-width: 767.98px) { .pagination .page-link { min-width: 44px; height: 44px; } }

/* ============================================================
   Shell: cabeçalho, barra lateral, conteúdo
   ============================================================ */
.app-shell { display: flex; flex-direction: column; height: 100vh; height: 100dvh; overflow: hidden; }

.app-header {
  flex: none;
  height: var(--header-h);
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 20px;
  background: #fff;
  border-bottom: 1px solid var(--line);
  z-index: 20;
  min-width: 0;
}
.app-header.escuro { background: var(--ink); color: #fff; border-bottom-color: var(--ink); }
.app-header.escuro .header-contexto-chip { border-color: #404040; color: var(--faint); }
.app-header.escuro .header-conta summary, .app-header.escuro .btn-sair { color: #fff; }
.app-header.escuro .btn-sair { color: var(--faint); }
.app-header.escuro .btn-icone { color: #fff; }

.brand { font-size: 1.25rem; font-weight: 700; letter-spacing: -.03em; color: var(--ink); text-decoration: none; line-height: 1; white-space: nowrap; }
.app-header.escuro .brand { color: #fff; }
.brand:hover { color: inherit; text-decoration: none; }
.brand-accent { color: var(--accent-fill); }

.header-contexto { display: flex; align-items: center; gap: 12px; min-width: 0; }
.header-contexto-divisor { width: 1px; height: 20px; background: var(--line); flex: none; }
.header-contexto-escola { font-size: .8125rem; color: var(--ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.header-contexto-chip { font-family: var(--font-mono); font-size: .6875rem; font-weight: 500; padding: 3px 7px; border: 1px solid var(--line); color: var(--ink-3); white-space: nowrap; }

.header-user { margin-left: auto; display: flex; align-items: center; gap: 8px; min-width: 0; }
.header-conta { position: relative; min-width: 0; }
.header-conta > summary {
  list-style: none; display: flex; align-items: center; gap: 8px; cursor: pointer;
  font-size: .8125rem; padding: 6px 10px; border: 1px solid transparent; min-height: 40px; min-width: 0;
}
.header-conta > summary::-webkit-details-marker { display: none; }
.header-conta > summary:hover { border-color: var(--line-strong); }
.header-conta[open] > summary { border-color: var(--ink); }
.header-conta .conta-nome { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 16rem; }
.header-conta .conta-seta { font-size: .5625rem; }
.avatar {
  width: 24px; height: 24px; flex: none; display: inline-flex; align-items: center; justify-content: center;
  background: var(--ink); color: #fff; font-family: var(--font-mono); font-size: .625rem; font-weight: 600; letter-spacing: 0;
}
.avatar-md { width: 32px; height: 32px; font-size: .6875rem; }
.avatar-lg { width: 28px; height: 28px; font-size: .625rem; }
.avatar.admin { background: var(--accent-fill); color: var(--ink); }
.avatar.aluno { background: var(--line-soft); color: var(--ink-2); }
.app-header.escuro .avatar { background: #fff; color: var(--ink); }
.conta-painel {
  position: absolute; right: 0; top: calc(100% + 6px); width: min(300px, 88vw); background: #fff; border: 1px solid var(--ink);
  z-index: 1050; font-size: .8125rem; color: var(--ink);
}
.conta-painel-topo { padding: 16px; border-bottom: 1px solid var(--line); }
.conta-painel-topo strong { display: block; font-size: .9375rem; font-weight: 600; }
.conta-painel-topo span { color: var(--muted); overflow-wrap: anywhere; }
.conta-painel-dados { padding: 12px 16px; display: grid; grid-template-columns: 90px 1fr; gap: 6px; border-bottom: 1px solid var(--line); }
.conta-painel-dados dt { color: var(--muted); font-weight: 400; }
.conta-painel-dados dd { margin: 0; }
.conta-painel a { display: block; padding: 10px 16px; color: var(--ink); text-decoration: none; }
.conta-painel a:hover { background: var(--surface); }
.conta-painel a + a { border-top: 1px solid var(--line); }
.btn-sair { background: none; border: 0; font-size: .8125rem; color: var(--ink-3); padding: 6px 10px; min-height: 40px; }
.btn-sair:hover { color: var(--ink); text-decoration: underline; }

.app-body { flex: 1 1 auto; min-height: 0; display: flex; overflow: hidden; }

.sidebar {
  width: var(--sidebar-width);
  flex: none;
  background: #fff;
  border-right: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  padding: 12px 10px;
  overflow: hidden;
}
.sidebar-nav { flex: 1 1 auto; min-height: 0; overflow-y: auto; scrollbar-width: thin; scrollbar-color: #b8b8b8 transparent; display: flex; flex-direction: column; }
.sidebar-nav .nav-link {
  display: flex; align-items: center; gap: 10px;
  min-height: 38px; padding: 0 12px 0 28px;
  font-size: .875rem; color: #262626; text-decoration: none;
}
.sidebar-nav .nav-link { white-space: nowrap; }
.sidebar-nav .nav-texto { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.sidebar-nav .nav-link:hover { background: var(--surface); color: var(--ink); }
.sidebar-nav .nav-link.active, .sidebar-nav .nav-link[aria-current="page"] {
  background: var(--ink); color: #fff; font-weight: 500; padding-left: 12px;
}
.sidebar-nav .nav-link.active::before, .sidebar-nav .nav-link[aria-current="page"]::before { content: ""; width: 6px; height: 6px; background: var(--accent-fill); flex: none; }
.sidebar-nav .nav-contagem { margin-left: auto; font-family: var(--font-mono); font-size: .6875rem; font-weight: 600; color: var(--accent); }
.sidebar-nav .nav-contagem.cheio { background: var(--accent); color: #fff; padding: 1px 6px; }
.sidebar-nav .nav-link.active .nav-contagem.cheio { background: var(--accent-fill); color: var(--ink); }
.sidebar-nav .nav-link.active .nav-contagem:not(.cheio) { color: var(--accent-soft); }
.nav-section-label {
  font-family: var(--font-mono); font-size: .625rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase;
  color: var(--muted); padding: 16px 12px 6px;
}
.sidebar-nav > .nav-section-label:first-child { padding-top: 4px; }
.sidebar-nav details > summary { list-style: none; cursor: pointer; display: flex; align-items: center; }
.sidebar-nav details > summary::-webkit-details-marker { display: none; }
.sidebar-nav details > summary::after { content: "+"; margin-left: auto; font-family: var(--font-mono); padding-right: 2px; }
.sidebar-nav details[open] > summary::after { content: "−"; }
.sidebar-footer { flex: none; margin-top: 12px; padding: 12px 12px 0; border-top: 1px solid var(--line); font-family: var(--font-mono); font-size: .625rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }

.content {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 0;
  overflow-y: auto;
  padding: 28px 32px 48px;
  background: var(--surface);
}
.content-inner { max-width: 1440px; }

@media (max-width: 991.98px) {
  .sidebar { display: none; }
  .app-header { padding: 0 8px 0 4px; gap: 8px; }
  .header-contexto { display: none; }
  .header-conta .conta-nome, .header-conta .conta-seta { display: none; }
  .header-conta > summary { padding: 4px; }
  .content { padding: 16px 16px 32px; }
}
@media (max-width: 575.98px) { .btn-sair { display: none; } }

/* Menu móvel (offcanvas) */
.offcanvas.menu-movel { --bs-offcanvas-width: min(300px, 88vw); }
.menu-movel .offcanvas-header { height: 52px; padding: 0 4px 0 16px; }
.menu-movel-utilizador { padding: 14px 16px; border-bottom: 1px solid var(--line); font-size: .8125rem; }
.menu-movel-utilizador strong { display: block; font-weight: 600; }
.menu-movel-utilizador span { color: var(--muted); }
.menu-movel .sidebar { display: flex; width: 100%; border-right: 0; padding: 8px; }
.menu-movel .sidebar-nav .nav-link { min-height: 48px; font-size: .9375rem; }
.menu-movel-rodape { margin-top: auto; border-top: 1px solid var(--line); padding: 8px; }
.menu-movel-rodape button, .menu-movel-rodape a { display: flex; align-items: center; width: 100%; min-height: 48px; padding: 0 12px; background: none; border: 0; font-size: .9375rem; color: var(--ink); text-decoration: none; }

/* Barra inferior do professor e do aluno, só em telemóvel. */
.nav-inferior { display: none; }
@media (max-width: 767.98px) {
  body.com-nav-inferior { --bottom-nav-h-atual: var(--bottom-nav-h); }
  .com-nav-inferior .nav-inferior {
    display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;
    flex: none; height: var(--bottom-nav-h); background: #fff; border-top: 1px solid var(--line);
    padding-bottom: env(safe-area-inset-bottom);
  }
  .nav-inferior a, .nav-inferior button {
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
    font-size: .6875rem; color: var(--ink-3); text-decoration: none; background: none; border: 0; min-height: 44px;
  }
  .nav-inferior a::before, .nav-inferior button::before { content: ""; width: 6px; height: 6px; background: transparent; }
  .nav-inferior .ativo { color: var(--ink); font-weight: 600; box-shadow: inset 0 2px 0 var(--ink); }
  .nav-inferior .ativo::before { background: var(--accent-fill); }
  .nav-inferior .nav-contagem { font-family: var(--font-mono); font-size: .625rem; color: var(--accent); }
}

/* ============================================================
   Assistente de IA
   ============================================================ */
.chat-fab {
  position: fixed; right: 16px; bottom: 16px; z-index: 1030;
  display: inline-flex; align-items: center; gap: 10px;
  height: 48px; padding: 0 16px;
  background: var(--ink); color: #fff; border: 1px solid var(--ink);
  font-size: .875rem; font-weight: 500;
}
.chat-fab::before { content: ""; width: 8px; height: 8px; background: var(--accent-fill); }
.chat-fab:hover { background: #262626; }
/* No telemóvel o botão flutuante tapava conteúdo: o assistente abre a partir do menu. */
@media (max-width: 767.98px) { .chat-fab { display: none; } }
.chat-offcanvas { --bs-offcanvas-width: min(var(--chat-panel-width), 100vw); }
.chat-offcanvas .offcanvas-header { gap: 10px; }
.chat-offcanvas .offcanvas-title { font-size: .875rem; font-weight: 600; display: flex; align-items: center; gap: 10px; }
.chat-offcanvas .offcanvas-title::before { content: ""; width: 8px; height: 8px; background: var(--accent-fill); }
.chat-panel-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; justify-content: center; padding: 32px; gap: 10px; }
.chat-panel-empty-title { font-size: 1.0625rem; font-weight: 600; margin: 0; }
.chat-panel-empty-text { font-size: .8125rem; color: var(--ink-3); line-height: 1.5; margin: 0; }
.chat-panel-footer { flex: none; padding: 12px; border-top: 1px solid var(--line); display: flex; gap: 8px; }
.chat-input { flex: 1; resize: none; border: 0; background: var(--surface-2); min-height: 40px; padding: 10px 12px; font-size: .8125rem; font-family: var(--font-sans); }
.chat-input:disabled { color: var(--faint); }
.chat-send-btn { min-height: 40px; padding: 0 14px; border: 0; background: var(--surface-2); color: var(--faint); font-size: .8125rem; }

/* ============================================================
   Páginas sem sessão: login e erros
   ============================================================ */
.auth-shell { min-height: 100vh; min-height: 100dvh; background: #fff; }
.login { display: grid; grid-template-columns: minmax(0, 520px) minmax(0, 1fr); min-height: 100vh; min-height: 100dvh; }
.login-form { padding: 56px 64px; display: flex; flex-direction: column; }
.login-form .brand { font-size: 1.625rem; }
.login-centro { margin: auto 0; padding: 32px 0; max-width: 392px; width: 100%; }
.login-centro h1 { font-size: 2rem; margin-bottom: 8px; }
.login-centro .login-sub { font-size: .875rem; color: var(--ink-3); margin-bottom: 32px; }
.login-centro .form-control { min-height: 48px; font-size: .9375rem; }
.login-centro .input-group > .btn { min-height: 48px; border-left: 1px solid var(--line); }
.login-centro .btn-entrar { width: 100%; min-height: 48px; font-size: .9375rem; }
.login-ajuda { border-top: 1px solid var(--line); margin-top: 28px; padding-top: 16px; font-size: .875rem; }
.login-ajuda summary { list-style: none; display: flex; justify-content: space-between; font-weight: 500; cursor: pointer; }
.login-ajuda summary::-webkit-details-marker { display: none; }
.login-ajuda summary::after { content: "+"; font-family: var(--font-mono); }
.login-ajuda[open] summary::after { content: "−"; }
.login-ajuda p { font-size: .8125rem; color: var(--ink-3); line-height: 1.55; margin: 8px 0 0; }
.login-rodape { font-family: var(--font-mono); font-size: .6875rem; color: var(--muted); }
/* O gradiente escurece a fotografia para o texto branco continuar legível; a cor por baixo fica enquanto a imagem carrega. */
.login-arte { background: linear-gradient(rgba(10, 10, 10, .55), rgba(10, 10, 10, .85)), url("../img/backgroundlogin.jpg") center / cover no-repeat, var(--ink); color: #fff; padding: 56px 64px; display: flex; flex-direction: column; overflow: hidden; }
.login-arte-titulo { font-size: clamp(2.5rem, 5vw, 4rem); font-weight: 600; letter-spacing: -.035em; line-height: 1; margin: auto 0 0; }
.login-arte-titulo span { color: var(--accent-fill); }
.login-arte-perfis { display: flex; flex-wrap: wrap; gap: 24px 40px; margin-top: 40px; font-size: .8125rem; color: var(--faint); border-top: 1px solid #262626; padding-top: 20px; }
.login-arte-perfis div div:first-child { font-family: var(--font-mono); font-size: .6875rem; font-weight: 500; letter-spacing: .08em; color: var(--muted); margin-bottom: 4px; }
@media (max-width: 991.98px) {
  .login { grid-template-columns: 1fr; }
  .login-arte { display: none; }
  .login-form { padding: 24px; }
  .login-centro { margin: 40px 0 auto; }
  .login-centro h1 { font-size: 1.75rem; }
  .login-centro .form-control { min-height: 52px; font-size: 1rem; }
  .login-centro .btn-entrar { min-height: 52px; }
}

.erro-pagina { min-height: 60vh; display: flex; flex-direction: column; justify-content: center; max-width: 560px; padding: 40px 0; }
.auth-shell .erro-pagina { min-height: 100vh; padding: 40px; }
.erro-codigo { font-family: var(--font-mono); font-size: 6rem; font-weight: 600; line-height: 1; letter-spacing: -.04em; margin-bottom: 16px; }
.erro-codigo span { color: var(--accent-fill); }
.erro-quadrados { display: flex; gap: 6px; margin-bottom: 24px; }
.erro-quadrados span { width: 24px; height: 24px; background: var(--ink); }
.erro-quadrados span.vazio-q { background: none; border: 1px solid var(--ink); }
.erro-icone { width: 48px; height: 48px; background: var(--danger); color: #fff; display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: 1.375rem; font-weight: 700; margin-bottom: 22px; }
.erro-pagina h1 { font-size: 1.625rem; margin-bottom: 10px; }
.erro-pagina p { font-size: .875rem; color: var(--ink-3); line-height: 1.5; margin-bottom: 22px; }
.erro-referencia { font-family: var(--font-mono); font-size: .75rem; color: var(--ink-3); background: var(--surface-2); padding: 8px 10px; margin-bottom: 20px; width: max-content; max-width: 100%; overflow-wrap: anywhere; }

/* ============================================================
   Anúncios
   ============================================================ */
.anuncios-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; margin-bottom: 1.5rem; }
.anuncio-card { background: #fff; border: 1px solid var(--line); display: flex; flex-direction: column; overflow: hidden; }
.anuncio-card-img { width: 100%; max-height: 200px; object-fit: cover; display: block; border-bottom: 1px solid var(--line); }
.anuncio-card-body { padding: 16px; flex: 1; }
.anuncio-card-meta { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-bottom: 8px; font-family: var(--font-mono); font-size: .75rem; color: var(--muted); }
.anuncio-card-titulo { font-weight: 600; margin-bottom: 4px; }
.anuncio-card-texto { font-size: .8125rem; color: var(--ink-3); margin: 0; white-space: pre-line; }
.anuncio-card-actions { padding: 0 16px 16px; display: flex; gap: 6px; }
.anuncios-recolhidos { background: #fff; border: 1px solid var(--line); margin-bottom: 1.25rem; }
.anuncios-recolhidos > summary { list-style: none; display: flex; align-items: center; gap: 10px; padding: 14px 16px; cursor: pointer; font-size: .875rem; }
.anuncios-recolhidos > summary::-webkit-details-marker { display: none; }
.anuncios-recolhidos > summary::after { content: "+"; margin-left: auto; font-family: var(--font-mono); }
.anuncios-recolhidos[open] > summary { border-bottom: 1px solid var(--line-soft); }
.anuncios-recolhidos[open] > summary::after { content: "−"; }
.anuncios-recolhidos .anuncios-grid { padding: 12px; margin: 0; }
.anuncios-recolhidos .anuncio-resumo { color: var(--ink-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }

/* ============================================================
   Calendário (FullCalendar) e aulas
   ============================================================ */
.calendario-barra { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-bottom: 12px; }
.calendario-barra .calendario-titulo { font-size: .9375rem; font-weight: 600; }
.calendario-legenda { margin-left: auto; display: flex; flex-wrap: wrap; gap: 6px 14px; font-size: .75rem; color: var(--ink-3); align-items: center; }
.calendario-legenda span { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }
.legenda-amostra { width: 12px; height: 12px; border: 1px solid var(--line-strong); display: inline-block; }
.legenda-amostra.por-dar { border: 1px dashed var(--accent-fill); background: #fff; }
.legenda-amostra.dada { background: var(--ok-bg); border-color: var(--ok-line-strong); }
.legenda-amostra.avaliacao { background: var(--danger-bg); border-color: var(--danger-line-strong); }
.legenda-amostra.cancelada { background: repeating-linear-gradient(135deg, #e5e5e5 0 3px, #fff 3px 6px); }
.calendario-nota { font-family: var(--font-mono); font-size: .6875rem; color: var(--muted); margin-top: 8px; }

.calendario-caixa { background: #fff; border: 1px solid var(--line); }
.fc {
  --fc-border-color: var(--line-soft);
  --fc-page-bg-color: #fff;
  --fc-neutral-bg-color: var(--surface);
  --fc-today-bg-color: #fffcf8;
  --fc-now-indicator-color: var(--accent-fill);
  --fc-event-border-color: transparent;
  --fc-event-bg-color: transparent;
  --fc-event-text-color: var(--ink);
  --fc-list-event-hover-bg-color: var(--surface);
  font-family: var(--font-sans);
  font-size: .8125rem;
}
.fc .fc-scrollgrid { border-color: var(--line); }
.fc .fc-col-header-cell { background: #fff; }
.fc .fc-col-header-cell-cushion { padding: 10px 12px; font-weight: 600; color: var(--ink); text-decoration: none; font-size: .8125rem; }
.fc .fc-day-today .fc-col-header-cell-cushion, .fc .fc-col-header-cell.fc-day-today { background: var(--accent-tint); color: var(--accent-dark); }
.fc .fc-timegrid-slot-label-cushion, .fc .fc-timegrid-axis-cushion { font-family: var(--font-mono); font-size: .6875rem; color: var(--muted); }
.fc .fc-timegrid-slot { height: 2.25rem; }
.fc .fc-daygrid-day-number { font-family: var(--font-mono); font-size: .75rem; color: var(--ink-3); text-decoration: none; }
.fc-event, .fc-event:hover { border-radius: 0; }
.fc .fc-timegrid-event, .fc .fc-daygrid-event { box-shadow: none !important; }
.fc .fc-timegrid-event-harness-inset .fc-timegrid-event { box-shadow: none; }
.fc-v-event { background: transparent; border: 0; }
.fc .fc-event-main { color: var(--ink); padding: 0; }
.fc .fc-list { border: 0; }
.fc .fc-list-day-cushion { background: var(--surface); font-family: var(--font-mono); font-size: .6875rem; letter-spacing: .08em; text-transform: uppercase; }
.fc .fc-list-event td { border-color: var(--line-soft); }
.fc .fc-list-event-time { font-family: var(--font-mono); font-size: .75rem; }
.fc .fc-list-empty { background: #fff; color: var(--muted); }
.fc .fc-toolbar { display: none; }

.aula-evento {
  height: 100%; box-sizing: border-box; overflow: hidden;
  display: flex; flex-direction: column; gap: 2px; padding: 5px 7px;
  border: 1px solid var(--line-strong); background: #fff; color: var(--ink); cursor: pointer;
}
.aula-evento-topo { display: flex; justify-content: space-between; gap: 4px; font-family: var(--font-mono); font-size: .59375rem; font-weight: 600; letter-spacing: .04em; }
.aula-evento-topo .sala { color: var(--muted); font-weight: 400; }
.aula-evento-titulo { font-size: .75rem; font-weight: 600; line-height: 1.25; overflow: hidden; }
.aula-evento .tira { margin-top: auto; }
.aula-evento.por-dar { border-style: dashed; border-color: var(--accent-fill); }
.aula-evento.por-dar .aula-evento-topo .estado-txt { color: var(--accent); }
.aula-evento.dada { background: var(--ok-bg); border-color: var(--ok-line-strong); }
.aula-evento.dada .aula-evento-topo .estado-txt { color: var(--ok); }
.aula-evento.avaliacao { background: var(--danger-bg); border-color: var(--danger-line-strong); }
.aula-evento.avaliacao .aula-evento-topo .estado-txt { color: var(--danger-text); }
.aula-evento.cancelada { background: repeating-linear-gradient(135deg, #f5f5f5 0 6px, #fff 6px 12px); border-color: var(--line-strong); }
.aula-evento.cancelada .aula-evento-titulo { text-decoration: line-through; }
.aula-evento.cancelada .aula-evento-topo .estado-txt { color: var(--ink-3); }
.aula-evento.agora { outline: 2px solid var(--ink); outline-offset: 1px; }
.aula-evento.horario { background: var(--surface); border-color: var(--line); }
.aula-evento.horario .aula-evento-titulo { font-weight: 500; }

/* Grelha do horário semanal (aluno e turma). */
.grelha-horario .table td, .grelha-horario .table th { height: 52px; }
.grelha-horario .table td.hoje { background: #fffcf8; }
.grelha-horario .table thead th.hoje { background: var(--accent-tint); color: var(--accent-dark) !important; }
.grelha-horario .aula-evento { height: auto; min-height: 44px; }
.grelha-horario a.aula-evento:hover { border-color: var(--ink); }
.tempo-vazio { display: flex; align-items: center; justify-content: center; min-height: 44px; border: 1px dashed var(--line); color: var(--faint); text-decoration: none; }
.tempo-vazio:hover { border-color: var(--ink); color: var(--ink); background: var(--surface); }

/* Tira S F A R: Sumário · Faltas · Avaliação · Reagendamento. Cheio = feito. */
.tira { display: flex; gap: 3px; }
.tira span {
  width: 15px; height: 15px; display: flex; align-items: center; justify-content: center;
  font-family: var(--font-mono); font-size: .53125rem; font-weight: 600;
  background: #fff; color: var(--faint); border: 1px solid var(--line-strong);
}
.tira span.feito { background: var(--ink); color: #fff; border-color: var(--ink); }
.tira-lg span { width: 20px; height: 20px; font-size: .625rem; }

/* Lançamento de notas: em ecrã estreito cabe N.º, aluno (com estado) e a nota. */
.pauta-lancamento .table-responsive > .table { white-space: normal; }
.pauta-lancamento .table thead th { white-space: normal; }
@media (max-width: 575.98px) {
  .pauta-lancamento .table > :not(caption) > * > * { padding-left: .5rem; padding-right: .5rem; }
  .pauta-lancamento .campo-nota { width: 84px; min-height: 48px; font-size: 1.125rem; }
  .pauta-lancamento .table td:first-child, .pauta-lancamento .table th:first-child { width: 32px !important; }
}

/* Lista do dia no telemóvel. */
.dias-semana { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 4px; margin-bottom: 14px; }
.dias-semana a {
  height: 56px; display: flex; flex-direction: column; align-items: center; justify-content: center;
  background: #fff; border: 1px solid var(--line); color: var(--ink); text-decoration: none; font-size: .6875rem;
}
.dias-semana a b { font-family: var(--font-mono); font-size: 1rem; font-weight: 600; }
.dias-semana a small { font-family: var(--font-mono); font-size: .5625rem; opacity: .8; }
.dias-semana a.ativo { background: var(--ink); color: #fff; border-color: var(--ink); }
.lista-dia { display: flex; flex-direction: column; gap: 8px; }
.lista-dia-aula {
  display: grid; grid-template-columns: 56px 1fr; background: #fff; border: 1px solid var(--line-strong);
  text-align: left; padding: 0; color: var(--ink); width: 100%;
}
.lista-dia-aula > span, .lista-dia-aula .titulo { display: block; }
.lista-dia-aula .hora { padding: 12px 0 12px 12px; font-family: var(--font-mono); font-size: .8125rem; font-weight: 500; line-height: 1.3; }
.lista-dia-aula .hora small { display: block; color: var(--muted); font-size: .6875rem; }
.lista-dia-aula .corpo { padding: 12px; }
.lista-dia-aula .corpo-topo { display: flex; justify-content: space-between; font-family: var(--font-mono); font-size: .625rem; font-weight: 600; letter-spacing: .04em; margin-bottom: 3px; }
.lista-dia-aula .corpo-topo .sala { color: var(--muted); font-weight: 400; }
.lista-dia-aula .titulo { font-size: 1rem; font-weight: 600; }
.lista-dia-aula .rodape { display: flex; gap: 4px; margin-top: 8px; align-items: center; }
.lista-dia-aula .rodape .dica { font-size: .75rem; color: var(--ink-3); margin-left: 6px; }
.lista-dia-aula.por-dar { border-style: dashed; border-color: var(--accent-fill); }
.lista-dia-aula.por-dar .estado-txt { color: var(--accent); }
.lista-dia-aula.dada .corpo { background: var(--ok-bg); }
.lista-dia-aula.dada { border-color: var(--ok-line-strong); }
.lista-dia-aula.dada .estado-txt { color: var(--ok); }
.lista-dia-aula.avaliacao .corpo { background: var(--danger-bg); }
.lista-dia-aula.avaliacao { border-color: var(--danger-line-strong); }
.lista-dia-aula.avaliacao .estado-txt { color: var(--danger-text); }
.lista-dia-aula.cancelada .corpo { background: repeating-linear-gradient(135deg, #f5f5f5 0 6px, #fff 6px 12px); }
.lista-dia-aula.cancelada .titulo { text-decoration: line-through; }
.lista-dia-aula.agora { outline: 2px solid var(--ink); outline-offset: 1px; }

/* ============================================================
   Modal da aula
   ============================================================ */
.aula-modal .modal-dialog { max-width: 760px; }
.aula-modal .modal-header { border-bottom: 0; padding-bottom: 0; }
.aula-modal-estado { font-family: var(--font-mono); font-size: .625rem; font-weight: 600; letter-spacing: .06em; margin-bottom: 4px; }
.aula-modal-titulo { font-size: 1.375rem; font-weight: 600; letter-spacing: -.01em; }
.aula-modal-sub { font-family: var(--font-mono); font-size: .8125rem; color: var(--ink-3); margin-top: 4px; }
.aula-modal .contexto-abas { margin: 16px 0 0; padding: 0 24px; }
.aula-modal .modal-body { padding: 0; }
.aula-modal-conteudo { padding: 16px 24px 20px; }
button.contexto-aba { background: none; border: 0; }
button.contexto-aba:disabled { color: var(--faint); cursor: not-allowed; }
.aba-sigla { width: 16px; height: 16px; display: inline-flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: .5625rem; font-weight: 600; background: #fff; color: var(--muted); border: 1px solid var(--line-strong); }
.contexto-aba.ativa .aba-sigla, .aba-sigla.feito { background: var(--ink); color: #fff; border-color: var(--ink); }
@media (max-width: 767.98px) {
  .aula-modal .modal-dialog { margin: 0; max-width: none; height: 100%; }
  .aula-modal .modal-content { height: 100%; border: 0; }
  .aula-modal .modal-body { overflow-y: auto; }
  .aula-modal-titulo { font-size: 1rem; }
  .aula-modal .contexto-abas { padding: 0; }
  .aula-modal-conteudo { padding: 12px; }
}

/* Presenças: P F FJ AT. */
.presencas-barra { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 10px; }
.presencas-barra .form-control { flex: 1; min-width: 10rem; }
.presencas-resumo { display: flex; flex-wrap: wrap; gap: 16px; padding: 10px 12px; background: var(--surface); border: 1px solid var(--line-soft); font-family: var(--font-mono); font-size: .75rem; font-weight: 500; margin-bottom: 4px; }
.presencas-resumo .p { color: var(--ok); } .presencas-resumo .f { color: var(--danger-text); } .presencas-resumo .fj { color: var(--info); } .presencas-resumo .at { color: var(--warn-text); } .presencas-resumo .pm { color: var(--muted); }
.presenca-linha { border-bottom: 1px solid var(--line-soft); padding: 8px 0; }
.presenca-linha-topo { display: flex; align-items: center; gap: 12px; }
.presenca-linha .n { width: 24px; text-align: right; font-family: var(--font-mono); font-size: .8125rem; color: var(--muted); flex: none; }
.presenca-linha .nome { flex: 1; font-size: .875rem; font-weight: 500; min-width: 0; }
.presenca-linha .aviso-faltas { font-family: var(--font-mono); font-size: .625rem; font-weight: 500; color: var(--warn-text); margin-left: 6px; }
.presenca-opcoes { display: flex; gap: 4px; }
.presenca-opcoes input { position: absolute; opacity: 0; pointer-events: none; }
.presenca-opcoes label {
  min-width: 44px; height: 36px; padding: 0 8px; display: flex; align-items: center; justify-content: center;
  font-family: var(--font-mono); font-size: .75rem; font-weight: 600; border: 1px solid var(--line-strong); background: #fff; color: var(--ink-3); cursor: pointer;
}
.presenca-opcoes input:focus-visible + label { outline: 2px solid var(--ink); outline-offset: 1px; }
.presenca-opcoes input[value="Presente"]:checked + label { background: var(--ok); border-color: var(--ok); color: #fff; }
.presenca-opcoes input[value="Falta"]:checked + label { background: var(--danger); border-color: var(--danger); color: #fff; }
.presenca-opcoes input[value="FaltaJustificada"]:checked + label { background: var(--info); border-color: var(--info); color: #fff; }
.presenca-opcoes input[value="Atraso"]:checked + label { background: var(--warn); border-color: var(--warn); color: #fff; }
.presenca-justificacao { margin: 8px 0 2px 36px; display: flex; gap: 8px; align-items: center; }
.presenca-justificacao[hidden] { display: none; }
.presenca-justificacao label { font-size: .75rem; color: var(--info); font-weight: 500; width: 90px; flex: none; }
.presenca-justificacao .form-control { border-color: var(--info-line); }
@media (max-width: 575.98px) {
  .presenca-linha-topo { flex-wrap: wrap; }
  .presenca-opcoes { width: 100%; padding-left: 36px; display: grid; grid-template-columns: repeat(4, 1fr); }
  .presenca-opcoes label { height: 44px; }
  .presenca-justificacao { margin-left: 0; flex-wrap: wrap; }
}

/* Níveis de comportamento NS S B MB. */
.niveis { display: flex; gap: 3px; }
.niveis input { position: absolute; opacity: 0; pointer-events: none; }
.niveis label { width: 48px; height: 36px; display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: .75rem; font-weight: 600; border: 1px solid var(--line-strong); background: #fff; color: var(--ink-3); cursor: pointer; }
.niveis input:checked + label { background: var(--ink); border-color: var(--ink); color: #fff; }
.niveis input:focus-visible + label { outline: 2px solid var(--ink); outline-offset: 1px; }
.niveis input:disabled + label { cursor: default; }
.niveis.nao-avaliado label { border-color: var(--warn-line); }

/* ============================================================
   Aluno
   ============================================================ */
.aluno-heroi { background: var(--ink); color: #fff; padding: 20px 24px 24px; margin: -28px -32px 20px; }
.aluno-heroi .rotulo { color: var(--faint); }
.aluno-heroi h1 { color: #fff; font-size: 1.75rem; margin: 6px 0 0; }
.aluno-heroi p { color: var(--line-strong); margin: 4px 0 0; font-size: .875rem; }
@media (max-width: 991.98px) { .aluno-heroi { margin: -16px -16px 16px; padding: 12px 20px 24px; } }
.cartao-link { display: flex; align-items: center; gap: 14px; background: #fff; border: 1px solid var(--line); padding: 16px; color: var(--ink); text-decoration: none; }
.cartao-link:hover { border-color: var(--ink); color: var(--ink); }
.cartao-link::after { content: "›"; font-size: 1.25rem; margin-left: auto; }
.botao-documento { display: flex; align-items: center; gap: 10px; min-height: 52px; padding: 0 16px; font-size: .9375rem; font-weight: 500; background: var(--ink); color: #fff; text-decoration: none; }
.botao-documento:hover { color: #fff; background: #262626; }
.botao-documento::after { content: "↓"; margin-left: auto; }
.botao-documento .sigla { background: #fff; color: var(--ink); }
.botao-documento.indisponivel { background: #fff; border: 1px solid var(--line); color: var(--faint); pointer-events: none; }
.botao-documento.indisponivel::after { content: none; }
.botao-documento.indisponivel .sigla { background: #fff; color: var(--faint); border: 1px solid var(--line-strong); }

.resultado-anual { display: flex; align-items: center; gap: 12px; padding: 20px 16px; color: #fff; background: var(--ok); margin-bottom: 1rem; flex-wrap: wrap; }
.resultado-anual.nao { background: var(--danger); }
.resultado-anual.pendente { background: #fff; color: var(--ink); border: 1px solid var(--line-strong); }
.resultado-anual-icone { width: 48px; height: 48px; background: #fff; color: var(--ok); display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: 1.375rem; font-weight: 700; flex: none; }
.resultado-anual.nao .resultado-anual-icone { color: var(--danger); }
.resultado-anual.pendente .resultado-anual-icone { border: 1px solid var(--ink); color: var(--ink); }
.resultado-anual-titulo { font-size: 1.875rem; font-weight: 700; letter-spacing: -.02em; line-height: 1.1; }
.resultado-anual .rotulo { color: inherit; opacity: .85; }
.resultado-anual-numeros { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; width: 100%; border-top: 1px solid rgba(255,255,255,.3); padding-top: 12px; margin-top: 4px; }
.resultado-anual.pendente .resultado-anual-numeros { border-top-color: var(--line); }
.resultado-anual-numeros div div:first-child { font-size: .75rem; opacity: .85; }
.resultado-anual-numeros b { font-family: var(--font-mono); font-size: 1.5rem; font-weight: 600; }

.medida-faltas { display: grid; grid-template-columns: repeat(var(--total, 10), minmax(0, 1fr)); gap: 3px; margin: 14px 0 10px; }
.medida-faltas span { height: 14px; border: 1px solid var(--line-strong); background: #fff; }
.medida-faltas span.cheio { background: var(--warn); border-color: var(--warn); }
.medida-faltas.ok span.cheio { background: var(--ink); border-color: var(--ink); }
.medida-faltas.limite span.cheio { background: var(--danger); border-color: var(--danger); }

.cartao-media { background: var(--ink); color: #fff; padding: 16px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.cartao-media .rotulo { color: var(--faint); }
.cartao-media .formula { font-size: .8125rem; color: var(--line-strong); margin-top: 4px; }
.cartao-media .valor { margin-left: auto; font-family: var(--font-mono); font-size: 2.125rem; font-weight: 600; }
.cartao-media .valor.negativa { color: #fca5a5 !important; }

.linha-divisoria { display: flex; align-items: center; gap: 8px; padding: 0 16px; min-height: 32px; font-family: var(--font-mono); font-size: .65625rem; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; background: var(--surface); color: var(--muted); border-bottom: 1px solid var(--line); }
.linha-divisoria.hoje { background: var(--ink); color: #fff; border-bottom-color: var(--ink); }
.linha-divisoria.hoje::before { content: ""; width: 6px; height: 6px; background: var(--accent-fill); }
.lista-simples { background: #fff; border: 1px solid var(--line); }
.lista-simples-item { display: flex; align-items: center; gap: 12px; padding: 0 16px; min-height: 56px; border-bottom: 1px solid var(--line-soft); color: var(--ink); text-decoration: none; }
.lista-simples-item:last-child { border-bottom: 0; }
a.lista-simples-item:hover { background: var(--surface); color: var(--ink); }
.lista-simples-item.hoje { background: var(--accent-tint); }
.lista-simples-item .quando { font-family: var(--font-mono); font-size: .75rem; font-weight: 500; width: 64px; line-height: 1.3; flex: none; }
.lista-simples-item .quando small { display: block; color: var(--muted); font-size: .75rem; }
.lista-simples-item .principal { flex: 1; font-size: .9375rem; font-weight: 500; min-width: 0; }
.lista-simples-item .secundario { font-family: var(--font-mono); font-size: .6875rem; font-weight: 500; white-space: nowrap; }
.lista-simples-item.passada { color: var(--ink-2); }
.lista-simples-item.passada .principal { font-weight: 400; }
a.lista-simples-item::after { content: "›"; color: var(--faint); }

/* ============================================================
   Admin: assistente de arranque, pedidos, importação
   ============================================================ */
.arranque { background: #fff; border: 1px solid var(--ink); display: grid; grid-template-columns: minmax(0, 360px) minmax(0, 1fr); margin-bottom: 1.25rem; }
.arranque-lista { padding: 24px; border-right: 1px solid var(--line); }
.arranque-progresso { display: grid; grid-template-columns: repeat(var(--passos, 10), 1fr); gap: 3px; margin: 12px 0 18px; }
.arranque-progresso span { height: 6px; background: var(--line); }
.arranque-progresso span.feito { background: var(--ink); }
.arranque-progresso span.atual { background: var(--accent-fill); }
.arranque-passo { display: flex; align-items: center; gap: 10px; min-height: 34px; font-size: .8125rem; padding: 0 8px; margin: 0 -8px; color: var(--ink-2); text-decoration: none; }
a.arranque-passo:hover { background: var(--surface); color: var(--ink); }
.arranque-passo .icone { width: 20px; height: 20px; flex: none; display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: .625rem; font-weight: 600; background: #fff; color: var(--muted); border: 1px solid var(--line-strong); }
.arranque-passo .texto { flex: 1; }
.arranque-passo .estado-passo { font-family: var(--font-mono); font-size: .625rem; font-weight: 500; color: var(--muted); }
.arranque-passo.feito { color: var(--ink-3); }
.arranque-passo.feito .icone { background: var(--ink); color: #fff; border-color: var(--ink); }
.arranque-passo.feito .estado-passo { color: var(--ok); }
.arranque-passo.falta .icone { border-color: var(--ink); color: var(--ink); }
.arranque-passo.falta .estado-passo { color: var(--danger-text); }
.arranque-passo.atual { background: var(--accent-tint); color: var(--ink); font-weight: 600; }
.arranque-passo.atual .icone { background: var(--accent-fill); border-color: var(--accent-fill); color: var(--ink); }
.arranque-detalhe { padding: 24px 28px; display: flex; flex-direction: column; }
.arranque-detalhe h2 { font-size: 1.375rem; margin: 6px 0 8px; }
.arranque-detalhe p { font-size: .875rem; color: var(--ink-2); line-height: 1.55; max-width: 560px; }
.arranque-rodape { display: flex; flex-wrap: wrap; gap: 8px; margin-top: auto; padding-top: 18px; align-items: center; }
.arranque-rodape .seguinte { margin-left: auto; font-size: .8125rem; color: var(--ink-3); }
@media (max-width: 991.98px) { .arranque { grid-template-columns: 1fr; } .arranque-lista { border-right: 0; border-bottom: 1px solid var(--line); } }

.pedido-linha { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: 12px; align-items: center; padding: 14px 16px; border-bottom: 1px solid var(--line-soft); background: #fff; }
.pedido-linha:last-child { border-bottom: 0; }
.pedido-linha.selecionado { background: var(--accent-tint); box-shadow: inset 3px 0 0 var(--accent-fill); }
.pedido-linha.respondido { opacity: .75; }
.pedido-linha .titulo { font-weight: 600; font-size: .875rem; }
.pedido-linha .meta { font-size: .75rem; color: var(--ink-3); margin-top: 2px; }
.pedido-linha .datas { font-family: var(--font-mono); font-size: .78125rem; line-height: 1.5; }
.pedido-linha .datas s { color: var(--muted); }
.pedido-linha .motivo { grid-column: 1 / -1; font-size: .8125rem; color: var(--ink-2); }
.pedido-linha .resposta { grid-column: 1 / -1; font-size: .75rem; color: var(--ink-3); padding-left: 10px; border-left: 2px solid var(--line-strong); }
@media (max-width: 767.98px) { .pedido-linha { grid-template-columns: 1fr; } }

.comparar-datas { display: grid; grid-template-columns: 1fr 28px 1fr; align-items: stretch; border: 1px solid var(--line); }
.comparar-datas > div { padding: 12px 14px; }
.comparar-datas .seta { display: flex; align-items: center; justify-content: center; padding: 0; }
.comparar-datas .data { font-family: var(--font-mono); font-size: 1.0625rem; font-weight: 600; margin-top: 4px; }
.comparar-datas .original .data { color: var(--muted); text-decoration: line-through; }
.comparar-datas .pedida { background: var(--accent-tint); }
.comparar-datas .pedida .rotulo { color: var(--accent-dark); }
.comparar-datas small { font-size: .75rem; color: var(--ink-3); }

.consequencias { border: 1px solid var(--line); }
.consequencias .rotulo { padding: 10px 12px; border-bottom: 1px solid var(--line-soft); display: block; }
.consequencias ul { list-style: none; margin: 0; padding: 10px 12px; font-size: .8125rem; line-height: 1.7; color: var(--ink-2); }
.consequencias li::before { content: "● "; font-size: .625rem; }

.passos-assistente { display: inline-flex; font-size: .8125rem; flex-wrap: wrap; }
.passos-assistente span { display: inline-flex; align-items: center; gap: 8px; padding: 6px 12px; border: 1px solid var(--line-strong); background: #fff; color: var(--ink-3); }
.passos-assistente span + span { border-left: 0; }
.passos-assistente span b { font-family: var(--font-mono); font-size: .6875rem; }
.passos-assistente span.ativo { background: var(--ink); color: #fff; border-color: var(--ink); }
.passos-assistente span.feito b { color: var(--ok); }

.zona-upload { border: 1px dashed var(--faint); background: #fff; padding: 20px; text-align: center; font-size: .8125rem; position: relative; }
.zona-upload.arrastar { border-color: var(--ink); background: var(--surface); }
.zona-upload input[type=file] { position: absolute; inset: 0; opacity: 0; cursor: pointer; width: 100%; }
.zona-upload .zona-texto { font-weight: 500; }
.zona-upload .zona-texto u { text-underline-offset: 3px; }
.zona-upload .zona-tipos { color: var(--muted); font-size: .75rem; margin-top: 4px; }
.ficheiro-escolhido { display: flex; align-items: center; gap: 12px; border: 1px solid var(--line); padding: 10px 12px; font-size: .8125rem; background: #fff; margin-top: 8px; }
.ficheiro-escolhido .nome { flex: 1; font-weight: 500; overflow-wrap: anywhere; }
.ficheiro-escolhido .tamanho { font-family: var(--font-mono); font-size: .75rem; color: var(--muted); }

.regua-escaloes { display: flex; height: 10px; margin-top: 12px; }
.regua-escaloes span { display: block; height: 100%; }
.regua-marcas { display: flex; justify-content: space-between; font-family: var(--font-mono); font-size: .625rem; color: var(--muted); margin-top: 4px; }
.barra-distribuicao { display: flex; width: 100%; min-width: 120px; height: 12px; }
.barra-distribuicao span { display: block; height: 100%; }

.avatar-inicial { width: 28px; height: 28px; flex: none; display: inline-flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: .625rem; font-weight: 600; background: var(--line-soft); color: var(--ink-2); }
.avatar-inicial.admin { background: var(--accent-fill); color: var(--ink); }
.avatar-inicial.professor { background: var(--ink); color: #fff; }
.pessoa { display: flex; align-items: center; gap: 10px; min-width: 0; }
.pessoa-nome { font-weight: 500; }
.pessoa-sub { font-family: var(--font-mono); font-size: .6875rem; color: var(--muted); }

.foto-perfil { width: 120px; height: 150px; object-fit: cover; border: 1px solid var(--line-strong); display: block; }
.foto-vazia { width: 120px; height: 150px; border: 1px solid var(--line-strong); background: repeating-linear-gradient(45deg, #f0f0f0 0 5px, #fff 5px 10px); display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: .625rem; color: var(--muted); }
.logo-escola { width: 56px; height: 56px; object-fit: contain; border: 1px solid var(--line-strong); background: #fff; padding: 2px; flex: none; }
.logo-vazio { width: 56px; height: 56px; border: 1px solid var(--line-strong); background: repeating-linear-gradient(45deg, #f0f0f0 0 4px, #fff 4px 8px); display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: .5625rem; color: var(--muted); flex: none; }

.navegacao-lateral { background: #fff; border: 1px solid var(--line); font-size: .8125rem; }
.navegacao-lateral a { display: flex; align-items: center; gap: 6px; padding: 10px 14px; border-bottom: 1px solid var(--line-soft); color: var(--ink); text-decoration: none; }
.navegacao-lateral a:last-child { border-bottom: 0; }
.navegacao-lateral a.ativo { font-weight: 600; background: var(--accent-tint); box-shadow: inset 2px 0 0 var(--accent-fill); }

.campo-em-falta { border-style: dashed !important; border-color: var(--warn) !important; background: var(--warn-bg) !important; }

/* Grelhas utilitárias. */
.grelha-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.grelha-lateral { display: grid; grid-template-columns: minmax(0, 1fr) 420px; gap: 20px; align-items: start; }
.grelha-lateral-esq { display: grid; grid-template-columns: 220px minmax(0, 1fr); gap: 28px; align-items: start; }
@media (max-width: 1199.98px) { .grelha-lateral, .grelha-lateral-esq { grid-template-columns: 1fr; } }
@media (max-width: 359.98px) { .grelha-2 { grid-template-columns: 1fr; } }

.filtros { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px; margin-bottom: 14px; }
.filtros .form-label { font-size: .75rem; margin-bottom: 4px; }
.filtros .campo-pesquisa { width: 300px; max-width: 100%; }
.filtros .resultados { margin-left: auto; font-size: .8125rem; color: var(--ink-3); align-self: center; }
.filtros .resultados b { font-family: var(--font-mono); color: var(--ink); }

.legenda-siglas { display: flex; flex-wrap: wrap; gap: 6px 20px; font-size: .75rem; color: var(--ink-3); margin-top: 10px; }
.legenda-siglas b { font-family: var(--font-mono); color: var(--ink); }

.bloco-texto { font-size: .875rem; line-height: 1.6; color: var(--ink-2); }
.bloco-texto ul { padding-left: 0; list-style: none; margin: 0; }
.bloco-texto li::before { content: "● "; font-size: .625rem; }

@media print {
  .app-header, .sidebar, .chat-fab, .nav-inferior, .barra-guardar, .toast-container { display: none !important; }
  .content { overflow: visible; padding: 0; background: #fff; }
  .app-shell, .app-body { display: block; height: auto; overflow: visible; }
}
