/* Thai Broker Review v2 — clean/clear/professional design system (2026-07-02)
   ink navy + paper + emerald/amber/red semantics · Inter + Noto Sans Thai */
:root{
  --ink:#12291D; --ink2:#2A4A3A; --paper:#F8FCFA; --card:#FFFFFF; --line:#DFEDE5;
  --slate:#5F7A6C; --slate2:#93AC9E;
  --pos:#0E9F6E; --pos-bg:#E6F6EF; --warn:#B45309; --warn-bg:#FDF3E7;
  --neg:#B42318; --neg-bg:#FBEAE8; --info:#0B8A5C; --info-bg:#E9F7F0;
  --gold:#B7791F; --radius:14px; --shadow:0 1px 2px rgba(18,41,29,.05),0 8px 24px -12px rgba(18,41,29,.12);
}
*{box-sizing:border-box}
body{margin:0;background:var(--paper);color:var(--ink);
  font:400 16.5px/1.65 Inter,"Noto Sans Thai",-apple-system,"Segoe UI",sans-serif;
  -webkit-font-smoothing:antialiased}
html[lang=th] body{font-family:"Noto Sans Thai",Inter,sans-serif}
a{color:var(--info);text-decoration:none} a:hover{text-decoration:underline}
h1,h2,h3{line-height:1.25;font-weight:800;letter-spacing:-.015em}
main{max-width:1120px;margin:0 auto;padding:0 20px 72px}

/* nav */
.nav{position:sticky;top:0;z-index:50;display:flex;flex-wrap:wrap;align-items:center;gap:10px 22px;
  padding:14px 24px;background:rgba(255,255,255,.92);backdrop-filter:blur(8px);
  border-bottom:1px solid var(--line)}
.nav .brand{font-weight:800;font-size:19px;color:var(--ink);letter-spacing:-.02em}
.nav .brand .wt{font-weight:400;color:var(--slate);font-size:12.5px}
.nav nav{margin-left:auto;display:flex;gap:18px;align-items:center;flex-wrap:wrap}
.nav nav a{color:var(--ink2);font-weight:600;font-size:14.5px}
.nav .lang{border:1.5px solid var(--line);border-radius:999px;padding:3px 13px;color:var(--ink);background:var(--card)}
.preview-flag{background:var(--warn-bg);color:var(--warn);text-align:center;
  font-size:13px;padding:7px 16px;border-bottom:1px solid #F3E2C7}

/* hero */
.hero{padding:64px 0 22px;max-width:820px}
.hero h1{font-size:clamp(34px,5vw,52px);margin:0 0 18px}
.hero .lead{font-size:19px;color:var(--ink2);margin:0}
.counters{display:flex;gap:14px;flex-wrap:wrap;margin:30px 0 8px}
.counters .c{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:16px 26px;min-width:150px}
.counters .n{font-size:30px;font-weight:800;color:var(--ink)}
.counters .l{font-size:13px;color:var(--slate);font-weight:600}

/* top-10 medal cards */
.rankgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:14px;margin:20px 0 8px}
.rankcard{position:relative;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:18px 16px 14px;display:block;color:var(--ink)}
.rankcard:hover{text-decoration:none;border-color:var(--slate2);transform:translateY(-2px);transition:.15s}
.rankcard .medal{position:absolute;top:-10px;left:-8px;width:30px;height:30px;border-radius:999px;
  background:var(--ink);color:#fff;font-weight:800;font-size:14px;display:flex;align-items:center;justify-content:center;
  box-shadow:var(--shadow)}
.rankcard.m1 .medal{background:var(--gold)} .rankcard.m2 .medal{background:#7C8A9C} .rankcard.m3 .medal{background:#A16B3F}
.rankcard .bn{font-weight:800;font-size:16.5px;margin-right:6px}
.rankcard .sc{font-size:26px;font-weight:800;color:var(--pos)}
.rankcard .sc small{font-size:13px;color:var(--slate);font-weight:600}
.rankcard .meta{font-size:12.5px;color:var(--slate);margin-top:4px;line-height:1.5}
.scale-note{font-size:13.5px;color:var(--slate);margin:2px 0 0}
.scale-note a{font-weight:600}

/* findings */
.findings{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px;margin:34px 0}
.findings .f{background:var(--card);border:1px solid var(--line);border-left:4px solid var(--ink);
  border-radius:10px;padding:16px 18px;box-shadow:var(--shadow)}
.findings h3{margin:0 0 6px;font-size:16px}
.findings p{margin:0;font-size:14px;color:var(--ink2)}

/* category cards */
.cats{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin:8px 0 34px}
.cats a{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);
  padding:16px 18px;color:var(--ink);font-weight:700;font-size:15px;display:block}
.cats a:hover{text-decoration:none;border-color:var(--slate2)}
.cats .sub{display:block;font-weight:400;font-size:13px;color:var(--slate);margin-top:4px}

/* section heads */
.sh{margin:40px 0 6px;font-size:24px}
.shsub{margin:0 0 16px;color:var(--slate);font-size:14.5px}

/* comparison table */
.tablewrap{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:18px;overflow-x:auto}
.controls{display:flex;gap:18px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.controls input{border:1.5px solid var(--line);border-radius:9px;
  padding:9px 14px;font:inherit;font-size:14.5px;min-width:220px}
.controls input[type=checkbox]{min-width:0}
.controls label{font-size:14px;color:var(--ink2);display:flex;gap:6px;align-items:center}
table.cmp{width:100%;border-collapse:collapse;font-size:14.5px;min-width:760px}
.cmp th{font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--slate);
  text-align:left;padding:10px 12px;border-bottom:2px solid var(--line);cursor:pointer;user-select:none;white-space:nowrap}
