/* ================================================================= */
/* Lekto V3 · Home (Início) — dashboard do professor no DS lekto_v3    */
/* Base: Downloads/home 3.1 (sem conteúdo) e 3.2 (com conteúdo)        */
/* Cores só via var(--lkt-*) / color-mix ancorado em tokens.           */
/*                                                                     */
/* Até ago/2026 este era o estilo da tela avulsa home-legado.html. Com  */
/* a inversão das homes ele virou o estilo da view de Início do         */
/* index.html (#view-home, .view--dash): o casco da página (fundo,      */
/* fonte, margem do rail) agora vem de .app/.view em css/styles.css, e  */
/* o que sobrou aqui é só o miolo do dashboard.                         */
/* ================================================================= */

/* A view de Início é uma superfície clara, ao contrário da landing
   imersiva que ocupava este lugar: o fundo cinza é o da página inteira,
   por isso vem do <body> e não de um recuo próprio. */
/* Largura de ponta a ponta, igual à Biblioteca (.view--biblioteca em
   styles.css): sem teto próprio, o casco de .view já dá o recuo do rail à
   esquerda e a folga de 24px à direita. Antes havia um `max-width: 1360px`
   herdado da época em que esta era uma tela avulsa — em monitores largos ele
   deixava um vão do tamanho de uma coluna de cards sobrando à direita. */
.view--dash { padding-bottom: 64px; }
body:has(.view--dash.is-current) { background: var(--theme-surface-muted); }

/* ---------- Cabeçalho ----------
   Uma linha só: o cumprimento à esquerda, a busca inteligente à direita. */
.hl-head { display: flex; align-items: center; justify-content: space-between; gap: var(--spacing-md); margin: 4px 0 var(--spacing-xl); }
.hl-head__title { margin: 0; font-family: var(--theme-font-family-heading); font-weight: 800; letter-spacing: -.02em; font-size: clamp(26px, 3.4vw, 34px); color: var(--theme-text-heading); }

/* A busca é o componente .cmdk (css/styles.css) — aqui só entra o lugar dela na
   linha. O painel de resultados nasce ancorado à barra; como a barra encostou na
   direita, o painel abre para a esquerda e pode passar da largura dela, senão os
   resultados ficariam espremidos numa coluna estreita. */
/* `margin: 0` não é decoração: o .cmdk se centra sozinho por margem automática
   (css/styles.css), e dentro deste flex isso empurrava a barra para o meio da
   linha em vez de encostá-la na direita. O herói da landing anula do mesmo jeito. */
/* O AGRUPAMENTO À DIREITA do cumprimento é quem cede largura ao título, e a
   busca encolhe dentro dele. A base de 600px veio do par busca + botão do
   quadro de widgets (14/09/2026); o botão saiu com os widgets (23/09/2026),
   e a base ficou porque é a geometria aprovada desta tela no Pronto pra DEV —
   a busca (`flex: 0 1 520px`) não cresce, então o que sobra é folga à
   esquerda dela. */
.hl-head__dir { display: flex; align-items: center; gap: var(--spacing-xxs); flex: 0 1 600px; min-width: 240px; justify-content: flex-end; }
.hl-head__busca { flex: 0 1 520px; min-width: 240px; margin: 0; }
.hl-head__busca .cmdk__panel { left: auto; right: 4px; width: min(560px, calc(100vw - 48px)); }

/* ---------- Seção ---------- */
.hl-sec { margin-bottom: clamp(28px, 4vw, 44px); }
/* `center`, não `baseline`: a linha ganhou as setas do carrossel (40px), e
   alinhar botão redondo por linha de base o joga para baixo do título. */
.hl-sec__head { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 16px; }
.hl-sec__title { margin: 0; font-family: var(--theme-font-family-heading); font-weight: 700; letter-spacing: -.01em; font-size: clamp(18px, 2vw, 21px); color: var(--theme-text-heading); }
.hl-sec__link { display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0; color: var(--color-accent-dark); font-weight: 700; font-size: 14px; text-decoration: none; }
.hl-sec__link svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.hl-sec__link:hover { text-decoration: underline; }

/* Estado cheio × vazio, decidido POR SEÇÃO a partir do que a fonte devolve
   (js/home.js). Na tela avulsa um alternador de demonstração virava as três
   seções juntas; ligada ao app, cada uma responde pelo seu próprio dado. */
.hl-full, .hl-empty { display: none; }
.hl-sec[data-state="full"] .hl-full,
.hl-sec[data-state="empty"] .hl-empty { display: block; }

