/* ════════ VOLURR ACADEMY — PAGE (owner brief 2026-08-06: «تصميم ديزاين صفحه كامل») ════════

   THE ONE SENTENCE: the Academy should read like the reading room of an institution — a flat, quiet,
   tabular study desk where a curriculum is laid out plainly — not like a game that hands out badges.
   Same family as the AGI News band and the Analyst Center body, which already solved this exact
   problem (ranked progression with tiers) institutionally.

   EVERY selector in this file is scoped to #v-academy or to .acd-modal, and uses the acd- prefix. That
   is not style preference, it is a hard constraint discovered by measurement: the OLD academy classes
   are unscoped globals and other sections are already painted by them —
       .actabs / .actab   -> mmap.js, reports.js, rvil-core.js, market.css, mmap-intel.css
       .acl-* (modal)     -> mmap.js, watchlist.js, reports.js
   Restyling those would silently redesign Market Map, Watchlist, Reports and the Relative-Value Lab.
   So the Academy moves to its own scoped namespace and leaves the shared ones exactly where they are.

   WHY THE OLD DESIGN GOES — measured in the browser, not asserted:
     · the hero ate 40% of the fold (288px of 720) and the first real lesson began at 539px, so three
       quarters of the first screen passed before a learner saw one lesson,
     · the page used 920px of a 1280px viewport,
     · the hero gradient computed BYTE-IDENTICAL in light and dark (rgb(26,14,31)→rgb(126,19,19)) while
       the page background flipped rgb(7,10,18)→rgb(238,240,244) — a near-black slab on a light page,
     · rank colours were six raw hex literals injected from JS as inline style=, theme-blind by
       construction, and they made #26d07c GREEN the decorative identity of every new user — a direct
       break of the colour law, where green and red mean price direction and nothing else.

   Rank identity here is STATE, not hue: locked = muted, in progress = crimson outline, complete =
   crimson tint. One brand colour, three states, legible in both themes. ──── */

/* ── 0 · THE DECLARED SCALES ─────────────────────────────────────────────────────────────────────
   Counted in this file before the pass: 10 corner radii, 14 type sizes, 8 icon sizes and 16 distinct
   raw padding values. A terminal does not have fourteen type sizes; it has a scale, and every rule
   picks a step from it. Nothing below is a redesign — each step was chosen to sit on top of the
   cluster it replaces, so the largest single move anywhere in the file is 2px and almost all are 0
   or 1px. The per-rule moves are listed in the pass report, not hidden here.

   Both scopes carry the tokens, because the lesson dialog is NOT inside #v-academy: academy.js stamps
   .acd-modal on #modalBox, which lives at the end of <body>. A token block on #v-academy alone would
   simply not reach it — that is the same blind spot that let the icon defect below through. */
#v-academy,.acd-modal{
  /* radius — 6 steps (was 10 raw values) */
  --acd-r1:4px;      /* meters. Their own height clamps them, so 3px and 4px drew identically anyway */
  --acd-r2:8px;      /* square marks, 26–34px: rank glyph, lesson number, day cell, section mark */
  --acd-r3:11px;     /* rows, tiles, chips, buttons — everything a finger lands on */
  --acd-r4:14px;     /* the header band and the tab strip */
  --acd-r5:16px;     /* the dialog shell */
  --acd-rp:999px;    /* pills. 20px on a 35px-tall pill was already a full round; this says so */

  /* type — 7 steps (was 14) */
  --acd-f1:10px;     /* micro: day letters, tile captions, the scope qualifier */
  --acd-f2:11.5px;   /* meta: sub-line, rank ranges, badges, bench captions, the standing notice */
  --acd-f3:12.5px;   /* body-small: lesson and library titles, terms, section headings */
  --acd-f4:13px;     /* controls: tabs, the CTA, counters, the lesson lead */
  --acd-f5:14px;     /* prose and rank names */
  --acd-f6:16px;     /* figures */
  --acd-f7:17px;     /* the page title, and the rail's headline figure */

  /* icon — 4 steps (was 8) */
  --acd-i1:13px;     /* inside a 26px mark */
  --acd-i2:15px;     /* the floor: an icon sitting inline with text */
  --acd-i3:18px;     /* inside a 32–34px mark */
  --acd-i4:22px;     /* the dialog crest, a 50px chip — see the floor note below */

  /* spacing — 9 steps on a 2px rhythm (was 16 raw padding values) */
  --acd-s1:4px;  --acd-s2:6px;  --acd-s3:8px;  --acd-s4:10px; --acd-s5:12px;
  --acd-s6:14px; --acd-s7:16px; --acd-s8:20px; --acd-s9:24px;

  /* one focus treatment for the whole section — section 1 below */
  --acd-focus:2px solid var(--gold);
  --acd-focus-off:2px;

  /* the tab strip's edge affordance — section 4. On the spacing scale, not beside it. */
  --acd-tabfade:var(--acd-s6);

  /* DIRECTION-AWARE GRADIENT ANGLES — Article 13.
     linear-gradient(90deg,…) is physical: it points left→right in Arabic and Kurdish exactly as it
     does in English. The progress fill is a block whose inline start is the RIGHT edge under
     dir=rtl, so the fill grows leftward while its ramp still ran rightward — the bright end of the
     bar sat at the end the learner had not reached yet. These two angles mirror, and every gradient
     in the file takes its direction from them instead of hard-coding one. */
  --acd-grad:90deg;      /* along the inline axis */
  --acd-grad-d:135deg;   /* the diagonal used on raised controls */
}
html[dir=rtl] #v-academy,html[dir=rtl] .acd-modal{--acd-grad:270deg;--acd-grad-d:225deg}