.cmp th:hover{color:var(--ink)}
.cmp td{padding:12px;border-bottom:1px solid var(--line);vertical-align:middle}
.cmp tr:hover td{background:#F4FBF7}
.cmp .scnum{font-weight:800;font-size:16px}
.rev{font-weight:700;white-space:nowrap}

/* badges + chips */
.badge{display:inline-block;border-radius:999px;padding:3px 11px;font-size:12.5px;font-weight:700;
  background:#EDF5F0;color:var(--ink2);margin:2px 4px 2px 0;white-space:nowrap}
.badge.t1{background:var(--pos-bg);color:var(--pos)}
.badge.t2{background:#EAF0FD;color:#1D4ED8}
.badge.t3{background:#EDF5F0;color:var(--ink2)}
/* Fix 5 (§3b/§5): licence-badge classes were binary t1/t3 — Tier-2 (FSCA/DFSA) shared a class
   with genuine Tier-3/offshore entries, and unregulated/registry-only/revoked entities (e.g. the
   St. Vincent shell entity rendering as "SV") shared t3 with real offshore regulators too. .t2 is
   new (blue, between t1's green and t3's neutral gray); .tno is the not-a-real-regulator class
   (Revoked/Unregulated/Not a regulator/Registry only) — red, visually distinct from every
   regulator tier, matching the amber/red honesty-signal language the site already uses. */
.badge.tno{background:var(--neg-bg);color:var(--neg)}
.badge.pos{background:var(--pos-bg);color:var(--pos)}
.badge.mix{background:var(--warn-bg);color:var(--warn)}
.badge.neg{background:var(--neg-bg);color:var(--neg)}
.badge.thin{background:#EDF5F0;color:var(--slate)}
.chips{display:flex;gap:8px;flex-wrap:wrap}
.chip{border-radius:999px;padding:4px 13px;font-size:13.5px;font-weight:600;border:1.5px solid var(--line);color:var(--slate)}
.chip.on{background:var(--pos-bg);border-color:transparent;color:var(--pos)}
.chip.off{background:#F0F5F2;color:var(--slate2);text-decoration:line-through}
.chip.unk{background:#F8FAFC;color:var(--slate2)}
.ver,.ind{font-size:11.5px;font-weight:700;border-radius:6px;padding:1.5px 7px;vertical-align:middle}
.ver{background:var(--pos-bg);color:var(--pos)} .ind{background:var(--warn-bg);color:var(--warn)}

/* broker page */
.crumb{font-size:13px;color:var(--slate);margin:22px 0 8px}
.crumb a{color:var(--slate)}
.broker .bhead{display:flex;gap:26px;align-items:flex-start;flex-wrap:wrap;margin:6px 0 18px}
.broker h1{font-size:clamp(28px,4vw,40px);margin:0}
.broker h1 .pop{display:block;font-size:14px;color:var(--slate);font-weight:600;letter-spacing:0;margin-top:2px}
.scorebox{margin-left:auto;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:16px 22px;display:flex;gap:22px;align-items:center;min-width:300px}
.scorebox .big{font-size:44px;font-weight:800;color:var(--pos);line-height:1}
.scorebox .big small{font-size:15px;color:var(--slate);font-weight:600}
.scorebox .big.low{color:var(--neg)} .scorebox .big.mid{color:var(--warn)}
.subs{flex:1;min-width:170px}
.subs .s{display:grid;grid-template-columns:1fr auto;gap:8px;font-size:12px;color:var(--slate);
  font-weight:600;align-items:center;margin:3px 0}
.subs .bar{grid-column:1/3;height:5px;border-radius:99px;background:#E7F1EB;overflow:hidden}
.subs .bar i{display:block;height:100%;border-radius:99px;background:var(--pos)}
.subs .bar i.mid{background:var(--warn)} .subs .bar i.low{background:var(--neg)}
.badges{margin:10px 0 0}

.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:22px 24px;margin:16px 0}
.card h2{margin:0 0 12px;font-size:19px}
.card.verdict{border-left:5px solid var(--pos);background:linear-gradient(180deg,#F4FBF8,#FFF)}
.card.danger{border-left:5px solid var(--neg)}
.card.danger h2{color:var(--neg)}
.card.good{border-left:5px solid var(--pos)}
.card.warn{border-left:5px solid var(--warn)}
.cols{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:760px){.cols{grid-template-columns:1fr}.scorebox{margin-left:0;width:100%}}
ul{margin:8px 0;padding-left:22px} li{margin:5px 0}

/* licence card grid */
.licgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:12px}
.lic{border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:#FBFDFC}
.lic .auth{font-weight:700;font-size:14.5px}
.lic .jur{font-size:12.5px;color:var(--slate);margin:2px 0 6px}
.lic .no{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;color:var(--ink2)}
.lic .tier{float:right}

/* kv + reg tables */
table.kv,table.reg{width:100%;border-collapse:collapse;font-size:14.5px}
.kv th{width:220px;text-align:left;color:var(--slate);font-weight:600;padding:9px 10px 9px 0;vertical-align:top}
.kv td{padding:9px 0;border-bottom:1px solid var(--line)}
.kv tr:last-child td{border-bottom:0}
.reg th{font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--slate);text-align:left;padding:8px 10px;border-bottom:2px solid var(--line)}
.reg td{padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:top}

/* red flags severity */
ul.rf{list-style:none;padding-left:0}
.rf-severe{background:var(--neg-bg);border-radius:8px;padding:8px 12px;margin:6px 0}
.rf-severe::before{content:"⛔ ";font-weight:700}
.rf-minor{margin:6px 0;padding:2px 12px}
.rf-minor::before{content:"⚠ ";color:var(--warn)}

/* CTA */
.cta{display:block;text-align:center;background:var(--ink);color:#fff;font-weight:800;font-size:17px;
  border-radius:12px;padding:17px 20px;margin:26px 0 6px;box-shadow:var(--shadow)}
.cta:hover{text-decoration:none;background:var(--ink2)}
.cta .disc{display:block;font-weight:400;font-size:12.5px;color:#BFD0E2;margin-top:4px}
.stamp{font-size:12.5px;color:var(--slate);margin:10px 0 0}
.caveat{font-size:13.5px;color:var(--slate);background:#F0F7F3;border-radius:10px;padding:12px 16px}
.back{font-size:14px;font-weight:600}
.muted{color:var(--slate);font-size:14px}

/* category ranking pages */
.catlist{counter-reset:rk}
.catrow{display:flex;gap:18px;align-items:center;background:var(--card);border:1px solid var(--line);
  border-radius:var(--radius);box-shadow:var(--shadow);padding:16px 20px;margin:12px 0;color:var(--ink)}
.catrow:hover{text-decoration:none;border-color:var(--slate2)}
.catrow .rk{counter-increment:rk;min-width:34px;font-size:20px;font-weight:800;color:var(--slate)}
.catrow .rk::before{content:counter(rk)}
.catrow .bn{font-weight:800;font-size:17px}
.catrow .why{font-size:13.5px;color:var(--slate);margin-top:2px}
.catrow .sc{margin-left:auto;font-size:22px;font-weight:800;color:var(--pos);white-space:nowrap}
.catrow .sc small{font-size:12px;color:var(--slate);font-weight:600}

/* docs + faq */
.doc{max-width:780px}
.doc h1{font-size:clamp(28px,4vw,38px);margin:26px 0 10px}
.doc h2{font-size:20px;margin:28px 0 8px}
.doc .lead{font-size:18px;color:var(--ink2)}
details.faq{background:var(--card);border:1px solid var(--line);border-radius:10px;
  padding:14px 18px;margin:10px 0;box-shadow:var(--shadow)}
details.faq summary{font-weight:700;cursor:pointer;font-size:15.5px}
details.faq[open] summary{margin-bottom:8px}
table.wts{border-collapse:collapse;font-size:14.5px;margin:10px 0}
.wts th,.wts td{border:1px solid var(--line);padding:8px 14px;text-align:left}
.wts th{background:#F0F7F3;font-size:12.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--slate)}

/* anti-solicitation strip + footer */
.antisolicit{margin:44px 0 0;text-align:center;font-size:13px;color:var(--slate);
  background:var(--card);border:1px dashed var(--line);border-radius:10px;padding:12px 18px}
footer{max-width:1120px;margin:26px auto 0;padding:26px 20px 60px;border-top:1px solid var(--line);
  color:var(--ink2);font-size:14px}
footer .fine{color:var(--slate);font-size:12.5px}

/* ===== v2.1 — motion + color + friendliness (2026-07-02) ===== */
html{scroll-behavior:smooth}
body{animation:pagein .5s ease-out}
@keyframes pagein{from{opacity:0}to{opacity:1}}
@keyframes fadeup{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
.reveal{opacity:0;transform:translateY(18px);transition:opacity .6s ease,transform .6s cubic-bezier(.2,.7,.3,1)}
.reveal.in{opacity:1;transform:none}
.card,.rankcard,.catrow,.cats a,.findings .f,.counters .c{transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}
.card:hover{box-shadow:0 2px 4px rgba(14,27,44,.06),0 14px 34px -14px rgba(14,27,44,.18)}
.rankcard:hover,.cats a:hover,.catrow:hover{transform:translateY(-3px);box-shadow:0 4px 8px rgba(14,27,44,.06),0 18px 38px -14px rgba(14,27,44,.22)}

/* hero wash + buttons */
.hero{position:relative}
.hero::before{content:"";position:absolute;inset:-40px -50vw 0 -50vw;z-index:-1;
  background:radial-gradient(700px 340px at 18% 8%,#E9F7F0 0%,transparent 62%),
             radial-gradient(600px 300px at 85% 20%,#F0FAF3 0%,transparent 60%)}
.hero h1 em{font-style:normal;background:linear-gradient(92deg,var(--pos),var(--info));
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.herobtns{display:flex;gap:12px;margin-top:26px;flex-wrap:wrap}
.btn{display:inline-block;font-weight:800;font-size:15.5px;border-radius:11px;padding:13px 24px;transition:transform .15s ease,box-shadow .15s ease}
.btn:hover{text-decoration:none;transform:translateY(-2px)}
.btn.pri{background:linear-gradient(120deg,var(--pos) 0%,#0B7A56 100%);color:#fff;box-shadow:0 8px 20px -8px rgba(14,159,110,.55)}
.btn.sec{background:var(--card);border:1.5px solid var(--line);color:var(--ink)}

/* colored findings */
.findings .f:nth-child(1){border-left-color:var(--pos);background:linear-gradient(180deg,#FAFEFC,#FFF)}
.findings .f:nth-child(2){border-left-color:#7BC9A4;background:linear-gradient(180deg,#FAFEFC,#FFF)}
.findings .f:nth-child(3){border-left-color:var(--warn);background:linear-gradient(180deg,#FFFDF9,#FFF)}
.findings .f:nth-child(4){border-left-color:var(--pos);background:linear-gradient(180deg,#FAFEFC,#FFF)}

/* friendly category picker */
.cats a{display:flex;gap:14px;align-items:center}
.cats .ic{flex:0 0 44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:22px}
.cats a:nth-child(1) .ic{background:#E9F7F0} .cats a:nth-child(2) .ic{background:#DFF3E9}
.cats a:nth-child(3) .ic{background:#F0FAF3} .cats a:nth-child(4) .ic{background:#E6F6EF}
.cats .q{display:block;font-size:12px;font-weight:600;color:var(--slate);text-transform:uppercase;letter-spacing:.05em}

/* top-3 medal tint */
.rankcard.m1{background:linear-gradient(180deg,#FFFBF2,#FFF);border-color:#EAD9AE}
.rankcard.m2{background:linear-gradient(180deg,#F6FAF8,#FFF)}
.rankcard.m3{background:linear-gradient(180deg,#FDF8F4,#FFF)}

/* animated score bars + counters */
.subs .bar i{width:var(--w,0%);animation:grow 1.1s cubic-bezier(.2,.7,.3,1)}
@keyframes grow{from{width:0}}
.counters .n{color:var(--pos)}

/* gradient CTA */
.cta{background:linear-gradient(120deg,#0E9F6E 0%,#0B7A56 100%);background-size:160% 100%;transition:background-position .35s ease,transform .15s ease}
.cta:hover{background-position:90% 0;transform:translateY(-2px)}

/* broker-page jump chips */
.jumps{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0 4px}
.jumps a{border:1.5px solid var(--line);background:var(--card);border-radius:999px;padding:5px 14px;
  font-size:13px;font-weight:700;color:var(--ink2);transition:all .15s ease}
.jumps a:hover{text-decoration:none;border-color:var(--pos);color:var(--pos);transform:translateY(-1px)}
section[id],h2[id],h3[id],#cta{scroll-margin-top:86px}

@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  body,.reveal,.subs .bar i{animation:none;transition:none}
  .reveal{opacity:1;transform:none}
}


/* ===== v3 — white/green + friendliness (2026-07-02) ===== */
.swd{display:inline-block;border-radius:999px;padding:2px 12px;font-size:12.5px;font-weight:800;margin-top:4px}
.swd.pos{background:var(--pos-bg);color:var(--pos)} .swd.mid{background:var(--warn-bg);color:var(--warn)} .swd.low{background:var(--neg-bg);color:var(--neg)}
.rankcard .swd{margin-top:6px}
details.morex summary{cursor:pointer;list-style:none;color:var(--ink2)}
details.morex summary::-webkit-details-marker{display:none}
details.morex .rm{color:var(--pos);font-weight:800;font-size:13.5px;white-space:nowrap}
details.morex[open] summary .tr{display:none}
details.morex[open] summary .rm .open-label{display:inline}
details.morex p{margin:8px 0 0}
.nav nav a:hover{color:var(--pos);text-decoration:none}
h2.sh{position:relative;padding-left:16px}
h2.sh::before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:5px;border-radius:99px;background:linear-gradient(180deg,var(--pos),#7BC9A4)}

/* ===== v4 — compare + filters + learn (2026-07-02) ===== */
.controls select{border:1.5px solid var(--line);border-radius:9px;padding:9px 12px;font:inherit;font-size:14px;background:var(--card);color:var(--ink2)}
.cmpk{font-size:13px;font-weight:700;color:var(--slate);white-space:nowrap;cursor:pointer}
.cmpk input{accent-color:var(--pos)}
.cmpbar{position:fixed;left:50%;transform:translateX(-50%);bottom:18px;z-index:60;display:flex;gap:16px;align-items:center;
  background:var(--ink);color:#fff;border-radius:999px;padding:10px 12px 10px 22px;box-shadow:0 12px 30px -8px rgba(18,41,29,.45);
  font-size:14px;font-weight:700;max-width:92vw}
.cmpbar .btn{padding:9px 18px;font-size:14px}
.cmptab th{white-space:nowrap}
.cmptab td{vertical-align:top}

/* ===== v5 — broker logos + per-broker brand theming (2026-07-02) ===== */
.blogo-sm{width:22px;height:22px;border-radius:6px;object-fit:contain;vertical-align:middle;margin-right:8px;background:#fff;border:1px solid var(--line);padding:2px}
.blogo-lg{width:52px;height:52px;border-radius:13px;object-fit:contain;background:#fff;border:1px solid var(--line);padding:7px;box-shadow:var(--shadow);flex:0 0 52px}
.bhl{display:flex;gap:12px;align-items:center}
.rankcard .bhl{gap:9px;margin-bottom:2px}
.rankcard .blogo-sm{margin-right:0}
.brandstrip{height:5px;border-radius:99px;margin:2px 0 14px;max-width:340px;
  background:linear-gradient(90deg,var(--brand,#0E9F6E) 0%,color-mix(in srgb,var(--brand,#0E9F6E) 25%,transparent) 70%,transparent 100%)}
.broker .card.verdict{border-left-color:var(--brand,#0E9F6E)}
.broker .scorebox{border-top:4px solid var(--brand,#0E9F6E)}
.broker .jumps a:hover{border-color:var(--brand,#0E9F6E);color:var(--brand,#0E9F6E)}
.broker .cta{background:linear-gradient(120deg,color-mix(in srgb,var(--brand,#0E9F6E) 80%,#083) 0%,#0B7A56 130%)}
.cmptab th img{margin-right:6px}

/* ===== v6 — simplest look: left jump bar + regulator chips (2026-07-02) ===== */
.side{display:none}
@media(min-width:1280px){
  .side{display:flex;flex-direction:column;gap:2px;position:fixed;left:18px;top:130px;width:168px;z-index:40;
    background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px}
  .side a{color:var(--ink2);font-size:13.5px;font-weight:600;padding:7px 10px;border-radius:8px}
  .side a:hover{background:var(--info-bg);color:var(--pos);text-decoration:none}
  .side .sidehead{display:flex;gap:8px;align-items:center;font-size:14px;padding:2px 10px 10px;border-bottom:1px solid var(--line);margin-bottom:6px}
  .side .sidehead .blogo-sm{margin-right:0}
  .side .sideback{margin-top:6px;border-top:1px solid var(--line);padding-top:10px;color:var(--slate);font-size:12.5px}
}
@media(min-width:1500px){ main{max-width:1120px} }
@media(min-width:1280px) and (max-width:1499px){ main{max-width:1000px;margin-left:210px} }
.licchips .badge{font-size:13.5px;padding:6px 15px}
.kv details.morex p{font-size:13.5px;color:var(--ink2)}
.caveat details.morex{display:inline}

/* ===== v7 — plug&play cards, Trustpilot carousel, blog Learn, whole-site type pass (2026-07-02) ===== */
/* typography normalization */
body{font-size:16px}
.card{padding:20px 22px}
.card h2{font-size:17.5px;margin:0 0 10px}
.sh{font-size:22px}
.hero h1{font-size:clamp(32px,4.6vw,48px)}
.hero .lead{font-size:18px}
html[lang=th] h1,html[lang=th] h2,html[lang=th] h3{letter-spacing:0}
html[lang=th] body{line-height:1.75}
.badge{vertical-align:middle}
.counters .c{flex:1 1 150px;text-align:center}
.rankgrid{grid-auto-rows:1fr}
.footer,footer{text-align:center}

/* plug&play hero card */
.hero-card{border-top:5px solid var(--brand,#0E9F6E);padding:24px 26px}
.hero-card .badges{margin:8px 0 6px}
.hero-card .licchips{margin-top:2px}
.hero-card .licchips .badge{font-size:12px;padding:4px 12px}
.qfgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:18px 0 4px}
.qf{background:var(--paper);border:1px solid var(--line);border-radius:11px;padding:10px 14px}
.qf .qfl{display:block;font-size:11.5px;font-weight:700;color:var(--slate);text-transform:uppercase;letter-spacing:.04em}
.qf b{font-size:15.5px}
.hero-card .cta{margin:16px 0 0}

/* sticky mobile CTA */
.stickycta{display:none}
@media(max-width:760px){
  .stickycta{display:block;position:fixed;left:10px;right:10px;bottom:10px;z-index:70}
  .stickycta .cta{margin:0;padding:14px;font-size:15.5px;box-shadow:0 10px 30px -6px rgba(18,41,29,.4)}
  .stickycta .cta .disc{display:none}
  main{padding-bottom:110px}
}

/* Trustpilot carousel (static fallback — brokers with no fresh _tp_reviews.json data) */
.tprate{color:#00B67A;font-weight:800;font-size:15px;margin-left:8px}
.tprow{display:flex;gap:12px;overflow-x:auto;scroll-snap-type:x mandatory;padding:4px 2px 8px;-webkit-overflow-scrolling:touch}
.tpcard{min-width:270px;max-width:300px;flex:0 0 auto;scroll-snap-align:start;background:var(--paper);
  border:1px solid var(--line);border-radius:12px;padding:14px 16px}
.tpcard p{margin:6px 0;font-size:14px;line-height:1.55;color:var(--ink2)}
.tpstars{color:#00B67A;letter-spacing:2px;font-size:14px}
.tpwho{font-size:12px;color:var(--slate);font-weight:600}

/* Trustpilot LOOP MARQUEE (2026-07-03) — 30-50 real reviews, continuous scroll left→right loop */
.tpmarquee{overflow:hidden;position:relative;margin:4px 0 8px;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 28px,#000 calc(100% - 28px),transparent);
  mask-image:linear-gradient(90deg,transparent,#000 28px,#000 calc(100% - 28px),transparent)}
.tpmtrack{display:flex;width:max-content;padding:4px 0 8px;animation:tpscroll var(--tpdur,60s) linear infinite}
.tpmarquee:hover .tpmtrack,.tpmarquee:focus-within .tpmtrack{animation-play-state:paused}
.tpmset{display:contents}
@keyframes tpscroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.tpmcard{min-width:270px;max-width:300px;flex:0 0 auto;margin-right:12px;background:var(--paper);
  border:1px solid var(--line);border-radius:12px;padding:14px 16px}
.tpmcard p{margin:6px 0;font-size:14px;line-height:1.55;color:var(--ink2);
  display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden}
@media (prefers-reduced-motion:reduce){
  .tpmtrack{animation:none!important;transform:none!important}
  .tpmarquee{overflow-x:auto;-webkit-overflow-scrolling:touch;
    -webkit-mask-image:none;mask-image:none}
  .tpmset[aria-hidden]{display:none}
}

/* Learn blog grid */
.ltabs{display:flex;gap:8px;flex-wrap:wrap;margin:6px 0 18px}
.ltab{border:1.5px solid var(--line);background:var(--card);border-radius:999px;padding:7px 18px;
  font:600 14px Inter,"Noto Sans Thai",sans-serif;color:var(--ink2);cursor:pointer;transition:all .15s ease}
.ltab.on,.ltab:hover{background:var(--pos);border-color:var(--pos);color:#fff}
.lgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-bottom:40px}
.lcard{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);
  overflow:hidden;color:var(--ink);display:flex;flex-direction:column;transition:transform .15s ease,box-shadow .15s ease}
.lcard:hover{text-decoration:none;transform:translateY(-3px);box-shadow:0 14px 34px -12px rgba(18,41,29,.22)}
.lthumb{width:100%;height:150px;object-fit:cover;display:block}
.lbody{padding:14px 16px 16px}
.lbody b{font-size:15.5px;line-height:1.4;display:block;margin:6px 0 4px}
.lbody p{margin:0;font-size:13px;color:var(--slate)}
.lcat{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--pos)}
.lsoon{opacity:.65;border-style:dashed;justify-content:center;min-height:120px}

/* ===== v8 — readability + positive-only (2026-07-02) ===== */
/* uniform readable CTA — per-broker brand gradients made light-on-light text (Exness yellow) */
.broker .cta{background:linear-gradient(120deg,#0E9F6E 0%,#0B7A56 100%)}
.tpwho{color:var(--slate);font-size:12.5px}
.qf .qfl{font-size:12px}
.muted{font-size:14.5px}
footer .fine{font-size:13px}
.lbody p{font-size:13.5px}
.cmp td{line-height:1.5}
.side a{line-height:1.4}
.cta .disc{color:#D7EFE4}

/* ===== v9 — heroic hero, marquee, steps, one-line rows, mobile pass (2026-07-02) ===== */
/* one-line broker names + compact chips in the table */
.cmp td:first-child{white-space:nowrap}
.cmp .licchips{flex-wrap:nowrap}
.cmp .licchips .badge{font-size:11.5px;padding:3px 10px}
.cmp tbody tr:nth-child(even) td{background:#FAFCFB}

/* heroic dark hero */
.hero.herodark{position:relative;max-width:none;margin:26px -20px 0;padding:74px 40px 66px;border-radius:22px;
  background:linear-gradient(135deg,#0B2E20 0%,#0E3A2A 55%,#0A1F33 130%);overflow:hidden;color:#fff}
.hero.herodark::before{display:none}
.hero.herodark::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(700px 400px at 82% 30%,rgba(14,159,110,.28),transparent 65%)}
.heroin{position:relative;z-index:2;max-width:640px}
.herodark h1{color:#fff;font-size:clamp(34px,5vw,56px);margin:0 0 14px}
.herodark h1 em{background:linear-gradient(92deg,#5EEAB4,#A7F3D0);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.herodark .lead{color:#C9E7D9;font-size:18px}
.herodark .counters .c{background:rgba(255,255,255,.07);border-color:rgba(255,255,255,.14);backdrop-filter:blur(6px)}
.herodark .counters .n{color:#5EEAB4}
.herodark .counters .l{color:#A9CBBB}
.btn.hsec{background:rgba(255,255,255,.1);border:1.5px solid rgba(255,255,255,.3);color:#fff}
.herochart{position:absolute;right:-30px;bottom:-12px;width:56%;max-width:640px;z-index:1;opacity:.9}
.hgrid{stroke:rgba(255,255,255,.08);stroke-width:1}
.hline{stroke:#5EEAB4;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:1;stroke-dashoffset:1;animation:hdraw 2.4s cubic-bezier(.3,.7,.3,1) .3s forwards;
  filter:drop-shadow(0 0 8px rgba(94,234,180,.55))}
@keyframes hdraw{to{stroke-dashoffset:0}}
.hdot{fill:#5EEAB4;opacity:0;animation:hpop .5s ease 2.6s forwards,hpulse 2s ease 3.1s infinite}
@keyframes hpop{to{opacity:1}}
@keyframes hpulse{0%,100%{r:7}50%{r:10}}

/* broker logo marquee */
.mq{overflow:hidden;margin:18px 0 6px;padding:14px 0;border-bottom:1px solid var(--line);
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.mq-in{display:flex;gap:42px;align-items:center;width:max-content;animation:mq 38s linear infinite}
.mq-in img{width:30px;height:30px;object-fit:contain;border-radius:8px;background:#fff;border:1px solid var(--line);padding:3px}
@keyframes mq{to{transform:translateX(-50%)}}
.mq:hover .mq-in{animation-play-state:paused}

/* 3 steps */
.steps3{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin:14px 0 8px}
.step{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px 20px;position:relative}
.stepn{display:inline-flex;width:30px;height:30px;border-radius:999px;background:var(--pos);color:#fff;font-weight:800;
  align-items:center;justify-content:center;margin-bottom:8px}
.step b{display:block;font-size:16px}
.step p{margin:4px 0 0;font-size:13.5px;color:var(--slate)}

/* mobile / tablet pass */
@media(max-width:900px){
  .herochart{opacity:.35;width:80%}
}
@media(max-width:700px){
  .hero.herodark{margin:14px -12px 0;padding:46px 22px 44px;border-radius:16px}
  .herodark h1{font-size:31px}
  .herodark .lead{font-size:15.5px}
  .herobtns .btn{flex:1;text-align:center;padding:13px 10px}
  .counters .c{padding:12px 14px;min-width:0}
  .counters .n{font-size:22px}
  .cmp th:nth-child(3),.cmp td:nth-child(3),.cmp th:nth-child(4),.cmp td:nth-child(4){display:none}
  table.cmp{min-width:540px}
  .qfgrid{grid-template-columns:1fr 1fr}
  .cmpk input{width:22px;height:22px}
  .jumps{overflow-x:auto;flex-wrap:nowrap;padding-bottom:4px}
  .jumps a{white-space:nowrap}
  .tablewrap{padding:12px}
  .lgrid{grid-template-columns:1fr}
  main{padding:0 14px 72px}
}
@media (prefers-reduced-motion:reduce){
  .hline{animation:none;stroke-dashoffset:0}
  .hdot{animation:none;opacity:1}
  .mq-in{animation:none}
}

/* ===== v10 — bigger cards, dropdown filters, update clock (2026-07-02) ===== */
.findings .f{padding:26px 28px}
.findings h3{font-size:19px;margin-bottom:8px}
.findings p{font-size:15.5px;line-height:1.6}
.cats a{padding:24px 26px;font-size:17px}
.cats .ic{flex:0 0 54px;height:54px;font-size:26px;border-radius:14px}
.cats .q{font-size:13px}
.cats .sub{font-size:14.5px;margin-top:6px}
.step{padding:24px 26px}
.step b{font-size:18px}
.step p{font-size:15px}
.counters .n{font-size:34px}
.counters .l{font-size:13.5px}
details.faq{padding:18px 22px}
details.faq summary{font-size:16.5px}
.preview-flag .updclock{font-weight:700}

/* ===== v11 — table-row hover expansion, all 35 rows (founder-approved mockup v3) ===== */
.cmp tbody.rowgrp{border-bottom:1px solid var(--line)}
.cmp tbody.rowgrp:nth-of-type(even) tr.base td{background:#FAFCFB}
.cmp tbody.rowgrp tr.base td{border-bottom:0;transition:background .2s}
.cmp tbody.rowgrp:hover tr.base td{background:#F4FBF7}
.cmp tr.exptr td{padding:0;border-bottom:0;background:#F7FCF9}
.expwrap{max-height:0;opacity:0;overflow:hidden;transition:max-height .45s cubic-bezier(.2,.7,.3,1),opacity .3s .1s;
  border-left:4px solid var(--bc,#0E9F6E)}
.expin{display:grid;grid-template-columns:280px minmax(0,1fr) 185px;gap:22px;align-items:center;padding:8px 16px 18px}
.expin .mbar{font-size:11.5px;color:var(--slate);font-weight:600;margin:5px 0}
.expin .mbar em{display:block;height:6px;border-radius:99px;background:#E7F1EB;margin-top:2px}
.expin .mbar i{display:block;height:100%;border-radius:99px;background:var(--bc,#0E9F6E);min-width:6px;filter:saturate(.85) brightness(.82)}
.tfacts{display:flex;gap:8px 18px;font-size:13px;font-weight:700;flex-wrap:wrap;margin-bottom:8px}
.trate{color:#00B67A}
.tquote{font-size:12.5px;color:var(--ink2);background:#EFF9F3;border-radius:10px;padding:9px 12px;margin:0}
.tcta{display:block;text-align:center;background:linear-gradient(120deg,#0E9F6E,#0B7A56);color:#fff;font-weight:800;
  border-radius:10px;padding:13px 10px;text-decoration:none;font-size:14px}
.tcta:hover{text-decoration:none;transform:translateY(-1px)}
@media(max-width:900px){
  .expin{grid-template-columns:1fr;gap:10px;padding:6px 14px 16px}
}
@media (prefers-reduced-motion:reduce){.expwrap{transition:none}}

/* ===== v12 — overlap fix, REAL font bump, bigger sidebar, more color (2026-07-02) ===== */
/* 1 · expanded-row overlap fix: columns can no longer bleed under the CTA */
@media(min-width:901px){
  .expin{grid-template-columns:270px minmax(0,1fr) 190px}
}
.expin .tcol{min-width:0}
.tquote{overflow-wrap:anywhere;white-space:normal}

/* 2 · site-wide font scale bump */
body{font-size:17px}
table.cmp{font-size:16px}
.cmp td{padding:15px 14px}
.cmp th{font-size:13px}
.cmp .scnum{font-size:19px}
.badge{font-size:13.5px;padding:4px 13px}
.licchips .badge{font-size:13px;padding:5px 14px}
.cmp .licchips .badge{font-size:12.5px;padding:4px 12px}
.card h2{font-size:20px}
.sh{font-size:26px}
.shsub{font-size:16px}
.hero .lead,.herodark .lead{font-size:20px}
.findings h3{font-size:20px}
.findings p{font-size:16px}
.cats a{font-size:18px}
.cats .sub{font-size:15.5px}
.cats .q{font-size:13.5px}
.step b{font-size:19px}
.step p{font-size:16px}
.counters .n{font-size:38px}
.counters .l{font-size:14.5px}
.rankcard .bn{font-size:18px}
.rankcard .sc{font-size:30px}
.rankcard .swd,.swd{font-size:13.5px}
.rankcard .meta{font-size:14px}
.controls input,.controls select{font-size:15.5px;padding:11px 15px}
details.faq summary{font-size:17.5px}
details.faq p{font-size:16px}
.jumps a{font-size:14.5px;padding:7px 16px}
.qf b{font-size:17.5px}
.qf .qfl{font-size:12.5px}
.scorebox .big{font-size:48px}
.subs .s{font-size:13px}
.muted{font-size:15.5px}
.expin .mbar{font-size:13px}
.tfacts{font-size:15px}
.tquote{font-size:14px}
.tcta{font-size:15.5px;padding:15px 12px}
.lbody b{font-size:17px}
.lbody p{font-size:14.5px}
footer{font-size:15px}

/* 4 · bigger left sidebar */
@media(min-width:1280px){
  .side{width:216px;padding:16px;gap:4px}
  .side a{font-size:15.5px;padding:10px 12px}
  .side .sidehead{font-size:16.5px;padding:4px 12px 12px}
}
@media(min-width:1280px) and (max-width:1499px){ main{margin-left:250px} }

/* 5 · more color — kill the "too white" */
body{background:linear-gradient(180deg,#EAF7EF 0%,#F5FAFF 340px,#F8FCFA 700px)}
.preview-flag{background:#0B2E20;color:#CDEBDC;border-bottom:0;font-weight:600}
.preview-flag .updclock{color:#5EEAB4}
.cmp thead th{background:#0B2E20;color:#EDF7F1;padding:13px 14px}
.cmp thead th:hover{color:#5EEAB4}
.tablewrap{border-top:5px solid #0E9F6E}
.steps3{background:linear-gradient(120deg,#E9F7F0,#E8F1FD);border-radius:18px;padding:20px}
.step{border:0;box-shadow:0 6px 18px -8px rgba(18,41,29,.15)}
.step:nth-child(1) .stepn{background:#0E9F6E}
.step:nth-child(2) .stepn{background:#1D4ED8}
.step:nth-child(3) .stepn{background:#B45309}
.cats a{border-top:4px solid #0E9F6E}
.cats a:nth-child(2){border-top-color:#1D4ED8}
.cats a:nth-child(3){border-top-color:#B45309}
.cats a:nth-child(4){border-top-color:#7C3AED}
.findings .f{box-shadow:0 6px 18px -8px rgba(18,41,29,.12)}
.findings .f:nth-child(1){background:linear-gradient(180deg,#EAF7F0,#FFF)}
.findings .f:nth-child(2){background:linear-gradient(180deg,#EAF0FD,#FFF);border-left-color:#1D4ED8}
.findings .f:nth-child(3){background:linear-gradient(180deg,#FDF3E7,#FFF);border-left-color:#B45309}
.findings .f:nth-child(4){background:linear-gradient(180deg,#F3EDFD,#FFF);border-left-color:#7C3AED}
.counters .c:nth-child(1) .n{color:#0E9F6E}
.counters .c:nth-child(2) .n{color:#5EEAB4}
.counters .c:nth-child(3) .n{color:#FBBF24}
footer{background:#0B2E20;color:#C9E7D9;border-top:0;max-width:none;padding:34px 20px 64px}
footer p{max-width:1080px;margin:0 auto 10px}
footer .fine{color:#7FA795}
.antisolicit{background:#EDF5F0;border-color:#CDE5D6}
.mq{background:#fff;border-radius:14px;border:1px solid var(--line);margin:20px 0 10px;
  -webkit-mask-image:none;mask-image:none}
/* v12.1 — keep expanded panel inside the visible area (td spans the full scrollable table width) */
.expwrap{position:sticky;left:0;max-width:1062px}
@media(max-width:1140px){.expwrap{max-width:calc(100vw - 76px)}}
/* v12.2 — panel width follows the actual visible table container (container units) */
.tablewrap{container-type:inline-size}
.expwrap{max-width:calc(100cqw - 38px)}

/* ===== v13 — BIG fonts for real + nothing out of frame (2026-07-02) ===== */
/* layout: use the whole screen, sidebar + content never collide, table never clips */
@media(min-width:1280px){
  main{margin-left:266px;max-width:min(1420px,calc(100vw - 306px))}
}
@media(min-width:1800px){ main{margin-left:calc((100vw - 1420px)/2 + 120px)} }
table.cmp{min-width:0;width:100%;table-layout:auto}
@media(max-width:900px){ table.cmp{min-width:680px} }
.cmp td.act{white-space:nowrap}
.cmp td.act .cmpk{margin-left:12px}
.nav{padding-right:34px}

/* BIG type */
body{font-size:19px}
table.cmp{font-size:18px}
.cmp td{padding:18px 16px}
.cmp th{font-size:14.5px;padding:15px 16px}
.cmp td a strong{font-size:19px}
.cmp .scnum{font-size:23px}
.badge{font-size:15px;padding:5px 15px}
.cmp .licchips .badge{font-size:14px;padding:5px 14px}
.blogo-sm{width:28px;height:28px}
.rev{font-size:17px}
.card h2{font-size:23px}
.sh{font-size:31px}
.shsub{font-size:17.5px}
.hero .lead,.herodark .lead{font-size:22px}
.herodark h1{font-size:clamp(40px,5.4vw,64px)}
.findings h3{font-size:22px}
.findings p{font-size:17px}
.cats a{font-size:20px}
.cats .sub{font-size:16.5px}
.cats .q{font-size:14px}
.step b{font-size:21px}
.step p{font-size:17px}
.counters .n{font-size:44px}
.counters .l{font-size:15.5px}
.rankcard .bn{font-size:19px}
.rankcard .sc{font-size:34px}
.rankcard .meta{font-size:15px}
.swd{font-size:14.5px;padding:3px 14px}
.controls input,.controls select{font-size:17px;padding:13px 17px}
details.faq summary{font-size:19px}
details.faq p{font-size:17px}
.qf b{font-size:19px}
.qf .qfl{font-size:13.5px}
.scorebox .big{font-size:54px}
.subs .s{font-size:14px}
.expin .mbar{font-size:14.5px}
.tfacts{font-size:16.5px}
.tquote{font-size:15.5px}
.tcta{font-size:17px;padding:17px 14px}
.side a{font-size:16.5px;padding:11px 13px}
.side .sidehead{font-size:17.5px}
.lbody b{font-size:18px}
.lbody p{font-size:15.5px}
.ltab{font-size:15.5px;padding:9px 20px}
.btn{font-size:17px;padding:15px 28px}
.cta{font-size:19px;padding:19px 22px}
.crumb{font-size:14.5px}
.stamp{font-size:14px}
.antisolicit{font-size:14.5px}
footer{font-size:16px}
footer .fine{font-size:14px}
/* v13.1 — reclaim horizontal room so the actions column never clips */
@media(min-width:1280px){ main{margin-left:252px;max-width:min(1460px,calc(100vw - 286px))} }
.cmp td{padding:18px 11px}
.cmp th{padding:15px 11px}
.cmp .licchips .badge{font-size:13px;padding:4px 11px;margin-right:3px}
.cmp td.act{padding-right:6px}
.cmp td.act .cmpk{margin-left:8px}
.rev{font-size:16px}
.tablewrap{padding:18px 14px}

/* ===== v15 — Top-10 strict 5×2 + living hero (2026-07-02) ===== */
/* 1 · exactly 5 per row, 2 rows */
.rankgrid{grid-template-columns:repeat(5,1fr)}
@media(max-width:1100px){.rankgrid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:700px){.rankgrid{grid-template-columns:repeat(2,1fr)}}
.rankcard .bn{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;max-width:100%}
.rankcard .bhl{min-width:0}

/* 2 · hero in motion (all reduced-motion safe) */
.herodark::after{animation:heroglow 9s ease-in-out infinite alternate}
@keyframes heroglow{
  0%{background:radial-gradient(700px 400px at 82% 30%,rgba(14,159,110,.28),transparent 65%)}
  50%{background:radial-gradient(760px 430px at 70% 55%,rgba(94,234,180,.22),transparent 65%)}
  100%{background:radial-gradient(700px 400px at 88% 20%,rgba(29,78,216,.20),transparent 65%)}
}
.herodark h1 em{background:linear-gradient(92deg,#5EEAB4,#A7F3D0,#5EEAB4);background-size:220% 100%;
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
  animation:shimmer 5s linear infinite}
@keyframes shimmer{to{background-position:220% 0}}
.hline{animation:hdraw 2.4s cubic-bezier(.3,.7,.3,1) .3s forwards,lineglow 3.2s ease-in-out 3s infinite alternate}
@keyframes lineglow{
  from{filter:drop-shadow(0 0 6px rgba(94,234,180,.4));opacity:.8}
  to{filter:drop-shadow(0 0 16px rgba(94,234,180,.9));opacity:1}
}
.herodark .counters .c{animation:floaty 6s ease-in-out infinite}
.herodark .counters .c:nth-child(2){animation-delay:1.2s}
.herodark .counters .c:nth-child(3){animation-delay:2.4s}
@keyframes floaty{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
.herochart{animation:chartdrift 12s ease-in-out infinite alternate}
@keyframes chartdrift{from{transform:translateY(0)}to{transform:translateY(-14px)}}
@media (prefers-reduced-motion:reduce){
  .herodark::after,.herodark h1 em,.hline,.herodark .counters .c,.herochart{animation:none}
  .hline{stroke-dashoffset:0}
}

/* ===== v15.3 — REALLY smooth: eliminate paint storms + hover intent (2026-07-02) ===== */
/* hero glow: was animating `background` (full-panel repaint every frame) → two static layers crossfading opacity (compositor-only) */
.herodark::after{animation:none;background:radial-gradient(700px 400px at 82% 30%,rgba(14,159,110,.28),transparent 65%)}
.hero.herodark::before{content:"";display:block;position:absolute;inset:0;z-index:0;pointer-events:none;
  background:radial-gradient(760px 430px at 70% 55%,rgba(94,234,180,.20),transparent 65%),
             radial-gradient(500px 300px at 30% 80%,rgba(29,78,216,.15),transparent 60%);
  opacity:0;animation:glowfade 8s ease-in-out infinite alternate}
@keyframes glowfade{to{opacity:1}}
/* chart glow: was animating drop-shadow filter (expensive repaint) → static glow, pulse only the dot */
.hline{animation:hdraw 2.4s cubic-bezier(.3,.7,.3,1) .3s forwards;filter:drop-shadow(0 0 10px rgba(94,234,180,.6))}
/* row expansion: faster ease-out + hover-intent delay so skimming never triggers, GPU-pinned */
.cmp tbody.rowgrp .base td{transition:background .15s ease}
/* don't let card hover-shadows repaint during table interaction */
.tablewrap:hover{box-shadow:var(--shadow)}
@media (prefers-reduced-motion:reduce){.hero.herodark::before{animation:none}}


/* ===== v16 — HeadOfCX ruling: CLICK accordion, snap-height + compositor fade (2026-07-02) =====
   DO NOT re-add an interpolated height/max-height transition here: the rAF probe measured
   per-frame table reflow at 23.6ms mean / 80 jank frames. Any change to this mechanic must
   re-run site/_probe.html in a real browser before merging. */
.cmp tbody.rowgrp .base{cursor:pointer}
.cmp tbody.rowgrp:hover .base td{background:#F4FBF7}
.rowtoggle{background:none;border:0;padding:4px 6px;cursor:pointer;color:var(--slate);vertical-align:middle;
  transform:rotate(0deg);transition:transform .18s ease}
.cmp tbody.rowgrp.open .rowtoggle{transform:rotate(180deg);color:var(--pos)}
.rowtoggle:focus-visible{outline:2px solid var(--bc,#0E9F6E);outline-offset:2px;border-radius:4px}
.expwrap{display:grid;grid-template-rows:0fr;overflow:hidden;transition:none;position:sticky;left:0;max-width:calc(100cqw - 38px)}
.cmp tbody.rowgrp.open .expwrap{grid-template-rows:1fr}
.expwrap>.expin{min-height:0;overflow:hidden;opacity:0;transform:translateY(-6px);
  transition:opacity .18s ease,transform .18s ease}
.cmp tbody.rowgrp.open .expwrap>.expin{opacity:1;transform:none}
.cmp tr.exptr td{background:transparent}
.cmp tbody.rowgrp.open tr.exptr td{background:#F7FCF9}
@media (prefers-reduced-motion:reduce){.expwrap>.expin{transition:none}}
.cmp td.act .rowcta{display:inline-block;margin-left:8px;padding:7px 14px;font-size:14px;font-weight:800;
  border-radius:8px;background:linear-gradient(120deg,#0E9F6E,#0B7A56);color:#fff;text-decoration:none}
.cmp td.act .rowcta:hover{text-decoration:none;transform:translateY(-1px)}
/* v16.1 — neutralize v11 base clamps (max-height/opacity) superseded by grid-rows mechanism */
.expwrap{max-height:none !important;opacity:1}
/* v16.2 — collapsing element must carry ZERO vertical padding (it can't shrink below it) */
.expwrap>.expin{padding-top:0 !important;padding-bottom:0 !important}

/* ===== v17 — HOVER expands (founder's true intent), keeping the jank-free snap+fade mechanics =====
   Desktop hover-capable devices: mouseover opens the push-down panel (snap height, fade content).
   Click/chevron still pins open (and is the path for touch devices). */
@media (hover:hover){
  .cmp tbody.rowgrp:hover .expwrap{grid-template-rows:1fr}
  .cmp tbody.rowgrp:hover .expwrap>.expin{opacity:1;transform:none;transition-delay:.06s,.06s}
  .cmp tbody.rowgrp:hover tr.exptr td{background:#F7FCF9}
}

/* ===== v18 — Excel-style master comparison table on compare page ===== */
/* v19: fits the screen — no sideways scroll box (founder order); page-scoped
   main override in compare.html removes the index sidebar gutter */
.xlwrap{overflow:auto;max-height:none;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);border-top:5px solid #0E9F6E;width:100%}
table.xl{table-layout:fixed;width:100%;min-width:1100px;border-collapse:separate;border-spacing:0}
.xl td,.xl thead th{padding:12px 8px;font-size:15px}
.xl thead th{font-size:11.5px;white-space:normal;letter-spacing:.02em;padding:12px 6px}
/* D1 fix (2026-07-05, my v5-scoring regression — see FIX_QUEUE): columns were sized for
   pre-v5 short scores ("8.4") + short verdict words. v5's 2-decimal scores ("8.85") and the
   real verdict-word set (up to "Read closely first" / TH "ควรศึกษาเพิ่มเติม") measured wider
   than the Score/Verdict columns (real getBoundingClientRect: score content ~57px + Read-
   closely-first ~140px, vs old 53.5px/77.3px column boxes) — silently clipped by the blanket
   `.xl td{overflow:hidden}` below with no ellipsis (unlike every other column, which already
   degrades gracefully via ellipsis/line-clamp/wrap). Score 4.5%->7%, Verdict 6.5%->11% (fits
   "Good pick"/"Worth a look" on one line at every tested breakpoint: 901/1024/1280 EN+TH); the
   rarer long words fall back to wrap (below), never a hard clip. Difference reclaimed from
   columns that already have a graceful-degradation path (ellipsis/line-clamp/wrap), so nothing
   that was previously clipping-free becomes clipped: Broker 13.5%->12% (already ellipsis-
   truncates its one over-long name), Regulation 13%->12% (chips already flex-wrap), Leverage
   8%->7.5% (short_v() already self-truncates with its own "…"), Min deposit 5%->4.5% (already
   wraps, wave2c item 6), Spreads 12.5%->10.5% / Platforms 11%->9.5% (both already 2-line-clamp
   with an auto-ellipsis). Popularity/Support/Trustpilot/Action untouched (no slack — verified
   via matching real content-width to column-width; they were already at zero margin). Total
   still sums to exactly 100%. table min-width 1040->1100 gives every column a little more
   absolute room at the 901-1039px floor (where .xlwrap already scrolls sideways by design). */
.xl th:nth-child(1){width:12%}.xl th:nth-child(2){width:7%}.xl th:nth-child(3){width:11%}
.xl th:nth-child(4){width:6.5%}.xl th:nth-child(5){width:12%}.xl th:nth-child(6){width:7.5%}
.xl th:nth-child(7){width:4.5%}.xl th:nth-child(8){width:10.5%}.xl th:nth-child(9){width:9.5%}
.xl th:nth-child(10){width:5.5%}.xl th:nth-child(11){width:7%}.xl th:nth-child(12){width:7%}
.xl .rowcta{padding:8px 10px;font-size:13.5px}
.xl .cl2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:1.45}
.xl td .scnum{font-size:24px;font-variant-numeric:tabular-nums}
.xl .rowcta{white-space:nowrap;padding:8px 12px}
.xl td:first-child{overflow:hidden;text-overflow:ellipsis}
.xl .licchips{flex-wrap:wrap;gap:4px}
/* D1: verdict badge no longer force-nowrap — the rare long word (EN "Read closely first",
   TH "ควรศึกษาเพิ่มเติม") wraps to 2 lines inside the pill instead of clipping; the common
   words ("Good pick"/"Worth a look" and their TH equivalents) fit on one line at the new
   11% column width so this essentially never fires in practice. */
.xl .swd{font-size:13px}
.xl td:nth-child(2){overflow:visible}
.xl td:nth-child(3){overflow:visible;white-space:normal;text-align:left}
.xl td:nth-child(3) .swd{white-space:normal;display:inline-block;line-height:1.25}
.xl thead th{position:sticky;top:0;z-index:3;background:#0B2E20;color:#EDF7F1;cursor:pointer}
.xl thead th:first-child{left:0;z-index:4}
.xl td{border-bottom:1px solid var(--line);vertical-align:middle;background:#fff}
.xl tbody tr:nth-child(even) td{background:#FAFCFB}
.xl td:first-child,.xl thead th:first-child{position:sticky;left:0;z-index:2;box-shadow:2px 0 6px -3px rgba(18,41,29,.15)}
.xl td:first-child{white-space:nowrap}
.xl tbody tr:hover td{background:#F4FBF7}
.xl td{overflow:hidden}
/* wave2c item 6: Min deposit column (7th) — DOM string is already short_v()-truncated fine;
   the 5%-wide column + the general .xl td{overflow:hidden} above was clipping unverified/long
   values (e.g. SuperForex's "?") on desktop. Let this one column wrap instead of clip. */
.xl td:nth-child(7){overflow:visible;overflow-wrap:anywhere;white-space:normal}
.byline{color:var(--dim,#8a8f98);font-size:13px;margin:6px 0 14px}
.fundsum{font-size:13.5px;color:var(--dim,#6b7280);margin:2px 0 12px;line-height:1.45}

/* ===== v20 — WAVE-2 (2026-07-04): mobile_spec.md H1+H6+M13+M15 consolidated append,
   applied in the exact relative order the spec requires (H6 tablet/mobile pair
   is cascade-order-dependent; nothing else has an order dependency). ===== */
.xl .clbl{display:none} /* real DOM text, hidden on desktop where the <th> already labels the column */

@media(max-width:900px){
  /* wave2c item 1: 899->900 fix — card layout must cover <=900px (900=card, 901=table),
     matching the SAME 900/901 boundary convention the C1 .expin fix already uses. The
     original 899 cutoff was a genuine off-by-one: at exactly 900px the table fell through
     to the unscoped cramped desktop styling instead of the card layout. .herochart's own
     unrelated max-width:900px rule (different selector, no shared property) is not a real tie. */
  .xlwrap{overflow:visible;background:none;border:0;box-shadow:none;padding:0}
  table.xl{display:block;width:100%;min-width:0;table-layout:auto}
  table.xl thead{display:none}
  table.xl tbody{display:block}
  .xl tr{display:flex;flex-wrap:wrap;align-items:flex-start;
    background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
    box-shadow:var(--shadow);padding:14px 16px 16px;margin:0 0 14px}
  .xl tbody tr:nth-child(even) td,.xl tr:hover td{background:transparent}
  .xl td{display:block;padding:0;border-bottom:0;background:transparent;overflow:visible;font-size:15px}
  .xl td:first-child{flex:1 1 auto;min-width:0;white-space:normal;overflow:visible;
    text-overflow:clip;position:static;box-shadow:none;font-size:16px}
  .xl td:nth-child(2){flex:0 0 auto;padding-left:8px}
  .xl td:nth-child(3){flex:0 0 100%;margin:6px 0 4px}
  .xl td:nth-child(n+4):nth-child(-n+11){flex:0 0 100%;display:flex;justify-content:space-between;
    align-items:baseline;gap:14px;padding:8px 0;border-top:1px solid var(--line)}
  .xl .clbl{display:block;flex:0 0 42%;font-size:11.5px;font-weight:700;color:var(--slate);
    text-transform:uppercase;letter-spacing:.03em}
  .xl .cval{flex:1 1 58%;text-align:right}
  .xl .cl2{-webkit-line-clamp:unset;overflow:visible;text-align:right}
  .xl .licchips{justify-content:flex-end;flex-wrap:wrap}
  .xl td.act{order:99;flex:0 0 100%;margin-top:10px;padding:0;border-top:0}
  .xl td.act .rowcta{display:block;width:100%;text-align:center;padding:14px 12px;
    font-size:15px;border-radius:10px}
}

@media(max-width:1279px){
  .side{
    display:flex;flex-direction:row;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
    position:sticky;top:70px;z-index:45;
    width:auto;left:auto;right:auto;
    gap:8px;background:var(--card);border:0;border-bottom:1px solid var(--line);border-radius:0;
    box-shadow:none;padding:10px 14px;margin:0
  }
  .side .sidehead,.side .sideback{display:none}
  .side a{flex:0 0 auto;white-space:nowrap;border:1.5px solid var(--line);background:var(--paper);
    border-radius:999px;padding:6px 14px;font-size:13px;font-weight:700;color:var(--ink2)}
  .side a:hover{border-color:var(--pos);color:var(--pos);text-decoration:none}
}
@media(max-width:760px){
  #cta .cta{display:none}
}
@media(max-width:700px){
  .side{top:112px}
  section[id],h2[id],h3[id],#cta{scroll-margin-top:112px}
}
@media(max-width:480px){
  /* wave2d item 1: at narrow phone widths (375-390px) the nav wraps to 3 lines
     (brand row + the <nav> element's own 4 items — Brokers/Learn/Compare/lang —
     wrapping onto 2 sub-rows), not 2. Box-model check: .nav padding is 14px top/
     bottom + 24px/34px left/right (style.css:638 override) -> 375-24-34=317px
     available; brand "The FX Verdict" (~160px, 19px/800 Inter) fits its own row,
     but the <nav> row's own content (4 items + 3x18px gaps, ~300px estimated)
     does not comfortably fit 317px and wraps again -> 3 lines, ~127-144px
     (estimate vs. real-render measurement, same order of magnitude). 112px was
     sized for the 2-line case and left the .side.jumps chip row's top edge
     sliced under the taller wrapped nav on scroll. Bump to clear it, same
     language on both EN+TH since the brand text/row-count doesn't differ by lang. */
  .side{top:150px}
  section[id],h2[id],h3[id],#cta{scroll-margin-top:150px}
}
@media(max-width:480px){
  /* Fix 4 (§3e/§5, RED visual bug): the score-metrics widget clipped off-screen at 375px, both
     languages. Root-caused with Playwright computed-style measurement on broker/exness.html at
     a real 375px viewport (not guessed): .scorebox is flex/nowrap with its first child (score
     number block) at an intrinsic ~144px, a 22px gap, and .subs (the 4 metric bars) floored at
     min-width:170px (line 120) — 144+22+170 = 336px of content plus 44px of L/R padding (16px
     22px, line 116) = 380px needed inside a 375px viewport. Measured overflow: .subs right edge
     landed at 400px, ~25px past the viewport edge, consistent with the math. The existing
     @media(max-width:760px) rule (line 137) only widens the outer box — it never touches
     flex-wrap or the two children's floors, so the squeeze survives untouched down to 375px.
     Fix: wrap the two children onto separate rows and drop .subs's floor so it takes the full
     row width instead of squeezing beside the score number. Verified after the fix: all 4
     metric numbers (Withdrawals/Regulation/Funding options/Local support) visible with zero
     horizontal overflow at 375px, EN+TH — see _exec/screens/. */
  .scorebox{flex-wrap:wrap;min-width:0}
  .scorebox>div:first-child{flex:0 0 auto}
  .subs{min-width:0;flex:1 1 100%}
}

/* ===== v20b — WAVE-2 bonus fixes bundled with the touched code paths above:
   H4 keyboard-operable sort headers (mirrors .rowtoggle's focus-visible pattern),
   M9 marquee duplicate-copy aria-hidden wrapper, footer methodology nav link. ===== */
.thsort{all:unset;cursor:pointer;display:block;width:100%;color:inherit;font:inherit;text-align:inherit}
.thsort:hover{color:var(--pos)}
.thsort:focus-visible{outline:2px solid var(--bc,#0E9F6E);outline-offset:2px;border-radius:4px}
.mq-set{display:contents} /* same technique as .tpmset — keeps .mq-in's flex gap/sizing on the real <img> children */
footer .fnav{margin-top:4px}
footer .fnav a{color:var(--ink2);font-weight:700}
