/* ════════════════════════════════════════════════════════════════
   PRESNSE — FOUNDATION  ·  the shared invisible system
   ----------------------------------------------------------------
   SINGLE SOURCE OF TRUTH for every colour / spacing / font-size /
   radius / shadow / motion the homepage is allowed to use.
   Composition (modules, cards, charts, console …) lives in
   index.html and (later) components.css; they consume these and
   never declare raw hex / rgb / arbitrary px.

   Brand values (paper / ink / lime / green / Schibsted Grotesk /
   Instrument Serif / mark) are FROZEN — mirrored from the shipped
   Iteration 3 homepage. Only naming / location is systematised.
   ════════════════════════════════════════════════════════════════ */

/* ---- 1. COLOUR ---- */
:root{
  /* base channels — compose every tint/alpha from these; never write raw rgb/rgba */
  --ink-rgb:5 5 5;            /* the page-real ink (used by 162 rgba literals)   */
  --white-rgb:255 255 255;
  --lime-rgb:168 224 32;
  --green-rgb:92 184 37;
  --paper-rgb:246 245 241;

  /* surfaces (page-real; was foundation #fff drift) */
  --bg:rgb(var(--paper-rgb));         /* #F6F5F1 — warm paper, body background  */
  --bg-soft:#EDEBE4;                  /* card/alt surface                       */
  --bg-muted:#f1f1ed;
  --paper-card:#FFFFFF;               /* white card surface (e.g. tile bg)      */
  --white:#FFFFFF;                    /* explicit white for text on dark        */
  --black:#000000;                    /* mask luminance only — never a fill     */

  /* ink / text on light */
  --ink:rgb(var(--ink-rgb));          /* #050505 — primary ink                  */
  --ink-soft:#242424;
  --muted:#6f6f6a;
  --faint:#a7a7a0;

  /* lines on light (the dashed-blueprint workhorse) */
  --line:rgb(var(--ink-rgb) / .10);          /* legacy non-dashed border        */
  --line-strong:rgb(var(--ink-rgb));         /* 2px module rule                 */
  --line-soft:rgb(var(--ink-rgb) / .09);     /* faint cell border               */
  --line-dash:rgb(var(--ink-rgb) / .12);     /* THE dashed-line standard (×31)  */
  --line-mid:rgb(var(--ink-rgb) / .14);      /* mod-bar / panel border          */
  --line-em:rgb(var(--ink-rgb) / .18);       /* hero-mod / jtag emphasis        */
  --line-rule:rgb(var(--ink-rgb) / .20);     /* chip border / vrow .vn          */
  --line-rule-strong:rgb(var(--ink-rgb) / .24); /* arch-tree connector          */

  /* ink-alpha tints (washes / backgrounds) */
  --wash-min:rgb(var(--ink-rgb) / .02);      /* hm-foot bg                      */
  --wash-soft:rgb(var(--ink-rgb) / .03);     /* sys / ss hover                  */
  --wash:rgb(var(--ink-rgb) / .04);          /* --bp dot grid · mx hover        */
  --wash-strong:rgb(var(--ink-rgb) / .06);   /* flag-rev bg                     */
  --wash-hair:rgb(var(--ink-rgb) / .08);     /* meter border / grow bg          */
  --dot-strong:rgb(var(--ink-rgb) / .28);    /* hm-auth divider dot             */

  /* dark surface + text on dark */
  --inverse-bg:#0A0C0A;               /* dark sections (entity / categories / cta / footer) */
  --inverse-ink:var(--white);

  --tx-on:rgb(var(--white-rgb) / .94);
  --tx-on-90:rgb(var(--white-rgb) / .9);
  --tx-on-75:rgb(var(--white-rgb) / .75);
  --tx-on-70:rgb(var(--white-rgb) / .7);
  --tx-on-68:rgb(var(--white-rgb) / .68);
  --tx-on-62:rgb(var(--white-rgb) / .62);
  --tx-on-60:rgb(var(--white-rgb) / .6);
  --tx-on-55:rgb(var(--white-rgb) / .55);
  --tx-on-50:rgb(var(--white-rgb) / .5);
  --tx-on-45:rgb(var(--white-rgb) / .45);
  --tx-on-40:rgb(var(--white-rgb) / .4);
  --tx-on-30:rgb(var(--white-rgb) / .3);
  --tx-on-25:rgb(var(--white-rgb) / .25);

  /* lines / tints on dark */
  --line-on:rgb(var(--white-rgb) / .14);
  --line-on-soft:rgb(var(--white-rgb) / .10);
  --line-on-dash:rgb(var(--white-rgb) / .12);
  --line-on-mid:rgb(var(--white-rgb) / .16);
  --line-on-rule:rgb(var(--white-rgb) / .18);
  --line-on-strong:rgb(var(--white-rgb) / .20);
  --line-on-em:rgb(var(--white-rgb) / .28);

  --wash-on-min:rgb(var(--white-rgb) / .02);
  --wash-on-soft:rgb(var(--white-rgb) / .025);
  --wash-on:rgb(var(--white-rgb) / .05);
  --wash-on-strong:rgb(var(--white-rgb) / .06);
  --wash-on-em:rgb(var(--white-rgb) / .08);

  /* the ONE rationed accent — PRESNSE lime. data / wayfinding / status only. */
  --lime:rgb(var(--lime-rgb));        /* #A8E020 */
  --lime-deep:#5CB825;
  --lime-ink:#3f6e10;                 /* AA-safe lime text on light             */
  --lime-glow:rgb(var(--lime-rgb) / .18);     /* status-dot halo                */
  --lime-glow-2:rgb(var(--lime-rgb) / .2);    /* mod-bar / erec dot halo        */
  --lime-veil:rgb(var(--lime-rgb) / .13);     /* sparkline area fill            */
  --tint-green-15:rgb(var(--green-rgb) / .15);/* flag-ok bg                     */

  /* mark gradient stops (logo / hero word-underline accent) */
  --brand-grad-from:#A8E020;
  --brand-grad-to:#5CB825;

  /* literal UI simulacra — intentionally outside the brand palette */
  --serp-blue:#1A56B8;                /* simulated Google result link           */
  --serp-slate:#6A6F86;               /* losing-result text                     */
  --amber:#E8B23A;                    /* warn / trend indicator                 */
  --amber-glow:rgb(232 178 58 / .16);
  --star:rgb(var(--ink-rgb) / .55);   /* SERP star-rating grey on light         */
  --paper-veil:rgb(var(--paper-rgb) / .6); /* translucent paper (hero side col) */

  /* ---- homepage-v2 UI-simulacra (same justification as --serp-blue) ----
     Map instrument + rank grid. Outside the brand palette on purpose: these
     paint a *simulated Google Map / local-pack*, not PRESNSE surfaces.        */
  --map-bg:#F7F5EF;                   /* map paper                              */
  --map-road:#E9D7BD;                 /* road casing                            */
  --map-road-line:#F3E7D2;            /* road centre highlight                  */
  --map-bldg:#DBE1E9;                 /* building block fill                    */
  --map-bldg-line:#C7CEDA;            /* building / canvas hairline             */
  --map-grid:rgb(96 116 148 / .18);   /* scan-grid lines                        */
  --map-water:#D3DCE6;                 /* harbour band fill                      */
  --map-water-line:rgb(96 116 148 / .22); /* harbour hatch lines                */
  --rk-strong:#57A12B;                /* rank tier · strong (1–3)               */
  --rk-med:#E0A93A;                   /* rank tier · medium (5–8)               */
  --rk-weak:#C9583E;                  /* rank tier · weak (12+)                 */
  --rival:#9AA0A6;                    /* neutral rival map pin                  */
  /* compliance-flag tints (amber simulacrum already at --amber/--amber-glow) */
  --amber-veil:rgb(232 178 58 / .12); /* flagged-page wash                      */
  --amber-line:rgb(232 178 58 / .45); /* flagged-page border                    */
  --green-veil:rgb(var(--green-rgb) / .10); /* compliant-ok wash                */
  --green-line:rgb(var(--green-rgb) / .42); /* compliant-ok border              */

  /* ---- 2. TYPOGRAPHY ---- */
  --sans:"Schibsted Grotesk","Helvetica Neue",Arial,sans-serif;
  --serif:"Instrument Serif",Georgia,serif;
  --mono:"JetBrains Mono",ui-monospace,monospace;

  /* mono-label tier (page-real — was below foundation's --text-xs floor) */
  --label-2xs:.6rem;
  --label-xs:.62rem;
  --label-sm:.66rem;
  --label:.68rem;
  --label-md:.7rem;
  --label-lg:.72rem;

  /* general text scale (rem) */
  --text-xs:.75rem;   --text-sm:.875rem;   --text-base:1rem;   --text-md:1.125rem;
  --text-lg:1.375rem; --text-xl:1.75rem;

  /* display scale (clamp) */
  --h3:clamp(1.5rem,2.2vw,2.25rem);
  --h2:clamp(2.25rem,4.2vw,4.75rem);
  --hero:clamp(3rem,7vw,7.5rem);
  --mega:clamp(4rem,10vw,11rem);

  --lead-tight:0.98; --lead-display:1.04; --lead-body:1.55;
  --tr-display:-0.045em; --tr-tight:-0.025em; --tr-label:0.12em;

  /* ---- 3. SPACING ---- */
  --sp-xs:8px; --sp-sm:12px; --sp-md:16px; --sp-lg:24px; --sp-xl:32px;
  --sp-2xl:48px; --sp-3xl:64px; --sp-4xl:96px; --sp-5xl:128px;
  --section-y:clamp(80px,12vw,170px);
  --section-y-tight:clamp(56px,8vw,108px);

  /* blueprint motif */
  --bp:var(--wash);                   /* dot grid colour (was an override)      */
  --bp-tile:32px;
  --bp-dot:1px;

  /* ---- 4. RADIUS ---- */
  --radius-sm:8px; --radius-md:14px; --radius-lg:20px; --radius-pill:999px;
  --radius-chip:5px;                  /* small data chips / serp chips          */
  --radius-tag:6px;                   /* tags / flags                           */
  --radius-bar:2px;                   /* thin meter bars                        */
  --underline:2.5px;                  /* hero word underline thickness          */

  /* ---- 5. SHADOW ---- */
  --shadow-card:0 30px 64px -44px rgb(var(--ink-rgb) / .45);
  --shadow-tile:0 7px 16px rgb(0 0 0 / .22);

  /* ---- 6. MOTION ---- */
  --ease:cubic-bezier(.2,.8,.2,1);
  --ease-omnius:cubic-bezier(.16,1,.3,1);  /* the slower hero/brand-rotator     */
}