#v-academy .acd-wrap{max-width:1180px;margin:0 auto;font-variant-numeric:tabular-nums}

/* ── 0b · THE ICON FLOOR — a defensive base, added after a real defect reached the owner's screen ──
   An inline <svg> with no width and no height does not stay small: it takes the width of its container
   and scales its height by the viewBox ratio. The header-icon rule was written as `.acd-panel h3 svg`,
   but three cards — credentials, every library category, and the glossary — carry `.card .acd-creds` /
   `.acd-cat` / `.acd-gloss` and never matched it. Their 24×24 award glyph rendered around 900px tall
   and swallowed the card. The owner circled it in red, and he was right to.

   The lesson is not "add three more selectors". It is that a decorative icon must never be ABLE to do
   that, whatever new card someone adds next month. So every svg inside this section is capped first,
   and the specific rules below raise it deliberately where a larger glyph is wanted. A missing size is
   now a small icon, never a poster.

   AND THE FLOOR MUST COVER BOTH SCOPES. It was written for #v-academy only, so it stopped at the
   section boundary — while the lesson dialog, which is a sibling of #views and not a descendant of
   #v-academy, was left uncovered. Its crest `.acl-bd` is a 50px grid cell with place-items:center and
   the glyph inside it carries no size of its own, so the same class of defect the owner already caught
   once was still live one DOM subtree away. The floor now covers .acd-modal too, and the crest is
   raised on purpose to --acd-i4 rather than by accident to the chip.

   The certificate is the one deliberate exception: it is a full document drawn as SVG, not an icon.
   wallet-academy.css already sizes it, but that file loads AFTER this one and equal specificity means
   the exception would depend on link order. It is restated here at higher specificity so the floor
   can never shrink a certificate to 15px no matter how the sheets are ordered. */
#v-academy svg,.acd-modal svg{width:var(--acd-i2);height:var(--acd-i2);flex:0 0 auto}
#v-academy .acd-wrap h3 svg{color:var(--gold)}
.acd-modal .acl-bd svg{width:var(--acd-i4);height:var(--acd-i4)}
.acd-modal .certwrap svg{width:100%;height:auto}

/* ── 1 · ONE FOCUS TREATMENT, EVERY INTERACTIVE ELEMENT ──────────────────────────────────────────
   Eight things in this section take keyboard focus. Three had a visible ring and five did not: the
   lesson tile, the library row, the glossary pill, the credential chip and the bench tile were
   reachable by Tab and gave the eye nothing back — a keyboard user could not tell where they were on a
   page whose whole purpose is a hundred sequential tiles. One rule, one token, one look, so a control
   added later cannot silently opt out of it.

   The accordion header is the single exception and it has a measured reason: it sits inside
   .acd-rank, which is overflow:hidden so the accordion can clip, and an outward outline on it is
   clipped to nothing. It takes the same ring, inward. */
#v-academy .acd-cont:focus-visible,
#v-academy .acd-tab:focus-visible,
#v-academy .acd-lvl:focus-visible,
#v-academy .acd-item:focus-visible,
#v-academy .acd-term:focus-visible,
#v-academy .acd-credchip:focus-visible,
#v-academy .acd-btile:focus-visible,
.acd-modal .quizopt:focus-visible,
.acd-modal .acl-tutor input:focus-visible,
.acd-modal .acl-tutor button:focus-visible,
.acd-modal .acl-done:focus-visible,
.acd-modal .mclose:focus-visible{outline:var(--acd-focus);outline-offset:var(--acd-focus-off)}
#v-academy .acd-rank-h:focus-visible{outline:var(--acd-focus);outline-offset:calc(var(--acd-focus-off) * -1)}

/* ── 1b · THE SHRINK GUARD ───────────────────────────────────────────────────────────────────────
   A flex item's default min-width is auto, which means it refuses to shrink below its longest word.
   The lesson title and the library row title sit in flex rows beside a fixed mark, so an unbroken
   Kurdish or Arabic title did not wrap — it pushed the row wider than its tile and spilled. min-width:0
   lets the box shrink; overflow-wrap lets the word break rather than escape. Together a long title now
   wraps to a second line and the tile grows with it, because .acd-lvl is align-items:center inside a
   grid row that stretches its siblings to match.
   Declared once here for the whole family instead of repeated per component. */
#v-academy .acd-lvl-t,
#v-academy .acd-item-t,
#v-academy .acd-btt,
#v-academy .acd-rank-b,
#v-academy .acd-sttile>div{min-width:0;overflow-wrap:break-word}

/* ── 2 · the header band (the band academy-chrome.css hid the topbar title for) ── */
#v-academy .acd-hdr{display:flex;align-items:center;gap:var(--acd-s7);flex-wrap:wrap;background:var(--card);
  border:1px solid var(--line);border-radius:var(--acd-r4);padding:var(--acd-s5) var(--acd-s7);
  margin-bottom:var(--acd-s5)}
