
  html,body{margin:0;padding:0}
  :root{
    --brand:#1d3a8f; --brand-deep:#16306e; --brand-soft:#eaf0fc;
    --indigo:#2f6bd8; --indigo-deep:#2254b3; --indigo-soft:#eaf0fc;
    --ink:#171534; --ink-2:#4a4763; --ink-3:#5f5c74;
    --bg:#f5f8fd; --surface:#ffffff; --panel:#fbf8fc; --line:#ece6f1;
    --navy:#16306e; --navy-2:#1d3a8f; --ok:#15b364; --ok-soft:#e7f8ee;
    --gold:#f5b81f; --cta:#f0b100; --cta-ink:#241a00;
    --hero-grad:linear-gradient(120deg,#16306e 0%,#274ba3 58%,#3f78d8 100%);
    --dots:radial-gradient(rgba(255,255,255,0.10) 1px, transparent 1.6px);
    --shadow:0 8px 26px rgba(16,35,86,.10), 0 2px 6px rgba(16,35,86,.06);
    --ff:"Helvetica Neue","Segoe UI",system-ui,-apple-system,Arial,sans-serif;
    --shadow:0 20px 46px -24px rgba(18,12,44,.5);
    --maxw:1150px;
  }
  :root[data-theme="light"]{
    --brand:#1d3a8f; --brand-deep:#16306e; --brand-soft:#eaf0fc;
    --indigo:#2f6bd8; --indigo-deep:#2254b3; --indigo-soft:#eaf0fc;
    --ink:#171534; --ink-2:#4a4763; --ink-3:#5f5c74;
    --bg:#f5f8fd; --surface:#ffffff; --panel:#fbf8fc; --line:#ece6f1;
    --navy:#16306e; --navy-2:#1d3a8f; --ok:#15b364; --ok-soft:#e7f8ee;
    --gold:#f5b81f; --cta:#f0b100; --cta-ink:#241a00;
    --hero-grad:linear-gradient(120deg,#16306e 0%,#274ba3 58%,#3f78d8 100%);
    --dots:radial-gradient(rgba(255,255,255,0.10) 1px, transparent 1.6px);
    --shadow:0 8px 26px rgba(16,35,86,.10), 0 2px 6px rgba(16,35,86,.06);
    --shadow:0 20px 46px -24px rgba(18,12,44,.5);
  }

  *{box-sizing:border-box}
  .wrap{font-family:var(--ff);color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased;line-height:1.55;overflow-x:hidden}
  .wrap :where(h1,h2,h3){line-height:1.04;letter-spacing:-.024em;text-wrap:balance;margin:0}
  .wrap p{margin:0}
  a{color:inherit;text-decoration:none}
  .shell{max-width:var(--maxw);margin:0 auto;padding:0 22px}
  .eyebrow{font-size:12.5px;font-weight:800;letter-spacing:.15em;text-transform:uppercase;color:var(--brand)}
  .band{padding:88px 0}

  .btn{display:inline-flex;align-items:center;gap:.5em;border-radius:999px;font-weight:800;font-size:15px;padding:13px 22px;border:1.5px solid transparent;cursor:pointer;transition:.15s;white-space:nowrap}
  .btn-primary{background:var(--indigo);color:#fff;box-shadow:0 12px 26px -12px var(--indigo)}
  .btn-primary:hover{background:var(--indigo-deep);transform:translateY(-1px)}
  .btn-pink{background:var(--brand);color:#fff;box-shadow:0 12px 26px -12px var(--brand)}
  .btn-pink:hover{background:var(--brand-deep);transform:translateY(-1px)}
  .btn-ghost{background:transparent;border-color:var(--line);color:var(--ink)}
  .btn-ghost:hover{border-color:var(--brand);color:var(--brand)}
  .btn-light{background:#fff;color:var(--navy)}
  .btn-light:hover{transform:translateY(-1px)}
  .btn-sm{padding:9px 16px;font-size:13.5px}

  /* header */
  header.nav{position:sticky;top:0;z-index:50;backdrop-filter:saturate(1.4) blur(10px);background:color-mix(in srgb,var(--bg) 84%,transparent);border-bottom:1px solid var(--line)}
  .nav-in{display:flex;align-items:center;gap:20px;height:66px}
  .brand{display:flex;align-items:center;gap:11px;font-weight:800;font-size:18px;letter-spacing:-.02em;color:var(--ink)}
  .logo{width:36px;height:36px;border-radius:11px;background:linear-gradient(150deg,var(--brand),#2f6bd8);display:grid;place-items:center;box-shadow:0 8px 18px -8px var(--brand)}
  .logo svg{width:18px;height:18px}
  .brand .os{color:var(--brand)}
  .tbc{font-size:9.5px;font-weight:800;letter-spacing:.1em;color:var(--ink-3);border:1px dashed var(--line);border-radius:6px;padding:2px 6px;text-transform:uppercase}
  .nav-links{display:none;gap:26px;margin-left:14px}
  .nav-links a{font-size:14.5px;font-weight:600;color:var(--ink-2)}
  .nav-links a:hover{color:var(--brand)}
  .nav-cta{margin-left:auto;display:flex;align-items:center;gap:12px}
  .nav-cta .signin{display:none;font-size:14.5px;font-weight:700;color:var(--ink-2)}
  @media(min-width:960px){.nav-links{display:flex}.nav-cta .signin{display:inline}}
  .theme-toggle{border:1px solid var(--line);background:var(--surface);border-radius:999px;width:34px;height:34px;cursor:pointer;font-size:15px;display:grid;place-items:center;color:var(--ink-2)}

  /* hero */
  .hero{position:relative;padding:60px 0 30px}
  .hero::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;background:radial-gradient(54% 56% at 98% -8%,color-mix(in srgb,var(--indigo) 32%,transparent),transparent 60%),radial-gradient(42% 46% at 2% -6%,color-mix(in srgb,var(--brand) 12%,transparent),transparent 56%)}
  .hero-grid{position:relative;z-index:1;display:grid;gap:44px;grid-template-columns:1fr}
  @media(min-width:980px){.hero-grid{grid-template-columns:1.02fr .98fr;align-items:center}}
  h1.head{font-size:clamp(38px,6vw,64px);font-weight:800;margin:16px 0 0;color:var(--ink)}
  h1.head em{font-style:normal;color:var(--brand)}
  .sub{font-size:clamp(16px,1.6vw,18.5px);color:var(--ink-2);max-width:40ch;margin-top:20px}
  .sub b{color:var(--ink);font-weight:700}
  .hero-cta{display:flex;flex-wrap:wrap;gap:12px;margin-top:26px}
  .trust{margin-top:18px;font-size:13px;color:var(--ink-3);display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center}
  .trust b{color:var(--ink-2);font-weight:700}
  .chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:24px}
  .chip{font-size:12.5px;font-weight:700;color:var(--ink-2);background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:7px 13px}
  .chip b{color:var(--brand)}

  /* product mock */
  .mock{background:var(--surface);border:1px solid var(--line);border-radius:22px;box-shadow:var(--shadow);overflow:hidden}
  .mock-top{display:flex;align-items:center;gap:8px;padding:11px 15px;border-bottom:1px solid var(--line);background:var(--panel)}
  .dot{width:10px;height:10px;border-radius:50%}
  .mock-top .t{margin-left:8px;font-size:12px;font-weight:800;color:var(--ink-2)}
  .mock-top .live{margin-left:auto;font-size:10.5px;font-weight:800;color:var(--ok);background:var(--ok-soft);padding:3px 9px;border-radius:999px}
  .mock-body{padding:16px}
  .mb-h{font-size:12px;font-weight:800;color:var(--ink-3);text-transform:uppercase;letter-spacing:.08em;margin:2px 2px 12px}
  .stat-row{display:grid;grid-template-columns:repeat(4,1fr);gap:9px}
  .stat{background:var(--panel);border:1px solid var(--line);border-radius:13px;padding:11px}
  .stat .n{font-size:19px;font-weight:800;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
  .stat .l{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3);margin-top:2px}
  .stat .up{font-size:10px;font-weight:800;color:var(--ok)}
  .stat.pink .n{color:var(--brand)}.stat.indigo .n{color:var(--indigo)}
  .bars{display:flex;align-items:flex-end;gap:6px;height:66px;margin:15px 2px 4px}
  .bars i{flex:1;border-radius:5px 5px 2px 2px;background:linear-gradient(180deg,var(--indigo),#5f86e6);opacity:.92}
  .bars i:nth-child(4n){background:linear-gradient(180deg,var(--brand),#ff87ac)}
  .attn{margin-top:12px;background:var(--panel);border:1px solid var(--line);border-radius:13px;padding:11px 13px}
  .attn .ah{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--brand);margin-bottom:8px}
  .attn .arow{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:600;color:var(--ink-2);padding:3px 0}
  .attn .arow .pill{margin-left:auto;font-size:10px;font-weight:800;color:var(--indigo);background:var(--indigo-soft);border-radius:999px;padding:2px 8px}

  /* proof strip */
  .proof{background:var(--navy);color:#fff;border-radius:22px;padding:26px 22px}
  .proof-in{display:grid;grid-template-columns:repeat(2,1fr);gap:22px 12px}
  @media(min-width:760px){.proof-in{grid-template-columns:repeat(4,1fr)}}
  .pf .n{font-size:30px;font-weight:800;letter-spacing:-.03em;color:#fff}
  .pf .n span{color:#ff6f9d}
  .pf .l{font-size:12.5px;color:#c9c4e6;margin-top:3px;font-weight:600}

  /* section head */
  .sec-head{max-width:660px;margin-bottom:34px}
  .sec-head h2{font-size:clamp(28px,3.6vw,41px);font-weight:800}
  .sec-head p{color:var(--ink-2);font-size:16.5px;margin-top:12px}
  .sec-head.center{margin-left:auto;margin-right:auto;text-align:center}

  /* feature groups */
  .fgrid{display:grid;gap:16px;grid-template-columns:1fr}
  @media(min-width:680px){.fgrid{grid-template-columns:1fr 1fr}}
  @media(min-width:1000px){.fgrid{grid-template-columns:1fr 1fr 1fr}}
  .fcard{background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:22px;transition:.16s}
  .fcard:hover{transform:translateY(-3px);box-shadow:var(--shadow);border-color:color-mix(in srgb,var(--indigo) 40%,var(--line))}
  .fic{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;font-size:20px;background:var(--indigo-soft);margin-bottom:14px}
  .fcard:nth-child(3n-1) .fic{background:var(--brand-soft)}
  .fcard h3{font-size:18px;font-weight:800}
  .fcard>p{color:var(--ink-2);font-size:14px;margin-top:6px}
  .flist{list-style:none;padding:0;margin:14px 0 0;display:flex;flex-wrap:wrap;gap:6px}
  .flist li{font-size:12px;font-weight:700;color:var(--ink-2);background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:5px 10px}

  /* AI dark band */
  .dark{background:linear-gradient(165deg,var(--navy),var(--navy-2));color:#fff}
  .dark .eyebrow{color:#ff8fb4}
  .dark h2{color:#fff}
  .dark .lead{color:#cbc6e8;font-size:16.5px;margin-top:12px;max-width:60ch}
  .ai-grid{display:grid;gap:26px;grid-template-columns:1fr;margin-top:34px}
  @media(min-width:940px){.ai-grid{grid-template-columns:.92fr 1.08fr;align-items:start}}
  .ai-demo{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.13);border-radius:20px;padding:18px}
  .ai-demo .dh{display:flex;align-items:center;gap:9px;font-size:12.5px;font-weight:800;color:#fff;margin-bottom:14px}
  .ai-demo .dh .l{margin-left:auto;font-size:10px;font-weight:800;color:#4fd39a;background:rgba(79,211,154,.14);padding:3px 9px;border-radius:999px}
  .msg{display:flex;gap:9px;margin-bottom:11px;max-width:88%}
  .msg.r{margin-left:auto;flex-direction:row-reverse}
  .mav{width:28px;height:28px;border-radius:9px;flex:none;display:grid;place-items:center;font-size:12px;font-weight:800;background:rgba(255,255,255,.12);color:#fff}
  .mav.ai{background:linear-gradient(140deg,var(--brand),#ff87ac)}
  .bub{font-size:13px;line-height:1.5;padding:9px 13px;border-radius:14px;background:rgba(255,255,255,.09);color:#ece9f8}
  .bub.ai{background:#fff;color:var(--navy);font-weight:500}
  .booked{margin-top:4px;font-size:11.5px;font-weight:800;color:#4fd39a;display:flex;align-items:center;gap:6px}
  .ai-list{display:grid;gap:12px;grid-template-columns:1fr 1fr}
  @media(max-width:520px){.ai-list{grid-template-columns:1fr}}
  .aic{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);border-radius:15px;padding:15px}
  .aic .t{font-size:14px;font-weight:800;color:#fff;display:flex;gap:8px;align-items:center}
  .aic .t i{font-style:normal}
  .aic p{font-size:12.5px;color:#c2bce0;margin-top:6px;line-height:1.5}

  /* comparison */
  .cmp{overflow-x:auto;border:1px solid var(--line);border-radius:18px;background:var(--surface)}
  table.compare{width:100%;border-collapse:collapse;min-width:520px}
  table.compare th,table.compare td{padding:14px 18px;text-align:left;border-bottom:1px solid var(--line);font-size:14px}
  table.compare thead th{font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3);font-weight:800}
  table.compare thead th.us{color:var(--brand)}
  table.compare td.f{font-weight:700;color:var(--ink)}
  table.compare td.us{font-weight:800;color:var(--ink);background:color-mix(in srgb,var(--brand) 7%,transparent)}
  table.compare td.them{color:var(--ink-3)}
  table.compare tr:last-child td{border-bottom:none}
  .yes{color:var(--ok);font-weight:900}.no{color:var(--ink-3)}

  /* personas */
  .pgrid{display:grid;gap:16px;grid-template-columns:1fr}
  @media(min-width:820px){.pgrid{grid-template-columns:repeat(3,1fr)}}
  .pers{border:1px solid var(--line);border-radius:18px;padding:24px;background:var(--surface);position:relative;overflow:hidden}
  .pers .k{font-size:11px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--indigo)}
  .pers:nth-child(2) .k{color:var(--brand)}
  .pers h3{font-size:20px;font-weight:800;margin-top:8px}
  .pers p{font-size:14px;color:var(--ink-2);margin-top:8px}
  .pers .tagr{margin-top:14px;font-size:12px;font-weight:800;color:var(--ink-3)}

  /* testimonials */
  .tgrid{display:grid;gap:16px;grid-template-columns:1fr}
  @media(min-width:680px){.tgrid{grid-template-columns:1fr 1fr}}
  .quote{background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:22px}
  .quote p{font-size:15px;color:var(--ink);line-height:1.55}
  .quote .who{display:flex;align-items:center;gap:11px;margin-top:16px}
  .quote .av{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;color:#fff;font-size:12px;font-weight:800;background:linear-gradient(140deg,var(--indigo),#5f86e6)}
  .quote:nth-child(2n) .av{background:linear-gradient(140deg,var(--brand),#ff87ac)}
  .quote .nm{font-size:13.5px;font-weight:800}
  .quote .rl{font-size:12px;color:var(--ink-3)}

  /* final */
  .final{text-align:center;border-radius:26px;padding:56px 26px;position:relative;overflow:hidden;background:linear-gradient(165deg,var(--navy),var(--navy-2));color:#fff}
  .final::before{content:"";position:absolute;inset:0;background:radial-gradient(50% 130% at 50% 0,color-mix(in srgb,var(--brand) 30%,transparent),transparent 60%)}
  .final>*{position:relative;z-index:1}
  .final h2{font-size:clamp(28px,4vw,44px);font-weight:800;color:#fff}
  .final p{color:#cfc9e6;font-size:17px;margin:14px auto 26px;max-width:46ch}

  footer{border-top:1px solid var(--line);padding:40px 0 46px;margin-top:6px}
  .foot-grid{display:grid;gap:26px;grid-template-columns:1fr;align-items:start}
  @media(min-width:760px){.foot-grid{grid-template-columns:1.4fr 1fr 1fr}}
  .foot-grid p{font-size:13.5px;color:var(--ink-2);margin-top:12px;max-width:40ch}
  .foot-col h4{font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-3);margin-bottom:10px}
  .foot-col a{display:block;font-size:13.5px;color:var(--ink-2);padding:4px 0}
  .foot-col a:hover{color:var(--brand)}
  .foot-bot{display:flex;flex-wrap:wrap;gap:14px;justify-content:space-between;align-items:center;margin-top:30px;padding-top:20px;border-top:1px solid var(--line)}
  .foot-bot small{color:var(--ink-3);font-size:12.5px}
  .note{font-size:12px;color:var(--ink-3);background:var(--panel);border:1px dashed var(--line);border-radius:8px;padding:6px 11px}

  /* ===== Pixel-faithful portal embed (matches HoDashboardApp) ===== */
  .pf{--pi:#171534;--pi2:#4a4763;--pi3:#5f5c74;--pl:#ece6f1;--pblue:#2f6bd8}
  .pf-app{border:1px solid var(--line);border-radius:20px;overflow:hidden;box-shadow:var(--shadow);background:var(--panel)}
  .pf-bar{background:#100e26;color:#fff;display:flex;align-items:center;gap:11px;padding:12px 16px}
  .pf-bar .mk{width:26px;height:26px;border-radius:8px;background:linear-gradient(150deg,#ee1f63,#2f6bd8);display:grid;place-items:center}
  .pf-bar .mk svg{width:13px;height:13px}
  .pf-bar .t{font-weight:800;font-size:13.5px;line-height:1.1}
  .pf-bar .s{font-size:10.5px;color:rgba(255,255,255,.55)}
  .pf-bar .per{margin-left:auto;display:flex;gap:6px}
  .pf-bar .per span{font-size:10.5px;font-weight:700;color:rgba(255,255,255,.72);border:1px solid rgba(255,255,255,.18);border-radius:999px;padding:3px 10px}
  .pf-bar .per span.on{background:#2f6bd8;color:#fff;border-color:transparent}
  .pf-body{padding:16px;background:#f7f8fc}
  .pf-kpis{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
  @media(min-width:520px){.pf-kpis{grid-template-columns:repeat(3,1fr)}}
  @media(min-width:820px){.pf-kpis{grid-template-columns:repeat(6,1fr)}}
  .pf-k{background:var(--surface);border:1px solid var(--pl);border-radius:14px;padding:12px}
  .pf-k .n{font-size:20px;font-weight:800;color:var(--pi);letter-spacing:-.03em;font-variant-numeric:tabular-nums;line-height:1}
  .pf-k .n.b{color:var(--pblue)}.pf-k .n.p{color:#ee1f63}
  .pf-k .l{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--pi3);margin-top:5px}
  .pf-k .tr{font-size:10px;font-weight:800;margin-top:3px}
  .pf .up{color:#5b8af0}.pf .down{color:#c0392b}
  .pf-grid{display:grid;gap:12px;grid-template-columns:1fr;margin-top:12px}
  @media(min-width:860px){.pf-grid{grid-template-columns:1.45fr 1fr}}
  .pf-card{background:var(--surface);border:1px solid var(--pl);border-radius:16px;padding:16px}
  .pf-card h4{font-size:13px;font-weight:800;color:var(--pi);margin:0 0 2px}
  .pf-card h4 span{color:var(--pi3);font-weight:700}
  .pf-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px}
  .pf-tg{display:inline-flex;border:1px solid var(--pl);border-radius:9px;padding:2px;background:#fff;gap:2px}
  .pf-tg b{border-radius:7px;padding:4px 10px;color:var(--pi2);font-size:10.5px;font-weight:800;cursor:default}
  .pf-tg b.on-ink{background:#171534;color:#fff}.pf-tg b.on-bl{background:#2f6bd8;color:#fff}
  .pf-bars{display:flex;align-items:flex-end;gap:9px;height:170px;border-bottom:1px solid var(--pl);margin-top:16px}
  .pf-col{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;min-width:0}
  .pf-col .tot{font-size:10px;font-weight:800;color:var(--pi2);margin-bottom:4px;font-variant-numeric:tabular-nums}
  .pf-stack{width:100%;max-width:38px;display:flex;flex-direction:column;border-radius:6px 6px 0 0;overflow:hidden}
  .pf-stack i{display:block}
  .pf-xl{display:flex;gap:9px;margin-top:6px}
  .pf-xl span{flex:1;text-align:center;font-size:9.5px;font-weight:700;color:var(--pi3)}
  .pf-leg{display:flex;flex-wrap:wrap;gap:11px;margin-top:13px}
  .pf-leg span{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:700;color:var(--pi2)}
  .pf-leg i{width:9px;height:9px;border-radius:3px}
  .pf-attn{display:flex;flex-direction:column;gap:9px;margin-top:6px}
  .pf-attn .r{display:flex;align-items:center;gap:9px;font-size:12px;font-weight:600;color:var(--pi2)}
  .pf-attn .r .d{width:7px;height:7px;border-radius:50%;flex:none}
  .pf-attn .r .go{margin-left:auto;font-size:10px;font-weight:800;color:var(--pblue);background:#eaf1fd;border-radius:999px;padding:2px 9px}
  .pf-lg{width:100%;border-collapse:collapse;margin-top:8px}
  .pf-lg th{font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--pi3);text-align:left;padding:6px;font-weight:800}
  .pf-lg th.r,.pf-lg td.r{text-align:right}
  .pf-lg td{font-size:12px;padding:8px 6px;border-top:1px solid var(--pl);color:var(--pi)}
  .pf-lg td.r{font-variant-numeric:tabular-nums;font-weight:700}
  .pf-rank{width:20px;height:20px;border-radius:6px;background:#100e26;color:#fff;font-size:10px;font-weight:800;display:inline-grid;place-items:center}
  .pf-cap{margin-top:12px;font-size:12px;color:var(--ink-3);text-align:center}
  .pf-cap b{color:var(--ink-2)}

  /* ===== Hero analytics dashboard (faithful to the Finance overview) ===== */
  .dash{background:var(--panel);border:1px solid var(--line);border-radius:22px;padding:13px;box-shadow:var(--shadow)}
  .dash-cards{display:grid;grid-template-columns:1fr 1fr;gap:9px}
  .dc{border-radius:15px;padding:13px 14px;background:var(--surface);border:1px solid var(--line);color:var(--ink);overflow:hidden}
  .dc .ic{font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-3);display:flex;align-items:center;gap:5px}
  .dc .n{font-size:23px;font-weight:800;letter-spacing:-.03em;margin-top:5px;line-height:1;color:var(--ink);font-variant-numeric:tabular-nums}
  .dc .s{font-size:9px;color:var(--ink-3);margin-top:4px}
  .dc.green .n{color:var(--indigo)}
  .dash-card{background:var(--surface);border:1px solid var(--line);border-radius:15px;padding:13px;margin-top:9px}
  .dash-card .ch{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}
  .dash-card .ch h5{font-size:13px;font-weight:800;color:var(--ink);margin:0}
  .dash-card .ch .lg{font-size:10.5px;font-weight:700;color:#1d3a8f;display:inline-flex;align-items:center;gap:5px}
  .dash-card .ch .lg::before{content:"";width:7px;height:7px;border-radius:50%;background:#1d3a8f}
  .rev-row{margin-top:10px}
  .rev-top{display:flex;align-items:center;gap:8px}
  .rev-top .rk{width:19px;height:19px;border-radius:6px;color:#fff;font-size:10px;font-weight:800;display:grid;place-items:center}
  .rev-top .nm{font-size:12px;font-weight:700;color:var(--ink);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .rev-top .amt{font-size:12px;font-weight:800;color:var(--ink);font-variant-numeric:tabular-nums}
  .rev-bar{height:7px;border-radius:999px;background:var(--panel);margin-top:5px;overflow:hidden}
  .rev-bar i{display:block;height:100%;border-radius:999px}

  /* ===== Key-features carousel ===== */
  .carousel{position:relative;margin-top:12px}
  .ctrack{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;scrollbar-width:none}
  .ctrack::-webkit-scrollbar{display:none}
  .slide{min-width:100%;scroll-snap-align:center;padding:4px}
  .slide-in{display:grid;gap:26px;grid-template-columns:1fr;align-items:center;background:var(--surface);border:1px solid var(--line);border-radius:22px;padding:28px;box-shadow:var(--shadow)}
  @media(min-width:860px){.slide-in{grid-template-columns:1fr 1fr}}
  .slide h3{font-size:clamp(22px,2.6vw,30px);font-weight:800}
  .slide .sc{color:var(--ink-2);font-size:15px;margin-top:10px}
  .slide ul{list-style:none;padding:0;margin:16px 0 0;display:flex;flex-direction:column;gap:8px}
  .slide li{font-size:13.5px;font-weight:600;color:var(--ink-2);display:flex;gap:9px;align-items:flex-start}
  .slide li::before{content:"\2713";color:var(--brand);font-weight:900;flex:none}
  .cdots{display:flex;justify-content:center;gap:8px;margin-top:18px}
  .cdot{width:9px;height:9px;border-radius:50%;background:var(--line);border:none;cursor:pointer;padding:0;transition:.2s}
  .cdot.on{background:var(--indigo);width:22px;border-radius:999px}
  .carr{position:absolute;top:calc(50% - 20px);width:38px;height:38px;border-radius:50%;border:1px solid var(--line);background:var(--surface);color:var(--ink);font-size:20px;font-weight:700;cursor:pointer;z-index:3;box-shadow:var(--shadow)}
  .carr.prev{left:-6px}.carr.next{right:-6px}
  .tfc-grid{grid-template-columns:1fr}
  @media(min-width:900px){.tfc-grid{grid-template-columns:1fr 1fr}}
  .tfc-grid>div:last-child{justify-self:stretch;width:100%}

  /* ===== Option C — dark dashboards (elevation ladder) ===== */
  .hero.dark, .gband{background:#f5f8fd}
  .hero.dark::before{opacity:.45}
  .hero.dark h1.head{color:#fff}.hero.dark h1.head em{color:#1d3a8f}
  .hero.dark .sub{color:#5f5c74}.hero.dark .sub b{color:#fff}
  .hero.dark .eyebrow, .gband .eyebrow{color:#2f6bd8}
  .hero.dark .trust{color:rgba(255,255,255,.85)}.hero.dark .trust b{color:#fff}
  .hero.dark .chip{background:#ffffff;border-color:#ece6f1;color:#4a4763}
  .hero.dark .btn-ghost{border-color:rgba(255,255,255,.45);color:#fff}
  .gband .sec-head h2, .gband h2, .gband h3{color:#fff}
  .gband .sec-head p, .gband .sc{color:#5f5c74}
  .gband p{color:#5f5c74}.gband .sub b, .gband p b{color:#fff}
  .gband ul li{color:#4a4763}
  .gband .pf-cap{color:#5f5c74}.gband .pf-cap b{color:#4a4763}
  .gband .chip{background:#ffffff;border-color:#ece6f1;color:#4a4763}
  /* frame (step 2) */
  .hero.dark .dash, .gband .dash, .gband .pf-app{background:#ffffff !important;border:1px solid #ece6f1 !important;box-shadow:0 24px 60px -30px rgba(9,20,54,.45)}
  .gband .pf-app .pf-body, .gband .pf-body{background:transparent !important}
  .gband .pf-bar{background:#ffffff !important;border-bottom:1px solid #ece6f1 !important}
  /* cards (step 3) */
  .hero.dark .dc, .gband .dc, .gband .pf-k, .gband .pf-card, .gband .dash-card, .gband .stat{background:#ffffff !important;border:1px solid #ece6f1 !important}
  .hero.dark .dc .ic, .gband .dc .ic, .gband .pf-k .l{color:#5f5c74 !important}
  .hero.dark .dc .n, .gband .dc .n, .gband .pf-k .n{color:var(--ink) !important}
  .hero.dark .dc.green .n{color:#2f6bd8 !important}
  .hero.dark .dc .s, .gband .dc .s, .gband .pf-k .tr{color:#5f5c74 !important}
  .gband .pf-card h4, .gband .dash-card .ch h5{color:var(--ink) !important}
  .gband .pf-card h4 span, .gband .dash-card .ch h5 span, .gband .pf-xl span, .gband .pf-attn .r{color:#5f5c74 !important}
  .hero.dark .dash-card .ch h5{color:var(--ink)}
  .hero.dark .dash-card .ch .lg{color:var(--indigo)}.hero.dark .dash-card .ch .lg::before{background:var(--indigo)}
  .hero.dark .rev-top .nm, .hero.dark .rev-top .amt{color:var(--ink)}
  .hero.dark .rev-bar, .gband .rev-bar{background:#ece6f1}
  .gband .pf-tg{background:#ffffff;border-color:#ece6f1}.gband .pf-tg b{color:#5f5c74}
  .gband .pf-lg td{color:#4a4763 !important;border-top-color:#ece6f1 !important}.gband .pf-lg th{color:#5f5c74 !important}
  .gband .pf-attn .r .go{background:#eaf0fc;color:#2f6bd8}

  /* carousel + embed visuals — force the dark ladder, readable text */
  #featCar .slide-in{background:#ffffff !important;border:1px solid #ece6f1 !important}
  #featCar .pf-app{background:#ffffff !important;border:1px solid #ece6f1 !important}
  #featCar .pf-bar{background:#f5f8fd !important;border-bottom:1px solid #ece6f1 !important}
  #featCar .pf-body{background:transparent !important}
  #featCar .pf-k{background:#f5f8fd !important;border:1px solid #243156 !important}
  #featCar .pf-k .n{color:#171534 !important}
  #featCar .pf-k .l{color:#5f5c74 !important}
  #featCar .slide h3{color:var(--ink) !important}
  #featCar .slide .sc, #featCar .slide li{color:#4a4763 !important}

.navtab{font-size:14.5px;font-weight:600;color:var(--ink-2)}.navtab:hover{color:var(--brand)}.navactive{color:var(--gold)!important;font-weight:800}

/* ---- pricing cards ---- */
.price{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;align-items:stretch;max-width:1060px;margin:0 auto}
.pcard{position:relative;display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--line);border-radius:20px;padding:28px 24px 26px;box-shadow:0 24px 60px -34px rgba(16,35,86,.22)}
.pcard.feat{border-color:rgba(47,107,216,.45);box-shadow:0 0 0 1px rgba(47,107,216,.25),0 30px 70px -30px rgba(47,107,216,.35)}
.pcard h3{font-size:20px;font-weight:800;color:var(--ink);margin:0}
.pcard .amt{font-size:40px;font-weight:800;color:var(--ink);letter-spacing:-.03em;margin:10px 0 4px;line-height:1}
.pcard .amt span{font-size:15px;font-weight:700;color:var(--ink-3);letter-spacing:0}
.pcard .who{font-size:13.5px;font-weight:600;color:var(--ink-2);margin:6px 0 16px;line-height:1.5}
.pcard ul{list-style:none;padding:0;margin:4px 0 20px;display:flex;flex-direction:column;gap:10px;flex:1}
.pcard li{position:relative;padding-left:24px;font-size:13.5px;font-weight:600;color:var(--ink-2);line-height:1.45}
.pcard li::before{content:"✓";position:absolute;left:0;top:0;color:var(--brand);font-weight:900}
.pcard .btn{width:100%;justify-content:center;margin-top:auto}
.pop{position:absolute;top:-13px;left:50%;transform:translateX(-50%);font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;background:var(--brand);color:#fff;border-radius:999px;padding:6px 15px;white-space:nowrap;box-shadow:0 8px 20px -6px rgba(47,107,216,.6)}
@media(max-width:900px){.price{grid-template-columns:1fr;max-width:440px}}

/* Platform grid — "replaces" savings footer + summary banner */
#platform .fcard{display:flex;flex-direction:column}
#platform .flist{flex:1}
.repl{margin-top:14px;padding-top:11px;border-top:1px solid var(--line);font-size:12px;font-weight:600;color:var(--ink-2);line-height:1.5}
.repl span{display:inline-block;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3);margin-right:7px}
.repl b{color:var(--brand);font-weight:800;white-space:nowrap}
.save-banner{margin-top:24px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:18px;background:linear-gradient(120deg,rgba(47,107,216,.12),var(--surface) 70%);border:1px solid rgba(47,107,216,.3);border-radius:18px;padding:22px 26px}
.save-banner p{margin:0;font-size:15.5px;color:var(--ink-2);max-width:64ch;line-height:1.5}
.save-banner b{color:var(--ink);font-weight:800}
.save-banner .big{color:var(--brand)}

/* What you'll save — itemised receipt */
.savecard{display:grid;grid-template-columns:1.25fr 0.85fr;border:1px solid var(--line);border-radius:22px;overflow:hidden;background:var(--surface);box-shadow:0 30px 70px -40px rgba(16,35,86,.22)}
.savelist{padding:8px 24px}
.saverow{display:grid;grid-template-columns:1fr auto;grid-template-areas:"t c" "p c";column-gap:14px;align-items:center;padding:12px 0;border-bottom:1px solid var(--line)}
.saverow .st{grid-area:t;font-size:14.5px;font-weight:700;color:var(--ink)}
.saverow .sp{grid-area:p;font-size:11.5px;color:var(--ink-3);font-weight:600;margin-top:1px}
.saverow .sc{grid-area:c;font-size:15px;font-weight:800;color:var(--ink-2);font-variant-numeric:tabular-nums}
.saverow.total{border-top:2px solid var(--line);border-bottom:0}
.saverow.total .st{font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3)}
.saverow.total .sc{font-size:24px;color:var(--ink);text-decoration:line-through;text-decoration-color:var(--brand);text-decoration-thickness:2px}
.saveout{background:linear-gradient(160deg,#eaf0fc,#f5f8fd);padding:32px 28px;display:flex;flex-direction:column;justify-content:center;gap:3px;border-left:1px solid var(--line)}
.so-ey{font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3)}
.so-price{font-size:54px;font-weight:800;color:#fff;letter-spacing:-.03em;line-height:1}
.so-price span{font-size:20px;color:var(--ink-3);font-weight:700}
.so-strike{font-size:13px;color:var(--ink-3);text-decoration:line-through;margin-bottom:16px}
.so-big{font-size:42px;font-weight:800;color:var(--brand);letter-spacing:-.02em;line-height:1;margin-top:4px}
.so-lab{font-size:12.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--ink);margin-bottom:16px}
.so-note{font-size:12.5px;color:var(--ink-2);line-height:1.55;margin-bottom:18px}
.saveout .btn{align-self:flex-start}
@media(max-width:760px){.savecard{grid-template-columns:1fr}.saveout{border-left:0;border-top:1px solid var(--line)}}

/* Feature cards — collapsible feature list (native details) */
#platform .fcard{display:flex;flex-direction:column}
#platform .facc{margin-top:auto;border-top:1px solid var(--line)}
.facc summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:8px;padding:13px 0 3px;font-size:13px;font-weight:800;color:var(--brand);user-select:none}
.facc summary::-webkit-details-marker{display:none}
.facc summary::after{content:"▾";margin-left:auto;font-size:12px;color:var(--ink-3);transition:transform .2s ease}
.facc[open] summary::after{transform:rotate(180deg)}
.facc summary:hover{filter:brightness(1.12)}
.facc .flist{margin-top:8px}

/* Feature pill hover tooltips (emoji + one-line description) */
.flist li{position:relative}
.flist .tip{position:absolute;left:0;top:calc(100% + 8px);width:min(300px,80vw);background:#ffffff;border:1px solid rgba(29,58,143,.28);border-radius:12px;padding:11px 13px;box-shadow:0 20px 44px -18px rgba(16,35,86,.22);opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .16s ease,transform .16s ease;z-index:30;pointer-events:none;font-size:12.5px;font-weight:500;color:var(--ink-2);line-height:1.5;text-transform:none;letter-spacing:0}
.flist .tip b{display:block;font-size:12.5px;font-weight:800;color:var(--ink);margin-bottom:3px}
.flist li:hover .tip,.flist li:focus-within .tip{opacity:1;visibility:visible;transform:none}

/* Pricing — monthly/annual billing toggle */
.billtoggle{display:inline-flex;gap:4px;background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:4px;margin:0 auto 26px}
.billtoggle .bt{border:0;background:transparent;color:var(--ink-2);font-size:13.5px;font-weight:800;padding:9px 18px;border-radius:999px;cursor:pointer;display:inline-flex;align-items:center;gap:8px;transition:background .15s,color .15s}
.billtoggle .bt.on{background:var(--brand);color:#fff}
.billtoggle .bt .save{font-size:10.5px;font-weight:800;background:rgba(47,107,216,.18);color:var(--brand);border-radius:999px;padding:2px 8px}
.billtoggle .bt.on .save{background:rgba(255,255,255,.22);color:#fff}
.bandbox{font-size:12px;font-weight:700;color:var(--ink-2);background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:9px 11px;margin:2px 0 14px;line-height:1.7}
.price .amt .pa{display:none}
.price.annual .amt .pm{display:none}
.price.annual .amt .pa{display:inline}
.billnote{display:none;font-size:12px;font-weight:800;color:var(--brand);margin:-4px 0 10px}
.price.annual .billnote{display:block}
.bandbox .pa{display:none}
.price.annual .bandbox .pm{display:none}
.price.annual .bandbox .pa{display:block}

/* Pricing cards — two stacked CTAs (Start free + Book a demo) */
.pcard .pbtns{margin-top:auto;display:flex;flex-direction:column;gap:9px}
.pcard .pbtns .btn{width:100%;justify-content:center;margin-top:0}

/* Pricing — a distinct accent colour per plan card */
.price .pcard{--pc:#2f6bd8}                     /* Freelancer · indigo */
.price .pcard:nth-child(2){--pc:#1d3a8f}        /* Company · pink */
.price .pcard:nth-child(3){--pc:#0b7a43}        /* Franchise · teal */
.price .pcard{border-color:color-mix(in srgb,var(--pc) 42%,transparent)!important;box-shadow:0 0 0 1px color-mix(in srgb,var(--pc) 16%,transparent),0 26px 62px -36px color-mix(in srgb,var(--pc) 55%,transparent)!important}
.price .pcard h3{color:var(--pc)}
.price .pcard .pop{background:var(--pc);box-shadow:0 8px 20px -6px var(--pc)}
.price .pcard .pbtns .btn-primary{background:var(--pc);box-shadow:0 12px 26px -12px var(--pc)}
.price .pcard .pbtns .btn-primary:hover{filter:brightness(1.08)}
.price .pcard .pbtns .btn-ghost:hover{border-color:var(--pc);color:var(--pc)}

/* Chart data labels — brighter on the dark embeds (were too dim to read) */
.gband .pf-col .tot, .gband .tot{color:#4a4763 !important}
.gband .pf-bars{border-bottom-color:#ece6f1}

/* Legal pages (terms / privacy) */
.legal{max-width:820px;margin:0 auto}
.legal .updated{font-size:13px;color:var(--ink-3);margin:0 0 6px;font-weight:700}
.legal h1{font-size:clamp(28px,4vw,44px);font-weight:800;margin:0 0 8px}
.legal .lead{font-size:16.5px;color:var(--ink-2);margin:12px 0 26px;line-height:1.65}
.legal h2{font-size:20px;font-weight:800;color:var(--ink);margin:34px 0 10px;scroll-margin-top:84px}
.legal h3{font-size:15.5px;font-weight:800;color:var(--ink);margin:18px 0 6px}
.legal p{font-size:15px;color:var(--ink-2);line-height:1.72;margin:0 0 12px}
.legal ul,.legal ol{margin:0 0 14px;padding-left:22px;color:var(--ink-2)}
.legal li{font-size:15px;line-height:1.7;margin:5px 0}
.legal a{color:var(--brand);font-weight:600}
.legal strong{color:var(--ink);font-weight:700}
.legal .callout{background:var(--surface);border:1px solid var(--line);border-left:4px solid var(--brand);border-radius:12px;padding:14px 16px;margin:20px 0;font-size:14px;color:var(--ink-2);line-height:1.6}
.legal .toc{background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:16px 20px;margin:0 0 32px}
.legal .toc-h{font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3);margin-bottom:10px}
.legal .toc a{display:inline-block;margin:3px 16px 3px 0;font-size:13.5px;font-weight:600}
.foot-col.legalcol h4{margin-top:0}

/* Pricing — plan comparison table */
.cmp-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:16px;background:var(--surface);box-shadow:0 24px 60px -40px rgba(16,35,86,.22)}
.cmp{width:100%;border-collapse:collapse;min-width:600px}
.cmp th,.cmp td{padding:12px 16px;text-align:center;border-bottom:1px solid var(--line);font-size:13.5px}
.cmp th:first-child,.cmp td:first-child{text-align:left;font-weight:600;color:var(--ink-2)}
.cmp thead th{font-size:14.5px;font-weight:800;color:var(--ink);background:var(--panel)}
.cmp thead th.feat{color:var(--brand)}
.cmp .yes{color:var(--ok);font-weight:900;font-size:15px}
.cmp .no{color:var(--ink-3)}
.cmp tbody tr:last-child td{border-bottom:0}
.cmp .price-row td{font-weight:800;color:var(--ink);background:var(--panel);font-size:15px}

/* Nav "Built for" dropdown */
.navdrop{position:relative;display:inline-flex;align-items:center}
.navdrop::after{content:"";position:absolute;top:100%;left:-10px;right:-10px;height:16px}
.navdrop-btn{border:0;background:transparent;font-family:inherit;font-size:14.5px;font-weight:600;color:var(--ink-2);cursor:pointer;display:inline-flex;align-items:center;gap:5px;padding:0;line-height:inherit}
.navdrop-btn .caret{font-size:10px;transition:transform .2s ease}
.navdrop:hover .navdrop-btn,.navdrop:focus-within .navdrop-btn{color:var(--brand)}
.navdrop:hover .caret,.navdrop:focus-within .caret{transform:rotate(180deg)}
.navdrop-btn.on{color:var(--brand);font-weight:800}
.navdrop-menu{position:absolute;top:calc(100% + 14px);left:50%;transform:translateX(-50%) translateY(6px);min-width:270px;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:8px;box-shadow:0 26px 54px -22px rgba(16,35,86,.22);opacity:0;visibility:hidden;transition:opacity .16s ease,transform .16s ease;z-index:60}
.navdrop:hover .navdrop-menu,.navdrop:focus-within .navdrop-menu{opacity:1;visibility:visible;transform:translateX(-50%) translateY(0)}
.navdrop-menu a{display:block;padding:10px 12px;border-radius:10px;color:var(--ink);font-size:14px;font-weight:700}
.navdrop-menu a span{display:block;font-size:11.5px;font-weight:500;color:var(--ink-3);margin-top:1px}
.navdrop-menu a:hover{background:var(--surface);color:var(--brand)}

/* Nav "Platform" mega-menu */
.navmega-menu{position:absolute;top:calc(100% + 14px);left:0;width:min(720px,92vw);display:grid;grid-template-columns:0.85fr 1.6fr;gap:20px;background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:20px 22px;box-shadow:0 28px 60px -22px rgba(16,35,86,.22);opacity:0;visibility:hidden;transform:translateY(6px);transition:opacity .16s ease,transform .16s ease;z-index:60}
.navmega:hover .navmega-menu,.navmega:focus-within .navmega-menu{opacity:1;visibility:visible;transform:translateY(0)}
.navmega-intro{border-right:1px solid var(--line);padding-right:20px}
.navmega-intro .nm-title{font-size:20px;font-weight:800;color:var(--ink);font-family:var(--ff)}
.navmega-intro p{font-size:12.5px;color:var(--ink-3);margin:8px 0 14px;line-height:1.55}
.navmega-intro .nm-all{font-size:13px;font-weight:800;color:var(--brand)}
.navmega-grid{display:grid;grid-template-columns:1fr 1fr;gap:4px}
.navmega-grid a{display:flex;gap:11px;padding:9px 10px;border-radius:11px;align-items:flex-start}
.navmega-grid a:hover{background:var(--surface)}
.navmega-grid .nm-ic{font-size:18px;flex:none;line-height:1.3}
.navmega-grid b{display:block;font-size:13.5px;font-weight:800;color:var(--ink)}
.navmega-grid a:hover b{color:var(--brand)}
.navmega-grid span{display:block;font-size:11px;color:var(--ink-3);margin-top:1px;line-height:1.4}
@media(max-width:1040px){.navmega-menu{grid-template-columns:1fr}.navmega-intro{border-right:0;border-bottom:1px solid var(--line);padding-right:0;padding-bottom:12px}}


/* ================= ActivityLane interactive FX layer ================= */
@media (prefers-reduced-motion:no-preference){
 [data-reveal]{opacity:0;transform:translateY(24px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
 [data-reveal].in{opacity:1;transform:none}
 [data-reveal].d1{transition-delay:.08s}[data-reveal].d2{transition-delay:.16s}[data-reveal].d3{transition-delay:.24s}[data-reveal].d4{transition-delay:.32s}[data-reveal].d5{transition-delay:.40s}
}
.fgrid{perspective:1200px}
.fcard{position:relative;transform-style:preserve-3d;transition:transform .3s cubic-bezier(.2,.7,.2,1),box-shadow .3s;will-change:transform}
.fcard.tilting{transition:transform .06s linear}
.fcard>.glare{position:absolute;inset:0;border-radius:inherit;pointer-events:none;opacity:0;transition:opacity .3s;background:radial-gradient(240px 240px at var(--gx,50%) var(--gy,0),rgba(47,107,216,.16),transparent 60%);z-index:3}
.fcard:hover>.glare{opacity:1}
.fcard .fic{transition:transform .3s cubic-bezier(.2,.7,.2,1)}
.fcard:hover .fic{transform:translateZ(34px) scale(1.06)}
.btn-primary{position:relative;overflow:hidden;transition:transform .2s cubic-bezier(.2,.7,.2,1),filter .2s}
.btn-primary::after{content:"";position:absolute;top:0;left:-130%;width:55%;height:100%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.4),transparent);transform:skewX(-18deg);transition:left .6s ease;pointer-events:none}
.btn-primary:hover::after{left:150%}

/* live savings calculator */
#calc .calc{display:grid;gap:24px;grid-template-columns:1fr;max-width:980px;margin:0 auto;background:var(--surface);border:1px solid var(--line);border-radius:22px;padding:26px}
@media(min-width:860px){#calc .calc{grid-template-columns:1fr 1.05fr;gap:38px;padding:36px}}
#calc .calc-controls{display:flex;flex-direction:column;gap:28px;justify-content:center}
#calc label{display:block;font-weight:800;color:var(--ink);font-size:14px}
#calc label b{float:right;color:var(--brand)}
#calc input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:8px;margin-top:14px;border-radius:999px;background:linear-gradient(90deg,var(--brand) var(--p,40%),#ece6f1 var(--p,40%));outline:none}
#calc input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:24px;height:24px;border-radius:50%;background:#fff;border:5px solid var(--brand);cursor:pointer;box-shadow:0 4px 14px rgba(47,107,216,.55)}
#calc input[type=range]::-moz-range-thumb{width:22px;height:22px;border-radius:50%;background:#fff;border:5px solid var(--brand);cursor:pointer}
#calc .calc-out{background:var(--panel);border:1px solid var(--line);border-radius:18px;padding:26px;text-align:center}
#calc .calc-big{font-family:var(--ff-display);font-weight:800;line-height:1;display:flex;align-items:baseline;justify-content:center;gap:2px}
#calc .calc-big .cur{font-size:30px;color:var(--brand)}
#calc .calc-big .num{font-size:clamp(46px,9vw,74px);color:#fff;font-variant-numeric:tabular-nums}
#calc .calc-big .per{font-size:14px;color:var(--ink-3);margin-left:8px;font-family:var(--ff);align-self:flex-end;margin-bottom:10px}
#calc .calc-rows{margin:18px 0;display:flex;flex-direction:column;gap:0;text-align:left}
#calc .calc-rows>div{display:flex;justify-content:space-between;gap:10px;padding:11px 4px;border-top:1px solid var(--line);font-size:13.5px;color:var(--ink-2)}
#calc .calc-rows b{font-variant-numeric:tabular-nums;color:var(--ink);white-space:nowrap}
#calc .calc-rows .bad b{color:#5b8af0}
#calc .calc-rows .good b{color:#15b364}
#calc .calc-out .btn{width:100%;margin-top:8px}

/* how-it-works stepper */
#how .steps{position:relative;max-width:760px;margin:0 auto;padding-left:6px}
#how .rail{position:absolute;left:22px;top:14px;bottom:14px;width:3px;background:#ece6f1;border-radius:3px;overflow:hidden}
#how .rail-fill{position:absolute;top:0;left:0;width:100%;height:0;background:linear-gradient(180deg,var(--indigo),var(--brand))}
#how .step{position:relative;display:flex;gap:22px;padding:22px 0}
#how .dot{flex:none;width:46px;height:46px;border-radius:50%;display:grid;place-items:center;font-family:var(--ff-display);font-weight:800;font-size:18px;color:#5f5c74;background:var(--surface);border:2px solid var(--line);z-index:1;transition:.4s cubic-bezier(.2,.7,.2,1)}
#how .step.on .dot{color:#fff;background:var(--brand);border-color:var(--brand);box-shadow:0 8px 26px -8px rgba(47,107,216,.7);transform:scale(1.09)}
#how .step-c{opacity:.45;transition:opacity .4s;padding-top:5px}
#how .step.on .step-c{opacity:1}
#how .step-c h3{font-family:var(--ff-display);color:var(--ink);font-size:19px;margin:0 0 6px}
#how .step-c p{color:var(--ink-3);font-size:14.5px;line-height:1.55;margin:0}


/* ================= ActivityLane FX2 — bold 3D movement ================= */
.hero{overflow:hidden}
.scene3d{position:absolute;inset:0;z-index:2;pointer-events:none;perspective:1100px;transform-style:preserve-3d}
.float3d{position:absolute;will-change:transform;transform-style:preserve-3d}
.fl-inner{animation:wkbob var(--t,7s) ease-in-out infinite;animation-delay:var(--d,0s);transform-style:preserve-3d}
@keyframes wkbob{0%,100%{transform:translateY(0) rotate(var(--r,0deg))}50%{transform:translateY(-15px) rotate(calc(var(--r,0deg) * -1))}}
.chip3d{display:flex;align-items:center;gap:7px;padding:10px 13px;border-radius:14px;background:rgba(14,22,50,.82);border:1px solid rgba(120,140,210,.4);box-shadow:0 24px 50px -18px rgba(16,35,86,.22);font-weight:800;font-size:12.5px;color:#171534;white-space:nowrap}
.chip3d .e{font-size:17px}
.chip3d small{color:#2f6bd8;font-weight:700}
.chip3d.pink{border-color:rgba(47,107,216,.6);box-shadow:0 24px 60px -16px rgba(47,107,216,.55)}
.chip3d.pink small{color:#ff8fb4}
.coin3d{width:50px;height:50px;border-radius:50%;display:grid;place-items:center;font-weight:900;font-size:19px;color:#7a4b00;background:radial-gradient(circle at 32% 28%,#ffe08a,#f2a51c 62%,#bd7604);box-shadow:0 20px 42px -12px rgba(242,165,28,.8),inset 0 2px 6px rgba(255,255,255,.7)}
@media(max-width:760px){.scene3d{display:none}}
@media(prefers-reduced-motion:reduce){.scene3d{display:none}}

/* dramatic fly-in-from-depth reveal (overrides the gentle FX1 reveal) */
@media (prefers-reduced-motion:no-preference){
 [data-reveal]{opacity:0;transform:perspective(1200px) translateY(48px) translateZ(-300px) rotateX(20deg);transform-origin:50% 100%;transition:opacity .85s ease,transform .95s cubic-bezier(.16,.85,.3,1)}
 [data-reveal].in{opacity:1;transform:none}
 /* continuous life */
 .fcard .fic{animation:wkbob 6s ease-in-out infinite}
 .fcard:nth-child(2n) .fic{animation-duration:7.4s}
 .fcard:nth-child(3n) .fic{animation-duration:5.2s}
 .pf-app{animation:wkfloatY 8s ease-in-out infinite}
}
@keyframes wkfloatY{0%,100%{transform:translateY(0)}50%{transform:translateY(-11px)}}

/* 3D auto-scrolling marquee */
.mq{position:relative;overflow:hidden;padding:20px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);background:linear-gradient(180deg,#ffffff,#f5f8fd);perspective:640px;-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.mq-track{display:flex;gap:14px;width:max-content;animation:mqscroll 34s linear infinite}
.mq:hover .mq-track{animation-play-state:paused}
.mq-chip{display:flex;align-items:center;gap:8px;padding:11px 18px;border-radius:999px;background:var(--surface);border:1px solid var(--line);font-weight:800;font-size:14px;color:var(--ink-2);white-space:nowrap}
.mq-chip .e{font-size:16px}
.mq-chip s{color:#5b8af0;text-decoration-thickness:2px}
.mq-lead{color:#fff;background:var(--brand);border-color:var(--brand)}
@keyframes mqscroll{to{transform:translateX(-50%)}}
@media(prefers-reduced-motion:reduce){.mq-track{animation:none;transform:none}}

/* ===== Owner override: ActivityLane brand motion always on (site owner's explicit choice) ===== */
.scene3d{display:block !important}
@media(max-width:760px){.scene3d{display:none !important}}
[data-reveal]{opacity:0;transform:perspective(1200px) translateY(48px) translateZ(-300px) rotateX(20deg);transform-origin:50% 100%;transition:opacity .85s ease,transform .95s cubic-bezier(.16,.85,.3,1)}
[data-reveal].in{opacity:1;transform:none}
.fl-inner{animation:wkbob var(--t,7s) ease-in-out infinite !important;animation-delay:var(--d,0s) !important}
.fcard .fic{animation:wkbob 6s ease-in-out infinite}
.fcard:nth-child(2n) .fic{animation-duration:7.4s}
.fcard:nth-child(3n) .fic{animation-duration:5.2s}
.pf-app{animation:wkfloatY 8s ease-in-out infinite}
.mq-track{animation:mqscroll 34s linear infinite !important}


/* ================= ActivityLane feature orbit ================= */
#orbit{position:relative;overflow:hidden}
.orbit-stage{position:relative;height:460px;max-width:840px;margin:26px auto 0}
@media(max-width:760px){.orbit-stage{height:560px;max-width:360px}}
.orbit-hub{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:15;display:flex;flex-direction:column;align-items:center;gap:9px;text-align:center;pointer-events:none}
.orbit-hub .mark{width:96px;height:96px;border-radius:26px;display:grid;place-items:center;background:linear-gradient(135deg,#1d3a8f,#ff7aa4);box-shadow:0 26px 70px -14px rgba(47,107,216,.75);animation:hubpulse 3.6s ease-in-out infinite}
.orbit-hub .mark svg{width:46px;height:46px}
.orbit-hub b{font-family:var(--ff-display);color:#fff;font-size:18px;letter-spacing:-.01em}
.orbit-hub em{color:var(--ink-3);font-size:12.5px;font-style:normal}
@keyframes hubpulse{0%,100%{transform:scale(1)}50%{transform:scale(1.06)}}
.orbit-hub .halo{position:absolute;left:50%;top:36px;width:230px;height:230px;transform:translate(-50%,-50%);border-radius:50%;background:radial-gradient(circle,rgba(47,107,216,.22),transparent 68%);filter:blur(6px);z-index:-1}
.orbit-ring{position:absolute;inset:0}
.ochip{position:absolute;left:0;top:0;will-change:transform,opacity;display:flex;align-items:center;gap:7px;padding:10px 14px;border-radius:13px;background:rgba(255,255,255,.92);border:1px solid rgba(120,140,210,.42);box-shadow:0 18px 42px -16px rgba(16,35,86,.22);font-weight:800;font-size:13px;color:#171534;white-space:nowrap;backdrop-filter:blur(3px)}
.ochip .e{font-size:16px}
.ochip.pink{border-color:rgba(47,107,216,.65);box-shadow:0 18px 48px -14px rgba(47,107,216,.5)}


/* ===== marquee: persistent lead label + readability ===== */
.mq{display:flex !important;align-items:stretch;overflow:hidden;padding:0 !important;perspective:none;-webkit-mask-image:none !important;mask-image:none !important;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.mq-fixed{flex:none;z-index:3;display:flex;align-items:center;gap:9px;padding:0 22px;background:var(--brand);color:#fff;font-family:var(--ff-display);font-weight:800;font-size:15px;white-space:nowrap;box-shadow:18px 0 30px -6px rgba(8,11,30,.98)}
.mq-fixed .e{font-size:18px}
.mq-view{position:relative;flex:1;min-width:0;overflow:hidden;padding:18px 0;-webkit-mask-image:linear-gradient(90deg,#000 86%,transparent);mask-image:linear-gradient(90deg,#000 86%,transparent)}
.mq-view .mq-track{padding:0}
.mq-chip{color:var(--ink);background:var(--surface);border-color:var(--line)}
.mq-chip s{color:#ff8fb4;text-decoration-thickness:2px}
/* orbit chip: drop backdrop-filter (cleaner + avoids capture glitches) */
.ochip{backdrop-filter:none}

/* marquee readability: bright name, pink strike line only */
.mq-chip s{color:#4a4763 !important;text-decoration-line:line-through;text-decoration-color:#9fb6e0 !important;text-decoration-thickness:1.5px}
.mq-chip{color:#171534}


/* ===== reusable image slots — drop real (consented) photos in later ===== */
.wk-img{position:relative;overflow:hidden;border-radius:20px;border:1px solid var(--line);background:var(--surface);aspect-ratio:var(--ar,4/3);box-shadow:0 30px 60px -32px rgba(16,35,86,.22);margin:0}
.wk-img img{width:100%;height:100%;object-fit:cover;display:block}
.wk-img::after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,rgba(8,11,30,0) 45%,rgba(8,11,30,.5)),radial-gradient(120% 90% at 100% 0%,rgba(47,107,216,.26),transparent 55%)}
.wk-img .ph{position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;text-align:center;color:var(--ink-3);border-radius:20px;border:2px dashed var(--line);background:repeating-linear-gradient(45deg,transparent,transparent 11px,rgba(255,255,255,.02) 11px,rgba(255,255,255,.02) 22px)}
.wk-img .ph .ic{font-size:30px}
.wk-img .ph b{color:var(--ink-2);font-size:14px;font-weight:800}
.wk-img .ph span{font-size:12px}
.wk-img img[src]:not([src=""]) ~ .ph{display:none}
.wk-gallery{display:grid;gap:18px;grid-template-columns:1fr;max-width:1000px;margin:0 auto}
@media(min-width:720px){.wk-gallery{grid-template-columns:repeat(3,1fr)}}


/* ================= Famly-style credibility blocks ================= */
#trusted .trusted-lead{text-align:center;color:var(--ink-3);font-size:12.5px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;margin:0 0 18px}
.logostrip{display:flex;flex-wrap:wrap;gap:14px;justify-content:center;align-items:center}
.logo-slot{width:132px;height:52px;border-radius:12px;border:2px dashed var(--line);display:grid;place-items:center;color:var(--ink-3);font-size:11px;font-weight:800;opacity:.7;transition:.25s;background:repeating-linear-gradient(45deg,transparent,transparent 9px,rgba(255,255,255,.02) 9px,rgba(255,255,255,.02) 18px)}
.logo-slot:hover{opacity:1;border-color:rgba(47,107,216,.45);color:var(--ink-2)}
.stars{color:#ffb547;font-size:15px;letter-spacing:2px;margin-bottom:10px}
.tsub{text-align:center;color:var(--ink-3);font-size:13.5px;margin:-8px 0 4px}
.tsub b{color:#ffb547}
.rescards{display:grid;gap:16px;grid-template-columns:1fr}
@media(min-width:720px){.rescards{grid-template-columns:repeat(4,1fr)}}
.rescard{display:block;position:relative;background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:22px;text-decoration:none;transition:transform .25s cubic-bezier(.2,.7,.2,1),box-shadow .25s,border-color .25s}
.rescard:hover{transform:translateY(-6px);border-color:rgba(47,107,216,.42);box-shadow:0 28px 54px -26px rgba(16,35,86,.22)}
.rescard .ic{font-size:26px}
.rescard h3{font-family:var(--ff-display);color:var(--ink);font-size:16px;margin:12px 0 6px}
.rescard p{color:var(--ink-3);font-size:13px;line-height:1.5;margin:0 0 14px}
.rescard .soon{display:inline-block;font-size:11px;font-weight:800;padding:3px 10px;border-radius:999px;background:var(--panel);color:var(--ink-3);border:1px solid var(--line)}


/* ===== embedded hero photo (two-column) + persona-card photo ===== */
.heroimg{display:grid;gap:34px;grid-template-columns:1fr;align-items:center;text-align:left}
@media(min-width:920px){.heroimg{grid-template-columns:1.02fr .98fr}}
.heroimg .heroimg-txt{max-width:560px}
.heroimg .sub{margin-left:0 !important;margin-right:0 !important}
.heroimg .hero-cta{justify-content:flex-start !important}
.heroimg .wk-img{width:100%}
.pers{overflow:hidden}
.pers .perspic{margin:-2px -2px 16px;border-radius:14px}

.logo-slot.filled{background:#fff;border:1px solid var(--line);opacity:1;padding:8px 12px}
.logo-slot.filled img{max-height:38px;max-width:108px;width:auto;object-fit:contain;display:block}
.logo-slot.filled:hover{border-color:rgba(47,107,216,.5)}

.logo-slot.filled.dark{background:#ffffff;border-color:#ece6f1}

/* scrolling logo marquee */
.logo-marquee{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 9%,#000 91%,transparent);mask-image:linear-gradient(90deg,transparent,#000 9%,#000 91%,transparent)}
.logo-track{display:inline-flex;gap:16px;width:max-content;animation:logoscroll 24s linear infinite;will-change:transform}
.logo-marquee:hover .logo-track{animation-play-state:paused}
.logo-track .logo-slot{flex:none}
@keyframes logoscroll{to{transform:translateX(-50%)}}

/* built persona hero diagrams (replace the photo on Built-for pages) */
.wk-diag{width:100%;aspect-ratio:var(--ar,4/3);border-radius:22px;overflow:hidden;border:1px solid var(--line);box-shadow:0 30px 64px -26px rgba(16,35,86,.22)}
.wk-diag svg{display:block;width:100%;height:100%}

/* ── Photo that BURSTS OUT of the #booking mockup (merge, not plonk) ──
   The photo overlaps the frame's lower-left, bleeds outside it, tilts,
   takes the navy→pink brand tint, lifts on a soft shadow + pink glow, and
   FEATHERS on the inner corner so it dissolves into the screen. */
#booking .bk-screen{position:relative}
#booking .bk-photo{position:absolute;left:-76px;bottom:-72px;width:220px;height:208px;transform:rotate(-6deg);z-index:4}
#booking .bk-photo .glow{position:absolute;inset:-28px;border-radius:30px;background:radial-gradient(58% 58% at 42% 62%,rgba(47,107,216,.55),transparent 72%);filter:blur(28px);z-index:0}
#booking .bk-photo .pic{position:relative;z-index:1;width:100%;height:100%;border-radius:20px;overflow:hidden;border:1px solid rgba(255,255,255,.16);
  -webkit-mask-image:radial-gradient(155% 150% at 20% 86%,#000 50%,transparent 84%);mask-image:radial-gradient(155% 150% at 20% 86%,#000 50%,transparent 84%);
  filter:drop-shadow(0 32px 46px rgba(16,35,86,.22))}
#booking .bk-photo .pic img{display:block;width:100%;height:100%;object-fit:cover}
#booking .bk-photo .pic::after{content:"";position:absolute;inset:0;background:linear-gradient(155deg,rgba(8,11,30,.28),rgba(47,107,216,.34) 92%);mix-blend-mode:overlay}
#booking .bk-photo .tag{position:absolute;left:15px;bottom:17px;z-index:2;display:inline-flex;align-items:center;gap:6px;background:rgba(8,11,30,.62);backdrop-filter:blur(6px);border:1px solid rgba(255,255,255,.18);color:#171534;font-size:11px;font-weight:800;padding:5px 11px;border-radius:999px}
#booking .bk-photo .tag .livedot{width:7px;height:7px;border-radius:50%;background:#15b364;box-shadow:0 0 0 3px rgba(21,179,100,.25)}
@media(max-width:920px){#booking .bk-photo{position:relative;left:0;bottom:0;transform:none;width:100%;height:190px;margin-top:20px}}

/* ── 3-column booking section: text │ image │ card ──
   The image (middle) is the same height as the card and its right edge tucks
   UNDER the card's left edge (card z-index above), so it reads as emerging
   out of the booking card. Feathered on the card-facing edge + pink halo. */
#booking .bk-top3{display:grid;grid-template-columns:minmax(0,0.92fr) auto minmax(0,1.04fr);gap:20px;align-items:center}
#booking .bk-top3 .bk-screen{position:relative;z-index:1}
#booking .bk-photo2{position:relative;z-index:2;align-self:center;width:300px;margin-right:-34px;transform:rotate(-3deg)}
/* funnel of light — soft glow hugging the seam where the photo dissolves into the card */
#booking .bk-photo2 .funnel{position:absolute;top:-6%;bottom:-6%;left:46%;right:-14px;z-index:-1;mix-blend-mode:screen;overflow:visible;pointer-events:none}
#booking .bk-photo2 .pic{position:relative;aspect-ratio:3/4;border-radius:20px;overflow:hidden;border:1px solid rgba(255,255,255,.16);
  -webkit-mask-image:linear-gradient(96deg,#000 50%,transparent 97%);mask-image:linear-gradient(96deg,#000 50%,transparent 97%);
  box-shadow:0 36px 66px -22px rgba(16,35,86,.22),0 4px 14px rgba(0,0,0,.4)}
#booking .bk-photo2 .pic img{display:block;width:100%;height:100%;object-fit:cover}
#booking .bk-photo2 .pic .dua{position:absolute;inset:0;background:linear-gradient(to top,rgba(6,9,22,.6),transparent 40%)}
#booking .bk-photo2 .tag{position:absolute;left:14px;bottom:14px;z-index:3;display:inline-flex;align-items:center;gap:6px;background:rgba(6,9,22,.72);border:1px solid rgba(255,255,255,.18);color:#171534;font-size:11.5px;font-weight:800;padding:6px 12px;border-radius:999px}
#booking .bk-photo2 .tag .livedot{width:7px;height:7px;border-radius:50%;background:#15b364;box-shadow:0 0 0 3px rgba(21,179,100,.25)}
@media(max-width:920px){#booking .bk-top3{grid-template-columns:1fr;gap:20px}#booking .bk-photo2{margin-right:0;transform:none;order:3;min-height:200px}#booking .bk-photo2 .pic{-webkit-mask-image:none;mask-image:none;min-height:200px}}

/* ── Company booking: text | image | card (equal columns). Images are VARIED
   sizes, spread out, edge-faded (gradient dissolve), with a funnel of light
   drawn from each image to its exact row by the draw() script. ── */
#booking .bk-top-co{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px;align-items:stretch;position:relative}
#booking .bk-top-co>div:first-child{align-self:center}
#booking .bk-costage{display:contents}
#booking .bk-costage .bk-screen{min-width:0}
#booking .bk-funnels{position:absolute;inset:0;width:100%;height:100%;z-index:2;mix-blend-mode:screen;pointer-events:none;overflow:visible}
#booking .bk-filmstrip{position:relative;min-width:0}
#booking .bk-ph{position:absolute;z-index:3}
#booking .bk-ph .pic{position:relative;width:100%;aspect-ratio:1600/1066;border-radius:15px;overflow:hidden;border:1px solid rgba(255,255,255,.14);box-shadow:0 24px 46px -18px rgba(16,35,86,.22);
  -webkit-mask-image:radial-gradient(130% 128% at 30% 46%,#000 58%,transparent 92%);mask-image:radial-gradient(130% 128% at 30% 46%,#000 58%,transparent 92%)}
#booking .bk-ph.p1 .pic{aspect-ratio:1600/895}
#booking .bk-ph.p2 .pic,#booking .bk-ph.p3 .pic{aspect-ratio:1600/1066}
#booking .bk-ph .pic img{display:block;width:100%;height:100%;object-fit:cover}
#booking .bk-ph .pic .dua{position:absolute;inset:0;background:linear-gradient(to top,rgba(6,9,22,.5),transparent 46%)}
#booking .bk-ph .tag{position:absolute;left:11px;bottom:10px;z-index:3;display:inline-flex;align-items:center;gap:5px;background:rgba(6,9,22,.74);border:1px solid rgba(255,255,255,.18);color:#171534;font-size:10px;font-weight:800;padding:4px 9px;border-radius:999px}
/* varied sizes + spread positions (top set as % of the image column) */
#booking .bk-ph.p1{width:66%;left:2%;top:1%}
#booking .bk-ph.p2{width:57%;left:30%;top:36%}
#booking .bk-ph.p3{width:50%;left:8%;top:69%}
@media(max-width:920px){#booking .bk-top-co{grid-template-columns:1fr;gap:16px}#booking .bk-funnels{display:none}#booking .bk-filmstrip{display:grid;gap:12px;min-height:0}#booking .bk-ph{position:relative!important;left:0!important;top:0!important;width:100%!important}#booking .bk-ph .pic{-webkit-mask-image:none;mask-image:none}}


/* ── Franchise #netsites: site photos funnel into a live network league ── */
#netsites .ns-top{display:grid;grid-template-columns:1fr 1fr;gap:26px;align-items:stretch;position:relative;margin-top:26px}
#netsites .ns-funnels{position:absolute;inset:0;width:100%;height:100%;z-index:2;mix-blend-mode:screen;pointer-events:none;overflow:visible}
#netsites .ns-film{position:relative;min-width:0}
#netsites .ns-ph{position:absolute;z-index:3}
#netsites .ns-ph .pic{position:relative;width:100%;aspect-ratio:1600/1066;border-radius:15px;overflow:hidden;border:1px solid rgba(255,255,255,.14);box-shadow:0 24px 46px -18px rgba(16,35,86,.22);
  -webkit-mask-image:radial-gradient(132% 130% at 32% 46%,#000 58%,transparent 92%);mask-image:radial-gradient(132% 130% at 32% 46%,#000 58%,transparent 92%)}
#netsites .ns-ph.p1 .pic{aspect-ratio:1600/895}
#netsites .ns-ph.p2 .pic{aspect-ratio:1600/1066}
#netsites .ns-ph.p3 .pic{aspect-ratio:1600/1073}
#netsites .ns-ph .pic img{display:block;width:100%;height:100%;object-fit:cover}
#netsites .ns-ph .pic .dua{position:absolute;inset:0;background:linear-gradient(to top,rgba(6,9,22,.5),transparent 46%)}
#netsites .ns-ph .tag{position:absolute;left:11px;bottom:10px;z-index:3;display:inline-flex;align-items:center;gap:5px;background:rgba(6,9,22,.74);border:1px solid rgba(255,255,255,.18);color:#171534;font-size:10.5px;font-weight:800;padding:4px 9px;border-radius:999px}
#netsites .ns-ph.p1{width:64%;left:2%;top:1%}
#netsites .ns-ph.p2{width:57%;left:31%;top:36%}
#netsites .ns-ph.p3{width:50%;left:8%;top:69%}
/* league card */
#netsites .ns-card{position:relative;z-index:1;min-width:0;display:flex}
#netsites .nsc-frame{width:100%;background:#ffffff;border:1px solid rgba(29,58,143,.18);border-radius:18px;overflow:hidden;box-shadow:0 30px 70px -30px rgba(16,35,86,.22)}
#netsites .nsc-bar{display:flex;align-items:center;gap:7px;padding:13px 16px;background:linear-gradient(90deg,rgba(63,107,216,.20),#ffffff);border-bottom:1px solid rgba(29,58,143,.14);font-size:13.5px;color:#171534}
#netsites .nsc-bar b{font-weight:800;margin-left:6px}
#netsites .nsc-dot{width:9px;height:9px;border-radius:50%;background:rgba(255,255,255,.18)}#netsites .nsc-bar .nsc-dot:first-child{background:var(--brand)}
#netsites .nsc-cnt{margin-left:auto;font-size:11px;font-weight:800;background:#eaf0fc;color:#2f6bd8;border-radius:999px;padding:5px 11px}
#netsites .nsc-body{padding:14px;display:flex;flex-direction:column;gap:10px}
#netsites .nsc-row{display:flex;align-items:center;gap:13px;background:#ffffff;border:1px solid #ece6f1;border-radius:13px;padding:12px 14px}
#netsites .nsc-th{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;font-size:20px;flex:none;background:#eaf0fc}
#netsites .nsc-info{flex:1;min-width:0}
#netsites .nsc-info b{display:block;font-size:14px;font-weight:800;color:#171534}
#netsites .nsc-info small{font-size:11.5px;color:#5f5c74}
#netsites .nsc-cap{display:flex;align-items:center;gap:9px;margin-top:7px}
#netsites .nsc-track{flex:1;height:6px;border-radius:999px;background:#ece6f1;overflow:hidden}
#netsites .nsc-track i{display:block;height:100%;background:linear-gradient(90deg,#2f6bd8,#6b9bff);border-radius:999px}
#netsites .nsc-amt{font-size:12px;font-weight:800;color:#4a4763;white-space:nowrap}
#netsites .nsc-pill{font-size:11px;font-weight:800;border-radius:999px;padding:5px 11px;white-space:nowrap;flex:none}
#netsites .nsc-pill.up{background:rgba(21,179,100,.16);color:#15b364}
#netsites .nsc-pill.new{background:rgba(245,185,74,.16);color:#f5b81f}
#netsites .nsc-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;background:linear-gradient(120deg,#eaf0fc,#ffffff);border:1px solid #cdddf7;border-radius:13px;padding:12px 15px}
#netsites .nsc-foot b{font-size:13.5px;color:#171534}#netsites .nsc-foot small{display:block;font-size:11px;color:#5f5c74;font-weight:600}
#netsites .nsc-tot{font-size:17px;color:#5b8af0}
@media(max-width:920px){#netsites .ns-top{grid-template-columns:1fr;gap:16px}#netsites .ns-funnels{display:none}#netsites .ns-film{display:grid;gap:12px;min-height:0}#netsites .ns-ph{position:relative!important;left:0!important;top:0!important;width:100%!important}#netsites .ns-ph .pic{-webkit-mask-image:none;mask-image:none}}


/* ── Franchise territory map ── */
#territory .terr-grid{display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:start;margin-top:14px}
@media(max-width:820px){#territory .terr-grid{grid-template-columns:1fr;gap:26px}}
#territory .terr-list{list-style:none;padding:0;margin:22px 0 0;display:flex;flex-direction:column;gap:13px}
#territory .terr-list li{display:flex;gap:12px;align-items:flex-start;font-size:15px;font-weight:600;color:var(--ink-2)}
#territory .tb-ic{flex:none;width:30px;height:30px;border-radius:9px;background:#eaf0fc;display:grid;place-items:center;font-size:15px}
#territory .terr-panel{position:relative;background:linear-gradient(160deg,#ffffff,#f5f8fd);border:1px solid var(--line);border-radius:22px;padding:20px 20px 16px;box-shadow:0 30px 64px -26px rgba(16,35,86,.22)}
#territory .terr-map{display:block;width:100%;height:auto;max-height:440px}
#territory .terr-legend{display:flex;gap:16px;flex-wrap:wrap;justify-content:center;margin-top:6px;font-size:11.5px;font-weight:700;color:#5f5c74}
#territory .terr-legend span{display:inline-flex;align-items:center;gap:6px}
#territory .terr-legend i{width:11px;height:11px;border-radius:3px;display:inline-block}
#territory .terr-legend i.dash{border:1.6px dashed #2f6bd8;background:transparent}

/* orbit core: laptop dashboard instead of the app-icon */
.orbit-hub .mark.laptop{width:auto;height:auto;border-radius:0;background:none;box-shadow:none;animation:hubpulse 5s ease-in-out infinite}
.orbit-hub .mark.laptop svg{width:230px;height:auto;filter:drop-shadow(0 34px 60px rgba(16,35,86,.22))}
.orbit-hub .halo{top:52px;width:280px;height:260px}
@media(max-width:640px){.orbit-hub .mark.laptop svg{width:180px}}

/* #who personas -> one panel: legible mini-screen | seam | photo, big title */
#who .personas{margin-top:30px}
#who .psplit{display:grid;grid-template-columns:1.32fr .68fr;gap:32px;align-items:center;max-width:1140px;margin:0 auto 58px}
#who .psplit.rev{grid-template-columns:.68fr 1.32fr}
#who .psplit:last-child{margin-bottom:0}
#who .psplit.rev .pvis{order:2}
#who .pvis{position:relative}
#who .ppanel{position:relative;display:grid;grid-template-columns:1fr 1fr;column-gap:22px;align-items:stretch;background:#ffffff;border:1px solid var(--line);border-radius:20px;overflow:hidden;box-shadow:0 34px 70px -32px rgba(16,35,86,.22)}
#who .ppmock{display:flex;align-items:center;padding:20px 6px 20px 22px;min-width:0}
#who .ppphoto{position:relative;margin:0;overflow:hidden;min-height:100%}
#who .ppphoto img{width:100%;height:100%;object-fit:cover;display:block}
#who .ppphoto::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#ffffff 0,rgba(255,255,255,0) 24%),radial-gradient(120% 90% at 100% 0,rgba(47,107,216,.20),transparent 52%)}
#who .ppseam{position:absolute;top:9%;bottom:9%;left:50%;transform:translateX(-50%);width:2px;z-index:2;background:linear-gradient(180deg,rgba(107,155,255,0),#6b9bff,#1d3a8f,rgba(47,107,216,0));box-shadow:0 0 26px 7px rgba(47,107,216,.38)}
#who .mini{width:100%;display:flex;flex-direction:column;gap:11px}
#who .mbar{display:flex;align-items:center;gap:6px;margin-bottom:2px}
#who .mbar .md{width:8px;height:8px;border-radius:50%;background:#cdddf7;flex:none}#who .mbar .md:first-child{background:#1d3a8f}
#who .mbar b{margin-left:5px;font-size:14px;font-weight:800;color:#171534}
#who .mbar .mlive{margin-left:auto;font-size:11px;font-weight:800;color:#15b364;background:rgba(21,179,100,.15);border-radius:999px;padding:4px 10px}
#who .mrow{display:flex;align-items:center;gap:12px;background:#f5f8fd;border:1px solid #ece6f1;border-radius:13px;padding:12px 14px}
#who .mrow .mic{width:38px;height:38px;border-radius:11px;background:#eaf0fc;display:grid;place-items:center;font-size:19px;flex:none}
#who .mrow .mtx{min-width:0}#who .mrow .mtx b{display:block;font-size:15.5px;font-weight:800;color:#171534;line-height:1.15}
#who .mrow .mtx small{font-size:12px;color:#5f5c74}
#who .mrow .mpay{margin-left:auto;font-size:15px;font-weight:800;color:#4a4763;white-space:nowrap}#who .mrow .mpay.up{color:#15b364}
#who .mmeta{font-size:12.5px;font-weight:700;color:#5f5c74;padding-left:2px}
#who .mstat small{font-size:12px;font-weight:700;color:#5f5c74}#who .mstat .mbig{display:block;font-size:32px;font-weight:800;color:#171534;letter-spacing:-.01em;margin-top:2px}
#who .mbars{display:flex;align-items:flex-end;gap:8px;height:60px}#who .mbars i{flex:1;border-radius:6px 6px 3px 3px;background:linear-gradient(180deg,#6b9bff,#2f6bd8)}#who .mbars i:last-child{background:linear-gradient(180deg,#5b8af0,#1d3a8f)}
#who .mkpis{display:flex;gap:22px}#who .mkpis span{font-size:13px;color:#5f5c74}#who .mkpis b{font-size:19px;font-weight:800;color:#171534}
#who .mfoot{display:flex;align-items:center;justify-content:space-between;gap:10px;background:linear-gradient(120deg,#eaf0fc,#ffffff);border:1px solid #cdddf7;border-radius:13px;padding:12px 15px}
#who .mfoot small{font-size:12px;color:#5f5c74;font-weight:700}#who .mfoot b{font-size:19px;font-weight:800;color:#5b8af0}
#who .ptxt .k{font-family:var(--ff-display);font-size:clamp(30px,3.4vw,46px);font-weight:800;letter-spacing:-.015em;text-transform:none;line-height:1.02;color:var(--indigo)}
#who .psplit:nth-child(2) .ptxt .k{color:var(--brand)}
#who .psplit:nth-child(3) .ptxt .k{color:#2f6bd8}
#who .ptxt h3{font-size:clamp(16px,1.7vw,20px);font-weight:800;color:var(--ink);margin-top:8px}
#who .ptxt p{font-size:15.5px;color:var(--ink-2);margin-top:12px;max-width:44ch;line-height:1.55}
#who .ptxt .tagr{margin-top:15px;font-size:12.5px;font-weight:800;color:var(--ink-3)}
#who .ptxt .plink{display:inline-block;margin-top:18px;font-size:14px;font-weight:800;color:var(--brand);text-decoration:none}
#who .ptxt .plink:hover{text-decoration:underline}
@media(max-width:860px){#who .psplit,#who .psplit.rev{grid-template-columns:1fr;gap:22px;margin-bottom:44px}#who .psplit.rev .pvis{order:0}}
@media(max-width:520px){#who .ppanel{grid-template-columns:1fr}#who .ppphoto{min-height:150px}#who .ppseam{display:none}#who .ppphoto::after{background:radial-gradient(120% 90% at 100% 0,rgba(47,107,216,.2),transparent 52%)}}

/* ═══════════════════════════════════════════════════════════════════════════
   V2 CHROME — matches the portal exactly.
   The portal keeps a light canvas and puts the navy→blue gradient (plus an
   18px white dot grid) only on its chrome: the sidebar and every title card.
   These are this site's equivalents — nav, hero, the dark feature bands and
   the footer — so the two read as one product.
   ═══════════════════════════════════════════════════════════════════════════ */
.wrap header.nav{
  background:var(--hero-grad);
  border-bottom:1px solid rgba(255,255,255,.14);
  backdrop-filter:none;
}
.wrap header.nav .brand,
.wrap header.nav .nav-links a{color:#fff}
.wrap header.nav .brand .os{color:var(--gold)}
.wrap header.nav .nav-links a:hover{color:var(--gold)}
.wrap header.nav .tbc{color:rgba(255,255,255,.75);border-color:rgba(255,255,255,.35)}

.wrap .hero,
.wrap .hero.dark,
.wrap .gband,
.wrap footer.foot{
  background-image:var(--dots), var(--hero-grad);
  background-size:18px 18px, cover;
  background-repeat:repeat, no-repeat;
  color:#fff;
}
.wrap .hero :where(h1,h2,h3),
.wrap .hero.dark :where(h1,h2,h3),
.wrap .gband :where(h1,h2,h3),
.wrap footer.foot :where(h1,h2,h3,strong,b){color:#fff}
.wrap .hero .sub,
.wrap .gband .sub,
.wrap footer.foot{color:rgba(255,255,255,.85)}
.wrap .hero .eyebrow,
.wrap .gband .eyebrow{color:var(--gold)}

/* Cards sitting ON the blue bands stay white, like the portal's stat tiles. */
.wrap .hero .dash,
.wrap .gband .dash,
.wrap .gband .pf-app{
  background:#fff !important;
  border:1px solid rgba(255,255,255,.30) !important;
  box-shadow:0 24px 60px -30px rgba(9,20,54,.55) !important;
  color:var(--ink);
}

/* The primary action is the portal's gold button. */
.wrap .btn-pink{background:var(--cta);color:var(--cta-ink);box-shadow:0 12px 26px -12px var(--cta)}
.wrap .btn-pink:hover{background:#e0a500;color:var(--cta-ink)}
.wrap .btn-light{background:#fff;color:var(--navy)}

/* ── v2 contrast pass ───────────────────────────────────────────────────────
   Everything below sits ON the blue chrome, so it takes chrome ink (white /
   gold). The site was authored dark, so these had been tuned for a dark
   ground and inverted into invisibility once the canvas went light. */
.wrap header.nav .navtab,
.wrap header.nav .navdrop-btn,
.wrap header.nav .navdrop > a{color:#fff}
.wrap header.nav .navtab.navactive{color:var(--gold)}
.wrap header.nav .navtab:hover,
.wrap header.nav .navdrop-btn:hover{color:var(--gold)}
/* The mega-menu is a white popover on the light canvas — it keeps page ink. */
.wrap header.nav .navmega-menu,
.wrap header.nav .navdrop-menu{color:var(--ink)}
.wrap header.nav .navmega-menu a,
.wrap header.nav .navdrop-menu a{color:var(--ink)}

/* Hero headline: the emphasis word was brand-coloured, which is now navy and
   therefore invisible on navy. Gold is the portal's accent on its chrome. */
.wrap .hero.dark h1.head{color:#fff}
.wrap .hero.dark h1.head em{color:var(--gold);font-style:normal}

/* The ::before glow multiplied two navy radials over the band and muddied it.
   The portal lays its glow at low opacity over a flat ground — same here. */
.wrap .hero.dark::before{opacity:.20}

/* Numbers inside the white dashboard card: white-on-white after the flip. */
.wrap .dash .n{color:var(--ink)}
.wrap .dash .n.accent,
.wrap .dash .n[style*="8fa9fb"]{color:var(--indigo)}
.wrap .dash{color:var(--ink)}
.wrap .dash :where(h1,h2,h3,h4,b,strong){color:var(--ink)}

/* ── v2 pass 3 ──────────────────────────────────────────────────────────────
   The portal's band is ~120px tall, so its 120deg sweep reaches #3f78d8 almost
   at once and reads as bright blue. Over a 700px hero the same sweep parks you
   in the #16306e end and the page reads near-black. Same three portal blues,
   restacked so a tall band shows the range the portal actually shows. */
.wrap .hero.dark,
.wrap .gband{
  background-image:var(--dots),
    linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%);
}
/* Sign in sat at page-ink on the blue nav. */
.wrap header.nav .signin{color:#fff}
.wrap header.nav .signin:hover{color:var(--gold)}
/* Card numerals: the site's own .dash rules are more specific than the chrome
   block, so these need to win outright. */
.wrap .dash .n,
.wrap .hero .dash .n,
.wrap .gband .dash .n{color:var(--ink) !important}
.wrap .dash .n.up,
.wrap .dash .n.accent{color:var(--indigo) !important}

/* ── v2 pass 4: the product mock ────────────────────────────────────────────
   It read as a rainbow — periwinkle/teal/amber bars with matching saturated
   rank badges, over a pale line with a hot-pink point. Portals rank things in
   ONE scale and reserve hue changes for genuinely different series, which is
   the whole difference between "dashboard" and "clip art". */

/* Every mock card is a white surface, so all of its text takes page ink.
   Several headings and the entire "Revenue by activity" list were white-on-
   white and simply not rendering. */
.wrap .dash,
.wrap .dash *{color:var(--ink)}
.wrap .dash .sub,
.wrap .dash .cap,
.wrap .dash small{color:var(--ink-3)}

/* Ranked bars: one blue scale, darkest = biggest. */
.wrap .dash .rev-bar{background:#eef1f8}

/* Rank badges: a quiet tint, not three traffic lights. */
.wrap .dash .rk{
  background:#eaf0fc !important;
  color:#1d3a8f !important;
  font-weight:700;
  box-shadow:inset 0 0 0 1px #cdddf7;
}

/* Ranked bars carry an inline background per row, so the scale has to win
   outright. Darkest = biggest: one scale, not three competing hues. */
.wrap .dash .rev-bar{background:#eef1f8}

/* Ghost button on the blue band, hover state. */
.wrap .hero.dark .btn-ghost:hover{border-color:#fff;color:var(--gold)}

/* Persona mock rows: light panels on the white card, with a hairline so they
   still read as rows now that the fill is no longer dark navy. */
.wrap #who .mrow{border:1px solid #ece6f1;box-shadow:none}
.wrap #who .mrow .mtx b{color:var(--ink)}
.wrap #who .mic{box-shadow:inset 0 0 0 1px #cdddf7}

/* ── v2 pass 5: light-canvas ink corrections ────────────────────────────────
   Found by auditing computed contrast across all 15 pages. Every one of these
   is the same story: the rule set white (or near-white) text because in v1 the
   surface beneath it was dark navy. The surface is light now, so the ink is. */

/* Feature cards — headings were white on a white card (50 across 9 pages). */
.wrap .fcard h3{color:var(--ink)}
.wrap .fcard .fic{color:var(--brand)}
.wrap .nsc-th{color:var(--ink)}

/* The product-frame chrome (.pf-bar) is a light toolbar now. */
.wrap .pf-bar .t{color:var(--ink)}
.wrap .pf-bar .s{color:var(--ink-3)}
.wrap .pf-bar span,
.wrap .pf-bar .per span{color:var(--ink-2)}
.wrap .pf-k .n{color:var(--ink)}
.wrap .pf-k .l{color:var(--ink-3)}

/* Carousel slides sit on white. */
.wrap .slide-in h3{color:var(--ink)}
.wrap .slide-in p{color:var(--ink-2)}

/* Accents that were legible on navy but wash out on white. */
.wrap .stars{color:#e0a500}
.wrap .mlive{color:#0b6b4f;background:rgba(21,179,100,.12)}
.wrap .soon{color:#0e7a75}
.wrap .bk-pill.wait{background:#fdf3d8;color:var(--ink-2)}
.wrap .rd-pill.on{color:#0e7a75}

/* ── v2 pass 6 ──────────────────────────────────────────────────────────────
   Photo captions are the ONE place a dark surface is still correct: a scrim
   over a photograph. They keep the scrim and take white text — the light-canvas
   sweep had turned them to page ink, which is invisible on the scrim. */
.wrap #booking .tag,
.wrap #netsites .tag,
.wrap .bk-photo .tag,
.wrap .bk-photo2 .tag,
.wrap .bk-ph .tag,
.wrap .ns-ph .tag{color:#fff}

/* Floating hero chip is a light pill now. */
.wrap .ochip{color:var(--ink);border:1px solid rgba(255,255,255,.55);box-shadow:0 18px 48px -18px rgba(9,20,54,.45)}
.wrap .ochip .e{color:var(--ink)}

/* Stragglers the audit turned up. */
.wrap .pf-bar .s,
.wrap .pf-bar div.s{color:var(--ink-3) !important}
.wrap .pf-tg b.on-bl{color:#fff}
.wrap #calc .calc-out .num{color:var(--ink)}
.wrap .fcard b,
.wrap .mini b,
.wrap .mbar b{color:var(--ink)}

/* ── hero chips: two groups ─────────────────────────────────────────────────
   They answer different questions — WHAT you run vs WHAT SHAPE your business
   is — so they read as two sets. White pills for activities (unchanged), and
   a gold-outlined set for the business types, split by a divider. Gold is the
   portal's accent on its blue chrome, so both sets stay on-palette. */
.wrap .chip-sep{width:1px;align-self:stretch;margin:2px 6px;background:rgba(255,255,255,.35);border-radius:1px}
.wrap .hero.dark .chip.chip-biz,
.wrap .gband .chip.chip-biz{
  background:rgba(245,184,31,.14);
  border-color:rgba(245,184,31,.75);
  color:var(--gold);
}
@media(max-width:640px){.wrap .chip-sep{display:none}}

/* The laptop is a light device on a light canvas now, so it needs a soft navy
   shadow rather than the near-black drop it had against the v1 dark page. */
.wrap .orbit-hub .mark.laptop svg{filter:drop-shadow(0 26px 46px rgba(16,35,86,.22))}

/* ── v2 pass 7: text on the blue chrome bands ───────────────────────────────
   #money and #tfc are chrome. Everything in them that is NOT inside one of the
   white product cards takes chrome ink. The card overrides come after, so the
   cascade puts page ink back where the surface is white. */
.wrap .gband > .shell > p,
.wrap .gband > .shell > .sec-head p,
.wrap .gband > .shell > .sub,
.wrap .gband > .shell > .lede,
.wrap .gband .pf-cap,
.wrap .gband .pf-cap b{color:rgba(255,255,255,.88)}
.wrap .gband p b,
.wrap .gband li b,
.wrap .gband li strong{color:#fff}
.wrap .gband li span{color:var(--gold)}          /* the ✓ ticks */
.wrap .gband .sec-head p{color:rgba(255,255,255,.88)}

/* White cards sitting ON the chrome keep page ink — this must win over the above. */
.wrap .gband :is(.pf-app,.dash,.dash-card,.pf-card,.pf-k,.stat,.pf-bar,.bk-frame,.nsc-frame,.slide-in) :is(p,li,b,strong,span){color:var(--ink)}
.wrap .gband :is(.pf-app,.dash,.bk-frame,.nsc-frame) :is(.s,.sub,small,.cap){color:var(--ink-3)}
/* Pills on the chrome read as light chips, not blue-on-blue. */
.wrap .gband .chip{background:#ffffff;border-color:rgba(255,255,255,.6);color:var(--brand)}

/* Chrome bands need their own top air — both were padding-top:0. */
.wrap #money,
.wrap #tfc{padding-top:64px}

/* ── logo wall ──────────────────────────────────────────────────────────────
   Boxed white pills on a white-ish canvas read as clip art. A logo wall works
   when the logos sit directly on the page and are visually levelled, so no one
   brand shouts louder than another. */
.wrap #trusted .trusted-lead{color:var(--ink-2);letter-spacing:.14em}
.wrap #trusted .logo-slot{background:transparent;border:0;box-shadow:none;border-radius:0}
.wrap #trusted .logo-slot img{
  max-height:34px;width:auto;
  filter:grayscale(1) contrast(.9) opacity(.62);
  transition:filter .2s ease;
}
.wrap #trusted .logo-slot:hover img{filter:none}
@media (prefers-reduced-motion: reduce){
  .wrap #trusted .logo-slot img{transition:none}
}


/* ═══════════════════════════════════════════════════════════════════════
   AGENT PASS — 36 patches verified by independent adversarial review.
   Appended in specialist order; later rules intentionally win.
   ═══════════════════════════════════════════════════════════════════════ */

/* [0] hero: The primary CTA becomes the portal's gold, in the hero and the nav. It is now the only f */
/* ── fold: the primary action is the portal's gold ────────────────────────
   .btn-primary is --indigo #2f6bd8, which on the blue chrome is blue-on-blue.
   --cta/--cta-ink were declared but only ever reached .btn-pink, which is not
   used on this page. Scoped to the fold so other bands keep their own CTA. */
.wrap .hero.dark .hero-cta .btn-primary,
.wrap header.nav .nav-cta .btn-primary{
  background:var(--cta);
  color:var(--cta-ink);
  box-shadow:0 14px 30px -16px rgba(240,177,0,.70);
}
.wrap .hero.dark .hero-cta .btn-primary:hover,
.wrap header.nav .nav-cta .btn-primary:hover{
  background:#e0a500;
  color:var(--cta-ink);
}
/* Secondary drops back so the gold owns the eye. */
.wrap .hero.dark .hero-cta .btn-ghost{
  background:rgba(255,255,255,.06);
  border-color:rgba(255,255,255,.34);
  color:#fff;
}
/* Restore the gold hover from line 996, which this block would otherwise
   outrank (equal specificity, appended later). */
.wrap .hero.dark .hero-cta .btn-ghost:hover{
  border-color:#fff;
  color:var(--gold);
}

/* [1] hero: Nav and hero become one continuous chrome surface — same gradient, same dot grid, no hai */
/* ── fold: nav and hero are ONE surface ───────────────────────────────────
   The nav still used the original --hero-grad (#16306e @0, midpoint 58%) with
   no dot grid, while css:948 restacked the hero to #1d3a8f @0 / 45% WITH dots.
   Two ramps meeting at a hairline = a visible seam across the top of the page. */
.wrap header.nav{
  background-image:var(--dots),
    linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%);
  background-size:18px 18px, cover;
  background-repeat:repeat, no-repeat;
  border-bottom:0;
}

/* [2] hero: Give the headline and the sub-paragraph a real gap, and pull the sub from six lines to f */
/* ── fold: headline → sub relationship ────────────────────────────────────
   .sub{margin-top:20px} (0,1,0) loses to .wrap p{margin:0} (0,1,1), so the
   computed gap was 0px and the two blocks touched. 40ch also forced 6 lines.
   The hero is blue chrome, so the ink stays white at the file's usual .85. */
.wrap .hero h1.head{line-height:1.02;letter-spacing:-.03em}
.wrap .hero .sub{
  margin-top:22px;
  max-width:47ch;
  line-height:1.5;
  color:rgba(255,255,255,.85);
}
.wrap .hero .sub b{color:#fff;font-weight:800}

/* [3] hero: Re-space the supporting stack so the fold breathes: more air before the CTAs, less betwe */
/* ── fold: vertical rhythm ────────────────────────────────────────────────
   Was near-uniform (26 / 18 / 24), so CTA + trust + chips read as one pile.
   Air BEFORE the action, trust and chips grouped tight beneath it.
   Text stays white — this band is the blue chrome. */
.wrap .hero .hero-cta{margin-top:34px;gap:14px}
.wrap .hero .trust{margin-top:24px;gap:8px 14px;font-size:13.5px;color:rgba(255,255,255,.85)}
.wrap .hero .trust b{color:#fff;margin-left:3px}
.wrap .hero .chips{margin-top:18px;gap:7px}
.wrap .hero{padding-bottom:56px}

/* [4] hero: Activity chips become glass on the chrome; business chips keep gold but as ink only, not */
/* ── fold: chip groups ────────────────────────────────────────────────────
   Solid-white activity pills fought the white dashboard card for attention,
   and once the CTA is gold a FILLED gold business pill fights the button.
   New rule: gold fill = the action; gold ink = a category. */
.wrap .hero.dark .chip.chip-act{
  background:rgba(255,255,255,.10);
  border-color:rgba(255,255,255,.26);
  color:#fff;
}
.wrap .hero.dark .chip.chip-biz{
  background:transparent;
  border-color:rgba(255,255,255,.26);
  color:var(--gold);
}

/* [5] hero: Demote the hero eyebrow from gold to white, so gold means only two things above the fold */
/* ── fold: reclaim gold ───────────────────────────────────────────────────
   css:895 golds the hero eyebrow. With a gold CTA, gold brand mark, gold
   nav-active tab and the gold promise word, that is five golds above the
   fold. Gold now means exactly two things: the promise, and the action. */
.wrap .hero.dark .eyebrow{color:rgba(255,255,255,.78);letter-spacing:.18em}

/* [6] hero: The nav's active state stops eating the gold: 'Home' goes white with a gold underline, a */
/* ── fold: nav ────────────────────────────────────────────────────────────
   .navactive{color:var(--gold)!important} (css:347) spends the accent on a nav
   item sitting beside the gold CTA. !important is required to beat it. */
.wrap header.nav .navtab.navactive{color:#fff !important;position:relative}
.wrap header.nav .navtab.navactive::after{
  content:"";position:absolute;left:0;right:0;bottom:-7px;
  height:2px;border-radius:2px;background:var(--gold);
}
/* The two mega-menu triggers looked like plain links until hovered.
   This also repairs css:482, which put var(--brand) #1d3a8f on the navy chrome. */
.wrap header.nav .navdrop-btn{padding:5px 9px;margin:-5px -9px;border-radius:9px;transition:background .15s}
.wrap header.nav .navdrop:hover .navdrop-btn,
.wrap header.nav .navdrop:focus-within .navdrop-btn,
.wrap header.nav .navdrop-btn:hover{background:rgba(255,255,255,.12);color:#fff}
.wrap header.nav .navdrop-btn .caret{opacity:.62}

/* [8] craft: One navy-tinted elevation ladder replaces 12 ad-hoc shadows, seven of which are dark-the */
/* ── craft: one elevation ladder ────────────────────────────────────────────
   --shadow is declared twice in :root (css:12 portal / css:14 dark) and again
   at css:26-27; the dark one wins — verified: getPropertyValue('--shadow') ===
   '0 20px 46px -24px rgba(18,12,44,.5)'. Re-declared last so the portal value
   sticks in both blocks. Shadows on the light canvas tint navy, never black. */
:root,
:root[data-theme="light"]{
  --shadow:0 8px 26px -8px rgba(16,35,86,.16), 0 2px 6px rgba(16,35,86,.06);
  --e-pop:0 22px 48px -20px rgba(16,35,86,.34), 0 4px 12px rgba(16,35,86,.08);
}
/* Popovers and lifted panels: was rgba(16,35,86,.22)–.78 (dark-build). */
.wrap .flist .tip,
.wrap .navdrop-menu,
.wrap .navmega-menu,
.wrap #who .ppanel,
.wrap .rescard:hover{box-shadow:var(--e-pop)}
/* Marquee label: was 18px 0 30px -6px rgba(8,11,30,.98) — a 98%-opaque black
   bar cast across the white strip. */
.wrap .mq-fixed{box-shadow:14px 0 26px -14px rgba(16,35,86,.30)}

/* [9] craft: Every eyebrow gets the same 12px of air under it instead of jamming against the headline */
/* ── craft: eyebrow → heading, one value ────────────────────────────────────
   .eyebrow (css:36) is inline with no margin. Measured gaps to the heading:
   4.3px (.sec-head ×10, .final), 16.3px (#tfc h2, inline margin-top:12px),
   20.3px (hero, h1.head{margin:16px 0 0} at css:71) — plus 14px/12px inline
   one-offs on the shared platform-*/persona pages. One relationship, many
   values. Set it once and neutralise every compensator (inline → !important). */
.wrap .eyebrow{display:block;line-height:1.35;margin-bottom:12px}
.wrap .eyebrow + h1,
.wrap .eyebrow + h2{margin-top:0 !important}

/* [10] craft: Corner radii collapse from 18 distinct values to five: 8 / 12 / 16 / 20 / 999px. */
/* ── craft: five radii, not eighteen ────────────────────────────────────────
   Live histogram counted 18 distinct non-pill radii (12,14,18,13,11,7,4,20,8,
   22,6,15,16,10,3,9,1,26). Scale: 6 micro · 8 control · 12 tile ·
   16 inner card · 20 top-level card · 999 pill. */
/* 20 — top-level cards. Was: .fcard/.quote/.rescard/.save-banner/.pers 18,
   .calc-out 18, .dash/.proof/.slide-in/.calc/.mock 22, .final 26. */
.wrap .fcard,.wrap .quote,.wrap .rescard,
.wrap .save-banner,.wrap #calc .calc-out,.wrap .pers,
.wrap .dash,.wrap .proof,.wrap .slide-in,.wrap #calc .calc,
.wrap .final,.wrap .mock{border-radius:20px}
/* 16 — cards nested inside a frame. Was: .dc/.dash-card 15, .navdrop-menu 14,
   .cmp-wrap already 16. (.cmp itself is border-collapse, radius is a no-op.) */
.wrap .dc,.wrap .dash-card,.wrap .navdrop-menu,.wrap .cmp-wrap{border-radius:16px}
/* 12 — tiles, rows and small pills. Was: .logo/.av/.mic/.navmega-grid a 11,
   .stat/.attn/.mrow/.mfoot/.ochip 13, .pf-k 14, .pers .perspic 14. */
.wrap .logo,.wrap .quote .av,.wrap .stat,.wrap .attn,
.wrap .pf-k,.wrap .ochip,.wrap .navmega-grid a,
.wrap .pers .perspic,.wrap .logo-slot,
.wrap #who .mrow,.wrap #who .mfoot,.wrap #who .mic{border-radius:12px}
/* 8/6 — controls. Was: .pf-tg 9, .pf-tg b 7, .navdrop-menu a 10. */
.wrap .pf-tg,.wrap .navdrop-menu a{border-radius:8px}
.wrap .pf-tg b{border-radius:6px}

/* [11] craft: One hairline vocabulary: structural borders are --line, brand-tinted borders are --brand */
/* ── craft: one hairline vocabulary ─────────────────────────────────────────
   Two verified dark-build leftovers only.
   #featCar .pf-k (css:341) still carries the dark build's #243156 — a hard
   navy outline on 18 pale tiles across six slides.
   .wrap .ochip (css:1045) borders in rgba(255,255,255,.55), invisible on the
   LIGHT #orbit band (css:611 sets no background) — 12 pills with no edge. */
.wrap #featCar .pf-k{border:1px solid var(--line) !important}
.wrap .ochip{border-color:#cdddf7}                   /* was rgba(255,255,255,.55) */

/* [12] craft: Card padding lands on a 12 / 16 / 24 / 32 scale instead of nine arbitrary values. */
/* ── craft: card padding on a scale ─────────────────────────────────────────
   Live paddings were 12,13,16,20,22,24,26,28,36,56. Scale:
   12 tile · 16 inner · 24 card · 32 feature panel. */
/* 24 — cards. Was: .fcard/.quote/.rescard 22, .calc-out 26,
   .proof 26/22, .save-banner 22/26 (the same pair, transposed). */
.wrap .fcard,.wrap .quote,.wrap .rescard,
.wrap #calc .calc-out,.wrap .proof,.wrap .save-banner{padding:24px}
/* 32 — the two big feature panels. Was: .slide-in 28, .calc 26 → 36 @860. */
.wrap .slide-in,.wrap #calc .calc{padding:32px}
.wrap .final{padding:56px 32px}                       /* was 56px 26px */
/* 12/16 — the hero mock frame and its tiles. Was .dash 13, .dc 13/14,
   .dash-card 13; the 23px numeral sat 13px off the edge. */
.wrap .dash{padding:12px}
.wrap .dc,.wrap .dash-card{padding:16px}

/* [13] craft: Heading ranks collapse: h3 stops rendering at four different sizes and #tfc's undersized */
/* ── craft: collapse the heading ranks ──────────────────────────────────────
   Verified: h3 = 16px (.rescard, css:669), 18px (.fcard, css:126),
   19px (#how .step-c, css:555), clamp(16-20px) (#who .ptxt, css:852).
   h2 = clamp(28px,3.6vw,41px) via .sec-head h2 (css:114) everywhere except
   #tfc, whose inline clamp(26px,3.4vw,38px) at html:247 makes it the one
   undersized headline. In #who the h3 sits under a much larger persona word —
   hierarchy inverted. Two ranks: ~20px section-sub, 18px card.
   #features is untouched: it uses .slide h3 (css:287), a slide headline.
   .fcard h3 is untouched: css:126 already sets 18px. */
.wrap #tfc h2{font-size:clamp(28px,3.6vw,41px) !important}
.wrap #who .ptxt h3{font-size:clamp(18px,1.7vw,20px)}
.wrap #how .step-c h3{font-size:20px}
.wrap .rescard h3{font-size:18px}

/* [14] mock: The #money "Revenue vs collected" chart gains a readable series split, so the legend sto */
/* ── v2 pass 7: the finance chart had a legend that lied ────────────────────
   `.pf-leg i` swatches and every bar were background:#2f6bd8, so "Invoiced"
   and "Collected" were the same colour and the legend was decoration. One
   hue, two steps: brand-line = invoiced, brand-2 = collected. Inline styles,
   so the scale has to win outright. */
#money .pf-col > div > i:first-child{background:#cdddf7 !important}
#money .pf-col > div > i:last-child{background:#2f6bd8 !important}
#money .pf-leg span:first-child i{background:#cdddf7 !important}
#money .pf-leg span:last-child i{background:#2f6bd8 !important}

/* [15] mock: All eight product frames get the portal's real elevation ladder — #f5f8fd body, #ffffff  */
/* ── v2 pass 7: one elevation ladder for every product frame ────────────────
   The portal is a #f5f8fd canvas carrying #ffffff cards on #ece6f1 hairlines.
   The frames had a transparent body over a white app (white on white), and
   #featCar .pf-k still wore the dark build's #243156 border. */
.wrap .gband .pf-app .pf-body,
.wrap #featCar .pf-app .pf-body{background:#f5f8fd !important}
.wrap #featCar .pf-bar{background:#ffffff !important;border-bottom:1px solid #ece6f1 !important}
.wrap #featCar .pf-k{background:#ffffff !important;border:1px solid #ece6f1 !important}
/* the hairline-separated rows under each KPI strip become a real card */
.wrap #featCar .pf-body > div:last-child{background:#ffffff;border:1px solid #ece6f1;border-radius:14px;padding:0 13px}
.wrap #featCar .pf-body > div:last-child > div:first-child{border-top:0 !important}
/* #tfc's "Payment reconciled" row has no fill of its own — give it the card surface */
.wrap #tfc .pf-body > div:nth-child(2){background:#ffffff}

/* [16] mock: Removes the hot-pink logo tile from all eight product frames, plus the two dormant magen */
/* ── v2 pass 7: magenta still shipping inside the mocks ─────────────────────
   .pf-bar .mk was linear-gradient(150deg,#ee1f63,#2f6bd8) — v1's hot pink in
   the toolbar of every product frame; the toolbar is white/#f5f8fd now.
   .pf .n span (#ff6f9d) paints the proof strip's "0%", where the sibling
   item already hardcodes #f5b81f. */
.wrap .pf-bar .mk{background:linear-gradient(150deg,#1d3a8f,#2f6bd8) !important}
.wrap .proof .pf .n span{color:var(--gold)}

/* [17] mock: Restores meaning to the finance frame's trend chips and un-greys the Outstanding list. */
/* ── v2 pass 7: trend + attention semantics ─────────────────────────────────
   css:325 flattened every .tr to #5f5c74 !important, so ▲14% and ▼4% read
   identically; .pf .down was #c0392b, a brick red that is not --red #e21d27.
   #0b6b4f / #b3151d are --ok and --red darkened for 10px bold on white
   (2.6:1 and 4.3:1 at full strength); #0b6b4f is already the file's own
   precedent for this at css:1028. css:327 forced the Outstanding rows to
   #5f5c74 = 2.8:1 on a white card. */
.wrap .gband .pf-k .tr.up,
.wrap .pf-k .tr.up{color:#0b6b4f !important}
.wrap .gband .pf-k .tr.down,
.wrap .pf-k .tr.down{color:#b3151d !important}
.wrap .gband .pf-attn .r{color:var(--ink-2) !important}
.wrap .pf-attn .r{font-variant-numeric:tabular-nums}
#money .pf-attn [style*="#c0392b"]{background:#e21d27 !important}

/* [18] mock: Relights the orbit laptop so it shows the light portal instead of a half-dark screen wit */
/* ── v2 pass 7: the orbit laptop was half dark, half light ──────────────────
   Its three stat tiles are already #f5f8fd/#171534 while the screen behind
   them is #0a0f2b — which also made the "ActivityLane" wordmark (fill #171534)
   invisible. The secondary sparkline still used the #lpink gradient (#FF5C8A).
   CSS beats the SVG presentation attributes, so no markup change is needed.
   The outer bezel (url(#lscr)) stays dark — that's the laptop chassis. */
.wrap .orbit-hub .mark.laptop svg [fill="#0a0f2b"],
.wrap .orbit-hub .mark.laptop svg [fill="#0e1734"]{fill:#ffffff}
.wrap .orbit-hub .mark.laptop svg [stroke="#20294f"],
.wrap .orbit-hub .mark.laptop svg [stroke="#232f57"],
.wrap .orbit-hub .mark.laptop svg [stroke="#1b2547"]{stroke:#ece6f1}
.wrap .orbit-hub .mark.laptop svg [stroke="url(#lpink)"]{stroke:#cdddf7}
.wrap .orbit-hub .mark.laptop svg tspan[fill="#5b8af0"]{fill:#2f6bd8}
.wrap .orbit-hub .mark.laptop svg [fill="#cfe0ff"]{fill:#2f6bd8}
.wrap .orbit-hub .mark.laptop svg path[fill="#14b8a6"]{fill:#15b364}
.wrap .orbit-hub .mark.laptop svg [fill="rgba(52,211,193,.16)"]{fill:#e7f8ee}
.wrap .orbit-hub .mark.laptop svg text[fill="#14b8a6"]{fill:#0b6b4f}
/* a 60%-black drop shadow is a dark-build leftover on a #f5f8fd band */
.wrap .orbit-hub .mark.laptop svg{filter:drop-shadow(0 26px 46px rgba(9,20,54,.30))}
/* and the label under it is white text on the light #orbit band (1.06:1) */
.wrap .orbit-hub b{color:var(--ink)}

/* [19] mock: Sweeps purple, magenta and orange-brown out of the carousel mocks' inline styles and dar */
/* ── v2 pass 7: rejected hues inside the carousel mocks ─────────────────────
   #8e44ad purple avatar, #fdeef4/#c2185b magenta "New", #fff4e6/#a5670a and
   #fff7e6 orange-brown, #fdeaea/#c0392b brick red. All inline, so these need
   !important. Teal (palette) carries "New"; everything informational drops
   into brand-soft; the allergy flag keeps a red, but --red's. */
.wrap #featCar [style*="#8e44ad"]{background:#1d3a8f !important}
.wrap #featCar [style*="#fdeef4"]{background:rgba(20,184,166,.14) !important;color:#0e7a75 !important}
.wrap #featCar [style*="#fff4e6"],
.wrap #featCar [style*="#fff7e6"]{background:#eaf0fc !important;color:#1d3a8f !important}
.wrap #featCar [style*="#fdeaea"]{background:rgba(226,29,39,.10) !important;color:#b3151d !important}
/* pale-blue pill ink: #5b8af0 on #eaf0fc is ~2.7:1, and it is used ~10 times */
.wrap .pf-app [style*="color:#5b8af0"]{color:#1d3a8f !important}

/* [20] mock: Fixes the money figures in the three persona mini-screens: they were the weakest ink in  */
/* ── v2 pass 7: the persona mini-screens' numerals ──────────────────────────
   .mpay was --ink-2 while its own row label is --ink; .mpay.up (#15b364) is
   2.57:1 and .mfoot b (#5b8af0 on #eaf0fc→#fff) ~2.9:1. Nothing was tabular,
   so the stacked amounts didn't align. #0b6b4f matches .mlive at css:1028. */
.wrap #who .mini{font-variant-numeric:tabular-nums}
.wrap #who .mrow .mpay{color:var(--ink);letter-spacing:-.01em}
.wrap #who .mrow .mpay.up{color:#0b6b4f}
.wrap #who .mstat .mbig,
.wrap #who .mkpis b,
.wrap #who .mfoot b{letter-spacing:-.02em}
.wrap #who .mfoot b{color:#1d3a8f}

/* [21] contrast: The entire #tfc left column and the #money intro/caption stop being dark ink on the blue */
/* ── chrome ink: these surfaces are blue, so their text is white ──────────
   Replaces the light-surface assumptions at css:311-314 (.gband .sec-head p
   {color:#5f5c74}, .gband p{color:#5f5c74}, .gband ul li{color:#4a4763},
   .gband .pf-cap{color:#5f5c74} / .pf-cap b{color:#4a4763}) and beats the
   inline colours at html:248-253. */
.wrap .gband > .shell > p,
.wrap .gband > .shell > .sec-head p,
.wrap .gband > .shell > ul li,
.wrap #tfc > .shell > .tfc-grid > div > p,
.wrap #tfc > .shell > .tfc-grid > div > ul li{color:var(--ink-2)}
.wrap .gband > .shell > p b,
.wrap .gband > .shell > .sec-head p b,
.wrap #tfc > .shell > .tfc-grid > div > p b{color:var(--ink-2)}
.wrap .gband .sec-head p{color:rgba(255,255,255,.88) !important}
.wrap .gband .pf-cap{color:rgba(255,255,255,.85) !important}
.wrap .gband .pf-cap b{color:#fff !important}
.wrap #tfc li span{color:var(--ink-2)}   /* the four ✓ ticks */
.wrap .final .eyebrow{color:var(--gold)}    /* was --brand navy on navy */

/* Guard: white cards floating ON the chrome keep page ink. */
.wrap .gband .pf-app p,
.wrap .gband .pf-app li,
.wrap .gband .dash p,
.wrap .gband .dash li{color:var(--ink-2) !important}

/* [22] contrast: The active tab pill in all 7 product frames ('On site', 'Overview', 'Your brand', 'Store */
/* css:1018 (.wrap .pf-bar .per span{color:var(--ink-2)}) also caught the
   ACTIVE pill, which has a #2f6bd8 fill (css:216) — dark ink on blue, ~1.8:1.
   Inactive pills keep --ink-2 on the light toolbar; only .on is restored. */
.wrap .pf-bar .per span.on{color:#fff}

/* [23] contrast: The pale-blue status pills across the carousel, #money, #tfc, #who and #calc go from 2.9 */
/* ── soft chip, strong ink ─────────────────────────────────────────────────
   #5b8af0 = ~2.90:1 on the #eaf0fc chip it always sits on; --indigo #2f6bd8
   = ~4.36:1, still short for 10px 800-weight text. --brand #1d3a8f on the
   same chip = ~8.95:1. Covers the nine inline `color:#5b8af0` in
   activly.html plus css:542 (#calc .calc-rows .bad b) and css:848
   (#who .mfoot b). All target surfaces verified light. */
.wrap [style*="#5b8af0"]{color:var(--brand) !important}
.wrap #tfc .pf-body [style*="color:var(--indigo)"]{color:var(--brand) !important}
.wrap #tfc .chip[style]{color:var(--brand) !important}
.wrap #who .mfoot b{color:var(--brand)}
.wrap #calc .calc-rows .bad b{color:var(--brand)}
.wrap .pf-attn .r .go{color:var(--brand)}

/* [24] contrast: Every green in the page reaches AA: the six ✓ marks in the comparison table (2.74→6.6:1) */
/* ── success: soft tint keeps the fill, ink goes to the readable partner ──
   --ok #15b364 measures 2.74:1 on white / 2.36:1 on its own tint. #0b6b4f
   is the ink already used at css:1028 — but that rule is dead, outranked
   by #who .mbar .mlive (css:837). Measured: #0b6b4f = 6.50:1 on #fff,
   5.64:1 on the 14% tint. */
.wrap #who .mbar .mlive{color:#0b6b4f;background:rgba(21,179,100,.14)}
.wrap #who .mrow .mpay.up{color:#0b6b4f}
.wrap .yes,
.wrap table.compare .yes{color:#0b6b4f}
.wrap #calc .calc-rows .good b{color:#0b6b4f}

/* [25] contrast: The five star ratings become legible — 2.20:1 and 1.65:1 go to 5.72:1 — while staying go */
/* ── star ratings ──────────────────────────────────────────────────────────
   .stars was #e0a500 = 2.20:1 on white (css:1027, over css:661 #ffb547),
   .tsub b was #ffb547 = 1.65:1. Gold is only legible on chrome, so the
   stars get a navy chip: #f5b81f on #16306e = 5.72:1. */
.wrap .stars{
  display:inline-flex;
  background:var(--navy);
  color:var(--gold);
  border-radius:999px;
  padding:4px 11px;
  line-height:1.25;
  letter-spacing:2px;
}
.wrap .tsub b{
  display:inline-block;
  background:var(--navy);
  color:var(--gold);
  border-radius:999px;
  padding:3px 10px;
  letter-spacing:1.5px;
}

/* [26] contrast: Clears the last four dark-build leftovers: the invisible 'ActivityLane' label under the orb */
/* ── dark-build stragglers ─────────────────────────────────────────────────
   css:617 .orbit-hub b{color:#fff} — white on the LIGHT #orbit band, 1.06:1. */
.wrap .orbit-hub b{color:var(--ink)}

/* html:321 'Live' pill: inline #14b8a6 on its own tint = 2.24:1, and the
   inline beats css:1029. Same soft-fill/dark-ink pattern as .mlive. */
.wrap .rescard .soon[style]{
  background:rgba(21,179,100,.14) !important;
  color:#0b6b4f !important;
  border-color:rgba(21,179,100,.35) !important;
}

/* css:341 ringed the pale KPI tiles in dark navy #243156. */
.wrap #featCar .pf-k{border:1px solid #ece6f1 !important}

/* Gold holds 5.72:1 on #16306e but falls to ~2.4:1 where the chrome sweep
   reaches #3f78d8. A solid navy ground pins the chips wherever they land
   (css:1063-1068 used background:rgba(245,184,31,.14)). */
.wrap .hero.dark .chip.chip-biz,
.wrap .gband .chip.chip-biz{
  background:var(--navy);
  border-color:rgba(245,184,31,.75);
  color:var(--gold);
}

/* [27] responsive: Below 960px the whole primary navigation reappears as a second row under the brand, with */
/* ── responsive nav ────────────────────────────────────────────────────────
   css:58 `.nav-links{display:none}` + css:63 `@media(min-width:960px){...}`
   left phones and tablets with no navigation at all. Put the links on a
   second row and dock both popovers to the sticky header so the narrow
   shell can't clip them. No JS: the triggers are real <button>s, so the
   existing :focus-within rules (css:486, css:493) open them on tap. */
@media(max-width:959.98px){
  .wrap header.nav .nav-in{flex-wrap:wrap;height:auto;gap:0 12px;padding-top:8px;padding-bottom:4px}
  .wrap header.nav .nav-cta{margin-left:auto}
  .wrap header.nav .nav-cta .signin{display:inline-flex;align-items:center;min-height:44px}
  .wrap header.nav .nav-links{
    display:flex;order:3;flex:1 0 100%;flex-wrap:wrap;align-items:center;
    gap:0 20px;margin-left:0;margin-top:2px;
    border-top:1px solid rgba(255,255,255,.16);
  }
  .wrap header.nav .nav-links > a,
  .wrap header.nav .navdrop-btn{min-height:44px;display:inline-flex;align-items:center}
  /* dock the popovers to header.nav (position:sticky = a containing block) */
  .wrap header.nav .navdrop{position:static}
  .wrap header.nav .navdrop::after{display:none} /* hover bridge would span the header */
  .wrap header.nav .navdrop-menu,
  .wrap header.nav .navmega-menu{
    left:10px;right:10px;width:auto;min-width:0;top:calc(100% + 6px);
    transform:translateY(6px);grid-template-columns:1fr;
    max-height:min(70vh,520px);overflow:auto;overscroll-behavior:contain;
  }
  .wrap header.nav .navdrop:hover .navdrop-menu,
  .wrap header.nav .navdrop:focus-within .navdrop-menu,
  .wrap header.nav .navmega:hover .navmega-menu,
  .wrap header.nav .navmega:focus-within .navmega-menu{transform:translateY(0)}
  .wrap header.nav .navmega-grid{grid-template-columns:1fr}
  .wrap header.nav .navmega-intro{border-right:0;border-bottom:1px solid var(--line);padding-right:0;padding-bottom:12px}
  .wrap header.nav .navdrop-menu a,
  .wrap header.nav .navmega-grid a{min-height:44px}
}

/* [28] responsive: The "Built for you — not for a booking middleman" table scrolls sideways again at 390px  */
#compare .cmp{width:auto;min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain}
#compare table.compare{min-width:520px}

/* [29] responsive: Every interactive element gets a visible keyboard focus ring — navy on the light canvas, */
/* ── keyboard focus ───────────────────────────────────────────────────────
   The stylesheet has no :focus-visible rules at all (grep: 0 hits), and
   `#calc input[type=range]{…outline:none}` strips the UA ring from both
   calculator sliders. Navy ring on the light canvas, gold on the blue
   chrome / navy cards — outline follows border-radius, so pills stay
   pill-shaped. */
.wrap :is(a,button,summary,input,select,textarea,[tabindex]):focus-visible{
  outline:3px solid var(--brand);
  outline-offset:2px;
}
.wrap header.nav :is(a,button):focus-visible,
.wrap .hero :is(a,button):focus-visible,
.wrap .gband :is(a,button):focus-visible,
.wrap .final :is(a,button):focus-visible,
.wrap .proof :is(a,button):focus-visible,
.wrap footer.foot :is(a,button):focus-visible{outline-color:var(--gold)}
/* sliders: `#calc input[type=range]` killed the ring outright */
.wrap #calc input[type=range]:focus-visible{outline:3px solid var(--brand);outline-offset:4px}
/* css:482's focus colour already loses to css:913 (.wrap header.nav .navdrop-btn{color:#fff}),
   so the dropdown triggers show nothing on keyboard focus — only css:921 covers :hover */
.wrap header.nav .navdrop-btn:focus-visible{color:var(--gold)}

/* [30] responsive: Visitors with "reduce motion" set actually get a still page: the two marquees, the float */
/* ── prefers-reduced-motion ───────────────────────────────────────────────
   Must be last: the "Owner override" block at css:597-607 re-enables every
   animation with !important, which makes the guard at css:595 dead code.
   Verified with reduce:true — .mq-track still ran mqscroll 34s, .logo-track
   logoscroll 24s, .pf-app wkfloatY 8s, .fcard .fic wkbob 6s,
   .orbit-hub .mark hubpulse 5s, .ctrack scroll-behavior:smooth.
   Nothing is hidden: reveals are forced visible rather than animated. */
@media(prefers-reduced-motion:reduce){
  .wrap .mq-track,
  .wrap .logo-track,
  .wrap .pf-app,
  .wrap .fcard .fic,
  .wrap .orbit-hub .mark,
  .wrap .fl-inner{animation:none !important;transform:none !important}
  .wrap .btn-primary::after{transition:none !important;left:-130% !important}
  .wrap [data-reveal],
  .wrap [data-reveal].in{opacity:1 !important;transform:none !important;transition:opacity .01ms !important}
  .wrap .ctrack{scroll-behavior:auto !important}
  /* the tilt script writes an inline transform on .fcard — !important beats it */
  .wrap .fcard,
  .wrap .fcard:hover,
  .wrap .fcard:hover .fic{transform:none !important}
  .wrap .rescard:hover,
  .wrap .btn-primary:hover,
  .wrap .btn-ghost:hover,
  .wrap .btn-light:hover{transform:none !important}
  .wrap #how .step-c{opacity:1 !important}
  .wrap #how .dot{transition:none !important}
}

/* [31] responsive: Carousel dots, carousel arrows and the two calculator sliders become properly tappable,  */
/* ── tap targets ──────────────────────────────────────────────────────────
   Measured at 390px: .cdot 9×9 on a 17px pitch, .carr 38×38,
   #rKids/#rPrice 8px tall (css:531). */
.wrap .cdots{gap:22px}
.wrap .cdot{position:relative}
.wrap .cdot::before{content:"";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:30px;height:44px}
.wrap .carr{width:44px;height:44px;top:calc(50% - 22px)}
.wrap .carr.prev{left:-2px}
.wrap .carr.next{right:-2px}
/* sliders: keep the 8px bar, move it to the native track, grow the input to 44px */
.wrap #calc input[type=range]{height:44px;margin-top:6px;background:transparent;border-radius:0}
.wrap #calc input[type=range]::-webkit-slider-runnable-track{height:8px;border-radius:999px;background:linear-gradient(90deg,var(--brand) var(--p,40%),#ece6f1 var(--p,40%))}
.wrap #calc input[type=range]::-webkit-slider-thumb{margin-top:-8px}
.wrap #calc input[type=range]::-moz-range-track{height:8px;border-radius:999px;background:linear-gradient(90deg,var(--brand) var(--p,40%),#ece6f1 var(--p,40%))}
.wrap .foot-col a{padding:9px 0}

/* [32] responsive: The feature-card tooltips stop running off the right edge of the screen, and on touch de */
/* ── .flist tooltips ──────────────────────────────────────────────────────
   css:409 anchors a 300px popover to `left:0` of each <li>; measured
   overflowing the viewport at every breakpoint (right edge 472px @390,
   857px @768, 1300px @1280) and clipped by .wrap{overflow-x:hidden}.
   Anchor to the <ul> so the tip can never leave the card. */
#platform .flist{position:relative}
#platform .flist li{position:static}
#platform .flist .tip{left:0;right:0;width:auto;top:calc(100% + 8px)}
/* Touch + keyboard: the <li> is not focusable (tabIndex -1), so the
   :focus-within half of css:410 never fires and this copy is mouse-only.
   On coarse pointers show it inline instead of as a popover. */
@media(hover:none){
  #platform .flist{display:block}
  #platform .flist li{display:block;border-radius:12px;padding:8px 12px;margin-bottom:6px}
  #platform .flist .tip{position:static;opacity:1;visibility:visible;transform:none;
    width:auto;background:transparent;border:0;box-shadow:none;padding:4px 0 0;font-size:12px}
}

/* [33] responsive: The tab row in the #money product frame wraps instead of having its last two pills cut o */
/* ── .pf-bar tab row ──────────────────────────────────────────────────────
   css:213 `.pf-bar .per{margin-left:auto;display:flex;gap:6px}` never wraps.
   Measured on #money at 390px: .per is 336px wide at x=131, right edge 467px
   in a 390px viewport — the "Debts" and "Families" pills are clipped. */
.wrap .pf-bar{flex-wrap:wrap}
.wrap .pf-bar .per{flex-wrap:wrap;justify-content:flex-end;row-gap:5px;min-width:0}
@media(max-width:520px){
  .wrap .pf-bar .per{margin-left:0;flex:1 0 100%;justify-content:flex-start;margin-top:6px}
}

/* [35] narrative: Introduces a two-tier heading scale so the four argument headlines dominate, and demotes */
/* ── scannability: two heading tiers, not eleven equal shouts ──────────── */
.wrap #orbit .sec-head h2,
.wrap #how .sec-head h2,
.wrap #features .sec-head h2,
.wrap #resources .sec-head h2,
.wrap section.band:not([id]) .sec-head h2{font-size:clamp(24px,2.4vw,31px)}
/* #orbit and #platform carry the same eyebrow string — only one should shout */
.wrap #orbit .sec-head .eyebrow{color:var(--ink-2)}

/* Remaining per-page leftovers found by the all-pages audit. */
.wrap .fcard p,.wrap .fcard b{color:var(--ink-2)}
.wrap .fcard h3{color:var(--ink)}
.wrap .tb-ic{color:var(--brand)}
.wrap .pf-tg b.on-ink{background:#171534;color:#fff}
/* White cards that live INSIDE a chrome band keep page ink. */
.wrap .gband :is(.bk-top,.bk-frame,.bk-body,.rd-bar,.tb-card) :is(p,li,b,span,div){color:var(--ink-2)}
.wrap .gband :is(.bk-top,.bk-frame,.bk-body,.rd-bar,.tb-card) :is(h1,h2,h3,h4,b){color:var(--ink)}

/* Final per-page leftovers. */
.wrap .fcard p b,.wrap .fcard li b{color:var(--ink)}
.wrap .terr-list .tb-ic,.wrap li > .tb-ic{color:var(--brand)}
/* .pf-card is a white card: anything inheriting white inside it takes page ink. */
.wrap .pf-grid .pf-card,.wrap .pf-grid .pf-card div{color:var(--ink)}
.wrap .pf-grid .pf-card .muted{color:var(--ink-3)}

/* ── footer: the closing chrome ─────────────────────────────────────────────
   The portal bookends its canvas with dark chrome — sidebar and title cards.
   The site had chrome at the top and then just… stopped, leaving the footer as
   grey text on the page ground. This is a bare <footer> with no class, which is
   why the earlier `footer.foot` chrome rule never matched it. */
.wrap > footer{
  position:relative;
  margin-top:72px;
  padding:64px 0 56px;
  background-image:var(--dots),
    linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%);
  background-size:18px 18px, cover;
  background-repeat:repeat, no-repeat;
  color:rgba(255,255,255,.85);
}
/* Column headings take the accent, so the two lists read as deliberate groups. */
.wrap > footer :is(h4,h5,.fh,strong):not(a strong){
  color:var(--gold);
  letter-spacing:.14em;
  text-transform:uppercase;
  font-size:11.5px;
}
.wrap > footer a{color:rgba(255,255,255,.85);text-decoration:none}
.wrap > footer a:hover{color:#fff;text-decoration:underline;text-underline-offset:4px;text-decoration-color:var(--gold)}
.wrap > footer p{color:rgba(255,255,255,.75)}
.wrap > footer .brand,
.wrap > footer b{color:#fff}
.wrap > footer .brand .os,
.wrap > footer .os{color:var(--gold)}
/* The brand tile is a blue gradient — invisible on blue. Make it glass. */
.wrap > footer .logo{
  background:rgba(255,255,255,.14);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.35);
}
/* A hairline so the chrome starts on a clean edge rather than a colour jump. */
.wrap > footer::before{
  content:"";position:absolute;left:0;right:0;top:0;height:1px;
  background:rgba(255,255,255,.18);
}

/* ═══════════════════════════════════════════════════════════════════════════
   CHROME BUDGET — the portal puts its navy on the SIDEBAR and TITLE CARDS and
   nothing else; everything you actually read sits on the light canvas. The
   site had drifted to nav + hero + #money + #tfc + the bookings bands + footer
   all in blue-and-dots, which is most of the page. Chrome is now nav, hero and
   footer only. Mid-page bands return to the canvas.

   This also retires a whole bug class: every "light ink on a light surface"
   fault in this file came from a band being chrome on one page and canvas on
   another, with the ink rules guessing which.
   ═══════════════════════════════════════════════════════════════════════════ */
.wrap .gband{
  background-image:none !important;
  background-color:var(--bg) !important;
  color:var(--ink);
}
.wrap .gband :is(h1,h2,h3,h4),
.wrap .gband .sec-head h2,
.wrap .gband > .shell > .sec-head p b,
.wrap .gband > .shell > p b{color:var(--ink) !important}
.wrap .gband p,
.wrap .gband li,
.wrap .gband .sub,
.wrap .gband .lede,
.wrap .gband .pf-cap,
.wrap .gband > .shell > p,
.wrap .gband > .shell > .sec-head p,
.wrap .gband > .shell > ul li{color:var(--ink-2) !important}
.wrap .gband .eyebrow{color:var(--brand) !important}
.wrap .gband li span{color:var(--brand) !important}   /* the ✓ ticks */
.wrap .gband .pf-cap b{color:var(--ink) !important}
/* Cards on a light band need a real hairline — their border was tuned white
   for the blue ground and is invisible here. */
.wrap .gband :is(.dash,.pf-app,.bk-frame,.nsc-frame,.rd-frame){
  border:1px solid var(--line) !important;
  box-shadow:0 18px 44px -26px rgba(16,35,86,.28) !important;
}
.wrap .gband .chip{background:#fff;border-color:var(--line);color:var(--ink-2)}

/* The closing CTA card was butting straight into the band above it. */
.wrap .final{margin-top:40px}
.wrap section:has(> .shell > .final){padding-top:64px}

/* Territory icons render on the light canvas everywhere, not just .terr-list. */
.wrap .tb-ic{color:var(--brand)}

/* #tfc is canvas now: its ticks take the brand, its copy takes page ink. */
.wrap #tfc li span{color:var(--brand)}
.wrap #tfc li{color:var(--ink-2)}

/* ── logo wall, take two ────────────────────────────────────────────────────
   Grayscale at 62% flattened everything and erased the paler marks entirely
   (COMBAT ZONE, APE). A logo wall reads as proof when the brands look alive,
   so: full colour, levelled to one optical height, on a contained band that
   separates them from the page rather than leaving them floating in space. */
.wrap #trusted{
  padding:44px 0 48px;
  background:var(--surface);
  border-top:1px solid var(--line);
  border-bottom:1px solid var(--line);
}
.wrap #trusted .trusted-lead{
  color:var(--ink-2);
  font-size:11.5px;
  letter-spacing:.16em;
  margin-bottom:26px;
}
.wrap #trusted .logo-slot{
  background:transparent;border:0;box-shadow:none;border-radius:0;
  padding:0 34px;
}
.wrap #trusted .logo-slot img{
  max-height:46px;width:auto;
  filter:none;opacity:1;                    /* full colour — these are the proof */
  transition:transform .2s ease;
}
.wrap #trusted .logo-slot:hover img{transform:translateY(-2px)}
/* Fade the marquee edges so logos enter and leave instead of being chopped. */
.wrap #trusted .mq,
.wrap #trusted .logo-row{
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
}
@media (prefers-reduced-motion: reduce){
  .wrap #trusted .logo-slot img{transition:none}
}

/* The separator now forces a row break, so the three business chips always sit
   together on their own line instead of the first one riding up with the
   activity chips whenever the row happens to have space. */
.wrap .chip-sep{
  flex:0 0 100%;
  width:100%;height:0;
  margin:4px 0 0;
  background:transparent;
  border-radius:0;
}
@media(max-width:640px){.wrap .chip-sep{display:block}}

/* Ghost buttons on the chrome bands were page-ink — dark navy on dark navy,
   across 10 pages ("Book a demo", "See the platform", "Read our Privacy…"). */
.wrap .gband .btn-ghost,
.wrap .final .btn-ghost,
.wrap .hero.dark .btn-ghost,
.wrap section:has(> .shell > .final) .btn-ghost{
  color:#fff;
  border-color:rgba(255,255,255,.45);
  background:rgba(255,255,255,.06);
}
.wrap .gband .btn-ghost:hover,
.wrap .final .btn-ghost:hover{border-color:#fff;color:var(--gold)}

/* Ghost buttons also live in the `heroimg` hero variant on the persona and
   platform pages — a different class from `.hero.dark`, which is why they were
   still page-ink on the chrome. */
.wrap section.hero .btn-ghost{
  color:#fff;
  border-color:rgba(255,255,255,.45);
  background:rgba(255,255,255,.06);
}
.wrap section.hero .btn-ghost:hover{border-color:#fff;color:var(--gold)}

/* ── phone screen popping out of the hero photo ─────────────────────────────
   The photo shows a parent mid-booking but you can't see what she's looking
   at. This lifts her screen out of the frame so the shot actually demonstrates
   the product. Overlaps the photo edge so it reads as depth, not a sticker. */
.wrap .heroimg-pic,
.wrap figure.wk-img.heroimg-pic{position:relative;overflow:visible}
.wrap .phone-pop{
  position:absolute;left:-26px;bottom:-30px;z-index:3;width:248px;
  background:#fff;border-radius:18px;
  border:1px solid var(--line);
  box-shadow:0 30px 60px -22px rgba(9,20,54,.45), 0 0 0 6px rgba(255,255,255,.55);
  overflow:hidden;
  transform:rotate(-2deg);
}
.wrap .phone-pop .pp-bar{
  display:flex;align-items:center;gap:7px;
  padding:9px 12px;background:var(--brand);color:#fff;font-size:12px;font-weight:800;
}
.wrap .phone-pop .pp-dot{width:7px;height:7px;border-radius:50%;background:var(--gold)}
.wrap .phone-pop .pp-body{padding:12px 13px 14px}
.wrap .phone-pop .pp-title{font-size:13.5px;font-weight:800;color:var(--ink);line-height:1.25}
.wrap .phone-pop .pp-meta{margin-top:4px;font-size:11px;color:var(--ink-3);line-height:1.4}
.wrap .phone-pop .pp-row{
  display:flex;justify-content:space-between;align-items:center;
  margin-top:10px;padding-top:9px;border-top:1px solid var(--line);
  font-size:12px;color:var(--ink-2);
}
.wrap .phone-pop .pp-row b{color:var(--ink);font-size:13.5px}
.wrap .phone-pop .pp-cta{
  margin-top:10px;text-align:center;padding:8px 0;border-radius:999px;
  background:#e7f8ee;color:#0b6b4f;font-size:12px;font-weight:800;
}
@media(max-width:900px){.wrap .phone-pop{left:auto;right:-8px;bottom:-22px;width:206px;transform:none}}
@media(max-width:560px){.wrap .phone-pop{display:none}}

/* The popout also rides the freelancers hero photo. */
.wrap .bk-photo2{position:relative;overflow:visible}
.wrap .bk-photo2 .phone-pop{left:auto;right:-30px;bottom:-26px;transform:rotate(2deg)}
@media(max-width:900px){.wrap .bk-photo2 .phone-pop{right:-6px;bottom:-18px;transform:none}}

/* The headline emphasis on the `heroimg` hero variant was still brand navy on
   the blue chrome — invisible. Gold is the accent on chrome, as on the home page. */
.wrap section.hero h1.head em,
.wrap .heroimg h1.head em{color:var(--gold);font-style:normal}

/* Message-style popout body copy. */
.wrap .phone-pop .pp-msg{
  margin-top:8px;padding:9px 10px;border-radius:12px;
  background:var(--brand-soft);color:var(--ink-2);
  font-size:11.5px;line-height:1.45;
}

/* Placement variant: drops the card mostly BELOW the photo so it overlaps the
   frame edge rather than a face. Used where the subject sits low-left. */
.wrap .phone-pop--low{
  left:auto;right:-28px;bottom:-58px;
  transform:rotate(1.5deg);
}
@media(max-width:900px){
  .wrap .phone-pop--low{right:-6px;bottom:-40px;transform:none}
}

/* Text-only heroes were tight under the nav and their CTAs sat on the band's
   bottom edge. Give the whole block room to breathe. */
.wrap section.hero{padding-top:76px}
.wrap section.hero .hero-cta{margin-bottom:4px}
@media(max-width:720px){.wrap section.hero{padding-top:52px}}

/* ═══════════════════════════════════════════════════════════════════════════
   PORTAL MOCKS — rota, clock-in and the Learning Centre.
   Drawn as markup rather than screenshots so they stay sharp, stay on the
   palette, and can never drift from the theme the way a flat image would.
   ═══════════════════════════════════════════════════════════════════════════ */
.wrap .pm-duo{display:grid;gap:20px;grid-template-columns:1fr;margin-top:30px}
@media(min-width:940px){.wrap .pm-duo{grid-template-columns:1.35fr 1fr;align-items:start}}

.wrap .pm{
  background:#fff;border:1px solid var(--line);border-radius:18px;overflow:hidden;
  box-shadow:0 22px 50px -30px rgba(16,35,86,.34);
}
.wrap .pm-bar{
  display:flex;align-items:center;gap:9px;padding:11px 14px;
  background:var(--brand);color:#fff;font-size:12.5px;font-weight:800;
}
.wrap .pm-bar .pm-dot{width:7px;height:7px;border-radius:50%;background:var(--gold);flex:none}
.wrap .pm-pill{
  margin-left:auto;font-size:10.5px;font-weight:800;padding:3px 9px;border-radius:999px;
  background:rgba(255,255,255,.18);color:#fff;
}
.wrap .pm-pill-live{background:#e7f8ee;color:#0b6b4f}
.wrap .pm-body{padding:14px}
.wrap .pm-foot{
  display:flex;justify-content:space-between;align-items:center;gap:10px;
  margin-top:12px;padding-top:11px;border-top:1px solid var(--line);
  font-size:11.5px;color:var(--ink-3);
}
.wrap .pm-foot b{color:var(--brand);font-size:12px}

/* rota grid */
.wrap .rota-grid{display:grid;grid-template-columns:auto repeat(5,1fr);gap:6px;font-size:10.5px}
.wrap .rota-h{font-weight:800;color:var(--ink-3);text-align:center;padding-bottom:2px;letter-spacing:.04em}
.wrap .rota-n{display:flex;align-items:center;gap:6px;font-weight:700;color:var(--ink);white-space:nowrap;padding-right:6px}
.wrap .rota-c{display:flex}
.wrap .sh{
  flex:1;font-style:normal;font-weight:700;text-align:center;
  padding:7px 4px;border-radius:8px;line-height:1.25;font-size:9.5px;
}
.wrap .sh-a{background:#eaf0fc;color:var(--brand)}
.wrap .sh-b{background:#e7f2ff;color:#2254b3}
.wrap .sh-off{background:var(--panel);color:var(--ink-3)}
.wrap .sh-gap{background:#fdf3d8;color:#7a5a00;box-shadow:inset 0 0 0 1px #efdcb4}

/* avatars + clock rows */
.wrap .av{
  width:22px;height:22px;border-radius:50%;flex:none;
  display:grid;place-items:center;font-size:9px;font-weight:800;color:#fff;
}
.wrap .av-1{background:#2f6bd8}.wrap .av-2{background:#5a3fd0}.wrap .av-3{background:#16306e}
.wrap .clk-hero{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px}
.wrap .clk-k{background:var(--panel);border-radius:12px;padding:10px 11px}
.wrap .clk-k span{display:block;font-size:9.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3)}
.wrap .clk-k b{font-size:20px;color:var(--ink);font-variant-numeric:tabular-nums}
.wrap .clk-k b.warn{color:#7a5a00}
.wrap .clk-row{display:flex;align-items:center;gap:9px;padding:8px 0;border-top:1px solid var(--line)}
.wrap .clk-row b{display:block;font-size:12.5px;color:var(--ink)}
.wrap .clk-row small{font-size:10.5px;color:var(--ink-3)}
.wrap .tick{margin-left:auto;font-size:10px;font-weight:800;padding:4px 9px;border-radius:999px;white-space:nowrap}
.wrap .tick-in{background:#e7f8ee;color:#0b6b4f}
.wrap .tick-br{background:#eaf0fc;color:var(--brand)}
.wrap .tick-late{background:#fdf3d8;color:#7a5a00}
.wrap .tick-todo{background:var(--panel);color:var(--ink-3)}

/* Learning Centre */
.wrap .cpd-split{display:grid;gap:22px;grid-template-columns:1fr;margin-top:30px;align-items:start}
@media(min-width:940px){.wrap .cpd-split{grid-template-columns:1.3fr .9fr}}
.wrap .cpd-tabs{display:flex;gap:6px;margin-bottom:12px}
.wrap .cpd-tabs i{
  font-style:normal;font-size:11px;font-weight:800;padding:6px 12px;border-radius:999px;
  background:var(--panel);color:var(--ink-3);
}
.wrap .cpd-tabs i.on{background:var(--brand);color:#fff}
.wrap .cpd-c{display:flex;align-items:center;gap:11px;padding:11px 0;border-top:1px solid var(--line)}
.wrap .cpd-ic{
  width:36px;height:36px;border-radius:10px;flex:none;display:grid;place-items:center;
  background:var(--brand-soft);color:var(--brand);font-size:11.5px;font-weight:800;
}
.wrap .cpd-t{flex:1;min-width:0}
.wrap .cpd-t b{display:block;font-size:13px;color:var(--ink)}
.wrap .cpd-t small{font-size:10.5px;color:var(--ink-3)}
.wrap .cpd-t .bar{height:5px;border-radius:999px;background:var(--panel);margin-top:6px;overflow:hidden}
.wrap .cpd-t .bar i{display:block;height:100%;border-radius:999px;background:var(--brand)}
.wrap .cpd-stat{
  background:var(--brand);color:#fff;border-radius:18px;padding:22px 22px 20px;margin-bottom:16px;
}
.wrap .cpd-stat b{display:block;font-size:44px;line-height:1;font-family:var(--ff-display,inherit)}
.wrap .cpd-stat span{display:block;margin-top:8px;font-size:13px;color:rgba(255,255,255,.85);line-height:1.45}
.wrap .cpd-list{list-style:none;margin:0;padding:0;display:grid;gap:11px}
.wrap .cpd-list li{display:flex;gap:10px;font-size:14px;color:var(--ink-2);line-height:1.5}
.wrap .cpd-list li span{color:var(--brand);font-weight:900;flex:none}

/* ═══════════════════════════════════════════════════════════════════════════
   PORTAL WINDOW — the mocks read as "plonked" because a bare card has no
   product context. The real portal is a navy sidebar + a title card + tabs +
   a dense working area with a rail. This draws that whole shell, so the mock
   reads as a screenshot of the app rather than a decorated box.
   ═══════════════════════════════════════════════════════════════════════════ */
.wrap .pw-wrap{margin-top:30px}
.wrap .pw{
  display:grid;grid-template-columns:186px 1fr;
  background:#fff;border:1px solid var(--line);border-radius:20px;overflow:hidden;
  box-shadow:0 34px 70px -34px rgba(16,35,86,.42);
}
@media(max-width:860px){.wrap .pw{grid-template-columns:1fr}.wrap .pw-side{display:none}}

/* sidebar — the portal's own navy + dot grid */
.wrap .pw-side{
  padding:16px 14px;color:#fff;
  background-image:var(--dots),linear-gradient(165deg,#16306e 0%,#23479f 50%,#3f78d8 100%);
  background-size:18px 18px, cover;background-repeat:repeat,no-repeat;
}
.wrap .pw-brand{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:800;margin-bottom:16px}
.wrap .pw-mark{width:18px;height:18px;border-radius:6px;background:var(--gold);flex:none}
.wrap .pw-nav{display:grid;gap:2px}
.wrap .pw-nav i{
  font-style:normal;font-size:11.5px;font-weight:700;color:rgba(255,255,255,.8);
  padding:7px 10px;border-radius:8px;
}
.wrap .pw-nav i.on{background:#fff;color:var(--brand);box-shadow:inset 3px 0 0 var(--gold)}
.wrap .pw-who{display:flex;align-items:center;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid rgba(255,255,255,.2)}
.wrap .pw-who b{display:block;font-size:11.5px;color:#fff}
.wrap .pw-who small{font-size:10px;color:rgba(255,255,255,.7)}

/* main area */
.wrap .pw-main{background:var(--bg);min-width:0}
.wrap .pw-hero{
  display:flex;align-items:flex-end;justify-content:space-between;gap:12px;flex-wrap:wrap;
  margin:12px 12px 0;padding:13px 15px;border-radius:14px;color:#fff;
  background-image:var(--dots),linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%);
  background-size:18px 18px, cover;background-repeat:repeat,no-repeat;
}
.wrap .pw-eb{font-size:9.5px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--gold)}
.wrap .pw-hero h4{margin:2px 0 0;font-size:18px;font-weight:800;color:#fff}
.wrap .pw-acts{display:flex;gap:6px;flex-wrap:wrap}
.wrap .pw-acts i{font-style:normal;font-size:10.5px;font-weight:800;padding:6px 11px;border-radius:999px}
.wrap .pw-acts .ghost{background:rgba(255,255,255,.14);color:#fff;box-shadow:inset 0 0 0 1px rgba(255,255,255,.3)}
.wrap .pw-acts .solid{background:var(--gold);color:#241a00}
.wrap .pw-tabs{display:flex;gap:4px;padding:10px 15px 0;flex-wrap:wrap}
.wrap .pw-tabs i{font-style:normal;font-size:11px;font-weight:800;color:var(--ink-3);padding:7px 11px;border-radius:8px 8px 0 0}
.wrap .pw-tabs i.on{background:#fff;color:var(--brand);box-shadow:0 -2px 0 var(--brand) inset}
.wrap .pw-body{display:grid;gap:12px;grid-template-columns:1fr;padding:12px 15px 15px}
@media(min-width:1040px){.wrap .pw-body{grid-template-columns:1.62fr .95fr}
 .wrap .pw-body-1{grid-template-columns:1.5fr 1fr}}
.wrap .pw-col,.wrap .pw-card{background:#fff;border:1px solid var(--line);border-radius:14px;padding:13px}
.wrap .pw-rail{display:grid;gap:12px;align-content:start;min-width:0}
.wrap .pw-ct{font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-bottom:9px}
.wrap .pw-mini{display:flex;align-items:center;gap:9px;padding:7px 0;border-top:1px solid var(--line)}
.wrap .pw-mini b{display:block;font-size:12px;color:var(--ink)}
.wrap .pw-mini small{font-size:10.5px;color:var(--ink-3)}
.wrap .pw-mini .tick{margin-left:0;order:-1;flex:none}
.wrap .pw-legend{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:11px;padding-top:10px;border-top:1px solid var(--line);font-size:10.5px;color:var(--ink-3)}
.wrap .pw-legend .ml{margin-left:auto;color:var(--brand);font-size:11.5px}
.wrap .pw-legend .k{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:5px;vertical-align:-1px}
.wrap .k-a{background:#eaf0fc;box-shadow:inset 0 0 0 1px #cdddf7}
.wrap .k-b{background:#e7f2ff;box-shadow:inset 0 0 0 1px #bcd6f5}
.wrap .k-g{background:#fdf3d8;box-shadow:inset 0 0 0 1px #efdcb4}

/* denser rota: two-line shifts + an hours column */
.wrap .pw .rota-grid{grid-template-columns:auto repeat(5,1fr) auto}
.wrap .pw .rota-n{align-items:center}
.wrap .pw .rota-n b{display:block;font-size:11.5px;line-height:1.2}
.wrap .pw .rota-n small{font-size:9.5px;color:var(--ink-3)}
.wrap .pw .sh{display:block;font-size:9px;padding:6px 4px}
.wrap .pw .sh em{display:block;font-style:normal;font-weight:600;opacity:.75;margin-top:1px}
.wrap .rota-tot{text-align:right;font-variant-numeric:tabular-nums}
.wrap .rota-tot b{font-size:11.5px;color:var(--ink)}

/* Inset the window so it reads as a screenshot placed ON the page rather than
   a full-bleed slab, and step the type down to screenshot scale. */
.wrap .pw-wrap{max-width:1040px;margin-left:auto;margin-right:auto}
.wrap .cpd-split .pw{max-width:none}
.wrap .pw{grid-template-columns:164px 1fr;border-radius:16px}
.wrap .pw-hero h4{font-size:16px}
.wrap .pw-nav i{font-size:11px;padding:6px 9px}
.wrap .pw-brand{font-size:12.5px}

/* toolbar */
.wrap .pw-tools{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:11px}
.wrap .pw-tools .f{
  font-style:normal;font-size:10px;font-weight:800;padding:5px 10px;border-radius:999px;
  background:var(--panel);color:var(--ink-3);
}
.wrap .pw-tools .f.on{background:var(--brand-soft);color:var(--brand);box-shadow:inset 0 0 0 1px var(--brand-line)}
.wrap .pw-search{
  font-size:10px;color:var(--ink-3);padding:5px 12px;border-radius:999px;
  border:1px solid var(--line);background:#fff;
}
.wrap .pw-tools .ml{margin-left:auto;font-size:10.5px;color:var(--ink-2)}
.wrap .av-4{background:#0b6b4f}.wrap .av-5{background:#2254b3}
.wrap .sh-leave{background:#ede9fd;color:#5a3fd0}

/* ── #cpd layout fix ────────────────────────────────────────────────────────
   The window was sitting in a ~640px grid column while its own body switched
   to two columns on VIEWPORT width (1280) — so it laid out for a wide space
   inside a narrow one and spilled. Grid children also default to
   min-width:auto, which lets content push past the track instead of shrinking.
   The window now gets the full width and the supporting content sits beneath. */
.wrap .cpd-split{grid-template-columns:1fr !important;max-width:1040px;margin-left:auto;margin-right:auto}
.wrap .cpd-split > *{min-width:0}
.wrap .cpd-side{display:grid;gap:20px;grid-template-columns:1fr}
@media(min-width:840px){.wrap .cpd-side{grid-template-columns:.85fr 1.15fr;align-items:center}}
.wrap .cpd-stat{margin-bottom:0}

/* Nothing inside the window may force it wider than its track. */
.wrap .pw,.wrap .pw-main,.wrap .pw-body,.wrap .pw-col,.wrap .pw-rail,.wrap .pw-card{min-width:0}
.wrap .pw-col,.wrap .pw-card{overflow-wrap:anywhere}

/* ── parent portal: one window, subdivided into its key pages ───────────────
   Six panes so Messages, Moments, bookings, wallet, newsfeed and the child
   record are all legible at once — the point being that a family gets ONE
   place, not six. */
.wrap .pw-parent .pp-grid{
  display:grid;gap:10px;padding:12px 15px 15px;
  grid-template-columns:1fr;
}
@media(min-width:760px){.wrap .pw-parent .pp-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(min-width:1040px){.wrap .pw-parent .pp-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
.wrap .pp-pane{
  background:#fff;border:1px solid var(--line);border-radius:13px;padding:11px;min-width:0;
}
.wrap .pp-pane .pw-ct{margin-bottom:8px}

/* messages */
.wrap .pp-msg{
  font-size:10.5px;line-height:1.4;padding:7px 9px;border-radius:10px;margin-bottom:5px;color:var(--ink-2);
}
.wrap .pp-msg b{display:block;font-size:9.5px;color:var(--brand);margin-bottom:2px}
.wrap .pp-them{background:var(--panel)}
.wrap .pp-me{background:var(--brand-soft);color:var(--brand);margin-left:22px}
.wrap .pp-inp{
  margin-top:7px;font-size:10px;color:var(--ink-3);
  border:1px solid var(--line);border-radius:999px;padding:6px 11px;
}

/* moments */
.wrap .pp-photos{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}
.wrap .pp-photos i{display:block;aspect-ratio:1;border-radius:7px}
.wrap .ph1{background:linear-gradient(135deg,#2f6bd8,#5b8af0)}
.wrap .ph2{background:linear-gradient(135deg,#16306e,#2f6bd8)}
.wrap .ph3{background:linear-gradient(135deg,#5a3fd0,#8f7ce8)}
.wrap .ph4{background:linear-gradient(135deg,#0b6b4f,#15b364)}
.wrap .ph5{background:linear-gradient(135deg,#274ba3,#3f78d8)}
.wrap .ph6{background:linear-gradient(135deg,#f5b81f,#ffd066)}

/* shared rows */
.wrap .pp-row{display:flex;align-items:center;gap:8px;padding:7px 0;border-top:1px solid var(--line)}
.wrap .pp-row:first-of-type{border-top:0}
.wrap .pp-row b{display:block;font-size:11px;color:var(--ink);line-height:1.25}
.wrap .pp-row small{font-size:9.5px;color:var(--ink-3)}
.wrap .pp-ic{
  width:26px;height:26px;border-radius:8px;flex:none;display:grid;place-items:center;
  background:var(--brand-soft);color:var(--brand);font-size:9px;font-weight:800;
}
.wrap .pp-row .tick{margin-left:auto;font-size:9px;padding:3px 7px}

/* wallet */
.wrap .pp-wallet{
  background:var(--brand);color:#fff;border-radius:11px;padding:11px 12px;margin-bottom:8px;
}
.wrap .pp-wallet span{display:block;font-size:9.5px;color:rgba(255,255,255,.8)}
.wrap .pp-wallet b{display:block;font-size:22px;line-height:1.15}
.wrap .pp-wallet i{
  display:inline-block;margin-top:6px;font-style:normal;font-size:9.5px;font-weight:800;
  background:var(--gold);color:#241a00;border-radius:999px;padding:4px 10px;
}

/* newsfeed + child */
.wrap .pp-post{padding:7px 0;border-top:1px solid var(--line)}
.wrap .pp-post:first-of-type{border-top:0}
.wrap .pp-post b{display:block;font-size:11px;color:var(--ink)}
.wrap .pp-post small{font-size:9.5px;color:var(--ink-3)}
.wrap .pp-child{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.wrap .pp-child b{display:block;font-size:11.5px;color:var(--ink)}
.wrap .pp-child small{font-size:9.5px;color:var(--ink-3)}
.wrap .pp-flags{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px}
.wrap .pp-flags i{font-style:normal;font-size:9px;font-weight:800;padding:3px 8px;border-radius:999px}
.wrap .fl-a{background:#fdebec;color:#a3162a}
.wrap .fl-m{background:#eaf0fc;color:var(--brand)}
.wrap .fl-s{background:#ede9fd;color:#5a3fd0}
.wrap .pp-note{display:flex;align-items:center;gap:7px;font-size:9.5px;color:var(--ink-3);margin-top:8px}
.wrap .pp-note .tick{font-size:9px;padding:3px 7px}

/* ── the popout, as an actual phone ─────────────────────────────────────────
   Bezel, status bar, notch and home indicator. The app header keeps the brand
   colour and runs up behind the status bar, the way a real app does. */
.wrap .phone-pop{
  background:#0d1430;                     /* bezel */
  padding:5px 5px 9px;
  border-radius:30px;
  box-shadow:
    0 30px 60px -22px rgba(9,20,54,.55),
    0 0 0 1px rgba(255,255,255,.10) inset,
    0 0 0 5px rgba(255,255,255,.42);      /* soft halo lifts it off the photo */
  border:0;
  overflow:visible;
}
/* status bar — same brand fill as the app header, so they read continuous */
.wrap .phone-pop .pp-status{
  position:relative;
  display:flex;align-items:center;justify-content:space-between;
  background:var(--brand);color:#fff;
  padding:7px 14px 3px;
  border-radius:25px 25px 0 0;
  font-size:9.5px;font-weight:800;
}
.wrap .phone-pop .pp-status b{font-variant-numeric:tabular-nums}
/* the notch */
.wrap .phone-pop .pp-status::after{
  content:"";position:absolute;left:50%;top:5px;transform:translateX(-50%);
  width:46px;height:11px;border-radius:999px;background:#0d1430;
}
/* signal / wifi / battery, drawn rather than iconography */
.wrap .phone-pop .pp-sig{
  width:34px;height:8px;
  background:
    linear-gradient(#fff,#fff) 0 100%/4px 4px no-repeat,
    linear-gradient(#fff,#fff) 5px 100%/4px 6px no-repeat,
    linear-gradient(#fff,#fff) 10px 100%/4px 8px no-repeat,
    linear-gradient(rgba(255,255,255,.55),rgba(255,255,255,.55)) 17px 100%/13px 7px no-repeat;
  border-radius:1px;opacity:.95;
}
.wrap .phone-pop .pp-bar{border-radius:0}
.wrap .phone-pop .pp-body{background:#fff;border-radius:0 0 25px 25px}
/* home indicator */
.wrap .phone-pop .pp-home{
  width:74px;height:4px;border-radius:999px;
  background:rgba(255,255,255,.55);
  margin:7px auto 0;
}

/* Moments: real session photos rather than gradient blocks — the pane is meant
   to show what parents actually receive, and coloured squares showed nothing. */
.wrap .pp-photos img{
  display:block;width:100%;aspect-ratio:1;object-fit:cover;
  border-radius:7px;background:var(--panel);
}

/* ── phone proportions ──────────────────────────────────────────────────────
   It was 256x305 — 1.19:1, near-square. A handset is about 2.16:1, so the
   frame is now sized on a 9:19.5 ratio and the screen content stretches to
   fill it, with a tab bar pinned to the bottom like a real app. */
.wrap .phone-pop{
  width:226px;
  min-height:462px;               /* ~9:19.5 once the bezel is added */
  display:flex;flex-direction:column;
}
.wrap .phone-pop .pp-body{
  flex:1;display:flex;flex-direction:column;
  border-radius:0;
}
.wrap .phone-pop .pp-cta{margin-top:auto}
.wrap .phone-pop .pp-thread{display:grid;gap:5px;margin:9px 0 4px}
.wrap .phone-pop .pp-b{
  font-size:10px;line-height:1.35;padding:6px 9px;border-radius:11px;max-width:88%;
}
.wrap .phone-pop .pp-b-them{background:var(--panel);color:var(--ink-2);justify-self:start;border-bottom-left-radius:3px}
.wrap .phone-pop .pp-b-me{background:var(--brand-soft);color:var(--brand);justify-self:end;border-bottom-right-radius:3px}
/* bottom tab bar */
.wrap .phone-pop .pp-tabbar{
  display:flex;justify-content:space-between;gap:2px;
  padding:8px 12px 6px;background:#fff;
  border-top:1px solid var(--line);
  border-radius:0 0 25px 25px;
}
.wrap .phone-pop .pp-tabbar i{
  font-style:normal;font-size:8.5px;font-weight:800;color:var(--ink-3);
}
.wrap .phone-pop .pp-tabbar i.on{color:var(--brand)}
.wrap .phone-pop .pp-body{border-radius:0}
@media(max-width:900px){.wrap .phone-pop{width:196px;min-height:400px}}

/* Now the phone is full height it was masking the mother. Moved to the photo's
   LEFT edge, which is window/background in this shot, so it overlaps ~17% of
   the frame and leaves both faces clear. Can't push it off the right instead —
   that would run past the viewport and reintroduce horizontal overflow. */
.wrap .phone-pop--low{
  /* The photo is 394px tall and the phone 468 — at full size it cannot overlap
     the frame without covering a face, and the text gutter is only 34px wide.
     So this instance runs smaller and sits in the photo's lower-left, under
     both faces, hanging past the bottom edge for depth. */
  width:190px;min-height:372px;
  left:-30px;right:auto;bottom:-62px;
  transform:rotate(-1.5deg);
}
@media(max-width:1100px){
  .wrap .phone-pop--low{left:-70px;bottom:-30px}
}
@media(max-width:900px){
  .wrap .phone-pop--low{left:auto;right:-8px;bottom:-26px;transform:none}
}

/* Phone down 20% (190x372 -> 152x298) and the photo nudged right, so the child
   sits clear of the handset. transform rather than margin so the grid cell and
   the phone's anchor point don't move with it. */
.wrap .phone-pop--low{
  /* Setting width/min-height didn't give a true 20%: padding sits outside the
     width, and the height is driven by content, so min-height never bit.
     Scaling the whole element shrinks the frame AND its contents together. */
  width:190px;
  min-height:0;
  left:-6px;
  bottom:-40px;
  transform:rotate(-1.5deg) scale(.8);
  transform-origin:bottom left;
}
.wrap .heroimg-shift{transform:translateX(38px)}
@media(max-width:1100px){
  .wrap .heroimg-shift{transform:translateX(18px)}
  .wrap .phone-pop--low{left:-14px}
}
@media(max-width:900px){
  .wrap .heroimg-shift{transform:none}
}

/* The scroll-reveal animates `transform`, so it overwrote the photo's nudge
   while running. Shifting the FIGURE's inner image instead keeps the two off
   each other's property. */
/* Moving the IMG inside the frame just exposed the frame's background down the
   left edge. Shift the frame itself with margin — the reveal animates
   `transform`, so margin stays out of its way. */
.wrap .heroimg-shift{margin-left:38px}
@media(max-width:1100px){.wrap .heroimg-shift{margin-left:18px}}
@media(max-width:900px){.wrap .heroimg-shift{margin-left:0}}

/* No dark band under the tab bar: the screen now runs to the bottom of the
   handset and the home indicator sits on white, as it does on the device. */
.wrap .phone-pop{padding-bottom:5px}
.wrap .phone-pop .pp-tabbar{padding-bottom:4px;border-radius:0}
.wrap .phone-pop .pp-home{
  background:#c7cbd8;
  margin:0 auto;
  padding:0;
  position:relative;
  top:-2px;
}
.wrap .phone-pop .pp-homewrap{background:#fff;border-radius:0 0 25px 25px;padding:5px 0 8px}

/* Parent-facing reply row in place of the delivery receipt. */
.wrap .phone-pop .pp-reply{
  margin-top:auto;
  font-size:9.5px;color:var(--ink-3);
  border:1px solid var(--line);border-radius:999px;
  padding:7px 12px;
}

/* ── reconciliation table ───────────────────────────────────────────────────
   A ledger, so it wants tabular numerals, a monospaced reference column and a
   row state for the one payment that needs a human. */
.wrap .rec{width:100%;border-collapse:collapse;font-size:11px}
.wrap .rec th{
  text-align:left;font-size:9.5px;font-weight:800;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink-3);
  padding:0 8px 8px;border-bottom:1px solid var(--line);white-space:nowrap;
}
.wrap .rec td{padding:9px 8px;border-bottom:1px solid var(--line);vertical-align:top;color:var(--ink-2)}
.wrap .rec .r{text-align:right}
.wrap .rec td.r{font-variant-numeric:tabular-nums;color:var(--ink);font-weight:700}
.wrap .rec b{display:block;font-size:11.5px;color:var(--ink);line-height:1.25}
.wrap .rec small{font-size:9.5px;color:var(--ink-3)}
.wrap .rec code{
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:10px;color:var(--brand);
  background:var(--brand-soft);border-radius:5px;padding:2px 6px;white-space:nowrap;
}
.wrap .rec tr.attn td{background:#fdf3d8}
.wrap .rec tr.attn code{background:#fff;color:#7a5a00}
.wrap .rec tbody tr:last-child td{border-bottom:0}
.wrap .rec .tick{display:inline-block}

/* the "how a payment lands" flow */
.wrap .rec-flow{list-style:none;counter-reset:s;margin:0;padding:0;display:grid;gap:8px}
.wrap .rec-flow li{
  counter-increment:s;position:relative;padding-left:24px;
  font-size:10.5px;line-height:1.45;color:var(--ink-3);
}
.wrap .rec-flow li b{color:var(--ink)}
.wrap .rec-flow li::before{
  content:counter(s);position:absolute;left:0;top:0;
  width:16px;height:16px;border-radius:50%;
  background:var(--brand-soft);color:var(--brand);
  font-size:9px;font-weight:800;display:grid;place-items:center;
}
@media(max-width:720px){
  .wrap .rec thead{display:none}
  .wrap .rec td{display:block;border:0;padding:2px 0}
  .wrap .rec tbody tr{display:block;padding:9px 0;border-bottom:1px solid var(--line)}
  .wrap .rec td.r{text-align:left}
}

/* The ledger was 55px wider than its track — the reference column's `nowrap`
   and the cell padding were setting a min-content floor above the column. */
.wrap #tfcrec .pw-body{grid-template-columns:1fr}
@media(min-width:1040px){.wrap #tfcrec .pw-body{grid-template-columns:1.9fr .82fr}}
.wrap .rec th,.wrap .rec td{padding:8px 6px}
.wrap .rec code{white-space:normal;overflow-wrap:anywhere;font-size:9.5px;padding:2px 5px}
.wrap .rec th:first-child,.wrap .rec td:first-child{white-space:nowrap;font-size:10px}
.wrap .rec{table-layout:auto}
.wrap #tfcrec .pw-col{overflow-x:auto}

/* ── portal snippets ────────────────────────────────────────────────────────
   Five short views instead of one deep frame: this page's argument is breadth
   — register, accidents, concerns, medication, clearance — so proving each in
   a few lines beats one big screenshot of a single screen. */
.wrap .snip-grid{
  display:grid;gap:14px;margin-top:30px;
  grid-template-columns:1fr;
}
@media(min-width:680px){.wrap .snip-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(min-width:1040px){
  .wrap .snip-grid{grid-template-columns:repeat(6,minmax(0,1fr))}
  /* 3 across, then 2 centred — five items on a six-column grid */
  .wrap .snip:nth-child(1),.wrap .snip:nth-child(2),.wrap .snip:nth-child(3){grid-column:span 2}
  .wrap .snip:nth-child(4){grid-column:2 / span 2}
  .wrap .snip:nth-child(5){grid-column:4 / span 2}
}
.wrap .snip{
  background:#fff;border:1px solid var(--line);border-radius:14px;overflow:hidden;min-width:0;
  box-shadow:0 18px 40px -28px rgba(16,35,86,.34);
}
.wrap .snip-bar{
  display:flex;align-items:center;gap:7px;
  padding:9px 11px;background:var(--brand);color:#fff;
  font-size:11px;font-weight:800;
}
.wrap .snip-dot{width:6px;height:6px;border-radius:50%;background:var(--gold);flex:none}
.wrap .snip-pill{
  margin-left:auto;font-size:9px;font-weight:800;padding:3px 7px;border-radius:999px;
  background:rgba(255,255,255,.18);color:#fff;white-space:nowrap;
}
.wrap .snip-live{background:#e7f8ee;color:#0b6b4f}
.wrap .snip-warn{background:#fdf3d8;color:#7a5a00}
.wrap .snip-lock{background:#ede9fd;color:#5a3fd0}
.wrap .snip-body{padding:11px}
.wrap .snip-kpi{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-bottom:9px}
.wrap .snip-kpi div{background:var(--panel);border-radius:9px;padding:7px 8px}
.wrap .snip-kpi span{display:block;font-size:8.5px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-3)}
.wrap .snip-kpi b{font-size:15px;color:var(--ink);font-variant-numeric:tabular-nums}
.wrap .snip-kpi b.ok{font-size:12px;color:#0b6b4f}
.wrap .snip-row{display:flex;align-items:center;gap:8px;padding:7px 0;border-top:1px solid var(--line)}
.wrap .snip-row.snip-top,.wrap .snip-row:first-child{border-top:0;padding-top:0}
.wrap .snip-row b{display:block;font-size:11.5px;color:var(--ink);line-height:1.25}
.wrap .snip-row small{font-size:9.5px;color:var(--ink-3)}
.wrap .snip-row .tick{margin-left:auto;font-size:9px;padding:3px 7px;white-space:nowrap}
.wrap .snip-ic{
  width:28px;height:28px;border-radius:9px;flex:none;display:grid;place-items:center;
  font-size:9.5px;font-weight:800;
}
.wrap .ic-a{background:#fdebec;color:#a3162a}
.wrap .ic-s{background:#ede9fd;color:#5a3fd0}
.wrap .ic-m{background:var(--brand-soft);color:var(--brand)}
.wrap .snip-line{
  display:flex;justify-content:space-between;gap:10px;
  padding:5px 0;border-top:1px solid var(--line);font-size:10px;color:var(--ink-3);
}
.wrap .snip-line b{color:var(--ink);font-weight:700;text-align:right}
.wrap .snip-line b.ok{color:#0b6b4f}
.wrap .snip-foot{
  display:flex;justify-content:space-between;gap:10px;align-items:center;
  margin-top:9px;padding-top:8px;border-top:1px solid var(--line);
  font-size:9.5px;color:var(--ink-3);
}
.wrap .snip-foot b{color:var(--brand);font-size:10px}
.wrap .snip-foot b.ok{color:#0b6b4f}

/* ── snippet internals, mimicking the real portal screens ───────────────────
   Values taken from the components themselves so these read as the product:
   the incident/medication wizards use #1d3a8f active, #e7f6ee/#0f7a43 done;
   the amber callout is #f0c36d on #fff7e6 with #8a5a00 ink; ratios is a table. */

/* register rows */
.wrap .reg-row{display:flex;align-items:flex-start;gap:8px;padding:8px 0;border-top:1px solid var(--line)}
.wrap .reg-row:first-of-type{border-top:0}
.wrap .reg-t{flex:1;min-width:0}
.wrap .reg-t b{display:block;font-size:11.5px;color:var(--ink)}
.wrap .reg-t small{font-size:9.5px;color:var(--ink-3)}
.wrap .reg-flags{display:flex;gap:3px;margin-top:4px;flex-wrap:wrap}
.wrap .reg-flags i{font-style:normal;font-size:8.5px;font-weight:800;padding:2px 6px;border-radius:999px}
.wrap .reg-btn{
  border:0;border-radius:999px;padding:5px 11px;cursor:pointer;
  background:var(--brand);color:#fff;font-size:9.5px;font-weight:800;white-space:nowrap;
}

/* wizard — same shape as IncidentsApp / MedicationApp */
.wrap .wiz{display:flex;align-items:center;margin-bottom:7px}
.wrap .wz{
  width:22px;height:22px;border-radius:50%;flex:none;display:grid;place-items:center;
  font-size:10px;font-weight:800;background:var(--panel);color:var(--ink-3);
}
.wrap .wz.on{background:#1d3a8f;color:#fff}
.wrap .wz.done{background:#e7f6ee;color:#0f7a43}
.wrap .wz-bar{flex:1;height:3px;border-radius:999px;background:var(--panel);margin:0 6px}
.wrap .wz-bar.done{background:#bfe6d2}
.wrap .wiz-labels{display:flex;justify-content:space-between;gap:4px;margin-bottom:9px}
.wrap .wiz-labels span{font-size:8.5px;font-weight:800;color:var(--ink-3);flex:1;text-align:center}
.wrap .wiz-labels span:first-child{text-align:left}
.wrap .wiz-labels span:last-child{text-align:right}
.wrap .wiz-labels span.on{color:var(--ink)}
.wrap .callout{
  margin-top:9px;border:1px solid #f0c36d;background:#fff7e6;color:#8a5a00;
  border-radius:9px;padding:7px 9px;font-size:9.5px;line-height:1.4;
}

/* ratios table */
.wrap .rat{width:100%;border-collapse:collapse;font-size:10.5px}
.wrap .rat th{
  text-align:left;font-size:8.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  color:var(--ink-3);padding:0 4px 6px;border-bottom:1px solid var(--line);
}
.wrap .rat td{padding:7px 4px;border-bottom:1px solid var(--line);color:var(--ink-2)}
.wrap .rat tbody tr:last-child td{border-bottom:0}
.wrap .rat .r{text-align:right;font-variant-numeric:tabular-nums;font-weight:800;color:var(--ink)}
.wrap .rat td.ok{color:#0b6b4f}
.wrap .rat td.warn{color:#8a5a00}
.wrap .rat tr.attn td{background:#fff7e6}
.wrap .sw{display:inline-block;width:8px;height:8px;border-radius:3px;margin-right:6px;vertical-align:0}
.wrap .sw-1{background:#2f6bd8}.wrap .sw-2{background:#0b6b4f}
.wrap .sw-3{background:#5a3fd0}.wrap .sw-4{background:#f5b81f}

/* medication */
.wrap .med-tabs{display:flex;gap:5px;margin-bottom:9px}
.wrap .med-tabs i{font-style:normal;font-size:9px;font-weight:800;padding:4px 9px;border-radius:999px;background:var(--panel);color:var(--ink-3)}
.wrap .med-tabs i.on{background:var(--brand-soft);color:var(--brand)}
.wrap .med-row{display:flex;align-items:center;gap:8px;padding:7px 0;border-top:1px solid var(--line)}
.wrap .med-row:first-of-type{border-top:0}
.wrap .med-t{flex:1;min-width:0}
.wrap .med-t b{display:block;font-size:11.5px;color:var(--ink)}
.wrap .med-t small{font-size:9.5px;color:var(--ink-3)}
.wrap .med-sub{
  font-size:9px;color:#0b6b4f;background:#e7f8ee;border-radius:7px;
  padding:5px 8px;margin:0 0 2px;
}

/* chronology */
.wrap .chron{list-style:none;margin:9px 0 0;padding:0 0 0 12px;border-left:2px solid var(--brand-line);display:grid;gap:8px}
.wrap .chron li{position:relative;font-size:9.5px;color:var(--ink-3);line-height:1.4}
.wrap .chron li b{color:var(--ink);margin-right:4px}
.wrap .chron li::before{
  content:"";position:absolute;left:-17px;top:4px;width:7px;height:7px;border-radius:50%;
  background:var(--brand);box-shadow:0 0 0 2px #fff;
}
.wrap .chron li.open::before{background:#f5b81f}
.wrap .chron li.open b{color:#8a5a00}

/* The franchises hero was an abstract hub-and-spoke on a big white field —
   mostly empty space. The HO command centre says the same thing with real
   numbers, and matches the portal windows used on the other pages. */
.wrap .wk-diag.heroimg-pic{aspect-ratio:auto;background:none;border:0;box-shadow:none;padding:0}
.wrap .pw-ho{grid-template-columns:132px 1fr;border-radius:16px}
.wrap .pw-ho .pw-hero{margin:9px 9px 0;padding:10px 12px}
.wrap .pw-ho .pw-hero h4{font-size:14px}
.wrap .pw-ho .pw-body{padding:9px 11px 11px;gap:9px}
@media(min-width:1040px){.wrap .pw-ho .pw-body{grid-template-columns:1.45fr .8fr}}
.wrap .pw-ho .pw-col,.wrap .pw-ho .pw-card{padding:10px}
.wrap .ho-kpi{margin-bottom:9px}
.wrap .ho-kpi .clk-k{padding:7px 8px}
.wrap .ho-kpi .clk-k b{font-size:15px}
.wrap .ho-kpi .clk-k span{font-size:8px}
.wrap .ho-tbl td,.wrap .ho-tbl th{padding:5px 4px;font-size:10px}
.wrap .sw-5{background:#e21d27}

/* Hero column is ~525px: one column only, and a hard cap so the window can't
   outgrow the hero band the way it did with the rail in place. */
.wrap .pw-ho .pw-body,
.wrap .pw-ho .pw-body-1{grid-template-columns:1fr !important}
.wrap .pw-ho{max-width:560px}
.wrap .pw-ho .ho-tbl td,.wrap .pw-ho .ho-tbl th{padding:4px 4px;font-size:9.5px}
.wrap .pw-ho .clk-k b{font-size:14px}

/* Funnel: drawn by JS for a dark band, so it was a pale glow at 0.4 behind a
   7px blur. On the light canvas it needs real weight and darker nodes. */
.wrap .ns-funnels .nspaths path{opacity:.75 !important}
.wrap .ns-funnels .nsnodes circle{fill:#1d3a8f !important;r:4.5}

/* Network card: a KPI strip and per-site detail, so it reads like the HO
   command centre rather than three rows and a total. */
.wrap .nsc-kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:11px}
.wrap .nsc-kpis div{background:var(--panel);border-radius:11px;padding:9px 10px}
.wrap .nsc-kpis span{display:block;font-size:9px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-3)}
.wrap .nsc-kpis b{display:block;font-size:17px;color:var(--ink);font-variant-numeric:tabular-nums;line-height:1.2}
.wrap .nsc-kpis i{font-style:normal;font-size:9px;font-weight:700;color:var(--ink-3)}
.wrap .nsc-kpis i.up{color:#0b6b4f}
.wrap .nsc-meta{display:flex;flex-wrap:wrap;gap:4px;margin-top:5px}
.wrap .nsc-meta i{
  font-style:normal;font-size:8.5px;font-weight:800;padding:2px 7px;border-radius:999px;
  background:var(--panel);color:var(--ink-3);
}
.wrap .nsc-meta i.ok{background:#e7f8ee;color:#0b6b4f}
.wrap .nsc-meta i.warn{background:#fdf3d8;color:#7a5a00}
.wrap .nsc-meta i.paid{background:var(--brand-soft);color:var(--brand)}
.wrap .nsc-meta i.due{background:#ede9fd;color:#5a3fd0}
.wrap .nsc-split{text-align:right}
.wrap .nsc-split small{display:block;font-size:9px;color:var(--ink-3);margin-top:2px}

/* A five-item sidebar implied the product was five screens. This shows the
   real breadth — grouped as the portal groups them — and clips with a fade so
   it reads as a list continuing below the fold rather than a complete one. */
.wrap .pw-ho .pw-side{
  position:relative;
  max-height:364px;
  overflow:hidden;
  padding-bottom:0;
}
.wrap .pw-ho .pw-side::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:64px;pointer-events:none;
  background:linear-gradient(180deg,rgba(29,58,143,0) 0%,#23479f 78%);
}
.wrap .pw-grp{
  display:block;font-style:normal;
  margin:9px 0 3px;padding:0 9px;
  font-size:8px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;
  color:rgba(255,255,255,.55);
}
.wrap .pw-ho .pw-nav i{font-size:10.5px;padding:5px 9px}
.wrap .pw-ho .pw-who{display:none}

/* Homepage hero: same portal-window treatment as the head-office mock —
   navy sidebar with grouped nav, gradient title card, KPI row, chart, table. */
.wrap .pw-home{max-width:none}
.wrap .pw-home .pw-side{max-height:none}
.wrap .pw-home .pw-side::after{background:linear-gradient(180deg,rgba(29,58,143,0) 0%,#2b53ab 82%)}
.wrap .home-chart{
  background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:10px 11px;margin-bottom:10px;
}
.wrap .home-chart .hc-h{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}
.wrap .home-chart .hc-h b{font-size:11.5px;color:var(--ink)}
.wrap .home-chart .hc-h span{font-size:9.5px;font-weight:800;color:var(--brand)}
.wrap .home-chart svg{width:100%;height:auto;display:block}
.wrap .pw-home .ho-tbl td,.wrap .pw-home .ho-tbl th{padding:6px 4px;font-size:10.5px}
/* the hero figure held the old card's frame — the window brings its own */
.wrap .hero .dash-wrap,.wrap .hero .pw-home{box-shadow:0 34px 70px -34px rgba(9,20,54,.5)}

/* The sidebar's long nav was setting the window height, leaving ~234px of dead
   space beside the content. Cap it to the content column and let the fade do
   the "list continues" job at a shorter height. */
/* Cap the NAV LIST, not the sidebar: the sidebar must still stretch to the
   full window height or it leaves a white gap beneath it. */
.wrap .pw-home .pw-side{max-height:none;overflow:hidden}
.wrap .pw-home .pw-nav{max-height:352px;overflow:hidden}

/* Chips now sit beneath the portal window rather than under the CTA, so the
   right column reads screenshot-then-context. Nav crops at Learning Centre. */
.wrap .pw-home .pw-nav{max-height:none}
.wrap .pw-home .pw-side::after{height:44px}
.wrap .hero .heroimg-pic > .chips,
.wrap .hero .chips{margin-top:16px}

/* ── portal-style panel ─────────────────────────────────────────────────────
   The same frame as the product windows — gradient title bar, white body,
   hairline edge — so marketing sections sit in the product's own furniture. */
.wrap .pwx{
  background:#fff;border:1px solid var(--line);border-radius:18px;overflow:hidden;
  box-shadow:0 26px 56px -32px rgba(16,35,86,.34);
  margin-top:26px;
}
.wrap .pwx-bar{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  padding:12px 16px;color:#fff;font-size:12.5px;font-weight:800;
  background-image:var(--dots),linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%);
  background-size:18px 18px, cover;background-repeat:repeat,no-repeat;
}
.wrap .pwx-dot{width:7px;height:7px;border-radius:50%;background:var(--gold);flex:none}
.wrap .pwx-pill{
  margin-left:auto;font-size:10px;font-weight:800;padding:4px 10px;border-radius:999px;
  background:rgba(255,255,255,.16);color:#fff;
}
.wrap .pwx-body{padding:16px}
.wrap .pwx-body > .fgrid{margin-top:0}
.wrap .pwx-body > .cmp{margin-top:0}
/* cards inside the panel lose their own frame — the panel is the frame now */
.wrap .pwx-body .fcard{box-shadow:none;border-color:var(--line)}
@media(max-width:640px){.wrap .pwx-body{padding:12px}.wrap .pwx-pill{margin-left:0}}

/* ── persona mini-mocks: a hint of the portal frame ─────────────────────────
   Same chrome bar as the product windows (gradient + dot grid + gold dot) but
   kept small — these are thumbnails beside copy, not the hero screenshot. */
.wrap #who .mini{
  border:1px solid var(--line);border-radius:14px;overflow:hidden;background:#fff;
  box-shadow:0 18px 40px -28px rgba(16,35,86,.32);
}
.wrap #who .mbar{
  background-image:var(--dots),linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%);
  background-size:18px 18px, cover;background-repeat:repeat,no-repeat;
  color:#fff;padding:9px 11px;border-bottom:0;
}
.wrap #who .mbar b{color:#fff;font-size:11.5px}
/* the three window dots: one gold "active", two translucent */
.wrap #who .mbar .md{background:rgba(255,255,255,.35)}
.wrap #who .mbar .md:first-child{background:var(--gold)}
.wrap #who .mlive{
  background:rgba(255,255,255,.16);color:#fff;
  font-size:9.5px;font-weight:800;border-radius:999px;padding:3px 9px;
}
.wrap #who .ppmock{padding:11px}
.wrap #who .mrow{background:var(--bg);border:1px solid var(--line);border-radius:11px;padding:9px 10px;margin-bottom:7px}
.wrap #who .mrow:last-of-type{margin-bottom:0}
.wrap #who .mic{background:var(--brand-soft);box-shadow:inset 0 0 0 1px var(--brand-line)}
.wrap #who .mtx b{font-size:12px;color:var(--ink)}
.wrap #who .mtx small{font-size:10px;color:var(--ink-3)}
.wrap #who .mpay{font-size:13px;font-weight:800;color:var(--ink)}
.wrap #who .mpay.up{color:#0b6b4f}
.wrap #who .mmeta{
  margin-top:9px;padding-top:8px;border-top:1px solid var(--line);
  font-size:10px;color:var(--ink-3);font-weight:700;
}
/* The bar is navy now, so the earlier "darken green for white backgrounds" rule
   (.wrap #who .mbar .mlive) is wrong here — match its specificity to win. */
.wrap #who .mbar .mlive{color:#fff;background:rgba(255,255,255,.16)}
.wrap #who .mbar .mlive::before{background:#7ee2b8}

/* The photo frame is rounded (20px) but was overflow:visible, so the image's
   square corners poked out past it — that's the odd border. Clip to the frame. */
.wrap .wk-img,
.wrap .heroimg-pic{overflow:hidden}
.wrap .wk-img > img{border-radius:inherit;display:block}
/* the popout has to escape the frame, so it gets its own stacking context */
.wrap .heroimg-pic:has(.phone-pop){overflow:visible}
.wrap .heroimg-pic:has(.phone-pop) > img{border-radius:20px}

/* Network card: same chrome bar as the product windows. */
.wrap .nsc-bar{
  background-image:var(--dots),linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%);
  background-size:18px 18px, cover;background-repeat:repeat,no-repeat;
  color:#fff;border-bottom:0;padding:12px 15px;
}
.wrap .nsc-bar b{color:#fff}
.wrap .nsc-dot{background:rgba(255,255,255,.35)}
.wrap .nsc-dot:first-child{background:var(--gold)}
.wrap .nsc-cnt{background:rgba(255,255,255,.16);color:#fff;border-radius:999px;padding:4px 10px;font-weight:800}
.wrap .nsc-frame{border-radius:16px;overflow:hidden;border:1px solid var(--line);background:#fff}
/* keep the funnel above the photo strip but below the card */
.wrap .ns-funnels{z-index:2}
.wrap .ns-card{z-index:3}
.wrap .ns-funnels .nspaths path{opacity:.85 !important}

/* The photo-frame clip must NOT apply to .wk-diag — that wrapper holds the
   portal window, which is wider than the old figure box and was getting its
   right edge sheared off. */
.wrap .wk-diag,
.wrap .wk-diag.heroimg-pic{overflow:visible !important;border:0;background:none;box-shadow:none}

/* The network card bar is ID-scoped in the source, so match that specificity. */
#netsites .nsc-bar{
  background-image:var(--dots),linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%) !important;
  background-size:18px 18px, cover !important;background-repeat:repeat,no-repeat !important;
  color:#fff !important;border-bottom:0 !important;
}
#netsites .nsc-bar b{color:#fff !important}
#netsites .nsc-dot{background:rgba(255,255,255,.35) !important}
#netsites .nsc-dot:first-child{background:var(--gold) !important}
#netsites .nsc-cnt{background:rgba(255,255,255,.16) !important;color:#fff !important}

/* ── the funnel's real bug ──────────────────────────────────────────────────
   .ns-funnels carried mix-blend-mode:screen — a glow trick for the DARK band
   this section used to be. Screen lightens, so against the light canvas it
   composites to white and the funnel is invisible whatever colour it is.
   Three rounds of colour/opacity/blur tuning could never have fixed it. */
.wrap .ns-funnels{mix-blend-mode:normal !important}
.wrap .ns-funnels .nspaths path{opacity:.5 !important}
.wrap .ns-funnels .nsnodes circle{fill:#1d3a8f !important}

/* Same bug in the booking-page funnels: screen blending is a dark-band glow
   trick and composites to white on the light canvas. */
#booking .bk-photo2 .funnel,
#booking .bk-funnels{mix-blend-mode:normal !important}
#booking .bk-funnels path,
#booking .bk-photo2 .funnel path{opacity:.5}

/* Territory map: land is light now, so the zones become translucent areas with
   a defined edge rather than solid blobs sitting on a near-black landmass. */
#territory svg ellipse[fill="#2f6bd8"]{fill:#2f6bd8;fill-opacity:.20;stroke:#2f6bd8;stroke-width:1.5}
#territory svg ellipse[fill="#14b8a6"]{fill:#0e7a75;fill-opacity:.18;stroke:#0e7a75;stroke-width:1.5}
/* pins read as markers on light land */
#territory svg circle[fill="#ffffff"],
#territory svg circle[fill="#fff"]{fill:#ffffff;stroke:#1d3a8f;stroke-width:2}

/* The HO dashboard mock was the one window with no chrome. Give it the same
   title bar as the rest, and keep gold for actions rather than data. */
#dashboard .pf-bar-chrome{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  padding:12px 16px;color:#fff;font-size:13px;font-weight:800;
  background-image:var(--dots),linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%);
  background-size:18px 18px, cover;background-repeat:repeat,no-repeat;
  border-bottom:0;border-radius:16px 16px 0 0;
}
#dashboard .pf-mark{width:16px;height:16px;border-radius:5px;background:var(--gold);flex:none}
#dashboard .pf-bar-chrome .pf-tabs{display:flex;gap:4px;margin-left:auto}
#dashboard .pf-bar-chrome .pf-tabs i{
  font-style:normal;font-size:10.5px;font-weight:800;padding:4px 10px;border-radius:999px;
  background:rgba(255,255,255,.14);color:#fff;
}
#dashboard .pf-bar-chrome .pf-tabs i.on{background:#fff;color:var(--brand)}
#dashboard .pf-app{border-radius:16px;overflow:hidden;border:1px solid var(--line);background:#fff}
#dashboard .pf-app .pf-body{border-radius:0 0 16px 16px}
/* An existing .pf-tabs rule fills these pills white, which on the navy chrome
   gave white-on-white. Force the chrome variant. */
#dashboard .pf-bar-chrome .pf-tabs i{background:rgba(255,255,255,.14) !important;color:#fff !important}
#dashboard .pf-bar-chrome .pf-tabs i.on{background:#fff !important;color:var(--brand) !important}
/* `.gband .pf-bar{background:#fff !important}` from the light-canvas pass beat
   the chrome gradient, leaving white text on a white bar. */
#dashboard .pf-bar-chrome{
  background-color:#1d3a8f !important;
  background-image:var(--dots),linear-gradient(120deg,#1d3a8f 0%,#274ba3 45%,#3f78d8 100%) !important;
  background-size:18px 18px, cover !important;
  background-repeat:repeat,no-repeat !important;
  border-bottom:0 !important;
}

/* The HO dashboard bar title was inheriting dark page ink over the navy bar —
   `.pf-bar b` sets it and beat the chrome rule. */
#dashboard .pf-bar-chrome,
#dashboard .pf-bar-chrome b,
#dashboard .pf-bar-chrome span{color:#fff !important}

/* Territories window: replaces the abstract map. No sidebar — it sits in a
   half-width column beside the copy, so it's the screen without the chrome. */
.wrap .pw-terr{grid-template-columns:1fr}
.wrap .pw-terr .pw-hero{margin:10px 10px 0;padding:11px 13px}
.wrap .pw-terr .pw-hero h4{font-size:15px}
.wrap .pw-terr .pw-body{padding:10px 12px 12px}
.wrap .terr-tbl td,.wrap .terr-tbl th{padding:6px 4px;font-size:10.5px}
.wrap .terr-tbl .tick{font-size:9px;padding:3px 7px;white-space:nowrap}
.wrap .sw-6{background:#5f5c74}

/* ── territory map palette ──────────────────────────────────────────────────
   Land carries a real tint so the zones have something to sit on; each
   territory takes a distinct portal hue at low alpha with a solid edge, and
   the open patch is gold-dashed so "available" reads as opportunity. */
#territory svg ellipse.tz:nth-of-type(1),
#territory svg ellipse[fill="#2f6bd8"]{fill:#2f6bd8 !important;fill-opacity:.22 !important;stroke:#1d3a8f !important;stroke-width:1.6 !important}
#territory svg ellipse[fill="#14b8a6"]{fill:#5a3fd0 !important;fill-opacity:.18 !important;stroke:#5a3fd0 !important;stroke-width:1.6 !important}
/* the dashed "open patch" ring */
#territory svg ellipse[stroke-dasharray],
#territory svg [stroke-dasharray="5 5"]{stroke:#e0a500 !important;stroke-width:2 !important;fill:#f5b81f !important;fill-opacity:.10 !important}
/* live-site pins */
#territory svg circle[fill="#ffffff"],
#territory svg circle[fill="#fff"]{fill:#ffffff !important;stroke:#1d3a8f !important;stroke-width:2.2 !important}
/* the Available label pill */
#territory svg rect[fill="#ffffff"]{stroke:#e0a500 !important;stroke-width:1.4 !important}
#territory svg text[fill="#2f6bd8"]{fill:#8a5a00 !important}
/* legend swatches match the new zone colours */
.wrap .terr-legend span:nth-child(2) i{background:rgba(90,63,208,.20) !important;box-shadow:inset 0 0 0 1.5px #5a3fd0 !important}

/* ── freelancers hero: phone screen ─────────────────────────────────────────
   Layout unchanged; the screen was the last dark surface left from v1. Light
   screen, navy bezel, gold primary — same rule as every other mock. */
.wrap .hero .pf-app text{fill:var(--ink)}
.wrap .hero svg text[fill="#ffffff"]{fill:#171534}
/* #sess is the SESSION CARD (102x70) and #pink is the Book-now pill (102x25) —
   my first rule gilded the card and left the button washed out. */
.wrap .hero svg rect[fill="url(#sess)"]{fill:#2f6bd8}
.wrap .hero svg rect[fill="url(#pink)"]{fill:#f0b100}

/* ── freelancers hero stage ─────────────────────────────────────────────────
   The SVG phone had a 9px navy bezel and only three rows. Rebuilt around the
   phone component used elsewhere — thin dark bezel, notch, status bar, tab bar
   — with the floating cards positioned around it. */
.wrap .fh-stage{
  position:relative;aspect-ratio:4/3;width:100%;
  background:linear-gradient(150deg,#ffffff,#eef3fd);
  border:1px solid var(--line);border-radius:22px;
  box-shadow:0 30px 64px -34px rgba(16,35,86,.30);
  overflow:hidden;
}
/* the halo behind the phone */
.wrap .fh-stage::before{
  content:"";position:absolute;left:50%;top:52%;transform:translate(-50%,-50%);
  width:58%;aspect-ratio:1;border-radius:50%;
  background:radial-gradient(circle,rgba(47,107,216,.12),transparent 68%);
}
.wrap .fh-phone{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:212px;min-height:0;z-index:2;
}
.wrap .fh-phone .pp-body{padding:9px 10px 10px;gap:0}
.wrap .fh-hero-card{
  background:var(--brand);color:#fff;border-radius:12px;padding:12px 10px;text-align:center;margin-bottom:8px;
}
.wrap .fh-ball{font-size:22px;display:block;margin-bottom:4px}
.wrap .fh-hero-card b{display:block;font-size:11.5px}
.wrap .fh-hero-card small{font-size:9px;color:rgba(255,255,255,.8)}
.wrap .fh-row{
  display:flex;align-items:center;gap:8px;
  background:var(--bg);border:1px solid var(--line);border-radius:10px;
  padding:7px 9px;margin-bottom:5px;
}
.wrap .fh-row b{display:block;font-size:10.5px;color:var(--ink)}
.wrap .fh-row small{font-size:8.5px;color:var(--ink-3)}
.wrap .fh-p{margin-left:auto;font-size:11px;font-weight:800;color:var(--brand)}
.wrap .fh-meta{display:flex;align-items:center;gap:6px;margin:7px 0 8px}
.wrap .fh-meta .tick{font-size:8.5px;padding:3px 7px}
.wrap .fh-note{font-size:8.5px;color:var(--ink-3)}
.wrap .fh-cta{background:var(--cta);color:var(--cta-ink);font-size:11.5px;margin-top:0}

/* floating cards */
.wrap .fh-card{
  position:absolute;z-index:3;
  background:#fff;border:1px solid var(--line);border-radius:14px;
  box-shadow:0 20px 44px -26px rgba(16,35,86,.34);
  padding:10px 12px;display:flex;align-items:center;gap:9px;
}
.wrap .fh-card b{display:block;font-size:12px;color:var(--ink);line-height:1.2}
.wrap .fh-card small{display:block;font-size:9.5px;color:var(--ink-3)}
.wrap .fh-c1{left:3%;top:20%}
.wrap .fh-amt{margin-left:6px;font-size:12px;font-weight:800;color:#0b6b4f}
.wrap .fh-c2{right:2%;top:38%}
.wrap .fh-tick{
  width:26px;height:26px;border-radius:50%;flex:none;display:grid;place-items:center;
  background:#e7f8ee;color:#0b6b4f;font-weight:900;font-size:13px;
}
.wrap .fh-c3{left:4%;bottom:8%;display:block;min-width:150px}
.wrap .fh-lbl{font-size:8.5px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--brand)}
.wrap .fh-big{font-size:20px;font-weight:800;color:var(--ink);line-height:1.15;margin:2px 0 4px}
.wrap .fh-spark{width:100%;height:26px;display:block}
.wrap .fh-sub{font-size:8.5px;color:var(--ink-3)}
@media(max-width:900px){
  .wrap .fh-phone{width:180px}
  .wrap .fh-c1,.wrap .fh-c2,.wrap .fh-c3{display:none}
}
/* The phone box was sizing to 226px while its content ran to ~440, so the CTA
   and tab bar spilled past the stage and were clipped. Fix the height, clip
   inside the bezel, and let the body take the remaining space. */
.wrap .fh-phone{
  width:196px;height:330px;min-height:0;
  display:flex;flex-direction:column;overflow:hidden;
}
.wrap .fh-phone .pp-body{flex:1 1 auto;min-height:0;overflow:hidden;padding:8px 9px 8px}
.wrap .fh-phone .fh-hero-card{padding:9px 8px;margin-bottom:6px}
.wrap .fh-phone .fh-ball{font-size:18px}
.wrap .fh-phone .fh-row{padding:6px 8px;margin-bottom:4px}
.wrap .fh-phone .fh-meta{margin:5px 0 6px}
.wrap .fh-phone .fh-cta{padding:7px 0;font-size:11px}
.wrap .fh-phone .pp-tabbar{flex:none}
/* keep the floating cards off the handset */
.wrap .fh-c1{left:1%;top:16%}
.wrap .fh-c2{right:1%;top:42%}
.wrap .fh-c3{left:2%;bottom:6%}

/* ── freelancers hero: a connected story, not three loose cards ─────────────
   Numbered steps, dashed connectors into the phone, and a line of copy under
   each card saying what the freelancer GETS — the point is the sequence:
   parent books -> money lands -> admin does itself. */
.wrap .fh-wires{position:absolute;inset:0;width:100%;height:100%;z-index:1;pointer-events:none;mix-blend-mode:normal}
.wrap .fh-card{align-items:flex-start;padding:9px 11px;gap:8px;max-width:212px}
.wrap .fh-body{min-width:0}
.wrap .fh-card small{font-size:8.5px;color:var(--ink-3);letter-spacing:.01em}
.wrap .fh-card b{font-size:12px;color:var(--ink);line-height:1.25;margin-top:1px}
.wrap .fh-tagline{
  display:block;margin-top:4px;padding-top:4px;border-top:1px solid var(--line);
  font-size:8.5px;font-weight:800;color:var(--brand);
}
.wrap .fh-tagline.fh-green{color:#0b6b4f}
.wrap .fh-step{
  width:17px;height:17px;border-radius:50%;flex:none;
  display:grid;place-items:center;font-size:9px;font-weight:800;
  background:var(--brand);color:#fff;margin-top:1px;
}
.wrap .fh-amt{margin-left:auto;font-size:13px;font-weight:800;color:#0b6b4f;align-self:center}
.wrap .fh-c1{left:1%;top:12%}
.wrap .fh-c2{right:0%;top:40%}
.wrap .fh-c3{left:1%;bottom:9%}
.wrap .fh-spark{width:100%;height:22px;display:block;margin:4px 0 0}

/* the closing line ties the three steps together */
.wrap .fh-strip{
  position:absolute;left:50%;bottom:3%;transform:translateX(-50%);z-index:6;
  background:var(--brand);color:#fff;border-radius:999px;
  padding:6px 15px;font-size:10px;white-space:nowrap;
  box-shadow:0 14px 30px -16px rgba(9,20,54,.6);
}
.wrap .fh-strip b{color:var(--gold)}
@media(max-width:900px){.wrap .fh-wires,.wrap .fh-strip{display:none}}
/* 212 + 196 + 212 = 620px of content in a 525px stage, so the cards sat on the
   phone. Narrow the cards, slim the handset, and pull the steps to the edges. */
.wrap .fh-card{max-width:150px;padding:8px 9px;gap:6px}
.wrap .fh-card small{font-size:8px;line-height:1.3}
.wrap .fh-card b{font-size:10.5px}
.wrap .fh-tagline{font-size:7.5px}
.wrap .fh-step{width:15px;height:15px;font-size:8px}
.wrap .fh-amt{font-size:11px}
.wrap .fh-phone{width:172px;height:300px}
.wrap .fh-phone .fh-hero-card{padding:8px 7px;margin-bottom:5px}
.wrap .fh-phone .fh-ball{font-size:15px}
.wrap .fh-phone .fh-hero-card b{font-size:10px}
.wrap .fh-phone .fh-row{padding:5px 7px}
.wrap .fh-c1{left:0;top:6%}
.wrap .fh-c2{right:0;top:36%}
.wrap .fh-c3{left:0;bottom:14%}
.wrap .fh-strip{bottom:2%;font-size:9px;padding:5px 13px}

/* ── hero stage: no panel ───────────────────────────────────────────────────
   The white card was a container for its own sake. Dropping it puts the phone
   and the three steps straight on the hero chrome — but the connectors and the
   closing strip were drawn for a white ground, so they invert too. */
.wrap .fh-stage{
  background:none !important;
  border:0 !important;
  box-shadow:none !important;
  overflow:visible;
}
.wrap .fh-stage::before{
  background:radial-gradient(circle,rgba(255,255,255,.10),transparent 70%);
}
/* connectors: navy dashes vanished on navy */
.wrap .fh-wires path{stroke:rgba(255,255,255,.55) !important;opacity:1 !important}
.wrap .fh-wires marker circle{fill:#ffffff}
/* the closing line was brand-on-brand */
.wrap .fh-strip{
  background:rgba(255,255,255,.12);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.28);
  color:#fff;
  backdrop-filter:blur(2px);
}
.wrap .fh-strip b{color:var(--gold)}
/* cards keep their white fill — they now read as objects lifted off the blue */
.wrap .fh-card{box-shadow:0 22px 46px -22px rgba(9,20,54,.55)}
.wrap .fh-phone{box-shadow:0 30px 60px -24px rgba(9,20,54,.6)}

/* ── freelancers hero: colour the three steps, photo on the handset ─────────
   Three white cards on a blue ground read as one repeated object. Tinting
   each step separates them and lets the colour carry meaning (booking in /
   money / admin), while keeping dark ink on a light fill so nothing drops
   below contrast. Small print moves off --ink-3 because 9px grey on a tint
   sits under 3:1. */
.wrap .fh-c1{background:#fff6dd;border-color:#f0d089}
.wrap .fh-c2{background:#e7f6ee;border-color:#a9dcc2}
.wrap .fh-c3{background:#efeafc;border-color:#cbbef1}
.wrap .fh-card small{color:var(--ink-2)}

.wrap .fh-c1 .fh-step{background:var(--gold);color:#241a00}
.wrap .fh-c2 .fh-step{background:#0f7a43;color:#fff}
.wrap .fh-c3 .fh-step{background:#5a3fd0;color:#fff}

.wrap .fh-c1 .fh-tagline{color:#1d3a8f;border-top-color:#f0d089}
.wrap .fh-c2 .fh-tagline{color:#0b6b4f;border-top-color:#a9dcc2}
.wrap .fh-c3 .fh-tagline{color:#4a32b0;border-top-color:#cbbef1}
.wrap .fh-c3 .fh-spark polyline{stroke:#5a3fd0}
.wrap .fh-c3 .fh-spark circle{fill:#5a3fd0}

/* the listing image on the phone, with a scrim so the title stays readable
   over whatever part of the photo lands behind it */
.wrap .fh-shot{
  position:relative;border-radius:12px;overflow:hidden;
  margin-bottom:7px;aspect-ratio:16/10;flex:none;
}
.wrap .fh-shot img{width:100%;height:100%;object-fit:cover;object-position:50% 38%;display:block}
.wrap .fh-shot::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(9,20,54,0) 38%,rgba(9,20,54,.78) 100%);
}
.wrap .fh-shot-t{position:absolute;left:9px;right:9px;bottom:7px;z-index:2;color:#fff}
.wrap .fh-shot-t b{display:block;font-size:11px;line-height:1.2}
.wrap .fh-shot-t small{font-size:8.5px;color:rgba(255,255,255,.85)}
.wrap .fh-shot-tag{
  position:absolute;left:8px;top:8px;z-index:2;
  background:rgba(255,255,255,.92);color:var(--brand);
  font-size:8px;font-weight:800;border-radius:999px;padding:2px 7px;
}

/* The pill, title and location stacked on the photo were three things fighting
   the picture. Let the image be an image and put the name underneath. */
.wrap .fh-shot{aspect-ratio:16/9;margin-bottom:6px}
.wrap .fh-shot::after{display:none}
.wrap .fh-shot-cap{margin:0 1px 7px;flex:none}
.wrap .fh-shot-cap b{display:block;font-size:11px;color:var(--ink);line-height:1.2}
.wrap .fh-shot-cap small{font-size:8.5px;color:var(--ink-2)}
.wrap .fh-shot-cap small b.fh-left{display:inline;font-size:8.5px;color:#0b6b4f}

/* The handset is a fixed 330px with overflow:hidden, so a photo on a fixed
   aspect ratio pushed "Book & pay" — the point of the screen — off the bottom.
   Make the photo the one flexible row: it absorbs whatever height is left and
   everything below it is guaranteed to fit. */
.wrap .fh-shot{aspect-ratio:auto;flex:1 1 auto;min-height:46px}

/* .wrap .phone-pop .pp-cta (0,3,0) outranks .wrap .fh-cta (0,2,0) whatever the
   source order, so the button was mint, not the gold CTA. Match its weight. */
.wrap .fh-phone .fh-cta{background:var(--cta);color:var(--cta-ink)}
/* the wide crop was cutting the coach's head off */
.wrap .fh-shot img{object-position:50% 28%}

/* ── freelancers hero at +20%, with the photo given real room ───────────────
   Measured before this block: stage 525x394, phone 172x300, card 150x74 and
   the photo just 144x46 — flex:1 handed it whatever the fixed rows left over,
   which was almost nothing, so the crop ate the coach and the child. Scale the
   composition up and give the image a floor it can grow from instead. */
.wrap .fh-phone{width:206px;height:360px}
.wrap .fh-card{max-width:180px;padding:10px 11px;gap:8px}
.wrap .fh-card small{font-size:9px;line-height:1.3}
.wrap .fh-card b{font-size:12.5px}
.wrap .fh-tagline{font-size:9px}
.wrap .fh-step{width:18px;height:18px;font-size:9.5px}
.wrap .fh-amt{font-size:13px}
.wrap .fh-spark{height:26px}
/* the cards hang past the stage edges — overflow is visible now the panel is
   gone, so the wider cards don't have to steal width from the handset */
.wrap .fh-c1{left:-4%;top:3%}
.wrap .fh-c2{right:-4%;top:40%}
.wrap .fh-c3{left:-3%;bottom:4%}

.wrap .fh-phone .pp-body{padding:9px 10px 9px}
.wrap .fh-shot{min-height:130px;margin-bottom:7px}
.wrap .fh-shot-cap b{font-size:12.5px}
.wrap .fh-shot-cap small{font-size:9.5px}
.wrap .fh-shot-cap small b.fh-left{font-size:9.5px}
.wrap .fh-phone .fh-row{padding:7px 9px}
.wrap .fh-row b{font-size:11.5px}
.wrap .fh-row small{font-size:9.5px}
.wrap .fh-p{font-size:12px}
.wrap .fh-phone .fh-cta{padding:8px 0;font-size:12px}
.wrap .fh-shot{min-height:112px}
.wrap .fh-shot-cap small{line-height:1.45}
/* 17px of dead stage above and below the handset — spend it on the image */
.wrap .fh-phone{height:374px}
/* the taller handset now reaches the stage floor, so the closing line was
   sitting across its bottom edge — drop it clear (overflow is visible) */
.wrap .fh-strip{bottom:-34px;font-size:10px;padding:6px 15px}
/* card 1 also carries the amount, so it needs the extra width to stop
   "You didn't touch a thing" wrapping */
.wrap .fh-c1{max-width:206px}

/* Measured at 1280: stage 668–1193, phone 827–1033, card 1 647–853 — so step 1
   was sitting 26px on top of the handset. The text column ends at 634 and the
   grid gap is only 34px, so there is nowhere to go left; open the middle
   instead by shifting the phone right and pulling the side cards outward. */
.wrap .fh-phone{left:53%}
.wrap .fh-c1{max-width:190px;left:-5%}
.wrap .fh-c2{right:-7%}
.wrap .fh-c3{left:-4%}
.wrap .fh-amt-in{font-style:normal;color:#0b6b4f;white-space:nowrap}

/* ═══════════════════════════════════════════════════════════════════════════
   COMPANIES HERO — the loop: office builds it → parents book it → team runs it
   Same rules as the freelancers hero: no panel, everything on the blue chrome,
   connected. The old hero here was a dark #0e1636 SVG left over from the dark
   theme, which is why it read as a hole in the page.
   Coordinates below are % of the 525x394 stage, which is what the hero picture
   column measures at 1280.
   ═══════════════════════════════════════════════════════════════════════════ */
.wrap .ch-stage{position:relative;aspect-ratio:4/3;width:100%;overflow:visible}
.wrap .ch-ring{position:absolute;inset:0;width:100%;height:100%;z-index:1;pointer-events:none}
.wrap .ch-ring path{stroke:rgba(255,255,255,.42);stroke-width:1.6;stroke-dasharray:6 7;
  vector-effect:non-scaling-stroke}

.wrap .ch-num{
  position:absolute;left:-9px;top:-9px;z-index:6;
  width:24px;height:24px;border-radius:50%;display:grid;place-items:center;
  font-size:12px;font-weight:800;color:#fff;background:var(--brand);
  box-shadow:0 0 0 3px rgba(255,255,255,.9),0 8px 18px -8px rgba(9,20,54,.7);
}

/* 1 — laptop, top left */
.wrap .ch-lap{position:absolute;z-index:3;left:-3.4%;top:9%;width:38%}
.wrap .ch-lapscr{background:#0d1430;border-radius:11px;padding:5px 5px 6px;
  box-shadow:0 26px 54px -22px rgba(9,20,54,.65)}
.wrap .ch-lapin{background:#fff;border-radius:6px;overflow:hidden;aspect-ratio:16/10}
.wrap .ch-lapbase{height:8px;width:110%;margin-left:-5%;border-radius:0 0 8px 8px;
  background:linear-gradient(180deg,#cdddf7,#8fa9d8)}

/* 2 — phone, right */
.wrap .ch-phone{
  position:absolute;left:auto;right:auto;top:16%;left:74%;bottom:auto;
  width:132px !important;height:230px !important;min-height:0 !important;
  z-index:4;display:flex;flex-direction:column;overflow:hidden;
  border-radius:19px;padding:4px;
  box-shadow:0 30px 60px -24px rgba(9,20,54,.65);
}
.wrap .ch-phone .pp-status{padding:4px 8px 2px;font-size:7px;border-radius:15px 15px 0 0}
.wrap .ch-phone .pp-status::after{width:26px;height:6px;top:3px}
.wrap .ch-phone .pp-bar{padding:5px 8px;font-size:9px}
.wrap .ch-phone .pp-body{flex:1;min-height:0;overflow:hidden;padding:7px;display:flex;flex-direction:column}
.wrap .ch-phone .pp-tabbar{padding:4px 7px 3px;flex:none}
.wrap .ch-phone .pp-tabbar i{font-size:6.5px}
.wrap .ch-phone .pp-homewrap{border-radius:0 0 15px 15px;padding:3px 0 4px}
.wrap .ch-phone .pp-home{width:40px;height:3px}
.wrap .ch-num-p{left:-11px;top:-6px}
.wrap .ch-shot{border-radius:9px;overflow:hidden;flex:1 1 auto;min-height:40px;margin-bottom:6px}
.wrap .ch-shot img{width:100%;height:100%;object-fit:cover;object-position:50% 42%;display:block}
.wrap .ch-cap{flex:none;margin-bottom:7px}
.wrap .ch-cap b{display:block;font-size:10px;color:var(--ink);line-height:1.2}
.wrap .ch-cap small{font-size:8px;color:var(--ink-2)}
.wrap .ch-cap small b.ch-left{display:inline;font-size:8px;color:#0b6b4f}
.wrap .ch-phone .ch-cta{margin-top:0;flex:none;padding:7px 0;font-size:10.5px;
  background:var(--cta);color:var(--cta-ink);border-radius:999px;text-align:center;font-weight:800}

/* 3 — the session itself, bottom left */
.wrap .ch-pic{position:absolute;z-index:3;left:4%;top:64%;width:32.5%;
  border-radius:14px;overflow:visible}
.wrap .ch-pic img{width:100%;aspect-ratio:4/3;object-fit:cover;object-position:50% 45%;
  display:block;border-radius:14px;
  box-shadow:0 26px 52px -22px rgba(9,20,54,.65)}

/* the three captions */
.wrap .ch-lbl{position:absolute;z-index:5;background:#fff;border-radius:12px;
  padding:9px 11px;box-shadow:0 22px 46px -22px rgba(9,20,54,.55)}
.wrap .ch-lbl b{display:block;font-size:11.5px;color:var(--ink);line-height:1.2}
.wrap .ch-lbl small{display:block;margin-top:3px;font-size:8.5px;color:var(--ink-2);line-height:1.4}
.wrap .ch-l1{left:0;top:47%;width:34%;background:#fff6dd}
.wrap .ch-l2{left:70%;top:73%;width:31%;background:#e7f6ee}
.wrap .ch-l3{left:39%;top:71%;width:29%;background:#efeafc}

/* the hub the loop turns around */
.wrap .ch-hub{position:absolute;z-index:2;left:40%;top:46%;width:30%;
  text-align:center;border-radius:14px;padding:9px 8px;
  background:rgba(255,255,255,.12);box-shadow:inset 0 0 0 1px rgba(255,255,255,.28);
  backdrop-filter:blur(2px);color:#fff}
.wrap .ch-hub b{display:block;font-size:12px;color:var(--gold)}
.wrap .ch-hub small{font-size:8.5px;color:rgba(255,255,255,.85)}

.wrap .ch-strip{position:absolute;left:50%;bottom:-34px;transform:translateX(-50%);z-index:6;
  background:rgba(255,255,255,.12);box-shadow:inset 0 0 0 1px rgba(255,255,255,.28);
  backdrop-filter:blur(2px);color:#fff;border-radius:999px;
  padding:6px 15px;font-size:10px;white-space:nowrap}
.wrap .ch-strip b{color:var(--gold)}

/* the fixed-px handset can't share a narrow stage with three cards */
@media(max-width:900px){
  .wrap .ch-ring,.wrap .ch-lbl,.wrap .ch-hub,.wrap .ch-strip,.wrap .ch-pic{display:none}
  .wrap .ch-lap{position:static;width:100%}
  .wrap .ch-phone{display:none}
}

/* mini-app furniture for the device screens (was only defined inside the
   mockups page's own <style>, so the companies laptop rendered blank) */
.wrap .ma{display:grid;grid-template-columns:52px 1fr;height:100%}
.wrap .ma-side{background-image:var(--dots),linear-gradient(165deg,#16306e,#3f78d8);
  background-size:12px 12px,cover;background-repeat:repeat,no-repeat;padding:7px 5px}
.wrap .ma-side b{display:block;font-size:6.5px;color:#fff;margin-bottom:6px}
.wrap .ma-side i{display:block;font-style:normal;font-size:5.5px;color:rgba(255,255,255,.75);
  padding:3px 4px;border-radius:3px;margin-bottom:1px}
.wrap .ma-side i.on{background:#fff;color:var(--brand);font-weight:800}
.wrap .ma-main{padding:7px;background:var(--bg);min-width:0;display:flex;flex-direction:column;gap:5px}
.wrap .ma-hero{background-image:var(--dots),linear-gradient(120deg,#1d3a8f,#3f78d8);
  background-size:12px 12px,cover;background-repeat:repeat,no-repeat;
  border-radius:5px;padding:6px 8px;color:#fff;display:flex;align-items:center;flex:none}
.wrap .ma-hero b{font-size:8px;color:#fff}
.wrap .ma-hero span{margin-left:auto;font-size:5.5px;background:var(--gold);color:#241a00;
  border-radius:999px;padding:2px 6px;font-weight:800}
.wrap .ma-rows{background:#fff;border:1px solid var(--line);border-radius:5px;padding:5px 6px;flex:1;min-height:0}
.wrap .ma-row{display:flex;gap:5px;align-items:center;padding:3px 0;
  border-top:1px solid var(--line);font-size:6px;color:var(--ink-2)}
.wrap .ma-row:first-child{border-top:0}
.wrap .ma-row b{color:var(--ink);font-size:6.5px}
.wrap .ma-row em{font-style:normal;color:var(--ink-3)}
.wrap .ma-row span{margin-left:auto;font-weight:800;color:var(--brand)}
.wrap .ma-row span.ok{color:#0b6b4f}
.wrap .ma-foot{display:flex;font-size:5.5px;color:var(--ink-3);flex:none}
.wrap .ma-foot b{margin-left:auto;color:var(--brand);font-size:5.5px}
/* step 2's caption overlapped the handset by 7px */
.wrap .ch-l2{top:78%}
/* .ch-phone has overflow:hidden to clip its own screen, so its step badge has
   to be a sibling on the stage rather than a child */
.wrap .ch-n2{position:absolute;left:71.2%;top:13.5%}

/* ── companies hero, second pass ────────────────────────────────────────────
   The ring-behind-everything plus a floating hub made the middle read as
   clutter, and the captions were crowding the handset. Straighten it into a
   clear 1 → 2 → 3 cascade with each caption directly under its own device,
   and let a single arc curve back up the left edge to close the loop. */
.wrap .ch-lap{left:-3%;top:6%;width:40%}
.wrap .ch-l1{left:0;top:44%;width:36%}
.wrap .ch-pic{left:0;top:62%;width:36%}
.wrap .ch-l3{left:38%;top:62%;width:28%}
.wrap .ch-phone{left:73%;top:12%}
.wrap .ch-n2{left:70.2%;top:9.5%}
.wrap .ch-l2{left:68%;top:74%;width:31%}

/* ═══════════════════════════════════════════════════════════════════════════
   COMPANIES HERO — two slides: the pitch, then how it works.
   Slide 2 gets the whole card width, so the three steps run left-to-right in a
   flex row instead of the absolutely-positioned cascade. That also removes the
   collision class of bug entirely — nothing is placed by coordinate any more.
   ═══════════════════════════════════════════════════════════════════════════ */
.wrap .hero-slider{padding-bottom:56px}
.wrap .hs-view{overflow:hidden;border-radius:20px}
.wrap .hs-track{display:flex;transition:transform .7s cubic-bezier(.4,0,.2,1);will-change:transform}
.wrap .hs-slide{flex:0 0 100%;min-width:100%;min-height:470px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:26px 20px;text-align:center}
@media(prefers-reduced-motion:reduce){.wrap .hs-track{transition:none}}

/* slide 1 — the pitch, centred */
.wrap .hs-say .head{font-size:clamp(34px,5vw,62px);line-height:1.03;margin:14px 0 0}
.wrap .hs-say .sub{max-width:60ch;margin:18px auto 0 !important;font-size:17px}
.wrap .hs-say .hero-cta{justify-content:center !important;margin-top:26px}

/* slide 2 — the flow */
.wrap .ch-flow{display:flex;align-items:flex-start;justify-content:center;gap:10px;width:100%}
.wrap .ch-step{position:relative;flex:1 1 0;min-width:0;max-width:340px;
  display:flex;flex-direction:column;align-items:center}
.wrap .ch-arrow{flex:0 0 74px;align-self:center;margin-top:-46px}
.wrap .ch-arrow svg{width:100%;height:auto;display:block}

.wrap .ch-step .ch-num{position:static;margin-bottom:10px;width:30px;height:30px;font-size:14px}

/* laptop */
.wrap .ch-lap{position:static;width:100%;max-width:330px}
/* phone — the flow row sizes it, so drop the absolute placement */
.wrap .ch-flow .ch-phone{position:static;width:158px !important;height:276px !important;
  border-radius:22px;padding:5px}
.wrap .ch-flow .ch-phone .pp-bar{font-size:10px}
.wrap .ch-flow .ch-cap b{font-size:11.5px}
.wrap .ch-flow .ch-cap small{font-size:9px}
.wrap .ch-flow .ch-phone .ch-cta{font-size:11.5px;padding:8px 0}
/* photo */
.wrap .ch-flow .ch-pic{position:static;width:100%;max-width:330px}

/* captions sit under their own step, so they can't collide with anything */
.wrap .ch-flow .ch-lbl{position:static;margin-top:16px;width:100%;max-width:310px;text-align:left}
.wrap .ch-flow .ch-lbl b{font-size:13px}
.wrap .ch-flow .ch-lbl small{font-size:10px}

.wrap .hs-show .ch-strip{position:static;transform:none;margin-top:26px;font-size:11.5px;padding:7px 17px}

.wrap .hs-dots{display:flex;justify-content:center;gap:9px;margin-top:20px}
.wrap .hs-dots button{width:9px;height:9px;padding:0;border:0;border-radius:50%;cursor:pointer;
  background:rgba(255,255,255,.32);transition:background .2s,width .2s}
.wrap .hs-dots button.on{background:var(--gold);width:26px;border-radius:999px}

@media(max-width:900px){
  .wrap .ch-flow{flex-direction:column;align-items:center;gap:22px}
  .wrap .ch-arrow{display:none}
  .wrap .ch-step{max-width:340px;width:100%}
  .wrap .hs-slide{min-height:0;padding:20px 12px}
}
/* the three devices are different heights, so the captions were hanging at
   three different depths — stretch the columns and drop the labels to a
   common baseline */
.wrap .ch-flow{align-items:stretch}
.wrap .ch-flow .ch-lbl{margin-top:auto}
.wrap .ch-step > .ch-lap,.wrap .ch-step > .ch-pic,.wrap .ch-flow .ch-phone{margin-bottom:16px}

/* ── companies slide 2: joined, not plonked ─────────────────────────────────
   Three objects centred in three empty columns with 74px arrow stubs floating
   in 200px gaps read as unrelated. Give them one continuous process rail to
   stand on: devices bottom-aligned on a common floor, numbered badges sitting
   ON the line, captions hanging below it. */
.wrap .ch-flow{position:relative;display:flex;align-items:flex-start;
  justify-content:center;gap:26px;width:100%;max-width:1040px;margin:0 auto}
.wrap .ch-step{position:relative;flex:1 1 0;min-width:0;max-width:340px;
  display:flex;flex-direction:column;align-items:center}

/* the rail, and the two chevrons that give it direction */
.wrap .ch-rail{position:absolute;left:5%;right:5%;top:285px;height:0;z-index:0;
  border-top:2px dashed rgba(255,255,255,.34)}
.wrap .ch-rail i{position:absolute;top:-6px;width:0;height:0;
  border-left:10px solid rgba(255,255,255,.7);
  border-top:6px solid transparent;border-bottom:6px solid transparent}

/* every device stands on the same floor, whatever its own height */
.wrap .ch-dev{height:285px;width:100%;display:flex;align-items:flex-end;justify-content:center}

/* the badge sits on the rail rather than floating in space above the device */
.wrap .ch-step .ch-num{position:relative;left:auto;top:auto;z-index:2;
  margin:-17px 0 0;width:34px;height:34px;font-size:15px;
  box-shadow:0 0 0 5px var(--brand),0 10px 22px -8px rgba(9,20,54,.75)}

.wrap .ch-flow .ch-lbl{margin-top:20px}
.wrap .ch-step > .ch-lap,.wrap .ch-step > .ch-pic,.wrap .ch-flow .ch-phone{margin-bottom:0}
.wrap .ch-dev .ch-lap,.wrap .ch-dev .ch-pic{width:100%;max-width:330px}

/* the listings box grows past its flex basis and shoves the footer out */
.wrap .ma-rows{overflow:hidden}

@media(max-width:900px){
  .wrap .ch-rail{display:none}
  .wrap .ch-dev{height:auto}
  .wrap .ch-step .ch-num{margin:12px 0 0}
}
/* the badges were --brand (#1d3a8f) with a --brand ring, sitting on the blue
   hero — navy on navy, so they read as dark blobs. And the devices ran right
   down onto them. White fill, navy numeral, and 15px of air above the rail. */
.wrap .ch-dev{height:270px}
.wrap .ch-step .ch-num{background:#fff;color:var(--brand);
  box-shadow:0 8px 20px -8px rgba(9,20,54,.8);margin:-2px 0 0}
.wrap .ch-rail{top:285px}

/* ── companies hero: four slides ────────────────────────────────────────────
   The three white caption cards parked in a row under the devices were the
   "plonked" part — detached boxes with no relationship to the art above them.
   Each slide now carries its copy as a proper heading in the hero's own voice,
   and the supporting numbers are glass chips on the chrome rather than cards. */
.wrap .hs-slide{justify-content:flex-start;padding:34px 20px 26px;gap:22px;min-height:520px}
.wrap .hs-say{justify-content:center}

.wrap .hs-head{max-width:70ch;margin:0 auto}
.wrap .hs-head h2{font-size:clamp(25px,3.3vw,40px);font-weight:800;line-height:1.08;
  color:#fff;margin:12px 0 0}
.wrap .hs-head h2 em{color:var(--gold);font-style:normal}
.wrap .hs-head p{margin:12px auto 0;font-size:15px;line-height:1.55;
  color:rgba(255,255,255,.82);max-width:68ch}

.wrap .hs-art{display:flex;align-items:center;justify-content:center;gap:26px;width:100%;
  flex:1;min-height:0}
.wrap .hs-art .ch-lap{position:static;flex:none}

/* supporting numbers: glass on the chrome, not white cards */
.wrap .hs-facts{display:flex;flex-direction:column;gap:14px;flex:0 1 190px;min-width:0}
.wrap .hs-fact{background:rgba(255,255,255,.10);border-radius:13px;padding:12px 14px;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.22);backdrop-filter:blur(2px)}
.wrap .hs-fact b{display:block;font-size:22px;font-weight:800;color:var(--gold);line-height:1.1}
.wrap .hs-fact small{display:block;margin-top:3px;font-size:11px;color:rgba(255,255,255,.82);line-height:1.35}

/* the phone-and-photo pair */
.wrap .hs-art-pair .ch-phone{position:static;flex:none;
  width:186px !important;height:326px !important;border-radius:24px;padding:6px}
.wrap .hs-art-pair .ch-phone .pp-bar{font-size:10.5px}
.wrap .hs-art-pair .ch-cap b{font-size:12.5px}
.wrap .hs-art-pair .ch-cap small{font-size:10px}
.wrap .hs-art-pair .ch-phone .ch-cta{font-size:12.5px;padding:9px 0}
.wrap .hs-art-pair .ch-pic{position:static;flex:0 1 470px;max-width:470px}
.wrap .hs-link{flex:0 0 96px}
.wrap .hs-link svg{width:100%;height:12px;display:block}

/* the reconcile ledger needs a status chip on each row */
.wrap .ma-row u{text-decoration:none;flex:none;margin-left:8px;font-size:5.5px;font-weight:800;
  border-radius:999px;padding:2px 6px;background:#e7f6ee;color:#0b6b4f}
.wrap .ma-row u.warn{background:#fff7e6;color:#8a5a00}
.wrap .ma-row span{margin-left:auto}

@media(max-width:900px){
  .wrap .hs-facts{display:none}
  .wrap .hs-art,.wrap .hs-art-pair{flex-direction:column;gap:18px}
  .wrap .hs-link{display:none}
  .wrap .hs-art .ch-lap{width:100% !important;max-width:420px}
  .wrap .hs-slide{min-height:0;padding:20px 12px}
}
/* bigger art across the slides */
.wrap .hs-art-pair .ch-phone{width:212px !important;height:372px !important;border-radius:27px;padding:7px}
.wrap .hs-art-pair .ch-phone .pp-bar{font-size:11.5px}
.wrap .hs-art-pair .ch-cap b{font-size:14px}
.wrap .hs-art-pair .ch-cap small{font-size:11px}
.wrap .hs-art-pair .ch-phone .ch-cta{font-size:14px;padding:10px 0}
.wrap .hs-art-pair .ch-pic{flex:0 1 560px;max-width:560px}
.wrap .hs-facts{flex:0 1 178px}
.wrap .hs-art{gap:22px}
/* .wrap .ch-lap carried max-width:330px from the old rail layout, which beats
   the inline width on the slides — the art never actually got bigger */
.wrap .hs-art .ch-lap{max-width:none;width:auto}
.wrap .hs-art .ch-pic{max-width:none}
.wrap .hs-art-pair .ch-pic{max-width:560px}
/* the mini-app was drawn for a 200px laptop; at 530px its 6px type is unreadable */
.wrap .hs-art .ma{grid-template-columns:78px 1fr}
.wrap .hs-art .ma-side{padding:11px 8px}
.wrap .hs-art .ma-side b{font-size:9px;margin-bottom:9px}
.wrap .hs-art .ma-side i{font-size:8px;padding:5px 6px;border-radius:4px;margin-bottom:2px}
.wrap .hs-art .ma-main{padding:11px;gap:8px}
.wrap .hs-art .ma-hero{padding:9px 12px;border-radius:7px}
.wrap .hs-art .ma-hero b{font-size:12px}
.wrap .hs-art .ma-hero span{font-size:8px;padding:3px 9px}
.wrap .hs-art .ma-rows{padding:8px 10px;border-radius:7px}
.wrap .hs-art .ma-row{padding:5px 0;font-size:9px;gap:8px}
.wrap .hs-art .ma-row b{font-size:9.5px}
.wrap .hs-art .ma-row u{font-size:8px;padding:3px 8px}
.wrap .hs-art .ma-foot,.wrap .hs-art .ma-foot b{font-size:8.5px}

/* ── slides: bigger art, no dead space ──────────────────────────────────────
   The heading sat marooned above a small device with a band of empty blue
   between them. Grow the art to take that space, and let the list rows share
   the screen height instead of pooling at the top and leaving a white void. */
.wrap .hs-slide{padding:26px 20px 22px;gap:14px}
.wrap .hs-head p{margin-top:10px}
.wrap .hs-art-pair .ch-pic{flex:0 1 660px;max-width:660px}
.wrap .hs-art-pair .ch-phone{width:250px !important;height:440px !important;border-radius:31px;padding:8px}
.wrap .hs-art-pair .ch-phone .pp-bar{font-size:13px}
.wrap .hs-art-pair .ch-cap b{font-size:16px}
.wrap .hs-art-pair .ch-cap small{font-size:12px}
.wrap .hs-art-pair .ch-phone .ch-cta{font-size:16px;padding:12px 0}
.wrap .hs-facts{flex:0 1 168px;gap:16px}
.wrap .hs-fact b{font-size:26px}

/* rows grow to fill the screen rather than leaving white below the last one */
.wrap .hs-art .ma-rows{display:flex;flex-direction:column}
.wrap .hs-art .ma-row{flex:1 1 0;min-height:0}

/* ── kill the dead band above the slides ────────────────────────────────────
   section.hero carries 76px of top padding meant for the old two-column hero,
   and slides shorter than the tallest one dumped their slack in one lump.
   Trim the section padding and centre each slide so any remaining slack is
   split evenly rather than sitting as a band above the heading. */
.wrap section.hero.hero-slider{padding-top:26px;padding-bottom:30px}
.wrap .hero-slider .hs-slide{min-height:0;justify-content:center;padding:18px 20px}
.wrap .hero-slider .hs-dots{margin-top:14px}
/* quicker hand-off between slides to match the faster rotation */
.wrap .hs-track{transition:transform .45s cubic-bezier(.4,0,.2,1)}
/* slide 1 was 218px of air top and bottom — short pitch copy centred in a box
   sized by the tallest slide. Bigger type and a row of numbers fill it. */
.wrap .hs-say .head{font-size:clamp(38px,5.6vw,70px)}
.wrap .hs-say .sub{font-size:18px;max-width:64ch}
.wrap .hs-facts-row{flex-direction:row;flex:none;gap:14px;margin-top:30px;
  flex-wrap:wrap;justify-content:center}
.wrap .hs-facts-row .hs-fact{flex:0 0 auto;min-width:158px;text-align:center}
@media(max-width:900px){.wrap .hs-facts-row{display:flex}}
/* slides size to their own content; the view animates between those heights */
.wrap .hs-track{align-items:flex-start}
.wrap .hs-view{transition:height .45s cubic-bezier(.4,0,.2,1)}
.wrap .hero-slider .hs-slide{justify-content:flex-start}

/* ── even the slide heights ─────────────────────────────────────────────────
   Now the view sizes to its slide, the range was 437–713px, so the whole page
   below jolted 276px every three seconds. Give the pitch slide room to breathe
   and trim the tallest so they all land in a narrow band. */
.wrap .hs-say{padding:46px 20px 44px}
.wrap .hs-say .sub{margin-top:24px !important}
.wrap .hs-say .hero-cta{margin-top:34px}
.wrap .hs-facts-row{margin-top:40px}
.wrap .hs-art-pair .ch-pic{flex:0 1 560px;max-width:560px}
.wrap .hs-art-pair .ch-phone{width:228px !important;height:402px !important}
.wrap .hs-art .ch-lap{width:600px !important}

/* ── hard cap on the hero ───────────────────────────────────────────────────
   Letting the view size to its slide meant the tallest one ran to 713px and
   the section overran the fold. Fix the stage instead and size every device to
   fit inside it, so the hero is the same modest height whatever is showing. */
.wrap .hs-view{height:496px;transition:none}
.wrap .hero-slider .hs-slide{height:496px;min-height:0;padding:14px 20px;
  justify-content:center;overflow:hidden}
.wrap .hs-say{padding:14px 20px}

.wrap .hs-head h2{font-size:clamp(23px,2.8vw,34px)}
.wrap .hs-head p{font-size:14px;margin-top:9px}
.wrap .hs-say .head{font-size:clamp(32px,4.4vw,54px)}
.wrap .hs-say .sub{font-size:16px;margin-top:16px !important}
.wrap .hs-say .hero-cta{margin-top:22px}
.wrap .hs-facts-row{margin-top:24px}
.wrap .hs-facts-row .hs-fact{min-width:140px;padding:9px 12px}
.wrap .hs-facts-row .hs-fact b{font-size:21px}

/* the art gets a fixed bay; devices are sized to land inside it */
.wrap .hs-art{height:330px;flex:none;align-items:center}
.wrap .hs-art .ch-lap{width:510px !important}
.wrap .hs-facts{flex:0 0 158px;gap:12px}
.wrap .hs-fact b{font-size:22px}
.wrap .hs-fact small{font-size:10.5px}

.wrap .hs-art-pair .ch-phone{width:187px !important;height:330px !important;
  border-radius:24px;padding:6px}
.wrap .hs-art-pair .ch-phone .pp-bar{font-size:11px}
.wrap .hs-art-pair .ch-cap b{font-size:13px}
.wrap .hs-art-pair .ch-cap small{font-size:10px}
.wrap .hs-art-pair .ch-phone .ch-cta{font-size:13px;padding:9px 0}
.wrap .hs-art-pair .ch-pic{flex:0 0 auto;height:100%;max-width:none}
.wrap .hs-art-pair .ch-pic img{height:100%;width:auto;aspect-ratio:4/3}

@media(max-width:900px){
  .wrap .hs-view,.wrap .hero-slider .hs-slide{height:auto}
  .wrap .hs-art{height:auto}
  .wrap .hs-art .ch-lap{width:100% !important;max-width:420px}
  .wrap .hs-art-pair .ch-pic{height:auto}
  .wrap .hs-art-pair .ch-pic img{height:auto;width:100%}
}
/* slides 4 and 5 carry longer paragraphs and overran the fixed stage by 24px */
.wrap .hs-art{height:318px}
.wrap .hs-art .ch-lap{width:490px !important}
.wrap .hs-art-pair .ch-phone{width:180px !important;height:318px !important}
.wrap .hs-head p{font-size:13.5px;line-height:1.5}
/* the chips carry a function and its saving now, so the label needs room */
.wrap .hs-fact b{font-size:17px;line-height:1.15}
.wrap .hs-fact small{font-size:10.5px;line-height:1.4;margin-top:4px}
.wrap .hs-facts{flex:0 0 176px}
.wrap .hs-facts-row .hs-fact{min-width:180px;max-width:230px}
.wrap .hs-facts-row .hs-fact b{font-size:19px}
/* last 16px: slide 4's paragraph runs a line longer than the rest */
.wrap .hs-art{height:306px}
.wrap .hs-art .ch-lap{width:474px !important}
.wrap .hs-art-pair .ch-phone{width:174px !important;height:306px !important}
.wrap .hs-say .hero-cta{margin-top:18px}
.wrap .hs-facts-row{margin-top:20px}

/* ── the climbing photo: just the instructor and the climber ────────────────
   company-3.jpg is 1600x1073 and the watching group runs to x≈0.58 of the
   frame. A 5:8 portrait box pinned to the right edge shows 0.58→1.0 — the two
   of them and the wall, nobody else. Then feather the edges so it sits IN the
   page instead of on it, and let the shadow follow the subject, not a box. */
.wrap .hs-art-pair .ch-pic{flex:0 0 auto;height:100%;max-width:none;border-radius:0;overflow:visible}
.wrap .hs-art-pair .ch-pic img{
  height:100%;width:auto;aspect-ratio:5/8;object-fit:cover;object-position:100% 46%;
  border-radius:0;box-shadow:none;
  -webkit-mask-image:linear-gradient(to right,transparent,#000 16%,#000 100%),
                     linear-gradient(to bottom,transparent,#000 11%,#000 88%,transparent);
  -webkit-mask-composite:source-in;
  mask-image:linear-gradient(to right,transparent,#000 16%,#000 100%),
             linear-gradient(to bottom,transparent,#000 11%,#000 88%,transparent);
  mask-composite:intersect;
  filter:drop-shadow(0 26px 40px rgba(9,20,54,.55));
}
/* the handset shows the same session, cropped to the climber */
.wrap .ch-phone .ch-shot img{object-position:88% 34%}

/* a little more room so the photo can be worth looking at */
.wrap .hs-view,.wrap .hero-slider .hs-slide{height:540px}
.wrap .hs-art{height:330px}
.wrap .hs-art .ch-lap{width:510px !important}
.wrap .hs-art-pair{height:356px}
.wrap .hs-art-pair .ch-phone{width:202px !important;height:356px !important}
.wrap .hs-link{flex:0 0 74px}
/* .ch-pic was a 384px block wrapping a 223px image, pushing the row 17px wide */
.wrap .hs-art-pair .ch-pic{width:auto;display:flex}
/* The phone screen is landscape, so object-fit:cover still showed ~83% of the
   frame width — the whole watching group. Zoom inside the frame instead so it
   lands on the belayer and the climber, same as the big photo. */
.wrap .ch-phone .ch-shot{overflow:hidden}
.wrap .ch-phone .ch-shot img{transform:scale(1.75);transform-origin:78% 38%;object-position:50% 50%}
/* feather the outer edge too, so the photo doesn't end on a hard vertical cut */
.wrap .hs-art-pair .ch-pic img{
  -webkit-mask-image:linear-gradient(to right,transparent,#000 16%,#000 94%,transparent),
                     linear-gradient(to bottom,transparent,#000 11%,#000 88%,transparent);
  mask-image:linear-gradient(to right,transparent,#000 16%,#000 94%,transparent),
             linear-gradient(to bottom,transparent,#000 11%,#000 88%,transparent);
}
/* the chips carry a real sentence now, so give the label room and settle the
   type: promise on top, mechanic beneath */
.wrap .hs-fact b{font-size:15.5px;line-height:1.2;letter-spacing:-.01em}
.wrap .hs-fact small{font-size:10.5px;line-height:1.45;margin-top:5px;color:rgba(255,255,255,.86)}
.wrap .hs-facts{flex:0 0 196px}
.wrap .hs-facts-row .hs-fact{min-width:206px;max-width:246px}
.wrap .hs-facts-row .hs-fact b{font-size:17px}
/* .hs-facts flex-basis is a width in the side columns (row-direction parent)
   but a height in slide 1's row (column-direction parent) — which is why those
   four chips were 196px tall with nothing in the bottom half */
.wrap .hs-facts-row{flex:0 0 auto !important}
/* the promise line is a phrase now, not a label — let it wrap to two lines */
.wrap .hs-fact b{font-size:14.5px;line-height:1.22;text-wrap:balance}
.wrap .hs-fact small{font-size:10px;line-height:1.45}
.wrap .hs-facts-row .hs-fact b{font-size:16px}
.wrap .hs-facts-row .hs-fact small{font-size:10.5px}
/* two chips in a 306px bay left ~90px of dead blue underneath — let them share
   the full height and centre their own text so they read as deliberate */
.wrap .hs-facts{justify-content:center}
.wrap .hs-facts:not(.hs-facts-row) .hs-fact{flex:1 1 0;display:flex;flex-direction:column;
  justify-content:center;padding:14px 15px}
/* stretch the chip columns to the device height so the pair reads as a matched
   set rather than two small boxes floating beside a big screen */
.wrap .hs-art{align-items:stretch}
.wrap .hs-art .ch-lap,.wrap .hs-art .ch-phone,.wrap .hs-art .ch-pic,.wrap .hs-link{align-self:center}

/* ── make the laptop read as a laptop ───────────────────────────────────────
   A rounded dark rectangle over a thin bar looked like a floating card. Give
   the lid a proper chin with a camera, and the base a wider deck with the lip
   notch and a hinge shadow under it. */
.wrap .ch-lapscr{position:relative;background:#0d1430;border-radius:13px;
  padding:9px 9px 16px;box-shadow:0 26px 54px -22px rgba(9,20,54,.7),inset 0 0 0 1px rgba(255,255,255,.07)}
.wrap .ch-lapscr::after{content:"";position:absolute;left:50%;top:4px;transform:translateX(-50%);
  width:4px;height:4px;border-radius:50%;background:#39456b}
.wrap .ch-lapin{border-radius:4px}
.wrap .ch-lapbase{position:relative;height:13px;width:120%;margin-left:-10%;
  border-radius:2px 2px 12px 12px;
  background:linear-gradient(180deg,#eaf1fd 0%,#c3d2ec 46%,#93a8cd 100%);
  box-shadow:0 16px 26px -14px rgba(9,20,54,.65)}
.wrap .ch-lapbase::before{content:"";position:absolute;left:50%;top:0;transform:translateX(-50%);
  width:22%;height:5px;border-radius:0 0 7px 7px;background:rgba(9,20,54,.22)}

/* ── SCHEDULE: the real ScheduleApp shape ───────────────────────────────────
   Date columns across, listing → role rows down, navy gradient header. Blue
   block = assigned, pink = Unfilled — in the product colour is state, not role;
   the role colour only shows on the row header's dot and left bar. */
.wrap .sch-main{gap:5px}
.wrap .sch-tabs{display:flex;gap:3px;background:var(--panel);border-radius:7px;padding:3px;flex:none}
.wrap .sch-tabs i{font-style:normal;font-size:7.5px;font-weight:800;color:var(--ink-2);
  border-radius:5px;padding:3px 8px}
.wrap .sch-tabs i.on{background:#fff;color:#1d3a8f;box-shadow:0 1px 3px rgba(16,24,64,.08)}
.wrap .sch{border:1px solid var(--line);border-radius:7px;overflow:hidden;background:#fff;flex:1;min-height:0}
.wrap .sch-head{display:grid;grid-template-columns:repeat(5,1fr);
  background:linear-gradient(120deg,#16306e,#2f6bd8);color:#fff}
.wrap .sch-head div{padding:4px 6px;text-align:left}
.wrap .sch-head em{display:block;font-style:normal;font-size:5.5px;font-weight:800;
  letter-spacing:.08em;color:rgba(255,255,255,.7)}
.wrap .sch-head b{font-size:8px}
.wrap .sch-listing{display:flex;align-items:center;gap:5px;background:var(--panel);
  border-bottom:1px solid var(--line);padding:4px 7px;font-size:8px;font-weight:800;color:var(--ink)}
.wrap .sch-listing small{font-size:6px;font-weight:600;color:var(--ink-3)}
.wrap .sch-listing span{margin-left:auto;font-size:6.5px;font-weight:700;color:var(--ink-3)}
.wrap .sch-role{display:flex;align-items:center;gap:4px;padding:3px 7px;
  border-bottom:1px solid #eef2f8;box-shadow:inset 3px 0 0 var(--rc);
  font-size:7.5px;font-weight:800;color:var(--rc)}
.wrap .sch-role i{width:5px;height:5px;border-radius:50%;background:var(--rc)}
.wrap .sch-tot{display:grid;grid-template-columns:repeat(5,1fr);border-bottom:1px solid #eef2f8}
.wrap .sch-tot span{padding:1px 6px;font-size:6px;font-weight:700;color:var(--ink-3)}
.wrap .sch-cells{display:grid;grid-template-columns:repeat(5,1fr);border-bottom:1px solid #eef2f8}
.wrap .sch-cells > div{border-right:1px solid #eef2f8;padding:3px;min-height:34px}
.wrap .sch-cells > div:last-child{border-right:0}
.wrap .shf{border-radius:4px;padding:3px 4px;color:#fff;
  background:linear-gradient(160deg,#3a6fd8 0%,#234da8 55%,#1d3a8f 100%);
  border:1px solid #16306e;box-shadow:inset 0 1px 0 rgba(255,255,255,.22)}
.wrap .shf b{display:block;font-size:5.5px;font-weight:800}
.wrap .shf u{display:block;text-decoration:none;font-size:7px;font-weight:700}
.wrap .shf i{display:inline-block;margin-top:2px;font-style:normal;font-size:5px;font-weight:700;
  background:rgba(255,255,255,.4);border-radius:3px;padding:1px 3px}
.wrap .shf-un{background:#fff1f2;border-color:#f4a6ae;color:#b91c1c;box-shadow:none}
.wrap .shf-add{display:flex;align-items:center;justify-content:center;height:100%;min-height:28px;
  border-radius:4px;background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);
  font-size:9px;color:var(--ink-3)}
.wrap .sch-key{display:flex;align-items:center;gap:8px;flex:none;font-size:6px;color:var(--ink-3)}
.wrap .sch-key b{font-size:5.5px;font-weight:800;letter-spacing:.06em;color:var(--ink-3)}
.wrap .sch-key span{display:flex;align-items:center;gap:3px}
.wrap .sch-key i{width:7px;height:7px;border-radius:2px}
.wrap .sch-key .k-as{background:linear-gradient(160deg,#3a6fd8,#1d3a8f)}
.wrap .sch-key .k-un{background:#fff1f2;box-shadow:inset 0 0 0 1px #f4a6ae}
.wrap .sch-key .k-no{background:var(--panel);box-shadow:inset 0 0 0 1px var(--line)}
.wrap .sch-key em{margin-left:auto;font-style:normal;font-weight:800;color:#1d3a8f;font-size:6.5px}

/* ── LISTINGS with artwork ──────────────────────────────────────────────── */
.wrap .lst-rows{display:flex;flex-direction:column;padding:0;overflow:hidden}
.wrap .lst{display:flex;align-items:center;gap:7px;padding:5px 7px;
  border-top:1px solid var(--line);flex:1 1 0;min-height:0}
.wrap .lst:first-child{border-top:0}
.wrap .lst-th{flex:none;width:34px;height:26px;border-radius:5px;
  background-size:cover;background-position:center;box-shadow:inset 0 0 0 1px rgba(9,20,54,.12)}
.wrap .lst-t{min-width:0;flex:1}
.wrap .lst-t b{display:block;font-size:8px;color:var(--ink);line-height:1.2}
.wrap .lst-t small{display:block;font-size:6px;color:var(--ink-3);line-height:1.3}
.wrap .lst-bar{display:block;margin-top:3px;height:3px;border-radius:99px;background:var(--panel);
  box-shadow:inset 0 0 0 1px var(--line);overflow:hidden}
.wrap .lst-bar i{display:block;height:100%;border-radius:99px;background:var(--brand-2)}
.wrap .lst-r{flex:none;text-align:right}
.wrap .lst-r b{display:block;font-size:8px;color:var(--ink)}
.wrap .lst-pill{display:inline-block;margin-top:2px;font-size:5.5px;font-weight:800;
  border-radius:99px;padding:2px 6px;background:#e7f6ee;color:#0b6b4f}
.wrap .lst-pill.lst-draft{background:var(--panel);color:var(--ink-3)}

/* the run between the phone and the photo was 118px of empty blue */
.wrap .hs-art-pair{gap:10px}
.wrap .hs-link{flex:0 0 52px}
/* the new chassis adds 38px (chin + deck) on top of the 16:10 screen, so the
   laptop outgrew its 306px bay: (W-18)/1.6 + 38 must fit */
.wrap .hs-art .ch-lap{width:446px !important}
.wrap .sch{overflow:hidden}
.wrap .sch-cells > div{min-height:0}
/* aspect-ratio is a preferred size, not a cap — the schedule's content pushed
   the screen from 279px to 435px and burst the bay. Pin the UI to the screen
   so the 16:10 box is the only thing deciding its height. */
.wrap .ch-lapin{position:relative}
.wrap .ch-lapin > .ma{position:absolute;inset:0;height:auto}
.wrap .ma-main{min-height:0}
/* the slide is centred for its heading, but the app UI inside the devices is
   left-aligned like the real thing */
.wrap .ma,.wrap .ch-phone{text-align:left}
.wrap .lst-r{text-align:right}

/* ── the photo bursts out of the handset ────────────────────────────────────
   Phone and photo standing side by side with a dashed arrow between them read
   as two unrelated objects. Overlap them on one stage instead: the photo starts
   inside the screen, its left edge dissolved into it, and grows past the top and
   bottom of the phone so the climber is literally out of the frame. */
.wrap .ph-break{position:relative;flex:0 0 430px;height:100%;align-self:center}
.wrap .hs-art-pair .ch-phone{position:absolute;left:0;top:50%;transform:translateY(-50%);
  width:196px !important;height:340px !important;z-index:2}
.wrap .hs-art-pair .ch-pic{position:absolute;left:150px;top:-34px;bottom:-34px;
  width:auto;height:auto;z-index:3;display:flex;align-items:stretch;pointer-events:none}
.wrap .hs-art-pair .ch-pic img{
  height:100%;width:auto;aspect-ratio:5/8;object-fit:cover;object-position:100% 46%;
  border-radius:0;box-shadow:none;
  /* dissolve the inner edge into the screen it is emerging from */
  -webkit-mask-image:linear-gradient(to right,transparent 0%,rgba(0,0,0,.35) 9%,#000 26%,#000 95%,transparent 100%),
                     linear-gradient(to bottom,transparent 0%,#000 9%,#000 91%,transparent 100%);
  -webkit-mask-composite:source-in;
  mask-image:linear-gradient(to right,transparent 0%,rgba(0,0,0,.35) 9%,#000 26%,#000 95%,transparent 100%),
             linear-gradient(to bottom,transparent 0%,#000 9%,#000 91%,transparent 100%);
  mask-composite:intersect;
  filter:drop-shadow(-14px 22px 34px rgba(9,20,54,.6));
}
/* the screen behind carries the same scene, so the two read as one image */
.wrap .ch-phone .ch-shot img{transform:scale(1.5);transform-origin:64% 40%}

@media(max-width:900px){
  .wrap .ph-break{flex:0 0 auto;height:auto}
  .wrap .hs-art-pair .ch-phone{position:static;transform:none}
  .wrap .hs-art-pair .ch-pic{position:static;height:auto}
  .wrap .hs-art-pair .ch-pic img{height:auto;width:100%}
}
/* height:100% could not resolve against a top/bottom-offset wrapper, so the
   image fell back to its intrinsic 1600x2560 and blew the slide out by 2141px */
.wrap .hs-art-pair .ch-pic{top:-34px;bottom:auto;height:calc(100% + 68px)}
/* 46px of overlap buried the phone's right edge and it read as cropped rather
   than emerging. Sit the photo on the screen edge, dissolve harder at the seam,
   and put a soft bloom where it breaks out. */
.wrap .hs-art-pair .ch-pic{left:174px}
.wrap .hs-art-pair .ch-pic img{
  -webkit-mask-image:linear-gradient(to right,transparent 0%,rgba(0,0,0,.5) 6%,#000 20%,#000 95%,transparent 100%),
                     linear-gradient(to bottom,transparent 0%,#000 8%,#000 92%,transparent 100%);
  mask-image:linear-gradient(to right,transparent 0%,rgba(0,0,0,.5) 6%,#000 20%,#000 95%,transparent 100%),
             linear-gradient(to bottom,transparent 0%,#000 8%,#000 92%,transparent 100%);
}
.wrap .ph-break::after{content:"";position:absolute;left:158px;top:8%;bottom:8%;width:56px;z-index:4;
  pointer-events:none;background:radial-gradient(closest-side,rgba(255,255,255,.16),transparent 78%)}

/* ── climbing OUT of the screen ─────────────────────────────────────────────
   The rectangle beside the phone was never going to read as "out of the
   screen". Layer a second copy of the same photo over the handset, clipped to
   roughly the climber's silhouette, and let it break past the top and right of
   the frame. The screen keeps the full scene, so she reads as leaving it.
   (A proper cut-out PNG would beat a traced polygon — see note to the user.) */
.wrap .ch-burst{position:absolute;left:96px;top:-62px;width:250px;height:400px;
  z-index:5;pointer-events:none}
.wrap .ch-burst img{width:100%;height:100%;object-fit:cover;object-position:86% 30%;
  display:block;border-radius:0;box-shadow:none;
  clip-path:polygon(40% 2%, 62% 0%, 76% 8%, 84% 22%, 88% 40%, 84% 56%,
                    80% 70%, 72% 82%, 58% 88%, 44% 84%, 36% 70%,
                    31% 52%, 30% 32%, 33% 14%);
  filter:drop-shadow(-10px 16px 26px rgba(9,20,54,.65));
}
@media(max-width:900px){.wrap .ch-burst{display:none}}
/* the traced-polygon attempt brought a blob of forest out with her — CSS can't
   segment a photo. Parked until there's a cut-out PNG to work from. */
.wrap .ch-burst{display:none}

/* ── ONE image, the screen is a window onto it ──────────────────────────────
   Previously the phone showed one crop and a separate element beside it showed
   another crop of the same photo — two pictures, which is why it read as a
   duplicate. Now there is a single <img>: the phone's own screen photo, scaled
   up and clipped so the part over the screen fills it and the part carrying the
   climber continues up and out past the top-right of the handset. */
.wrap .hs-art-pair .ch-phone{overflow:visible}
.wrap .ch-shot-out{position:relative;overflow:visible;background:none}
.wrap .ch-shot-out img{
  position:absolute;left:0;top:-100%;width:200%;height:200%;max-width:none;
  object-fit:cover;object-position:62% 62%;transform:none;
  /* the screen rect (x 0–50%, y 50–100%) plus a bump where she leaves it */
  clip-path:polygon(0% 50%, 26% 50%, 27% 20%, 36% 8%, 52% 5%, 64% 16%,
                    68% 33%, 66% 47%, 50% 50%, 50% 100%, 0% 100%);
  filter:drop-shadow(-6px 14px 22px rgba(9,20,54,.55));
}
/* An older rule (.wrap .ch-phone .ch-shot img, specificity 0,3,0) still had
   transform:scale(1.5) on it, which inflated the rendered box to 510x452 and
   threw every clip coordinate off. Kill it at equal weight. */
.wrap .ch-phone .ch-shot-out img{transform:none}

/* One image: the box is 3x the screen wide and sits so the screen window lands
   on the group, while the climber falls in the strip to the right of the phone.
   The clip is the screen rectangle plus that taller strip — a single continuous
   picture that keeps going past the edge of the handset. */
.wrap .ch-shot-out img{
  left:0;top:-110%;width:300%;height:320%;object-position:100% 50%;
  clip-path:polygon(0% 34.4%, 33.3% 34.4%, 33.3% 4%, 100% 4%,
                    100% 96%, 33.3% 96%, 33.3% 65.7%, 0% 65.7%);
}
/* the screen's body clips overflow (it has to, for the other slides), so the
   part of the picture that continues past the handset was being cut off */
.wrap .hs-art-pair .ch-phone .pp-body{overflow:visible}
.wrap .hs-art-pair .ch-phone .pp-bar,
.wrap .hs-art-pair .ch-phone .pp-status{position:relative;z-index:2}
.wrap .ch-shot-out{z-index:3}
/* .wrap .ch-phone .ch-shot{overflow:hidden} (0,3,0) was beating the 0,2,0
   .ch-shot-out rule, so the picture never got out of the screen box */
.wrap .ch-phone .ch-shot-out{overflow:visible}
/* The strip was 340x444 — it swallowed the headline. Size the box so the screen
   window is 0–52.6% of it and the part that carries the climber is a modest
   153px strip to the right, then feather its outer edges (the fade sits well
   outside the screen rectangle, so the in-phone photo stays crisp). */
.wrap .ch-shot-out img{
  left:0;top:-40%;width:190%;height:240%;object-position:98% 50%;
  clip-path:polygon(0% 16.6%, 52.6% 16.6%, 52.6% 3%, 100% 3%,
                    100% 97%, 52.6% 97%, 52.6% 58.3%, 0% 58.3%);
  -webkit-mask-image:linear-gradient(to right,#000 0 84%,transparent 100%),
                     linear-gradient(to bottom,transparent 0,#000 8%,#000 92%,transparent 100%);
  -webkit-mask-composite:source-in;
  mask-image:linear-gradient(to right,#000 0 84%,transparent 100%),
             linear-gradient(to bottom,transparent 0,#000 8%,#000 92%,transparent 100%);
  mask-composite:intersect;
  filter:drop-shadow(-8px 16px 26px rgba(9,20,54,.6));
}

/* ── slide 3 reset ──────────────────────────────────────────────────────────
   Every attempt at faking the break-out without a cut-out looked worse than
   the last. Back to a clean, honest composition: the handset selling one
   session, a photo of a different session beside it. No duplicated picture,
   no half-effect. The real break-out needs an alpha cut-out PNG. */
.wrap .ch-shot-out img{clip-path:none;-webkit-mask-image:none;mask-image:none;
  position:static;width:100%;height:100%;filter:none}
.wrap .ph-break::after{display:none}
.wrap .hs-art-pair .ch-phone{position:static;transform:none;overflow:hidden;
  width:196px !important;height:340px !important;align-self:center}
.wrap .hs-art-pair .ch-phone .pp-body{overflow:hidden}
.wrap .hs-art-pair .ch-pic{position:static;height:100%;width:auto;max-width:none;
  display:flex;align-self:center}
.wrap .hs-art-pair .ch-pic img{
  position:static;height:100%;width:auto;aspect-ratio:5/8;object-fit:cover;
  object-position:100% 46%;border-radius:16px;clip-path:none;
  -webkit-mask-image:none;mask-image:none;
  box-shadow:0 26px 52px -22px rgba(9,20,54,.65);filter:none;
}
.wrap .hs-art-pair{gap:20px}

/* ── the funnel is the connection ───────────────────────────────────────────
   The session leaves the handset through a widening funnel and arrives as the
   photo — narrow at the screen, full photo height at the far end. Same motif
   as the funnel on the freelancers page, on the blue chrome rather than white. */
.wrap .ch-funnel{flex:0 0 92px;align-self:center;height:100%;margin:0 -14px;
  position:relative;z-index:1;pointer-events:none}
.wrap .ch-funnel svg{width:100%;height:100%;display:block;overflow:visible}
/* the photo emerges from the wide end, so its inner edge dissolves into it */
.wrap .hs-art-pair .ch-pic img{
  -webkit-mask-image:linear-gradient(to right,transparent 0%,rgba(0,0,0,.4) 5%,#000 22%,#000 100%);
  mask-image:linear-gradient(to right,transparent 0%,rgba(0,0,0,.4) 5%,#000 22%,#000 100%);
  border-radius:0 16px 16px 0;
}
.wrap .hs-art-pair{gap:12px}

/* ── breakout hero: clear its path ──────────────────────────────────────────
   Any ancestor with overflow:hidden kills the spill, and the slide + view both
   clip. Let this slide breathe, and give the scaler the room to spill into
   rather than shrinking the phone. */
.wrap .hs-slide.hs-breakout{overflow:visible}
.wrap .hs-art-pair{align-items:center;gap:18px}
.wrap .bh-scaler{flex:0 0 470px}
.wrap .bh-scaler img{max-width:none}
@media(max-width:900px){.wrap .bh-scaler{flex:1 1 auto}}
/* 620x420 scaled to a 470px column is 318px tall — 12px past the art bay.
   452px lands it at exactly 306. */
.wrap .bh-scaler{flex:0 0 452px}
/* flex-basis is a width in the row layout but a HEIGHT once .hs-art-pair
   stacks to a column under 900px — which stretched the scaler to 452px tall
   and broke its aspect-ratio. Scope it to the row. */
@media(min-width:901px){.wrap .bh-scaler{flex:0 0 452px}}
@media(max-width:900px){.wrap .bh-scaler{flex:0 0 auto;width:min(100%,420px)}}

/* ── breakout hero at +30% ──────────────────────────────────────────────────
   452 -> 588px wide. The design space is 620x420, so at 588 the hero is 398
   tall — the 306px art bay and 540px slide both have to grow with it, or the
   slide clips the very thing we just made bigger. */
@media(min-width:901px){
  .wrap .hs-view,.wrap .hero-slider .hs-slide{height:600px}
  .wrap .hs-breakout .hs-art{height:400px}
  .wrap .bh-scaler{flex:0 0 588px}
}
/* .hs-art-pair{align-items:center} (added in the slide-3 reset, and later in
   the cascade than .hs-art{align-items:stretch}) stopped the chip columns
   stretching — they sat 204px tall in a 400px bay with ~98px of dead blue
   above and below. Stretch the columns; the hero centres itself. */
.wrap .hs-art-pair{align-items:stretch}
.wrap .hs-art-pair > .bh-scaler{align-self:center}
/* design box is 470 wide now, so 400px of bay height gives 448px of width —
   the art renders the same size, minus the empty reservation. The freed width
   goes to the chip columns rather than back into the gap. */
@media(min-width:901px){
  .wrap .bh-scaler{flex:0 0 448px}
  .wrap .hs-breakout .hs-facts{flex:0 0 240px}
}
/* the breakout has to be able to spill out of the photo column */
#booking .bk-photo2{overflow:visible}

/* the tilt now lives on .tb (the shared stage) so both photo copies rotate
   together; rotating the wrapper as well would double it */
#booking .bk-photo2{transform:none}


/* ── footer: social + app ───────────────────────────────────────────────────
   These lived in breakout-hero.css, which only two pages link — so on the
   other 22 the social SVGs rendered unstyled at their natural size. The
   footer is on every page, so its styles belong in the shared sheet. */
/* ═══════════════════════════════════════════════════════════════════════════
   FOOTER — social + app download. The footer was three columns of plain links;
   this gives the last column something to look at and somewhere to go.
   ═══════════════════════════════════════════════════════════════════════════ */
footer .foot-grid{grid-template-columns:1.25fr .8fr .9fr 1.15fr}
footer .foot-extra h4{margin:0 0 12px}
footer .ft-socials{display:flex;gap:10px;flex-wrap:wrap}
footer .ft-soc{
  width:40px;height:40px;border-radius:12px;display:grid;place-items:center;
  background:rgba(255,255,255,.10);box-shadow:inset 0 0 0 1px rgba(255,255,255,.20);
  transition:background .18s,transform .18s,box-shadow .18s;
}
footer .ft-soc svg{width:19px;height:19px;fill:#fff;opacity:.92}
footer .ft-soc:hover{background:var(--gold);transform:translateY(-2px);
  box-shadow:0 10px 20px -10px rgba(0,0,0,.45)}
footer .ft-soc:hover svg{fill:#241a00;opacity:1}
footer .ft-soc-note{margin:11px 0 0;font-size:12.5px;color:rgba(255,255,255,.62);line-height:1.5}
footer .ft-apph{margin-top:26px !important}
footer .ft-app{display:flex;gap:14px;align-items:flex-start}
footer .ft-phone{
  position:relative;flex:none;width:74px;height:132px;border-radius:14px;overflow:hidden;
  background:#0d1430;box-shadow:0 14px 28px -14px rgba(0,0,0,.6),inset 0 0 0 2px rgba(255,255,255,.18);
}
footer .ft-phone img{width:100%;height:100%;object-fit:cover;object-position:52% 40%;display:block}
footer .ft-notch{position:absolute;left:50%;top:5px;transform:translateX(-50%);
  width:26px;height:4px;border-radius:99px;background:rgba(255,255,255,.5);z-index:2}
footer .ft-phone-cap{
  position:absolute;left:5px;right:5px;bottom:5px;z-index:2;
  background:rgba(9,20,54,.82);color:#fff;font-size:8px;font-weight:800;
  padding:4px 5px;border-radius:7px;text-align:center;
}
footer .ft-stores{display:flex;flex-direction:column;gap:8px;min-width:0}
footer .ft-store{
  display:flex;align-items:center;gap:9px;
  background:rgba(255,255,255,.10);box-shadow:inset 0 0 0 1px rgba(255,255,255,.22);
  border-radius:11px;padding:7px 12px;transition:background .18s;
}
footer .ft-store:hover{background:rgba(255,255,255,.18)}
footer .ft-store b{font-size:16px;line-height:1;color:#fff}
footer .ft-store span{display:flex;flex-direction:column;font-size:9px;
  color:rgba(255,255,255,.7);line-height:1.25}
footer .ft-store em{font-style:normal;font-size:12.5px;font-weight:800;color:#fff}
footer .ft-stores small{margin-top:2px;font-size:11.5px;color:rgba(255,255,255,.58);line-height:1.45}
footer .ft-app{gap:12px}
/* ── app block, restrained ─────────────────────────────────────────────────
   A photo in a rounded rect with a label stuck over it was not a phone, and
   full-width translucent bars read cheap. Two compact solid badges side by
   side, sized like the real thing, and nothing else. */
footer .ft-app{display:block}
footer .ft-stores{flex-direction:row;flex-wrap:wrap;gap:10px}
footer .ft-store{
  flex:0 0 auto;gap:10px;padding:8px 14px;border-radius:12px;
  background:rgba(255,255,255,.94);box-shadow:none;
}
footer .ft-store:hover{background:#fff;transform:translateY(-1px)}
footer .ft-store b{font-size:17px;color:var(--ink)}
footer .ft-store span{color:var(--ink-3)}
footer .ft-store em{color:var(--ink);font-size:13px;letter-spacing:-.01em}
footer .ft-stores small{flex:1 1 100%;margin-top:4px;color:rgba(255,255,255,.62)}
/* U+F8FF (the Apple logo) is a private-use codepoint — it only draws on Apple
   devices and is a tofu box everywhere else. Real paths instead. */
footer .ft-glyph{width:17px;height:17px;flex:none;fill:var(--ink)}
/* ── footer bottom bar ──────────────────────────────────────────────────────
   The tagline was inheriting .note — a white pill built for light surfaces —
   so it sat as a white lozenge on the blue. And the copyright was barely
   legible against it. */
footer .foot-tag{background:none;box-shadow:none;padding:0;border-radius:0;
  color:rgba(255,255,255,.72);font-size:13px}
footer .foot-bot small{color:rgba(255,255,255,.55)}
footer .foot-sub{margin-top:22px !important}
/* "Download on the" / "Get it on" were --ink-3 at 9px on white — under 4.5:1
   and too small to read. */
footer .ft-store span{color:var(--ink-2);font-size:10.5px}
footer .ft-store em{font-size:13.5px}
footer .ft-store{padding:9px 15px}

/* these two were hoisted out of their media queries by a bad extraction,
   so the mobile column counts were applying at every width */
@media(max-width:900px){footer .foot-grid{grid-template-columns:1fr 1fr}}
@media(max-width:560px){footer .foot-grid{grid-template-columns:1fr}}
/* the site serves two audiences; the parent entry point sits alongside the
   provider one rather than being buried in a footer link */
.wrap .nav .navtab-parent{
  border-radius:999px;padding:7px 14px;font-weight:800;
  background:rgba(255,255,255,.12);box-shadow:inset 0 0 0 1px rgba(255,255,255,.26);
}
.wrap .nav .navtab-parent:hover{background:rgba(255,255,255,.2)}
@media(max-width:1100px){.wrap .nav .navtab-parent{display:none}}

/* Site-wide "Book a demo" banner, sits directly under the header, above
   every page's own title — a bigger, harder-to-miss CTA than the nav link. */
.demo-banner{background:linear-gradient(90deg,var(--navy),var(--navy-2));color:#fff;padding:15px 0;position:relative;z-index:2}
.demo-banner-in{max-width:1120px;margin:0 auto;padding:0 24px;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;text-align:center}
.demo-banner-txt{font-size:14.5px;font-weight:600;line-height:1.4}
.demo-banner-txt b{font-weight:800}
.demo-banner-btn{flex:none;white-space:nowrap;font-size:14px;padding:10px 22px}
@media(max-width:640px){.demo-banner{padding:12px 0}.demo-banner-txt{font-size:13px}.demo-banner-btn{font-size:13px;padding:9px 18px}}

/* ActivityLane mark: the logo square is the SVG itself (public/brand/mark.svg) */
.logo{background:none!important;box-shadow:none!important;border-radius:0}
.logo img{width:36px;height:36px;display:block}
.wrap .pf-bar .mk,.pf-bar .mk{background:none!important;border-radius:0}
.pf-bar .mk img{width:26px;height:26px;display:block}

/* ActivityLane lockup: bare mark + "Activity" white + "Lane" amber, on the blue bar and the dark footer */
.brand .brand-mark{height:44px;width:auto;display:block;flex:none}
.brand .brand-name,.wrap header.nav .brand .brand-name,.wrap > footer .brand .brand-name{color:#fff;font-weight:800;font-size:22px;letter-spacing:-.02em;white-space:nowrap}
.brand .brand-name b{color:#ffb02e;font-weight:800}
.pf-bar .mk img{width:auto!important;height:26px!important}
@media(max-width:560px){.brand .brand-mark{height:40px}.brand .brand-name{font-size:19px}}
@media(max-width:420px){.brand .brand-name{font-size:17px}.brand .brand-mark{height:36px}}

/* Phone bar spacing (10 Oct): [menu] [lockup centred in the free space, >=16px clear of both neighbours] [Book a demo]. */
@media (max-width:520px){
  .wrap header.nav .nav-in:has(> .nav-cta){grid-template-columns:auto minmax(0,1fr) auto;column-gap:0}
  .wrap header.nav .nav-in:has(> .nav-cta) > .brand{justify-self:center;margin:0 16px;min-width:0;gap:7px}
  .wrap header.nav .nav-in:has(> .nav-cta) > .brand .brand-mark{height:38px}
  .wrap header.nav .nav-in:has(> .nav-cta) > .brand .brand-name{font-size:18px}
  .wrap header.nav .nav-in:has(> .nav-cta) > .rsp-demo{padding:0 12px;font-size:12.5px}
}
@media (max-width:389px){
  .wrap header.nav .nav-in:has(> .nav-cta) > .brand{margin:0 16px 0 12px;gap:5px}
  .wrap header.nav .nav-in:has(> .nav-cta) > .brand .brand-mark{height:34px}
  .wrap header.nav .nav-in:has(> .nav-cta) > .brand .brand-name{font-size:16px}
  .wrap header.nav .nav-in:has(> .nav-cta) > .rsp-demo{padding:0 10px;font-size:12px}
}

/* company line: large until Apple approves */
footer .foot-bot small{font-size:17px!important;line-height:1.5;color:#fff!important;font-weight:600}