/* ---- 7. RESET ---- */
*{box-sizing:border-box;margin:0;padding:0;}
html{background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased;text-rendering:geometricPrecision;scroll-behavior:smooth;}
body{font-family:var(--sans);background:var(--bg);color:var(--ink);line-height:var(--lead-body);
  background-image:radial-gradient(var(--bp) var(--bp-dot),transparent var(--bp-dot));background-size:var(--bp-tile) var(--bp-tile);}
a{color:inherit;text-decoration:none;}
button,input,textarea,select{font:inherit;color:inherit;}
img,svg{display:block;max-width:100%;}
.zh{font-family:"Noto Sans HK","PingFang HK",var(--sans);}

/* ---- 8. PRIMITIVES ---- */
.container{width:min(100% - 40px,1400px);margin-inline:auto;}
.container-narrow{width:min(100% - 40px,1080px);margin-inline:auto;}
.section{padding-block:var(--section-y);}
.section-tight{padding-block:var(--section-y-tight);}
.grid12{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:clamp(16px,2vw,28px);}

.eyebrow{font-family:var(--mono);font-size:var(--text-xs);letter-spacing:var(--tr-label);
  text-transform:uppercase;color:var(--muted);font-weight:500;display:inline-flex;align-items:center;gap:9px;}
.eyebrow .dot{width:6px;height:6px;border-radius:50%;background:var(--lime);box-shadow:0 0 0 3px var(--lime-glow);}

