/* The old app's stylesheets, as they were (us/web/public/app: app.css, ptest.css and spr.css; the Calculator loads its own calc/calc.css; 30 Oct 2026, owner: "Make sure the apps look and behave the same"). us2 draws the same markup. */
/* FocusHour in the browser, in Precision (owner, 20 Oct 2026; us/web/README.md, "Design system"): Geist alone, white
   surfaces, near-black primary buttons, emerald only for selection, progress and focus, 4-8 px corners, 1 px lines and
   no shadows. Phone first (375-430 px); wider screens get the iPad's measure: content up to 1400 px, poster rows, the
   question beside its working. Light and dark. */
/* The palette, font, radii and lines are /css/tokens.css (linked before this file); only the app's own tokens here. */
:root{
  color-scheme:light dark;
  --on-primary:var(--on-btn);
  --pad:#FFFFFF; --grid:#EEF0EF;
  --display:var(--sans); --text:var(--sans);
  --r:8px; --gutter:16px;
}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){--pad:#0F1211; --grid:#1A1E1C}}
:root[data-theme="dark"]{--pad:#0F1211; --grid:#1A1E1C}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{margin:0;background:var(--page);color:var(--ink);font:400 15.5px/1.55 var(--text);letter-spacing:-.008em;-webkit-font-smoothing:antialiased;
  font-variant-ligatures:no-contextual;font-feature-settings:"calt" 0}   /* 3x must never become 3× */
/* The question screen is a fixed-height layout; class pages (Done, the look back…) scroll like any page. */
body.in-session:has(> #app > .session){overflow:hidden}   /* only while the question screen itself shows; Done and the review scroll */
h1,h2,h3{font-family:var(--display);line-height:1.15;margin:0 0 .45em;text-wrap:balance;font-weight:600}
h1{font-size:clamp(24px,5.2vw,28px);letter-spacing:-.025em}
h2{font-size:clamp(19px,4vw,21px);letter-spacing:-.015em;line-height:1.25}
h3{font-size:16.5px;letter-spacing:-.01em;line-height:1.3}
p{margin:0 0 .8em}
a{color:var(--ink);text-underline-offset:3px;text-decoration-color:color-mix(in srgb,var(--ink) 40%,transparent)}
a:hover{text-decoration-color:currentColor}
img{max-width:100%}
button{font:inherit;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;letter-spacing:inherit}
button:disabled{cursor:default;opacity:.45}
input,select,textarea{font:inherit;color:var(--ink);background:var(--surface);border:1px solid var(--edge);border-radius:var(--r-md);padding:10px 12px;width:100%;min-height:44px}
input[type=checkbox],input[type=radio],input[type=range],input[type=file]{min-height:0}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--ink);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 22%,transparent)}
button:focus-visible,a:focus-visible,summary:focus-visible,input:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
input:focus-visible,select:focus-visible,textarea:focus-visible{outline:none}
label{display:block;font-weight:500;font-size:14px;margin:14px 0 6px}
.ic{flex:none;vertical-align:middle}
.muted{color:var(--ink-soft)} .small{font-size:14px} .strong{font-weight:550} .grow{flex:1;min-width:0}
/* the one label: Geist 500, 12 px, sentence case, after a 6 px accent square */
.eyebrow{font:500 12px/1.35 var(--display);letter-spacing:.01em;color:var(--ink-soft);margin-bottom:8px}
.eyebrow::before{content:"";display:inline-block;width:6px;height:6px;border-radius:1px;background:var(--accent);margin-right:8px;vertical-align:1px}
.eyebrow.saffron::before{background:var(--amber)} .eyebrow.indigo::before{background:var(--indigo)}
.saffron{color:var(--amber)}
.row{display:flex;gap:12px;align-items:center;margin:12px 0} .row.wrap{flex-wrap:wrap} .row.spread{justify-content:space-between} .row.spread strong{white-space:nowrap}
.lead{font-size:17px;color:var(--ink-soft);letter-spacing:-.012em}
.notice{background:var(--sunk);border:1px solid var(--line);border-radius:var(--r-md);padding:12px 14px;margin:12px 0}
.notice.success{background:var(--accent-tint);border-color:color-mix(in srgb,var(--accent) 30%,var(--line));color:var(--ink)}
.notice.error{background:var(--coral-tint);border-color:color-mix(in srgb,var(--coral) 30%,var(--line))}
/* (a wrong answer reads calmer: a plain card with a coral edge, not an all-red box; personas, 31 Oct 2026) */
.hero-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:6px} .hero-actions .hero-btn{margin:0} .hero-btn.soft{background:var(--surface);color:var(--ink);box-shadow:inset 0 0 0 1px var(--edge)}
.weak-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-top:1px solid var(--line)} .weak-row small{display:block}
#after-lock .notice.error{background:var(--surface);border-color:var(--line);border-left:4px solid var(--coral)}
.error{color:var(--coral)}
.why{color:var(--ink);font-weight:550}

/* Buttons: one primary a screen (ink), secondary (a 1 px edge), quiet (muted words). No gradients, glows or pills. */
.primary,.btnlink.primary{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:0;border-radius:var(--r-md);padding:0 18px;
  font:500 15px/1.2 var(--display);letter-spacing:-.006em;color:var(--on-btn);background:var(--btn);text-decoration:none;min-height:44px}
.primary:active{opacity:.88}
.primary:disabled{opacity:.35}
.wide{width:100%}
.primary.lg{min-height:48px;padding:0 22px;font-size:15.5px}
.soft{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:0;border-radius:var(--r-md);padding:0 16px;font:500 15px/1.2 var(--display);
  color:var(--ink);background:var(--surface);box-shadow:inset 0 0 0 1px var(--edge);min-height:44px;text-decoration:none}
.soft.indigo{color:var(--ink)} .soft.indigo .ic{color:var(--indigo)}
.soft.small,.quiet.small{padding:0 12px;min-height:36px;font-size:14px}
.outline{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;border:0;box-shadow:inset 0 0 0 1px var(--edge);
  background:var(--surface);border-radius:var(--r-md);padding:8px 14px;color:var(--ink);font:500 15px/1.2 var(--display);min-height:44px}
.outline small{font:inherit;font-size:inherit;color:var(--ink-soft)}
.outline.wide{flex-direction:row;margin-top:12px}
.quiet{border:0;background:none;color:var(--ink-soft);padding:10px 12px;font-weight:500;border-radius:var(--r-md)}
.quiet:hover{color:var(--ink)}
.danger{border:0;border-radius:var(--r-md);padding:0 16px;min-height:44px;background:var(--surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--coral) 70%,var(--edge));color:var(--coral);font-weight:500}
.link{border:0;background:none;color:var(--ink);font-weight:500;padding:8px 0;display:inline-flex;align-items:center;gap:6px;text-decoration:underline;
  text-underline-offset:3px;text-decoration-color:color-mix(in srgb,var(--ink) 35%,transparent)}
.link:hover{text-decoration-color:currentColor}
.link.big{font:500 17px var(--display);margin:4px 0 12px}
.link-inline{border:0;background:none;padding:0;color:var(--ink);text-decoration:underline;text-underline-offset:3px;font:inherit;text-align:left}
.iconbtn{border:0;background:none;padding:8px;display:inline-grid;place-items:center;color:var(--ink-soft);min-width:44px;min-height:44px;border-radius:var(--r-md)}
.iconbtn.round,.tool.round{background:var(--surface);border-radius:var(--r-md);box-shadow:inset 0 0 0 1px var(--edge);border:0}

.center{display:block;margin:12px auto}

/* The mark and wordmark: the dial (tools/brand/build_logo.py) and "FocusHour" in Geist 600 */
.mark{flex:none;display:block;color:var(--ink)}
.word{font:600 17px/1 var(--display);letter-spacing:-.03em;color:var(--ink);white-space:nowrap}
.brandline{display:flex;align-items:center;gap:9px}

/* Top bar: the mark, Home · Progress, search, his initial */
.topbar{position:sticky;top:0;z-index:20;background:color-mix(in srgb,var(--page) 94%,transparent);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--line);padding-top:env(safe-area-inset-top)}
.topbar-in{max-width:1400px;margin:0 auto;display:flex;align-items:center;gap:6px;padding:4px var(--gutter);min-height:56px}
.brand{display:flex;align-items:center;gap:9px;min-width:44px;min-height:44px;text-decoration:none;color:var(--ink);margin-right:8px}
@media (max-width:520px){.brand .word{display:none}}
.tabs{display:flex;gap:2px;flex:1;justify-content:center}
.tab{font:500 15px var(--display);color:var(--ink-soft);text-decoration:none;padding:15px 12px 13px;border-bottom:2px solid transparent}
.tab:hover{color:var(--ink)}
.tab.on{color:var(--ink);border-bottom-color:var(--accent)}
.avatar{border:0;width:36px;height:36px;border-radius:50%;background:var(--sunk);box-shadow:inset 0 0 0 1px var(--line-strong);color:var(--ink);font:600 15px var(--display);display:grid;place-items:center;margin:4px}

/* Page */
.page{max-width:1400px;margin:0 auto;padding:24px var(--gutter) calc(48px + env(safe-area-inset-bottom))}
.page.settings,.page.progress,.page.review,.page.done{max-width:760px}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:18px;margin:16px 0}
.card.flat{margin:10px 0}
.pill{display:inline-block;font:500 12px var(--display);letter-spacing:0;border-radius:var(--r-sm);padding:2px 7px;vertical-align:middle;background:var(--sunk);color:var(--ink-soft);box-shadow:inset 0 0 0 1px var(--line)}
.pill.secure{background:var(--accent-tint);color:var(--accent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 30%,transparent)}
.pill.started{background:color-mix(in srgb,var(--amber) 9%,var(--surface));color:var(--amber);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--amber) 30%,transparent)}
.pagehead{display:flex;align-items:center;gap:12px;margin:0 0 16px}
.pagetitle{font-size:19px;margin:0;flex:1;text-align:center;padding-right:44px}

/* Home: the hero (HomeHeroView), a plain card: the poster, the class, one button */
.date{margin:4px 0 12px}
.home-top{display:grid;gap:16px}
.hero{position:relative;overflow:hidden;border-radius:var(--r-lg);color:var(--ink);padding:12px;background:var(--surface);border:1px solid var(--line)}

.hero-poster{position:relative;border-radius:var(--r-md);overflow:hidden;aspect-ratio:16/9;background:var(--sunk)}
.hero-poster img{display:block;width:100%;height:100%;object-fit:cover}
.hero-poster picture,.skill-banner picture{display:contents}   /* (the banner's small copy on a phone: bannerImg) */
.hero-copy{position:relative;padding:16px 6px 6px}
.hero h1{font-size:clamp(26px,6.4vw,34px);letter-spacing:-.03em;line-height:1.08}
.hero p{font-size:16px;color:var(--ink-soft)}
.hero-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;white-space:nowrap;max-width:100%;border:0;border-radius:var(--r-md);min-height:48px;padding:0 22px;margin-top:6px;
  font:500 15.5px/1.2 var(--display);color:var(--on-btn);background:var(--btn)}

.next{font-size:16px;color:var(--ink-soft);margin:4px 0}
.short{font-size:16px;color:var(--ink);margin:10px 0}
.short.muted{font-size:14.5px;color:var(--ink-soft)}
.aside-line{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:12px 14px;margin:12px 0}

/* Poster rows (ScrollingRow): snap, a trailing fade and a › control */
.shelf{margin:36px 0 0}
.shelf h2{font-size:clamp(19px,4.4vw,22px)}
.row-wrap{position:relative;margin:0 calc(-1 * var(--gutter))}
.row-scroll{display:grid;grid-auto-flow:column;grid-auto-columns:min(236px,70vw);gap:14px;overflow-x:auto;scroll-snap-type:x mandatory;
  padding:4px var(--gutter) 12px;scroll-padding:0 var(--gutter);scrollbar-width:none}