#v-academy .acd-hdr-t{display:flex;align-items:center;gap:var(--acd-s5);min-width:0}
#v-academy .acd-mark{width:32px;height:32px;display:grid;place-items:center;color:var(--gold);flex-shrink:0;
  background:color-mix(in srgb,var(--gold) 10%,transparent);border-radius:var(--acd-r2)}
#v-academy .acd-mark svg{width:var(--acd-i3);height:var(--acd-i3)}
#v-academy .acd-hdr-t h1{font-size:var(--acd-f7);font-weight:900;margin:0;letter-spacing:.2px;color:var(--txt);line-height:1.25}
#v-academy .acd-sub{font-size:var(--acd-f2);color:var(--txt2);font-weight:600;margin-top:2px}
#v-academy .acd-hdr-stats{display:flex;align-items:center;gap:var(--acd-s7);flex-wrap:wrap;margin-inline-start:auto}
#v-academy .acd-st{display:flex;flex-direction:column;gap:1px}   /* 1px is a hairline, not a scale step */
#v-academy .acd-st b{font-size:var(--acd-f6);font-weight:900;color:var(--txt);line-height:1.1}
#v-academy .acd-st i{font-style:normal;font-size:var(--acd-f1);color:var(--txt2);font-weight:700}
#v-academy .acd-sep{width:1px;height:26px;background:var(--line)}

/* ── 3 · the continue strip — replaces a 150px ring that spent its whole area saying "0%" ── */
#v-academy .acd-bar{display:flex;align-items:center;gap:var(--acd-s6);margin-bottom:var(--acd-s6);flex-wrap:wrap}
#v-academy .acd-barl{flex:1;min-width:200px}
#v-academy .acd-prog{height:6px;border-radius:var(--acd-r1);background:var(--line);overflow:hidden}
#v-academy .acd-prog i{display:block;height:100%;border-radius:var(--acd-r1);
  background:linear-gradient(var(--acd-grad),var(--gold),var(--gold2));transition:width .6s cubic-bezier(.2,.9,.3,1)}
#v-academy .acd-barlbl{display:flex;align-items:center;gap:var(--acd-s3);margin-top:var(--acd-s3);
  font-size:var(--acd-f2);color:var(--txt2);font-weight:700}
#v-academy .acd-barlbl b{color:var(--txt);font-weight:800}
#v-academy .acd-cont{display:inline-flex;align-items:center;gap:var(--acd-s3);padding:var(--acd-s4) var(--acd-s8);
  border:0;border-radius:var(--acd-r3);font-family:inherit;font-size:var(--acd-f4);font-weight:800;
  cursor:pointer;flex-shrink:0;background:linear-gradient(var(--acd-grad-d),var(--gold),var(--gold2));color:#fff;
  transition:filter .15s,transform .15s}
#v-academy .acd-cont:hover{filter:brightness(1.08)}
#v-academy .acd-cont svg{width:var(--acd-i2);height:var(--acd-i2)}
html[dir=rtl] #v-academy .acd-cont svg{transform:scaleX(-1)}

/* ── 4 · tabs — flat, iconed, one crimson tint for the active one ────────────────────────────────
   THE EDGE AFFORDANCE. Six tabs measure roughly 740px of strip. On a phone that overflows by a wide
   margin, the strip scrolls, and the scrollbar is hidden — so nothing at all told a phone user that
   three more tabs existed past the right edge. The strip did not look scrollable; it looked truncated.

   The fade is a pair of sticky flex pseudo-items rather than a mask, and the difference matters:
     · a mask on the scroller is unconditional, so on a desktop where the strip does NOT overflow it
       would fade the rounded corner and the tinted edge of the active first tab for no reason,
     · these two are conditional by construction. Each takes real space at its own end of the content,
       so at rest it fades nothing but the empty inset it occupies. Only when the strip actually
       scrolls does sticky pin it to the visible edge, and only then do tabs slide underneath and fade.
   Both ends are treated, so it is correct in the middle of a scroll as well as at either end.

   RTL: the insets are logical (inset-inline-start/end), so ::before is at the content start in both
   directions — the right edge in Arabic and Kurdish — and the gradient takes its angle from
   --acd-grad, which mirrors. Nothing here is hard-coded to left.

   The fade colour is var(--card) while the strip paints var(--cardgrad); they differ by at most 7/255
   in any channel in either theme, which is why one stands in for the other at the edge. Stated rather
   than glossed over.
   The strip's inline padding moves into the two fade zones, so the whole strip is the same height it
   was and the first tab starts 14px in instead of 5px. */
#v-academy .acd-tabs{display:flex;gap:var(--acd-s2);overflow-x:auto;margin-bottom:var(--acd-s6);
  background:var(--cardgrad);border:1px solid var(--line);border-radius:var(--acd-r4);
  padding:var(--acd-s1) 0;scrollbar-width:none}
#v-academy .acd-tabs::-webkit-scrollbar{height:0;width:0}
#v-academy .acd-tabs::before,#v-academy .acd-tabs::after{content:'';flex:0 0 var(--acd-tabfade);
  align-self:stretch;position:sticky;z-index:1;pointer-events:none}
/* the negative margin cancels the strip's own flex gap on the one side that faces the tabs, so the
   fade zone IS the inset and does not stack on top of it — without it the first tab would start
   14px + 6px in, which is a layout change nobody asked for. */
#v-academy .acd-tabs::before{inset-inline-start:0;margin-inline-end:calc(var(--acd-s2) * -1);
  background:linear-gradient(var(--acd-grad),var(--card),transparent)}