.body-lg{font-size:clamp(1.05rem,1.3vw,1.4rem);line-height:var(--lead-body);color:var(--ink-soft);}

/* vertical hairline — recurring compositional signature */
.vrule{display:inline-block;width:1px;align-self:stretch;min-height:40px;background:var(--ink);flex:0 0 1px;}

/* buttons */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;border-radius:var(--radius-pill);
  padding:13px 22px;font-size:.92rem;font-weight:500;line-height:1;border:1px solid var(--ink);cursor:pointer;
  transition:background .2s var(--ease),color .2s var(--ease),transform .2s var(--ease),border-color .2s var(--ease);}
.btn .arr{transition:transform .25s var(--ease);}
.btn:hover .arr{transform:translateX(4px);}
.btn-pri{background:var(--ink);color:var(--inverse-ink);}
.btn-pri:hover{transform:translateY(-2px);}
.btn-sec{background:transparent;color:var(--ink);}
.btn-sec:hover{background:var(--ink);color:var(--inverse-ink);}
.btn-ghost{border-color:var(--line);color:var(--ink);}
.btn-ghost:hover{border-color:var(--ink);}

/* tags / pills */
.tag{font-family:var(--mono);font-size:var(--label);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);
  border:1px solid var(--line);border-radius:var(--radius-pill);padding:5px 11px;display:inline-flex;align-items:center;gap:6px;}