.row-scroll::-webkit-scrollbar{display:none}
.row-wrap.fade::after{content:"";position:absolute;top:0;right:0;bottom:12px;width:48px;background:linear-gradient(90deg,transparent,var(--page));pointer-events:none}
.row-next{position:absolute;right:10px;top:calc((min(236px,70vw)) * 9 / 32 - 4px);z-index:2;width:40px;height:40px;border-radius:var(--r-md);border:0;box-shadow:inset 0 0 0 1px var(--edge);background:var(--surface);display:grid;place-items:center;color:var(--ink)}
.row-scroll.films{grid-auto-columns:min(260px,74vw)}
.tile{display:flex;flex-direction:column;gap:6px;text-align:left;border:0;background:none;padding:0;color:var(--ink);text-decoration:none;scroll-snap-align:start;min-width:0}
.tile .poster{position:relative;display:block;aspect-ratio:16/9;border-radius:var(--r-md);overflow:hidden;background:var(--sunk);box-shadow:inset 0 0 0 1px var(--line)}
.tile .poster img{display:block;width:100%;height:100%;object-fit:cover}
.poster-blank{display:grid;place-items:center;height:100%;font:600 16px var(--display);letter-spacing:-.015em;color:var(--ink-soft);padding:12px;text-align:center}
.tile strong{font:550 15px/1.3 var(--display);letter-spacing:-.01em}
.tile small{color:var(--ink-soft);font-size:13.5px;line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.film-tile{background:var(--surface);border-radius:var(--r-lg);padding:0 0 14px;border:1px solid var(--line);overflow:hidden}
.film-tile .poster{border-radius:0;box-shadow:none;border-bottom:1px solid var(--line)}
.film-tile strong,.film-tile small{padding:0 14px}
.film-tile strong{margin-top:8px}
.badges{position:absolute;left:8px;bottom:8px;display:flex;gap:6px}
.badge{font:500 12px var(--display);border-radius:var(--r-sm);padding:3px 7px;color:#fff;background:rgba(14,19,17,.84);font-variant-numeric:tabular-nums}
.badge.time{background:rgba(14,19,17,.84)}
.badge.concept{background:#0A7A55}

/* Topic page */
.topic-head{display:grid;gap:16px;margin:0 0 8px}
.topic-head h1{margin:0 0 6px}
.topic-poster{max-width:640px;border-radius:var(--r-lg);overflow:hidden;background:var(--sunk);border:1px solid var(--line);aspect-ratio:16/9}
.topic-poster img{display:block;width:100%;height:100%;object-fit:cover}
@media (min-width:900px){.topic-head{grid-template-columns:minmax(0,1fr) minmax(0,560px);align-items:center;gap:32px}}
details.play{margin:12px 0}
details.play summary{cursor:pointer;color:var(--ink);font-weight:500;padding:8px 0}
.unit{margin:32px 0 0;padding-top:20px;border-top:1px solid var(--line)}
.unit-head h2{margin-bottom:12px}
.unit-actions{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:14px}
.unit-actions .outline{flex-direction:column;padding:8px 6px;font-size:14.5px}

/* Search */
dialog{border:0;padding:0;background:transparent;color:var(--ink);max-width:none;max-height:none}
dialog:focus{outline:none}
dialog::backdrop{background:var(--scrim)}
dialog.sheet{position:fixed;inset:auto 0 0 0;margin:0 auto;width:min(720px,100%);max-height:92dvh;overflow:auto;background:var(--surface);border-radius:var(--r-xl) var(--r-xl) 0 0;
  border:1px solid var(--line);border-bottom:0;padding:18px var(--gutter) calc(20px + env(safe-area-inset-bottom))}
dialog.sheet.full{height:100dvh;max-height:100dvh;border-radius:0;width:100%;inset:0;border:0}
@media (min-width:760px){dialog.sheet{inset:0;margin:auto;border-radius:var(--r-xl);border-bottom:1px solid var(--line);max-height:88dvh} dialog.sheet.brief{inset:auto 0 0 0;margin:0 auto;border-radius:var(--r-xl) var(--r-xl) 0 0;border-bottom:0} dialog.sheet.full{width:min(920px,96vw);height:fit-content;max-height:94dvh;border-radius:var(--r-xl);border:1px solid var(--line)}}
.sheet-grab{width:36px;height:4px;border-radius:2px;background:var(--line-strong);margin:-6px auto 14px}
.search-head{display:flex;gap:8px;align-items:center;position:sticky;top:-18px;background:var(--surface);padding:6px 0 10px;z-index:1}
.searchbox{flex:1;display:flex;align-items:center;gap:8px;background:var(--surface);border:1px solid var(--edge);border-radius:var(--r-md);padding:0 12px;margin:0;color:var(--ink-soft)}
.searchbox:focus-within{border-color:var(--ink);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 22%,transparent)}
.searchbox input{border:0;background:transparent;padding:10px 0;min-height:42px;box-shadow:none}
.search-results h3{margin:18px 0 6px;font:500 12px var(--display);letter-spacing:.01em;color:var(--ink-soft)}
.result{display:flex;justify-content:space-between;gap:12px;width:100%;text-align:left;border:0;background:none;border-bottom:1px solid var(--line);padding:12px 2px;font-size:15.5px}
.result small{color:var(--ink-soft);font-weight:500;white-space:nowrap}

/* Progress */
.week{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;margin:14px 0 8px}
.day{display:flex;flex-direction:column;align-items:center;gap:8px}
.day .dot{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;position:relative}
.day .dot::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--line-strong)}
.day .dot.planned::before{width:20px;height:20px;background:none;border:1.5px solid var(--accent)}
.day .dot.kept{background:var(--accent);color:var(--on-accent)} .day .dot.kept::before{display:none}
.day .letter{font:500 15px var(--display);color:var(--ink-soft)}
.day.today .letter{color:var(--ink);text-decoration:underline;text-underline-offset:4px;font-weight:600}
.legend{display:flex;gap:18px;flex-wrap:wrap;color:var(--ink-soft);font-size:14px}
.legend .dot{display:inline-block;width:12px;height:12px;border-radius:50%;margin-right:6px;vertical-align:-1px}
.legend .dot.planned{border:1.5px solid var(--accent)} .legend .dot.kept{background:var(--accent)}
.better{display:grid;grid-template-columns:auto 1fr;gap:4px 16px;margin:12px 0}
.better strong{font:600 16px var(--display)}

details.more{margin:24px 0;border-top:1px solid var(--line)}
details.more>summary{cursor:pointer;font:600 17px var(--display);letter-spacing:-.015em;padding:14px 0}
.stats{display:flex;gap:14px} .stats>div{flex:1} .stats small{display:block;color:var(--ink-soft)} .stats strong{font:600 24px var(--display);letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.review-row,.unit-row,.setting-row{display:flex;align-items:center;gap:12px;width:100%;text-align:left;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:14px;margin:8px 0}
.review-row:hover,.unit-row:hover{border-color:var(--line-strong)}
.review-row .copy{flex:1;min-width:0} .review-row small,.unit-row small,.setting-row small{display:block}
.review-row .status{width:28px;text-align:center;font-weight:600} .status.ok{color:var(--accent)} .status.no{color:var(--coral)}
.setting-row{border:0;border-bottom:1px solid var(--line);border-radius:0;background:none;padding:14px 0;margin:0}
.unit-row .num,.wrow .num{width:28px;height:28px;border-radius:var(--r-sm);background:var(--sunk);box-shadow:inset 0 0 0 1px var(--line-strong);color:var(--ink);display:grid;place-items:center;font:600 13px var(--display);font-variant-numeric:tabular-nums;flex:none}
.wrow{display:flex;gap:12px;align-items:flex-start;padding:10px 0;border-bottom:1px solid var(--line)}
.wrow h3{margin:2px 0 4px}
.subtopics{list-style:none;padding:0} .subtopics li{padding:10px 0;border-bottom:1px solid var(--line)} .subtopics small{display:block}
.subtopics li.secure strong::after{content:" ✓";color:var(--accent)}
h2.big{font-size:26px;letter-spacing:-.025em}

/* Settings and onboarding */
.choices-list{display:grid;gap:8px;margin:14px 0}
.pick{display:flex;gap:12px;align-items:center;text-align:left;border:0;box-shadow:inset 0 0 0 1px var(--edge);border-radius:var(--r-md);background:var(--surface);padding:14px}
.pick small{display:block;color:var(--ink-soft)}
.pick .check{width:20px;height:20px;border-radius:var(--r-sm);border:1px solid var(--edge);display:grid;place-items:center;flex:none}
.pick.on{box-shadow:inset 0 0 0 2px var(--accent);background:var(--surface)}
.pick.on .check{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.chips{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0}
.chip{border:0;box-shadow:inset 0 0 0 1px var(--edge);background:var(--surface);border-radius:var(--r-md);padding:0 14px;min-height:44px;font-weight:500;font-size:14.5px}
.chip.on{background:var(--accent);box-shadow:none;color:var(--on-accent)}
.chips.days .chip{min-width:58px}
.segmented{display:inline-flex;background:var(--sunk);border:1px solid var(--line);border-radius:var(--r-md);padding:3px;gap:2px;flex-wrap:wrap}
.segmented button{border:0;background:none;border-radius:var(--r-sm);padding:7px 14px;min-height:44px;font-weight:500;font-size:14.5px;color:var(--ink-soft)}
.segmented button.on{background:var(--surface);color:var(--ink);box-shadow:inset 0 0 0 1px var(--edge)}
.toggle-row{display:flex;gap:12px;align-items:flex-start;font-weight:400;margin:12px 0}
.toggle-row input{width:20px;height:20px;min-height:0;margin-top:2px;accent-color:var(--accent);flex:none}
.toggle-row small{display:block}
.toggle{display:flex;gap:12px;align-items:flex-start;text-align:left;border:0;background:none;padding:14px 0;width:100%}
.toggle small{display:block}
.switch{width:40px;height:24px;border-radius:999px;background:var(--edge);position:relative;flex:none;margin-top:2px}
.switch::after{content:"";position:absolute;left:3px;top:3px;width:18px;height:18px;border-radius:50%;background:#fff;transition:transform .2s}
.switch.on{background:var(--accent)} .switch.on::after{transform:translateX(16px)}
.dayrow .dayname{width:110px;font-weight:500} .dayrow input{width:auto}
.onboard{max-width:520px;margin:0 auto;padding:calc(36px + env(safe-area-inset-top)) var(--gutter) 40px}
.onboard form button{margin-top:16px}
.steps{display:flex;gap:4px;margin-bottom:28px} .steps i{height:2px;flex:1;border-radius:1px;background:var(--line)} .steps i.on{background:var(--accent)}
.center-page{min-height:100dvh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:24px;max-width:560px;margin:0 auto}
.loading p{color:var(--ink-soft)}

/* The session: the slim header, the question, Working, the help row, Skip and Lock in */
.session{display:flex;flex-direction:column;height:100dvh;max-width:1400px;margin:0 auto}
.s-head{display:flex;gap:12px;background:var(--surface);padding:calc(10px + env(safe-area-inset-top)) var(--gutter) 10px;border-bottom:1px solid var(--line)}
.s-meta{flex:1;min-width:0}
.s-meta .eyebrow{margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.s-title{font:600 18px var(--display);letter-spacing:-.02em;display:flex;align-items:center;gap:8px}
.fx{font-style:normal;font-family:var(--display);font-weight:600}
.s-clock{font:500 22px/1.1 var(--display);letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.s-clock span{font:400 14px var(--display);color:var(--ink-soft);letter-spacing:0}
.bar{height:2px;border-radius:1px;background:var(--line);margin-top:8px;max-width:300px;overflow:hidden}
.bar i{display:block;height:100%;background:var(--accent);min-width:3px}
.s-side{display:flex;flex-direction:column;align-items:flex-end;gap:8px}
.s-side .row{margin:0}
.qpill{display:inline-flex;align-items:center;gap:6px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);padding:6px 12px;font:500 15px var(--display);color:var(--ink);font-variant-numeric:tabular-nums}
.qpill .ic{color:var(--ink-soft)} .qpill small{font-weight:400;color:var(--ink-soft);font-size:13px}
.s-body{flex:1;min-height:0;display:flex;flex-direction:column;gap:10px;padding:10px var(--gutter) 0}
.s-card{position:relative;flex:1;min-height:0;overflow:auto;background:var(--surface);border-radius:0;padding:18px 6px;border:0;overscroll-behavior:contain}
.working-open .s-card{flex:0 0 auto;max-height:36%}
.stem{font:550 16.5px/1.5 var(--text);letter-spacing:-.012em;margin:4px 0 16px}
/* A maths question's setup above its stem (the bank's `passage` on a maths question) */
.setup{font:400 16.5px/1.6 var(--text);margin:4px 0 10px;color:var(--ink)}
/* A reading passage: plain text, a hairline under it before the question */
.passage{font:400 17.5px/1.66 var(--text);letter-spacing:-.004em;padding:0 0 18px;margin-bottom:18px;border-bottom:1px solid var(--line)}
.passage.small{font-size:15.5px}
.figure{margin:8px 0 14px;overflow-x:auto}
.figure svg{max-width:100%;height:auto}
.options{display:grid;gap:10px}
.option{display:flex;gap:10px;align-items:center}
.option .answer{flex:1;display:flex;align-items:center;gap:14px;text-align:left;background:var(--surface);border:1px solid var(--edge);border-radius:var(--r-md);padding:12px 14px;min-height:54px;font-size:15.5px;color:var(--ink)}
.option .answer:hover{background:var(--sunk)}
.option .answer b{width:26px;height:26px;flex:none;border-radius:var(--r-sm);display:grid;place-items:center;border:1px solid var(--edge);background:var(--surface);font:550 13px var(--display);color:var(--ink)}
.option.selected .answer{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent);background:var(--surface)}
.option.selected .answer b{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.option.struck .answer{opacity:.45} .option.struck .answer span{text-decoration:line-through}
.option.correct .answer{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent);background:var(--accent-tint)} .option.correct .answer b{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.option.wrong .answer{border-color:var(--coral);box-shadow:inset 0 0 0 1px var(--coral);background:var(--coral-tint)} .option.wrong .answer b{border-color:var(--coral)}
.options.static .option .answer{min-height:0}
/* the cross-out: a small "ABC" struck through, in a 1 px box */
.cross{width:40px;height:28px;flex:none;border-radius:var(--r-sm);border:1px solid var(--edge);background:var(--surface);display:grid;place-items:center}
.cross .abc{font:550 10.5px var(--display);color:var(--ink-soft);text-decoration:line-through;letter-spacing:.02em}
.cross[aria-pressed="true"]{background:var(--sunk);border-color:var(--ink)}
.jump{position:sticky;bottom:6px;float:right;margin-top:-56px;border:0;border-radius:var(--r-md);background:var(--btn);color:var(--on-btn);font:500 14.5px var(--display);padding:10px 16px;min-height:40px}
/* "More ↓" (E2E-12): centred, so it never covers a choice's cross-out on the right; 44 px to tap */
.jump.more-below{float:none;display:block;width:fit-content;margin:-50px auto 0;min-height:44px;padding:0 16px;box-shadow:0 2px 10px rgb(0 0 0 / .18)}
.jump.more-below[hidden]{display:none}
.coach-note{display:flex;gap:10px;align-items:flex-start}
.coach-note .ic{color:var(--ink-soft);margin-top:2px} .coach-note .coach-text{flex:1;min-width:0;overflow-wrap:anywhere}
.thinking{position:relative;overflow:hidden;color:var(--ink-soft);font-weight:500}
.thinking::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--accent) 14%,transparent),transparent);animation:glow 1.6s infinite}
@keyframes glow{from{transform:translateX(-100%)}to{transform:translateX(100%)}}
@media (prefers-reduced-motion: reduce){.thinking::after{animation:none}}

