/* Zelo — design system e visual mobile-first, tema claro/escuro automático.
 * Tudo em tokens (:root): cores, tipografia, espaçamento, raios e sombras.
 * Paleta quente esmeralda + papel para transmitir cuidado/calma. */

:root {
  color-scheme: light dark;

  /* ---- Superfícies e texto — CLARO (papel quente) ---- */
  --bg: #F5F1EA;
  --surface: #FFFFFF;
  --surface-2: #F3EEE4;
  --text: #1B1A16;         /* grafite quente */
  --text-soft: #6B655C;
  --border: #E4DDD1;
  --primary: #0E7C66;      /* esmeralda-teal = confiança/saudável */
  --primary-ink: #FFFFFF;
  --accent: #E08A1E;       /* âmbar de serviço — só CTAs e "próximo cuidado" */
  --ring-track: #E8E1D5;

  /* ---- Status ---- */
  --overdue: #C0392B;
  --soon: #B4740E;
  --ok: #2E7D5B;
  --unknown: #9AA3A0;

  /* ---- Cores por categoria (trilho 5px) ---- */
  --cat-motor: #C0392B;
  --cat-freios: #D9772B;
  --cat-pneus: #5B6B7A;
  --cat-fluidos: #0E7490;
  --cat-filtros: #7C5CD6;
  --cat-eletrica: #B08900;
  --cat-inspecao: #0E8577;

  /* ---- Gradiente-herói (topbar e herói de custos) ---- */
  --grad-hero: linear-gradient(160deg, #0E7C66 0%, #0B5F50 100%);
  /* No claro o herói de custos usa o mesmo verde; no escuro ganha tom próprio. */
  --grad-hero-cost: var(--grad-hero);

  /* ---- Tipografia (escala em tokens; elimina tamanhos fracionários) ---- */
  --fs-xs: 12px;
  --fs-sm: 13px;
  --fs-md: 14px;
  --fs-lg: 16px;
  --fs-xl: 20px;
  --fs-2xl: 28px;
  --fs-3xl: 40px;

  /* ---- Espaçamento ---- */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 24px;
  --space-6: 32px;

  /* ---- Raios ---- */
  --radius-sm: 12px;
  --radius-md: 16px;
  --radius-lg: 22px;
  --radius: var(--radius-md);   /* compat com componentes antigos */

  /* ---- Sombra ---- */
  --shadow: 0 1px 3px rgba(27, 26, 22, .08), 0 1px 2px rgba(27, 26, 22, .05);

  /* ---- Fundo do modal ---- */
  --scrim: rgba(20, 19, 15, .55);
}

/* Tema ESCURO (carvão quente, NÃO azul).
 * Vale por preferência do sistema (a menos que o usuário force claro)
 * ou quando data-theme=dark é estampado no <html>. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --bg: #14130F;
    --surface: #1E1C17;
    --surface-2: #26231C;
    --text: #F1EDE4;
    --text-soft: #A79F92;
    --border: #322E27;
    --primary: #34C99E;
    /* Sobre o verde-menta claro do escuro, tinta ESCURA garante contraste (WCAG). */
    --primary-ink: #06251E;
    --accent: #F0A93B;
    --ring-track: #2C2822;
    --overdue: #F4796B;
    --soon: #F0B44A;
    --ok: #4FCB93;
    --unknown: #7E8B85;
    --cat-motor: #F4796B;
    --cat-freios: #F0A15A;
    --cat-pneus: #93A2B2;
    --cat-fluidos: #4BB8CE;
    --cat-filtros: #B79BF0;
    --cat-eletrica: #E9C64A;
    --cat-inspecao: #4FC3A8;
    --grad-hero: linear-gradient(160deg, #1E1C17 0%, #14130F 100%);
    /* Herói de custos no escuro: tom verde sutil para NÃO sumir na superfície. */
    --grad-hero-cost: linear-gradient(160deg, #123A2E 0%, #0D2A21 100%);
    --shadow: 0 2px 6px rgba(0, 0, 0, .45), 0 1px 2px rgba(0, 0, 0, .4);
    --scrim: rgba(0, 0, 0, .6);
  }
}
:root[data-theme="dark"] {
  --bg: #14130F;
  --surface: #1E1C17;
  --surface-2: #26231C;
  --text: #F1EDE4;
  --text-soft: #A79F92;
  --border: #322E27;
  --primary: #34C99E;
  --primary-ink: #06251E;
  --accent: #F0A93B;
  --ring-track: #2C2822;
  --overdue: #F4796B;
  --soon: #F0B44A;
  --ok: #4FCB93;
  --unknown: #7E8B85;
  --cat-motor: #F4796B;
  --cat-freios: #F0A15A;
  --cat-pneus: #93A2B2;
  --cat-fluidos: #4BB8CE;
  --cat-filtros: #B79BF0;
  --cat-eletrica: #E9C64A;
  --cat-inspecao: #4FC3A8;
  --grad-hero: linear-gradient(160deg, #1E1C17 0%, #14130F 100%);
  --grad-hero-cost: linear-gradient(160deg, #123A2E 0%, #0D2A21 100%);
  --shadow: 0 2px 6px rgba(0, 0, 0, .45), 0 1px 2px rgba(0, 0, 0, .4);
  --scrim: rgba(0, 0, 0, .6);
}

* { box-sizing: border-box; margin: 0; padding: 0; }

body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  background: var(--bg);
  color: var(--text);
  -webkit-font-smoothing: antialiased;
  line-height: 1.45;
  font-size: var(--fs-md);
  font-variant-numeric: tabular-nums;
  padding-bottom: env(safe-area-inset-bottom);
}

/* Foco visível global (WCAG 2.4.7) */
:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.btn:focus-visible,
.tab:focus-visible,
.chip:focus-visible,
.card:focus-visible,
.stat:focus-visible,
.icon-btn:focus-visible,
.odometer:focus-visible,
.entry-del:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }

/* ---------------- Topbar ---------------- */

.topbar {
  background: var(--grad-hero);
  color: #fff;
  padding: calc(env(safe-area-inset-top) + var(--space-4)) var(--space-4) var(--space-5);
  border-radius: 0 0 var(--radius-lg) var(--radius-lg);
}
.topbar-inner {
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
  max-width: 640px; margin: 0 auto;
}
.brand { display: flex; align-items: center; gap: var(--space-3); }
.brand-mark {
  background: rgba(255, 255, 255, .14);
  width: 44px; height: 44px; display: grid; place-items: center; border-radius: var(--radius-sm);
}

/* ---------------------------------------------------------------------- *
 * Ícones: SVG inline em vez de emoji.
 *
 * Emoji na interface parece atalho barato até você abrir no iPhone: o sistema
 * renderiza a própria arte, colorida, e o 🚗 entrava VERMELHO num app cuja
 * paleta é esmeralda. Além disso emoji não herda cor, então não dá para
 * distinguir aba ativa de inativa pelo ícone, só pelo texto.
 *
 * SVG com `stroke: currentColor` resolve os dois: mesma família de traço em
 * tudo, e a cor acompanha o estado (aba ativa fica esmeralda, ícone incluído).
 * ---------------------------------------------------------------------- */
.brand-mark svg, .icon-btn svg, .odometer-label svg, .odometer-edit svg, .tab-ico svg {
  display: block; width: 1em; height: 1em;
}
.brand-mark svg { font-size: 22px; opacity: .9; }
.icon-btn svg { font-size: 22px; }
.odometer-label svg { font-size: 26px; opacity: .85; }
.odometer-edit svg { font-size: 17px; }
.tab-ico svg { font-size: 22px; }
/* Wordmark "Zelo": presente, mas como assinatura — não compete com o veículo.
   Caixa alta pequena com tracking positivo lê como marca sem precisar de corpo
   grande, e libera o tamanho para o nome do carro. */
.brand h1 {
  font-size: var(--fs-xs); font-weight: 700; letter-spacing: .10em;
  text-transform: uppercase; opacity: .62; margin: 0;
}
/* HIERARQUIA: o assunto da tela é o CARRO, não a marca do app. O apelido do
   veículo vira o texto forte; o wordmark "Zelo" recua para assinatura. Antes o
   "Zelo" era 20px/800 e o veículo 12px/400 — a marca gritava e o conteúdo
   sussurrava, na tela em que a pessoa quer saber do carro dela. */
.vehicle-line {
  font-size: var(--fs-md); font-weight: 700; opacity: 1;
  margin-top: 2px; text-transform: none; letter-spacing: -.01em;
}
/* Linha técnica: subiu de .6 para .72 — 12px a 60% sobre fundo escuro é leitura
   cansativa, e é aqui que fica o motor, que o usuário confere de vez em quando. */
.vehicle-sub { font-size: var(--fs-xs); opacity: .72; margin-top: 1px; text-transform: none; }
.icon-btn {
  background: rgba(255, 255, 255, .14); border: none; color: #fff;
  width: 44px; height: 44px; border-radius: var(--radius-sm); font-size: var(--fs-xl); cursor: pointer;
  transition: transform .12s ease;
}
.icon-btn:active { transform: scale(.94); }

.odometer {
  margin: var(--space-4) auto 0; max-width: 640px;
  display: flex; align-items: center; gap: var(--space-3); width: 100%;
  background: rgba(255, 255, 255, .12); border: 1px solid rgba(255, 255, 255, .18);
  color: #fff; padding: var(--space-3) var(--space-4); border-radius: 14px; cursor: pointer;
  transition: transform .12s ease;
}
.odometer-label { font-size: var(--fs-xl); }
.odometer-value {
  font-size: var(--fs-xl); font-weight: 800; letter-spacing: -.02em;
  font-variant-numeric: tabular-nums; flex: 1; text-align: left;
}
.odometer-edit { opacity: .75; }
.odometer:active { transform: scale(.99); }

/* ---------------- Content ---------------- */

.content { max-width: 640px; margin: 0 auto; padding: var(--space-4) var(--space-4) calc(84px + env(safe-area-inset-bottom)); }

/* ---------------- Bottom tab bar ---------------- */
.tabbar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
  display: flex; background: var(--surface); border-top: 1px solid var(--border);
  padding-bottom: env(safe-area-inset-bottom);
}
.tab {
  flex: 1; background: none; border: none; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  padding: var(--space-3) 0 var(--space-2); color: var(--text-soft);
  font-size: var(--fs-xs); font-weight: 600; font-family: inherit;
}
.tab-ico { font-size: var(--fs-xl); filter: grayscale(1) opacity(.6); }
.tab-active { color: var(--primary); }
.tab-active .tab-ico { filter: none; }

