/* API keys page (keys.js, specs/pulse-keys.md section 10). Phone first at
   390 px: one column, 40 px targets, tier 1 controls mapped to the Pulse
   tokens like the Playground. Two local controls, listed in ui/MANIFEST.md:
   the masked text field (.keys-mask) and the inline alert (.keys-alert),
   because the extended set is not loaded on Pulse. */
.keys-page, .keys-sheet {
  --ui-ground: var(--bg); --ui-rail: var(--card); --ui-raised: var(--panel);
  --ui-hover: var(--accent-tint); --ui-pressed: var(--border);
  --ui-ink: var(--text); --ui-ink-muted: var(--dim); --ui-ink-faint: var(--faint);
  --ui-ink-inverse: var(--bg); --ui-line: var(--border); --ui-line-strong: var(--line-strong);
  --ui-accent: var(--accent); --ui-accent-ink: var(--bg); --ui-ring-color: var(--accent);
  --ui-radius: var(--radius); --ui-radius-card: var(--radius);
}
.keys-page { padding-top: 12px; max-width: 860px; margin: 0 auto; min-width: 0; }
.keys-eyebrow { color: var(--accent); font: 10px var(--mono); letter-spacing: .1em; margin: 0 0 10px; }
.keys-head { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-end; gap: 16px 20px; margin-bottom: 12px; }
.keys-head > div { min-width: 0; flex: 1 1 280px; }
.keys-titlerow { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.keys-head h1 { font-size: clamp(28px, 4vw, 36px); letter-spacing: -.04em; margin: 0 0 8px; }
.keys-intro { color: var(--dim); font-size: 14px; margin: 0; max-width: 560px; line-height: 1.6; }
.keys-head .ui-btn { min-height: 40px; }
.keys-flagline { color: var(--dim); font-size: 13px; margin: 0 0 12px; }
.keys-status { min-height: 1.6em; font-size: 12px; margin: 0 0 10px; }
.keys-ico { display: inline-flex; flex: none; width: 20px; height: 20px; color: var(--accent); }
.keys-ico svg { width: 20px; height: 20px; }

/* Local control: an inline alert with an icon, a title and a body. */
.keys-alert {
  display: flex; gap: 12px; align-items: flex-start; margin: 0 0 12px; padding: 14px 16px;
  border: 1px solid var(--border); border-left: 3px solid var(--accent); border-radius: var(--radius); background: var(--card);
}
.keys-alert--error { border-left-color: var(--down); }
.keys-alert--error .keys-ico { color: var(--down); }
.keys-alert > div { min-width: 0; flex: 1 1 auto; }
.keys-alert h2 { font-size: 15px; font-weight: 600; margin: 0 0 6px; }
.keys-alert p, .keys-alert li { font-size: 13px; line-height: 1.55; color: var(--dim); margin: 0 0 8px; overflow-wrap: anywhere; }
.keys-alert .ui-btn { min-height: 40px; }

/* Local control: a status card (passkey state, change progress). A titled
   panel with a state badge, an optional big fingerprint and a note line;
   data-state drives the accent. Listed in ui/MANIFEST.md. */
.keys-card, .keys-progress {
  margin: 0 0 12px; padding: 16px; border: 1px solid var(--border); border-left: 4px solid var(--accent);
  border-radius: var(--radius); background: var(--card); min-width: 0;
}
.keys-card--trusted, .keys-progress--verified, .keys-progress--applied { border-left-color: var(--up, var(--accent)); }
.keys-card--mismatch, .keys-card--error, .keys-progress--failed { border-left-color: var(--down); }
.keys-card-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px; margin: 0 0 10px; }
.keys-card-head h2, .keys-card-head h3 { font-size: 16px; font-weight: 600; margin: 0; }
.keys-card-badge { text-transform: uppercase; font-size: 10px; letter-spacing: .06em; white-space: nowrap; }
.keys-card-label { margin: 0 0 4px; color: var(--dim); font: 10px var(--mono); letter-spacing: .1em; text-transform: uppercase; }
/* 20 characters in five groups (review R1) fit one line at 320 px. */
.keys-fp { margin: 0 0 12px; font: 600 clamp(16px, 5.2vw, 28px)/1.2 var(--mono); letter-spacing: .02em; color: var(--text); overflow-wrap: anywhere; }
.keys-card-next p { margin: 0 0 8px; font-size: 14px; line-height: 1.55; color: var(--text); }
.keys-card-note { margin: 8px 0 0; font-size: 12px; line-height: 1.5; color: var(--dim); }
.keys-card--busy .keys-card-badge, .keys-progress--queued .keys-card-badge, .keys-progress--applying .keys-card-badge { animation: keys-pulse 1.6s ease-in-out infinite; }
@keyframes keys-pulse { 50% { opacity: .45; } }
@media (prefers-reduced-motion: reduce) { .keys-card-badge { animation: none !important; } }

