/* =====================================================================
   vc-apps.css — the small in-browser tools.
   Shared by the focus timer, the meeting planner, the passphrase
   generator and the deadline calculator. None of them talks to a server.
   ===================================================================== */

.app-wrap { max-width: 940px; }
.app-card {
  background: var(--paper); border: 1px solid var(--paper-line);
  border-radius: var(--r-lg); padding: 26px; margin-bottom: 22px;
}
.app-card h2 { font-size: 1.12rem; margin: 0 0 6px; }
.app-hint { color: var(--on-light-mute); font-size: 0.9rem; margin: 0 0 18px; line-height: 1.6; }
.app-note {
  background: var(--paper-tint); border: 1px solid var(--paper-line);
  border-radius: var(--r); padding: 16px 18px; color: var(--on-light-mute);
  font-size: 0.88rem; line-height: 1.6;
}
.app-row { display: flex; flex-wrap: wrap; gap: 14px; align-items: flex-end; }
.app-field { display: block; }
.app-field > span {
  display: block; font-family: var(--font-mono); font-size: 0.66rem; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--on-light-mute); margin-bottom: 7px;
}
.app-field input, .app-field select {
  padding: 11px 13px; border: 1px solid var(--paper-line); border-radius: var(--r-sm);
  background: var(--paper); color: var(--on-light); font-family: var(--font-body); font-size: 0.98rem;
}
.app-field input:focus, .app-field select:focus {
  outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(77, 163, 255, 0.18);
}
.app-field.grow { flex: 1; min-width: 200px; }
.app-field.grow input, .app-field.grow select { width: 100%; }
.app-check { display: inline-flex; gap: 8px; align-items: center; font-size: 0.92rem; margin-right: 18px; }
.btn-sm { padding: 8px 14px; font-size: 0.84rem; }

/* ---- the timer ---- */
.timer {
  display: grid; grid-template-columns: 220px 1fr; gap: 30px; align-items: center;
}
@media (max-width: 700px) { .timer { grid-template-columns: 1fr; } }
.dial { position: relative; width: 220px; height: 220px; }
.dial svg { transform: rotate(-90deg); width: 100%; height: 100%; }
.dial .track { fill: none; stroke: var(--paper-line); stroke-width: 10; }
.dial .run {
  fill: none; stroke: var(--accent-deep); stroke-width: 10; stroke-linecap: round;
  transition: stroke-dashoffset 0.4s linear;
}
.dial.rest .run { stroke: #2e8b57; }
.dial .read {
  position: absolute; inset: 0; display: grid; place-content: center; text-align: center;
}
.dial .read strong {
  display: block; font-family: var(--font-mono); font-size: 2.5rem; letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
}
.dial .read span {
  display: block; margin-top: 4px; font-family: var(--font-mono); font-size: 0.66rem;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--on-light-mute);
}
.timer-side .app-row { margin-bottom: 18px; }
.tally { display: flex; gap: 26px; margin-top: 20px; }
.tally div strong {
  display: block; font-family: var(--font-display); font-size: 1.6rem; line-height: 1;
}
.tally div span {
  display: block; margin-top: 5px; font-family: var(--font-mono); font-size: 0.64rem;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--on-light-mute);
}

