/* Latch — latch.aurionblack.com
   Hand-written, no framework, no build step, and NOTHING loaded from anywhere else.
   🔴 That last part is load-bearing, not taste: the app's whole pitch is that it makes
   zero outbound calls, and a landing page that pulls a webfont or an analytics beacon
   while saying so would be the first thing a sceptical reader checks and the first
   promise the project breaks. System font stack, inline SVG, self-hosted images only. */

:root{
  --bg:#0b0d14; --bg2:#10131d; --panel:#151a28; --panel2:#1c2233; --line:#252c40;
  --text:#e8e9f1; --muted:#8b90a8; --dim:#6b7089;
  --pink:#ff2d75; --purple:#7c4dff; --cyan:#00e5ff; --ok:#00e676; --warn:#ffb300;
  --r:16px; --shadow:0 18px 50px rgba(0,0,0,.45);
  --max:1120px;
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html{color-scheme:dark;scroll-behavior:smooth;scroll-padding-top:74px}
body{
  margin:0;background:
    radial-gradient(1200px 700px at 12% -8%, #241a5c 0%, transparent 58%),
    radial-gradient(900px 600px at 92% 4%, #0d2f42 0%, transparent 55%),
    radial-gradient(700px 500px at 50% 100%, #2a0f2c 0%, transparent 60%),
    var(--bg);
  color:var(--text);
  font:16px/1.65 ui-sans-serif,-apple-system,"SF Pro Text",Inter,Segoe UI,system-ui,sans-serif;
  -webkit-font-smoothing:antialiased;
}
/* 🔴 height:auto is NOT optional here. Every <img> carries width/height attributes
   (they reserve layout space and stop the page jumping as screenshots load), and with
   only `max-width:100%` the width scales while the HEIGHT ATTRIBUTE still wins — the
   hero shot rendered 527px wide and 1075px tall, stretched and clipped, with no error
   anywhere. Constrain one dimension and you must free the other. */
img{max-width:100%;height:auto;display:block}
a{color:var(--cyan);text-decoration:none}
a:hover{text-decoration:underline}
.wrap{max-width:var(--max);margin:0 auto;padding:0 20px}

/* ── top bar ─────────────────────────────────────────────────────────────── */
.top{position:sticky;top:0;z-index:50;background:rgba(11,13,20,.78);
  backdrop-filter:blur(16px);border-bottom:1px solid var(--line)}
.top .wrap{display:flex;align-items:center;gap:1.2rem;padding-top:.7rem;padding-bottom:.7rem}
.brand{display:flex;align-items:center;gap:.55rem;font-weight:800;font-size:1.15rem;
  letter-spacing:.01em;color:var(--text)}
.brand:hover{text-decoration:none}
.brand svg{width:26px;height:26px;flex:0 0 auto}
.top nav{margin-left:auto;display:flex;gap:.15rem;flex-wrap:wrap}
.top nav a{color:var(--muted);padding:.4rem .7rem;border-radius:10px;font-size:.9rem;font-weight:600}
.top nav a:hover{color:var(--text);background:var(--panel);text-decoration:none}
.top .cta{background:linear-gradient(135deg,var(--pink),var(--purple));color:#fff}
.top .cta:hover{filter:brightness(1.12);background:linear-gradient(135deg,var(--pink),var(--purple))}
@media(max-width:800px){.top nav a.hide-s{display:none}}

/* ── hero ────────────────────────────────────────────────────────────────── */
.hero{padding:clamp(3rem,9vw,6.5rem) 0 2.5rem}
.hero h1{font-size:clamp(2.3rem,6.4vw,4.1rem);line-height:1.03;margin:0 0 1.1rem;
  letter-spacing:-.03em;font-weight:800}
.hero h1 .glow{background:linear-gradient(120deg,var(--pink),var(--purple) 55%,var(--cyan));
  -webkit-background-clip:text;background-clip:text;color:transparent}
.hero .lede{font-size:clamp(1.05rem,2.3vw,1.3rem);color:var(--text);max-width:46ch;margin:0 0 1rem}
.hero .sub{color:var(--muted);max-width:52ch;margin:0 0 2rem}
.hero-grid{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:2.5rem;align-items:center}
@media(max-width:900px){.hero-grid{grid-template-columns:1fr;gap:2rem}}
.hero-shot{position:relative}
.hero-shot img{border-radius:14px;border:1px solid var(--line);box-shadow:var(--shadow)}
.hero-shot .phone{position:absolute;right:-10px;bottom:-34px;width:31%;border-radius:18px;
  border:1px solid var(--line);box-shadow:0 22px 44px rgba(0,0,0,.6)}
@media(max-width:560px){.hero-shot .phone{display:none}}

.btns{display:flex;gap:.7rem;flex-wrap:wrap;align-items:center}
.btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--panel2);color:var(--text);
  border:1px solid var(--line);border-radius:12px;padding:.72rem 1.15rem;font-weight:700;
  font-size:.95rem;transition:transform .08s,filter .15s}
.btn:hover{filter:brightness(1.18);text-decoration:none}
.btn:active{transform:translateY(1px)}
.btn.primary{background:linear-gradient(135deg,var(--pink),var(--purple));border-color:transparent;color:#fff}
.btn.ghost{background:transparent}

.chips{display:flex;gap:.45rem;flex-wrap:wrap;margin:1.6rem 0 0}
.chip{font-size:.78rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--muted);background:rgba(255,255,255,.035);border:1px solid var(--line);
  border-radius:99px;padding:.32rem .7rem}
.chip.on{color:var(--ok);border-color:rgba(0,230,118,.32);background:rgba(0,230,118,.09)}

/* ── sections ────────────────────────────────────────────────────────────── */
section{padding:clamp(3rem,7vw,5rem) 0;scroll-margin-top:70px}
section.alt{background:linear-gradient(180deg,transparent,rgba(21,26,40,.55) 12%,rgba(21,26,40,.55) 88%,transparent);
  border-top:1px solid rgba(37,44,64,.5);border-bottom:1px solid rgba(37,44,64,.5)}
.eyebrow{display:flex;align-items:center;gap:.5rem;font-size:.78rem;font-weight:800;
  letter-spacing:.16em;text-transform:uppercase;color:var(--pink);margin:0 0 .7rem}
.eyebrow svg{width:16px;height:16px}
h2{font-size:clamp(1.6rem,3.6vw,2.4rem);line-height:1.15;margin:0 0 .8rem;
  letter-spacing:-.02em;font-weight:800}
h3{font-size:1.06rem;margin:0 0 .45rem;font-weight:700}
.section-lede{color:var(--muted);max-width:62ch;font-size:1.02rem;margin:0 0 2.2rem}
.muted{color:var(--muted)}

.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(255px,1fr));gap:1rem}
.card{background:linear-gradient(180deg,var(--panel),rgba(16,19,29,.9));border:1px solid var(--line);
  border-radius:var(--r);padding:1.25rem 1.35rem}
.card .ic{font-size:1.5rem;line-height:1;margin-bottom:.6rem;display:block}
.card p{margin:0;color:var(--muted);font-size:.94rem}
.card p + p{margin-top:.6rem}

/* the loop */
.loop{counter-reset:step;display:grid;gap:.9rem}
.loop li{counter-increment:step;list-style:none;display:grid;grid-template-columns:auto 1fr;
  gap:1rem;align-items:start;background:rgba(21,26,40,.55);border:1px solid var(--line);
  border-radius:14px;padding:1rem 1.2rem}
/* 🔴 The <b> and <span> live in a wrapping <div>, not loose in the <li>. With a
   two-column grid and three loose children, ::before takes column 1, the title takes
   column 2, and the BODY wraps to the next row's column 1 — every step rendered with a
   right-floating title above a full-width paragraph. `.rule` and `.track` wrap for the
   same reason; this one did not and it showed. */
.loop li::before{content:counter(step);display:grid;place-items:center;width:34px;height:34px;
  border-radius:11px;background:linear-gradient(135deg,var(--pink),var(--purple));
  color:#fff;font-weight:800;font-size:.95rem}
.loop b{display:block;margin-bottom:.15rem}
.loop span{color:var(--muted);font-size:.94rem}

/* ── shots ───────────────────────────────────────────────────────────────── */
.shot-feature{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,420px),1fr));
  gap:1.4rem;margin-bottom:1.4rem}
