/* Callers here are mostly retirees working a laptop. Big type, high contrast,
   nothing that needs a steady hand. Colours match build_call_list.py's workbook
   so the app and the printed sheet feel like the same thing. */
:root{
  --navy:#1E3A5F; --brass:#8A6D24; --stop:#8C3A2E; --go:#1F6B3A;
  --ink:#1a1d21; --dim:#5d6570; --line:#d9dee5; --bg:#f4f6f9; --card:#fff;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);
  font:17px/1.5 -apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}
main{max-width:1180px;margin:0 auto;padding:18px}
.hidden{display:none !important}
/* an author `display:` beats the UA stylesheet's [hidden] rule, so say it here --
   otherwise the "try the other number" button shows up empty on every voter who
   only has one number on file */
[hidden]{display:none !important}

.bar{background:var(--navy);color:#fff;display:flex;align-items:center;gap:16px;
  padding:11px 20px}
.brand{font-weight:700;letter-spacing:.08em;font-size:15px}
.brand span{font-weight:400;opacity:.75;letter-spacing:.02em}
.bar .who{margin-left:auto;font-weight:600}
.bar .counts{opacity:.85;font-variant-numeric:tabular-nums}
.inline{display:inline}
.link{background:none;border:0;color:#cfe0f5;cursor:pointer;font-size:15px;
  text-decoration:underline;padding:0}
a.link{text-decoration:underline}

.card{background:var(--card);border:1px solid var(--line);border-radius:10px;
  padding:20px;margin-bottom:14px}
h1{font-size:30px;margin:0 0 6px}
h2{font-size:16px;text-transform:uppercase;letter-spacing:.06em;color:var(--brass);
  margin:0 0 10px}
h3{font-size:14px;color:var(--dim);margin:16px 0 6px;font-weight:600}
.lead{font-size:19px;color:var(--dim);margin:.2em 0 1em}
.fine{font-size:14px;color:var(--dim)}
.dim{color:var(--dim)}
.err{color:var(--stop);font-weight:600;margin-top:10px;min-height:1.2em}
.warn{color:var(--stop)}