/* ---- the planner grid ---- */
.grid-scroll { overflow-x: auto; }
.zgrid { border-collapse: collapse; font-size: 0.82rem; min-width: 760px; }
.zgrid th, .zgrid td { border: 1px solid var(--paper-line); padding: 0; text-align: center; }
.zgrid th.zone {
  text-align: left; padding: 8px 12px; white-space: nowrap; font-weight: 550;
  position: sticky; left: 0; background: var(--paper); z-index: 1;
}
.zgrid td.hour {
  width: 34px; height: 34px; font-family: var(--font-mono); font-size: 0.72rem;
  color: var(--on-light-mute); cursor: pointer;
}
.zgrid td.hour.work { background: rgba(46, 139, 87, 0.14); color: var(--on-light); }
.zgrid td.hour.edge { background: rgba(168, 96, 15, 0.14); color: var(--on-light); }
.zgrid td.hour.next-day::after { content: "+"; font-size: 0.6rem; vertical-align: super; opacity: .6; }
.zgrid col.pick { background: rgba(77, 163, 255, 0.16); }
.zgrid tr.all-clear td.hour { box-shadow: inset 0 -3px 0 rgba(46, 139, 87, 0.6); }
.slot-out {
  margin-top: 16px; display: flex; gap: 10px; align-items: center; flex-wrap: wrap;
}
.slot-out input {
  flex: 1; min-width: 260px; padding: 11px 13px; border: 1px solid var(--paper-line);
  border-radius: var(--r-sm); font-family: var(--font-mono); font-size: 0.84rem; background: var(--paper-tint);
}
.zone-list { display: flex; flex-wrap: wrap; gap: 8px; margin: 6px 0 16px; }
.zone-chip {
  display: inline-flex; align-items: center; gap: 8px; padding: 6px 12px;
  border: 1px solid var(--paper-line); border-radius: 999px; font-size: 0.86rem; background: var(--paper-tint);
}
.zone-chip button { background: none; border: 0; cursor: pointer; color: #b3372a; font-size: 1rem; line-height: 1; }

/* ---- generated secrets ---- */
.secret-list { display: grid; gap: 10px; margin-top: 18px; }
.secret {
  display: flex; gap: 10px; align-items: center;
  border: 1px solid var(--paper-line); border-radius: var(--r-sm); background: var(--paper-tint);
  padding: 12px 14px;
}
.secret code {
  flex: 1; font-family: var(--font-mono); font-size: 1rem; word-break: break-all; user-select: all;
}
.bits { font-family: var(--font-mono); font-size: 0.9rem; }
.bits b { font-size: 1.5rem; }
.strength { font-size: 0.9rem; margin-top: 6px; }
.s-weak { color: #b3372a; } .s-fair { color: #a8600f; } .s-good { color: #2e8b57; }

/* ---- deadlines ---- */
.due { width: 100%; border-collapse: collapse; font-size: 0.9rem; }
.due th {
  text-align: left; font-family: var(--font-mono); font-size: 0.64rem; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--on-light-mute); padding: 0 12px 9px 0;
  border-bottom: 1px solid var(--paper-line); font-weight: 500;
}
.due td { padding: 12px 12px 12px 0; border-bottom: 1px solid var(--paper-line); vertical-align: top; }
.due td.when { font-family: var(--font-mono); font-size: 0.86rem; white-space: nowrap; }
.due .ref { display: block; font-size: 0.78rem; color: var(--on-light-mute); margin-top: 3px; }
.due tr.past td { opacity: .55; }
.left { font-family: var(--font-mono); font-size: 0.86rem; white-space: nowrap; }
.left.soon { color: #b3372a; font-weight: 600; }
.left.done { color: var(--on-light-mute); }

/* ---- keep awake ---- */
.wake { display: flex; gap: 18px; align-items: center; }
.wake-switch {
  flex: none; width: 74px; height: 40px; border-radius: 999px; cursor: pointer;
  border: 1px solid var(--paper-line); background: var(--paper-tint); position: relative;
  transition: background 0.2s var(--ease), border-color 0.2s var(--ease);
}
.wake-switch .knob {
  position: absolute; top: 3px; left: 3px; width: 32px; height: 32px; border-radius: 50%;
  background: var(--on-light-mute); transition: transform 0.2s var(--ease), background 0.2s var(--ease);
}
.wake-switch[aria-checked="true"] { background: rgba(46, 139, 87, 0.18); border-color: rgba(46, 139, 87, 0.5); }
.wake-switch[aria-checked="true"] .knob { transform: translateX(34px); background: #2e8b57; }
.wake-switch:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(77, 163, 255, 0.3); }
.wake-switch[disabled] { opacity: .5; cursor: not-allowed; }
.wake-state { display: block; font-size: 1.15rem; font-weight: 600; }
.wake-since { display: block; color: var(--on-light-mute); font-size: 0.9rem; margin-top: 3px; }

/* ---- digests ---- */
.digests { display: grid; gap: 10px; margin-top: 20px; }
.digest {
  display: flex; gap: 12px; align-items: center; flex-wrap: wrap;
  border: 1px solid var(--paper-line); border-radius: var(--r-sm);
  background: var(--paper-tint); padding: 12px 14px;
}
.digest > span {
  flex: none; width: 4.5rem; font-family: var(--font-mono); font-size: 0.66rem;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--on-light-mute);
}
.digest code { flex: 1; min-width: 200px; font-family: var(--font-mono); font-size: 0.86rem; word-break: break-all; }
.digest.hit { border-color: rgba(46, 139, 87, 0.6); background: rgba(46, 139, 87, 0.1); }
.verdict { margin-top: 14px; font-size: 0.95rem; }
.verdict.hit { color: #2e8b57; font-weight: 600; }
.verdict.miss { color: #b3372a; font-weight: 600; }

/* ---- browser inspector ---- */
.group { margin-bottom: 22px; }
.group > h2 { font-size: 1.05rem; margin: 0 0 12px; }
.check {
  display: grid; grid-template-columns: 26px 1fr; gap: 12px;
  border: 1px solid var(--paper-line); border-left-width: 4px; border-radius: var(--r-sm);
  background: var(--paper); padding: 14px 16px; margin-bottom: 8px;
}
.check .mark { font-family: var(--font-mono); font-weight: 700; line-height: 1.45; }
.check strong { display: block; font-size: 0.96rem; }
.check span { display: block; color: var(--on-light-mute); font-size: 0.88rem; line-height: 1.6; margin-top: 3px; }
.check code { font-family: var(--font-mono); font-size: 0.84rem; word-break: break-all; }
.check.ok { border-left-color: #2e8b57; } .check.ok .mark { color: #2e8b57; }
.check.warn { border-left-color: #a8600f; } .check.warn .mark { color: #a8600f; }
.check.bad { border-left-color: #b3372a; } .check.bad .mark { color: #b3372a; }
.check.info { border-left-color: var(--paper-line); } .check.info .mark { color: var(--on-light-mute); }
.cannot-list { margin: 0; padding-left: 20px; color: var(--on-light-mute); font-size: 0.9rem; line-height: 1.7; }
.cannot-list li { margin-bottom: 10px; }
.cannot-list strong { color: var(--on-light); }
