/* =============================================================================
   Página de orçamento — Sergio DoCarmo Services
   Tokens: "Sergio Do Carmo Design System" (DOCUMENTACAO.md §5).
   =============================================================================
   Ferramenta de campo, não site: o Sergio usa isto na frente do cliente, num
   serviço que ele faz há 15 anos. Rótulo curto, valor grande, alvo de toque
   grande, nenhum texto explicativo. O único texto que entra é o que carrega
   dado — preço da tabela, o que ele vem cobrando, e o aviso de que gravar é
   definitivo.

   Tema único claro, de propósito: o iPad é usado em casa de cliente, com luz
   variando, e um tema só é um tema testado. `body` pinta o fundo explicitamente.
   ============================================================================= */

:root {
  --brand: #2d9e3f;
  --brand-dark: #25852f;
  --lime: #8cc53f;
  --ink: #0f1410;
  --ink-2: #1a2318;
  --grey: #f5f5f5;
  --line: #e5e5e5;
  --text: #111;
  --muted: #777;
  --danger: #b3261e;

  --r-btn: 8px;
  --r-card: 16px;
  --r-pill: 100px;

  /* Alvo de toque mínimo confortável com a mão suja de tinta, em pé. */
  --tap: 56px;

  --gap: 12px;
  --pad: 20px;
}

/* ── Inter ────────────────────────────────────────────────────────────────────
   A fonte vem junto com a página, não de CDN. Nomear "Inter" na pilha sem
   carregar nada é o que esta folha fazia antes: no iPad a Inter não existe
   instalada, então o Safari caía calado no San Francisco e a tela nunca desenhou
   um caractere da marca. Um <link> para o Google Fonts consertaria só metade —
   o serviço é na casa do cliente, com sinal ruim, e a fonte que depende da rede
   é a fonte que falta na hora errada.

   Um arquivo variável por subconjunto cobre 400–900 (§5 do design system).
   `swap`: o texto aparece na hora, com a fonte de sistema, e troca quando a
   Inter chega. Fonte: Google Fonts, Inter v20, licença OFL. */