/* Working: a bar until opened, then a pad under the pinned question */
.working{flex:none;background:var(--surface);border-radius:var(--r-lg);border:1px solid var(--line-strong);overflow:hidden;display:flex;flex-direction:column}
.working.open{flex:1;min-height:0}
.working-bar{display:flex;align-items:center;gap:12px;width:100%;text-align:left;border:0;background:var(--pad);padding:10px 14px;
  background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:24px 24px}
.working-bar strong{display:block;font:600 16px var(--display)} .working-bar small{color:var(--ink-soft);font-size:14px}
.wicon{width:40px;height:40px;border-radius:var(--r-md);background:var(--surface);box-shadow:inset 0 0 0 1px var(--line-strong);color:var(--ink);display:grid;place-items:center}
.working.open .working-bar{display:none}
.pad-tools{display:none;align-items:center;gap:2px;padding:6px 8px;flex-wrap:nowrap;overflow-x:auto;border-bottom:1px solid var(--line);background:var(--surface)}
.working.open .pad-tools{display:flex}
.swatch{position:relative;width:36px;height:36px;border:0;background:none;padding:0;flex:none;margin:0 1px}   /* a 36 px target around the 26 px dot */
.swatch::before{content:"";position:absolute;inset:7px;border-radius:50%;background:var(--sw)}
.swatch.ink{--sw:var(--ink)} .swatch.blue{--sw:var(--sky)} .swatch.red{--sw:var(--coral)}
.swatch.on::before{box-shadow:0 0 0 2px var(--surface),0 0 0 3.5px var(--accent)}
.tool{border:0;background:none;width:36px;height:36px;border-radius:var(--r-md);display:grid;place-items:center;color:var(--ink-soft);flex:none}
.tool:hover{color:var(--ink)}
.tool.on{background:var(--sunk);color:var(--ink);box-shadow:inset 0 0 0 1px var(--line-strong)}
.tool.collapse{margin-left:auto}
.tool[hidden]{display:none}
.tool.hand[aria-pressed="true"]{background:var(--sunk);color:var(--ink);box-shadow:inset 0 0 0 1px var(--line-strong)}
.sep{width:1px;height:20px;background:var(--line);margin:0 4px;flex:none}
.padwrap{position:relative;flex:1;min-height:0}
.working:not(.open) .padwrap{display:none}
#scratch{position:absolute;inset:0;width:100%;height:100%;touch-action:none;display:block}
/* A long press on the pad must draw, never select the page (Safari turned the pad blue with selection handles). */
.session,.session *,.working,.working *{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}
.session input,.session textarea{-webkit-user-select:text;user-select:text}
.zoom-note{position:absolute;right:12px;top:10px;background:rgba(14,19,17,.84);color:#fff;border-radius:var(--r-sm);padding:3px 8px;font:500 12.5px var(--display);font-variant-numeric:tabular-nums}
.s-foot{padding:10px var(--gutter) calc(10px + env(safe-area-inset-bottom));background:var(--surface);border-top:1px solid var(--line)}
.s-foot .row{margin:0 0 10px} .s-foot .row:last-child{margin:0}
/* The help row: quiet tools (a muted icon and its word), never coloured chips */
.helps .help{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:8px;border:0;border-radius:var(--r-md);padding:0 12px;font:500 15px var(--display);min-height:44px;
  background:var(--surface);color:var(--ink);box-shadow:inset 0 0 0 1px var(--edge)}
.helps .help:hover{background:var(--sunk)}
.help .ic{color:var(--ink-soft)}
.skipbtn{display:inline-flex;align-items:center;gap:8px;border:0;border-radius:var(--r-md);padding:0 16px;background:none;color:var(--ink-soft);font:500 15px var(--display);min-height:44px}
.lockin{min-height:48px;font-size:15.5px}
.s-foot.compact{display:flex;gap:10px;align-items:center}
.s-foot.compact .row{margin:0}
.s-foot.compact .helps .help span,.s-foot.compact .skipbtn span{display:none}
.s-foot.compact .helps .help,.s-foot.compact .skipbtn{width:48px;flex:none;padding:0;justify-content:center}
.s-foot.compact .row:last-child{flex:1}
.extra{flex-wrap:wrap}

/* Key idea (HelpPane) */
dialog.help .concept{background:var(--sunk);border:1px solid var(--line);border-radius:var(--r-md);padding:12px}
dialog.help h2{display:flex;align-items:center;gap:8px;color:var(--ink)}
dialog.help h2 .ic{color:var(--indigo)}
.showme ol{padding-left:22px} .showme li{margin:6px 0;font-size:15.5px}
.sm-idea{font-weight:550;font-size:16.5px;letter-spacing:-.012em} .sm-watch{color:var(--coral);font-weight:500}
.sm-more{margin-top:8px} .sm-more>summary{cursor:pointer;color:var(--accent-ink,var(--accent));font-weight:550;min-height:44px;display:flex;align-items:center} .sm-more[open]>summary{margin-bottom:4px}
/* the Key idea's worked example: one step a line, read top to bottom */
.sm-example .sm-line{padding:3px 0;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch} .sm-example .sm-line+.sm-line{border-top:1px solid var(--line)}
/* typeset maths (typeset.mjs): the plain text shows until KaTeX has drawn it. A matrix may be wider than a phone, so
   it scrolls on its own rather than pushing the page sideways. */
span.tex[data-tex]:not(.drawn):not(.plain){visibility:hidden}   /* (until KaTeX draws it, or its plain text shows: app.mjs math) */
.katex{font-size:1.08em} span.tex.nobreak .katex{white-space:nowrap}
span.tex.drawn:has(.mtable){display:inline-block;max-width:100%;overflow-x:auto;overflow-y:hidden;vertical-align:middle;padding:3px 0}
.diagram svg{max-width:100%;height:auto}

.agenda{list-style:none;padding:4px 18px}
.agenda li{display:flex;align-items:center;gap:16px;padding:16px 0;border-bottom:1px solid var(--line)}
.agenda li:last-child{border:0}
.agenda strong{flex:1;font:550 16px/1.35 var(--display);letter-spacing:-.01em}
.agenda .num{width:28px;height:28px;border-radius:var(--r-sm);background:var(--sunk);box-shadow:inset 0 0 0 1px var(--line-strong);color:var(--ink);display:grid;place-items:center;font:600 13px var(--display);flex:none}
.agenda .num.indigo{box-shadow:inset 0 0 0 1px var(--indigo);color:var(--indigo)}

.part{min-height:100dvh}
.part-header{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:calc(8px + env(safe-area-inset-top)) var(--gutter) 8px;max-width:760px;margin:0 auto;border-bottom:1px solid var(--line)}
.part-header .eyebrow{margin:0}
.part-header .row{margin:0}
.part-body{max-width:760px;margin:0 auto;padding:16px var(--gutter) calc(40px + env(safe-area-inset-bottom))}
.part.dark{background:var(--page);color:var(--ink)}
.clock.big{font:500 60px/1.05 var(--display);letter-spacing:-.04em;font-variant-numeric:tabular-nums;margin:18px 0}
.option-card{display:block;width:100%;text-align:left;background:var(--surface);border:0;box-shadow:inset 0 0 0 1px var(--edge);border-radius:var(--r-lg);padding:18px;margin:10px 0}
.option-card strong{display:block;font:600 17px var(--display);letter-spacing:-.015em;margin-bottom:4px} .option-card small{color:var(--ink-soft);font-size:14.5px}

.dots{display:flex;gap:4px;margin:10px 0 18px} .dots i{flex:1;height:2px;border-radius:1px;background:var(--line)} .dots i.done{background:var(--accent)} .dots i.now{background:var(--ink)}
h2.stem,h3.stem{font:600 19px/1.4 var(--display);letter-spacing:-.015em}
.rung-options{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:16px 0}
.rung-options.single{grid-template-columns:1fr}
.rung{border:1px solid var(--edge);background:var(--surface);border-radius:var(--r-md);padding:14px 16px;font-size:16px;text-align:left;min-height:54px}
.rung:hover{background:var(--sunk)}
.rung.right{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent);background:var(--accent-tint)}
.rung.wrong{border-color:var(--coral);box-shadow:inset 0 0 0 1px var(--coral);text-decoration:line-through}
.right-line{color:var(--accent);font-weight:500;display:flex;gap:8px;align-items:flex-start}
.slip{background:var(--coral-tint);border:1px solid color-mix(in srgb,var(--coral) 25%,var(--line));border-radius:var(--r-md);padding:14px;margin:12px 0}
.slip strong{color:var(--coral)}

.film-offer img{border-radius:var(--r-md);margin-bottom:10px}
/* The player's bottom meets the captions strip square, so the strip never covers the control bar. On a wide, short
   screen (an iPad in landscape) the film keeps to 58% of the height. */
/* The video rounds its own corners, as a class's clip does (owner, 30 Oct 2026: class clips never stuck on Safari, the
   Solved films often did). Nothing clips it: Safari can freeze the picture of a video clipped by a rounded ancestor
   (overflow:hidden with border-radius, or the -webkit-mask-image trick removed on 25 Oct) while the sound plays on. */
.player{position:relative;background:#000;border-radius:var(--r-lg) var(--r-lg) 0 0;aspect-ratio:16/9;margin:10px auto 0;
  max-width:calc(58dvh * 16 / 9)}