/* ---------------- Cost view ---------------- */
.cost-summary { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); margin-bottom: var(--space-4); }
.cost-card {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
  padding: var(--space-4); box-shadow: var(--shadow);
}
.cost-card-big { grid-column: 1 / -1; background: var(--grad-hero-cost); color: #fff; border: none; }
.cost-val { font-size: var(--fs-2xl); font-weight: 800; font-variant-numeric: tabular-nums; line-height: 1.1; letter-spacing: -.02em; }
.cost-card-big .cost-val { font-size: var(--fs-3xl); }
.cost-lbl { font-size: var(--fs-xs); color: var(--text-soft); margin-top: 3px; }
.cost-card-big .cost-lbl { color: rgba(255, 255, 255, .82); }
.cost-sub { font-size: var(--fs-xs); color: var(--text-soft); margin-top: var(--space-2); }
.cost-card-big .cost-sub { color: rgba(255, 255, 255, .74); }

.cost-add { display: flex; gap: var(--space-3); margin-bottom: var(--space-4); }
.cost-add .btn { flex: 1; padding: var(--space-3); }

.entry {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm);
  box-shadow: var(--shadow); padding: var(--space-3) var(--space-4); display: flex; align-items: center; gap: var(--space-3);
}
.entry-ico { font-size: var(--fs-xl); width: 34px; height: 34px; display: grid; place-items: center;
  background: var(--surface-2); border-radius: 9px; flex: 0 0 34px; }
