/* DUKOIN design system — tokens, base, components shared by site + app. */
@font-face{font-family:Montserrat;font-style:normal;font-weight:100 900;font-display:swap;src:url(../fonts/montserrat-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:Montserrat;font-style:normal;font-weight:100 900;font-display:swap;src:url(../fonts/montserrat-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}

:root{
  --ink:#16152C;--ink-2:#3B3A55;--mute:#6B6A85;--faint:#9A99B0;
  --paper:#FAF9F6;--card:#FFFFFF;--card-2:#F6F4FB;--line:#E8E4F2;--line-2:#D9D3EA;
  --purple:#6C47FF;--purple-2:#805BFF;--purple-ink:#4B2BD9;--lav:#F1ECFF;--lav-2:#E4DAFF;
  --coral:#FF6B9B;--coral-bg:#FFE6EF;--sun:#FFBE45;--sun-bg:#FFF3D6;--mint:#4BDAC5;--mint-bg:#DDF8F3;
  --up:#0A8A64;--up-bg:#E2F6EF;--dn:#D42F4E;--dn-bg:#FDE7EB;--warn:#B76A00;--warn-bg:#FFF1DB;
  --on-accent:#FFFFFF;
  --r-xl:32px;--r-lg:24px;--r-md:16px;--r-sm:12px;--r-pill:999px;
  --sh-1:0 1px 2px rgba(22,21,44,.06),0 2px 8px rgba(22,21,44,.05);
  --sh-2:0 8px 30px rgba(52,30,140,.10),0 2px 6px rgba(22,21,44,.05);
  --sh-3:0 24px 60px rgba(52,30,140,.18);
  --font:Montserrat,ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
  --ease:cubic-bezier(.2,.8,.2,1);
  --gutter:clamp(16px,4vw,40px);--max:1240px;
  color-scheme:light;
}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]).app-root{
  --ink:#F4F2FF;--ink-2:#CFCBE6;--mute:#9C99B8;--faint:#6F6C8C;
  --paper:#0E0D1C;--card:#17162B;--card-2:#1E1C36;--line:#2A2847;--line-2:#3A3760;
  --purple:#9B80FF;--purple-2:#8F70FF;--purple-ink:#C3B3FF;--lav:#231E45;--lav-2:#2F2860;
  --coral-bg:#3A1E2E;--sun-bg:#3A2E14;--mint-bg:#123430;
  --up:#3DD6A3;--up-bg:#123329;--dn:#FF7A8F;--dn-bg:#3A1A24;--warn:#FFC266;--warn-bg:#3A2A12;
  --on-accent:#0E0D1C;
  --sh-1:0 1px 2px rgba(0,0,0,.4);--sh-2:0 8px 30px rgba(0,0,0,.35);--sh-3:0 24px 60px rgba(0,0,0,.5);
  color-scheme:dark;}}
:root[data-theme="dark"]{
  --ink:#F4F2FF;--ink-2:#CFCBE6;--mute:#9C99B8;--faint:#6F6C8C;
  --paper:#0E0D1C;--card:#17162B;--card-2:#1E1C36;--line:#2A2847;--line-2:#3A3760;
  --purple:#9B80FF;--purple-2:#8F70FF;--purple-ink:#C3B3FF;--lav:#231E45;--lav-2:#2F2860;
  --coral-bg:#3A1E2E;--sun-bg:#3A2E14;--mint-bg:#123430;
  --up:#3DD6A3;--up-bg:#123329;--dn:#FF7A8F;--dn-bg:#3A1A24;--warn:#FFC266;--warn-bg:#3A2A12;
  --on-accent:#0E0D1C;
  --sh-1:0 1px 2px rgba(0,0,0,.4);--sh-2:0 8px 30px rgba(0,0,0,.35);--sh-3:0 24px 60px rgba(0,0,0,.5);
  color-scheme:dark;}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