button{font:inherit}
.big{display:block;width:100%;padding:18px;border:0;border-radius:9px;
  font-size:21px;font-weight:700;color:#fff;cursor:pointer}
.big.go{background:var(--go)}
.big.end{background:var(--stop)}
.big:disabled{background:#9aa3ad;cursor:not-allowed}
.ghost{display:inline-block;margin-top:10px;padding:11px 16px;border:1px solid var(--line);
  background:#fff;border-radius:8px;cursor:pointer;color:var(--dim)}
.ghost.wide{display:block;width:100%}
.chip{padding:11px 15px;margin:0 7px 7px 0;border:1.5px solid var(--line);background:#fff;
  border-radius:20px;cursor:pointer;font-size:16px}
.chip.on{background:var(--navy);border-color:var(--navy);color:#fff}
.chip[data-outcome="STOP"]{border-color:var(--stop);color:var(--stop);font-weight:700}
.chip[data-outcome="STOP"].on{background:var(--stop);border-color:var(--stop);color:#fff}
.row{display:flex;flex-wrap:wrap}

.login{max-width:380px;margin:9vh auto}
.login label{display:block;margin:0 0 14px;font-weight:600}
.login input{display:block;width:100%;margin-top:5px;padding:13px;font-size:18px;
  border:1px solid var(--line);border-radius:8px}

.cols{display:grid;grid-template-columns:1fr 360px;gap:16px}
@media (max-width:900px){.cols{grid-template-columns:1fr}}

.voter h1{font-size:34px}
.voter .meta{color:var(--dim);margin:.2em 0}
.voter .phone{font-size:30px;font-weight:700;letter-spacing:.02em;margin:.35em 0 .1em;
  font-variant-numeric:tabular-nums}
.voter .line{font-size:14px;color:var(--dim);margin:0}
.state{margin-top:12px;font-size:17px;font-weight:600;color:var(--go);min-height:1.3em}

.said textarea{display:block;width:100%;margin-top:6px;padding:11px;font:inherit;
  border:1px solid var(--line);border-radius:8px;resize:vertical}
.said{display:block;margin:16px 0;font-weight:600}

.script .sh{font-weight:700;margin:14px 0 2px;font-size:15px}
.script .sb{margin:0;color:#333;font-size:15px}
.rules ul{margin:0;padding-left:18px;font-size:14px;color:#333}
.rules li{margin-bottom:8px}
.rules li.stop{color:var(--stop);font-weight:600}

.admin table{width:100%;border-collapse:collapse;margin-bottom:22px;font-size:15px}
.admin th{text-align:left;background:var(--navy);color:#fff;padding:7px 9px;font-weight:600}
.admin td{padding:7px 9px;border-bottom:1px solid var(--line);
  font-variant-numeric:tabular-nums}
dialog{border:0;border-radius:10px;padding:22px;box-shadow:0 12px 40px rgba(0,0,0,.25)}
dialog select{display:block;width:100%;padding:11px;font:inherit;margin:10px 0;
  border:1px solid var(--line);border-radius:8px}
dialog menu{display:flex;gap:10px;justify-content:flex-end;padding:0;margin:14px 0 0}
dialog button{padding:11px 16px;border-radius:8px;border:1px solid var(--line);
  background:#fff;cursor:pointer}
dialog button.go{background:var(--go);color:#fff;border-color:var(--go)}

/* ── one block per phone number (Ed, 2026-09-14) ───────────────────────────── */
.numblock { padding: 14px 18px; }
.numhead { display: flex; align-items: center; justify-content: space-between; gap: 18px; }
.numhead .phone { margin: 0; }
.numhead .line  { margin: 2px 0 0; opacity: .7; font-size: .9rem; }
.numbtns { display: flex; gap: 8px; flex: 0 0 auto; }
.numbtns .big { min-width: 150px; }
.numstate { margin-top: 8px; font-size: .95rem; opacity: .85; }
.numresult {
  margin-top: 10px; padding: 9px 12px; border-radius: 6px;
  border-left: 4px solid #6b7280; background: rgba(255,255,255,.04);
  font-size: 1rem; font-weight: 600;
}
.numresult.good { border-left-color: #3f8f4f; }
.numresult.meh  { border-left-color: #b08a2e; }
.numresult.stop { border-left-color: #a33; }
.numform { margin-top: 12px; }
.numform .disp { padding: 0; }
.dispnum { font-weight: 600; }
#nextbtn { margin-top: 6px; }

/* the Save button after a dead-number auto-pick (2026-09-14) */
@keyframes pulsebtn { 0%,100% { box-shadow: 0 0 0 0 rgba(63,143,79,.7); }
                      50%     { box-shadow: 0 0 0 10px rgba(63,143,79,0); } }
.big.pulse { animation: pulsebtn 1.4s ease-out 3; }
#callerr b { color: #e08b7a; }

/* Eric's positions and upcoming events, right-hand column (2026-09-14) */
.positions .sh { margin: 12px 0 2px; font-weight: 700; }
.positions .sb { margin: 0 0 4px; opacity: .85; }
.events .ev     { margin: 11px 0 1px; font-weight: 600; }
.events .evwhen { color: #c8a54a; margin-right: 6px; }
.events .evnote { margin: 0; font-size: .92rem; opacity: .75; }

/* audio mode picker on the start screen (2026-09-14) */
.pickhead { margin: 18px 0 8px; font-size: 1.05rem; }
.modepick .chip { padding: 10px 16px; font-size: 1rem; }
.modenote { margin-top: 12px; }
.modenote input[type=tel] { font-size: 1.15rem; padding: 8px 10px; width: 100%;
                            max-width: 280px; }
.modenote .warn { color: #e08b7a; font-weight: 600; margin-top: 10px; }

/* The recorded-line reminder, directly above the Call button. Ed 2026-09-15:
   keep the sentence in front of the caller, but do not nag — it reads as a prompt,
   not a warning, and nothing is blocked when it is skipped. */
.notice-reminder{
  margin:.4rem 0 .6rem; padding:.45rem .7rem;
  background:#fdf6e3; border-left:4px solid var(--brass); border-radius:3px;
  font-size:1rem; color:var(--ink);
}