.entry-main { flex: 1; min-width: 0; }
.entry-title { font-size: var(--fs-md); font-weight: 700; }
.entry-sub { font-size: var(--fs-xs); color: var(--text-soft); margin-top: 2px; }
.entry-amount { font-size: var(--fs-lg); font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.entry-del {
  background: none; border: none; color: var(--text-soft); font-size: var(--fs-lg); cursor: pointer;
  min-width: 44px; min-height: 44px; display: grid; place-items: center; border-radius: 10px;
}

/* ---------------- Resumo (contadores de status) ---------------- */
/*
 * QUATRO contadores, não três. O quarto é "sem registro", e ele existe porque
 * o resumo precisa dar conta de todos os itens do plano — item que não cai em
 * contador nenhum some da tela, e a ausência lê como "está tudo certo".
 *
 * Em 360px (o Android mediano no Brasil) sobram 328px úteis: menos 3 gaps de
 * 8px dá 76px por coluna, que é o suficiente para o número e um rótulo de duas
 * linhas. Abaixo de 340px cai para 2×2 em vez de espremer.
 */
.summary { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-2); margin-bottom: var(--space-5); }
@media (max-width: 339px) { .summary { grid-template-columns: repeat(2, 1fr); } }
.stat {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
  padding: var(--space-4) var(--space-1); text-align: center; cursor: pointer; box-shadow: var(--shadow);
  min-width: 0;
  display: flex; flex-direction: column; gap: 2px; font-family: inherit; color: var(--text);
  transition: transform .12s ease;
}
.stat:active { transform: scale(.97); }
.stat-num { font-size: var(--fs-2xl); font-weight: 800; line-height: 1; font-variant-numeric: tabular-nums; }
.stat-label { font-size: 11px; line-height: 1.15; color: var(--text-soft); font-weight: 600; overflow-wrap: anywhere; hyphens: auto; }
/*
 * Cinza, nunca âmbar nem vermelho. O âmbar é de "está chegando a hora" e o
 * vermelho é de "passou"; pintar o desconhecido com qualquer um dos dois
 * transformaria falta de informação em urgência — o mesmo erro dos três zeros,
 * com o sinal invertido.
 */
.stat-unknown .stat-num { color: var(--unknown); }
.stat-overdue .stat-num { color: var(--overdue); }
.stat-soon .stat-num { color: var(--soon); }
.stat-ok .stat-num { color: var(--ok); }

/* ---------------- Filtros (chips) ---------------- */
.filters { display: flex; gap: var(--space-2); overflow-x: auto; padding-bottom: var(--space-1); margin-bottom: var(--space-4); -webkit-overflow-scrolling: touch; }
.chip {
  flex: 0 0 auto; background: var(--surface); border: 1px solid var(--border);
  color: var(--text-soft); padding: var(--space-2) var(--space-4); border-radius: 999px; font-size: var(--fs-sm);
  font-weight: 600; cursor: pointer; white-space: nowrap; min-height: 40px; font-family: inherit;
}
.chip-active { background: var(--primary); color: var(--primary-ink); border-color: var(--primary); }