.shot{background:var(--panel);border:1px solid var(--line);border-radius:14px;overflow:hidden;
  transition:transform .14s,border-color .14s}
.shot:hover{transform:translateY(-3px);border-color:rgba(255,45,117,.45)}
.shot button{display:block;width:100%;padding:0;border:0;background:none;cursor:zoom-in}
.shot img{width:100%;height:auto}
.shot figcaption{padding:.8rem 1rem .95rem;font-size:.9rem;color:var(--muted);
  border-top:1px solid var(--line)}
.shot figcaption b{color:var(--text);display:block;font-size:.95rem;margin-bottom:.12rem}
.shot-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:1rem}
.shot-grid .shot img{aspect-ratio:1280/860;object-fit:cover;object-position:top}
.shot-grid.phones{grid-template-columns:repeat(auto-fill,minmax(168px,1fr))}
.shot-grid.phones .shot img{aspect-ratio:390/844;object-fit:cover;object-position:top}

/* lightbox */
.lb{position:fixed;inset:0;z-index:90;background:rgba(6,7,12,.93);backdrop-filter:blur(8px);
  display:grid;grid-template-rows:1fr auto;padding:2.2rem 1.2rem 1.2rem}
.lb img{max-width:100%;max-height:100%;margin:auto;border-radius:10px;
  border:1px solid var(--line);box-shadow:var(--shadow)}