#v-academy .acd-tabs::after{inset-inline-end:0;margin-inline-start:calc(var(--acd-s2) * -1);
  background:linear-gradient(var(--acd-grad),transparent,var(--card))}
#v-academy .acd-tab{display:inline-flex;align-items:center;gap:var(--acd-s3);flex-shrink:0;background:none;border:0;
  color:var(--txt2);font-family:inherit;font-size:var(--acd-f4);font-weight:800;
  padding:var(--acd-s4) var(--acd-s7);border-radius:var(--acd-r2);
  cursor:pointer;white-space:nowrap;transition:background .15s,color .15s}
#v-academy .acd-tab svg{width:var(--acd-i2);height:var(--acd-i2);opacity:.9}
#v-academy .acd-tab:hover{color:var(--txt)}
#v-academy .acd-tab.on{background:color-mix(in srgb,var(--gold) 16%,transparent);color:var(--gold)}

/* ── 5 · the path: six ranks, real .card surfaces, accordion ── */
#v-academy .acd-ranks{display:flex;flex-direction:column;gap:var(--acd-s5);margin-bottom:var(--acd-s6)}
#v-academy .acd-rank{padding:0;overflow:hidden}
#v-academy .acd-rank-h{display:flex;align-items:center;gap:var(--acd-s6);padding:var(--acd-s6) var(--acd-s7);
  cursor:pointer;transition:background .15s}
#v-academy .acd-rank-h:hover{background:var(--card2)}
#v-academy .acd-rank-mk{width:34px;height:34px;border-radius:var(--acd-r3);display:grid;place-items:center;
  background:var(--card2);border:1px solid var(--line);color:var(--txt2);flex-shrink:0}
#v-academy .acd-rank-mk svg{width:var(--acd-i3);height:var(--acd-i3)}
/* identity by STATE, never by hue — see the file header */
#v-academy .acd-rank.cur  .acd-rank-mk{color:var(--gold);border-color:color-mix(in srgb,var(--gold) 42%,var(--line))}
#v-academy .acd-rank.full .acd-rank-mk{color:var(--gold);background:color-mix(in srgb,var(--gold) 12%,transparent);
  border-color:color-mix(in srgb,var(--gold) 30%,var(--line))}
#v-academy .acd-rank.lock{opacity:.62}
#v-academy .acd-rank.lock .acd-rank-mk{color:var(--muted)}
#v-academy .acd-rank-b{flex:1}
/* flex-wrap so a long authored Kurdish rank name drops the LTR range chip to its own line instead of
   squeezing it — the chip is a number pair and must never be broken across lines. */
#v-academy .acd-rank-n{font-size:var(--acd-f5);font-weight:800;color:var(--txt);display:flex;
  align-items:center;flex-wrap:wrap;gap:var(--acd-s4)}
#v-academy .acd-rank-rg{font-size:var(--acd-f2);color:var(--muted);font-weight:700;white-space:nowrap}
#v-academy .acd-rank-bar{height:5px;border-radius:var(--acd-r1);background:var(--line);overflow:hidden;
  margin-top:var(--acd-s3);max-width:300px}
#v-academy .acd-rank-bar i{display:block;height:100%;border-radius:var(--acd-r1);background:var(--gold);
  transition:width .6s cubic-bezier(.2,.9,.3,1)}
#v-academy .acd-rank-c{font-size:var(--acd-f4);font-weight:800;color:var(--txt2);flex-shrink:0;display:flex;
  align-items:center;gap:var(--acd-s3)}
#v-academy .acd-rank-c svg{width:var(--acd-i2);height:var(--acd-i2);color:var(--muted)}
#v-academy .acd-rank-lv{display:none;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:var(--acd-s3);
  padding:0 var(--acd-s6) var(--acd-s6)}
#v-academy .acd-rank.open .acd-rank-lv{display:grid}

#v-academy .acd-lvl{display:flex;align-items:center;gap:var(--acd-s4);padding:var(--acd-s4) var(--acd-s5);
  background:var(--card2);border:1px solid var(--line);border-radius:var(--acd-r3);
  transition:border-color .15s;text-align:start}
#v-academy .acd-lvl.open,#v-academy .acd-lvl.cur,#v-academy .acd-lvl.done{cursor:pointer}
#v-academy .acd-lvl.open:hover,#v-academy .acd-lvl.cur:hover,#v-academy .acd-lvl.done:hover{border-color:var(--gold)}
#v-academy .acd-lvl.lock{opacity:.55}
#v-academy .acd-lvl-n{width:26px;height:26px;border-radius:var(--acd-r2);display:grid;place-items:center;
  font-size:var(--acd-f3);font-weight:900;flex-shrink:0;background:var(--card);color:var(--muted)}
#v-academy .acd-lvl-n svg{width:var(--acd-i1);height:var(--acd-i1)}
#v-academy .acd-lvl.done .acd-lvl-n{background:color-mix(in srgb,var(--gold) 14%,transparent);color:var(--gold)}
#v-academy .acd-lvl.cur  .acd-lvl-n{background:linear-gradient(var(--acd-grad-d),var(--gold),var(--gold2));color:#fff}
#v-academy .acd-lvl-t{flex:1;font-size:var(--acd-f3);font-weight:600;line-height:1.35;color:var(--txt)}
#v-academy .acd-lvl.cur .acd-lvl-t{font-weight:800}