.keys-steps { list-style: none; margin: 0 0 8px; padding: 0; display: grid; gap: 6px; }
.keys-step { display: flex; align-items: center; gap: 10px; font-size: 13px; color: var(--dim); }
.keys-step-dot { flex: none; width: 10px; height: 10px; border-radius: 50%; border: 2px solid var(--line-strong); }
.keys-step.is-done { color: var(--text); }
.keys-step.is-done .keys-step-dot { background: var(--accent); border-color: var(--accent); }
.keys-step.is-now { color: var(--text); font-weight: 600; }
.keys-step.is-now .keys-step-dot { border-color: var(--accent); animation: keys-pulse 1.6s ease-in-out infinite; }
.keys-step.is-fail { color: var(--down); }
.keys-step.is-fail .keys-step-dot { background: var(--down); border-color: var(--down); }
.keys-progress-fp, .keys-progress-code { margin: 0 0 6px; font: 12px/1.5 var(--mono); overflow-wrap: anywhere; }
.keys-progress-fp.is-error { color: var(--down); }
.keys-progress.is-compact .keys-steps { display: none; }
.keys-progress.is-compact { padding: 12px 14px; }
.keys-activity:empty { display: none; }

/* The passkeys list: one row per passkey, Approve or Revoke inline. */
.keys-pks { margin: 0 0 14px; }
.keys-pks .keys-subhead { margin: 0 0 8px; }
.keys-pk-list { border: 1px solid var(--border); border-radius: var(--radius); background: var(--card); overflow: hidden; }
.keys-pk + .keys-pk { border-top: 1px solid var(--border); }
.keys-pk-main { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; padding: 12px 14px; min-height: 64px; }
.keys-pk-main .ui-text { flex: 1 1 160px; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.keys-pk-main .ui-title { font-weight: 600; }
.keys-fp-small { font-family: var(--mono); font-size: 13px; letter-spacing: .04em; }
.keys-pk-main .ui-btn { min-height: 40px; min-width: 96px; }
.keys-pk-main .keys-badges { max-width: none; }
.keys-confirm { padding: 12px 14px 14px; border-top: 1px dashed var(--border); background: var(--panel); }
.keys-confirm p { margin: 0 0 8px; font-size: 14px; line-height: 1.55; }
.keys-confirm .ui-field { margin: 4px 0 12px; }
.keys-group-input { max-width: 9em; font-family: var(--mono); letter-spacing: .12em; text-transform: lowercase; }
.keys-confirm-actions { display: flex; flex-wrap: wrap; gap: 10px; }
.keys-confirm-actions .ui-btn { min-height: 44px; flex: 1 1 140px; }
.keys-pks > .ui-btn { margin-top: 10px; min-height: 40px; }
.keys-pks .keys-flow:empty { display: none; }
.keys-pks .keys-flow { margin: 8px 0 0; }

.keys-list { border: 1px solid var(--border); border-radius: var(--radius); background: var(--card); overflow: hidden; }
.keys-row { min-height: 64px; padding: 12px 14px; border-radius: 0; }
.keys-row .ui-title { font-weight: 600; }
.keys-row .ui-desc { font-family: var(--mono); font-size: 11px; white-space: normal; overflow-wrap: anywhere; }
.keys-badges { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 4px; flex: 0 1 auto; max-width: 45%; }
.keys-badges .ui-badge { white-space: nowrap; text-transform: uppercase; font-size: 9px; letter-spacing: .06em; }
.keys-skel { display: flex; flex-direction: column; gap: 8px; padding: 14px; }
.keys-skel + .keys-skel { border-top: 1px solid var(--border); }
.keys-empty { margin: 0; padding: 14px 16px; color: var(--dim); font-size: 13px; }

/* The sheet: a bottom sheet under 768 px (tier 1). */
.keys-sheet { --ui-sheet-w: 560px; }
.keys-purpose { margin: 0; color: var(--dim); font-size: 14px; line-height: 1.55; }
.keys-form { gap: 14px; }
.keys-form .ui-input { min-height: 44px; font-family: var(--mono); font-size: 14px; }
/* Local control: a masked text field. Not type=password, so Chrome does not
   offer to save the key to Google Password Manager (red team R14). */
.keys-mask { -webkit-text-security: disc; }
.keys-mask.is-shown { -webkit-text-security: none; }
.keys-help { font-family: var(--mono); font-size: 11px; line-height: 1.5; overflow-wrap: anywhere; }
.keys-tools { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; }
.keys-tools .ui-btn { min-height: 40px; min-width: 96px; }
.keys-switch { display: flex; align-items: center; gap: 10px; min-height: 40px; }
.keys-switch label { font-size: 14px; cursor: pointer; }
.keys-save { width: 100%; min-height: 44px; }
.keys-flow { font-size: 13px; line-height: 1.5; }
.keys-subhead { font: 10px var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--dim); margin: 6px 0 0; }
.keys-history { border: 1px solid var(--border); border-radius: var(--radius); }
.keys-hist { padding: 10px 12px; border-radius: 0; }
.keys-hist .ui-desc { font-family: var(--mono); font-size: 11px; white-space: normal; overflow-wrap: anywhere; }

@media (max-width: 480px) {
  .keys-row { flex-wrap: wrap; }
  .keys-row .ui-text { flex: 1 1 100%; }
  .keys-badges { max-width: none; justify-content: flex-start; flex: 1 1 auto; }
}