@font-face {
  font-family: Inter;
  font-style: normal;
  font-weight: 400 900;
  font-display: swap;
  src: url("/static/fonts/inter-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
                 U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
                 U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: Inter;
  font-style: normal;
  font-weight: 400 900;
  font-display: swap;
  src: url("/static/fonts/inter-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
                 U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
                 U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

* { box-sizing: border-box; }

/* Qualquer `display:` de classe vence o `[hidden]` da folha do navegador. Sem isto,
   esconder um elemento pelo atributo simplesmente não funciona — e o sintoma é a
   tela mostrar o que deveria estar oculto, sem nenhum erro. */
[hidden] { display: none !important; }

html, body {
  margin: 0;
  padding: 0;
  height: 100%;
}

body {
  background: #fff;
  color: var(--text);
  font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  font-size: 17px;
  line-height: 1.45;
  -webkit-text-size-adjust: 100%;
  -webkit-tap-highlight-color: transparent;
}

/* Nada de seleção acidental ao arrastar com o dedo, exceto onde se digita. */
body { -webkit-user-select: none; user-select: none; }
input, textarea { -webkit-user-select: text; user-select: text; }

/* ── Estrutura ────────────────────────────────────────────────────────────── */

.app {
  display: flex;
  flex-direction: column;
  min-height: 100%;
  max-width: 760px;
  margin: 0 auto;
}

.top {
  position: sticky;
  top: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  gap: var(--gap);
  padding: 14px var(--pad);
  background: var(--ink);
  color: #fff;
}

.top .mark {
  font-weight: 800;
  letter-spacing: -0.02em;
  font-size: 15px;
}
.top .mark span { color: var(--lime); }

.top .back {
  appearance: none;
  border: 0;
  background: transparent;
  color: #fff;
  font: inherit;
  font-size: 15px;
  padding: 6px 10px 6px 0;
  cursor: pointer;
}
.top .back[hidden] { display: none; }

.dots { margin-left: auto; display: flex; gap: 6px; }
.dot { width: 7px; height: 7px; border-radius: var(--r-pill); background: #ffffff33; }
.dot.on { background: var(--lime); }

.screen { padding: var(--pad); padding-bottom: 120px; flex: 1; }
.screen[hidden] { display: none; }

h1 {
  font-size: 27px;
  line-height: 1.2;
  font-weight: 800;
  letter-spacing: -0.02em;
  margin: 0 0 20px;
}

/* Micro-rótulo em maiúsculas, espaçado, como no design system — mas em verde escuro,
   não no lime que o §5 pede. O lime é uma cor de fundo escuro: sobre branco dá 2,06:1,
   e isto é texto de 11px. O verde escuro dá 4,69:1. O lime segue onde ele funciona,
   sobre o `--ink` da barra de cima (9,02:1): a marca e os pontos de passo. */
.eyebrow {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--brand-dark);
  margin: 24px 0 8px;
}
.eyebrow:first-child { margin-top: 0; }

/* Marca de "isto vai criar registro novo no Jobber". Vive colada ao nome do
   cliente na revisão, que é para onde o olho vai antes de gravar. */
.tag {
  margin-left: 10px;
  padding: 3px 10px;
  border-radius: var(--r-pill);
  background: var(--brand);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  vertical-align: middle;
}

/* Linha do cliente já escolhido: mesma forma do match, mas não é botão. */
.item.still { cursor: default; }
.btn.tight { min-height: 44px; padding: 0 18px; font-size: 15px; }

/* ── Leitor de QR ─────────────────────────────────────────────────────────── */

.pass-row { display: flex; gap: var(--gap); align-items: flex-end; }
.pass-row .field { flex: 1; margin: 0; }

/* Fundo preto e nao o branco da pagina: o contraste ajuda a mirar, e a camera
   ocupa a tela inteira sem competir com nada. */
.scan-bg {
  position: fixed;
  inset: 0;
  z-index: 50;
  background: #000;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.scan-bg video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  position: absolute;
  inset: 0;
}
/* Moldura de mira. Nao recorta nada — a leitura usa o quadro inteiro; ela existe
   para a pessoa saber onde por o cartao. */
.scan-alvo {
  position: relative;
  width: min(70vw, 70vh);
  aspect-ratio: 1;
  border: 3px solid var(--lime);
  border-radius: var(--r-card);
  box-shadow: 0 0 0 100vmax rgba(0, 0, 0, .45);
}
.scan-acoes {
  position: absolute;
  bottom: max(28px, env(safe-area-inset-bottom));
  display: flex;
  gap: var(--gap);
}
.scan-acoes .btn { background: #fff; }
.scan-bg .err { position: absolute; top: 28px; max-width: 80vw; }

/* ── Campos ───────────────────────────────────────────────────────────────── */

.field { margin-bottom: 14px; }

.field > label {
  display: block;
  font-size: 12px;
  font-weight: 600;
  color: var(--muted);
  margin-bottom: 5px;
}

input[type="text"], input[type="tel"], input[type="email"],
input[type="password"], input[type="number"] {
  width: 100%;
  min-height: var(--tap);
  padding: 0 14px;
  font: inherit;
  color: var(--text);
  background: #fff;
  border: 1.5px solid var(--line);
  border-radius: var(--r-btn);
}

input:focus-visible, button:focus-visible, .chip:focus-visible, .card:focus-visible {
  outline: 3px solid var(--brand);
  outline-offset: 2px;
}

.row { display: flex; gap: var(--gap); }
.row > * { flex: 1; min-width: 0; }

/* Preço: o número é o assunto da tela, então ele é o maior elemento dela. */
.price-wrap { position: relative; }
.price-wrap .cur {
  position: absolute;
  left: 14px;
  top: 50%;
  transform: translateY(-50%);
  font-size: 26px;
  font-weight: 700;
  color: var(--muted);
  pointer-events: none;
}
input.price {
  min-height: 68px;
  padding-left: 38px;
  font-size: 30px;
  font-weight: 700;
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
}

.hint {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 14px;
  margin-top: 7px;
  font-size: 13px;
  color: var(--muted);
  font-variant-numeric: tabular-nums;
}
.hint b { color: var(--text); font-weight: 600; }
.hint .obs b { color: var(--brand-dark); }
.hint .warn { color: var(--danger); }

/* ── Chips ────────────────────────────────────────────────────────────────── */

.chips { display: flex; flex-wrap: wrap; gap: 8px; }

.chip {
  appearance: none;
  min-height: 46px;
  padding: 0 18px;
  font: inherit;
  font-size: 15px;
  font-weight: 500;
  color: var(--text);
  background: #fff;
  border: 1.5px solid var(--line);
  border-radius: var(--r-pill);
  cursor: pointer;
}
.chip[aria-pressed="true"] {
  background: var(--brand);
  border-color: var(--brand);
  color: #fff;
  font-weight: 600;
}
.chip.down[aria-pressed="true"] { background: var(--ink-2); border-color: var(--ink-2); }

/* O bloco de motivos entra logo abaixo da dica de preço; sem isto o `:first-child`
   do eyebrow zera a margem e o rótulo cola no número. */
.motivos-slot { margin-top: 14px; }
.motivos-slot .eyebrow { margin-top: 0; }

/* ── Cartões ──────────────────────────────────────────────────────────────── */

.cards { display: grid; gap: 10px; grid-template-columns: 1fr 1fr; }
@media (max-width: 560px) { .cards { grid-template-columns: 1fr; } }

.card {
  appearance: none;
  display: block;
  width: 100%;
  text-align: left;
  padding: 18px;
  font: inherit;
  background: var(--grey);
  border: 1.5px solid transparent;
  border-radius: var(--r-card);
  cursor: pointer;
}
.card[aria-pressed="true"] { border-color: var(--brand); background: #fff; }
.card .t { font-size: 19px; font-weight: 700; letter-spacing: -0.01em; }
.card .s { font-size: 13px; color: var(--muted); margin-top: 3px; }

/* Linha de item (ambiente, bloco, cliente encontrado) */
.item {
  display: flex;
  align-items: center;
  gap: var(--gap);
  width: 100%;
  min-height: var(--tap);
  padding: 14px 16px;
  margin-bottom: 8px;
  font: inherit;
  text-align: left;
  background: #fff;
  border: 1.5px solid var(--line);
  border-radius: var(--r-card);
  cursor: pointer;
}
.item .grow { flex: 1; min-width: 0; }
.item .t { font-weight: 600; }
.item .s {
  font-size: 13px;
  color: var(--muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.item .v { font-weight: 700; font-variant-numeric: tabular-nums; }
.item.match { border-color: var(--brand); background: #f4fbf5; }

.add {
  width: 100%;
  min-height: var(--tap);
  font: inherit;
  font-weight: 600;
  color: var(--brand-dark);
  background: #fff;
  border: 1.5px dashed var(--line);
  border-radius: var(--r-card);
  cursor: pointer;
}

/* ── Botões ───────────────────────────────────────────────────────────────── */

.btn {
  appearance: none;
  min-height: var(--tap);
  padding: 0 24px;
  font: inherit;
  font-size: 17px;
  font-weight: 600;
  border-radius: var(--r-btn);
  border: 1.5px solid transparent;
  cursor: pointer;
}
.btn.primary { background: var(--brand); color: #fff; }
.btn.primary:active { background: var(--brand-dark); }
.btn.primary:disabled { background: var(--line); color: var(--muted); cursor: default; }
.btn.ghost { background: #fff; border-color: var(--line); color: var(--text); }
.btn.danger { background: var(--danger); color: #fff; }
.btn.wide { width: 100%; }

/* ── Barra inferior ───────────────────────────────────────────────────────── */

.bar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 20;
  display: flex;
  align-items: center;
  gap: var(--gap);
  max-width: 760px;
  margin: 0 auto;
  padding: 12px var(--pad) calc(12px + env(safe-area-inset-bottom));
  background: #fff;
  border-top: 1px solid var(--line);
}
.bar[hidden] { display: none; }
.bar .total { flex: 1; min-width: 0; }
.bar .total .k {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--muted);
}
.bar .total .v {
  font-size: 24px;
  font-weight: 800;
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
}
.bar .btn { flex: 0 0 auto; }

/* ── Folha (editor de ambiente) ───────────────────────────────────────────── */

.sheet-bg {
  position: fixed;
  inset: 0;
  z-index: 30;
  background: #0f1410cc;
  display: flex;
  align-items: flex-end;
  justify-content: center;
}
.sheet-bg[hidden] { display: none; }

.sheet {
  width: 100%;
  max-width: 760px;
  max-height: 92vh;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  background: #fff;
  border-radius: var(--r-card) var(--r-card) 0 0;
  padding: var(--pad);
  padding-bottom: calc(var(--pad) + env(safe-area-inset-bottom));
}
.sheet h2 {
  font-size: 22px;
  font-weight: 800;
  letter-spacing: -0.02em;
  margin: 0 0 18px;
}
.sheet-actions { display: flex; gap: var(--gap); margin-top: 22px; }
.sheet-actions .btn { flex: 1; }

/* ── Documento (revisão) ──────────────────────────────────────────────────── */

.doc {
  background: var(--grey);
  border-radius: var(--r-card);
  padding: var(--pad);
  font-size: 15px;
}
.doc .area { margin-bottom: 16px; }
.doc .area > .h {
  font-weight: 700;
  display: flex;
  justify-content: space-between;
  gap: var(--gap);
}
.doc .surf { margin: 6px 0 0 14px; }
.doc .surf > .n { font-size: 14px; }
.doc .steps { font-size: 13px; color: var(--muted); margin-left: 14px; }
.doc .terms {
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid var(--line);
  font-size: 13px;
  color: var(--muted);
  white-space: pre-wrap;
  max-height: 220px;
  overflow-y: auto;
}

.warnbox {
  display: flex;
  gap: var(--gap);
  align-items: flex-start;
  margin-top: 18px;
  padding: 16px;
  background: #fff5f4;
  border: 1.5px solid #f2c9c5;
  border-radius: var(--r-card);
  font-size: 15px;
}
.warnbox b { color: var(--danger); }

/* ── Pronto ───────────────────────────────────────────────────────────────── */

.done { text-align: center; padding-top: 40px; }
.done .num {
  font-size: 64px;
  font-weight: 800;
  letter-spacing: -0.04em;
  color: var(--brand);
  font-variant-numeric: tabular-nums;
}
.done .lbl {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--muted);
}
.done .btn { margin-top: 28px; }

.pending {
  margin-top: 24px;
  padding: 14px 16px;
  text-align: left;
  background: #fffaf0;
  border: 1.5px solid #f0dfb8;
  border-radius: var(--r-card);
  font-size: 14px;
}
.pending ul { margin: 6px 0 0; padding-left: 18px; }

/* ── Estados ──────────────────────────────────────────────────────────────── */

.err {
  margin-top: 12px;
  padding: 12px 14px;
  background: #fff5f4;
  border: 1.5px solid #f2c9c5;
  border-radius: var(--r-btn);
  color: var(--danger);
  font-size: 15px;
}
.err[hidden] { display: none; }

.busy { opacity: 0.55; pointer-events: none; }

.empty { color: var(--muted); font-size: 15px; padding: 8px 0 16px; }

@media (prefers-reduced-motion: no-preference) {
  .sheet { animation: up 0.18s ease-out; }
  @keyframes up { from { transform: translateY(14px); } }
}