/* ── 6 · library / glossary / credentials ── */
#v-academy .acd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:var(--acd-s3)}
#v-academy .acd-item{display:flex;align-items:center;gap:var(--acd-s4);padding:var(--acd-s4) var(--acd-s5);
  background:var(--card2);border:1px solid var(--line);border-radius:var(--acd-r3);cursor:pointer;
  transition:border-color .15s;text-align:start}
#v-academy .acd-item:hover{border-color:var(--gold)}
#v-academy .acd-item-t{flex:1;font-size:var(--acd-f3);font-weight:600;color:var(--txt);line-height:1.35}
#v-academy .acd-item-ar{flex-shrink:0;color:var(--muted);display:grid;place-items:center}
#v-academy .acd-item-ar svg{width:var(--acd-i1);height:var(--acd-i1)}
html[dir=rtl] #v-academy .acd-item-ar svg{transform:scaleX(-1)}
#v-academy .acd-item:hover .acd-item-ar{color:var(--gold)}

#v-academy .acd-terms{display:flex;flex-wrap:wrap;gap:var(--acd-s3)}
#v-academy .acd-term{font-size:var(--acd-f3);font-weight:700;padding:var(--acd-s3) var(--acd-s6);
  background:var(--card2);border:1px solid var(--line);border-radius:var(--acd-rp);cursor:pointer;
  color:var(--txt2);transition:border-color .15s,color .15s;font-family:inherit}
#v-academy .acd-term:hover{border-color:var(--gold);color:var(--gold)}

#v-academy .acd-creds{margin-bottom:var(--acd-s6)}
#v-academy .acd-credrow{display:flex;flex-wrap:wrap;gap:var(--acd-s4)}
#v-academy .acd-credchip{display:inline-flex;align-items:center;gap:var(--acd-s3);font-size:var(--acd-f3);
  font-weight:800;padding:var(--acd-s4) var(--acd-s6);background:var(--card2);
  border:1px solid color-mix(in srgb,var(--gold) 32%,var(--line));border-radius:var(--acd-r3);cursor:pointer;
  color:var(--txt);transition:border-color .15s;font-family:inherit}
#v-academy .acd-credchip:hover{border-color:var(--gold)}
#v-academy .acd-credchip svg{width:var(--acd-i2);height:var(--acd-i2);color:var(--gold)}
#v-academy .acd-credhint{font-size:var(--acd-f3);color:var(--muted);font-weight:600;display:flex;
  align-items:center;gap:var(--acd-s3)}
#v-academy .acd-credhint svg{width:var(--acd-i2);height:var(--acd-i2);flex-shrink:0}

/* ── 7 · the standing notice — analysis-only, and the AI text is labelled as AI text ── */
/* --txt2, NOT --muted. Measured: --muted on the light page background gives 4.25:1, just under the
   4.5:1 AA floor for text this size. A disclaimer that the eye slides off is a disclaimer that was
   not really given, and this is the one line on the page the platform is obliged to make readable. */
#v-academy .acd-note{font-size:var(--acd-f2);color:var(--txt2);font-weight:600;line-height:1.8;
  padding:var(--acd-s6) var(--acd-s1) var(--acd-s2);text-align:center}
#v-academy .acd-note span{display:block}

/* ── 8 · the lesson modal's own body ─────────────────────────────────────────────────────────────
   Scoped to .acd-modal, a class academy.js stamps on #modalBox when IT opens the modal. That scope is
   not decoration: the .acl-* shell around this content is shared with Market Map's and Watchlist's
   modals, so an unscoped rule here would quietly restyle two other sections. Verified before writing —
   .acd-modal appears in no other file.

   The lesson body used to be a single white-space:pre-wrap blob of generated text. It is now authored
   prose with structure, so it gets typography: a lead line, real paragraphs with reading measure, and
   the takeaways set apart where the eye returns to them. */
.acd-modal .acl-sub{font-size:var(--acd-f4);color:var(--txt2);font-weight:700;line-height:1.6;
  margin-bottom:var(--acd-s5);padding-inline-start:var(--acd-s5);
  border-inline-start:2px solid color-mix(in srgb,var(--gold) 55%,transparent)}
.acd-modal .acl-body{white-space:normal}
.acd-modal .acl-p{font-size:var(--acd-f5);line-height:1.85;color:var(--txt);margin:0 0 var(--acd-s5);max-width:68ch}
.acd-modal .acl-p:last-of-type{margin-bottom:var(--acd-s1)}
.acd-modal .acl-keys{margin-top:var(--acd-s6);padding:var(--acd-s5) var(--acd-s6);background:var(--card);
  border:1px solid var(--line);border-radius:var(--acd-r3)}
.acd-modal .acl-keys>b{display:block;font-size:var(--acd-f1);font-weight:900;letter-spacing:.5px;
  text-transform:uppercase;color:var(--gold);margin-bottom:var(--acd-s3)}
.acd-modal .acl-keys ul{margin:0;padding-inline-start:var(--acd-s7);display:flex;flex-direction:column;gap:var(--acd-s2)}
.acd-modal .acl-keys li{font-size:var(--acd-f4);line-height:1.6;color:var(--txt2)}
/* the answer explanation — shown for right answers too, because "why" is the part that teaches */
.acd-modal .quizwhy{font-size:var(--acd-f3);line-height:1.65;color:var(--txt2);margin-top:var(--acd-s3);
  padding-inline-start:var(--acd-s4);border-inline-start:2px solid var(--line)}