/* ---- 9. NAV (shared shell) ---- */
.nav{position:sticky;top:0;z-index:60;background:rgb(var(--white-rgb) / .82);backdrop-filter:saturate(160%) blur(14px);
  border-bottom:1px solid var(--line);transition:border-color .3s,box-shadow .3s;}
.nav.scrolled{box-shadow:0 1px 0 var(--line);}
.nav-in{position:relative;display:flex;align-items:center;gap:var(--sp-xl);height:68px;}
.brand{display:flex;align-items:center;gap:10px;font-weight:700;letter-spacing:-.01em;font-size:1.05rem;white-space:nowrap;}
.nav-links{display:flex;align-items:center;gap:18px;margin-left:8px;}
.nav-links>a,.nav-top{position:relative;font-size:.92rem;color:var(--ink-soft);transition:color .2s,background .2s,border-color .2s;}
.nav-links>a{display:flex;align-items:center;min-height:44px;padding:0 2px;}
.nav-links>a::after,.nav-top::after{content:"";position:absolute;left:0;right:0;bottom:6px;height:1px;background:var(--lime);transform:scaleX(0);transform-origin:left;transition:transform .22s var(--ease);}
.nav-links>a:hover,.nav-top:hover,.nav-group.open .nav-top{color:var(--ink);}
.nav-links>a:hover::after,.nav-top:hover::after,.nav-group.open .nav-top::after{transform:scaleX(1);}
.nav-links .mobile-only{display:none;}
.nav-group{position:relative;display:flex;align-items:center;}
.nav-top{display:flex;align-items:center;gap:7px;min-height:44px;padding:0 2px;background:none;border:0;font:inherit;cursor:pointer;}
.nav-caret{font-family:var(--mono);font-size:.76em;color:var(--faint);transform:translateY(-1px);transition:transform .2s,color .2s;}
.nav-group.open .nav-caret,.nav-group:hover .nav-caret{transform:translateY(-1px) rotate(180deg);color:var(--lime);}
.nav-top:focus-visible{outline:2px solid var(--lime);outline-offset:4px;border-radius:var(--radius-sm);}
.nav-dropdown{position:absolute;top:100%;left:-28px;z-index:30;width:min(640px,calc(100vw - 40px));padding:0;background:rgb(var(--white-rgb) / .96);backdrop-filter:saturate(150%) blur(18px);border:1px solid var(--line);border-radius:22px;box-shadow:var(--shadow-card);opacity:0;visibility:hidden;transform:translateY(10px) scale(.985);pointer-events:none;overflow:hidden;transition:opacity .2s var(--ease),transform .2s var(--ease),visibility .2s;}
.nav-panel::before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent 0,transparent calc(50% - 1px),var(--line) 50%,transparent calc(50% + 1px)),radial-gradient(circle at 1px 1px,var(--line) 1px,transparent 0);background-size:100% 100%,18px 18px;opacity:.42;pointer-events:none;}
.nav-panel::after{content:"";position:absolute;left:0;right:0;top:0;height:3px;background:linear-gradient(90deg,var(--lime),transparent 72%);opacity:.95;}
.nav-group:hover .nav-dropdown,.nav-group:focus-within .nav-dropdown,.nav-group.open .nav-dropdown{opacity:1;visibility:visible;transform:translateY(0) scale(1);pointer-events:auto;}
.nav-panel-head{position:relative;display:grid;gap:7px;padding:22px 24px 18px;border-bottom:1px solid var(--line);}
.nav-panel-kicker{font-family:var(--mono);font-size:var(--label);letter-spacing:var(--tr-label);text-transform:uppercase;color:var(--faint);}
.nav-panel-head strong{font-size:1.03rem;letter-spacing:-.02em;color:var(--ink);}
.nav-panel-head span:last-child{max-width:52ch;font-size:.88rem;line-height:1.55;color:var(--ink-soft);}
.nav-panel-grid{position:relative;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;padding:12px;}
.nav-card{position:relative;display:grid;grid-template-columns:auto 1fr;column-gap:12px;row-gap:3px;min-height:84px;padding:14px;border:1px solid transparent;border-radius:var(--radius-md);color:var(--ink);white-space:normal;transition:background .18s,border-color .18s,transform .18s;}
.nav-card:hover{background:rgb(var(--white-rgb) / .74);border-color:var(--line-strong);transform:translateY(-1px);}
.nav-card-primary{background:var(--wash);border-color:var(--line);}
.nav-card-code{grid-row:1/3;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid var(--line);border-radius:var(--radius-sm);font-family:var(--mono);font-size:.72rem;letter-spacing:.08em;color:var(--faint);background:rgb(var(--white-rgb) / .62);}
.nav-card-title{font-weight:600;font-size:.96rem;letter-spacing:-.01em;color:var(--ink);}
.nav-card-copy{font-size:.82rem;line-height:1.45;color:var(--ink-soft);}
.nav-cta{margin-left:auto;display:flex;align-items:center;gap:14px;}
.nav-meta{font-family:var(--mono);font-size:var(--label);letter-spacing:.1em;text-transform:uppercase;color:var(--faint);white-space:nowrap;}
.burger{display:none;align-items:center;justify-content:center;min-width:48px;min-height:48px;background:none;border:1px solid transparent;border-radius:var(--radius-sm);cursor:pointer;color:var(--ink);}
.burger:focus-visible{outline:2px solid var(--lime);outline-offset:2px;}
@media(max-width:900px){
  .nav-in{height:64px;gap:12px;}
  .nav-links{position:absolute;top:calc(100% + 1px);left:12px;right:12px;display:none;flex-direction:column;align-items:stretch;gap:10px;margin-left:0;padding:12px;max-height:calc(100vh - 84px);overflow-y:auto;background:rgb(var(--white-rgb) / .97);backdrop-filter:saturate(150%) blur(18px);border:1px solid var(--line);border-radius:20px;box-shadow:var(--shadow-card);}
  .nav-links.open{display:flex;}
  .nav-group{display:block;border:1px solid var(--line);border-radius:var(--radius-md);background:rgb(var(--white-rgb) / .56);overflow:hidden;}
  .nav-top{justify-content:space-between;width:100%;min-height:46px;padding:13px 14px;color:var(--ink);}
  .nav-top::after{display:none;}
  .nav-caret{color:var(--lime);}
  .nav-dropdown{position:static;width:auto;display:none;min-width:0;padding:0;background:transparent;border:0;border-radius:0;box-shadow:none;opacity:1;visibility:visible;transform:none;pointer-events:auto;overflow:visible;}
  .nav-group.open .nav-dropdown{display:block;}
  .nav-panel::before,.nav-panel::after{display:none;}
  .nav-panel-head{padding:0 14px 12px;border-bottom:1px solid var(--line);}
  .nav-panel-head strong{font-size:.92rem;}
  .nav-panel-head span:last-child{display:none;}
  .nav-panel-grid{display:grid;grid-template-columns:1fr;gap:4px;padding:8px 10px 10px;}
  .nav-card{min-height:0;padding:8px 10px;grid-template-columns:auto 1fr;background:transparent;border-color:transparent;align-items:center;}
  .nav-card:hover{transform:none;background:var(--wash);}
  .nav-card-code{width:26px;height:26px;font-size:.66rem;}
  .nav-card-title{font-size:.93rem;}
  .nav-card-copy{display:none;}
  .nav-links>a{display:flex;align-items:center;justify-content:space-between;min-height:46px;padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius-md);font-size:.96rem;color:var(--ink);background:rgb(var(--white-rgb) / .48);}
  .nav-links>a::after{display:none;}
  .nav-links .mobile-only{display:flex;}
  .nav-links .mobile-cta-link{justify-content:center;margin-top:0;border:0;color:var(--inverse-ink);background:var(--ink);}
  .burger{display:flex;margin-left:auto;}
  .burger[aria-expanded="true"]{border-color:var(--line);background:var(--bg);}
  .nav-cta{margin-left:0;}
  .nav-cta .btn{display:none;}
}
@media(max-width:520px){
  .nav-meta{display:none;}
}