body{margin:0;background:var(--paper);color:var(--ink);font:500 16px/1.6 var(--font);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;overflow-x:hidden}
img,svg{max-width:100%;height:auto}
a{color:var(--purple);text-decoration-thickness:.08em;text-underline-offset:.18em}
a:hover{color:var(--purple-ink)}
h1,h2,h3,h4{margin:0 0 .4em;line-height:1.08;letter-spacing:-.02em;font-weight:800;color:var(--ink)}
p{margin:0 0 1em}
button,input,select,textarea{font:inherit;color:inherit}
:focus-visible{outline:3px solid var(--purple-2);outline-offset:2px;border-radius:6px}
.sr{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.skip{position:absolute;left:12px;top:-60px;z-index:100;background:var(--ink);color:var(--paper);padding:10px 16px;border-radius:10px}
.skip:focus{top:12px}
.num,.tnum{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
.wrap{width:100%;max-width:var(--max);margin:0 auto;padding:0 var(--gutter)}
.muted{color:var(--mute)}
.small{font-size:.86rem}
.xs{font-size:.76rem}
.b{font-weight:700}

/* Buttons */
.btn{--bg:var(--purple);--fg:var(--on-accent);display:inline-flex;align-items:center;justify-content:center;gap:.5em;min-height:48px;padding:0 22px;border-radius:var(--r-pill);border:0;background:var(--bg);color:var(--fg);font-weight:700;font-size:.98rem;text-decoration:none;cursor:pointer;transition:transform .18s var(--ease),box-shadow .18s var(--ease),background .18s;box-shadow:0 6px 18px rgba(108,71,255,.28);white-space:nowrap}
.btn:hover{transform:translateY(-2px);color:var(--fg);box-shadow:0 10px 26px rgba(108,71,255,.36)}
.btn:active{transform:translateY(0) scale(.98)}
.btn--ghost{--bg:transparent;--fg:var(--ink);box-shadow:inset 0 0 0 2px var(--line-2)}
.btn--ghost:hover{box-shadow:inset 0 0 0 2px var(--ink)}
.btn--ink{--bg:var(--ink);--fg:var(--paper);box-shadow:none}
.btn--sun{--bg:var(--sun);--fg:#16152C;box-shadow:0 6px 18px rgba(255,190,69,.35)}
.btn--sm{min-height:38px;padding:0 16px;font-size:.88rem}
.btn--xs{min-height:30px;padding:0 12px;font-size:.8rem;box-shadow:none}
.btn[disabled]{opacity:.55;pointer-events:none}
.link{background:none;border:0;padding:0;color:var(--purple);font-weight:700;cursor:pointer;text-decoration:underline;text-underline-offset:.2em}

/* Cards, pills, chips */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:clamp(18px,2.2vw,28px);box-shadow:var(--sh-1)}
.card--flat{box-shadow:none}
.card h3{font-size:1.12rem;letter-spacing:-.01em}
.pill svg,.btn svg,.flag svg{width:16px;height:16px;flex:none}
.pill{display:inline-flex;align-items:center;gap:.4em;padding:5px 12px;border-radius:var(--r-pill);background:var(--lav);color:var(--purple-ink);font-weight:700;font-size:.78rem;letter-spacing:.01em}
.pill--sun{background:var(--sun-bg);color:#8A5A00}
.pill--mint{background:var(--mint-bg);color:#0A6B5D}
.pill--coral{background:var(--coral-bg);color:#B1264F}
.pill--ink{background:var(--ink);color:var(--paper)}
:root[data-theme="dark"] .pill--sun{color:var(--sun)} :root[data-theme="dark"] .pill--mint{color:var(--mint)} :root[data-theme="dark"] .pill--coral{color:var(--coral)}
.eyebrow{display:inline-block;font-size:.8rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--purple)}

/* Market change — never colour alone: arrow + sign */
.chg{display:inline-flex;align-items:center;gap:.25em;font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
.chg--up{color:var(--up)}.chg--dn{color:var(--dn)}.chg--flat{color:var(--mute)}
.chg span{font-size:.7em}
.chgb{padding:3px 8px;border-radius:8px}
.chgb.chg--up{background:var(--up-bg)}.chgb.chg--dn{background:var(--dn-bg)}

/* Freshness badges */
.fresh{display:inline-flex;align-items:center;gap:6px;font-size:.72rem;font-weight:800;letter-spacing:.05em;text-transform:uppercase;padding:3px 9px;border-radius:var(--r-pill);background:var(--card-2);color:var(--mute);white-space:nowrap}
.fresh::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}
.fresh--LIVE{color:var(--up);background:var(--up-bg)}
.fresh--LIVE::before{animation:pulse 1.6s infinite}
.fresh--RECENT{color:#2C7A9C;background:#E1F2FA}
.fresh--DELAYED{color:var(--warn);background:var(--warn-bg)}
.fresh--STALE,.fresh--UNAVAILABLE{color:var(--dn);background:var(--dn-bg)}
.fresh--DEMO{color:var(--purple-ink);background:var(--lav)}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(10,138,100,.5)}70%{box-shadow:0 0 0 7px rgba(10,138,100,0)}100%{box-shadow:0 0 0 0 rgba(10,138,100,0)}}

/* Score ring */
.ring{--v:50;--c:var(--purple);position:relative;width:64px;height:64px;border-radius:50%;background:conic-gradient(var(--c) calc(var(--v)*1%),var(--line) 0);display:grid;place-items:center;flex:none}
.ring::after{content:"";position:absolute;inset:7px;border-radius:50%;background:var(--card)}
.ring b{position:relative;z-index:1;font-size:1.1rem;font-variant-numeric:tabular-nums}
.ring--sm{width:42px;height:42px}.ring--sm::after{inset:5px}.ring--sm b{font-size:.82rem}
.ring--lg{width:116px;height:116px}.ring--lg::after{inset:11px}.ring--lg b{font-size:2rem}
.grade{display:inline-grid;place-items:center;width:22px;height:22px;border-radius:7px;font-size:.72rem;font-weight:800;background:var(--card-2);color:var(--ink-2)}
.grade--A{background:var(--mint-bg);color:#0A6B5D}.grade--B{background:var(--lav);color:var(--purple-ink)}.grade--C{background:var(--sun-bg);color:#8A5A00}.grade--D{background:var(--dn-bg);color:var(--dn)}

/* Bars */
.bar{height:8px;border-radius:99px;background:var(--line);overflow:hidden}
.bar i{display:block;height:100%;border-radius:inherit;background:var(--purple)}

/* Tables */
.tbl{width:100%;border-collapse:separate;border-spacing:0;font-variant-numeric:tabular-nums}
.tbl th{font-size:.74rem;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--mute);text-align:right;padding:10px 12px;border-bottom:1px solid var(--line);white-space:nowrap;position:sticky;top:0;background:var(--card)}
.tbl td{padding:12px;border-bottom:1px solid var(--line);text-align:right;white-space:nowrap}
.tbl th:first-child,.tbl td:first-child,.tbl .l{text-align:left}
.tbl tbody tr{transition:background .15s}
.tbl tbody tr:hover{background:var(--card-2)}
.tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:var(--r-md)}
.coin{display:flex;align-items:center;gap:10px;min-width:0;text-decoration:none;color:inherit}
.coin img{width:28px;height:28px;border-radius:50%;background:var(--card-2);flex:none}
.coin b{display:block;font-weight:700;overflow:hidden;text-overflow:ellipsis}
.coin small{display:block;color:var(--mute);font-weight:600;font-size:.76rem}

/* Notes / callouts */
.dk-note{border-radius:var(--r-md);padding:16px 18px;background:var(--lav);border:1px solid var(--lav-2);margin:1.4em 0}
.dk-note strong{display:block;margin-bottom:4px}
.dk-note p:last-child{margin:0}
.dk-note--risk{background:var(--sun-bg);border-color:#FFE2A3}
:root[data-theme="dark"] .dk-note--risk{border-color:#5A4720}
.notice{display:flex;gap:10px;align-items:flex-start;padding:12px 14px;border-radius:var(--r-sm);background:var(--card-2);font-size:.9rem}
.notice--warn{background:var(--warn-bg);color:var(--ink)}
.notice--err{background:var(--dn-bg)}
.notice--ok{background:var(--up-bg)}

/* Forms */
.field{display:grid;gap:6px;margin-bottom:14px}
.field label,.lbl{font-weight:700;font-size:.88rem}
.input,select.input,textarea.input{width:100%;min-height:48px;padding:12px 14px;border-radius:14px;border:1.5px solid var(--line-2);background:var(--card);transition:border .15s,box-shadow .15s}
textarea.input{min-height:110px;resize:vertical}
.input:focus{outline:0;border-color:var(--purple);box-shadow:0 0 0 4px var(--lav)}
.check{display:flex;gap:10px;align-items:flex-start;font-size:.9rem;cursor:pointer}
.check input{width:20px;height:20px;accent-color:var(--purple);margin-top:2px;flex:none}
.seg{display:inline-flex;max-width:100%;overflow-x:auto;scrollbar-width:none;padding:4px;border-radius:var(--r-pill);background:var(--card-2);border:1px solid var(--line);gap:2px}
.seg button,.seg a{border:0;background:transparent;padding:8px 14px;border-radius:var(--r-pill);font-weight:700;font-size:.85rem;color:var(--mute);cursor:pointer;text-decoration:none;white-space:nowrap}
.seg [aria-pressed="true"],.seg [aria-current="page"],.seg .on{background:var(--card);color:var(--ink);box-shadow:var(--sh-1)}

/* Skeleton */
.sk{background:linear-gradient(90deg,var(--card-2) 25%,var(--line) 37%,var(--card-2) 63%);background-size:400% 100%;animation:sk 1.3s ease infinite;border-radius:10px;min-height:14px}
@keyframes sk{0%{background-position:100% 50%}100%{background-position:0 50%}}

/* Logo */
.logo{display:inline-flex;align-items:center;gap:10px;text-decoration:none;color:var(--ink);font-weight:800;font-size:1.42rem;letter-spacing:-.04em}
.logo svg{width:36px;height:36px;flex:none}
.logo .i-dot{color:var(--coral)}

/* Prose */
.prose{font-size:1.06rem;line-height:1.75;color:var(--ink-2);max-width:72ch}
.prose h2{font-size:clamp(1.4rem,2.4vw,1.85rem);margin:2em 0 .6em;color:var(--ink);scroll-margin-top:100px}
.prose h3{font-size:1.2rem;margin:1.6em 0 .5em;color:var(--ink)}
.prose .lede{font-size:1.22rem;line-height:1.6;color:var(--ink);font-weight:600}
.prose ul,.prose ol{padding-left:1.3em}
.prose li{margin:.35em 0}
.prose table{width:100%;border-collapse:collapse;margin:1.4em 0;font-size:.95rem;display:block;overflow-x:auto}
.prose th,.prose td{padding:10px 12px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
.prose th{font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;color:var(--mute)}
.prose blockquote{margin:1.4em 0;padding:4px 0 4px 18px;border-left:4px solid var(--coral);font-weight:600;color:var(--ink)}
.prose pre.dk-formula{background:var(--ink);color:#EDE8FF;border-radius:var(--r-md);padding:16px 18px;overflow-x:auto;font:600 .92rem/1.6 ui-monospace,SFMono-Regular,Menlo,monospace}
.prose strong{color:var(--ink)}

/* Charts */
.chart{position:relative;width:100%}
.chart svg{display:block;width:100%;height:100%;overflow:visible}
.chart .tip{position:absolute;pointer-events:none;background:var(--ink);color:var(--paper);padding:8px 10px;border-radius:10px;font-size:.78rem;font-weight:600;white-space:nowrap;transform:translate(-50%,calc(-100% - 12px));opacity:0;transition:opacity .12s;z-index:5;font-variant-numeric:tabular-nums}
.chart .tip.on{opacity:1}
.ax{font-size:11px;fill:var(--faint);font-weight:600;font-variant-numeric:tabular-nums}
.grid-l{stroke:var(--line);stroke-width:1}
.spark{display:block;width:100%;height:36px}

/* Reveal motion */
@media (prefers-reduced-motion:no-preference){
  .rv{animation:rv .6s var(--ease) both}
  @keyframes rv{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}

/* Modal */
.modal{position:fixed;inset:0;z-index:90;display:grid;place-items:center;padding:16px;background:rgba(14,13,28,.55);backdrop-filter:blur(6px);animation:fade .2s}
.modal__box{width:min(520px,100%);max-height:calc(100dvh - 32px);overflow:auto;background:var(--card);border-radius:var(--r-xl);padding:clamp(22px,4vw,34px);box-shadow:var(--sh-3);animation:pop .28s var(--ease)}
@keyframes fade{from{opacity:0}}@keyframes pop{from{opacity:0;transform:translateY(16px) scale(.98)}}
.toast{position:fixed;left:50%;bottom:calc(24px + env(safe-area-inset-bottom));transform:translateX(-50%);z-index:95;background:var(--ink);color:var(--paper);padding:12px 18px;border-radius:14px;font-weight:600;font-size:.92rem;box-shadow:var(--sh-3);animation:pop .25s var(--ease);max-width:calc(100vw - 32px)}