.lb .cap{text-align:center;color:var(--muted);padding-top:1rem;font-size:.92rem}
.lb .cap b{color:var(--text)}
.lb .x{position:absolute;top:.8rem;right:1rem;background:var(--panel2);color:var(--text);
  border:1px solid var(--line);border-radius:10px;width:40px;height:40px;font-size:1.1rem;
  cursor:pointer;font-weight:700}
.lb .nav{position:absolute;top:50%;transform:translateY(-50%);background:var(--panel2);
  color:var(--text);border:1px solid var(--line);border-radius:12px;width:44px;height:64px;
  cursor:pointer;font-size:1.3rem;font-weight:700;opacity:.8}
.lb .nav:hover{opacity:1}
.lb .prev{left:.8rem}.lb .next{right:.8rem}

/* ── rules / privacy ─────────────────────────────────────────────────────── */
.rules{display:grid;gap:1rem;counter-reset:rule}
.rule{counter-increment:rule;display:grid;grid-template-columns:auto 1fr;gap:1.1rem;
  background:linear-gradient(135deg,rgba(255,45,117,.07),rgba(124,77,255,.05)),var(--panel);
  border:1px solid var(--line);border-radius:14px;padding:1.15rem 1.3rem}
.rule::before{content:counter(rule);font-size:1.5rem;font-weight:800;line-height:1;
  color:var(--pink);opacity:.55}
.rule b{display:block;margin-bottom:.2rem}
.rule span{color:var(--muted);font-size:.94rem}

/* ── state + roadmap ─────────────────────────────────────────────────────── */
.ver{display:flex;align-items:baseline;gap:.7rem;flex-wrap:wrap;margin-bottom:1.4rem}
.ver .n{font-size:2.1rem;font-weight:800;letter-spacing:-.02em;
  background:linear-gradient(120deg,var(--pink),var(--purple));-webkit-background-clip:text;
  background-clip:text;color:transparent}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:.7rem;margin-bottom:2rem}