/* ---------------- Cards de manutenção ---------------- */

.list { display: flex; flex-direction: column; gap: var(--space-3); }
.card {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
  box-shadow: var(--shadow); display: flex; overflow: hidden;
}
.card-cat { width: 5px; flex: 0 0 5px; }
.cat-motor { background: var(--cat-motor); }
.cat-freios { background: var(--cat-freios); }
.cat-pneus { background: var(--cat-pneus); }
.cat-fluidos { background: var(--cat-fluidos); }
.cat-filtros { background: var(--cat-filtros); }
.cat-eletrica { background: var(--cat-eletrica); }
.cat-inspecao { background: var(--cat-inspecao); }

.card-body { padding: var(--space-4) var(--space-4) var(--space-3); flex: 1; min-width: 0; }
.card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-3); }
.card-title { font-size: var(--fs-lg); font-weight: 700; letter-spacing: -.01em; }
.card-due { font-size: var(--fs-sm); color: var(--text-soft); margin-top: var(--space-1); font-weight: 600; }
.card-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: var(--space-2); }
.card-last { font-size: var(--fs-xs); color: var(--text-soft); margin-top: 6px; }

.status { flex: 0 0 auto; font-size: var(--fs-xs); font-weight: 600; padding: 3px 9px; border-radius: 999px; white-space: nowrap; }
.status-overdue { background: rgba(192, 57, 43, .12); color: var(--overdue); }
.status-soon { background: rgba(180, 116, 14, .14); color: var(--soon); }
.status-ok { background: rgba(46, 125, 91, .12); color: var(--ok); }
.status-unknown { background: rgba(154, 163, 160, .18); color: var(--unknown); }

/* No escuro, pills mais opacas para não sumirem */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .status-overdue { background: rgba(244, 121, 107, .18); }
  :root:not([data-theme="light"]) .status-soon { background: rgba(240, 180, 74, .18); }
  :root:not([data-theme="light"]) .status-ok { background: rgba(79, 203, 147, .18); }
  :root:not([data-theme="light"]) .status-unknown { background: rgba(126, 139, 133, .22); }
}
:root[data-theme="dark"] .status-overdue { background: rgba(244, 121, 107, .18); }
:root[data-theme="dark"] .status-soon { background: rgba(240, 180, 74, .18); }
:root[data-theme="dark"] .status-ok { background: rgba(79, 203, 147, .18); }
:root[data-theme="dark"] .status-unknown { background: rgba(126, 139, 133, .22); }

.card-overdue { border-left: 0; }
.card-overdue .card-cat { background: var(--overdue); }

.cat-pill {
  font-size: 11px; font-weight: 600; color: #fff; padding: 2px 8px; border-radius: 6px;
}
.tag { font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 6px; }
.tag-4x4 { background: rgba(91, 107, 122, .2); color: var(--text-soft); }
.tag-manual { background: rgba(46, 125, 91, .14); color: var(--ok); }
/* Procedência "prática de oficina": neutro de propósito. O verde é do manual —
   dar o mesmo verde a uma recomendação que o fabricante não faz apagaria
   justamente a diferença que o selo existe para mostrar. */
.tag-practice { background: var(--surface-2); color: var(--text-soft); }
/* Item criado pelo próprio usuário: âmbar, a mesma cor que o app usa para "seu
   cuidado" — distingue do que veio do fabricante sem parecer aviso de erro. */
.tag-mine { background: rgba(224, 138, 30, .16); color: var(--accent); }
/* Data que veio de lembrança, não de registro. Discreto: informa sem alarmar. */
.tag-estimate { background: var(--surface-2); color: var(--text-soft); font-style: italic; }
.interval { font-size: var(--fs-xs); color: var(--text-soft); }

