/* Poucas telas, uma folha de estilo. Sem CDN, sem framework, sem JavaScript.
 *
 * A identidade é a da Grabatus, a mesma do procom e do site: fundo slate
 * escuro, superfície um degrau acima, borda discreta, acento cyan `#0e7490`.
 * Aqui ela é escrita à mão em vez de vir do Tailwind — este projeto não carrega
 * framework de CSS, e reproduzir as fichas custa menos que introduzir um.
 * Escuro é o padrão, como no procom; claro existe para quem usa de dia.
 *
 * A tela existe para sustentar uma decisão de cada vez. Por isso o próximo
 * passo é a única coisa grande, e todo o resto — tabela, número, filtro — é
 * material de consulta que não deve competir com ele.
 */

/* ─────────────────────────────  fichas  ─────────────────────────────
 * Os números são os do Tailwind que a Grabatus usa: slate para as
 * superfícies, cyan da marca para o acento, rose e amber para os avisos.
 */

/* Cada cor é declarada **uma vez**, em `light-dark(claro, escuro)`. Quem
 * escolhe entre as duas é o `color-scheme` da raiz, e é só ele que a classe
 * do `<html>` precisa trocar:
 *
 *   sem classe  → `light dark` → o que o sistema operacional disser
 *   .theme-light → `light`      → claro, contrariando o sistema
 *   .theme-dark  → `dark`       → escuro, idem
 *
 * A alternativa seria repetir a paleta inteira dentro de um `@media` e de
 * novo dentro de cada classe. Três cópias das mesmas vinte cores divergem na
 * primeira vez que alguém ajusta uma delas — e divergem em silêncio, porque
 * só uma das cópias está visível de cada vez.
 */