.acd-modal .quizopt{display:block;width:100%;text-align:start;font-family:inherit}
/* numbers, symbols and timeframe codes stay LTR inside an RTL sentence — Article 13 */
.acd-modal .acl-p bdi,.acd-modal .acl-keys bdi{direction:ltr;unicode-bidi:isolate}

/* ── 9 · the two-column study desk ───────────────────────────────────────────────────────────────
   The owner's reference showed a left rail of the learner's record beside the main column. Same shape
   here, with one difference that is not cosmetic: every figure in the rail has a real source. The
   mockup's "overall rating 4.9", "Global AGI Rank #476390" and "Live Strategy Win-Rate 77%" are absent,
   because nothing in this system produces them and Article 11 names that last one as its own example
   of a lie. What is left — lessons passed, XP, ranks, streak, measured study time — is all real. */
#v-academy .acd-cols{display:grid;grid-template-columns:288px minmax(0,1fr);gap:var(--acd-s5);align-items:start}
#v-academy .acd-rail{display:flex;flex-direction:column;gap:var(--acd-s5);position:sticky;top:var(--acd-s5)}
#v-academy .acd-main{min-width:0}
#v-academy .acd-panel{padding:var(--acd-s6) var(--acd-s7)}
#v-academy .acd-panel h3,
#v-academy .acd-cat h3,
#v-academy .acd-creds h3,
#v-academy .acd-gloss h3{display:flex;align-items:center;gap:var(--acd-s4);margin:0 0 var(--acd-s5);
  font-size:var(--acd-f3);font-weight:900;color:var(--txt);letter-spacing:.2px}
#v-academy .acd-panel h3 svg{color:var(--gold)}   /* size comes from the floor in section 0b */
#v-academy .acd-panel h3 .x,
#v-academy .acd-cat h3 .x,
#v-academy .acd-creds h3 .x,
#v-academy .acd-gloss h3 .x{margin-inline-start:auto;background:color-mix(in srgb,var(--gold) 13%,transparent);
  color:var(--gold);padding:1px var(--acd-s4);border-radius:var(--acd-rp);font-size:var(--acd-f2);font-weight:800}

/* THE RECORD — five real figures.
   grid-auto-rows:1fr is the fix for a ragged rail. The headline figure spans the full width and its
   label is one line; the four small tiles beside it carry longer labels that wrap to two, so the
   headline row measured SHORTER than the rows beneath it — the most important number on the rail was
   the smallest box on the rail. In a grid of indefinite height every fr row resolves to the tallest
   row's content, so the three rows now match whatever the language does to the labels, and the
   headline is additionally given the larger mark and the larger figure it should have had. */
#v-academy .acd-stgrid{display:grid;grid-template-columns:1fr 1fr;gap:var(--acd-s3);grid-auto-rows:1fr}
#v-academy .acd-sttile{display:flex;align-items:center;gap:var(--acd-s4);padding:var(--acd-s4) var(--acd-s5);
  background:var(--card2);border:1px solid var(--line);border-radius:var(--acd-r3);min-width:0}
#v-academy .acd-sttile:first-child{grid-column:1/-1}
#v-academy .acd-sttile:first-child .acd-stic{width:32px;height:32px}
#v-academy .acd-sttile:first-child .acd-stic svg{width:var(--acd-i3);height:var(--acd-i3)}
#v-academy .acd-sttile:first-child b{font-size:var(--acd-f7)}
#v-academy .acd-stic{width:26px;height:26px;flex-shrink:0;display:grid;place-items:center;border-radius:var(--acd-r2);
  background:color-mix(in srgb,var(--gold) 11%,transparent);color:var(--gold)}
#v-academy .acd-stic svg{width:var(--acd-i2);height:var(--acd-i2)}
#v-academy .acd-sttile b{display:block;font-size:var(--acd-f6);font-weight:900;color:var(--txt);line-height:1.15}
#v-academy .acd-sttile i{display:block;font-style:normal;font-size:var(--acd-f1);color:var(--txt2);font-weight:700;margin-top:1px}
/* the scope qualifier on study time. It is not decoration: the number is this browser's, and saying so
   is the difference between a measurement and a claim. */
#v-academy .acd-sttile u{display:block;text-decoration:none;font-size:var(--acd-f1);color:var(--muted);font-weight:600;margin-top:1px}

/* the week — lit from real completion days, never from seven decorative dots */
#v-academy .acd-week{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--acd-s1)}
#v-academy .acd-day{display:flex;flex-direction:column;align-items:center;gap:var(--acd-s1)}
#v-academy .acd-dow{font-size:var(--acd-f1);font-weight:800;color:var(--muted)}
#v-academy .acd-dot{width:100%;aspect-ratio:1;max-width:30px;border-radius:var(--acd-r2);display:grid;place-items:center;
  background:var(--card2);border:1px solid var(--line);color:transparent}
#v-academy .acd-dot svg{width:var(--acd-i1);height:var(--acd-i1)}
#v-academy .acd-day.on .acd-dot{background:color-mix(in srgb,var(--gold) 15%,transparent);
  border-color:color-mix(in srgb,var(--gold) 38%,var(--line));color:var(--gold)}
#v-academy .acd-day.now .acd-dot{box-shadow:0 0 0 2px color-mix(in srgb,var(--gold) 26%,transparent)}