.card-actions { display: flex; gap: var(--space-2); margin-top: var(--space-3); }
.btn {
  border: none; border-radius: 10px; padding: 9px 14px; font-size: var(--fs-sm); font-weight: 600;
  cursor: pointer; font-family: inherit; transition: transform .12s ease;
  /* 44px é o mínimo de alvo de toque das diretrizes da Apple (48 no Material).
     Os botões estavam com 33px de altura: dá para errar num carro em movimento,
     que é literalmente onde este app é usado. inline-flex centra o rótulo sem
     precisar mexer no padding. */
  min-height: 44px;
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
}
.btn:active { transform: scale(.97); }
.btn:disabled { opacity: .5; cursor: default; }
.btn:disabled:active { transform: none; }
.btn-primary { background: var(--primary); color: var(--primary-ink); }
.btn-accent { background: var(--accent); color: #fff; }
.btn-ghost { background: var(--surface-2); color: var(--text-soft); border: 1px solid var(--border); }
.btn-danger { background: rgba(192, 57, 43, .12); color: var(--overdue); }

.empty { text-align: center; color: var(--text-soft); padding: var(--space-6) var(--space-4); font-size: var(--fs-lg); }
/* Estado vazio "rico": ícone + texto, para telas sem nenhum registro. */
.empty-rich { display: flex; flex-direction: column; align-items: center; gap: var(--space-2); padding: var(--space-6) var(--space-4); text-align: center; }
.empty-ico {
  font-size: 40px; line-height: 1; width: 76px; height: 76px; display: grid; place-items: center;
  background: var(--surface-2); border: 1px solid var(--border); border-radius: 999px; margin-bottom: var(--space-2);
}
.empty-rich p { color: var(--text-soft); font-size: var(--fs-md); max-width: 22em; }

/* ---------------- Modal (bottom-sheet) ---------------- */

.modal {
  position: fixed; inset: 0; background: var(--scrim);
  display: none; align-items: flex-end; justify-content: center; z-index: 50;
  padding: 0; backdrop-filter: blur(2px);
}
.modal.open { display: flex; }
/* Durante o onboarding, escurece e desfoca mais o fundo — o app ainda não
 * está configurado, então o conteúdo por trás não deve competir com a folha. */
.modal-onb { background: rgba(10, 9, 7, .82); backdrop-filter: blur(8px); }
.modal-card {
  background: var(--surface); width: 100%; max-width: 640px;
  border-radius: var(--radius-lg) var(--radius-lg) 0 0; padding: var(--space-5) var(--space-4) calc(var(--space-5) + env(safe-area-inset-bottom));
  max-height: 90vh; overflow-y: auto;
  animation: slideup .22s ease;
}
@keyframes slideup { from { transform: translateY(100%); } to { transform: translateY(0); } }
@media (min-width: 680px) {
  .modal { align-items: center; }
  .modal-card { border-radius: var(--radius-lg); }
}

#modal-content h2 { font-size: var(--fs-xl); margin-bottom: 6px; letter-spacing: -.01em; }
#modal-content h3.hist-title { font-size: var(--fs-md); margin: var(--space-4) 0 var(--space-2); color: var(--text-soft); }
.modal-item, .modal-note { color: var(--text-soft); font-size: var(--fs-sm); margin-bottom: var(--space-3); }
.modal-note { background: var(--surface-2); border: 1px solid var(--border); padding: 10px 12px; border-radius: 10px; }

.field { display: flex; flex-direction: column; gap: 6px; margin-bottom: var(--space-3); }
.field > span { font-size: var(--fs-sm); font-weight: 600; color: var(--text-soft); }
.field input, .field select, .field textarea {
  font-family: inherit; font-size: var(--fs-lg); padding: 11px 12px;
  border: 1px solid var(--border); border-radius: 11px; background: var(--surface-2); color: var(--text);
  width: 100%;
}
.field input:focus, .field select:focus, .field textarea:focus { outline: 2px solid var(--primary); border-color: transparent; }
.field-row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); }
.field-check { flex-direction: row; align-items: flex-start; gap: var(--space-3); }
.field-check input { width: 20px; height: 20px; margin-top: 2px; }

.modal-actions { display: flex; gap: var(--space-3); margin-top: var(--space-4); justify-content: flex-end; }
.modal-actions .btn { padding: 12px 18px; }
.modal-actions-split { justify-content: space-between; }

.section-title { font-size: var(--fs-xs); font-weight: 700; color: var(--text-soft); margin: 2px 0 var(--space-2); text-transform: uppercase; letter-spacing: .04em; }
.account-box { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 12px 14px; margin-bottom: var(--space-4); }
.account-box .field { margin-bottom: 10px; }
.account-box .btn { margin-top: 2px; }
.btn-block { width: 100%; margin: 4px 0 12px; }

.hist { list-style: none; display: flex; flex-direction: column; gap: 6px; }
.hist li {
  display: flex; justify-content: space-between; font-size: var(--fs-sm);
  background: var(--surface-2); border: 1px solid var(--border); padding: 8px 12px; border-radius: 9px;
}
.muted { color: var(--text-soft); }
.small { font-size: var(--fs-xs); }

/* ---------------- Estados de interação ---------------- */

/* Hover só em aparelhos com ponteiro fino (mouse) */
@media (hover: hover) {
  .btn:hover { filter: brightness(1.05); }
  .icon-btn:hover, .odometer:hover { background: rgba(255, 255, 255, .2); }
  .chip:hover { border-color: var(--primary); }
  .stat:hover, .card:hover { border-color: var(--primary); }
  .entry-del:hover { color: var(--overdue); }
}

/* Respeita quem pediu menos movimento */
@media (prefers-reduced-motion: reduce) {
  .modal-card { animation: none; }
  .btn, .stat, .odometer, .icon-btn { transition: none; }
  .btn:active, .stat:active, .odometer:active, .icon-btn:active { transform: none; }
}

/* ---------------- Onboarding (primeira abertura) ---------------- */

.onboarding { display: flex; flex-direction: column; }

/* Progresso: passo X de Y + pontinhos */
.onb-progress {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--space-3); margin-bottom: var(--space-4);
}
.onb-step { color: var(--text-soft); font-weight: 600; }
.onb-dots { display: flex; gap: 6px; }
.onb-dot {
  width: 7px; height: 7px; border-radius: 999px;
  background: var(--ring-track); transition: background .2s ease, width .2s ease;
}
.onb-dot-active { background: var(--primary); width: 18px; }