/* ---------- Carrossel de cards ----------
   Os cards são o componente .ccard (css/content-card.css), 280 × 450 fixos, e
   o trilho é o carrossel do DS (.crsl em css/styles.css + js/carrossel.js) —
   o MESMO de "Recomendados para você" na Biblioteca: setas e contador no
   cabeçalho, botões sobre o degradê, sem barra de rolagem.

   Atribuídos e recomendados usam o mesmo trilho. Antes atribuídos era um grid
   `auto-fill`: com 5 cards e 4 colunas, o quinto caía sozinho numa segunda linha
   ao lado de três vãos vazios, enquanto a seção de baixo — visualmente idêntica —
   rolava na horizontal. Duas fileiras iguais com comportamentos diferentes é o
   que fazia a tela parecer quebrada.

   Não há regra de trilho aqui de propósito: ela existiria em dois lugares, e o
   primeiro ajuste na rolagem deixaria as telas diferentes de novo. */
.hl-sec__tools { display: inline-flex; align-items: center; gap: 16px; flex-shrink: 0; }
/* Seção vazia não tem o que rolar: as setas e o contador saem com o trilho, e
   sobra o link de saída — que é justamente o que fazer quando não há nada. */
.hl-sec[data-state="empty"] .crsl__nav { display: none; }

/* ---------- Turmas ---------- */
.hl-turmas { display: grid; grid-template-columns: repeat(2, 1fr); gap: clamp(16px, 1.8vw, 22px); }
/* clicável: leva para a turma (js/home.js → LektoTurmas.openTurma) */
.hl-turma {
  display: flex; align-items: center; flex-wrap: wrap; gap: 12px;
  background: #FFF; border: 1px solid var(--theme-panel-border);
  border-radius: var(--border-radius-sm-plus); padding: 22px 24px;
  box-shadow: var(--theme-card-shadow); cursor: pointer;
  transition: border-color var(--motion-dur-fast) var(--motion-ease), box-shadow var(--motion-dur-fast) var(--motion-ease), transform var(--motion-dur-fast) var(--motion-ease);
}
.hl-turma:hover { border-color: var(--color-accent-soft); box-shadow: var(--lkt-shadow-level2); transform: translateY(-2px); }
.hl-turma:focus-visible { outline: 2px solid var(--color-accent-pure); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { .hl-turma:hover { transform: none; } }
.hl-turma__name { font-family: var(--theme-font-family-heading); font-weight: 700; letter-spacing: -.01em; font-size: 22px; color: var(--theme-text-heading); }
.hl-turma__count { padding: 5px 12px; border-radius: var(--border-radius-pill); background: var(--color-accent-pure); color: #FFF; font-size: 12.5px; font-weight: 700; }
.hl-turma__year { margin-left: auto; padding: 6px 12px; border-radius: var(--border-radius-pill); border: 1px solid var(--theme-panel-border); font-size: 12.5px; font-weight: 700; color: var(--theme-text-muted); }

/* ---------- Estado vazio ---------- */
.hl-emptybox {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 6px; padding: clamp(28px, 4vw, 44px) 24px;
  background: #FFF; border: 1px solid var(--theme-panel-border);
  border-radius: var(--border-radius-sm-plus);
}
.hl-emptybox__ic { display: grid; place-items: center; width: 52px; height: 52px; margin-bottom: 8px; border-radius: var(--border-radius-sm); background: var(--theme-surface-muted); color: var(--color-surface-pure); }
.hl-emptybox__ic svg { width: 26px; height: 26px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.hl-emptybox__title { margin: 0; font-weight: 700; font-size: 16px; color: var(--theme-text-heading); }
.hl-emptybox__sub { margin: 0 0 14px; font-size: 14px; color: var(--color-surface-pure); }
.hl-emptybox__cta {
  display: inline-flex; align-items: center; gap: 8px;
  min-height: 40px; padding: 9px 18px;
  border-radius: var(--border-radius-sm);
  border: 1.5px solid var(--color-accent-pale); background: #FFF;
  color: var(--color-accent-dark); font: inherit; font-weight: 700; font-size: 14px;
  cursor: pointer; transition: border-color var(--motion-dur-fast) var(--motion-ease), background var(--motion-dur-fast) var(--motion-ease);
}
.hl-emptybox__cta:hover { border-color: var(--color-accent-pure); background: var(--color-accent-tinted); }
.hl-emptybox__cta svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }

/* ---------- Responsivo ---------- */
@media (max-width: 980px) {
  .hl-turmas { grid-template-columns: 1fr; }
}
@media (max-width: 768px) {
  .hl-sec__head { flex-wrap: wrap; gap: 6px; }
  /* sem largura para as duas coisas lado a lado: a busca desce, inteira */
  .hl-head { flex-direction: column; align-items: stretch; gap: var(--spacing-xxxs); }
  /* No estreito o agrupamento ocupa a linha, e a busca vai junto. */
  .hl-head__dir { flex: 1 1 auto; flex-wrap: wrap; }
  .hl-head__busca { flex: 1 1 100%; }
  .hl-head__busca .cmdk__panel { left: 4px; right: 4px; width: auto; }
}