.stats div{background:rgba(0,0,0,.24);border:1px solid var(--line);border-radius:12px;padding:.7rem .9rem}
.stats dt{font-size:.7rem;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.stats dd{margin:.2rem 0 0;font-weight:700;font-size:1.15rem}

.track{display:grid;gap:.7rem;margin:0;padding:0;list-style:none}
.track li{display:grid;grid-template-columns:auto 1fr;gap:.9rem;align-items:start;
  padding:.85rem 1.1rem;border:1px solid var(--line);border-radius:12px;background:rgba(21,26,40,.5)}
.track .tag{font-size:.68rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;
  padding:.28rem .55rem;border-radius:7px;white-space:nowrap}
.track .done{background:rgba(0,230,118,.13);color:var(--ok);border:1px solid rgba(0,230,118,.3)}
.track .next{background:rgba(255,179,0,.12);color:var(--warn);border:1px solid rgba(255,179,0,.3)}
.track .idea{background:rgba(124,77,255,.14);color:#b39cff;border:1px solid rgba(124,77,255,.32)}
.track b{display:block}
.track span{color:var(--muted);font-size:.93rem}

/* ── downloads ───────────────────────────────────────────────────────────── */
.dl{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:1rem;margin-bottom:1.4rem}
.dlcard{background:linear-gradient(180deg,var(--panel),rgba(16,19,29,.9));border:1px solid var(--line);
  border-radius:var(--r);padding:1.25rem 1.35rem;display:flex;flex-direction:column;gap:.5rem}
.dlcard .ic{font-size:1.6rem}
.dlcard p{margin:0;color:var(--muted);font-size:.9rem;flex:1}
.dlcard .meta{font-size:.76rem;color:var(--dim);letter-spacing:.03em}
.dlcard .btn{justify-content:center;margin-top:.4rem}

pre{background:#080a11;border:1px solid var(--line);border-radius:12px;padding:1rem 1.1rem;
  overflow-x:auto;font:13px/1.65 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  color:#cfd3e6;margin:0 0 1rem}
pre .c{color:var(--dim)}
code{background:var(--bg2);border:1px solid var(--line);padding:.1em .42em;border-radius:6px;
  font:.88em/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}

/* ── callouts ────────────────────────────────────────────────────────────── */
.note{border-left:3px solid var(--pink);background:rgba(255,45,117,.06);border-radius:0 12px 12px 0;
  padding:1rem 1.2rem;margin:1.4rem 0;color:var(--muted);font-size:.95rem}
.note b{color:var(--text)}
.note.safe{border-left-color:var(--warn);background:rgba(255,179,0,.07)}
.note.ok{border-left-color:var(--ok);background:rgba(0,230,118,.06)}

/* ── contact ─────────────────────────────────────────────────────────────── */
.contact{display:grid;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:1rem}
/* 🔴 The card is sized so the LONGEST handle fits on one line, rather than letting it
   wrap. A Matrix ID is an address people retype; broken across lines as
   "@lockedtrainee:matrix.aurionbl / ack.com" it reads as two things and copies badly.
   MEASURED, not guessed: "@lockedtrainee:matrix.aurionblack.com" is the longest string
   this has to hold and renders 290px at 13px / 268px at 12px. With three columns at
   their 360px minimum the box is 291px, so 12px clears it by 23px — and the tightest
   case is exactly three-across at the minimum, not the narrow viewport where the grid
   has already reflowed to two. 13px in a 276px box was a two-line wrap. */
.handle{font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  background:#080a11;border:1px solid var(--line);border-radius:10px;padding:.62rem .8rem;
  display:block;color:var(--cyan);overflow-wrap:anywhere;margin:.3rem 0 .1rem}

/* ── footer ──────────────────────────────────────────────────────────────── */
footer{border-top:1px solid var(--line);padding:2.6rem 0 3.4rem;color:var(--muted);font-size:.9rem}
footer .cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1.6rem;margin-bottom:2rem}
footer h4{margin:0 0 .5rem;font-size:.76rem;letter-spacing:.14em;text-transform:uppercase;color:var(--dim)}
footer ul{list-style:none;margin:0;padding:0;display:grid;gap:.3rem}
footer .fine{border-top:1px solid var(--line);padding-top:1.4rem;font-size:.84rem;color:var(--dim)}

.paw{display:inline-block;vertical-align:-.16em}
.paw svg{width:1.05em;height:1.05em}

/* ── spacing utilities ───────────────────────────────────────────────────────
   🔴 These exist because the page ships a strict `style-src 'self'` CSP, which
   blocks the style="" ATTRIBUTE as well as <style> blocks. Nine inline rules were
   written here first and every one of them was silently dropped by the browser —
   the page rendered, nothing errored on screen, and the spacing was simply wrong.
   Only the console said so. Put spacing in a class; never reach for style="". */
.mt-s{margin-top:1rem}
.mt-l{margin-top:2.2rem}
.mt-xl{margin-top:3rem}
.mb-xs{margin-bottom:.7rem}
.mb-s{margin-bottom:1rem}
.pull-up{margin-top:-.4rem}
.tagline{margin:0;max-width:32ch}
.brand-foot{margin-bottom:.7rem}