/* Ícone-herói grande no topo de algumas telas */
.onb-hero {
  font-size: 44px; line-height: 1; text-align: center;
  margin: var(--space-3) 0 var(--space-4);
}

.onboarding h2 { font-size: var(--fs-2xl); letter-spacing: -.01em; margin-bottom: var(--space-2); }
.onb-text { color: var(--text-soft); font-size: var(--fs-md); line-height: 1.5; margin-bottom: var(--space-4); }
.onb-error { color: var(--overdue); font-weight: 600; min-height: 1em; margin-top: var(--space-1); }
/* Selo de confiança do plano escolhido (do manual / verificado / rascunho / genérico) */
.onb-plan { color: var(--text-soft); font-weight: 600; margin: calc(var(--space-1) * -1) 0 var(--space-3); }

/* Barra de navegação e botões em coluna */
.onb-nav { margin-top: var(--space-4); }
.onb-actions-col { flex-direction: column; align-items: stretch; gap: var(--space-2); }
.onb-actions-col .btn { width: 100%; }

@media (prefers-reduced-motion: reduce) {
  .onb-dot { transition: none; }
}

/* ----------------------------------------------------------------------- *
 * Assistente de IA (aba de chat)
 * ----------------------------------------------------------------------- */
#view-chat { display: flex; flex-direction: column; }

.chat-log {
  /* Reserva espaço para header + paddings do .content + linha de input + a
     tabbar fixa e a safe-area.

     `dvh` (dynamic viewport height) é o ponto: no Safari do iPhone, `100vh` é a
     viewport SEM a barra de endereço, ou seja MAIOR que a área realmente
     visível. Com vh, a linha de input e o botão Enviar caíam abaixo do que se
     vê — só a borda de cima do campo aparecia acima da tabbar. `dvh` encolhe
     junto com a barra do navegador. O `vh` fica como fallback para navegador
     antigo (a regra seguinte sobrescreve onde dvh existe). */
  height: calc(100vh - 300px - env(safe-area-inset-bottom));
  height: calc(100dvh - 300px - env(safe-area-inset-bottom));
  min-height: 40vh;
  overflow-y: auto; -webkit-overflow-scrolling: touch;
  display: flex; flex-direction: column; gap: var(--space-3);
  padding: var(--space-1) 0 var(--space-4);
}
/* Conversa curta encosta no INPUT, não no topo: com poucas mensagens sobrava
   meia tela vazia entre a última linha e o campo de digitação, e a conversa
   parecia abandonada no alto. É o comportamento de qualquer app de mensagem.
   `margin-top:auto` no primeiro filho em vez de `justify-content:flex-end`
   porque este último já cortou o topo do conteúdo rolável em alguns
   navegadores. */
.chat-log > :first-child { margin-top: auto; }

.chat-msg { display: flex; }
.chat-msg.chat-user { justify-content: flex-end; }
.chat-msg.chat-bot { justify-content: flex-start; }

.chat-bubble {
  max-width: 82%; padding: var(--space-3) var(--space-4);
  border-radius: var(--radius-md); font-size: var(--fs-md); line-height: 1.5;
  box-shadow: var(--shadow); word-wrap: break-word;
}
.chat-user .chat-bubble {
  background: var(--primary); color: var(--primary-ink);
  border-bottom-right-radius: var(--radius-sm);
}
.chat-bot .chat-bubble {
  background: var(--surface); color: var(--text); border: 1px solid var(--border);
  border-bottom-left-radius: var(--radius-sm);
}
.chat-typing { color: var(--text-soft); font-style: italic; }
.chat-notice {
  color: var(--text-soft); font-size: var(--fs-sm); text-align: left;
  padding: var(--space-3); margin: 0;
}

/* O botão fica colado embaixo: com o campo crescendo para cima, centralizar
   faria "Enviar" flutuar no meio de um bloco de texto. */
.chat-input-row {
  display: flex; gap: var(--space-2); align-items: flex-end;
  padding-top: var(--space-2);
}
/*
 * Campo de várias linhas. Era um <input type="text">, que não quebra: a frase
 * corria para o lado e o começo do que a pessoa escreveu sumia — justamente no
 * caso mais comum aqui, que é relatar um serviço inteiro de uma vez.
 *
 * Cresce com o conteúdo (assistantAutoGrow) até `max-height`, e daí em diante
 * rola por dentro, para o composer nunca engolir a conversa.
 */
.chat-input {
  flex: 1; min-width: 0;
  background: var(--surface); color: var(--text);
  border: 1px solid var(--border); border-radius: var(--radius-lg);
  padding: var(--space-3) var(--space-4); font-size: var(--fs-md);
  font-family: inherit; line-height: 1.4;
  resize: none; overflow-y: auto;
  max-height: 8.5em;   /* ~5 linhas */
}
.chat-input:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.chat-input-row .btn { white-space: nowrap; }