.player video{width:100%;height:100%;display:block;object-fit:contain;border-radius:inherit}
.film-error{position:absolute;inset:0;border-radius:inherit;display:flex;flex-direction:column;gap:10px;align-items:center;justify-content:center;background:rgba(0,0,0,.75);color:#fff}
.film-error[hidden]{display:none}
.captions-strip{min-height:3.2em;background:#0E1311;color:#fff;border-radius:0 0 var(--r-lg) var(--r-lg);padding:10px 16px;font-size:16.5px;line-height:1.4;text-align:center;margin:0 auto;max-width:calc(58dvh * 16 / 9)}
.captions-strip.off{background:#0E1311;min-height:0;padding:0;height:12px}
.film-sheet{position:relative;padding-top:8px}
/* A phone's film (Codex audit F09: the film's own teaching text is drawn into the picture and is small at 375 px):
   a Full screen button, and in portrait one line asking to turn the phone. Full screen keeps the captions strip
   under the picture, never over it (owner, 17 Oct 2026). */
.film-full,.turn-hint{display:none}
@media (max-width:739px){.film-full{display:inline-flex}}
@media (max-width:739px) and (orientation:portrait){.turn-hint{display:block;margin:8px 0 0;text-align:center}}
.film-frame:fullscreen{display:flex;flex-direction:column;justify-content:center;align-items:center;background:#000;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)}
.film-frame:fullscreen .player{width:100%;max-width:calc((100dvh - 80px) * 16 / 9);margin:0;border-radius:0}
.film-frame:fullscreen .captions-strip{width:100%;max-width:calc((100dvh - 80px) * 16 / 9);border-radius:0}
.film-frame:-webkit-full-screen{display:flex;flex-direction:column;justify-content:center;align-items:center;background:#000;width:100%;height:100%}
.film-frame:-webkit-full-screen .player{width:100%;max-width:calc((100vh - 80px) * 16 / 9);margin:0;border-radius:0}
.film-frame:-webkit-full-screen .captions-strip{width:100%;max-width:calc((100vh - 80px) * 16 / 9);border-radius:0}
.film-x{position:absolute;right:0;top:0;z-index:2}
.film-sheet h1{padding-right:56px;font-size:24px}
.trap{color:var(--coral);font-weight:500}
/* Done: a plain card, the headline the biggest thing on it */
.done-hero{background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:var(--r-lg);padding:24px}
.done-hero h1{font-size:28px;letter-spacing:-.03em}
.done-hero p{color:var(--ink-soft)}

.review-image{width:100%;border-radius:var(--r-md);border:1px solid var(--line);background:#fff}
/* The answer's explanation (the checked ideal play) under a marked answer and in a review (owner, 23 Oct 2026: no heading) */
.ideal-play{margin:8px 0 0;overflow-wrap:anywhere;color:var(--ink)}
.choice-note{margin:6px 0 0;color:var(--ink-soft);font-size:.95em;overflow-wrap:anywhere}

#toast{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(20px + env(safe-area-inset-bottom));z-index:100;background:var(--btn);color:var(--on-btn);border-radius:var(--r-md);padding:11px 16px;max-width:min(560px,92vw);font-size:14.5px}
#toast[hidden]{display:none}

/* Wider screens: the iPad's measure */
@media (min-width:760px){
  :root{--gutter:28px}
  .row-scroll{grid-auto-columns:280px} .row-scroll.films{grid-auto-columns:300px}
  .row-next{top:calc(280px * 9 / 32 - 2px)}
  .hero{display:grid;grid-template-columns:1.05fr 1fr;gap:28px;align-items:center;padding:16px}
  .hero.mock{grid-template-columns:1fr}
  .hero-copy{padding:8px}
  .unit-actions{display:flex;gap:8px} .unit-actions .outline{flex-direction:row;gap:6px;padding:0 16px}
  .unit-actions .outline small::before{content:"· "}
}
@media (min-width:1100px){
  .home-top{grid-template-columns:minmax(0,2.2fr) minmax(280px,1fr);align-items:start}
}
@media (min-width:740px){   /* an iPad, portrait included (744-834 pt): the iPad app's side-by-side question and pad */
  .s-body{flex-direction:row;padding-bottom:10px}
  .s-card{flex:1 1 0;min-width:0;max-height:none !important;padding:22px 18px}
  .working{flex:1.1 1 0;min-width:0}
  .s-foot{display:flex;gap:12px;align-items:center} .s-foot .row{margin:0} .s-foot .helps{flex:1} .s-foot .row:last-child{flex:1.2}
  .working .working-bar{display:none}
  .working .pad-tools{display:flex}
  .working .padwrap{display:block}
  /* The header's Pause, ✕ and Q pill in one row, as on the phone (they stacked down the right on an iPad). */
  .s-side{flex-direction:row;align-items:center;gap:10px;align-self:flex-start}
  /* Nothing in the footer wraps: "See one solved" / "Show me how" get their own small row above the help row. */
  .s-foot{flex-wrap:wrap;row-gap:8px}
  .s-foot .extra{flex:1 0 100%;gap:8px}
  .helps .help,.skipbtn,.lockin{white-space:nowrap}
.page.done .row.wrap>button{white-space:nowrap}
  .s-foot .helps{min-width:0}
  /* A reading passage beside its question, a hairline between them (the SAT's own two panes) */
  .verbal .s-card.has-passage{display:grid;grid-template-columns:1fr 1fr;gap:0 40px;align-content:start}
  .verbal .s-card.has-passage .passage{grid-row:1 / span 8;margin:0;padding:0 40px 0 0;border-bottom:0;border-right:1px solid var(--line);align-self:stretch}
  .jump{display:none}
}
.rung:disabled,.option .answer:disabled,.cross:disabled{opacity:1}
.rung:disabled:not(.right):not(.wrong){opacity:.6}
.s-foot.compact{flex-wrap:wrap}
.s-foot.compact .extra{flex:1 0 100%;margin:0}
.s-foot .extra .soft{white-space:nowrap}
.part-body h1.worked{font-size:clamp(22px,5vw,28px)}
.verbal .option .answer{font-size:15.5px;line-height:1.4}
.lockin{white-space:nowrap}
.page.done .row.wrap>button{white-space:nowrap}
@media (max-width:400px){.pad-tools .tool[data-t=redo]{display:none} .swatch{margin:0 2px}}
.s-foot.compact .helps{flex:none;gap:8px} .s-foot.compact .row:last-child{min-width:0;gap:8px}
.tool.busy{opacity:.45;cursor:progress}

/* Phone: a tighter session screen so the question, its choices and the buttons fit (owner, 18 Oct 2026: "room here
   to make some fonts smaller so buttons etc fit better"). An iPad (740 px and up) keeps the sizes above. */
@media (max-width:739px){
  .s-head{padding:calc(6px + env(safe-area-inset-top)) var(--gutter) 6px;gap:8px;align-items:flex-start}
  /* The part's name wraps on a phone, never "2 OF 5 · TODAY'S IDE…" or "MOCK PAPER · ON YOUR …" (owner, 20 Oct 2026) */
  .s-meta .eyebrow{font-size:11.5px;white-space:normal;overflow:visible;text-overflow:clip;line-height:1.35}
  .s-title{font-size:16px;gap:6px}
  .s-clock{font-size:17px} .s-clock span{font-size:12.5px}
  .bar{margin-top:4px}
  .s-side{flex-direction:row;align-items:center;gap:6px}
  .s-side .quiet.small{padding:6px 8px;min-height:44px;font-size:14px}
  .s-side .iconbtn.round{width:44px;height:44px}
  .qpill{padding:4px 9px;font-size:14px;gap:4px}
  .s-body{gap:8px;padding-top:4px}
  .s-card{padding:12px 2px}
  .stem{font-size:15.5px;line-height:1.48;margin:2px 0 12px}
  .setup{font-size:15.5px;line-height:1.5;margin:2px 0 8px}
  .passage{font-size:15.5px;line-height:1.55;padding-bottom:14px;margin-bottom:14px}
  .options{gap:8px}
  .option{gap:8px}
  .option .answer{min-height:46px;padding:8px 12px;font-size:15px;gap:12px}
  .option .answer b{width:24px;height:24px;font-size:12.5px}
  .cross{width:36px;height:26px} .cross .abc{font-size:9.5px}
  .working-bar{padding:7px 12px;gap:10px} .working-bar strong{font-size:15px} .working-bar small{font-size:13px}
  .s-foot{padding:8px var(--gutter) calc(8px + env(safe-area-inset-bottom))}
  .s-foot .row{margin:0 0 8px}
  .helps .help{font-size:14.5px;min-height:42px;padding:0 8px;gap:6px}
  .skipbtn{font-size:14.5px;min-height:42px;padding:0 12px;gap:6px}
  .lockin{min-height:46px;font-size:15.5px}
  .s-foot .extra .soft{padding:0 12px;min-height:44px;font-size:14px}
  .part-header .eyebrow{font-size:11.5px}
  .s-foot.compact .helps .help,.s-foot.compact .skipbtn{width:44px}
}

/* Access and the account (19 Oct 2026): sign-in, who it's for, a parent's home, the free account's blockers. Calm:
   a blur and one quiet label, never red, never a countdown. */
.signin .logo,#role .logo{margin:0 0 40px}
.signin .logo .mark,#role .logo .mark{width:24px;height:24px}
.signin .logo .word,#role .logo .word{font-size:18px}
.signin h1,#role h1{font-size:26px}
.signin form button,#role .choices-list{margin-top:16px}
/* Google's sign-in button, drawn by hand within Google's branding rules (the app's CSP loads no Google script): its
   light theme (white, a #747775 hairline, #1F1F1F text) or dark theme (#131314, #8E918F, #E3E3E3), the unaltered
   four-colour G at 18 px, "Continue with Google" in Roboto Medium 14 px, Google's rectangular shape (4 px corners);
   never a link, an underline or a recoloured G. */
.gbtn{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;min-height:44px;padding:0 16px;border-radius:4px;
  background:#FFFFFF;color:#1F1F1F;border:1px solid #747775;font:500 14px/20px Roboto,system-ui,-apple-system,"Segoe UI",Arial,sans-serif;letter-spacing:.25px;text-decoration:none;margin-top:8px}
.gbtn svg{flex:none;width:18px;height:18px}
.gbtn:hover{background:#F8F9FA}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .gbtn{background:#131314;color:#E3E3E3;border-color:#8E918F}}
:root[data-theme="dark"] .gbtn{background:#131314;color:#E3E3E3;border-color:#8E918F}
/* "or with your email": a hairline either side */
.or{display:flex;align-items:center;gap:12px;color:var(--ink-soft);font-size:13.5px;margin:22px 0 0}
.or::before,.or::after{content:"";flex:1;height:1px;background:var(--line)}
.role-pick{padding:16px}
.role-pick strong{font:600 16.5px var(--display);letter-spacing:-.01em}
.role-icon{width:40px;height:40px;border-radius:var(--r-md);display:grid;place-items:center;flex:none;color:var(--ink);background:var(--sunk);box-shadow:inset 0 0 0 1px var(--line-strong)}
.card.invite{border-color:var(--line-strong)}
.tile.locked .poster img{filter:blur(7px) saturate(.6);transform:scale(1.08)}
.tile.locked strong{color:var(--ink-soft)}
.unlock-pill {display:inline-flex;align-items:center;gap:6px;border-radius:var(--r-md);font:500 14px var(--display);white-space:nowrap}

.row-wrap.blurred .row-scroll{filter:blur(4px);pointer-events:none;user-select:none;opacity:.8}

.unlock-pill{position:absolute;left:50%;top:42%;transform:translate(-50%,-50%);border:0;padding:0 18px;background:var(--btn);color:var(--on-btn);z-index:2;min-height:44px}
.outline.locked{color:var(--ink-soft)}
.outline.locked .ic{margin-right:2px}
.pill.free{background:var(--accent-tint);color:var(--accent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 30%,transparent)}
.price-card{display:flex;flex-direction:column;gap:2px;background:var(--sunk);border:1px solid var(--line);border-radius:var(--r-md);padding:16px;margin:14px 0}
.price-card strong{font:600 24px var(--display);letter-spacing:-.03em;font-variant-numeric:tabular-nums;color:var(--ink)}
.price-card span{color:var(--ink-soft)}
.access-card.free {border-color:var(--line-strong)}
.child-head{display:flex;align-items:center;gap:14px;margin-bottom:6px}
.child-head h2{margin:0}
.avatar.big{width:48px;height:48px;font-size:19px;flex:none}
.setting-row.static{cursor:default}
h3.gap{margin-top:18px}
.parent-home > h1{margin-top:8px}
a.review-row{color:var(--ink);text-decoration:none}
.tabs .tab{white-space:nowrap}

/* Key terms (glossary.mjs; owner, 19 Oct 2026: "I don't know what radicand is"): a light dotted underline in the
   muted ink, no colour change and no change to the line; an invisible 44 px tap target around the word; a tap opens
   a small card with the plain words and the example (a sheet at the bottom on a narrow phone). */
.term{appearance:none;-webkit-appearance:none;display:inline;margin:0;padding:0;border:0;border-radius:0;background:none;box-shadow:none;
  min-width:0;min-height:0;width:auto;height:auto;font:inherit;color:inherit;letter-spacing:inherit;line-height:inherit;text-align:inherit;
  vertical-align:baseline;position:relative;cursor:help;-webkit-tap-highlight-color:transparent;
  text-decoration:underline dotted;text-decoration-color:color-mix(in srgb,var(--ink-soft) 70%,transparent);text-decoration-thickness:1.5px;text-underline-offset:.22em}
.term::after{content:"";position:absolute;left:50%;top:50%;width:max(100%,44px);height:44px;transform:translate(-50%,-50%)}
.term:hover,.term[aria-expanded="true"]{text-decoration-color:var(--ink-soft)}
.term:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-radius:2px}
.term-pop{position:fixed;z-index:1000;width:min(340px,calc(100vw - 24px));padding:12px 14px;background:var(--surface);color:var(--ink);
  border:1px solid var(--line-strong);border-radius:var(--r-lg);font:400 14.5px/1.5 var(--text);text-align:left}
.term-pop p{margin:0}
.term-pop .term-plain strong{font-weight:600}
.term-pop .term-example{margin-top:8px;padding-top:8px;border-top:1px solid var(--line);color:var(--ink-soft)}
.term-pop.sheet{left:0;right:0;bottom:0;top:auto;width:100%;border-radius:var(--r-xl) var(--r-xl) 0 0;padding:16px var(--gutter) max(18px,env(safe-area-inset-bottom));font-size:15.5px}

/* The figures and Key idea diagrams (data/showme.js, the iPad's drawing code) paint with the iPad web view's colour
   names: without them every line was invisible and the labels stayed black in dark mode (student simulation, 19 Oct
   2026: a ladder diagram showed only its point names). */
.figure,.diagram,.showme{--fg:var(--ink);--muted:var(--ink-soft);--card:var(--surface)}

/* Text tones the older rules read (every one 4.5:1 or better on its own surface, light and dark: tokens.css) */
:root{--saffron-text:var(--amber);--coral-text:var(--coral);--on-coral:#fff;--emerald-text:var(--accent);--coral-fill:var(--coral)}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){--on-coral:#2A0E07}}
:root[data-theme="dark"]{--on-coral:#2A0E07}
.error, .danger, .sm-watch, .trap, .slip strong, .status.no {color:var(--coral)}
.option.wrong .answer b{color:var(--on-coral);background:var(--coral)}

/* The hero's button may take two lines on a phone (student simulation, 19 Oct 2026: "Resume · part 5 of 5, Mixed
   practice" ran out of the hero at 390 px and was cut off). */
@media (max-width:600px){.hero-btn{white-space:normal;text-align:left;line-height:1.25;padding-top:10px;padding-bottom:10px} .hero-btn .ic{flex:none}}

/* The class's place in the header stays on one line: "Maths class · " drops on a phone (student simulation, 19 Oct
   2026: it wrapped to two lines on an iPhone). */
.part-header .eyebrow,.s-meta .eyebrow{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}

/* Selects as tall as the inputs beside them (WebKit drew the month pickers 24 px tall on a phone), with a drawn
   chevron that follows the theme. */
select{-webkit-appearance:none;appearance:none;min-height:44px;padding-right:40px;
  background-image:linear-gradient(45deg,transparent 50%,var(--ink-soft) 50%),linear-gradient(135deg,var(--ink-soft) 50%,transparent 50%);
  background-position:calc(100% - 21px) 50%,calc(100% - 15px) 50%;background-size:6px 6px;background-repeat:no-repeat}

/* Fingers get 44 px to tap (Codex audit F07, student simulation): the pad tools, the cross-outs, Pause, "See one
   solved" and the link buttons. What shows stays the size it was; the extra is invisible padding around it. */
@media (pointer:coarse){
  .tool{width:44px;height:44px;padding:4px;background-clip:content-box}
  .tool.on,.tool.hand[aria-pressed="true"]{box-shadow:none}
  .tool.round{padding:0;background-clip:border-box}
  .swatch{width:44px;height:44px}
  .swatch::before{inset:11px}
  .pad-tools{padding-top:2px;padding-bottom:2px}
  p.small a{padding:14px 0}   /* About · Privacy: an inline link's padding widens the tap, not the line */
  .quiet,.link,details.play summary{min-height:44px}   /* every quiet button, not only the small ones: Cancel in a sheet measured 43 px (audit F07) */
  .soft.small{min-height:44px;border:4px solid transparent;background-clip:padding-box;padding-top:4px;padding-bottom:4px}
}
@media (pointer:coarse) and (max-width:739px){
  /* a phone's pad toolbar: the 44 px tools sit side by side, no gaps, so all of them fit on one line (Redo is hidden
     under 400 px) */
  .pad-tools{gap:0;padding-left:2px;padding-right:2px}
  .pad-tools .swatch{margin:0}
  .cross{width:44px;height:44px;margin:-4px;border:0;background:none;position:relative}
  .cross::before{content:"";position:absolute;inset:9px 4px;border-radius:var(--r-sm);border:1px solid var(--edge);background:var(--surface)}
  .cross[aria-pressed="true"]::before{background:var(--sunk);border-color:var(--ink)}
  .cross .abc{position:relative}
  .s-side .quiet.small{min-height:44px}
  .s-foot .extra .soft{min-height:44px;border:4px solid transparent;background-clip:padding-box;padding-top:2px;padding-bottom:2px}
}

/* A film's idea: one sentence, the rest behind a quiet More (owner, 19 Oct 2026). */
.idea-more summary{color:var(--ink-soft);font-weight:500;cursor:pointer;min-height:44px;display:flex;align-items:center}
.idea-more p{margin-top:0}
.better-line{margin:10px 0}

/* More ways to subscribe on a free account (owner, 19 Oct 2026): a quiet header button, a corner on locked topics and
   a last card in every row. */
.subscribe-pill{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;border:0;box-shadow:inset 0 0 0 1px var(--edge);border-radius:var(--r-md);background:var(--surface);color:var(--ink);font:500 14px var(--display);white-space:nowrap}
.subscribe-pill:hover{background:var(--sunk)}
@media (max-width:600px){.subscribe-pill{display:none}}
.subscribe-tile{border:0;background:none;padding:0;text-align:left;cursor:pointer}
.subscribe-tile .poster{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;border:1px dashed var(--edge);box-shadow:none;background:var(--sunk);color:var(--ink);text-align:center;padding:12px}
.subscribe-tile .poster b{font:600 15.5px var(--display);letter-spacing:-.01em}
.subscribe-tile .poster small{color:var(--ink-soft);font-size:13px}

/* Start-up (19 Oct 2026, "Managing perceived latency is essential"): the first frame painted from this browser
   (paint.js) can't be tapped until the app has started; a calm outline of the screen stands in while its files arrive. */
#app.painted{pointer-events:none}
.sk{display:block;background:var(--sunk);border-radius:var(--r-sm)}
.sk-line{height:12px;width:70%;margin:10px 0} .sk-line.short{width:38%}
.sk-title{height:28px;width:82%;margin:6px 0 14px;border-radius:var(--r-md)}
.sk-card{height:120px;margin:16px 0;border-radius:var(--r-lg)}
.sk-button{height:48px;width:150px;margin-top:14px;border-radius:var(--r-md)}
.sk-hero .sk{background:var(--sunk)}
.sk-hero{min-height:260px}
.sk-tile .poster{aspect-ratio:16/9;border-radius:var(--r-md);box-shadow:none;background:var(--sunk)}
/* (the first paint is Home's own frame, so Home fills it in place: a different placeholder read as a reload; owner, 31 Oct 2026) */
@media (prefers-reduced-motion: no-preference){
  .sk{animation:sk-breathe 1.6s ease-in-out infinite alternate}
  @keyframes sk-breathe{from{opacity:.55}to{opacity:1}}
}
.getting-ready{font-size:.8em;font-weight:500;white-space:normal}
.topic-tile.locked{border:0;background:none;padding:0;text-align:left;cursor:pointer;font:inherit;color:inherit}

/* Account transitions: a calm bar, in the same ink and emerald in light and dark; no made-up percentage. */
.account-progress{margin:20px 0;color:var(--ink-soft);max-width:420px}
.account-progress p{font-size:14px;margin-bottom:10px}
.account-progress-track{height:2px;overflow:hidden;border-radius:1px;background:var(--line)}
.account-progress-track i{display:block;width:38%;height:100%;border-radius:inherit;background:var(--accent);animation:account-ready 2.4s ease-in-out infinite alternate}
@keyframes account-ready{from{transform:translateX(0)}to{transform:translateX(163%)}}
@media(prefers-reduced-motion:reduce){.account-progress-track i{animation:none;width:50%}}

/* Parent preview: a quiet, persistent way back, including inside modal sheets. */
.explore-card.highlighted{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent)}
.explore-banner{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px var(--gutter);background:var(--surface);border-bottom:1px solid var(--line);font-size:13px;line-height:1.35}
.explore-banner .link{flex-shrink:0;max-width:130px}
#explore-banner{position:fixed;top:0;left:0;right:0;z-index:40;padding-top:env(safe-area-inset-top);background:var(--surface)}
#explore-banner .explore-banner{height:64px;box-sizing:border-box}
body.exploring{padding-top:calc(64px + env(safe-area-inset-top))}
.exploring .topbar{top:calc(64px + env(safe-area-inset-top));padding-top:0}
dialog .explore-banner{position:sticky;top:-18px;z-index:4;margin-bottom:16px;border-radius:var(--r-md);border:1px solid var(--line)}
.exploring .session{height:calc(100dvh - 64px - env(safe-area-inset-top))}
.exploring .part{min-height:calc(100dvh - 64px - env(safe-area-inset-top))}

/* Arriving from sign-in (paint.js): one calm line and a moving bar until the first screen draws (owner, 19 Oct 2026). */
.arriving{gap:14px}
.arriving .logo{margin-bottom:6px}
.arriving p{margin:0;color:var(--ink-soft);font-weight:500}
.arriving .progress{width:min(240px,70vw);height:2px;border-radius:1px;background:var(--line);overflow:hidden}
.arriving .progress span{display:block;width:40%;height:100%;border-radius:1px;background:var(--accent);animation:arrive 1.2s ease-in-out infinite}
@keyframes arrive{from{transform:translateX(-100%)}to{transform:translateX(250%)}}
@media (prefers-reduced-motion:reduce){.arriving .progress span{animation:none;width:100%;opacity:.5}}

/* The pay sheet (pay.mjs; owner, 19 Oct 2026): the plan's price, card or bank transfer, the details and the reference */
.pay .pay-ways{display:grid;gap:12px;margin:16px 0 6px}
@media (min-width:640px){.pay .pay-ways{grid-template-columns:1fr 1fr;align-items:start}}
.pay .pay-way{display:flex;flex-direction:column;gap:6px;min-width:0}
.pay .pay-way>button{width:100%;flex-direction:row;gap:8px;min-height:48px}
.pay .pay-way p{margin:0}
.pay .ask-block{display:grid;gap:6px;margin:16px 0 0}.pay .ask-block p{margin:0}.pay .ask-block button{width:100%}
.pay .or-line{margin:18px 0 -6px;text-align:center}
.pay #ask-form input{width:100%}

.pay input[type=file]{padding:10px;margin:6px 0 4px}
.pay .price-card .sk{display:block;margin:4px 0}
.access-card.renew{border-color:var(--line-strong)}

/* No sideways page on a phone (owner's iPhone, 20 Oct 2026: the question screen 7% too big, cut off at the right).
   iOS Safari zooms the page into a focused field under 16 px and stays zoomed: the calculator's table cells were 15 px
   (16/15) and its slider bounds 13 px. And a quick second tap on a button never zooms the page (double-tap zoom). */
button{touch-action:manipulation}
@media (max-width:739px){
  input,select,textarea{font-size:max(16px,1em)}
  .cx input.cx-cell,.cx input.cx-bound{font-size:16px}
}

/* The question screen on a phone (owner, 20 Oct 2026: "the design has become very cluttered on phone with our
   buttons"): one row of small tools (icon over a short label: Working, Calc, Key idea, Coach, Skip; only those that
   apply) and Lock in under it, full width. Working opens the pad from its tool; there is no strip. With the pad
   open the tools lose their labels and share Lock in's line. An iPad (740 px and up) keeps its footer. */
@media (max-width:739px){
  .working .working-bar{display:none}
  .working:not(.open){display:none}
  .s-foot.phone-foot{display:flex;flex-direction:column;gap:6px;padding:6px var(--gutter) calc(8px + env(safe-area-inset-bottom));border-top:1px solid var(--line)}
  .tool-row{display:flex;gap:2px;min-width:0}
  .qtool{flex:1 1 0;min-width:0;min-height:48px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;border:0;background:none;border-radius:var(--r-md);
    padding:4px 2px;color:var(--ink-soft);font:500 11.5px/1.1 var(--display);letter-spacing:0}
  .qtool .qt-label{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .qtool[aria-pressed="true"],.qtool.pt-flag.on{background:var(--sunk);color:var(--ink)}
  .qtool.pt-flag.on .ic{color:var(--amber)}
  .qtool:disabled{opacity:.45}
  .phone-foot > .lockin{width:100%;min-height:48px}
  /* With the pad open the row keeps its place above Lock in and only drops its labels */
  .s-foot.phone-foot.compact{flex-direction:column;align-items:stretch;flex-wrap:nowrap;gap:4px}
  /* (44 px, the design system's tap target, though the pad gives up 8 px for it: end-to-end check E2E-13) */
  .phone-foot.compact .qtool,.pt-tools.compact .qtool{min-height:44px}
  .phone-foot.compact .qt-label,.pt-tools.compact .qt-label{display:none}
  .pt-tools{padding:6px var(--gutter) 0;background:var(--surface);border-top:1px solid var(--line)}
  .pt-tools + .pt-foot{padding-top:6px;border-top:0}
  /* The cross-outs: a smaller box, its tap area kept, inside the card */
  .option{gap:6px}
  .cross{width:34px;height:26px} .cross .abc{font-size:9px}
}
@media (pointer:coarse) and (max-width:739px){
  .cross{width:40px;height:44px;margin:-4px -4px -4px -2px}
  .cross::before{inset:9px 3px}
}

/* The skip cues (owner, 20 Oct 2026): a brief note where a skipped question went, and a line when it comes back */
.s-body{position:relative}
.skip-note{position:absolute;z-index:5;top:6px;left:0;right:0;width:fit-content;margin:0 auto;max-width:calc(100% - 2 * var(--gutter));
  background:var(--btn);color:var(--on-btn);font:500 14px/1.3 var(--text);padding:8px 14px;border-radius:var(--r-md);text-align:center}
.skipped-before{margin:0 0 6px;font:500 13px/1.3 var(--display);color:var(--amber)}
.s-short{display:none} .qshort{display:none}

/* Phone: the question screen's header is one bar, about 52 px (owner, 20 Oct 2026: "more space for writing"): close,
   the part or subject in a few words, the clock, the question count, and the clock's progress as a line on its bottom
   edge. No eyebrow; Pause is in the close sheet. The iPad keeps the header above. */
@media (max-width:600px){
  .s-head{position:relative;align-items:center;gap:8px;min-height:52px;padding:calc(4px + env(safe-area-inset-top)) 12px 4px 4px}
  .s-head .s-meta{display:flex;align-items:center;gap:10px;flex:1;min-width:0;order:2}
  .s-head .s-meta .eyebrow,.s-head .s-title{display:none}
  .s-head .s-short{display:block;flex:1;min-width:0;font:550 14.5px/1.2 var(--display);letter-spacing:-.01em;color:var(--ink);overflow-wrap:anywhere;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
  .s-head .s-short .fx{font-size:14.5px}
  .s-head .s-clock{font-size:16px;line-height:1;flex:none} .s-head .s-clock span{font-size:12px;color:var(--ink-soft)}   /* "left", kept: a bare countdown read as a question's timer (owner, 31 Oct 2026) */
  .s-head .s-clock.muted{display:none}
  .s-head .bar{position:absolute;left:0;right:0;bottom:-1px;height:2px;margin:0;max-width:none;border-radius:0;background:transparent}
  .s-head .bar i{min-width:0}
  .s-head .s-side{display:contents}
  .s-head .s-side .quiet.small[data-action=pause]{display:none}
  .s-head .s-side .iconbtn.round{order:1;width:44px;height:44px;flex:none;background:transparent;border:0;box-shadow:none}
  .s-head .qpill{order:3;flex:none;padding:3px 8px;font-size:13.5px;gap:3px;border-color:var(--line)}
  .s-head .qpill .ic,.s-head .qpill > svg{display:none}
  .s-head .qlong{display:none} .s-head .qshort{display:inline}
  /* The height the bar gives back goes to the Working pad, not the question card (it stays the size it was) */
  .working-open .s-card{max-height:calc(36% - 10px)}
  /* The practice test's header: its module name, the clock and its Hide toggle, Mark for review in English */
  .pt-head .pt-clockrow{display:flex;align-items:center;gap:6px;flex:none;order:3}
  .pt-head .pt-clock-toggle{padding:4px 8px;min-height:32px;font-size:13px} .pt-head .pt-clock-word{display:none}
  .pt-head .s-side .soft{order:4;padding:0 8px;min-height:36px}
}

/* "A new version is ready. Tap to refresh." on Home and a Done screen (never over a question) */
.update-note{display:flex;align-items:center;gap:8px;width:100%;margin:0 0 12px;padding:10px 14px;border:1px solid var(--line);border-radius:var(--r-md);
  background:var(--surface);color:var(--ink);font:500 14.5px/1.3 var(--display);text-align:left}
.update-note .ic{color:var(--accent);flex:none}
/* Progress (owner, 23 Oct 2026): To review first, sessions by day */
#to-review h2 .count{display:inline-block;min-width:24px;padding:1px 8px;margin-left:6px;border-radius:999px;background:var(--ink);color:var(--page);font-size:13px;font-weight:600;vertical-align:3px;text-align:center}
#to-review .review-row .tag{display:inline-block;padding:0 7px;border-radius:999px;background:var(--accent-tint);color:var(--ink);font-size:12px;font-weight:600}
#record-log h3.log-day{font-size:14px;font-weight:600;color:var(--ink-soft);margin:18px 0 8px;text-transform:none}
#record-log h3.log-day:first-of-type{margin-top:6px}
#record-tests h3{font-size:15px;margin:18px 0 8px}
.review-work-block{margin:18px 0 6px} .review-work-block h3{margin:0 0 8px} .review-work-block #review-coach .notice{margin-top:10px}
/* Official practice tests (US, owner 23 Oct 2026) */
#official-tests h3{margin:0 0 6px}
#official-tests .official-row .total{font:600 18px var(--display);white-space:nowrap}
#official-tests .official-row small.up{color:var(--accent);font-size:13px} #official-tests .official-row small.down{color:var(--ink-soft);font-size:13px}
#official-next{margin:12px 0}
ol.howto-steps{padding-left:22px;margin:8px 0 18px} ol.howto-steps li{margin:0 0 10px}
a.soft{text-decoration:none;min-height:44px}
#official-form label{display:block;margin:12px 0 6px;font-weight:600}
#official-form select,#official-form input[type=date],#official-form input[type=number]{width:100%;box-sizing:border-box}
#official-form .two-up{display:grid;grid-template-columns:1fr 1fr;gap:12px}
#official-form #of-photo-view img{margin-top:10px;max-height:320px;object-fit:contain}
/* A small Android tablet in portrait (600-739 px; owner, 24 Oct 2026): the pad always open under the question at
   38% of the screen, kept between 280 and 420 px; the question keeps the rest and scrolls if it's long */
@media (min-width:600px) and (max-width:739px){
  .session.quant .working,.session.quant .working.open{flex:0 0 clamp(280px, 38vh, 420px);flex-basis:clamp(280px, 38dvh, 420px);min-height:0}
  .session.quant .working .working-bar{display:none}
  .session.quant .working .pad-tools{display:flex}
  .session.quant .working .padwrap{display:block}
  .session.quant .s-card{flex:1;max-height:none}
}
/* The held beat before a film's quick check, and the From scratch offer after a miss (25 Oct 2026) */
.your-turn{margin:14px 0;font-weight:600;color:var(--accent);text-align:center;letter-spacing:.01em}

/* The climbs (climb.mjs; the test site): eight steps as a meter, the step list on a topic page, a step's clip */
.climb-meter{display:flex;gap:4px;margin:10px 0 4px}
.climb-meter i{flex:1;height:6px;border-radius:3px;background:var(--line)}
.climb-meter i.on{background:var(--accent)}
.climb-meter i.gap{background:var(--coral)}
.climb-meter i.now{background:color-mix(in srgb,var(--accent) 35%,var(--line))}
.climb-poster{display:flex;flex-direction:column;justify-content:center;gap:10px;background:color-mix(in srgb,var(--accent) 7%,var(--surface))}
.climb-poster .climb-meter{width:70%;margin:0 auto}
.climb-steps{list-style:none;padding:0;margin:12px 0 16px;display:grid;gap:6px}
.climb-steps li{display:flex;align-items:center;gap:10px;color:var(--ink-soft)}
.climb-steps li span{display:grid;place-items:center;width:26px;height:26px;border-radius:50%;border:1px solid var(--line-strong);font:600 13px var(--display);color:var(--ink-soft);flex:none}
.climb-steps li.done{color:var(--ink)}
.climb-steps li.done span{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.climb-unit .primary small{display:block;font-weight:500;opacity:.8}
.climb-card h2{margin-bottom:6px}
.climb-clip{display:block;width:100%;aspect-ratio:16/9;background:#000;border-radius:var(--r-md);margin:14px 0}
.climb-actions{gap:8px;flex-wrap:wrap;margin-top:12px}
.climb-poster-wrap{position:relative}
.climb-meter.on-poster{position:absolute;left:10px;right:10px;bottom:8px;margin:0}
.climb-meter.on-poster i{background:color-mix(in srgb,var(--surface) 70%,transparent)}
.climb-meter.on-poster i.on{background:var(--accent)}
.climb-card .climb-meter{margin:8px 0 14px}
/* The skill page (the test site): a skill's climb, its eight steps each a shelf of its clip and its Solved films */
.skill-head{margin:4px 0 8px}
.skill-head h1{margin:2px 0 6px}
.skill-head .climb-meter{max-width:420px}
.skill-actions{display:grid;grid-template-columns:2fr 1fr;gap:8px;margin:14px 0 4px;max-width:520px}
.skill-actions .primary,.skill-actions .outline{flex-direction:column;padding:10px 8px}
.skill-actions small{display:block;font-weight:500;opacity:.8;font-size:13px}
.steps-title{margin:28px 0 4px}
.step-row{margin:18px 0 0;padding-top:16px;border-top:1px solid var(--line)}
.step-head{display:flex;gap:12px;align-items:flex-start;margin-bottom:10px}
.step-head h2{font-size:18px;margin:2px 0 2px}
.step-head p{margin:0;font-size:14.5px}
.step-head .num{display:grid;place-items:center;flex:none;width:30px;height:30px;border-radius:50%;border:1px solid var(--line-strong);font:600 14px var(--display);color:var(--ink-soft)}
.step-row.done .step-head .num{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.step-sheet .climb-clip{margin:10px 0}
.step-sheet .sheet-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
/* The syllabus (the test site): domain rows with their share, the SAT guide page */
.domain-head{display:flex;flex-direction:column;gap:2px;margin-bottom:10px}
.domain-head h2{margin:0}
.domain-head small{color:var(--ink-soft);font-size:13.5px}

.guide-bar{height:8px;border-radius:4px;background:var(--sunk);margin:8px 0 10px;overflow:hidden}
.guide-bar i{display:block;height:100%;background:var(--accent);border-radius:4px}
.film-practise{margin:4px 0 14px}
.film-practise .row{gap:10px}
.film-practise .muted{margin:8px 0 0}
.plain-name{margin:2px 0 8px;font:500 17px var(--sans);color:var(--ink-soft)}
.skill-also{margin-top:32px}
.also-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:12px 0;border-top:1px solid var(--line)}
/* The class hero (design review, 26 Oct 2026): the class's banner beside its words on a wide screen, above them on a
   narrow one, never taller than about half the screen */
.climb-hero .hero-poster{max-height:min(55vh,480px)}
@media (min-width:760px){.climb-hero{display:grid;grid-template-columns:7fr 5fr;gap:20px;align-items:center}
  .climb-hero .hero-copy{padding:6px 10px 6px 0}}
.skill-banner{border-radius:var(--r-lg);overflow:hidden;aspect-ratio:16/9;max-height:min(45vh,420px);margin:4px 0 16px;background:#F6F2EC}
.skill-banner img{display:block;width:100%;height:100%;object-fit:cover}
/* A reading class (climb.mjs ReadingEngine): the passage arrives a sentence at a time, its words lighting as the voice
   reads them; a pause's pick between two summaries, then a good reader's note */
.reading-text{font-size:18px;line-height:1.7;margin:14px 0 6px;color:var(--ink)}
.reading-text .w{color:color-mix(in srgb,var(--ink-soft) 55%,transparent);transition:color .15s}
.reading-text .w.lit,.read-line .w.lit{color:var(--ink)}
.read-line .w{color:color-mix(in srgb,var(--ink-soft) 55%,transparent);transition:color .15s}
.read-stem{font-weight:600;margin:6px 0 2px}
.read-pick{margin:14px 0 0;padding:14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--sunk)}
.read-pick .eyebrow{margin:0 0 2px}
.read-pick p{margin:0 0 10px}
.read-pick .choices{display:grid;gap:8px}
.read-pick .choice{text-align:left;padding:12px 14px;border:1px solid var(--line-strong);border-radius:var(--r-md);background:var(--surface);color:var(--ink);font:inherit;cursor:pointer}
.read-pick .choice.good{border-color:var(--accent);background:var(--accent-tint)}
.read-pick .choice.bad{border-color:var(--coral)}
.read-pick .choice:disabled{cursor:default}
.read-line{margin-top:12px}
.read-card .figure{margin:12px 0}
.reading-steps{margin-top:10px}
.climb-tile.locked .poster img{filter:saturate(.6)}
.review-part{margin:18px 0 6px;font-size:15px;color:var(--ink-soft)}
.class-result p{margin:0 0 6px}
.class-result .keep-hour{margin-top:14px;padding-top:14px;border-top:1px solid var(--line);display:grid;gap:4px;justify-items:start}.class-result .keep-hour button{margin-top:8px}
.label-line{margin:18px 0 8px;font-weight:500}.chips.pronouns,.chips.subjects{margin-bottom:6px}
/* A step's film never pushes "Your turn" below a laptop's window (persona review, 27 Oct 2026) */
.climb-card .climb-clip{max-height:52vh;max-height:52svh;width:auto;max-width:100%;margin:14px auto}

/* A class card's one or two lines on what comes next (owner, 27 Oct 2026: short and to the point) */
.card-notes{list-style:none;margin:16px 0 0;padding:0;color:var(--ink-soft);font-size:15px}
.card-notes li{margin:0 0 6px}

/* The course's order and progress (Fable's design, 27 Oct 2026; owner, 28 Oct 2026: no "After …" anywhere, the order
   is the list) */
.state-chip{position:absolute;top:8px;right:8px;z-index:2;display:inline-flex;align-items:center;gap:4px;font:550 12px var(--display);padding:3px 9px;border-radius:var(--r-pill);background:var(--surface);color:var(--ink);box-shadow:inset 0 0 0 1px var(--line-strong);font-variant-numeric:tabular-nums}
.state-chip.now{background:var(--btn);color:var(--on-btn);box-shadow:none}
.state-chip.done{background:var(--accent);color:var(--on-accent);box-shadow:none}
.lock-corner{position:absolute;top:8px;right:8px;z-index:2;display:grid;place-items:center;width:28px;height:28px;border-radius:var(--r-pill);background:var(--surface);color:var(--ink);box-shadow:inset 0 0 0 1px var(--line-strong)}
.course-cols{display:grid;gap:28px}
@media (min-width:900px){.course-cols{grid-template-columns:1fr 1fr}}
.course-head{display:flex;justify-content:space-between;align-items:baseline}
.course-head small{color:var(--ink-soft)}
.domain-bars{display:grid;gap:8px;margin:10px 0 16px}
.dbar{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"name count" "bar bar";gap:4px 10px;align-items:center;font-size:14px}
.dbar-name{grid-area:name;min-width:0}
.dbar .guide-bar{grid-area:bar;margin:0}
.dbar-count{grid-area:count}
@media (min-width:600px){.dbar{grid-template-columns:minmax(0,1.4fr) 1fr auto;grid-template-areas:"name bar count"}}
.dbar-name small,.dbar-count{color:var(--ink-soft)}
.course-row .grow{min-width:0}
.course-row.now{border-color:var(--accent)}
.course-row.now strong{color:var(--accent)}
.course-row.done .num{background:var(--accent);color:var(--on-accent);box-shadow:none}
.course-state{display:inline-flex;align-items:center;gap:4px;flex:none;color:var(--ink-soft);margin-left:8px;white-space:nowrap}

/* A class's begin card: the hour's plan under its button (owner, 28 Oct 2026) */
.begin-plan{margin-top:22px;padding-top:18px;border-top:1px solid var(--line)}
.begin-steps{list-style:none;margin:0;padding:0;display:grid;gap:2px}
.begin-steps li{display:flex;align-items:center;gap:12px;padding:8px 0;min-height:40px}
.begin-steps .n{flex:0 0 28px;height:28px;border-radius:50%;display:grid;place-items:center;font-size:13px;font-weight:600;background:var(--sunk);color:var(--ink);font-variant-numeric:tabular-nums}
.begin-steps li.done .n{background:var(--accent);color:var(--on-accent)}
.begin-steps strong,.begin-agenda strong{display:block;font-weight:500;line-height:1.3}
.begin-steps small,.begin-agenda small{display:block;color:var(--ink-soft);font-size:13px;line-height:1.35}

.begin-agenda{list-style:none;margin:0 0 10px;padding:0;display:grid;gap:10px}
.begin-agenda li{padding-left:12px;border-left:2px solid var(--line)}
@media (max-width:640px){.climb-card .climb-actions{flex-direction:column;align-items:stretch}.climb-card .climb-actions>button{width:100%;min-height:52px;font-size:17px}}
.onboard .ob-sub{margin:28px 0 4px;font-size:20px}

/* One class card (design review, 28 Oct 2026): a 600 px column at every width; on a phone the content from the top and
   the actions in a bar pinned to the bottom, within the thumb's reach; wider, the card centred, buttons the column's
   width. Each card's own content sits in its panel. */
.s-card.climb-card.card2{padding:0;display:flex;flex-direction:column}
.card2 .card-col{width:100%;max-width:600px;margin:0 auto;padding:18px 20px 0;display:flex;flex-direction:column;min-height:100%;box-sizing:border-box}
.card2 .card-top .climb-meter{margin:8px 0 6px}
.card2 .card-caption{margin:0 0 14px;font-size:13px;color:var(--ink-soft);font-variant-numeric:tabular-nums}
.card2 .card-top .eyebrow + h2{margin-top:10px}
.card2 h2{font-size:26px;line-height:1.2;margin:0 0 8px;letter-spacing:-.01em}
.card2 .card-line{margin:0;font-size:17px;line-height:1.5;color:var(--ink-soft)}
.card2 .card-panel{margin-top:20px;display:grid;gap:10px}
.card2 .p-item{padding:14px 16px;background:var(--sunk);border-radius:12px}
.card2 .p-label{margin:0 0 4px;font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-soft)}
.card2 .p-item p{margin:0;font-size:16px;line-height:1.5;color:var(--ink)}
.card2 .p-item.tone-coral .p-label{color:var(--coral)}
.card2 .p-item.tone-answer{background:none;border:1px solid var(--line-strong)}
.card2 .p-item.tone-answer p{font-weight:500}
.card2 .p-rows{list-style:none;margin:2px 0 0;padding:0;display:grid;gap:10px}
.card2 .p-rows li{display:flex;gap:12px;align-items:flex-start}
.card2 .p-rows strong{display:block;font-weight:500;font-size:16px;line-height:1.35}
.card2 .p-rows small{display:block;color:var(--ink-soft);font-size:14px;line-height:1.4;margin-top:2px}
.card2 .chip-n{flex:none;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;font-size:13px;font-weight:600;border:1.5px solid var(--coral);color:var(--coral)}
.card2 .p-rows .dot{flex:none;width:6px;height:6px;border-radius:50%;background:var(--accent);margin:8px 10px 0}
.card2 .p-film{display:flex;gap:12px;align-items:center;width:100%;min-height:64px;padding:8px;border:1px solid var(--line-strong);border-radius:12px;background:var(--surface);text-align:left;font:inherit;color:inherit;cursor:pointer}
.card2 .p-film img{width:96px;height:54px;object-fit:cover;border-radius:6px;flex:none;background:var(--sunk)}
.card2 .p-film strong{display:block;font-weight:500;font-size:15px;line-height:1.3}
.card2 .p-film small{display:flex;gap:4px;align-items:center;color:var(--ink-soft);font-size:13px;margin-top:2px}
.card2 .p-circles{display:flex;gap:10px;padding:4px 0}
.card2 .p-circles i{width:28px;height:28px;border-radius:50%;border:1.5px solid var(--line-strong)}
.card2 .hour-rail{background:none;border:1px solid var(--line);padding:14px 16px}
.card2 .rail-bar{display:flex;gap:4px;margin:6px 0 10px}
.card2 .rail-bar i{height:6px;border-radius:3px;background:var(--line)}
.card2 .rail-bar i.done{background:var(--accent)}
.card2 .rail-bar i.now{background:color-mix(in srgb,var(--accent) 35%,var(--line));box-shadow:inset 0 0 0 1.5px var(--accent)}
.card2 .rail-list{list-style:none;margin:0;padding:0;display:grid;gap:6px}
.card2 .rail-list li{display:grid;grid-template-columns:20px 1fr auto;gap:8px;align-items:center;font-size:15px;color:var(--ink-soft)}
.card2 .rail-list li.now{color:var(--ink);font-weight:600}
.card2 .rail-list li.done .mark{color:var(--accent)}
.card2 .rail-list li.now .mark::before{content:"";display:block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-left:4px}
.card2 .rail-list small{font-size:13px;font-variant-numeric:tabular-nums}
.card2 .card-tiles{display:grid;gap:10px;margin-top:20px}
.card2 .tile-choice{display:flex;flex-direction:column;align-items:flex-start;gap:4px;width:100%;min-height:72px;padding:14px 16px;border:1.5px solid var(--line-strong);border-radius:12px;background:var(--surface);text-align:left;color:var(--ink)}
.card2 .tile-choice:first-child{border-color:var(--ink)}
.card2 .tile-choice strong{font-size:17px;font-weight:600}
.card2 .tile-choice small{font-size:14px;color:var(--ink-soft);font-weight:400;line-height:1.4}
.card2 .card-actions{display:flex;flex-direction:column;gap:8px;margin-top:24px;padding-bottom:24px}
.card2 .card-actions>button{width:100%;min-height:56px;font-size:17px;font-weight:600;border-radius:12px;justify-content:center}
.card2 .climb-clip{margin:16px 0 0;width:100%;max-height:52svh;border-radius:12px}
.card2 .begin-plan{margin-top:20px;padding-top:0;border-top:0}
.card2 .begin-steps li{min-height:34px;padding:4px 0}
.card2 .begin-steps strong{font-size:15px}
.card2 .begin-agenda{margin-top:14px}
.card2 .reading-text{margin-top:16px}
.climb-meter i.fixed{background:var(--accent);box-shadow:inset 0 -2px 0 var(--coral)}
.climb-meter i.fast{background:transparent;box-shadow:inset 0 0 0 1.5px var(--accent)}
@media (max-width:639px){
  .card2 .card-actions{position:sticky;bottom:0;margin:auto -20px 0;padding:12px 20px calc(12px + env(safe-area-inset-bottom));background:var(--surface);border-top:1px solid var(--line);z-index:2}
  .card2 .card-panel,.card2 .begin-plan,.card2 .card-tiles{margin-bottom:20px}
  .card2 .climb-clip{margin:16px -20px 0;width:calc(100% + 40px);max-width:none;border-radius:0}
}
@media (min-width:640px){
  .s-card.climb-card.card2{display:grid;align-content:safe center;padding:4vh 0}
  .card2 .card-col{min-height:0}
}
button.two-line{flex-direction:column;align-items:flex-start;gap:2px;min-height:64px;padding:10px 18px;text-align:left;width:100%;max-width:480px}
button.two-line strong{font-size:17px;font-weight:600}button.two-line small{font-size:14px;font-weight:400;opacity:.85;white-space:normal}
/* The reading class's passages (design review, 28 Oct 2026): reading width and size, the question kept in a quiet box */
.card2 .reading-text{font-size:19px;line-height:1.65;max-width:62ch}
.card2 .read-q{margin-top:16px;padding:12px 14px;border:1px solid var(--line);border-radius:12px}
.card2 .read-q .stem{margin:0;font-size:16px;font-weight:500;line-height:1.45}
.card2 .read-q + .card-line{margin-top:10px;font-size:15px}
.card2 .read-pick .choice{display:flex;gap:10px;align-items:flex-start;min-height:56px;font-size:17px;line-height:1.4}
.card2 .read-pick .choice.other{opacity:.75}
.card2 .read-pick .choice .mk{flex:none;width:20px;font-weight:700;color:var(--coral)}
.card2 .read-pick .choice.good .mk{color:var(--accent)}
.card2 .read-pick .read-line{margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
.card2 .read-pick .read-line p{margin:0;font-size:16px;line-height:1.5}
.card2 .card-actions.waiting{min-height:0;padding:0;border:0}

/* Hover colours only where there's a pointer that hovers: a phone keeps :hover after a tap, so the next screen's
   button, under the same finger, showed grey (design review captures, 28 Oct 2026) */
@media (hover:hover){.primary:hover{background:var(--btn-hover)}.soft:hover{background:var(--sunk)}.outline:hover{background:var(--sunk)}.iconbtn:hover{color:var(--ink);background:var(--sunk)}.hero-btn:hover{background:var(--btn-hover)}.result:hover{background:var(--sunk)}.skipbtn:hover{color:var(--ink);background:var(--sunk)}.option-card:hover{background:var(--sunk)}}
/* Home and Progress clean-ups (design review, 28 Oct 2026): one column under the hero, no half-empty side column;
   the free account's one plain line; small cards in place of loose lines; Progress's summary, review folds and tests */
@media (min-width:0px){.home-top.single{grid-template-columns:1fr}}
.home-top.single .home-side{display:grid;gap:12px}
.home-top.single .home-side:empty{display:none}
@media (min-width:900px){.home-top.single .home-side{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));align-items:start}}

.done-today{display:flex;align-items:center;gap:6px;margin:0 0 6px;font-size:14px;color:var(--accent);font-weight:500}
.next-up{display:flex;align-items:center;gap:12px;margin:14px 0 6px;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r-md)}
.next-up small{display:block;font-size:12px;text-transform:uppercase;letter-spacing:.04em}
.next-up strong{display:block;font-weight:500;line-height:1.3}
.next-up .primary{flex:none;min-height:44px}
.review-group{border-top:1px solid var(--line)}
.review-group summary{display:flex;align-items:center;gap:10px;padding:12px 0;cursor:pointer;list-style:none}
.review-group summary::-webkit-details-marker{display:none}
.review-group summary strong{display:block;font-weight:500}
.review-group summary small{display:block;font-size:13px}
.review-group summary .count{font-size:13px;color:var(--ink-soft);white-space:nowrap}
.review-group[open] summary .ic{transform:rotate(180deg)}
.review-row .status.quiet{color:var(--ink-soft)}

/* Home's classes as a list on a phone (the trial: ?homelist=1) */
.domain.list .domain-head{margin-bottom:6px}
.class-rows{display:grid}
.class-row{display:flex;align-items:center;gap:12px;width:100%;padding:10px 0;border:0;border-top:1px solid var(--line);background:none;text-align:left;font:inherit;color:var(--ink);cursor:pointer}
.class-row img,.class-row .poster-blank{width:72px;height:40px;flex:none;border-radius:6px;object-fit:cover;background:var(--sunk)}
.class-row strong{display:block;font-weight:500;font-size:15px;line-height:1.3}
.class-row small{display:block;font-size:13px;color:var(--ink-soft);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.class-row .grow{min-width:0}
.class-row .row-chip{display:inline-block;margin-top:4px;font-size:12px;font-weight:600;color:var(--accent)}
.class-row .row-chip.done{color:var(--ink-soft)}
.class-row.locked img{opacity:.7}
.class-more summary{display:flex;align-items:center;justify-content:space-between;padding:10px 0;font-size:14px;font-weight:500;color:var(--ink);cursor:pointer;border-top:1px solid var(--line);list-style:none}
.class-more summary::-webkit-details-marker{display:none}
.class-more summary::after{content:"";width:8px;height:8px;border-right:1.6px solid currentColor;border-bottom:1.6px solid currentColor;transform:rotate(45deg);margin-right:6px}
.class-more[open] summary::after{transform:rotate(-135deg)}
@media (max-width:639px){.shelf.domain.list{margin-top:18px}}
.welcome .wrow:last-child{border-bottom:0;padding-bottom:0;margin-bottom:0}
/* Home under the hero (design review, second pass): one box of rows; the warm-up a quiet line under Start; the hero's
   picture not taller than the screen allows; Progress's score line */
.home-rows{display:grid;margin:12px 0 0;border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;background:var(--surface)}
.home-row{display:flex;align-items:center;gap:12px;width:100%;min-height:60px;padding:12px 16px;border:0;border-top:1px solid var(--line);background:none;text-align:left;font:inherit;color:var(--ink);cursor:pointer}
.home-row:first-child{border-top:0}
.home-row strong{display:block;font-weight:600;font-size:15.5px;line-height:1.3}
.home-row small{display:block;color:var(--ink-soft);font-size:13.5px;margin-top:2px}
.home-row .grow{min-width:0}
.home-row .row-cta{flex:none;font-weight:600;font-size:14px;text-decoration:underline;text-underline-offset:3px}
@media (hover:hover){.home-row:hover{background:var(--sunk)}}
.hero-warm{margin:10px 0 0;font-size:14px;color:var(--ink-soft)}
.hero-warm .link-inline{display:inline-flex;align-items:center;gap:2px}
.climb-hero h1 + p{white-space:normal}
@media (min-width:900px){.climb-hero .hero-poster{max-height:min(42vh,400px)}}

.score-line{margin:0 0 8px;font-size:15px}.score-line strong{font-size:28px;letter-spacing:-.02em;margin-right:6px}
.wrow-links{display:flex;gap:12px;flex:none}
.nowrap{white-space:nowrap}
/* Films as phone lists (design review, third pass, 28 Oct 2026): a row per film (kind, title, length), a collection's
   first poster full width, a step's film full width with its length on it */
.film-lines{display:grid}
.film-line{display:flex;align-items:center;gap:12px;width:100%;min-height:52px;padding:10px 0;border:0;border-top:1px solid var(--line);background:none;text-align:left;font:inherit;color:var(--ink);cursor:pointer}
.film-line img{width:72px;height:40px;flex:none;border-radius:6px;object-fit:cover;background:var(--sunk)}
.film-line .grow{min-width:0}
.film-line strong{display:block;font-weight:500;font-size:15px;line-height:1.3}
.film-line small{display:block;font-size:13px;color:var(--ink-soft);margin-top:2px}
.film-line.locked strong{color:var(--ink-soft)}
.film-line .ic{flex:none;color:var(--ink-soft)}
.film-featured{margin:8px 0 4px}
.film-featured .tile{width:100%}
.shelf.phone-list .film-lines{margin-top:4px}
.step-row.phone .step-clip-full{position:relative;display:block;width:100%;padding:0;margin:10px 0 2px;border:0;border-radius:var(--r-md);overflow:hidden;background:var(--sunk);aspect-ratio:16/9;cursor:pointer;box-shadow:inset 0 0 0 1px var(--line)}
.step-row.phone .step-clip-full img{display:block;width:100%;height:100%;object-fit:cover}
.step-row.phone .step-clip-full .badge{position:absolute;left:8px;bottom:8px;display:inline-flex;align-items:center;gap:4px;padding:3px 8px;border-radius:6px;background:color-mix(in srgb,var(--ink) 82%,transparent);color:#fff;font-size:12px;font-weight:600}
.step-row.phone .film-lines{margin-top:6px}
/* Practice tests (owner, 29 Oct 2026; the designer's layout): ours, "In FocusHour", numbered with a status chip each;
   College Board's Bluebook in a sky-tinted panel with its own label, so the two never read as one. Side by side wide. */
.pt-kinds-intro{margin:-4px 0 12px}
.pt-kinds{display:grid;gap:12px}
@media (min-width:900px){.pt-kinds{grid-template-columns:3fr 2fr;align-items:start}}
.pt-kinds>.card{margin:0}
.pt-block .eyebrow{margin-bottom:4px}
.pt-block>p.muted{margin:0 0 6px}
.pt-row{display:flex;align-items:center;gap:12px;width:100%;padding:14px 0;border:0;border-top:1px solid var(--line);background:none;color:var(--ink);text-align:left;font:inherit}
button.pt-row{cursor:pointer;min-height:52px}
.pt-row small{display:block;color:var(--ink-soft);font-size:14px;margin-top:2px}
.pt-row-head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}
.pt-row-head strong{font-weight:600}
.pt-row.later strong{color:var(--ink-soft);font-weight:500}
.pt-row .primary{flex:none}
.pt-chip{display:inline-flex;align-items:center;gap:4px;font:500 12.5px var(--display);border-radius:var(--r-sm);padding:2px 8px;color:var(--ink-soft);box-shadow:inset 0 0 0 1px var(--edge);white-space:nowrap}
.pt-chip.done{background:var(--accent-tint);color:var(--accent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 35%,transparent)}
.pt-chip.paused{color:var(--amber);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--amber) 45%,transparent)}
.pt-chip.paused::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--amber)}
.card.bluebook{background:var(--sky-tint);box-shadow:inset 3px 0 0 var(--sky);border-color:color-mix(in srgb,var(--sky) 25%,var(--line))}
.bb-chip{display:inline-block;font:500 12.5px var(--display);color:var(--sky);background:var(--surface);border-radius:var(--r-sm);padding:3px 8px;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--sky) 40%,transparent);text-decoration:none;margin-bottom:8px}
.card.bluebook>p.muted{margin:0 0 6px}
.card.bluebook .official-row{background:none}
#record-tests{scroll-margin-top:76px}
/* The SAT practice test (ptest.mjs) and the Desmos calculator panel (desmos.mjs). Uses app.css's tokens and its
   question screen (.session, .s-head, .s-card, .options); only what the sitting adds is here. */

/* Offer under Your tests */
.pt-offer{margin:0 0 8px}
.pt-offer .link.small{font-size:15px;font-weight:500;padding:2px 0 10px}
.pt-shape{margin:4px 0 14px;padding-left:20px} .pt-shape li{margin:4px 0}

/* Intro, break */
.pt-center .row.center{justify-content:center}
.pt-center .clock.big{font:500 56px/1 var(--display);letter-spacing:-.04em;font-variant-numeric:tabular-nums;margin:12px 0 18px}

/* Header */
.pt-head .s-clock.low b{color:var(--coral)}
.pt-clockrow{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.pt-clock-toggle{padding:2px 0;font-size:14px}
.pt-head .s-side{flex-direction:row;align-items:center;flex-wrap:wrap;justify-content:flex-end;gap:8px}
.pt-flag.on{background:var(--sunk);color:var(--ink)} .pt-flag.on .ic{color:var(--amber)}
.pt-flag,.pt-calc{white-space:nowrap}
.pt-calc[aria-pressed="true"]{background:var(--sunk);color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink)}
@media (max-width:480px){.pt-head .s-side .soft span{display:none}}

/* The question's number and mark */
.pt-qnum{display:flex;align-items:center;gap:10px;margin:-4px 0 10px}
.pt-num{min-width:30px;height:30px;padding:0 8px;border-radius:var(--r-sm);background:var(--btn);color:var(--on-btn);display:grid;place-items:center;font:600 14px var(--display);font-variant-numeric:tabular-nums}
.pt-flagged{display:inline-flex;align-items:center;gap:6px;font:500 13.5px var(--display);color:var(--amber)}

/* Typed answer */
.pt-spr{max-width:320px} .pt-spr input{font:500 22px var(--display);font-variant-numeric:tabular-nums;letter-spacing:.04em}

/* Footer: Back · Question n of N · Next */
.pt-foot{display:flex !important;align-items:center;gap:10px;flex-wrap:nowrap}
.pt-foot .pt-nav{min-height:48px;white-space:nowrap}
.pt-foot .primary.pt-nav{margin-left:auto}
.pt-foot .pt-grid{margin:0 auto;font-size:15px;white-space:nowrap;font-variant-numeric:tabular-nums}
@media (max-width:420px){.pt-foot .soft.pt-nav span{display:none} .pt-foot .pt-nav{padding-left:16px;padding-right:16px} .pt-foot .pt-grid{padding:8px 10px;font-size:15px}}

/* The navigator (a sheet, and the check-your-work page) */
.pt-gridkey{display:flex;flex-wrap:wrap;gap:14px;margin:6px 0 12px}
.pt-gridkey span{display:inline-flex;align-items:center;gap:6px}
.k{display:inline-block;width:14px;height:14px;border-radius:3px;border:1px dashed var(--ink-soft)}
.k.answered{border:0;background:var(--btn)}
.pt-cells{display:grid;grid-template-columns:repeat(auto-fill,minmax(48px,1fr));gap:8px;margin:0 0 14px}
.pt-cell{position:relative;height:44px;border-radius:var(--r-md);border:1px dashed var(--ink-soft);background:var(--surface);font:500 15px var(--display);font-variant-numeric:tabular-nums;color:var(--ink)}
.pt-cell.answered{border:1px solid var(--btn);background:var(--btn);color:var(--on-btn)}
.pt-cell.current{box-shadow:0 0 0 2px var(--surface),0 0 0 4px var(--accent)}
.pt-cellflag{position:absolute;top:-6px;right:-6px;width:18px;height:18px;border-radius:50%;background:var(--surface);color:var(--amber);box-shadow:inset 0 0 0 1px var(--amber);display:grid;place-items:center}
.pt-check .s-card{max-width:760px;margin:0 auto;width:100%}

/* Results */
.pt-results .stats .card small{display:block}
.pt-table{width:100%;border-collapse:collapse} .pt-table td{padding:8px 4px;border-bottom:1px solid var(--line)} .pt-table td:nth-child(2){font-weight:600;white-space:nowrap;font-variant-numeric:tabular-nums}
.pt-bar{display:flex;align-items:center;gap:10px;margin:8px 0}
.pt-bar strong{white-space:nowrap;min-width:64px;text-align:right}
.pt-meter{flex:0 0 30%;height:4px;border-radius:1px;background:var(--line);overflow:hidden}
.pt-meter i{display:block;height:100%;background:var(--accent)}

/* Desmos: a side panel on iPad widths, a bottom sheet on a phone (the question's top stays in view above it; owner, 10 Nov
   2026: usable on a phone, keypad up when it opens). Outside #app, so the question and pad stay put. */
#desmos-panel{position:fixed;z-index:40;top:0;right:0;bottom:0;width:min(46vw,560px);background:var(--surface);border-left:1px solid var(--line-strong);display:flex;flex-direction:column;padding-top:env(safe-area-inset-top)}
#desmos-panel[hidden]{display:none}
#desmos-panel.sheet-mode{top:auto;width:100%;height:min(50dvh,400px);min-height:360px;border-left:0;border-top:1px solid var(--line-strong);border-radius:16px 16px 0 0;padding-top:0;overflow:hidden;box-shadow:0 -10px 30px rgba(0,0,0,.28)}
#desmos-panel.sheet-mode .cx-graph{min-height:90px}
#desmos-panel.sheet-mode .desmos-head{padding:4px 4px 4px 16px;min-height:44px}
#desmos-panel.sheet-mode [data-desmos=close]{min-height:40px;padding:0 14px;font-weight:600;color:var(--ink)}
.desmos-head{display:flex;align-items:center;gap:8px;padding:8px 8px 8px 16px;border-bottom:1px solid var(--line)}
.desmos-head strong{font:600 16px var(--display);letter-spacing:-.015em}
.desmos-body{position:relative;flex:1;min-height:0}
.desmos-body .muted{padding:16px}

@media (min-width:740px){
  body.calc-open:not(.calc-sheet) #app > .session{margin-right:min(46vw,560px)}
  /* Beside the calculator the question has a phone's width: the question over its pad, icon-only header buttons */
  body.calc-open:not(.calc-sheet) .session .s-body{flex-direction:column}
  body.calc-open:not(.calc-sheet) .session .s-card{flex:1 1 0;min-height:0}
  body.calc-open:not(.calc-sheet) .session .working{flex:1 1 0;min-height:180px}
  body.calc-open:not(.calc-sheet) .session .s-side .soft span,body.calc-open:not(.calc-sheet) .session .pt-foot .soft.pt-nav span{display:none}
  body.calc-open:not(.calc-sheet) .session .s-side .soft{padding:10px 12px}
  body.calc-open:not(.calc-sheet) .session .s-clock{font-size:26px}
  body.calc-open:not(.calc-sheet) .verbal .s-card.has-passage{display:block}
  body.calc-open:not(.calc-sheet) .pt-foot .pt-grid{font-size:15px;padding:8px 10px}
  /* ...and its footer stacks as on a phone: the help buttons a row of their own, then Skip and Lock in (E2E-03, 21 Oct
     2026: in one row at an iPad's width "Ask coach" and "Skip" were drawn over each other) */
  body.calc-open:not(.calc-sheet) .session .s-foot:not(.compact) .helps{flex:1 0 100%;display:flex;gap:8px}
  body.calc-open:not(.calc-sheet) .session .s-foot:not(.compact) .helps .help{flex:1 1 0;min-width:0}
  body.calc-open:not(.calc-sheet) .session .s-foot:not(.compact) .row:last-child{flex:1 0 100%;display:flex;gap:8px}
  body.calc-open:not(.calc-sheet) .session .s-foot:not(.compact) .row:last-child .lockin{flex:1}
}
@media (min-width:740px) and (max-width:1100px){#desmos-panel:not(.sheet-mode){width:44vw} body.calc-open:not(.calc-sheet) #app > .session{margin-right:44vw}}
/* Typed-answer maths (sprview.mjs): the answer box, College Board's preview line and the phone's keypad. Calm, the
   same card language as a choice: a thin line, the ink border when it holds an answer, green or coral once marked. */
.spr{display:grid;gap:8px;max-width:420px}
.spr-label{font:500 14px var(--display);color:var(--ink-soft)}
.spr-box{display:flex;align-items:center;background:var(--surface);border:1px solid var(--edge);border-radius:var(--r-md);padding:4px 6px;min-height:54px}
.spr-box:focus-within{border-color:var(--ink);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 22%,transparent)}
.spr-input{flex:1;min-width:0;border:0;background:transparent;color:var(--ink);font:500 24px var(--display);letter-spacing:.02em;padding:8px 10px;outline:none;font-variant-numeric:tabular-nums}
.spr-input:disabled{opacity:1;-webkit-text-fill-color:var(--ink)}
.spr-input[readonly]{caret-color:transparent;cursor:default}
.spr-box.correct{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent);background:var(--accent-tint)}
.spr-box.wrong{border-color:var(--coral);box-shadow:inset 0 0 0 1px var(--coral);background:var(--coral-tint)}
.spr-box.static{min-height:48px}
.spr-preview{margin:0;font-size:15.5px;color:var(--ink-soft);min-height:1.6em}
.spr-preview .spr-tex{color:var(--ink);font-size:20px;margin-left:4px}
.spr-note{margin:0;min-height:1.3em}
.spr-keys{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:2px}
.spr-key{min-height:46px;border-radius:var(--r-md);border:1px solid var(--edge);background:var(--surface);color:var(--ink);font:500 20px var(--display);font-variant-numeric:tabular-nums;touch-action:manipulation}
.spr-key:active{background:var(--sunk)}
.spr-key.del{color:var(--ink-soft)}
.spr-key.zero{grid-column:span 3}
.spr-key:disabled{opacity:.45}
.spr-review{display:grid;gap:10px;margin:8px 0}
.spr-review .spr-input{display:block}
.math-wait{visibility:hidden}
.spr-note.refused{color:var(--coral);font-weight:550}
.pt-head .pt-tool{order:5;flex:none;width:40px;height:40px;min-height:40px} .pt-head .pt-tool.on{background:var(--sunk);box-shadow:inset 0 0 0 1.5px var(--ink)}
.read-q + .p-label.read-then{margin-top:22px}
/* A class step's clip (31 Oct 2026): its captions strip right under the picture, as a film's, then Captions on/off */
.climb-clip.capped{margin-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}
.clip-caption{width:100%;box-sizing:border-box;max-width:none;border-radius:0 0 12px 12px}
.clip-tools{display:flex;flex-wrap:wrap;align-items:flex-start;gap:4px 14px;margin:10px 0 0}
@media (max-width:639px){.card2 .clip-caption{margin:0 -20px;width:calc(100% + 40px);border-radius:0}}
/* A press shows at once, in colour (owner, 3 Nov 2026). Green on the ink buttons, a green tint on the rest; a question's
   choices stay out of it: green there would read as "right". */
button,a.btnlink,a.btn{transition:none}
.primary:active,.primary.pressed,.hero-btn:not(.soft):active,.hero-btn:not(.soft).pressed,.btnlink.primary:active{background:var(--accent);color:var(--on-accent);opacity:1}
.soft:active,.soft.pressed,.outline:active,.outline.pressed,.hero-btn.soft:active,.hero-btn.soft.pressed,.quiet:active,.quiet.pressed,.iconbtn:active,.iconbtn.pressed,.avatar:active,.avatar.pressed,.danger:active,.danger.pressed,.review-row:active,.review-row.pressed,.unit-row:active,.unit-row.pressed,.home-row:active,.home-row.pressed,.class-row:active,.class-row.pressed,.pt-row:active,.pt-row.pressed,.result:active,.result.pressed{background:var(--accent-tint);color:var(--ink)}
.tile:active .poster,.tile.pressed .poster{outline:3px solid var(--accent);outline-offset:-3px}
.class-wait{align-items:center;gap:14px;padding:calc(20px + env(safe-area-inset-top)) var(--gutter) 24px;overflow:hidden;text-align:center}
.class-wait h1{font:600 22px/1.25 var(--display);letter-spacing:-.02em;margin:0}
.class-wait img{display:block;width:100%;max-width:640px;height:auto;border-radius:var(--r-md)}
.class-wait p{animation:wait-in .2s .4s both}
@keyframes wait-in{from{opacity:0}to{opacity:1}}
/* The avatar is drawn at 36 px and taps at 44 */
@media (pointer:coarse){.avatar{position:relative}.avatar::after{content:"";position:absolute;inset:-4px}}
.hero-poster{background:#F5F2EB}   /* (the pictures' own paper colour, not grey, until one arrives) */
.first-act{color:var(--ink);margin-top:6px}
/* Find your gap's result */
#gap-title{font:600 28px/1.15 var(--display);letter-spacing:-.025em;margin:0 0 8px}.gap-line{font-size:18px;margin:0 0 14px}#gap-card .climb-meter{margin:0 0 16px}#gap-card .primary{margin-top:12px}#gap-signin{display:block;margin:8px auto 0}
.notice.soft-miss{border-left:3px solid var(--line-strong)}
.gap-tip{border-left:3px solid var(--line);padding:0 0 0 14px;margin:0 0 16px}.gap-tip p{margin:0 0 8px}.gap-tip p:first-child{font-style:italic}.gap-rows{list-style:none;padding:0;margin:0 0 14px}.gap-rows li{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--line)}.gap-rows span{flex:1;font-weight:500}.gap-rows small{color:var(--ink-soft)}.gap-rows .ic{color:var(--accent)}.gap-rows i{width:16px;height:2px;background:var(--line-strong);flex:none}#gap-free{margin-top:8px}#gap-free-line{margin-top:12px;text-align:center}
#gap-price{margin-top:14px;text-align:center}
#gap-bar{position:fixed;z-index:30;top:calc(10px + env(safe-area-inset-top));right:12px}#gap-bar button{min-height:32px;height:32px;margin:0;padding:0 12px;font-size:14px;width:auto}.gap-run .s-head{padding-right:88px}.gap-run .climb-card h1,.gap-run .climb-card .eyebrow{margin-right:0}.gap-run .gap-result .s-body{padding-top:52px}
