
  :root{
    --bg:#05060a; --bg-2:#080a10; --bg-3:#0b0e16; --bg-4:#0e1219;
    --hair:rgba(255,255,255,.08); --hair-2:rgba(255,255,255,.05);
    --tx:#e9e8e0; --tx-2:#b6bab0; --tx-3:#7c8479;
    --gold:#b0b285; --gold-2:#d3d5a4; --gold-dim:rgba(176,178,133,.36);
    --cool:#8fb6c9; --warm:#c98f6e;
    --sans:"Inter","Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif;
    --mono:"JetBrains Mono",Consolas,monospace;
    --ease:cubic-bezier(.22,.61,.36,1);
  }
  *{box-sizing:border-box}
  html,body{margin:0;background:#08090c}
  body{font-family:var(--sans);color:var(--tx);-webkit-font-smoothing:antialiased}

  .wrap{max-width:1240px;margin:0 auto;padding:18px 16px 30px}
  .mknote{display:flex;gap:10px;align-items:baseline;flex-wrap:wrap;font-size:12.5px;color:#a9b39c;
    border:1px solid var(--gold-dim);background:linear-gradient(180deg,rgba(176,178,133,.07),rgba(176,178,133,.02));
    padding:9px 12px;border-radius:6px;margin-bottom:14px}
  .mknote b{color:var(--gold-2)}

  .brow{border:1px solid var(--hair);border-radius:12px;overflow:hidden;background:var(--bg);
    box-shadow:0 30px 90px rgba(0,0,0,.75)}
  .bar{display:flex;align-items:center;gap:10px;padding:10px 13px;background:#0b0d12;border-bottom:1px solid var(--hair)}
  .dots{display:flex;gap:6px}
  .dots i{width:9px;height:9px;border-radius:50%;background:#232830;display:block}
  .url{flex:1;background:#07080c;border:1px solid var(--hair);border-radius:5px;font:12px var(--mono);
    color:var(--tx-3);padding:5px 10px}
  .url b{color:var(--gold);font-weight:400}
  .live{display:flex;align-items:center;gap:7px;font:10.5px var(--mono);letter-spacing:.16em;color:var(--tx-3)}
  .live i{width:6px;height:6px;border-radius:50%;background:var(--cool);box-shadow:0 0 8px var(--cool);
    animation:blip 2.4s ease-in-out infinite}
  @keyframes blip{0%,100%{opacity:.35}50%{opacity:1}}

  .vp{height:min(80vh,880px);overflow-y:auto;overflow-x:hidden;position:relative;background-color:var(--bg);
    background-image:linear-gradient(rgba(255,255,255,.026) 1px,transparent 1px),
                     linear-gradient(90deg,rgba(255,255,255,.026) 1px,transparent 1px);
    background-size:72px 72px;animation:drift 48s linear infinite;scroll-behavior:smooth}
  @keyframes drift{to{background-position:72px 72px,72px 72px}}
  .vp::-webkit-scrollbar{width:10px}
  .vp::-webkit-scrollbar-track{background:#070809}
  .vp::-webkit-scrollbar-thumb{background:#22282a;border-radius:6px}

  nav{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:15px 30px;
    border-bottom:1px solid var(--hair);position:sticky;top:0;z-index:9;
    background:linear-gradient(180deg,rgba(5,6,10,.97),rgba(5,6,10,.84));backdrop-filter:blur(10px)}
  nav img{height:31px;display:block;opacity:.95}
  nav ul{display:flex;gap:20px;list-style:none;margin:0;padding:0;flex-wrap:wrap}
  nav a{color:var(--tx-2);text-decoration:none;font:11.5px var(--mono);letter-spacing:.17em;position:relative;
    transition:color .25s var(--ease)}
  nav a:hover{color:#fff}
  nav a.new{color:var(--gold-2)}
  nav a.new:after{content:"";position:absolute;left:0;right:0;bottom:-6px;height:1px;background:var(--gold);
    box-shadow:0 0 10px var(--gold)}

  section{padding:74px 30px;position:relative}
  .t0{background:var(--bg)} .t1{background:linear-gradient(180deg,var(--bg-2),var(--bg))}
  .t2{background:linear-gradient(180deg,var(--bg-3),var(--bg-2))}
  .t3{background:linear-gradient(180deg,var(--bg-4),var(--bg-3))}

  .eyebrow{font:11px var(--mono);letter-spacing:.24em;color:var(--gold);margin-bottom:18px;
    display:flex;align-items:center;gap:10px}
  .eyebrow:before{content:"";width:26px;height:1px;background:var(--gold);opacity:.6}
  h1{font-size:clamp(30px,4.6vw,56px);line-height:1.02;margin:0 0 20px;letter-spacing:-.028em;font-weight:600;
    background:linear-gradient(180deg,#fff 0%,#d3d6c8 62%,#9ba089 100%);-webkit-background-clip:text;
    background-clip:text;color:transparent}
  h2{font-size:clamp(21px,2.6vw,34px);line-height:1.1;margin:0 0 14px;letter-spacing:-.018em;font-weight:600;color:#f3f2eb}
  h3{font-size:17px;margin:0 0 8px;font-weight:600;color:#efeee6}
  .lede{font-size:17.5px;line-height:1.62;color:var(--tx-2);max-width:64ch;margin:0 0 22px}
  p{font-size:14.6px;line-height:1.7;max-width:70ch;color:var(--tx-2)}
  .fine{font-size:12.4px;color:var(--tx-3);margin-top:12px}
  .anchor{font:12px var(--mono);letter-spacing:.22em;color:var(--gold);margin:30px 0 24px;padding:13px 0;
    border-top:1px solid var(--hair-2);border-bottom:1px solid var(--hair-2)}

  .cta{display:flex;gap:10px;flex-wrap:wrap}
  .btn{display:inline-block;text-decoration:none;font:12.5px var(--mono);letter-spacing:.1em;padding:12px 17px;
    border:1px solid var(--hair);color:var(--tx);border-radius:4px;background:rgba(255,255,255,.014);
    transition:border-color .3s var(--ease),transform .3s var(--ease)}
  .btn:hover{border-color:var(--gold-dim);transform:translateY(-1px)}
  .btn.p{background:linear-gradient(180deg,var(--gold-2),var(--gold));border-color:transparent;color:#12140f;
    box-shadow:0 0 0 1px rgba(176,178,133,.5),0 10px 32px rgba(176,178,133,.18)}
  .btn.p:hover{box-shadow:0 0 0 1px var(--gold),0 14px 44px rgba(176,178,133,.3)}

  /* hero */
  .hero{position:relative;overflow:hidden;min-height:600px}
  #loadpath{position:absolute;inset:0;width:100%;height:100%;display:block;opacity:.9}
  .hero-in{position:relative;z-index:2;max-width:800px}
  .spot{position:absolute;inset:0;z-index:1;pointer-events:none;
    background:radial-gradient(460px 460px at var(--mx,72%) var(--my,16%),rgba(176,178,133,.11),transparent 70%)}

  /* split-reality toggle */
  .split{margin-top:36px;border:1px solid var(--hair);border-radius:8px;overflow:hidden;background:#06070b;
    position:relative;z-index:2}
  .seg{display:flex;align-items:center;gap:0;padding:8px;border-bottom:1px solid var(--hair);background:#080a0f}
  .seg button{-webkit-appearance:none;appearance:none;background:none;border:0;cursor:pointer;
    font:11.5px var(--mono);letter-spacing:.14em;color:var(--tx-3);padding:9px 15px;border-radius:4px;
    transition:color .25s var(--ease),background .25s var(--ease)}
  .seg button[aria-pressed="true"]{color:#12140f;background:linear-gradient(180deg,var(--gold-2),var(--gold))}
  .seg .sp{flex:1}
  .seg .segnote{font:10.5px var(--mono);letter-spacing:.14em;color:var(--tx-3);padding-right:8px}
  .stage{position:relative;aspect-ratio:16/7;background:#04050a}
  .pane{position:absolute;inset:0;opacity:0;transition:opacity .7s var(--ease);pointer-events:none}
  .pane.on{opacity:1;pointer-events:auto}
  .pane img{width:100%;height:100%;object-fit:cover;display:block}
  .pane .veil{position:absolute;inset:0;background:linear-gradient(180deg,rgba(4,5,10,.25),rgba(4,5,10,.86))}
  .pane .cap2{position:absolute;left:18px;right:18px;bottom:14px;display:flex;justify-content:space-between;
    gap:14px;align-items:flex-end;flex-wrap:wrap}
  .pane .cap2 span{font:12px var(--mono);letter-spacing:.08em;color:#dcdccf}
  .pane .cap2 em{font-style:normal;font:11px var(--mono);letter-spacing:.14em;color:var(--gold)}
  .chips{position:absolute;left:18px;top:16px;display:flex;gap:7px;flex-wrap:wrap}
  .chip{font:10.5px var(--mono);letter-spacing:.13em;border:1px solid var(--hair);background:rgba(5,6,10,.7);
    color:var(--tx-2);padding:5px 9px;border-radius:3px}
  .chip.g{color:var(--gold-2);border-color:var(--gold-dim)}
  .spec{position:absolute;inset:0;pointer-events:none;
    background-image:linear-gradient(rgba(143,182,201,.16) 1px,transparent 1px),
                     linear-gradient(90deg,rgba(143,182,201,.16) 1px,transparent 1px);
    background-size:48px 48px;mix-blend-mode:screen;opacity:.6}
  .splitfoot{padding:14px 18px;font:12.4px var(--sans);color:var(--tx-3);border-top:1px solid var(--hair);background:#07080d}
  .nojs .stage{aspect-ratio:auto;display:grid;gap:1px}
  .nojs .pane{position:relative;opacity:1;pointer-events:auto;aspect-ratio:16/7}
  .nojs .seg{display:none}

  /* pillars */
  .pillars{display:grid;grid-template-columns:repeat(auto-fit,minmax(268px,1fr));gap:16px;margin-top:28px}
  .pl{border:1px solid var(--hair);border-radius:8px;padding:24px 22px;position:relative;overflow:hidden;
    background:linear-gradient(160deg,rgba(255,255,255,.032),rgba(255,255,255,0));
    transition:border-color .35s var(--ease),transform .35s var(--ease)}
  .pl:hover{border-color:var(--gold-dim);transform:translateY(-4px)}
  .pl:before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--gold);opacity:.5}
  .pl .rn{font:11px var(--mono);letter-spacing:.22em;color:var(--gold);margin-bottom:10px}
  .pl h3{font-size:19px;margin-bottom:10px}
  .pl .sub{font:11px var(--mono);letter-spacing:.14em;color:var(--tx-3);margin-bottom:12px}
  .pl p{font-size:14px}
  .pl .go{display:inline-block;margin-top:14px;font:11.5px var(--mono);letter-spacing:.12em;color:var(--gold-2);
    text-decoration:none;border-bottom:1px solid var(--gold-dim)}

  .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(236px,1fr));gap:15px;margin-top:26px}
  .card{border:1px solid var(--hair);border-radius:8px;overflow:hidden;
    background:linear-gradient(160deg,rgba(255,255,255,.03),rgba(255,255,255,0));
    transition:border-color .35s var(--ease),transform .35s var(--ease)}
  .card:hover{border-color:var(--gold-dim);transform:translateY(-3px)}
  .card img{width:100%;aspect-ratio:16/10;object-fit:cover;display:block;opacity:.8;transition:opacity .4s var(--ease)}
  .card:hover img{opacity:.95}
  .card .b{padding:15px 16px}
  .card .date{font:10.5px var(--mono);color:var(--gold);letter-spacing:.14em}
  .card p{margin:7px 0 0;font-size:13.6px;color:var(--tx-2)}

  .doors{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin-top:24px}
  .door{border:1px solid var(--hair);border-radius:8px;padding:18px 18px;background:rgba(255,255,255,.016);
    transition:border-color .3s var(--ease)}
  .door:hover{border-color:var(--gold-dim)}
  .door b{display:block;font:12px var(--mono);letter-spacing:.16em;color:var(--gold);margin-bottom:8px}
  .door span{font-size:13.6px;color:var(--tx-2);line-height:1.6}

  .tech{display:grid;gap:14px;margin-top:26px}
  .trow{display:grid;grid-template-columns:1.15fr 1.4fr;gap:0;border:1px solid var(--hair);border-radius:8px;
    overflow:hidden;background:linear-gradient(140deg,rgba(255,255,255,.028),rgba(255,255,255,0))}
  .trow .im{position:relative;min-height:186px;overflow:hidden;background:#07080c}
  .trow .im img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.68}
  .trow .tx{padding:22px 24px}
  .trow .no{font:11px var(--mono);letter-spacing:.2em;color:var(--gold);margin-bottom:9px}
  .trow .vg{font-size:13.6px;line-height:1.62;color:var(--tx-2);margin:8px 0 0}

  .wall{display:flex;flex-wrap:wrap;gap:18px 28px;align-items:center;margin-top:20px;
    filter:grayscale(1) brightness(1.9);opacity:.45;transition:opacity .4s var(--ease)}
  .wall:hover{opacity:.75}
  .wall img{height:19px}

  .posts{display:grid;gap:0;margin-top:20px;max-width:760px}
  .post{display:flex;justify-content:space-between;gap:14px;border-bottom:1px solid var(--hair-2);padding:11px 0}
  .post a{color:var(--tx);text-decoration:none;font-size:14.4px}
  .post a:hover{color:var(--gold-2)}
  .post time{font:11px var(--mono);color:var(--tx-3)}

  .pg{padding:16px 30px;background:#06070a;border-top:1px solid var(--hair-2);border-bottom:1px solid var(--hair-2)}
  .pg span{font:11px var(--mono);letter-spacing:.2em;color:var(--gold);text-transform:uppercase}

  footer{padding:34px 30px 48px;border-top:1px solid var(--hair);background:#040508}
  footer .f{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;font-size:13px;color:var(--tx-3)}
  footer b{color:#efeee6}
  footer a{color:var(--tx-2);text-decoration:none}
  footer a:hover{color:var(--gold-2)}

  .elsebox{border:1px solid var(--hair);border-radius:8px;padding:20px 22px;margin:0 30px 30px;
    background:linear-gradient(180deg,rgba(255,255,255,.025),rgba(255,255,255,0))}
  .elsebox h3{color:var(--gold);font:11.5px var(--mono);letter-spacing:.2em;text-transform:uppercase;margin-bottom:12px}
  .elsebox p{font-size:13.6px;color:var(--tx-2);margin:0 0 11px}
  .pill{display:inline-block;font:11px var(--mono);letter-spacing:.09em;border:1px solid var(--hair);color:var(--gold-2);
    padding:5px 10px;border-radius:3px;margin:0 6px 6px 0;background:rgba(176,178,133,.04)}

  .rv{opacity:0;transform:translateY(14px);transition:opacity .8s var(--ease),transform .8s var(--ease);
    transition-delay:var(--d,0ms)}
  .rv.in{opacity:1;transform:none}
  @media (prefers-reduced-motion:reduce){
    .rv{opacity:1;transform:none;transition:none}
    .vp,.live i{animation:none}
  }
  @media (max-width:860px){
    .trow{grid-template-columns:1fr}
    .stage{aspect-ratio:4/3}
  }

  /* ---- mock-only chrome (not part of the site design) ---- */
  .pmap{border:1px solid var(--hair);border-radius:10px;background:#07080c;margin-bottom:14px;padding:10px 12px}
  .pmap .h{font:10.5px var(--mono);letter-spacing:.18em;color:var(--gold);margin-bottom:8px}
  .pmap a{display:inline-block;font:11px var(--mono);letter-spacing:.06em;color:var(--tx-2);text-decoration:none;
    border:1px solid var(--hair);border-radius:3px;padding:4px 8px;margin:0 5px 5px 0}
  .pmap a:hover{border-color:var(--gold-dim);color:var(--gold-2)}
  .pmap a.here{color:#12140f;background:linear-gradient(180deg,var(--gold-2),var(--gold));border-color:transparent}
  .gal{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin-top:22px}
  .gal figure{margin:0;border:1px solid var(--hair);border-radius:6px;overflow:hidden;background:#07080c}
  .gal img{width:100%;aspect-ratio:4/3;object-fit:cover;display:block;opacity:.82;transition:opacity .4s var(--ease)}
  .gal figure:hover img{opacity:.98}
  .gal figcaption{font:11px var(--mono);letter-spacing:.08em;color:var(--tx-3);padding:8px 10px;
    border-top:1px solid var(--hair)}
  table{width:100%;border-collapse:collapse;margin-top:20px;font-size:13.6px}
  th,td{text-align:left;padding:10px;border-bottom:1px solid var(--hair-2);color:var(--tx-2)}
  th{font:11px var(--mono);letter-spacing:.14em;color:var(--gold)}
  td.n{text-align:right;font:12.5px var(--mono);color:var(--tx)}
  .qa{border-top:1px solid var(--hair-2);padding:18px 0}
  .qa .q{font-size:15.4px;color:#f0efe8;margin:0 0 8px;font-weight:600}
  .qa .a{margin:0;font-size:14.4px}
  .sandbox{border:1px solid var(--hair);border-radius:8px;overflow:hidden;background:#07080c;margin-top:24px}
  .sandbox .hd{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;align-items:center;
    padding:12px 15px;border-bottom:1px solid var(--hair);background:#080a0f}
  .sandbox .hd b{font:11.5px var(--mono);letter-spacing:.14em;color:var(--gold)}
  .sandbox .bd{padding:16px 18px}
  .hashrow{display:flex;gap:12px;flex-wrap:wrap;align-items:center;font:12px var(--mono);color:var(--tx-2);
    border:1px solid var(--hair);border-radius:4px;padding:10px 12px;margin-top:10px;background:#05060a}
  .ok{color:var(--cool)}
  .form{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px;margin-top:22px}
  .form label{display:block;font:11px var(--mono);letter-spacing:.12em;color:var(--tx-3)}
  .form input,.form select,.form textarea{width:100%;margin-top:7px;background:#07080c;border:1px solid var(--hair);
    border-radius:4px;color:var(--tx);font:14px var(--sans);padding:10px 11px}
  .form .wide{grid-column:1/-1}
  .fcols{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:26px}
  .fcol{display:flex;flex-direction:column;gap:8px}
  .fcol b{font:10.5px var(--mono);letter-spacing:.18em;color:var(--gold);margin-bottom:3px}
  .fcol a{color:var(--tx-2);text-decoration:none;font-size:13px}
  .fcol a:hover{color:var(--gold-2)}
  .mocknote{border:1px dashed rgba(176,178,133,.4);border-radius:6px;padding:10px 12px;margin-top:22px;
    font:11.5px var(--mono);letter-spacing:.06em;color:var(--gold-dim)}
  /* ---- real design, added for the "Request a demo" nav button ---- */
  nav .navr{display:flex;align-items:center;gap:22px;flex-wrap:wrap}
  nav .demobtn{font:11px var(--mono);letter-spacing:.14em;padding:9px 14px;border-radius:4px;white-space:nowrap;
    background:linear-gradient(180deg,var(--gold-2),var(--gold));color:#12140f;text-decoration:none;
    box-shadow:0 0 0 1px rgba(176,178,133,.5),0 8px 26px rgba(176,178,133,.16)}
  nav .demobtn:hover{color:#12140f;box-shadow:0 0 0 1px var(--gold),0 12px 34px rgba(176,178,133,.28)}

/* ============ Look A — Studio Black, applied over the mock ============ */
:root{
  --bg:#08090b; --bg-2:#0b0d0f; --bg-3:#0e1013; --bg-4:#101214;
  --hair:rgba(255,255,255,.10); --hair-2:rgba(255,255,255,.16);
  --tx:#eceae3; --tx-2:#a9a8a0; --tx-3:#8a8981;
  --gold:#c2a86a; --gold-2:#d8c48f; --gold-dim:rgba(194,168,106,.36);
  --serif:"Georgia","Times New Roman",serif;
}
body{background:var(--bg);color:var(--tx)}
h1,h2,.line{font-family:var(--serif);font-weight:400;letter-spacing:-.022em}
h1{background:none;-webkit-background-clip:initial;background-clip:initial;
   color:var(--tx);font-size:clamp(38px,5.2vw,86px);line-height:.99}
h1 em{font-style:italic;color:var(--gold)}
h2{color:var(--tx);font-size:clamp(26px,3.3vw,48px);line-height:1.06}
h2 em{font-style:italic;color:var(--gold)}
h3{font-family:var(--sans);font-weight:600}
.lede{color:var(--tx-2)}
p{color:var(--tx-2)}
.eyebrow{font-family:var(--mono);color:var(--gold);letter-spacing:.34em}
.hair,.card,.door,.step,.qa,.post,.trow{border-color:var(--hair)}
.card,.door,.step,.qa{background:linear-gradient(180deg,rgba(255,255,255,.022),rgba(255,255,255,0))}
a.card{display:block;text-decoration:none;color:inherit}
a.card:hover{border-color:var(--gold-dim)}
a.card:hover .date{color:var(--gold-2)}

/* --- shell: header --- */
.sbar{border-bottom:1px solid var(--hair);background:rgba(8,9,11,.92);position:sticky;top:0;z-index:50}
.swrap{width:min(1200px,calc(100% - 48px));margin:0 auto}
.sbar .swrap{display:flex;align-items:center;justify-content:space-between;min-height:88px;gap:24px}
.smark{display:block}
.smark img{display:block;height:34px;width:auto}
.smark i{color:var(--gold);font-style:normal}
.sbar nav ul{display:flex;gap:38px;list-style:none;margin:0;padding:0}
.sbar nav a{font:500 11.5px/1 var(--mono);letter-spacing:.2em;text-transform:uppercase;color:var(--tx-3)}
.sbar nav a:hover{color:var(--tx)}
.sbtn{display:inline-block;border:1px solid var(--gold);color:var(--gold);text-decoration:none;
      font:600 11px/1 var(--mono);letter-spacing:.2em;text-transform:uppercase;padding:15px 24px}
.sbtn.p{background:var(--gold);color:#12100a;border-color:var(--gold)}
.sbtn.p:hover{background:var(--gold-2)}
.sbtn:hover{color:var(--gold-2);border-color:var(--gold-2)}

/* --- shell: closing ask --- */
.sask{border-top:1px solid var(--hair-2);margin-top:84px}
.sask .swrap{padding:54px 0 60px;display:flex;align-items:center;justify-content:space-between;gap:40px}
.saskline{font:400 clamp(20px,2.2vw,29px)/1.3 var(--serif);color:var(--tx);margin:0;max-width:760px}

/* --- shell: footer --- */
.sfoot{border-top:1px solid var(--hair);margin-top:0}
.sfoot .swrap{padding:46px 0 40px}
.scols{display:grid;grid-template-columns:repeat(4,1fr);gap:34px}
.scol b{display:block;font:600 10px/1 var(--mono);letter-spacing:.24em;text-transform:uppercase;
        color:var(--gold);margin-bottom:16px}
.scol ul{list-style:none;margin:0;padding:0}
.scol li{margin-bottom:9px}
.scol a{font:400 12.5px/1.5 var(--mono);letter-spacing:.06em;color:var(--tx-3);text-decoration:none}
.scol a:hover{color:var(--gold)}
.shouse{font:600 12.5px/1 var(--mono);letter-spacing:.24em;text-transform:uppercase;color:var(--gold);
        margin-top:46px;padding-top:26px;border-top:1px solid var(--hair)}
.saddr{font:400 11.5px/1.7 var(--mono);color:var(--tx-3);margin-top:14px;letter-spacing:.04em}

/* --- responsive --- */
@media (max-width:960px){
  .scols{grid-template-columns:repeat(2,1fr)}
  .sask .swrap{flex-direction:column;align-items:flex-start}
}
@media (max-width:760px){
  .swrap{width:calc(100% - 32px)}
  .sbar .swrap{min-height:auto;padding:16px 0;flex-wrap:wrap;gap:12px}
  .sbar nav ul{gap:20px;flex-wrap:wrap}
  .sbar nav a{font-size:10.5px}
  .sbtn{padding:12px 16px;font-size:10px}
  .scols{grid-template-columns:1fr;gap:26px}
  h1{font-size:clamp(30px,9vw,44px)}
  h2{font-size:clamp(22px,6vw,30px)}
}

/* ============ R23 — THE READING COLUMN MOVES TOWARD THE CENTRE ============
   Bryan: "I asked for a center column and it's all still left aligned… I don't want all my text
   to be clumped on the left side of the page." Root cause: `.wrap` IS centred, but `p` and
   `.lede` are block elements that began at their container's LEFT EDGE — so on a 1440px screen
   ~700px of text sat against the left of a 1240px container with ~520px of dead space beside it.
   `margin-inline:auto` centres the MEASURE inside the container: the text starts deeper toward
   the centre and the line length is kept (he wants the start moved in, not longer lines).
   Sections stay full-bleed — only the reading column moves. This lives in OVERRIDES, not in
   styles.css, because studio.css is REGENERATED from both and an edit to the output alone would
   be wiped by the next build. */
p, .lede, .fine{max-width:70ch;margin-inline:auto}
.lede{max-width:64ch}

/* R23, attempt 2 — the first fix lost on SPECIFICITY, not on intent. `p{margin-inline:auto}`
   (0,0,1) cannot beat `.qa .a{margin:0}` (0,2,0), so the reading column stayed hugging the left
   on exactly the pages that use .qa. The real cause was worse than the diagnosis: the section
   content was never in a centred container at all — `section{padding:74px 30px}` is FULL-BLEED,
   so text began 30px from the viewport edge whatever the measure was.
   Fix, both halves:
   1. centre the section CONTENT by padding — backgrounds stay full-bleed, content does not:
      `padding-inline: max(28px, (100vw - 1180px)/2)`.
   2. centre the reading MEASURE inside that, with selectors that actually win. */
section{padding-left:max(28px,calc((100vw - 1180px)/2));
        padding-right:max(28px,calc((100vw - 1180px)/2))}
p, .lede, .fine, .qa .q, .qa .a, .card p, .pl p, .elsebox p, .mknote p, .prose p{
  max-width:70ch;margin-inline:auto}
.lede, .hero-in .lede{max-width:64ch}
.hero-in{margin-inline:auto}

/* ============ R31 — THREE SUBTLE MOVES ============
   Bryan: "very subtle, low-key animation, something interesting. Not over the top." Three ideas
   only, and the constraints are the job.

   HOW, AND WHY THIS WAY.
   1. THE ANIMATION IS CSS, THE TRIGGER IS THE BROWSER. `animation-timeline: view()` is a SCROLL-
      DRIVEN animation -- no JavaScript, no observer per element, no requestAnimationFrame loop. That
      is the "CSS-first" the brief asked for, taken literally.
   2. THE BASE STATE IS THE FINISHED STATE. Nothing here is hidden by default and revealed by code.
      The rule is DRAWN in the stylesheet; the animation only runs where the feature exists. On a
      browser without `animation-timeline`, on a slow connection, with JavaScript off, the page is
      complete -- "if the animation never runs, nothing is missing".
   3. ONLY THREE PROPERTIES MOVE: `transform`, `clip-path`, `opacity`. None of them participates in
      layout, so nothing below can reflow. See the note on the border below, which is the one place
      this could have gone wrong.
   4. `prefers-reduced-motion: reduce` removes the animation entirely and leaves the finished state
      -- the same pattern the hero's `.rv` reveal already uses.

   1 -- HAIRLINES DRAW THEMSELVES. The thin rules the page already draws: the closing band's top
   rule and the footer's. `border-top` becomes 1px and TRANSPARENT, and a 1px pseudo-element draws
   over it left to right. ⚠️ THE BORDER IS TRANSPARENT, NOT REMOVED: a border contributes to the
   box, so deleting it would have shifted every section on the site up by one pixel. Same width,
   same colour slot, same layout.
   2 -- A PHOTOGRAPH ARRIVES WITH ITS LABEL. The labels that already sit on images get their rule
   drawn and their text uncovered left to right by `clip-path` -- a stroke, not a fade. Only labels
   that already exist are touched; nothing here invents a label for an image that has none. */
.sask, .sfoot{position:relative}
.sask{border-top-color:transparent}
.sfoot{border-top-color:transparent}
.sask::after, .sfoot::after{
  content:"";position:absolute;left:0;right:0;top:-1px;height:1px;
  background:var(--hair-2);transform:scaleX(1);transform-origin:left;pointer-events:none}
.sfoot::after{background:var(--hair)}
.stag .stagphoto::before{
  content:"";position:absolute;left:0;right:0;top:-13px;height:1px;
  background:var(--gold-dim);transform:scaleX(1);transform-origin:left;pointer-events:none}
.stag .stagphoto{position:relative}

@keyframes biz-drawline{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes biz-uncover{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}

@supports (animation-timeline: view()){
  @media (prefers-reduced-motion: no-preference){
    /* ONE PASS, keyed to the element entering view -- not a loop, and not tied to a timer. */
    .sask::after, .sfoot::after, .stag .stagphoto::before{
      animation: biz-drawline 1.15s linear both;
      animation-timeline: view();
      animation-range: entry 0% cover 24%}
    /* "DRAWN FROM SPEC" -- the label is uncovered left to right, the way a line is drawn. */
    .cap2 em, .stag .stagphoto figcaption em{
      animation: biz-uncover .95s linear both;
      animation-timeline: view();
      animation-range: entry 8% cover 30%}
  }
}
/* 3 -- ONE LIVE ELEMENT A PAGE, AND ONLY WHERE IT IS NATURAL.
   /solutions is the one page with a second thing of its own: its three marks are LINE DRAWINGS, the
   same language as the load-path canvas behind the home hero. They stroke on once as the block
   enters. One gesture across the three marks -- not three separate animations -- and it is the
   page's only extra move.
   `stroke-dasharray:220` is a fixed length rather than a measured one because measuring needs
   JavaScript per element, which is the thing the brief rules out. The marks live in a 48x48
   viewBox and no path here is close to 220 long, so the overshoot is invisible; if a longer path is
   ever added the dash needs raising, and the shorthand is the tell. */
@supports (animation-timeline: view()){
  @media (prefers-reduced-motion: no-preference){
    .solmark svg *{
      stroke-dasharray:220;stroke-dashoffset:0;
      animation: biz-stroke 1.45s linear both;
      animation-timeline: view();
      animation-range: entry 0% cover 19%}
  }
}
@keyframes biz-stroke{from{stroke-dashoffset:220}to{stroke-dashoffset:0}}
@media (prefers-reduced-motion: reduce){
  .sask::after, .sfoot::after, .stag .stagphoto::before, .cap2 em,
  .stag .stagphoto figcaption em{animation:none}
  .solmark svg *{animation:none;stroke-dasharray:none;stroke-dashoffset:0}
}

/* ============ R30 — THE STAGGERED SECTIONS ON /about ============
   Bryan: "After the hero, split the next four sections into columns, and have a space for a photo on
   the left and right, staggered on the way down."

   THE ALTERNATION IS THE WHOLE EFFECT. One grid definition for all four, so the gutter and the
   column ratio cannot drift between them; only which side the photo sits on changes, and it changes
   every section. Two adjacent sections on the same side is the failure this prevents.

   MOBILE STACKS ONE WAY ROUND: photo above text, for every section. A stagger that reverses on a
   phone reads as a mistake rather than a design.

   The photo box is a fixed 4/3 with object-fit:cover, so four photographs of four different shapes
   occupy the same rectangle. In the builder ON PURPOSE -- studio.css is REGENERATED. */
/* ⚠️ `padding-inline:0` IS THE FIX FOR BRYAN'S "teeny tiny photo and a super narrow column", and it
   was neither of the two hypotheses. Measured in Edge at a 1440px viewport, BEFORE:
       the outer section   w 1425   padding-inline 130   -> content 1165
       .stag (inner)       w 1165   padding-inline 130   -> content  905   <-- THE PADDING WAS APPLIED TWICE
       columns             420.5px 420.5px, gap 64
   `04 — WHO THE WORK`, the section he says is right, gets 1165 with padding-inline 0: ONE inset, not
   two. So the grid was being laid out in a 905px box instead of the 1165 every other section on the
   page uses, and halving 905 minus the gap gives two 420px columns -- two-thirds of what §04 gives a
   single gallery cell.
   NOT the `.lede/.fine` max-width: measured `margin-inline` was already 0px and the max-width was
   550.9px, WIDER than the 421px the paragraph actually got. NOT the photograph failing to fill its
   cell: the <img> measured exactly 421, its cell exactly.
   The outer section keeps its 130px inset, so this cannot drift from the rest of the page. */
.stag{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center;padding-inline:0}
.stag .stagtext{min-width:0}
.stag .stagphoto{margin:0}
.stag .stagphoto img{width:100%;aspect-ratio:4/3;object-fit:cover;display:block;
  border:1px solid var(--hair);border-radius:8px;background:#07080c}
.stag .stagphoto figcaption{font:11px/1.6 var(--mono);letter-spacing:.06em;color:var(--tx-3);
  margin-top:10px;display:flex;justify-content:space-between;gap:14px;align-items:baseline}
/* the same label treatment as `.cap2 em`, so a label on an image looks the same wherever it
   sits on the site -- mono, gold, letter-spaced, and never italic. */
.stag .stagphoto figcaption em{font-style:normal;font:11px var(--mono);letter-spacing:.14em;
  color:var(--gold);white-space:nowrap}
.stag-a .stagtext{grid-column:1;grid-row:1}
.stag-a .stagphoto{grid-column:2;grid-row:1}
.stag-b .stagphoto{grid-column:1;grid-row:1}
.stag-b .stagtext{grid-column:2;grid-row:1}
@media (max-width:900px){
  .stag{grid-template-columns:1fr;gap:26px}
  .stag-a .stagtext,.stag-a .stagphoto,.stag-b .stagtext,.stag-b .stagphoto{grid-column:1}
  .stag-a .stagphoto,.stag-b .stagphoto{grid-row:1}
  .stag-a .stagtext,.stag-b .stagtext{grid-row:2}
}

/* ============ R29 — THE BLOG INDEX ============
   Bryan: "Rebuild it so there's an image for each blog... it's very disjointed. I want the pictures
   visible, organised into grids." It was twenty-one stacked text rows -- a wall of titles.

   THE LOAD-BEARING RULE: the image is the SAME SIZE ON EVERY CARD. `aspect-ratio` plus
   `object-fit:cover` in a fixed box, so a 1024x1024 square post image and a 1600x873 photograph
   occupy the same rectangle. An index where the thumbnails are different shapes reads as broken,
   which is the whole complaint this fixes.
   3 across on desktop, 2 on tablet, 1 on a phone. In the builder ON PURPOSE: studio.css is
   REGENERATED, so a rule added to the output alone is gone at the next build. */
.blogfeat{display:grid;grid-template-columns:1.12fr 1fr;gap:34px;align-items:center;margin:0 0 58px}
.blogfeat .img{aspect-ratio:16/9;overflow:hidden;border:1px solid var(--hair);border-radius:8px;background:#07080c}
.blogfeat .img img{width:100%;height:100%;object-fit:cover;display:block}
.blogfeat .meta{font:11px var(--mono);letter-spacing:.09em;color:var(--tx-3);margin-bottom:9px;
  text-transform:uppercase}
.blogfeat h2{font-family:var(--serif);font-size:clamp(23px,3.1vw,34px);line-height:1.14;margin:0 0 12px}
.blogfeat h2 a{text-decoration:none;color:var(--tx)}
.blogfeat h2 a:hover{color:var(--gold)}
.blogfeat p{margin:0;color:var(--tx-2)}
.bgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:28px}
.bcard{display:flex;flex-direction:column}
.bcard .thumb{aspect-ratio:16/9;overflow:hidden;border:1px solid var(--hair);border-radius:8px;
  background:#07080c;margin-bottom:14px}
.bcard .thumb img{width:100%;height:100%;object-fit:cover;display:block;opacity:.92;
  transition:opacity .4s var(--ease)}
.bcard:hover .thumb img{opacity:1}
.bcard .meta{font:11px var(--mono);letter-spacing:.09em;color:var(--tx-3);margin-bottom:7px;
  text-transform:uppercase}
.bcard h3{font-family:var(--serif);font-size:19px;line-height:1.28;margin:0}
.bcard h3 a{text-decoration:none;color:var(--tx)}
.bcard h3 a:hover{color:var(--gold)}
/* A post with no picture gets a WORD, not a stock photograph and not a generated one -- never a
   gap, and never something invented to fill it. House background, house voice, the category name. */
.typothumb{display:flex;align-items:center;justify-content:center;text-align:center;
  background:linear-gradient(180deg,var(--bg-3),var(--bg-2))}
.typothumb span{font-family:var(--serif);font-size:clamp(17px,2.2vw,23px);color:var(--gold);
  padding:0 20px;line-height:1.2}
@media (max-width:980px){
  .bgrid{grid-template-columns:repeat(2,1fr)}
  .blogfeat{grid-template-columns:1fr;gap:22px}
}
@media (max-width:620px){
  .bgrid{grid-template-columns:1fr}
}

/* ============ R28 — AIR ABOVE THE /solutions BUTTONS ============
   Bryan: "put some proper spacing in there -- it's tight to the bottom of the paragraph, so we need
   some good padding." `.solanswer` carries margin:0, so the button sat directly on the paragraph's
   last line.

   VALUE: 28px, and 20px under 620px. The block's own rhythm is 20px between its elements
   (mark->name 22px, name->problem 20px, problem->answer 20px). This sits one step ABOVE that rhythm
   on purpose: a control needs more air than a text break does, and at 20px it would read as a fourth
   line of the paragraph rather than as the block's action.

   SCOPED TO `.sol .sbtn` -- the three buttons on /solutions and nothing else. The nav button, the
   hero button and the VERIFIED REALITY button on /about all use `.sbtn` too and are NOT affected;
   each already sits inside a <p> or a .cta with its own spacing.

   IN THE BUILDER ON PURPOSE. An inline value on the page would be lost at the next rebuild and
   would reach one button out of three. There are three call sites here; there is one rule. */
.sol .sbtn{margin-top:28px}

/* ============ R27 — THE FOOTER NOTICE ============
   The copyright + trademark notice, copied verbatim from verifiedreality.ca and set below the
   address line. Quieter than the address: it is a legal line, not a way to reach us, so it takes
   the small mono the other fine print uses and sits a step down in contrast.
   In the builder ON PURPOSE — studio.css is REGENERATED, so a rule added to the output alone is
   gone at the next build. */
.sfoot .slegal{margin-top:14px;font:11px/1.7 var(--mono);letter-spacing:.04em;color:var(--tx-3)}

/* ============ R32 — THE CLIENT WALL KEEPS THE MOCK'S WEIGHT ============
   ⚠️ MEASURED, NOT ASSUMED. The mock's own `.wall` rule (styles.css, line ~164) sets
   `filter:grayscale(1) brightness(1.9); opacity:.45`, and that dimming is the whole treatment — it is
   what makes fourteen different-width marks read as one quiet row rather than a row of claims.
   The rendered page measured **opacity 1**: the wall carries `.rv` for the reveal, and `.rv.in`
   (two classes) outranks `.wall` (one), so the reveal was quietly undoing the treatment and the logos
   rendered at more than twice their intended strength on top of brightness(1.9).
   Scoped here, in the builder, so a rebuild cannot lose it. */
.wall.rv, .wall.rv.in{opacity:.45}
.wall:hover, .wall.rv:hover, .wall.rv.in:hover{opacity:.75}   /* the mock's own hover value */

/* ============ R33 — THE RECORD PAGE ============================================================
   ⚠️ ITERATION 4: A REAL TABLE, SEVEN COLUMNS, AND `table-layout: fixed` IS THE MECHANISM.
   Without fixed layout the browser sizes columns to their CONTENT and the table grows past the viewport
   however few columns there are -- that is exactly how six columns still scrolled. With it, the widths
   below are the law and a cell that overflows wraps or truncates instead of widening anything.
   ⚠️ NO HORIZONTAL SCROLL ANYWHERE: not on the page, not inside a wrapper. `.rwrap` is a plain block, not
   a scroller -- it exists to group, not to hide an overflow.
   ⚠️ And it stays a real <table>: <th scope="col"> for the seven headers, <th scope="row"> per asset.
   `.rdash` is the em dash, with a screen-reader equivalent so a lean cell is not silence either. */
.rfilter{display:flex;flex-wrap:wrap;gap:10px;align-items:baseline;margin:6px 0 0}
.rbtn{font:11px var(--mono);letter-spacing:.08em;color:var(--tx-2);background:none;
  border:1px solid var(--hair);border-radius:999px;padding:5px 12px;cursor:pointer;
  transition:color .2s var(--ease),border-color .2s var(--ease),background .2s var(--ease)}
.rbtn:hover{color:var(--tx);border-color:var(--gold)}
.rbtn:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.rbtn.on{color:#0a0b0f;background:var(--gold);border-color:var(--gold)}
.rscope{font-size:12.5px;line-height:1.7;color:var(--tx-3);margin:14px 0 0;max-width:74ch}
.rfine{font:12.5px/1.7 var(--sans);color:var(--tx-3);margin:16px 0 0;max-width:74ch}
.rmech{font:11px var(--mono);letter-spacing:.22em;text-transform:uppercase;color:var(--tx-3);margin:14px 0 0}
.rstandard{font-size:14px;line-height:1.6;color:var(--tx-2);max-width:60ch;margin:22px 0 0;
  padding-left:14px;border-left:2px solid var(--tx-3)}
.rask{font-size:15px;color:var(--tx);margin:20px 0 0;font-weight:600}
.rlexicon{font-size:13px;line-height:1.62;color:var(--tx-2);max-width:74ch;margin:12px 0 0}
.rpackline{color:var(--tx-3);border-top:1px solid var(--hair);padding-top:12px;margin-top:18px}
.rdash{color:var(--tx-3);opacity:.7}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}
.ranchors{position:relative;height:0}
.ranchor{position:absolute;top:-96px;display:block;width:1px;height:1px}
.rfoot{margin-top:16px;padding-top:14px;border-top:1px solid var(--hair);
  display:flex;flex-wrap:wrap;gap:6px 14px;align-items:baseline}
.rfoot b{font:10.5px var(--mono);letter-spacing:.16em;color:var(--tx-2)}
.rfoot span{font-size:12.5px;color:var(--tx-3)}
.rfoot a{color:var(--gold);text-decoration:none;white-space:nowrap}
.rfoot a:hover{text-decoration:underline;text-underline-offset:3px}

/* ---- THE TABLE ---- */
.rnores{font-size:13px;line-height:1.6;color:var(--tx-2);margin:18px 0 0;max-width:74ch;
  padding-left:14px;border-left:2px solid var(--tx-3)}
.rnores[hidden]{display:none}
.rwrap{margin-top:22px}                       /* groups only: NOT a scroller, on purpose */
/* ⚠️ THIS ONE LINE IS THE WHOLE FILTER. Without it `classList.toggle('hide')` changes a class that has no
   rule, so every filter returns EVERY row and looks like it did something. It went missing when an earlier
   version of this block was replaced: the rule had been added to `studio.css` directly, which the build
   regenerates, so it was reverted and the filters quietly became decoration. Measured: EXTERNAL returned
   118 of 118. A filter that returns everything is worse than no filter -- it answers a question wrongly. */
.rtable tbody tr.hide{display:none !important}
.rtable{table-layout:fixed;width:100%;border-collapse:collapse;font-size:12.5px}
/* ⚠️ A FALSE EXPLANATION STOOD HERE AND IS DELETED. It said `border-collapse: collapse` prevents a sticky
   <th> in Chromium, and that `separate` was what made the header stick. TESTED: with `collapse` the header
   pins exactly as well (measured at 1440/768/390, header at 0 after scrolling past the table's top).
   The sticky header had never been broken -- the TEST was scrolling 500px on a page whose table starts
   1393px down, so it was reading the header on its way up and calling it unpinned. The measurement was
   wrong, not the CSS, and a wrong reason in a comment outlives the fix that prompted it. */
.rtable th,.rtable td{text-align:left;vertical-align:top;padding:11px 10px;
  border-bottom:1px solid var(--hair-2);overflow-wrap:anywhere;word-break:break-word;hyphens:auto}
/* the width budget, summing to 100%, each column capped -- @marketing's numbers, revised by Bryan.
   ⚠️ 2026-10-14, Bryan: "the picture needs to be quite a bit larger so we can actually make out what the
   picture looks like and then the name of the picture needs to be the next column. Squeeze the content
   of the other columns as required to fit the name of the picture in."
   PICTURE went 6% -> 13%, PICTURE NAME is a new 12% column, and the points came off every other column
   -- METADATA 26->20, CLASSIFICATION 13->11, SOURCE 16->12, DEVICE 10->8, PRIMARY DATA 22->18,
   ORIGINAL 7->6. Nothing was dropped, no font shrank, and the budget still sums to 100. */
.rtable .cpicture{width:13%}
.rtable .cpicturename{width:12%}
.rtable .cmetadata{width:20%}
.rtable .cclassification{width:11%}
.rtable .csource{width:12%}
.rtable .cdevice{width:8%}
.rtable .cprimarydata{width:18%}
.rtable .coriginal{width:6%}
/* ⚠️ THE STICKY HEADER. The background is load-bearing: without it the rows show through as they pass
   under. `position:sticky` on the th cells, so the <thead> stays a real thead for a screen reader. */
.rtable thead th{position:-webkit-sticky;position:sticky;top:0;z-index:3;background:#0a0b0f;
  font:10.5px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--tx-3);
  border-bottom:1px solid var(--hair)}
.rtable tbody th{font-weight:400;font-size:11.5px;color:var(--tx-2)}
.rtable tbody tr:hover{background:rgba(255,255,255,.025)}
/* ⚠️ 132px, WAS 56px. Bryan: "so we can actually make out what the picture looks like." At 56px a
   photograph was a coloured smudge -- enough to see that a picture existed, not enough to see it.
   `max-width:100%` still caps it inside the column, so a narrow viewport shrinks the image rather than
   overflowing the table. */
.rtable .rthumb{display:block;width:132px;max-width:100%;padding:0;margin:0;border:1px solid var(--hair);
  border-radius:4px;background:#07080c;cursor:zoom-in}
.rtable .rthumb img{display:block;width:100%;height:auto}
.rtable .rfile{font:9.5px var(--mono);color:var(--tx-3);display:block;margin-top:6px;overflow-wrap:anywhere}
/* ⚠️ THE NAME IS ITS OWN COLUMN NOW. It used to sit UNDER the thumbnail inside the picture cell, as a
   caption to a 56px image -- so the gap the rule above carries is wrong here, because there is no image
   above it. It also gets a point more size and a point more contrast: a column a reader scans down is
   read differently from a caption under a picture, and at 9.5px in --tx-3 it was neither. */
.rtable .cpicturename .rfile{margin-top:0;font-size:10.5px;color:var(--tx-2)}
.rtable .rthumbless{font:9.5px var(--mono);color:var(--tx-3);display:block;overflow-wrap:anywhere}
/* ⚠️ METADATA IS A DESCRIPTION, NOT AN ABSTRACT. Two lines, then it truncates -- the cell never widens. */
.rtable .rclip{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.rtable .cclassification{font:10.5px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--tx-2)}
/* ⚠️ PRIMARY DATA IS FIVE READINGS, ONE PER LINE, SMALL TYPE -- never a paragraph. */
.rtable .rread{display:block;font:10.5px var(--mono);color:var(--tx-3);margin:0 0 3px}
.rtable .rread b{font-weight:400;color:var(--tx-2);letter-spacing:.06em;text-transform:uppercase;
  font-size:9.5px;margin-right:4px}
.rdl{display:inline-block;font:10.5px var(--mono);letter-spacing:.08em;color:var(--tx-2);background:none;
  border:1px solid var(--hair);border-radius:999px;padding:5px 10px;cursor:pointer;text-decoration:none}
.rdl:hover{color:var(--gold);border-color:var(--gold)}
.rsealmeta{font:9.5px var(--mono);color:var(--tx-3);display:block;margin-top:6px;overflow-wrap:anywhere}
.rmark{display:block;width:22px;height:auto;margin:7px 0 0;opacity:.9}
/* ⚠️ BELOW 900px: FEWER COLUMNS, NEVER A SMALLER FONT. Drop DEVICE and PRIMARY DATA; the rest stay. */
@media (max-width:900px){
  .rtable .cdevice, .rtable .cprimarydata{display:none}
  .rtable .cpicture{width:18%} .rtable .cpicturename{width:16%} .rtable .cmetadata{width:26%}
  .rtable .cclassification{width:13%} .rtable .csource{width:17%} .rtable .coriginal{width:10%}
}
@media (max-width:560px){
  /* ⚠️ THE PICTURE GETS THE MOST OF ANY COLUMN ON A PHONE. An eight-column table at 390px cannot give
     any column a real width, so the one column Bryan asked to be able to SEE gets it first: measured, the
     thumbnail goes from 43.5px to about 81px at this budget. Nothing is hidden to fund it, and the other
     columns give up points rather than being dropped. */
  .rtable .cpicture{width:26%} .rtable .cpicturename{width:20%} .rtable .cmetadata{width:24%}
  .rtable .cclassification{width:12%} .rtable .csource{width:10%} .rtable .coriginal{width:8%}
}
/* ---- THE MODAL: the two files side by side, and the depth ---- */
.rmodal{position:fixed;inset:0;z-index:60;background:rgba(4,5,8,.86);display:flex;
  align-items:flex-start;justify-content:center;padding:3vh 18px;overflow-y:auto}
.rmodal[hidden]{display:none}
.rbox{background:var(--bg);border:1px solid var(--hair);border-radius:12px;max-width:1180px;width:100%;
  padding:20px 22px 22px;position:relative}
.rbox h3{font:12px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--tx-3);
  margin:0 0 20px;overflow-wrap:anywhere}
.rx{position:absolute;top:14px;right:16px;background:none;border:1px solid var(--hair);color:var(--tx-2);
  border-radius:6px;font-size:18px;line-height:1;padding:4px 10px;cursor:pointer}
.rcompare{display:grid;grid-template-columns:1fr 1fr;gap:20px}
@media (max-width:820px){.rcompare{grid-template-columns:1fr}}
.rcompare figure{margin:0;min-width:0}
.rcompare img{width:100%;height:auto;max-height:36vh;object-fit:contain;display:block;
  border:1px solid var(--hair);border-radius:6px;background:#07080c}
/* 🔴 36vh — AND THIS VALUE WAS WRONG ONCE, IN THE DIRECTION THAT MATTERS.
   I had taken it down to 24vh to make the modal fit one screen, and @marketing caught what that cost:
   "the side-by-side IS the argument ... the seal rows are evidence; the comparison is the
   demonstration." Measured, 24vh rendered the pair at 216px tall at 1440x900 and 259px at 1920x1080 --
   both UNDER the ~300px at which a side-by-side stops being decidable and becomes two thumbnails.
   "Which is worse than a scroll because it still looks like it's showing you something."
   So the height comes back, and if something must give it is the STACKED ROWS that scroll, never the
   images. Bryan's "doesn't need to scroll ideally" is a preference; a comparison too small to judge is
   the page failing at its one job.
   ⚠️ At 36vh a 16:9 pair renders at its NATURAL size (~320px) at both widths, so the cap only bites on
   a tall image or a short viewport. Measured after this change: the pair is 320px at 1440x900 and
   1080px-wide viewports alike, and the modal needs ~30px of scroll rather than 4px. That trade is
   deliberate and this comment is where it is recorded. */
.rcompare figcaption{font:10px var(--mono);color:var(--tx-3);margin-top:8px;letter-spacing:.06em}
.racts{display:flex;flex-wrap:wrap;gap:18px;margin:14px 0 4px}
.racts .go{color:var(--gold);text-decoration:none;font:11px var(--mono)}
.racts .go:hover{text-decoration:underline;text-underline-offset:3px}
.rhash{font:10.5px var(--mono);color:var(--tx-2);background:rgba(255,255,255,.04);
  border:1px solid var(--hair);border-radius:4px;padding:4px 6px;overflow-wrap:anywhere;
  user-select:all;-webkit-user-select:all;cursor:copy}
.rdepth{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:6px 18px;margin:18px 0 0;
  border-top:1px solid var(--hair);padding-top:18px}
.rdepth dt{font:10px var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--tx-3);padding-top:3px}
.rdepth dd{margin:0;font:11.5px var(--mono);color:var(--tx-2);overflow-wrap:anywhere;word-break:break-word}


/* ---- THE MODAL IS THE DEEP BLOCK: labelled, hairlined, and the images stack on a phone ---- */
.rkicker{font:11px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--tx-2);
  margin:0 0 10px;overflow-wrap:anywhere}
.rkicker #rmmeta{color:var(--tx-3);text-transform:none;letter-spacing:0}
.rblk{margin:20px 0 0;padding-top:16px;border-top:1px solid var(--hair)}
.rblk h4{font:10px var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--tx-3);margin:0 0 8px}
.rblk dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:5px 18px;margin:0}
.rblk dt{font:10px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--tx-3);padding-top:3px}
.rblk dd{margin:0;font:11.5px var(--mono);color:var(--tx-2);overflow-wrap:anywhere;word-break:break-word}
/* ⚠️ AND THE LEXICON PARAGRAPHS SIT AT FULL WIDTH, which is where the last of the height was going: two
   sentences wrapped across 1180px are two lines each. In the band they would be four. Nothing is cut --
   both sentences are the same sentences. */
.rcols + .rlexicon{margin-top:12px}
.rblk dd.rhash{background:rgba(255,255,255,.04);border:1px solid var(--hair);border-radius:4px;
  padding:3px 6px;user-select:all}
.rblk .racts{margin:14px 0 0}
/* 🔴 THE SECTIONS ARE COLUMNS IN ONE BAND, NOT FIVE STACKED BLOCKS.
   Bryan: "all the sections should be side by side in separate columns in a single section. If necessary,
   truncate the content. But I don't like it being a long page. I want it filled with information on one
   page/modal that doesn't need to scroll ideally."
   Five stacked bands -- each with its own top rule and 20px of air above it -- is what made this modal
   ~2.5 screens tall. The same five lists side by side under ONE rule is one screen. Nothing is removed:
   same dt/dd, same order, every absent value still a dash. */
.rcols{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0 20px;margin:20px 0 0;
  padding-top:16px;border-top:1px solid var(--hair)}
.rcols .rblk{margin:0;padding:0;border-top:0;min-width:0}
/* ⚠️ `padding:0` ABOVE IS THE LOAD-BEARING PART AND IT WAS MISSING. A site-wide `section` rule gives
   every section `padding: 0 130px 74px`; overriding only `padding-top` left a 74px bottom padding on
   every column -- which is exactly the 74px between the arithmetic for the tallest column (378px) and
   its measured height (452px) -- and 130px of side padding squeezed the content box to 136px, so labels
   like "Timestamp authority" wrapped to two lines. One declaration, both symptoms. */
/* ⚠️ INSIDE A COLUMN THE dt/dd STACK. At a quarter of 1180px the two-column dl hands the labels
   ("Timestamp authority", "Verdict as it stands", "Where it was taken") most of a ~250px cell and leaves
   the VALUE a sliver. A label above its value reads at any width; a label beside it only reads when
   there is room for both. */
.rcols .rblk dl{grid-template-columns:1fr;gap:2px}
.rcols .rblk dd{margin:0 0 7px}
@media (max-width:1100px){.rcols{grid-template-columns:repeat(2,minmax(0,1fr));gap:18px 20px}}
@media (max-width:700px){
  .rcompare{grid-template-columns:1fr}          /* ⚠️ stack: a sideways modal undoes iteration 4 */
  .rcols{grid-template-columns:1fr}
  .rblk dl{grid-template-columns:1fr;gap:2px}
  .rblk dd{margin:0 0 8px}
}
/* the row is the door: it must LOOK like one */
.rtable tbody tr.rrow{cursor:pointer}
.rtable tbody tr.rrow:hover{background:rgba(255,255,255,.035)}
.rtable tbody tr.rrow:focus-within{background:rgba(255,255,255,.05);
  outline:1px solid var(--gold);outline-offset:-1px}
.rdoor:focus-visible{outline:2px solid var(--gold);outline-offset:2px}

/* ============ R26 — THE LANDING HERO IS ONE PARAGRAPH ============
   Bryan's 2026-10-14 tweak: the hero's two blocks merge into ONE <p>, joined by a bar, and
   `Learn more ->` sits INLINE at the end of it. `display:inline` is the load-bearing part — a
   block-level link drops to its own line and the instruction is lost. A bar is a separator, not
   punctuation inside a sentence, so it gets air on both sides.
   NOTE: this lives in the builder ON PURPOSE. studio.css is REGENERATED from styles.css + these
   OVERRIDES, so a rule added to the output alone survives until the next build and no longer. */
.hero .lede .herobar{display:inline;margin:0 .5em;opacity:.5;font-weight:400}
.hero .lede .herolink{display:inline;color:inherit;text-decoration:underline;
  text-underline-offset:3px;text-decoration-thickness:1px;white-space:nowrap}
.hero .lede .herolink:hover{opacity:.75}

/* ============ R24 — THE HERO BYLINE ============
   Bryan: an abstract H1 (`Reality is the product.`) with a plain byline under it that names what the
   company actually sells. Order is the ruling — idea first, menu second — so the byline must read as
   a quiet line under the H1, never as a second headline competing with it. */
.byline{font-family:var(--sans);font-weight:500;color:var(--gold);
        font-size:clamp(13px,1.35vw,17px);letter-spacing:.055em;line-height:1.5;
        margin:.7em 0 0;max-width:64ch}

/* ============ R25 — THE CROSS-LINK PANEL ============
   One per service page, one destination each. Constraint from the ruling: it is a magazine side
   panel, NOT a banner — framed, quieter than the page's own copy and its CTA, sitting at the end of
   a section, stacking under the copy on narrow screens. Identical structure every time so it reads
   as furniture rather than as an advertisement. */
.xlink{border:1px solid var(--hair);border-left:2px solid var(--gold-dim);
       background:linear-gradient(180deg,rgba(194,168,106,.045),rgba(255,255,255,0));
       padding:22px 24px;margin:34px 0 0;max-width:62ch}
.xlink .xlabel{font:600 9.5px/1 var(--mono);letter-spacing:.28em;text-transform:uppercase;
               color:var(--gold);margin-bottom:12px}
.xlink .xhead{font-family:var(--serif);font-size:clamp(17px,1.8vw,22px);line-height:1.25;
              color:var(--tx);margin-bottom:10px}
.xlink p{font-size:13.6px;line-height:1.62;color:var(--tx-2);margin:0 0 14px;max-width:60ch}
.xlink .xgo{font:600 10.5px/1 var(--mono);letter-spacing:.2em;color:var(--gold);text-decoration:none;
            border-bottom:1px solid var(--gold-dim);padding-bottom:3px}
.xlink .xgo:hover{color:var(--gold-2);border-bottom-color:var(--gold-2)}
@media (max-width:760px){ .xlink{margin-top:26px;padding:18px 18px} }

/* ---- hero motion pane ----------------------------------------------------
   The swivel loop sits ON TOP of the still, so nothing is lost if the video
   never plays: a reduced-motion user, or a browser that blocks autoplay, keeps
   the poster frame underneath. CSS-only — there is no JS autoplay decision to
   get wrong. */
.pane .motion{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;pointer-events:none}
@media (prefers-reduced-motion: reduce){ .pane .motion{display:none} }

/* ---- THE FILMS: the client's own YouTube embeds on a case study ----
   youtube-nocookie + loading="lazy" so nothing loads until it scrolls near. The figure
   keeps a 16:9 box whether or not the iframe has painted, so the page doesn't jump. */
.filmgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(268px,1fr));gap:16px;margin-top:26px}
.film{margin:0}
.film iframe{width:100%;aspect-ratio:16/9;border:0;display:block;background:#04050a}
.film figcaption{font:11px var(--mono);letter-spacing:.1em;color:var(--gold);margin-top:9px}
@media (max-width:760px){ .filmgrid{grid-template-columns:1fr} }

/* ---- the one quiet secondary link on the home hero ------------------------
   The hero carries ONE primary action. This is the quiet text link beside it —
   deliberately not a button, because a second button is a second ask. */
.quietlink{font:600 11px/1 var(--mono);letter-spacing:.18em;color:var(--gold);text-decoration:none;
           border-bottom:1px solid var(--gold-dim);padding-bottom:3px;align-self:center;margin-left:4px}
.quietlink:hover{color:var(--gold-2);border-bottom-color:var(--gold-2)}

/* ---- /film hero: a real shoot frame, blended under the copy ---------------
   The frame is the behind-the-scenes still that illustrates "Sealed on
   request". It sits at low opacity behind a two-layer scrim, so it reads as
   atmosphere rather than as a picture of anything -- and the copy never sits on
   a bare image, which is the standing rule. */
.hero-dressed{position:relative;overflow:hidden;isolation:isolate}
.hero-bg{position:absolute;inset:0;z-index:0;pointer-events:none}
.hero-bg img{width:100%;height:100%;object-fit:cover;object-position:50% 34%;
             opacity:.46;filter:grayscale(.26) saturate(.78) contrast(1.06)}
.hero-bg::after{content:"";position:absolute;inset:0;background:
  radial-gradient(115% 88% at 14% 18%, rgba(10,11,12,.38) 0%, rgba(10,11,12,.74) 56%, rgba(10,11,12,.93) 100%),
  linear-gradient(180deg, rgba(10,11,12,.50) 0%, rgba(10,11,12,.84) 70%, var(--bg) 100%)}
.hero-dressed .hero-in{position:relative;z-index:1}

/* ---- the three /solutions blocks ------------------------------------------
   Bryan reviewed the built page and the finding was: "they don't jump out, and
   they don't say what the service is and what the solution is." The name was a
   small eyebrow and the headline carried only the pain, so a scanner learned
   the problem and never the product. Order is now MARK, NAME, PROBLEM, ANSWER,
   with the name set large and centred -- it is the loudest thing in the block. */
.sol{display:flex;flex-direction:column;align-items:center;text-align:center;
     padding:14px 0 4px}
.solmark{width:66px;height:66px;display:flex;align-items:center;justify-content:center;
         color:var(--gold);margin-bottom:22px}
.solmark svg{width:60px;height:60px;display:block;opacity:.92}
.solmark img{width:60px;height:auto;display:block;opacity:.9}
.solname{font-family:var(--serif);font-size:clamp(31px,5.4vw,60px);line-height:1.02;
         letter-spacing:.01em;color:var(--tx);margin-bottom:20px;text-transform:none}
.solproblem{font-family:var(--serif);font-size:clamp(17px,2.1vw,23px);line-height:1.35;
            color:var(--gold);margin:0 0 20px;max-width:34ch}
.solanswer{font-size:15.2px;line-height:1.72;color:var(--tx-2);margin:0;max-width:60ch}
@media (max-width:620px){
  /* R28 at the small breakpoint: 20px, which matches the reduced block rhythm below. */
  .sol .sbtn{margin-top:20px}
  .solmark{width:54px;height:54px;margin-bottom:18px}
  .solmark svg,.solmark img{width:50px}
  .solname{margin-bottom:15px}
  .solproblem{margin-bottom:16px}
}

/* ---- watermark backgrounds, and the reality line that labels them ---------
   Bryan wanted two sections dressed. @marketing's ruling: the roundtable one
   must be a DRAWING (line art, no faces, claims nothing) and the /demo one a
   REAL dated still. Either way the page says which kind it is, on the page --
   an unlabelled image behind copy that sells proof is the one thing the
   reality line cannot survive. */
.rtwrap{position:relative;isolation:isolate}
.rtwrap > *:not(.rtbg):not(.dembg):not(.realline){position:relative;z-index:1}
.rtbg,.dembg{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden}
/* .rtbg now holds the GENERATED roundtable image rather than a drawing, so it takes the same
   image treatment as .dembg: full-bleed, dimmed, desaturated, with a scrim between it and the
   copy. The scrim is not optional -- text never sits on a bare image. */
.rtbg img,.dembg img{width:100%;height:100%;object-fit:cover;object-position:50% 45%;
           opacity:.17;filter:grayscale(.32) saturate(.72) contrast(1.04)}
.rtbg::after,.dembg::after{content:"";position:absolute;inset:0;background:
  linear-gradient(180deg,var(--bg) 0%,rgba(10,11,12,.80) 42%,rgba(10,11,12,.88) 100%)}
/* the reality line: small, monospaced, bottom-right of the block it labels */
.realline{position:absolute;right:max(28px,calc((100vw - 1180px)/2));bottom:16px;z-index:2;
  font:600 9.5px/1 var(--mono);letter-spacing:.26em;text-transform:uppercase;
  color:var(--tx-3);margin:0}
.realline-dark{color:var(--tx-2)}
@media (max-width:700px){
  .realline{right:24px;bottom:12px;font-size:9px}
  .rtbg svg{width:74vw}
}

/* ---- a pair of "ask us" panels sitting side by side -----------------------
   Two things you can add to a shoot, presented as a pair rather than as one
   afterthought under the case studies. Stacks on a narrow screen. */
/* stretch, not start: both panels take the height of the TALLER one (Bryan, 2026-10-10 --
   "sized according to the larger of the two"). The link is pushed to the foot of each so
   the pair still lines up whatever their copy runs to. */
.xlinkrow{display:grid;grid-template-columns:1fr 1fr;gap:26px;align-items:stretch;margin-top:36px}
.xlinkrow .xlink{display:flex;flex-direction:column;margin-top:0}
.xlinkrow .xlink .xgo{margin-top:auto}
@media (max-width:820px){
  .xlinkrow{grid-template-columns:1fr;gap:20px}
}

/* ---- more air between the sections on /film -------------------------------
   Five sections at one uniform 74px read as a single flat column, which is what
   Bryan reacted to. The rhythm now varies by kind -- the featured block gets the
   most, the smaller ones less -- and a hairline marks where each one ends, so the
   page tells you when it has changed subject instead of just running on. */
main.spage > section{padding-top:104px;padding-bottom:104px}
main.spage > section.t1{padding-top:120px;padding-bottom:120px}
main.spage > section.t2{padding-top:92px;padding-bottom:92px}
main.spage > section.hero{padding-top:136px;padding-bottom:128px}
main.spage > section + section{border-top:1px solid var(--hair)}
@media (max-width:700px){
  main.spage > section,
  main.spage > section.t1,
  main.spage > section.t2{padding-top:68px;padding-bottom:68px}
  main.spage > section.hero{padding-top:92px;padding-bottom:84px}
}

/* ---- the Business Roundtable lockup ---------------------------------------
   Drawn, not photographic: seen from above, the table edge, the table, and the
   five seats. It names the product without illustrating another shoot. */
.rtlock{display:flex;align-items:center;gap:22px;margin:26px 0 30px;
        padding:24px 26px;border:1px solid var(--hair);background:var(--bg-2)}
.rtmark{width:92px;height:92px;flex:0 0 auto;color:var(--gold)}
.rtword{display:flex;flex-direction:column;gap:9px;min-width:0}
.rtname{font-family:var(--serif);font-size:clamp(19px,2.3vw,27px);letter-spacing:.06em;
        color:var(--tx);line-height:1.1}
.rtrule{display:block;width:64px;height:1px;background:var(--gold-dim)}
.rtsub{font:600 10px/1 var(--mono);letter-spacing:.24em;text-transform:uppercase;color:var(--tx-3)}
@media (max-width:620px){
  .rtlock{flex-direction:column;align-items:flex-start;gap:16px}
  .rtmark{width:74px;height:74px}
}

/* ---- the icon set in "What a production includes" -------------------------
   Four boxes about how a job RUNS. A frame from some other shoot answered a
   different question, and on a proof surface a photograph is a claim about
   which job it came from. A drawn mark claims nothing. */
.iconset .card .ico{display:flex;align-items:center;justify-content:center;
  padding:26px 0 22px;color:var(--gold);border-bottom:1px solid var(--hair)}
.iconset .card .ico svg{width:48px;height:48px;display:block;opacity:.88;
  transition:opacity .2s ease, transform .2s ease}
.iconset .card:hover .ico svg{opacity:1;transform:translateY(-1px)}
@media (max-width:560px){
  .iconset .card .ico{padding:20px 0 16px}
  .iconset .card .ico svg{width:40px;height:40px}
}

/* ---- case studies: writing left, pictures right ---------------------------
   The story is 1,200-1,900 words. Read across a 1400px column between the
   photographs, it is unreadable; in a half-width column at a sane measure it
   reads. The title stays a full-width header above this. */
.cs2col{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:40px;align-items:start}
.cs2col .cscol{min-width:0}
.cs2col .cstext p{max-width:62ch}
.cs2col .csmedia p{max-width:62ch}
/* the sections moved inside the grid must not re-apply the page's own gutter */
.cs2col section{padding:0;background:none;border:0}
.cs2col section + section{margin-top:30px}
.cs2col .filmgrid{grid-template-columns:1fr}
.cs2col .gal{grid-template-columns:1fr 1fr}
@media (max-width:900px){
  .cs2col{grid-template-columns:1fr;gap:26px}
}

/* ---- footer wordmark + the Powered-by-Verified-Reality badge -------------- */
.sfmark{margin-bottom:26px}
.sfmark img{display:block;height:46px;width:auto;opacity:.9}
.sfmark .shouse{margin-top:12px}
.vrbadge{border-left:2px solid var(--gold);padding-left:14px}
.vrhead{display:flex;align-items:center;gap:11px;margin-bottom:10px}
/* low opacity on purpose: the mark reads as a watermark beside the record line rather than a
   second company logo competing with the wordmark at the top of the footer */
.vrlogo{width:40px;height:auto;flex:0 0 auto;opacity:.30;
        filter:grayscale(.35) brightness(1.05)}
.vrhead b{display:block;font:600 10.5px/1.25 var(--mono);letter-spacing:.2em;color:var(--gold);
          margin-bottom:0}
.vrbadge p{font-size:12.6px;line-height:1.6;color:var(--tx-2);margin:0 0 10px;max-width:34ch}
.vrbadge a{font:600 10.5px/1 var(--mono);letter-spacing:.18em;color:var(--gold);
           text-decoration:none;border-bottom:1px solid var(--gold-dim);padding-bottom:3px}
.vrbadge a:hover{color:var(--gold-2);border-bottom-color:var(--gold-2)}