/* Chip de estado do plano no topo do chat. */
.chat-plan-chip {
  /* Alinhado ao início da conversa, não centralizado: solto no meio da tela ele
     parecia um selo perdido, sem relação com nada. Encostado à esquerda vira o
     rótulo da conversa que começa logo abaixo. */
  align-self: flex-start; font-size: var(--fs-xs); font-weight: 700;
  padding: 4px 12px; border-radius: 999px; letter-spacing: .02em;
  border: 1px solid var(--border); background: var(--surface-2); color: var(--text-soft);
}
.chat-plan-chip.plan-chip-premium { color: var(--primary-ink); background: var(--primary); border-color: var(--primary); }
.chat-plan-chip.plan-chip-trial { color: var(--accent); border-color: var(--accent); }

/* Cartão amigável de paywall/limite dentro do chat. */
.chat-upgrade {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-md); padding: var(--space-4);
  /* Alinhado à esquerda: um parágrafo de três linhas centralizado força o olho
     a procurar o início de cada linha. Centralizar serve para uma linha só. */
  text-align: left; box-shadow: var(--shadow);
}
.chat-upgrade p { margin: 0 0 var(--space-3); color: var(--text); font-size: var(--fs-sm); line-height: 1.5; }
.chat-upgrade .btn { width: 100%; }

/* ----------------------------------------------------------------------- *
 * Tela de Planos (modal)
 * ----------------------------------------------------------------------- */