:root {
  color-scheme: light dark;

  --bg: light-dark(#f8fafc, #020617);          /* slate-50 · slate-950 */
  --surface: light-dark(#ffffff, #0f172a);     /* branco · slate-900 */
  --surface-2: light-dark(#f1f5f9, #1e293b);   /* slate-100 · slate-800 */
  --ink: light-dark(#0f172a, #f1f5f9);         /* slate-900 · slate-100 */
  --muted: light-dark(#475569, #94a3b8);       /* slate-600 · slate-400 */
  --faint: #64748b;                            /* slate-500, serve nos dois */
  --line: light-dark(#e2e8f0, #1e293b);        /* slate-200 · slate-800 */
  --line-strong: light-dark(#cbd5e1, #334155); /* slate-300 · slate-700 */

  --accent: #0e7490;                           /* cyan-700 — a cor da marca */
  --accent-hover: light-dark(#155e75, #06b6d4);
  --accent-ink: #ffffff;
  --accent-soft: light-dark(#ecfeff, #164e63);
  /* Link sobre fundo escuro precisa clarear; sobre fundo claro, escurecer. */
  --accent-text: light-dark(#0e7490, #67e8f9);

  --warn: light-dark(#b45309, #fbbf24);
  --warn-soft: light-dark(#fffbeb, #451a03);
  --danger: light-dark(#be123c, #fda4af);
  --danger-line: light-dark(#fda4af, #9f1239);
  --danger-soft: light-dark(#fff1f2, #4c0519);

  --radius: 1rem;          /* rounded-2xl */
  --radius-sm: 0.5rem;     /* rounded-lg */
  /* Sombra não é cor, então `light-dark()` não cabe nela — cabe na cor dela. */
  --shadow-tint: light-dark(rgb(15 23 42 / 6%), rgb(0 0 0 / 40%));
  --shadow-cast: light-dark(rgb(15 23 42 / 22%), rgb(0 0 0 / 80%));
  --shadow: 0 1px 2px var(--shadow-tint);
  --shadow-lift: 0 1px 2px var(--shadow-tint), 0 12px 32px -16px var(--shadow-cast);
}

/* A escolha explícita ganha do sistema. Só isto, porque só isto basta. */
:root.theme-light {
  color-scheme: light;
}

:root.theme-dark {
  color-scheme: dark;
}

/* ─────────────────────────────  base  ───────────────────────────── */

*,
*::before,
*::after {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue",
    Arial, sans-serif;
  font-size: 1rem;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

/* A navegação tem dois estados, e o padrão é a **gaveta**: fechada, atrás de um
 * ícone, com uma barra fina no topo. A coluna ancorada é o caso especial — tela
 * larga e sem a preferência de recolher.
 *
 * A ordem importa. Escrito ao contrário (coluna ancorada como padrão, gaveta
 * dentro de um `@media`), as regras da gaveta precisariam ser repetidas: uma
 * vez para o telefone e outra para a coluna recolhida na tela larga. Duas
 * cópias da mesma gaveta divergem na primeira vez que alguém ajusta uma.
 *
 * Deslogado não há para onde navegar, e o `body` é uma coluna só. */
body.has-side {
  min-height: 100vh;
}

main {
  max-width: 64rem;
  margin: 0 auto;
  padding: 2.25rem 1.75rem 5rem;
  width: 100%;
}

/* As telas de uma coluna só (entrar, formulários) leem melhor estreitas: uma
 * linha de 60rem obriga o olho a varrer de volta a cada quebra. */
main.narrow {
  max-width: 30rem;
}

/* A agenda é a exceção: sete colunas em 64rem dariam pouco mais de 8rem por
 * dia, e um retângulo de meia hora não caberia com o título dentro. */
main.wide {
  max-width: 84rem;
}

a {
  color: var(--accent-text);
  text-decoration-thickness: 1px;
  text-underline-offset: 0.15em;
}

a:hover {
  color: var(--accent-hover);
}

/* Um anel visível só para quem navega pelo teclado — o `:focus-visible` evita
 * o anel sobrando depois de um clique de mouse. */
:focus-visible {
  outline: 2px solid var(--accent-hover);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}

h1,
h2,
h3 {
  color: var(--ink);
  text-wrap: balance;
}

h1 {
  font-size: clamp(1.5rem, 1.25rem + 1vw, 1.875rem);
  line-height: 1.25;
  letter-spacing: -0.025em;
  font-weight: 700;
  margin: 0 0 0.5rem;
}

h2 {
  font-size: 1.125rem;
  line-height: 1.4;
  letter-spacing: -0.015em;
  font-weight: 650;
  margin: 3rem 0 0.25rem;
}

p {
  margin: 0 0 1rem;
}

.muted {
  color: var(--muted);
}

.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  font-size: 0.6875rem;
  font-weight: 650;
  color: var(--muted);
  margin: 0 0 0.6rem;
}

/* O ponto antes do modo: sinal de estado sem custar uma palavra a mais. */
.eyebrow::before {
  content: "";
  width: 0.45rem;
  height: 0.45rem;
  border-radius: 50%;
  background: currentColor;
  opacity: 0.7;
}

.lede {
  color: var(--muted);
  max-width: 58ch;
  margin: 0 0 1.75rem;
}

/* ────────────────────────  coluna lateral  ───────────────────────── */

/* As âncoras não ocupam espaço: elas existem só para o `:target` ter em que
 * pegar. `scroll-margin` evita que pular para elas empurre a página. */
.menu-anchor {
  display: block;
  height: 0;
  scroll-margin-top: 100vh;
}

.side {
  display: flex;
  flex-direction: column;
  gap: 1.75rem;
  padding: 1.5rem 1rem;
  background: var(--surface);
  border-right: 1px solid var(--line);
  overflow-y: auto;

  /* Gaveta: fora da tela, por cima de tudo, e ela mesma rolando. */
  position: fixed;
  inset: 0 auto 0 0;
  z-index: 60;
  width: min(17rem, 84vw);
  transform: translateX(-100%);
  transition: transform 0.18s ease;
  box-shadow: var(--shadow-lift);
}

#menu:target ~ .side {
  transform: none;
}

#menu:target ~ .menu-veil {
  display: block;
}

/* O véu é o que faz tocar fora fechar — e é um link, não um `div`, para
 * funcionar sem script. */
.menu-veil {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 50;
  background: rgb(0 0 0 / 45%);
}

.side-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
}

.topbar-menu {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.5rem 1rem;
  background: var(--surface);
  border-bottom: 1px solid var(--line);
  position: sticky;
  top: 0;
  z-index: 40;
}

.topbar-menu .brand {
  font-size: 1.05rem;
  padding: 0;
}

.topbar-inbox {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  margin-left: auto;
  color: var(--muted);
  text-decoration: none;
}

/* O ícone é o alvo do dedo: 44px, o mínimo de todo guia de toque. */
.menu-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  height: 2.75rem;
  margin: -0.4rem;
  border-radius: var(--radius-sm);
  color: var(--ink);
  text-decoration: none;
}

.menu-toggle:hover {
  background: var(--surface-2);
}

.menu-dock {
  margin: 0;
}

/* O botão de recolher no topo da coluna. Escondido por padrão porque o padrão
 * é a gaveta, e recolher uma gaveta não quer dizer nada — ela já não divide
 * espaço com o conteúdo. Ele aparece exatamente onde o × desaparece: são os
 * dois lados do mesmo par, um por estado. */
.menu-dock-top {
  display: none;
  margin: 0;
}

/* `<button>` com cara de link de ícone: o irmão dele é um `<a>`, e os dois
 * precisam parecer o mesmo controle. */
.menu-dock-top .menu-toggle {
  border: 0;
  background: none;
  cursor: pointer;
  font: inherit;
}

/* ─────────────  a coluna ancorada: tela larga e sem recolher  ─────────────
 *
 * `48rem` é o mesmo ponto em que a agenda vira um dia por vez — abaixo dele
 * não há largura para uma coluna de 15rem e conteúdo ao lado. */
@media (min-width: 48rem) {
  body.has-side:not(.menu-oculto) {
    display: grid;
    grid-template-columns: 15rem minmax(0, 1fr);
  }

  body.has-side:not(.menu-oculto) .side {
    /* `height` cheia, não `align-self: start`: com o segundo a coluna termina
     * onde o conteúdo dela acaba e a borda morre no meio da tela. */
    position: sticky;
    inset: auto;
    top: 0;
    z-index: auto;
    width: auto;
    height: 100vh;
    transform: none;
    box-shadow: none;
  }

  /* Ancorada, a barra do ícone não tem função — e o botão de fechar tampouco:
   * fechar o que está ancorado é recolher, que é outro botão.
   *
   * O do rodapé sai junto: com o de cima visível seriam dois controles para a
   * mesma ação, e o de baixo é o que ninguém achava. Recolhida, ele volta —
   * é por ele que a coluna é ancorada de novo. */
  body.has-side:not(.menu-oculto) .topbar-menu,
  body.has-side:not(.menu-oculto) .menu-close,
  body.has-side:not(.menu-oculto) .menu-dock,
  body.has-side:not(.menu-oculto) .menu-veil {
    display: none;
  }

  body.has-side:not(.menu-oculto) .menu-dock-top {
    display: block;
  }
}

.brand {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  font-size: 1.25rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  text-decoration: none;
  color: var(--ink);
  padding: 0 0.65rem;
}

/* As três estrelas. O arquivo é o mesmo do favicon, usado aqui como máscara
 * — máscara lê só o canal alfa, então a cor vem daqui e acompanha o tema em
 * vez de ficar presa ao cyan gravado no SVG. */
.brand::before {
  content: "";
  flex: none;
  width: 1.6rem;
  height: 1.6rem;
  background: var(--accent-text);
  -webkit-mask: url("../img/stelle.5c9faad96914.svg") center / contain no-repeat;
  mask: url("../img/stelle.5c9faad96914.svg") center / contain no-repeat;
}

.side-nav {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
}

.side-nav a {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  color: var(--muted);
  text-decoration: none;
  font-size: 0.9375rem;
  padding: 0.5rem 0.65rem;
  border-radius: var(--radius-sm);
}

/* O ícone da seção em que se está acende junto com o texto. */
.side-nav a[aria-current="page"] .icon {
  color: var(--accent-text);
}

/* Quantos itens esperam no inbox. Fica à direita, longe do rótulo, para
 * informar sem competir com ele. */
.badge {
  margin-left: auto;
  min-width: 1.35rem;
  padding: 0 0.35rem;
  border-radius: 999px;
  background: var(--accent-soft);
  color: var(--accent-text);
  font-size: 0.75rem;
  font-variant-numeric: tabular-nums;
  text-align: center;
}

/* O grupo das ferramentas. O nome do grupo faz a separação sozinho — uma
 * linha divisória ali seria a segunda marca para dizer a mesma coisa. */
.side-group,
.theme-label {
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--faint);
}

.side-group {
  padding: 0 0.65rem 0.25rem;
}

.side-nav a:hover {
  color: var(--ink);
  background: var(--surface-2);
}

/* Saber em que tela se está não deveria exigir ler o endereço. */
.side-nav a[aria-current="page"] {
  color: var(--ink);
  font-weight: 600;
  background: var(--surface-2);
}

.side-foot {
  margin-top: auto;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 0.9rem;
  padding: 0 0.65rem;
  font-size: 0.875rem;
}

.side-account {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
}

.side-foot .account {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  min-width: 0;
  color: var(--muted);
  text-decoration: none;
}

/* Nome longo não pode empurrar o "sair" para fora da coluna. As reticências
 * ficam no `span`, não no link: `text-overflow` não atravessa um contêiner
 * flex, e o link virou um para acomodar o ícone. */
.side-foot .account .name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.side-foot .account:hover {
  color: var(--ink);
}

/* ── tema: claro, escuro, automático ── */

.theme-switch {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  margin: 0;
}

.theme-options {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  padding: 1px;
  background: var(--line);
  border-radius: var(--radius-sm);
  overflow: hidden;
}

/* Botão de tema não herda o botão do sistema: aqui ele é um segmento de um
 * controle de três, e o preenchimento cheio brigaria com o próximo passo, que
 * é a única coisa da tela que tem direito a chamar atenção. */
.theme-options button {
  padding: 0.3rem 0.1rem;
  border: 0;
  border-radius: 0;
  background: var(--surface);
  color: var(--muted);
  font: inherit;
  font-size: 0.75rem;
  cursor: pointer;
}

.theme-options button:hover {
  background: var(--surface-2);
  color: var(--ink);
}

.theme-options button[aria-pressed="true"] {
  background: var(--accent-soft);
  color: var(--accent-text);
  font-weight: 600;
}

.theme-options button:first-child {
  border-radius: calc(var(--radius-sm) - 1px) 0 0 calc(var(--radius-sm) - 1px);
}

.theme-options button:last-child {
  border-radius: 0 calc(var(--radius-sm) - 1px) calc(var(--radius-sm) - 1px) 0;
}

/* Deslogado: só a marca, numa faixa. */
.topbar {
  display: flex;
  align-items: center;
  padding: 0 1.5rem;
  min-height: 3.5rem;
  background: var(--surface);
  border-bottom: 1px solid var(--line);
}

/* ─────────────────────────────  ícones  ───────────────────────── */

/* O sprite existe para ser referenciado, nunca desenhado. `display: none`
 * quebra o `<use>` em alguns navegadores; tirá-lo do fluxo com tamanho zero
 * não quebra em nenhum. */
.sprite {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden;
}

/* Tamanho em `em` e cor em `currentColor`: o ícone acompanha o texto ao lado
 * sem que ninguém precise ajustar os dois. */
.icon {
  flex: none;
  width: 1.15em;
  height: 1.15em;
  color: inherit;
  vertical-align: -0.18em;
}

h1.with-icon,
h2.with-icon {
  display: flex;
  align-items: center;
  gap: 0.6rem;
}

h1.with-icon .icon {
  width: 0.85em;
  height: 0.85em;
  color: var(--accent-text);
}

/* ─────────────────────────  o próximo passo  ───────────────────── */

/* A única coisa grande da tela. A faixa colorida à esquerda diz, antes da
 * leitura, de que tipo é a decisão: trabalhar, decidir, revisar. */
.step {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow-lift);
  padding: 1.5rem 1.75rem;
  overflow: hidden;
}

.step::before {
  content: "";
  position: absolute;
  inset: 0 auto 0 0;
  width: 3px;
  background: var(--accent);
}

.step h1 {
  font-size: clamp(1.375rem, 1.15rem + 0.9vw, 1.75rem);
  margin: 0 0 1.25rem;
  text-wrap: pretty;
}

.step .step-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem;
  margin-top: 1.25rem;
}

.step .step-actions form {
  margin: 0;
}

/* Decidir e fechar sessão esquecida são interrupções, não trabalho: mudam de
 * cor para não se confundirem com "toque agora". */
.step--decide::before,
.step--close_stale_session::before {
  background: var(--warn);
}

.step--decide .eyebrow,
.step--close_stale_session .eyebrow {
  color: var(--warn);
}

/* Nada a fazer não é um erro nem uma conquista: é silêncio. */
.step--empty::before {
  background: var(--line-strong);
}

/* ─────────────────────────────  números  ───────────────────────── */

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(9.5rem, 1fr));
  gap: 0.75rem;
  margin: 1.5rem 0 0;
  padding: 0;
  list-style: none;
}

.card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 1rem 1.15rem;
}

.figure {
  display: block;
  font-size: 1.75rem;
  line-height: 1.15;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.025em;
}

.label {
  display: block;
  color: var(--muted);
  font-size: 0.8125rem;
  line-height: 1.35;
  margin-top: 0.15rem;
}

/* ─────────────────────────────  tabelas  ───────────────────────── */

/* O invólucro é quem rola no telefone. Rolagem no próprio `table` quebra a
 * borda arredondada e o cabeçalho gruda torto. */
.table-wrap {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow-x: auto;
  margin-top: 0.75rem;
}

.grid {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.9375rem;
}

.grid th,
.grid td {
  text-align: left;
  padding: 0.75rem 1rem;
  vertical-align: top;
}

.grid thead th {
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.07em;
  font-weight: 650;
  color: var(--muted);
  border-bottom: 1px solid var(--line);
  white-space: nowrap;
}

.grid tbody tr + tr td {
  border-top: 1px solid var(--line);
}

.grid tbody tr:hover td {
  background: var(--surface-2);
}

.grid td small {
  display: block;
  font-size: 0.8125rem;
  color: var(--muted);
  margin-top: 0.1rem;
}

/* Números em coluna só se comparam quando alinham. */
.grid .num {
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* Parado há muito tempo é a única linha que pede atenção. */
.grid tr.stale td {
  background: var(--warn-soft);
}

.grid tr.stale:hover td {
  background: color-mix(in srgb, var(--warn) 16%, transparent);
}

/* Vazio com borda tracejada, como no procom: diz "não há nada" sem parecer
 * uma linha de dado que deu errado. */
.grid .empty {
  color: var(--faint);
  padding: 2rem 1rem;
  text-align: center;
}

.actions {
  white-space: nowrap;
}

.actions a {
  font-size: 0.875rem;
  margin-right: 0.7rem;
  text-decoration: none;
}

.actions a:hover {
  text-decoration: underline;
}

/* ─────────────────────────────  filtros  ───────────────────────── */

.filters {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  flex-wrap: wrap;
  margin: 1.25rem 0 0;
}

/* `:not(.button)` não é rebuscado: `.filters a` tem especificidade maior que
 * `.button`, e sem a exclusão a cor do filtro venceria a do botão — texto
 * escuro sobre fundo de acento, ilegível. */
.filters a:not(.button) {
  color: var(--muted);
  text-decoration: none;
  font-size: 0.875rem;
  padding: 0.3rem 0.8rem;
  border-radius: 999px;
  border: 1px solid var(--line-strong);
}

.filters a:not(.button):hover {
  color: var(--ink);
  background: var(--surface-2);
}

.filters a.on {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--accent-ink);
  font-weight: 600;
}

.filters a.on:hover {
  background: var(--accent);
  color: var(--accent-ink);
}

/* Empurra a ação principal para a direita, longe dos filtros. */
.filters .spacer {
  margin-left: auto;
}

/* O zoom da agenda: quatro degraus, do comprimido ao que cabe uma frase dentro
 * de meia hora. Fica junto dos filtros porque é da mesma natureza — muda o que
 * se vê, não o que existe. */
.zoom {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
  padding: 0.15rem 0.4rem 0.15rem 0.5rem;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  color: var(--muted);
}

.zoom .icon {
  margin-right: 0.15rem;
  opacity: 0.75;
}

.filters .zoom a.zoom-step {
  /* Alvo de toque: no telefone, quatro números colados são quatro erros. */
  min-width: 1.75rem;
  padding: 0.2rem 0;
  border: 0;
  border-radius: 999px;
  text-align: center;
  font-size: 0.8125rem;
  font-variant-numeric: tabular-nums;
}

.filters .zoom a.zoom-step.on {
  background: var(--accent);
  color: var(--accent-ink);
  font-weight: 600;
}

/* ─────────────────────────  formulários  ───────────────────────── */

form.stack {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 1.35rem 1.5rem;
  box-shadow: var(--shadow);
}

/* Dentro do passo o formulário é continuação do cartão, não outro cartão. */
.step form.stack {
  background: none;
  border: 0;
  border-radius: 0;
  padding: 0;
  box-shadow: none;
}

form.stack p {
  margin: 0 0 1rem;
}

form.stack p:last-of-type {
  margin-bottom: 1.25rem;
}

form.stack label {
  display: block;
  font-size: 0.875rem;
  font-weight: 550;
  color: var(--ink);
  margin-bottom: 0.3rem;
}

form.inline {
  display: inline-block;
  margin: 0 0.5rem 0 0;
}

input,
select,
textarea {
  display: block;
  width: 100%;
  max-width: 26rem;
  padding: 0.5rem 0.75rem;
  font: inherit;
  color: var(--ink);
  background: var(--bg);
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
}

textarea {
  min-height: 6rem;
  resize: vertical;
}

input:focus,
select:focus,
textarea:focus {
  outline: none;
  border-color: var(--accent-hover);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-hover) 25%, transparent);
}

input[type="checkbox"] {
  display: inline-block;
  width: auto;
  accent-color: var(--accent-hover);
}

.helptext {
  display: block;
  font-size: 0.75rem;
  color: var(--faint);
  margin-top: 0.3rem;
}

.errorlist {
  list-style: none;
  padding: 0;
  margin: 0.35rem 0 0;
  font-size: 0.875rem;
  color: var(--danger);
}

/* ─────────────────────────────  botões  ───────────────────────── */

button,
.button {
  display: inline-block;
  padding: 0.5rem 1rem;
  font: inherit;
  font-size: 0.9375rem;
  font-weight: 600;
  line-height: 1.4;
  cursor: pointer;
  border: 1px solid var(--accent);
  border-radius: var(--radius-sm);
  background: var(--accent);
  color: var(--accent-ink);
  text-decoration: none;
  white-space: nowrap;
}

button:hover,
.button:hover {
  background: var(--accent-hover);
  border-color: var(--accent-hover);
  color: var(--accent-ink);
}

button:active,
.button:active {
  transform: translateY(1px);
}

/* Ação secundária: presente, sem disputar com a primária. */
button.ghost,
.button.ghost {
  background: transparent;
  color: var(--ink);
  border-color: var(--line-strong);
}

button.ghost:hover,
.button.ghost:hover {
  background: var(--surface-2);
  color: var(--ink);
  border-color: var(--line-strong);
}

/* Destrutivo só ganha cor na hora de confirmar. */
button.danger,
.button.danger {
  background: var(--danger-soft);
  border-color: var(--danger-line);
  color: var(--danger);
}

button.danger:hover,
.button.danger:hover {
  background: var(--danger-line);
  border-color: var(--danger-line);
  color: #fff;
}

button.link,
.link {
  background: none;
  border: none;
  color: var(--muted);
  text-decoration: underline;
  text-underline-offset: 0.15em;
  padding: 0;
  font-weight: 400;
  font-size: 0.875rem;
}

button.link:hover,
.link:hover {
  background: none;
  color: var(--ink);
}

/* ─────────────────────────────  avisos  ───────────────────────── */

.messages {
  list-style: none;
  padding: 0;
  margin: 0 0 1.5rem;
}

.msg {
  padding: 0.7rem 1rem;
  border-radius: var(--radius-sm);
  border: 1px solid var(--line-strong);
  background: var(--surface);
  margin-bottom: 0.5rem;
  font-size: 0.9375rem;
}

.msg.warning {
  border-color: var(--warn);
  background: var(--warn-soft);
  color: var(--warn);
}

.msg.error {
  border-color: var(--danger-line);
  background: var(--danger-soft);
  color: var(--danger);
}

.msg.success {
  border-color: var(--accent);
  background: var(--accent-soft);
}

/* ─────────────────────────────  agenda  ───────────────────────── */

/* A grade da semana. Nenhum script: a posição de cada retângulo vem calculada
 * do servidor em `planning/agenda.py`, e aqui só existe a moldura.
 *
 * `--hours` chega no elemento, escrito pelo template, e diz quantas linhas de
 * hora a semana precisa — a faixa desenhada cresce quando há compromisso às
 * 6h ou às 23h e volta ao padrão quando não há.
 */

.agenda {
  --row: 3.25rem;
  --gutter: 3.5rem;
  /* Largura de um dia quando a semana vira um-dia-por-vez, no telefone. A
   * conta desconta o eixo das horas e a margem lateral da página. */
  --day: calc(100vw - var(--gutter) - 3.75rem);

  margin-top: 1.25rem;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: var(--shadow);
  overflow: hidden;
}

.agenda-head,
.agenda-body {
  display: grid;
  grid-template-columns: var(--gutter) repeat(7, minmax(0, 1fr));
}

.agenda-head {
  border-bottom: 1px solid var(--line-strong);
  background: var(--surface-2);
}

.agenda-daylabel {
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: 0.4rem;
  padding: 0.6rem 0.25rem;
  border-left: 1px solid var(--line);
}

.agenda-daylabel .dow {
  font-size: 0.75rem;
  text-transform: lowercase;
  letter-spacing: 0.04em;
  color: var(--muted);
}

.agenda-daylabel .dom {
  font-variant-numeric: tabular-nums;
  font-weight: 600;
}

/* Hoje é a única coluna marcada. Marcar mais de uma coisa é não marcar nada. */
.agenda-daylabel.is-today {
  color: var(--accent-text);
  box-shadow: inset 0 -2px 0 var(--accent);
}

.agenda-daylabel.is-today .dow {
  color: var(--accent-text);
}

.agenda-body .agenda-gutter {
  display: grid;
  grid-auto-rows: var(--row);
}

/* Quando a semana não cabe e desliza na horizontal, a coluna das horas fica.
 * Sem isto, rolar até sexta-feira leva embora a única referência de que hora é
 * cada linha — e uma grade sem eixo é uma parede de retângulos. */
.agenda-gutter {
  position: sticky;
  left: 0;
  /* Acima dos retângulos, que estão em 2: eles passariam por baixo do rótulo
   * e as duas coisas apareceriam misturadas durante a rolagem. */
  z-index: 3;
  background: var(--surface);
}

.agenda-head .agenda-gutter {
  background: var(--surface-2);
}

.agenda-gutter .hour {
  padding-right: 0.5rem;
  font-size: 0.7rem;
  font-variant-numeric: tabular-nums;
  text-align: right;
  color: var(--faint);
  /* O rótulo senta na linha da hora, não no meio da faixa. */
  transform: translateY(-0.45em);
}

.agenda-col {
  position: relative;
  display: grid;
  grid-auto-rows: var(--row);
  /* Altura explícita, e não a soma das linhas: é contra ela que a posição em
   * porcentagem de cada retângulo é resolvida. */
  height: calc(var(--hours) * var(--row));
  border-left: 1px solid var(--line);
}

/* Fim de semana existe, mas não é dia de trabalho: um degrau de fundo basta
 * para o olho separar sem que a coluna vire aviso. */
.agenda-col.is-weekend {
  background: color-mix(in srgb, var(--surface-2) 45%, transparent);
}

.agenda-col.is-today {
  background: color-mix(in srgb, var(--accent-soft) 22%, transparent);
}

.agenda-col .rule {
  border-top: 1px solid var(--line);
}

.agenda-col .rule:first-child {
  border-top: 0;
}

.agenda-col .now {
  position: absolute;
  left: 0;
  right: 0;
  height: 0;
  border-top: 2px solid var(--danger);
  z-index: 3;
  pointer-events: none;
}

.agenda-col .now::before {
  content: "";
  position: absolute;
  top: -4px;
  left: -3px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--danger);
}

/* ── os retângulos ── */

.slot {
  position: absolute;
  z-index: 2;
  /* O retângulo virou link para o cartão abrir por `:target`. Sem isto ele
   * herdaria a cor e o sublinhado de link e a grade viraria uma lista azul. */
  color: inherit;
  text-decoration: none;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  gap: 0.05rem;
  /* Meia hora tem 24px de altura: o padding fino é o que ainda deixa o título
   * legível sem empurrá-lo para fora. */
  padding: 0.15rem 0.35rem;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  /* Retângulos vizinhos não podem se encostar, ou a divisa some. */
  margin-right: 2px;
  font-size: 0.72rem;
  line-height: 1.25;
  min-height: 1.1rem;
}

.slot-title {
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.slot-time,
.slot-detail {
  font-variant-numeric: tabular-nums;
  opacity: 0.85;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* O ocupado é fato de fora e não se discute: cinza, atrás. A sessão é decisão
 * do sistema e é ela que a pessoa precisa enxergar: cyan, na frente. */
.slot--block {
  background: var(--surface-2);
  border-color: var(--line-strong);
  color: var(--muted);
}

.slot--session {
  background: var(--accent-soft);
  border-color: var(--accent);
  color: var(--ink);
}

/* Compromisso que atravessa a meia-noite perde o canto do lado do corte: o
 * retângulo continua na coluna vizinha, e o canto arredondado diria que
 * acabou ali. */
.slot.clipped-start {
  border-top-left-radius: 0;
  border-top-right-radius: 0;
  border-top-style: dashed;
}

.slot.clipped-end {
  border-bottom-left-radius: 0;
  border-bottom-right-radius: 0;
  border-bottom-style: dashed;
}

.agenda-nav .agenda-range {
  font-variant-numeric: tabular-nums;
  align-self: center;
}

.legend {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.8125rem;
  color: var(--muted);
}

/* A estrela da legenda é a mesma da marca: sessão do plano é coisa do PTL. */
.legend--session .icon {
  color: var(--accent-text);
}

/* ────────────────────────────  pomodoro  ───────────────────────── */

.pomodoro {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.5rem;
  margin-top: 1.5rem;
}

.pomodoro .filters {
  justify-content: center;
  margin: 0;
}

.pomodoro .filters button[aria-pressed="true"] {
  border-color: var(--accent);
  background: var(--accent-soft);
  color: var(--accent-text);
}

/* Tempo digitado. Vinte e cinco minutos é a receita, não uma lei. */
.minutes-own {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: -0.75rem 0 0;
  font-size: 0.875rem;
  color: var(--muted);
}

.minutes-own input {
  width: 5rem;
  padding: 0.35rem 0.6rem;
  font-size: 0.875rem;
  text-align: center;
  font-variant-numeric: tabular-nums;
}

.minutes-own button {
  padding: 0.35rem 0.85rem;
  font-size: 0.8125rem;
}

/* Quando o tempo no anel veio daqui, e não dos três botões. */
.minutes-own.is-chosen input {
  border-color: var(--accent);
  color: var(--accent-text);
}

.dial-wrap {
  position: relative;
  width: min(20rem, 74vw);
  aspect-ratio: 1;
}

.dial {
  width: 100%;
  height: 100%;
  /* Zero às doze horas, e não às três, que é onde o SVG começa a desenhar. */
  transform: rotate(-90deg);
}

.dial-track,
.dial-run {
  fill: none;
  stroke-width: 10;
  stroke-linecap: round;
}

.dial-track {
  stroke: var(--line);
}

.dial-run {
  stroke: var(--accent);
  /* `stroke-dasharray` e o comprimento da volta são escritos pelo script, que
   * é quem sabe o raio; aqui fica só o que não depende dele. */
  transition: stroke-dashoffset 240ms linear;
}

/* Parado, o anel é uma promessa; andando, ele é a coisa mais viva da tela. */
.pomodoro.is-running .dial-run {
  stroke: var(--accent-hover);
}

.pomodoro.is-done .dial-run {
  stroke: var(--warn);
}

.dial-face {
  position: absolute;
  inset: 0;
  margin: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: clamp(2.75rem, 12vw, 4rem);
  font-weight: 300;
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.02em;
  /* Sem `tabular-nums` o número dança a cada segundo; com ele, fica parado. */
  color: var(--ink);
}

.dial-done {
  margin: 0;
  padding: 0.5rem 1rem;
  border-radius: var(--radius-sm);
  background: var(--warn-soft);
  color: var(--warn);
  font-size: 0.9375rem;
}

.dial-actions {
  display: flex;
  gap: 0.75rem;
}

.dial-actions button {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
}

/* Recorrência desligada continua na lista: apagar perderia o histórico do
 * plano que contou com ela. Mas precisa parecer desligada. */
.is-off {
  opacity: 0.55;
}

.grid code {
  font-size: 0.8125rem;
  color: var(--muted);
  word-break: break-all;
}

/* ───────────────────────────  capacidade  ───────────────────────── */

/* Uma célula do dia é um campo estreito: 21 deles numa tabela só cabem se
 * cada um ocupar o que precisa e nada além. */
.capacity input {
  width: 6.5rem;
  padding: 0.3rem 0.5rem;
  font-size: 0.875rem;
  text-align: center;
  font-variant-numeric: tabular-nums;
}

/* O nome do dia atravessa as três linhas de energia; a borda de cima separa
 * um dia do outro sem precisar de uma linha divisória a mais. */
.capacity .capacity-day {
  vertical-align: top;
  padding: 0.75rem 1rem;
  text-align: left;
  font-weight: 600;
  white-space: nowrap;
  border-top: 1px solid var(--line-strong);
}

.capacity tbody + tbody td {
  border-top: 1px solid var(--line-strong);
}

.capacity .capacity-day small {
  display: block;
  font-weight: 400;
  font-size: 0.75rem;
  color: var(--faint);
  font-variant-numeric: tabular-nums;
}

/* Rótulo que só o leitor de tela lê. Cada campo precisa de um — 21 caixas de
 * número sem nome são 21 caixas idênticas para quem não enxerga a tabela. */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ─────────────────  o relatório de inviabilidade  ───────────────── */

/* Não é aviso de erro, e por isso não usa a cor de erro. Quando o plano não
 * fecha, isto é a resposta — o que sai e quanto falta por semana. */
.report {
  margin-top: 2rem;
  padding: 1.25rem 1.5rem;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: var(--shadow);
}

.report h2 {
  margin: 0;
  font-size: 1.0625rem;
}

.report h2 .icon {
  color: var(--accent-text);
}

/* Só o que não coube ganha a cor do aviso, e só na borda: pintar o bloco
 * inteiro faria a resposta parecer falha. */
.report--short {
  border-color: var(--warn);
}

.report--short h2 .icon {
  color: var(--warn);
}

.report-line {
  margin: 0.5rem 0 0;
  font-size: 1rem;
  color: var(--ink);
}

.report .cards {
  margin: 1.25rem 0 0;
}

.report .table-wrap {
  margin-top: 1rem;
}

/* ─────────────────────────────  rodapé  ───────────────────────── */

.footnote {
  margin-top: 2.5rem;
  padding-top: 1.25rem;
  border-top: 1px solid var(--line);
  font-size: 0.875rem;
  color: var(--faint);
}

/* Sete dias não cabem em tela estreita, e o aperto começa muito antes do
 * telefone: a 60rem cada coluna tem pouco mais de 7rem e o título de uma tarefa
 * já não cabe. Espremer até caber daria uma grade ilegível — a semana inteira
 * continua ali, deslizando na horizontal, com a coluna das horas fixa. */
@media (max-width: 64rem) {
  .agenda {
    overflow-x: auto;
  }

  .agenda-head,
  .agenda-body {
    min-width: 46rem;
  }
}

/* No telefone, sete colunas em 375px dão 45px por dia: não cabe título, não
 * cabe hora, não cabe nada. Aqui a semana deixa de ser sete colunas espremidas
 * e vira **um dia por vez** — cada coluna ocupa a tela inteira e o deslize
 * encaixa no próximo dia, em vez de parar no meio de dois.
 *
 * A coluna das horas fica fixa à esquerda o tempo todo (`sticky` mais acima):
 * é o eixo, e sem ele um dia sozinho na tela não diz nada.
 *
 * Sem JavaScript: quem faz o encaixe é `scroll-snap`, e quem faz a largura é
 * uma conta com `100vw` menos o que a margem da página e o eixo já tomaram. */
@media (max-width: 48rem) {
  .agenda {
    scroll-snap-type: x mandatory;
  }

  .agenda-head,
  .agenda-body {
    min-width: 0;
    grid-template-columns: var(--gutter) repeat(7, var(--day));
  }

  .agenda-daylabel,
  .agenda-col {
    scroll-snap-align: start;
  }

  /* O rótulo do dia cresce junto com a coluna e passa a caber por extenso. */
  .agenda-daylabel {
    justify-content: flex-start;
    padding-left: 0.9rem;
  }
}

@media (max-width: 30rem) {
  .agenda {
    /* `main` aperta para 1rem de cada lado neste ponto. */
    --day: calc(100vw - var(--gutter) - 2.25rem);
  }
}

/* ─────────────────────────────  telefone  ───────────────────────── */

@media (max-width: 48rem) {
  main.wide {
    max-width: 100%;
  }
}

/* ───────────────────────  tabela vira cartão  ───────────────────────
 *
 * Uma tabela de cinco colunas num visor de 375px só cabe rolando de lado, e
 * rolar de lado dentro de uma página que já rola para baixo é o gesto que
 * ninguém acerta: ou se perde a coluna que identifica a linha, ou se perde a
 * que tem o valor. No telefone cada linha vira um cartão e cada célula ganha o
 * rótulo da sua coluna, tirado do `data-label`.
 *
 * O `thead` não some com `display: none` — some da vista, mas continua no
 * documento, porque é ele que dá nome às colunas para quem usa leitor de tela.
 *
 * A capacidade fica de fora: ela é matriz de verdade — dias contra energias —,
 * e uma matriz achatada em cartões perde o que ela existe para mostrar.
 */
@media (max-width: 48rem) {
  .table-wrap:has(.grid:not(.capacity)) {
    overflow-x: visible;
    border: 0;
    background: transparent;
  }

  .grid:not(.capacity) thead {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }

  .grid:not(.capacity),
  .grid:not(.capacity) tbody,
  .grid:not(.capacity) tr,
  .grid:not(.capacity) td {
    display: block;
    width: 100%;
  }

  .grid:not(.capacity) tbody tr {
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    padding: 0.35rem 0;
    margin-bottom: 0.6rem;
  }

  .grid:not(.capacity) tbody tr + tr td {
    border-top: 0;
  }

  .grid:not(.capacity) td {
    display: grid;
    grid-template-columns: 7rem minmax(0, 1fr);
    align-items: baseline;
    gap: 0.75rem;
    padding: 0.35rem 1rem;
  }

  .grid:not(.capacity) td::before {
    content: attr(data-label);
    font-size: 0.6875rem;
    text-transform: uppercase;
    letter-spacing: 0.07em;
    font-weight: 650;
    color: var(--muted);
  }

  /* Célula vazia não vira linha em branco com rótulo pendurado. */
  .grid:not(.capacity) td:empty {
    display: none;
  }

  /* A linha de "nada aqui ainda" fala pela tabela inteira e não tem coluna. */
  .grid:not(.capacity) td.empty {
    display: block;
    text-align: center;
  }

  .grid:not(.capacity) td.empty::before {
    display: none;
  }

  /* O número deixa de ser alinhado à direita: numa lista de uma coluna, a
   * direita é longe do rótulo e o olho perde o par. */
  .grid:not(.capacity) td.num {
    text-align: left;
  }

  /* A coluna de ações vira uma faixa de botões, cada um com alvo de dedo. */
  .grid:not(.capacity) td.actions {
    grid-template-columns: 1fr;
    gap: 0.4rem;
  }

  .grid:not(.capacity) td.actions::before {
    display: none;
  }
}

/* ─────────────────  o dedo é maior que o cursor  ─────────────────
 *
 * No mouse, um alvo de 24px acerta. No polegar, não: a recomendação de todo
 * guia de toque é ~44px, e abaixo disso o erro deixa de ser exceção. Aqui
 * crescem os alvos que ficam em fila — filtros, ações de linha, paginação —,
 * que são justamente os que ficam colados uns nos outros. */
@media (pointer: coarse) {
  .filters a:not(.button),
  .grid td.actions a,
  .grid td.actions button {
    min-height: 2.75rem;
    display: inline-flex;
    align-items: center;
  }

  .filters .zoom a.zoom-step {
    min-height: 2.25rem;
    min-width: 2.25rem;
    justify-content: center;
  }
}

@media (max-width: 30rem) {
  main {
    padding: 1.5rem 1rem 4rem;
  }

  /* A barra de filtros vira uma pilha de linhas cheias em vez de uma sopa de
   * pílulas de meia largura — e o espaçador some, porque empurrar a ação para
   * a direita não quer dizer nada quando cada coisa tem sua própria linha. */
  .filters .spacer {
    display: none;
  }

  h2 {
    margin-top: 2rem;
  }


  .step {
    padding: 1.25rem;
  }

  /* No telefone o botão de largura inteira é mais fácil de acertar do que um
   * alvo de 40px espremido ao lado de outro. */
  .step-actions > form,
  .step-actions > form > button,
  .step-actions > .button {
    width: 100%;
    text-align: center;
  }
}

@media (prefers-reduced-motion: reduce) {
  * {
    transition: none !important;
    animation: none !important;
  }

  button:active,
  .button:active {
    transform: none;
  }
}

/* Área — de que parte da vida o nó é. O tom fraco marca a que foi herdada de
   um nó acima, para distinguir declaração de herança sem gastar uma coluna. */
.area {
  display: inline-block;
  padding: 0.1rem 0.5rem;
  border-radius: 999px;
  font-size: 0.82rem;
  white-space: nowrap;
  background: light-dark(#e8eaf2, #2c3040);
  color: light-dark(#3a4056, #c3c8da);
}

.area-inherited {
  background: transparent;
  color: light-dark(#6b7186, #878da0);
  box-shadow: inset 0 0 0 1px light-dark(#d6d9e4, #3a3f52);
}


/* ── Cartão da agenda ────────────────────────────────────────────────────────
 *
 * Popup sem JavaScript: o retângulo é um link para `#<âncora>` e a regra
 * `:target` revela o diálogo correspondente. O projeto carrega um único script
 * (o relógio do pomodoro, que precisa de tempo que ande) e um popup não
 * justifica o segundo — `:target` faz isto desde sempre, e de quebra o estado
 * fica na URL, então um cartão aberto pode ser compartilhado por link.
 *
 * O véu vem antes do cartão no HTML para ficar atrás dele sem `z-index`
 * disputado: clicar em qualquer ponto de fora fecha, porque o véu inteiro é
 * um link de volta para `#semana`. */
.modal {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 50;
  place-items: center;
  padding: 1rem;
}

.modal:target {
  display: grid;
}

.modal-veil {
  position: absolute;
  inset: 0;
  background: light-dark(rgb(20 22 30 / 45%), rgb(0 0 0 / 60%));
}

.modal-card {
  position: relative;
  width: min(28rem, 100%);
  max-height: 85vh;
  overflow-y: auto;
  padding: 1.1rem 1.25rem;
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: 0 12px 40px rgb(0 0 0 / 28%);
}

.modal-card h2 {
  margin: 0 0 0.15rem;
  font-size: 1.05rem;
  line-height: 1.3;
}

.modal-when {
  margin: 0 0 0.9rem;
  color: var(--muted);
  font-size: 0.85rem;
}

.modal-when em {
  font-style: normal;
  opacity: 0.8;
}

/* Rótulo e valor em duas colunas. `dl` sem grade empilha os dois e o cartão
 * vira uma lista de palavras soltas. */
.modal-facts {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.35rem 0.9rem;
  margin: 0 0 1rem;
  font-size: 0.9rem;
}

.modal-facts dt {
  color: var(--muted);
}

.modal-facts dd {
  margin: 0;
}

/* Sumiu da origem: continua desenhado porque apagar seria a sincronização
 * destruindo informação, mas precisa parecer o que é — riscado e apagado, para
 * ninguém contá-lo como compromisso ao olhar a semana. A legenda no cartão diz
 * a mesma coisa por escrito: cor sozinha não informa quem não a distingue.
 *
 * A mesma marca serve à sessão de objetivo arquivado ou pausado: o plano é uma
 * fotografia, e o que ele prometeu para um projeto que saiu do ar é ruína — não
 * some da grade, mas também não pode parecer combinado de hoje. */
.slot--orphaned {
  opacity: 0.55;
  border-style: dashed;
}

.slot--orphaned .slot-title {
  text-decoration: line-through;
}

/* O preparo é lista, e não par rótulo/valor: cada linha tem hora própria e
 * costuma cair na véspera do compromisso. */
.modal-prep-title {
  margin: 0 0 0.4rem;
  font-size: 0.82rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--muted);
}

.modal-prep {
  margin: 0 0 1rem;
  padding-left: 1.1rem;
  font-size: 0.9rem;
  line-height: 1.5;
}

.modal-prep b {
  color: var(--muted);
  font-variant-numeric: tabular-nums;
}

.modal-close {
  display: inline-block;
  padding: 0.35rem 0.8rem;
  border-radius: var(--radius-sm);
  background: light-dark(#eceef5, #2c3040);
  color: inherit;
  text-decoration: none;
  font-size: 0.88rem;
}


/* ── Ajuda ───────────────────────────────────────────────────────────────────
 *
 * O manual dentro do sistema. É a única tela de texto corrido do projeto, e
 * por isso é a única com medida de leitura própria: as outras são tabela,
 * grade ou formulário, onde a linha longa não atrapalha.
 *
 * Nenhuma cor nova. Uma tela que explica o sistema precisa parecer o sistema —
 * se ela tiver paleta própria, quem chega concluiu que é outro produto. */
.doc {
  max-width: 46rem;
  line-height: 1.65;
}

.doc h2 {
  margin-top: 2.75rem;
  padding-top: 1.5rem;
  border-top: 1px solid var(--line);
}

.doc h3 {
  margin-top: 1.75rem;
}

.doc p {
  margin: 0.85rem 0;
}

/* O índice: âncoras, não JavaScript. O estado fica na URL, então uma seção
 * pode ser mandada por link — que é como se aponta uma regra para alguém. */
.doc-toc {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 0.5rem;
  margin: 1.5rem 0 2rem;
  padding: 0.9rem 1rem;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface);
}

.doc-toc a {
  padding: 0.15rem 0.6rem;
  border-radius: 999px;
  background: var(--surface-2);
  font-size: 0.86rem;
  text-decoration: none;
}

.doc-toc a:hover {
  background: var(--accent-soft);
  color: var(--accent-text);
}

/* Termo e definição em vez de tabela: no telefone a tabela viraria cartão com
 * duas células, que é exatamente um `dl` — com mais marcação e um rótulo
 * repetido em toda linha. */
.terms {
  margin: 1rem 0 1.5rem;
}

.terms dt {
  margin-top: 1rem;
  font-weight: 600;
}

.terms dt:first-child {
  margin-top: 0;
}

.terms dd {
  margin: 0.2rem 0 0;
  color: var(--muted);
}

/* Na lista de ferramentas o termo é a frase que se diz ao Claude; ela precisa
 * parecer fala, não rótulo. */
.terms.tools dt {
  font-weight: 500;
  font-style: italic;
}

.doc-steps {
  margin: 1rem 0 1.5rem;
  padding-left: 1.3rem;
}

.doc-steps li {
  margin: 0.5rem 0;
}

/* O aviso: a regra que morde. Barra no acento em vez de fundo colorido — são
 * onze deles na página, e onze retângulos pintados viram parede. */
.doc-note {
  margin: 1.25rem 0;
  padding: 0.85rem 1rem;
  border-left: 3px solid var(--accent);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  background: var(--surface);
}

.doc-note p {
  margin: 0.5rem 0 0;
  font-size: 0.94rem;
}

.doc-note p:first-child {
  margin-top: 0;
}

.doc code {
  padding: 0.1rem 0.35rem;
  border-radius: 0.3rem;
  background: var(--surface-2);
  font-size: 0.875em;
  word-break: break-word;
}

/* O bloco rola sozinho na horizontal. Sem isto, um documento de exemplo com
 * uma linha longa empurraria a largura da página inteira, e a tela passaria a
 * rolar de lado — no telefone, para sempre. */
.doc-code {
  margin: 1rem 0 1.5rem;
  padding: 0.9rem 1rem;
  overflow-x: auto;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface);
  font-size: 0.84rem;
  line-height: 1.55;
}

.doc-code code {
  padding: 0;
  background: none;
  font-size: inherit;
  white-space: pre;
  word-break: normal;
}

/* O nome de uma ferramenta do MCP, e não um campo qualquer. A distinção é
 * visual porque a página cita as duas coisas na mesma marcação, e confundir
 * `after` (campo) com `capture` (ferramenta) manda a pessoa pedir a coisa
 * errada ao Claude. Há teste: todo `code.tool` desta tela precisa ser uma
 * ferramenta registrada no conector — um manual que cita ferramenta que não
 * existe mente com a autoridade de quem está dentro do sistema. */
.doc code.tool {
  color: var(--accent-text);
}


/* ── Mapa do tópico ──────────────────────────────────────────────────────────
 *
 * Um grafo desenhado sem biblioteca: as coordenadas vêm prontas de
 * `planning/graph.py`, como as da agenda. Setas em SVG numa camada de baixo,
 * caixas em HTML na de cima, ambas na mesma malha de pixels.
 *
 * A caixa é HTML porque precisa de link, de botão e de foco — reimplementar os
 * três dentro de um `<svg>` custaria mais que a folha inteira desta seção. */
.map-wrap {
  margin: 1.5rem 0;
  overflow-x: auto;
  padding-bottom: 0.5rem;
}

.map {
  position: relative;
  width: var(--map-w);
  height: var(--map-h);
  /* O mapa não encolhe: espremer as caixas tornaria o texto ilegível antes de
   * fazer o grafo caber. Quem não tem largura rola — e rolar um grafo é o
   * gesto esperado, ao contrário de rolar uma tabela de lado. */
  min-width: var(--map-w);
}

.map-edges {
  position: absolute;
  inset: 0;
  width: var(--map-w);
  height: var(--map-h);
  color: var(--line-strong);
  pointer-events: none;
}

.map-edge {
  fill: none;
  stroke: currentColor;
  stroke-width: 1.75;
}

.map-node {
  position: absolute;
  left: var(--x);
  top: var(--y);
  width: 208px;
  height: 116px;
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  background: var(--surface);
  box-shadow: var(--shadow);
  overflow: hidden;
}

/* Pausada continua desenhada e continua legível — ela não sumiu, ela está
 * fora do plano por escolha. O tracejado diz "não está valendo agora" sem
 * apagar nada, que é a mesma gramática do bloqueio órfão na agenda. */
.map-node.is-paused {
  border-style: dashed;
  background: var(--surface-2);
}

.map-node.is-paused .map-title a,
.map-node.is-paused .map-progress {
  color: var(--muted);
}

.map-node.is-done {
  border-color: var(--accent);
}

.map-title {
  margin: 0;
  font-size: 0.94rem;
  font-weight: 600;
  line-height: 1.25;
}

.map-title a {
  text-decoration: none;
}

.map-inside {
  margin: 0;
  font-size: 0.74rem;
  color: var(--faint);
}

.map-progress {
  margin: 0.1rem 0 0;
  font-size: 0.82rem;
  color: var(--muted);
  font-variant-numeric: tabular-nums;
}

.map-progress small {
  display: block;
  font-size: 0.72rem;
  color: var(--faint);
}

/* A próxima tarefa é a linha que a caixa existe para mostrar; ela ganha o
 * espaço que sobra e o acento. */
.map-next {
  margin: auto 0 0;
  font-size: 0.8rem;
  line-height: 1.3;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.map-next .label {
  display: block;
  font-size: 0.68rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--accent-text);
}

.map-next--none .label,
.map-next--done .label {
  color: var(--faint);
}

.map-after {
  margin: 0;
  font-size: 0.72rem;
  color: var(--faint);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.map-act {
  position: absolute;
  right: 0.6rem;
  top: 0.5rem;
  margin: 0;
}

.map-act .link {
  font-size: 0.74rem;
}

.map-flag {
  position: absolute;
  right: 0.6rem;
  bottom: 0.5rem;
  margin: 0;
  font-size: 0.68rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--warn);
}

.map-legend {
  font-size: 0.86rem;
}

.empty-state {
  margin: 1.5rem 0;
  padding: 1.25rem;
  border: 1px dashed var(--line-strong);
  border-radius: var(--radius);
  color: var(--muted);
}

.loose {
  margin: 0.75rem 0 0;
  padding-left: 1.2rem;
  line-height: 1.7;
}

/* Mover a hora, dentro do cartão da sessão. Uma linha só: rótulo, campo e
 * botão — o cartão é pequeno, e um formulário empilhado o dobraria de altura
 * para uma ação de dois segundos. */
.modal-move {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0 0 1rem;
  padding-top: 0.75rem;
  border-top: 1px solid var(--line);
  font-size: 0.88rem;
}

.modal-move label {
  color: var(--muted);
}

.modal-move input[type="time"] {
  padding: 0.25rem 0.4rem;
}