#v-academy .acd-princ p{margin:0;font-size:var(--acd-f3);line-height:1.7;color:var(--txt2);font-weight:600}

/* THE PRACTICE BENCH — every tile opens a section that exists in this build.
   The column count is explicit, not auto-fill, and the reason is arithmetic: the bench holds EIGHT
   tiles, and auto-fill with a 132px minimum resolved to six columns at every desktop, laptop and
   tablet width the rail leaves for the main column — 848px of track at 1280, 884px at 1279, 968px on
   a tablet all give six. Six columns and eight tiles is 6 + 2: a full row and a stub with four empty
   tracks trailing it. Four columns divide eight exactly, at every width, in both ladder steps.
   If the bench ever holds a number that four does not divide, this line is the one to revisit. */
#v-academy .acd-bench{margin-top:var(--acd-s5)}
#v-academy .acd-benchgrid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--acd-s3)}
#v-academy .acd-btile{display:flex;flex-direction:column;align-items:center;gap:var(--acd-s3);
  padding:var(--acd-s6) var(--acd-s3);background:var(--card2);border:1px solid var(--line);
  border-radius:var(--acd-r3);cursor:pointer;font-family:inherit;transition:border-color .15s,color .15s}
#v-academy .acd-btile:hover{border-color:var(--gold)}
#v-academy .acd-btic{width:32px;height:32px;display:grid;place-items:center;border-radius:var(--acd-r2);
  background:var(--card);color:var(--gold)}
#v-academy .acd-btic svg{width:var(--acd-i3);height:var(--acd-i3)}
#v-academy .acd-btt{font-size:var(--acd-f2);font-weight:800;color:var(--txt);text-align:center;line-height:1.35}

/* ── 10 · ONE RESPONSIVE LADDER ──────────────────────────────────────────────────────────────────
   The file used to carry four steps that did not agree with each other: 1279 and 1023 reshaped the
   rail, 767 reshaped the rail again — and a fourth at 900 halved the lesson and library grids to a
   single column while ALSO compacting the header band. So at 901px a tablet had a three-across
   curriculum and a full header; at 900px, one pixel narrower, the curriculum collapsed to one column
   and the header compacted, while the rail — the thing that actually needed the room — stayed exactly
   as it was. A step that changes two unrelated systems at a width no device class begins at is not a
   ladder step, it is a collision.

   Three steps now, each one thing, each tied to a device class, and each narrower step a strict
   superset of the one before it:

     ≥1280  desktop  rail 288px beside the main column                    (the base rules above)
     ≤1279  laptop   the rail narrows to 252px. Nothing else moves — the curriculum never narrows
                     to buy the rail room.
     ≤1023  tablet   the rail unstacks into a 3-across row ABOVE the main column. In portrait a side
                     rail would squeeze the lesson grid to one column, which is the outcome this step
                     exists to avoid. The lesson and library grids stay auto-fill and keep 3 across.
     ≤767   phone    one column for everything: the rail stacks, the header band compacts and drops
                     its separator, the CTA goes full width, the lesson and library grids go to one
                     column and the bench to two.

   The 900 step is gone; its two jobs moved to the step that owns them (the header compaction and the
   one-column grids are phone decisions, so they live at 767).
   Note for the record: academy-chrome.css restores three topbar controls at ≤760px. That is the
   TOPBAR ladder, matched to charts-page.css, and it is deliberately not merged into this one — but
   the two being 7px apart is worth a look by whoever owns that file. */
@media (max-width:1279px){
  #v-academy .acd-cols{grid-template-columns:252px minmax(0,1fr)}
}
@media (max-width:1023px){
  #v-academy .acd-cols{grid-template-columns:1fr}
  #v-academy .acd-rail{position:static;flex-direction:row;flex-wrap:wrap}
  #v-academy .acd-rail>.acd-panel{flex:1 1 240px;min-width:0}
}
@media (max-width:767px){
  #v-academy .acd-hdr{gap:var(--acd-s4);padding:var(--acd-s4) var(--acd-s6)}
  #v-academy .acd-hdr-stats{margin-inline-start:0;gap:var(--acd-s6)}
  #v-academy .acd-sep{display:none}
  #v-academy .acd-bar{gap:var(--acd-s4)}
  #v-academy .acd-cont{width:100%;justify-content:center}
  #v-academy .acd-rail{flex-direction:column}
  #v-academy .acd-rank-lv,#v-academy .acd-grid{grid-template-columns:1fr}
  #v-academy .acd-benchgrid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (prefers-reduced-motion:reduce){
  #v-academy .acd-prog i,#v-academy .acd-rank-bar i{transition:none}
}

/* ── 11 · .acd-modal must never be load-bearing on its own ───────────────────────────────────────
   This class exists only to SCOPE the Academy's lesson typography, because the .acl-* shell around it
   is shared with Market Map and Watchlist. It was applied with `className='acd-modal'`, an assignment
   that deleted the element's shipped `mbox` class — and every bit of the modal's container comes from
   `.modal .mbox` (dashboard.css:152). Measured before/after that one line:
       background  linear-gradient(160deg,#121829…)  ->  none
       border      0.8px rgb(226,59,59)              ->  0px
       radius      16px                              ->  0px
       padding     24px                              ->  0px
       max-height  590px                             ->  none
       overflow-y  auto                              ->  visible
   and closeModal never put it back, so ONE Academy lesson left every dialog in the app — chart alerts,
   Watchlist, Market Map, the publish wizard — naked for the rest of the session. A scoping class meant
   to prevent a leak caused a far worse one.
   Three fixes, and this is the third: the call sites now ADD instead of assign, closeModal restores
   `mbox`, and the rule below means that even if some future code drops `mbox` again, the box is still
   a box. Defence in depth for a defect that escaped the section it belonged to. */