.plan-current {
  background: var(--surface-2); border: 1px solid var(--border);
  border-radius: var(--radius-sm); padding: 12px 14px; margin-bottom: var(--space-4);
  font-size: var(--fs-sm); font-weight: 600; color: var(--text);
}
.plan-tier {
  border: 1px solid var(--border); border-radius: var(--radius-md);
  padding: var(--space-4); margin-bottom: var(--space-3); background: var(--surface);
}
.plan-tier-best { border-color: var(--primary); border-width: 2px; }
.plan-tier-current { background: var(--surface-2); }
.plan-tier-head { display: flex; justify-content: space-between; align-items: center; gap: var(--space-2); }
.plan-tier-head strong { font-size: var(--fs-lg); }
.plan-highlight {
  display: inline-block; margin-left: var(--space-2); font-size: var(--fs-xs);
  font-weight: 700; color: var(--primary);
}
.plan-tag {
  font-size: var(--fs-xs); font-weight: 700; color: var(--primary-ink);
  background: var(--primary); padding: 3px 10px; border-radius: 999px; white-space: nowrap;
}
.plan-price { font-size: var(--fs-xl); font-weight: 800; margin: 6px 0 var(--space-3); }
.plan-price-note { font-size: var(--fs-xs); font-weight: 500; color: var(--text-soft); }
.plan-feats { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.plan-feats li { font-size: var(--fs-sm); color: var(--text-soft); padding-left: 22px; position: relative; }
.plan-feats li::before { content: '✓'; position: absolute; left: 0; color: var(--ok); font-weight: 800; }
.chat-input-row .btn:disabled { opacity: .55; }

/* Selo "Verificado" do plano de manutenção.
   Único selo do produto: aparece quando o plano foi confirmado (manual do
   fabricante, consenso de gerações independentes ou uso real). A AUSÊNCIA dele
   é o estado normal e não recebe marcação nenhuma — o app não avisa o usuário
   de que o plano dele é "só um rascunho". Discreto de propósito: informa quem
   procura, sem virar alarme para quem não tem. */
.plan-seal {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: var(--fs-xs); font-weight: 700; color: var(--ok);
  background: color-mix(in srgb, var(--ok) 12%, transparent);
  padding: 2px 8px; border-radius: 999px; white-space: nowrap;
}

/* Zona de ações irreversíveis nos Ajustes.
   Separada por uma régua e afastada da linha de Salvar: antes "Apagar tudo"
   dividia a mesma linha com "Salvar", e no celular o alvo de toque de um ficava
   a milímetros do outro — um erro de dedo apagava o histórico inteiro do carro. */
.danger-zone {
  margin-top: var(--space-5);
  padding-top: var(--space-4);
  border-top: 1px solid var(--border);
}
.danger-zone p { margin: 0 0 var(--space-2); }

/* Aviso de "pagamento em breve" na tela de Planos, no lugar do botão de assinar.
   Enquanto não há checkout, informar é melhor que oferecer: um CTA que revela
   "não dá para comprar" só depois do toque gasta a ação do usuário. */
/* Confirmação de pagamento ao voltar do checkout. Verde de sucesso, no topo da
   tela: é a primeira coisa que a pessoa procura depois de pagar. */
.plan-paid {
  margin: 0 0 var(--space-4); padding: 12px 14px;
  background: color-mix(in srgb, var(--primary) 14%, transparent);
  border: 1px solid var(--primary);
  border-radius: var(--radius-sm);
  font-size: var(--fs-sm); font-weight: 600; color: var(--text);
}
/* Ainda esperando o webhook: âmbar, não verde — nada de comemorar antes. */
.plan-paid-wait {
  background: color-mix(in srgb, var(--warn, #E08A1E) 14%, transparent);
  border-color: var(--warn, #E08A1E); font-weight: 500;
}

.plan-soon {
  margin: var(--space-4) 0 0; padding: 12px 14px;
  background: var(--surface-2); border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  font-size: var(--fs-sm); color: var(--text-soft); text-align: center;
}

/* Seletor mensal/anual na tela de Planos. Segmentado em vez de dois botões
   soltos: comunica "escolha um dos dois" pela forma, sem precisar de rótulo
   explicando, e deixa claro qual está ativo. */
.seg {
  display: flex; gap: 4px; padding: 4px; margin: var(--space-4) 0 var(--space-3);
  background: var(--surface-2); border: 1px solid var(--border);
  border-radius: 999px;
}
.seg button {
  flex: 1; min-height: 40px; border: none; background: none; cursor: pointer;
  font-family: inherit; font-size: var(--fs-sm); font-weight: 700;
  color: var(--text-soft); border-radius: 999px; transition: background .15s ease, color .15s ease;
}
.seg button.seg-on { background: var(--primary); color: var(--primary-ink); }


/* Convite ao feedback no fim das telas. Discreto de propósito: é um convite, não
   uma ação principal — competir com "Marcar como feito" atrapalharia o uso. */
.feedback-cta {
  display: block; width: 100%; margin: var(--space-5) 0 var(--space-4);
  background: none; border: 1px dashed var(--border); border-radius: var(--radius-sm);
  color: var(--text-soft); font-size: var(--fs-sm); font-family: inherit;
  padding: var(--space-4); cursor: pointer; text-align: center;
  min-height: 44px;   /* alvo de toque (mesmo mínimo do resto do app) */
}
.feedback-cta:hover { border-color: var(--primary); color: var(--primary); }

/* Adicionar item ao plano: fica no fim da lista, depois de tudo que o app já
   sabe. É complemento do plano, não a ação principal da tela. */
.add-item-btn { margin-top: var(--space-4); }

/* Selo de essencial/opcional no cabeçalho dos passos do onboarding. */
.onb-badge {
  display: inline-block; vertical-align: middle; margin-left: var(--space-2);
  padding: 2px 8px; border-radius: 999px;
  background: var(--surface-2); color: var(--text-soft);
  font-size: var(--fs-xs); font-weight: 600; text-transform: lowercase;
}
.onb-badge-req { background: rgba(224, 138, 30, .16); color: var(--accent); }
.onb-nav-right { display: flex; gap: var(--space-2); align-items: center; }
/* Linha que confirma o que foi semeado — verde, é a recompensa de ter respondido. */
.onb-seeded { color: var(--ok); font-weight: 600; }

/* ---- Card de item (guia) ------------------------------------------------ *
 * O título do item virou botão. Ele precisa continuar PARECENDO um título — a
 * lista é lida em varredura, e transformar 15 títulos em 15 botões azuis com
 * borda faria a tela inteira gritar. O único sinal permanente é o chevron; o
 * resto do afeto de botão aparece só no toque e no foco.
 * ------------------------------------------------------------------------- */

.card-title-btn {
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
  padding: 2px 0;
  margin: -2px 0;
  border: 0;
  background: none;
  font: inherit;
  color: inherit;
  text-align: left;
  cursor: pointer;
}
.card-title-btn:hover { color: var(--primary); }
.card-title-btn:active { opacity: .7; }
/* Foco visível é acessibilidade, não enfeite: quem navega por teclado precisa
   saber onde está, e o outline padrão some contra o fundo do card. */
.card-title-btn:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 3px;
  border-radius: 6px;
}

.card-title-more {
  font-size: .85em;
  color: var(--text-soft);
  transform: translateY(-1px);
}

.guide-title { margin-bottom: var(--space-3); }

.guide-body { max-height: 60vh; overflow-y: auto; }

.guide-lede { color: var(--text); margin-bottom: var(--space-3); }

.guide-loading {
  color: var(--text-soft);
  font-size: var(--fs-sm);
  margin-bottom: var(--space-3);
}

.guide-sec { margin-top: var(--space-4); }
.guide-sec h3 {
  font-size: var(--fs-sm);
  text-transform: uppercase;
  letter-spacing: .05em;
  color: var(--text-soft);
  margin-bottom: var(--space-2);
}
.guide-sec p { margin: 0; }
/* "Confirme na tampa do bocal" — a origem da especificação, logo abaixo dela.
   Menor e mais apagado de propósito: é instrução de conferência, não o dado. */
.guide-check { font-size: 12px; color: var(--text-soft); }

.guide-list { margin: 0; padding-left: 20px; }
.guide-list li { margin-bottom: 6px; }

.guide-note { font-size: var(--fs-sm); margin-top: var(--space-3); }

/* Garantia de preservação de dados, no convite de atualização de identidade.
   Fica em destaque porque é a única pergunta que a pessoa realmente tem ao ver
   um app pedindo para "atualizar" algo: o que acontece com o que eu já fiz. */
.idu-safe {
  margin: var(--space-3) 0;
  padding: 10px 14px;
  border-left: 3px solid var(--ok, #2e7d5b);
  background: var(--surface-2, rgba(0,0,0,.04));
  border-radius: 8px;
  font-size: var(--fs-sm);
}
