/* getjailbroken — white-on-black terminal, daily 10-level jailbreak puzzle.
   Adapted from the getchowned CRT theme. No inline styles (strict CSP). */
:root{
  --bg:#0b0b0c; --bg-deep:#050506; --panel:#141416;
  --fg:#f4f4f5; --dim:#a1a1a6; --mut:#8a8a90;
  --amber:#ffb000; --green:#27c93f; --red:#ff5f56; --cyan:#5ad7ff; --purple:#c792ea;
  --line:#2a2a2e; --glow:rgba(255,255,255,.16);
  --mono:ui-monospace,"SF Mono","JetBrains Mono","Cascadia Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box;}
html{height:100%;}
/* min-height (not height): body must be free to grow TALLER than the viewport so a long
   transcript scrolls the page instead of clipping inside the fixed card. */
body{min-height:100%;}
body{margin:0;
  background:radial-gradient(120% 120% at 50% 0%,#141416 0%,var(--bg) 55%,var(--bg-deep) 100%);
  color:var(--fg);font-family:var(--mono);font-size:15px;line-height:1.5;
  display:flex;flex-direction:column;align-items:center;padding:24px 14px 48px;
  -webkit-font-smoothing:antialiased;}

.crt{width:100%;max-width:560px;background:var(--bg);border:1px solid var(--line);
  border-radius:8px;overflow:hidden;position:relative;
  box-shadow:0 24px 60px -22px rgba(0,0,0,.85),inset 0 0 120px rgba(255,255,255,.02);}
.crt::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:repeating-linear-gradient(to bottom,rgba(0,0,0,0) 0 2px,rgba(0,0,0,.16) 3px,rgba(0,0,0,0) 4px);
  mix-blend-mode:multiply;opacity:.5;}

.titlebar{display:flex;align-items:center;gap:8px;padding:9px 14px;
  background:linear-gradient(#161618,#101012);border-bottom:1px solid var(--line);}
.dot{width:11px;height:11px;border-radius:50%;}
.dot.r{background:#ff5f56;}.dot.y{background:#ffbd2e;}.dot.g{background:#27c93f;}
.title{margin-left:6px;font-size:12px;letter-spacing:.5px;color:var(--dim);}

.screen{padding:18px 16px 16px;}
.head{display:flex;justify-content:space-between;align-items:center;}
.task-no{font-size:12px;letter-spacing:.5px;color:var(--dim);text-transform:uppercase;}

/* lethal-trifecta legs: greyed until the current level introduces that leg */
.trifecta{display:flex;gap:6px;}
.leg{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;
  border:1px solid var(--line);border-radius:4px;font-size:11px;font-weight:700;color:var(--mut);
  background:var(--panel);}
.leg.on{color:var(--bg);border-color:var(--amber);background:var(--amber);
  box-shadow:0 0 8px rgba(255,176,0,.45);}

.progress{display:flex;gap:5px;margin:10px 0 12px;}
.pip{flex:1;height:4px;border-radius:2px;background:var(--line);}
.pip.done{background:var(--green);box-shadow:0 0 6px rgba(39,201,63,.4);}
.pip.active{background:var(--fg);}

.objective{margin:2px 0 10px;font-size:13px;line-height:1.45;color:var(--fg);
  background:rgba(255,176,0,.07);border:1px solid var(--line);border-left:2px solid var(--amber);
  border-radius:4px;padding:8px 12px;}
.objective:empty{display:none;}
.concept{font-size:12px;color:var(--mut);margin:0 0 6px;min-height:1.5em;}
.tools{margin:0 0 12px;min-height:1.2em;display:flex;flex-wrap:wrap;gap:6px;}
.tools:empty{margin:0;min-height:0;}
.tool{font-size:11px;color:var(--cyan);border:1px solid var(--line);border-radius:4px;
  padding:2px 8px;background:rgba(90,215,255,.06);}
.tool .tk{color:var(--mut);}

/* CLS guard — keep trailing blocks invisible (but laid out) until app.js renders the
   first screen and adds .ready to <body>, so the async first paint shifts nothing. */
.sponsor,footer.stats,.legal{transition:opacity .25s ease;}
body:not(.ready) .sponsor,
body:not(.ready) footer.stats,
body:not(.ready) .legal{visibility:hidden;opacity:0;}
@media (prefers-reduced-motion:reduce){.sponsor,footer.stats,.legal{transition:none;}}

/* ---- chat transcript ---- */
/* short window: ~last 2 exchanges visible; older history stays in the DOM and scrolls up */
.log{min-height:130px;max-height:220px;overflow-y:auto;display:flex;flex-direction:column;
  gap:10px;padding:2px 2px 4px;}
.row{font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-word;border-radius:6px;}
.row.user{align-self:flex-end;max-width:88%;background:var(--panel);border:1px solid var(--line);
  padding:8px 12px;color:var(--fg);}
.row.agent{align-self:flex-start;max-width:92%;border-left:2px solid var(--mut);padding:2px 0 2px 12px;
  color:var(--dim);text-shadow:0 0 6px var(--glow);}
.row.agent .who{color:var(--amber);font-size:11px;letter-spacing:.5px;display:block;margin-bottom:2px;}
.row.system{align-self:center;color:var(--mut);font-size:12px;text-align:center;}
/* level-entry scene block: header + Dara's persona, one context block (not a chat bubble) */
.row.scene{align-self:stretch;max-width:100%;border:1px solid var(--line);border-left:2px solid var(--mut);
  border-radius:6px;padding:8px 12px;background:rgba(255,255,255,.02);}
.row.scene .scene-h{font-size:11px;letter-spacing:.5px;color:var(--amber);margin-bottom:4px;}
.row.scene .scene-p{font-size:13px;color:var(--dim);line-height:1.5;}
.row.flag{align-self:flex-start;max-width:92%;border-left:2px solid var(--green);
  padding:6px 0 6px 12px;color:var(--green);text-shadow:0 0 6px rgba(39,201,63,.35);}
/* email framing for indirect-injection levels (6 & 9): the player's input IS the untrusted email */
.row.user.email{align-self:stretch;max-width:100%;border:1px dashed var(--cyan);
  background:rgba(90,215,255,.05);}
.row.user.email .who{color:var(--cyan);font-size:11px;letter-spacing:.5px;display:block;margin-bottom:4px;}
/* teletype caret — blinking block while Dara "types" a reply, for the computer feel */
.caret{display:inline-block;width:.55ch;height:1.05em;margin-left:1px;background:var(--green);
  vertical-align:-.18em;animation:caret-blink 1s steps(1) infinite;}
@keyframes caret-blink{50%{opacity:0;}}
@media (prefers-reduced-motion:reduce){.caret{display:none;animation:none;}}

/* ---- composer ---- */
.composer{margin-top:14px;}
.iolabel{display:block;font-size:12px;color:var(--mut);margin-bottom:6px;}
.composer.email .iolabel{color:var(--cyan);}
#msg{width:100%;resize:vertical;min-height:48px;background:var(--panel);color:var(--fg);
  font-family:var(--mono);font-size:15px;line-height:1.5;border:1px solid var(--line);
  border-radius:6px;padding:10px 12px;}
#msg:focus{outline:none;border-color:var(--dim);}
.composer.email #msg{border-color:var(--cyan);}
.composer-row{display:flex;justify-content:space-between;align-items:center;margin-top:10px;gap:10px;}
.hint{font-size:12px;color:var(--mut);}

button.go{font-family:var(--mono);font-size:14px;cursor:pointer;background:transparent;color:var(--fg);
  border:1px solid var(--mut);border-radius:4px;padding:8px 16px;text-shadow:0 0 6px var(--glow);
  transition:background .12s;}
button.go:hover{background:rgba(255,255,255,.08);}
button.go:disabled{opacity:.4;cursor:default;}
#send{border-color:var(--fg);background:rgba(255,255,255,.06);}
#send:hover{background:rgba(255,255,255,.12);}
.go.ghost{border-color:var(--mut);background:transparent;font-size:13px;padding:7px 12px;}
.composer .hint{display:block;margin-top:8px;}

/* ---- result / share ---- */
.result{text-align:center;padding:8px 0 4px;}
.result h2{font-size:18px;margin:0 0 4px;text-shadow:0 0 6px var(--glow);}
.score{font-size:32px;margin:8px 0 10px;font-variant-numeric:tabular-nums;}
.squares{display:flex;gap:8px;justify-content:center;margin:8px 0 6px;flex-wrap:wrap;max-width:300px;margin-left:auto;margin-right:auto;}
.sq{display:inline-flex;align-items:center;justify-content:center;
  min-width:40px;min-height:40px;padding:4px;font-size:16px;font-weight:700;line-height:1;
  background:var(--panel);border:1px solid var(--line);border-radius:8px;color:var(--dim);
  font-variant-numeric:tabular-nums;}
.sq.g{background:rgba(39,201,63,.16);border-color:var(--green);color:var(--green);}
.sq.y{background:rgba(255,176,0,.16);border-color:var(--amber);color:var(--amber);}
.recaphint{font-size:12px;color:var(--mut);margin:6px 0 8px;}
.actions{display:flex;gap:14px;justify-content:center;align-items:center;flex-wrap:wrap;}
.sharebox{margin:14px auto 0;max-width:330px;background:var(--panel);border:1px solid var(--line);
  border-radius:6px;padding:12px 14px;white-space:pre;font-size:14px;line-height:1.5;text-align:left;}
.countdown{font-size:13px;color:var(--mut);}

/* ---- sponsor ---- */
.sponsor{margin-top:22px;padding-top:14px;border-top:1px dashed var(--line);
  display:flex;align-items:center;gap:10px;}
.sponsor-tag{font-size:11px;color:var(--mut);letter-spacing:.5px;}
.sponsor-slot{display:inline-flex;align-items:center;gap:8px;min-height:34px;padding:6px 14px;
  border:1px dashed var(--mut);border-radius:4px;color:var(--dim);text-decoration:none;font-size:13px;}
.sponsor-slot img{max-height:22px;width:auto;display:block;}
.sponsor-slot:hover{border-color:var(--fg);color:var(--fg);}
.sl-swap{display:inline-grid;}
.sl-swap>span{grid-area:1/1;text-align:center;transition:opacity .12s ease;}
.sl-email{opacity:0;}
.sponsor-slot:hover  .sl-default,
.sponsor-slot:focus  .sl-default,
.sponsor-slot:active .sl-default{opacity:0;}
.sponsor-slot:hover  .sl-email,
.sponsor-slot:focus  .sl-email,
.sponsor-slot:active .sl-email{opacity:1;}
@media (prefers-reduced-motion:reduce){.sl-swap>span{transition:none;}}

/* ---- stat bar ---- */
.stats{display:flex;gap:18px;flex-wrap:wrap;padding:11px 16px;border-top:1px solid var(--line);
  background:transparent;font-size:13px;}
.stat .k,.stat .v{color:var(--dim);}

a{color:var(--dim);}
@media (max-width:480px){
  body{font-size:14px;padding:12px 8px 32px;}
  .screen{padding:14px 12px;}
  .stats{gap:12px;}
}
@media (prefers-reduced-motion:reduce){ .crt::after{display:none;} }
:focus-visible{outline:2px solid var(--fg);outline-offset:2px;}
.vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;
  clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;white-space:nowrap;}
.legal{max-width:560px;margin:14px auto 0;padding:0 14px;font-family:var(--mono);
  font-size:9px;line-height:1.45;color:var(--dim);text-align:center;}
.sibling{max-width:560px;margin:16px auto 0;padding:0 14px;font-family:var(--mono);font-size:12px;line-height:1.5;color:var(--mut);text-align:center;}
.sibling a{text-decoration:underline;}

/* win confetti (presentation only; CSP-safe — CSSOM props + external @keyframes) */
.confetti-layer{position:fixed;inset:0;overflow:hidden;pointer-events:none;z-index:9999;}
.confetti{position:absolute;top:-14px;width:8px;height:14px;pointer-events:none;opacity:0;
  will-change:transform,opacity;border-radius:1px;
  animation:confetti-fall var(--dur,3s) linear var(--delay,0s) forwards;}
@keyframes confetti-fall{
  0%{transform:translate3d(0,-14px,0) rotate(0);opacity:1;}
  100%{transform:translate3d(var(--drift,0),102vh,0) rotate(720deg);opacity:0;}
}
@media (prefers-reduced-motion: reduce){ .confetti-layer{display:none;} }