.acd-modal{max-width:560px;width:100%;background:var(--cardgrad);border:1px solid var(--gold);
  border-radius:var(--acd-r5);padding:var(--acd-s9);max-height:min(85dvh,85vh);overflow-y:auto}

/* ── 12 · typography floor ─────────────────────────────────────────────────────────────────────
   A <button> does not inherit font-family; it takes the user-agent default. Three of the page's
   components are buttons — the 100 lesson tiles, the ~120 library rows and the 32 glossary pills —
   and they were drawing in Arial while every other word on the page drew in Cairo. Measured on the
   real page: body "Cairo", .acd-lvl "Arial". The tabs and the continue button carried
   font-family:inherit and so looked correct, which is exactly why this survived a visual read.
   One floor, so no future control can fall out of the type system by being a <button> — and it covers
   the dialog for the same reason the icon floor in section 0b now does. */
#v-academy button,#v-academy input,#v-academy select,#v-academy textarea,
.acd-modal button,.acd-modal input,.acd-modal select,.acd-modal textarea{font-family:inherit}

/* ── 12 · THE MERGED BAND ─────────────────────────────────────────────────────────────────────────
   Two cards became one. The header band and the continue strip were separate blocks with a 14px gap
   between them, above an already-empty 66px topbar — three horizontal bands of chrome before the first
   lesson. They are now one card with two rows inside it, and the topbar's three controls sit in the
   first row where the eye already is (academy-chrome.css section 4 collapses the strip on desktop).

   The control cluster calls the SAME shell functions the topbar buttons called — toggleFs,
   toggleLangMenu, toggleTheme. Not copies of their behaviour: the same functions, so the Academy cannot
   drift from the rest of the app, and #langMenu still opens from inside .topbar exactly as before. */
#v-academy .acd-hdr{flex-direction:column;align-items:stretch;gap:0;padding:var(--acd-s5) var(--acd-s7)}
#v-academy .acd-hdr-top{display:flex;align-items:center;gap:var(--acd-s8);flex-wrap:wrap}
#v-academy .acd-hdrctl{display:flex;align-items:center;gap:var(--acd-s2);margin-inline-start:var(--acd-s6)}
#v-academy .acd-cb{display:inline-flex;align-items:center;gap:var(--acd-s2);height:32px;padding:0 var(--acd-s4);
  border-radius:var(--acd-r3);background:var(--card2);border:1px solid var(--line);color:var(--txt2);
  cursor:pointer;font-family:inherit;font-weight:800;font-size:var(--acd-f2);
  transition:border-color .15s,color .15s}
#v-academy .acd-cb:hover{border-color:var(--gold);color:var(--gold)}
#v-academy .acd-cb:focus-visible{outline:var(--acd-focus);outline-offset:var(--acd-focus-off)}
#v-academy .acd-cb b{font-weight:900}
/* the theme button carries both glyphs and shows the one the CURRENT theme is not */
#v-academy .acd-cb-theme svg:nth-of-type(1){display:none}
html[data-theme="light"] #v-academy .acd-cb-theme svg:nth-of-type(1){display:block}
html[data-theme="light"] #v-academy .acd-cb-theme svg:nth-of-type(2){display:none}
/* row two: the progress strip, now inside the same card — the gap between two cards is gone */
#v-academy .acd-bar{margin-bottom:0;margin-top:var(--acd-s5);padding-top:var(--acd-s5);
  border-top:1px solid var(--line)}
@media (max-width:900px){
  #v-academy .acd-hdrctl{margin-inline-start:auto}
  #v-academy .acd-hdr-top{gap:var(--acd-s4)}
}

/* ── 12b · THE COARSE-POINTER FLOOR ──────────────────────────────────────────────────────────────
   The band's three controls draw at 32px, which is comfortable under a mouse and under the minimum
   under a finger. Measured on a 390px phone: 3 buttons below 40px. They are now the ONLY carrier of
   fullscreen, language and theme at that width — the topbar's copies are hidden (academy-chrome.css
   section 3) — so being hard to hit is not a papercut, it is the control being unusable.
   Gated on pointer:coarse so a mouse keeps the tighter 32px it can hit precisely. */
@media (pointer:coarse){
  #v-academy .acd-cb{height:40px;padding-inline:var(--acd-s5)}
}
@media (max-width:900px){
  #v-academy .acd-cb{height:40px;padding-inline:var(--acd-s5)}
}

/* the one line that tells a learner which certificate they are looking at — server-issued, or the
   local copy drawn because the server could not issue one. It is deliberately plain text under the
   artifact rather than a badge on it: the document already states its own provenance on its face, and
   this is the status of the ATTEMPT, which is a different fact and should not be printed into a PNG
   somebody downloads. */
.acd-modal .acd-certnote{margin-top:var(--acd-s4);font-size:var(--acd-f2);color:var(--txt2);
  font-weight:600;text-align:center;line-height:1.6}