/* ---- 10. FOOTER OS (shared second operating system) ---- */
.footer{background:var(--inverse-bg);color:var(--inverse-ink);}
.footer a{color:var(--tx-on-62);transition:color .2s;}
.footer a:hover{color:var(--white);}
.foot-cta{border-bottom:1px solid var(--line-on-dash);padding-block:clamp(56px,8vw,104px);}
.foot-cta h2{font-size:var(--h2);line-height:var(--lead-display);letter-spacing:var(--tr-display);font-weight:500;max-width:18ch;}
.foot-cta .rot-line{font-family:var(--mono);color:var(--faint);font-size:.8rem;letter-spacing:.1em;text-transform:uppercase;margin-top:18px;}
.rot{display:inline-block;height:1.1em;overflow:hidden;vertical-align:bottom;color:var(--lime);}
.rot ul{list-style:none;animation:rot 7.5s steps(5) infinite;}
@keyframes rot{0%,18%{transform:translateY(0)}20%,38%{transform:translateY(-100%)}40%,58%{transform:translateY(-200%)}60%,78%{transform:translateY(-300%)}80%,100%{transform:translateY(-400%)}}
.foot-grid{display:grid;grid-template-columns:1.6fr repeat(3,1fr);gap:var(--sp-2xl);padding-block:var(--sp-4xl) var(--sp-2xl);}
.foot-brand p{color:var(--tx-on-50);font-size:.92rem;max-width:34ch;margin-top:14px;}
.foot-col h4{font-family:var(--mono);font-size:var(--label-md);letter-spacing:var(--tr-label);text-transform:uppercase;color:var(--faint);margin-bottom:16px;}
.foot-col a{display:block;font-size:.92rem;padding:5px 0;}
.foot-bot{display:flex;justify-content:space-between;align-items:center;gap:20px;flex-wrap:wrap;
  border-top:1px solid var(--line-on-dash);padding-block:24px;font-family:var(--mono);font-size:.72rem;
  letter-spacing:.08em;text-transform:uppercase;color:var(--faint);}
@media(max-width:760px){.foot-grid{grid-template-columns:1fr 1fr;gap:var(--sp-xl);}.foot-brand{grid-column:1/-1;}}

/* ---- 11. MOTION (punctuation, not spectacle) ---- */
.rv{opacity:0;transform:translateY(18px);transition:opacity .7s var(--ease),transform .7s var(--ease);}
.rv.in{opacity:1;transform:none;}
.hero-phrase{display:inline-block;opacity:0;transform:translateY(.4em);
  animation:phraseIn .8s var(--ease) both;animation-delay:var(--d,0ms);}
@keyframes phraseIn{to{opacity:1;transform:none;}}

@media(prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important;scroll-behavior:auto!important;}
  .rv{opacity:1;transform:none;}
  .hero-phrase{opacity:1;transform:none;}
}
