/* FocusHour in the browser: the iPad and iPhone app's look (apps/ios/MindGym/Views/Theme.swift). Warm paper, deep
   emerald, saffron; rounded type for the gym voice, serif for reading. Phone first (375-430 px); wider screens get the
   iPad's measure: content up to 1400 px, poster rows, question beside its working. Light and dark. */
@font-face{font-family:"Plus Jakarta Sans";src:url(/fonts/PlusJakartaSans.woff2) format("woff2");font-weight:200 800;font-display:swap}
@font-face{font-family:"EB Garamond";src:url(/fonts/EBGaramond.woff2) format("woff2");font-weight:400 800;font-display:swap}

:root{
  color-scheme:light dark;
  --paper:#F7F3EC; --surface:#FFFFFF; --sunk:#F1ECE2; --ink:#17211C; --ink-soft:#5E6B64; --line:#E4DDD0;
  --emerald:#0E7C5A; --emerald-deep:#0A3B2C; --emerald-mid:#0F6B4E; --saffron:#E89B17; --coral:#D9573F; --indigo:#3D4DB7; --sky:#2F7FB8;
  --primary-top:#13926A; --primary-bottom:#0B6A4C; --on-primary:#FFFFFF;
  --pad:#FFFFFF; --grid:#E6EEF0; --head:#E2EAE3; --shadow:0 8px 18px rgba(23,33,28,.06);
  --display:ui-rounded,"SF Pro Rounded","Plus Jakarta Sans",system-ui,-apple-system,"Segoe UI",sans-serif;
  --text:-apple-system,BlinkMacSystemFont,"Plus Jakarta Sans",system-ui,"Segoe UI",sans-serif;
  --serif:"New York",ui-serif,"EB Garamond",Georgia,"Times New Roman",serif;
  --r:20px; --gutter:16px;
}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){
  --paper:#0E1311; --surface:#18201C; --sunk:#121916; --ink:#EDF2EE; --ink-soft:#9DADA4; --line:#2A3530;
  --emerald:#3CC592; --emerald-deep:#0A2E23; --emerald-mid:#0F5A42; --saffron:#F5B53D; --coral:#F07A62; --indigo:#8D98F0; --sky:#6DB3E8;
  --primary-top:#3CC592; --primary-bottom:#22A276; --on-primary:#06231A;
  --pad:#141B18; --grid:#1F2925; --head:#14201B; --shadow:0 8px 18px rgba(0,0,0,.35);
}}
:root[data-theme="dark"]{
  --paper:#0E1311; --surface:#18201C; --sunk:#121916; --ink:#EDF2EE; --ink-soft:#9DADA4; --line:#2A3530;
  --emerald:#3CC592; --emerald-deep:#0A2E23; --emerald-mid:#0F5A42; --saffron:#F5B53D; --coral:#F07A62; --indigo:#8D98F0; --sky:#6DB3E8;
  --primary-top:#3CC592; --primary-bottom:#22A276; --on-primary:#06231A; --pad:#141B18; --grid:#1F2925; --head:#14201B;
}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{margin:0;background:var(--paper);color:var(--ink);font:16px/1.45 var(--text);
  background-image:radial-gradient(color-mix(in srgb,var(--ink) 6%,transparent) 0.7px,transparent 0.8px);background-size:22px 22px}
/* 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 .4em;letter-spacing:-.01em;text-wrap:balance}
h1{font-size:clamp(28px,6vw,40px);font-weight:800}
h2{font-size:clamp(21px,4.6vw,26px);font-weight:750}
h3{font-size:18px;font-weight:700}
p{margin:0 0 .8em}
a{color:var(--emerald)}
img{max-width:100%}
button{font:inherit;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}
button:disabled{cursor:default;opacity:.45}
input,select,textarea{font:inherit;color:var(--ink);background:var(--surface);border:1.5px solid var(--line);border-radius:14px;padding:12px 14px;width:100%}
input:focus-visible,select:focus-visible,button:focus-visible,a:focus-visible,summary:focus-visible{outline:3px solid color-mix(in srgb,var(--emerald) 55%,transparent);outline-offset:2px}
label{display:block;font-weight:600;margin:14px 0 6px}
.ic{flex:none;vertical-align:middle}
.muted{color:var(--ink-soft)} .small{font-size:14px} .strong{font-weight:650} .grow{flex:1;min-width:0}
.eyebrow{font:800 12px/1.3 var(--display);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-soft);margin-bottom:8px}
.eyebrow.saffron,.saffron{color:var(--saffron)} .eyebrow.green{color:var(--emerald)} .eyebrow.indigo{color:var(--indigo)}
.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:18px}
.notice{background:var(--sunk);border-radius:14px;padding:12px 14px;margin:12px 0}
.notice.success{background:color-mix(in srgb,var(--emerald) 14%,var(--surface));color:var(--ink)}
.notice.error{background:color-mix(in srgb,var(--coral) 14%,var(--surface))}
.notice.warn{background:color-mix(in srgb,var(--saffron) 18%,var(--surface))}
.error{color:var(--coral)}
.why{color:var(--emerald);font-weight:600}

/* Buttons (PrimaryButtonStyle, SoftButtonStyle) */
.primary,.btnlink.primary{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:0;border-radius:999px;padding:14px 22px;
  font:650 18px/1.2 var(--display);color:var(--on-primary);background:linear-gradient(var(--primary-top),var(--primary-bottom));
  box-shadow:0 6px 14px color-mix(in srgb,var(--emerald) 35%,transparent);text-decoration:none;min-height:50px}
.primary:active{transform:scale(.97)}
.primary:disabled{box-shadow:none;opacity:.4}
.wide{width:100%}
.soft{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:0;border-radius:999px;padding:12px 18px;font:650 17px/1.2 var(--display);
  color:var(--emerald);background:color-mix(in srgb,var(--emerald) 12%,transparent);min-height:46px}
.soft.indigo{color:var(--indigo);background:color-mix(in srgb,var(--indigo) 12%,transparent)}
.soft.small,.quiet.small{padding:8px 14px;min-height:36px;font-size:15px}
.outline{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;border:2px solid color-mix(in srgb,var(--emerald) 55%,transparent);
  background:transparent;border-radius:999px;padding:10px 14px;color:var(--emerald);font:650 18px/1.15 var(--display);min-height:52px}
.outline small{font:inherit;font-size:inherit}
.outline.wide{flex-direction:row;margin-top:12px}
.quiet{border:0;background:none;color:var(--ink-soft);padding:10px 12px;font-weight:600}
.danger{border:0;border-radius:999px;padding:12px 18px;background:color-mix(in srgb,var(--coral) 14%,transparent);color:var(--coral);font-weight:700}
.link{border:0;background:none;color:var(--emerald);font-weight:650;padding:8px 0;display:inline-flex;align-items:center;gap:6px}
.link.big{font:700 20px var(--display);margin:4px 0 12px}
.link-inline{border:0;background:none;padding:0;color:var(--emerald);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);min-width:44px;min-height:44px}
.iconbtn.round,.tool.round{background:var(--surface);border-radius:50%;box-shadow:var(--shadow);border:1px solid var(--line)}
.light-btn{border:0;border-radius:999px;padding:14px 24px;background:#fff;color:#0A3B2C;font:700 18px var(--display)}
.center{display:block;margin:12px auto}

/* Top bar: Home · Progress, search, his initial */
.topbar{position:sticky;top:0;z-index:20;background:color-mix(in srgb,var(--paper) 88%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);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:6px var(--gutter)}
.brand{display:grid;place-items:center;min-width:44px;min-height:44px}
.brand img{display:block;border-radius:8px}
.tabs{display:flex;gap:4px;flex:1;justify-content:center}
.tab{font:700 19px var(--display);color:var(--ink-soft);text-decoration:none;padding:12px 14px 9px;border-bottom:3px solid transparent}
.tab.on{color:var(--ink);border-bottom-color:var(--emerald)}
.avatar{border:0;width:44px;height:44px;border-radius:50%;background:var(--emerald);color:var(--on-primary);font:800 19px var(--display);display:grid;place-items:center}

/* Page */
.page{max-width:1400px;margin:0 auto;padding:20px 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 color-mix(in srgb,var(--line) 70%,transparent);border-radius:var(--r);padding:18px;box-shadow:var(--shadow);margin:16px 0}
.card.flat{box-shadow:none;margin:10px 0}
.pill{display:inline-block;font:700 12px var(--display);letter-spacing:.04em;border-radius:999px;padding:3px 9px;vertical-align:middle;background:var(--sunk);color:var(--ink-soft)}
.pill.secure{background:color-mix(in srgb,var(--emerald) 16%,transparent);color:var(--emerald)}
.pill.started{background:color-mix(in srgb,var(--saffron) 18%,transparent);color:color-mix(in srgb,var(--saffron) 70%,var(--ink))}
.pagehead{display:flex;align-items:center;gap:12px;margin:0 0 16px}
.pagetitle{font-size:22px;margin:0;flex:1;text-align:center;padding-right:44px}

/* Home: the hero (HomeHeroView) */
.date{margin:4px 0 12px}
.home-top{display:grid;gap:16px}
.hero{position:relative;overflow:hidden;border-radius:26px;color:#fff;padding:16px;background:linear-gradient(135deg,var(--emerald-deep),var(--emerald-mid));
  box-shadow:0 14px 30px color-mix(in srgb,var(--emerald-deep) 35%,transparent)}
.hero::before{content:"";position:absolute;inset:0;opacity:.09;pointer-events:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='56' height='56' viewBox='0 0 56 56'%3E%3Cg fill='none' stroke='%23fff' stroke-width='1.1'%3E%3Cpath d='M28 15.2 40.8 28 28 40.8 15.2 28z'/%3E%3Cpath d='M18.9 18.9h18.2v18.2H18.9z'/%3E%3Ccircle cx='28' cy='28' r='4'/%3E%3C/g%3E%3C/svg%3E")}
.hero.dimmed{filter:saturate(.75)} .hero.dimmed .hero-poster{opacity:.75}
.hero-poster{position:relative;border-radius:18px;overflow:hidden;aspect-ratio:16/9;background:#F4EFE6}
.hero-poster img{display:block;width:100%;height:100%;object-fit:cover}
.hero-copy{position:relative;padding:18px 8px 6px}
.hero .eyebrow{color:color-mix(in srgb,#fff 75%,transparent)}
.hero h1{color:#fff;font-size:clamp(30px,7.4vw,44px)}
.hero p{font-size:18px;color:color-mix(in srgb,#fff 88%,transparent)}
.hero-btn{display:inline-flex;align-items:center;gap:8px;white-space:nowrap;max-width:100%;border:0;border-radius:18px;padding:16px 26px;margin-top:6px;font:700 20px var(--display);color:#fff;
  background:#13926A;box-shadow:0 8px 18px rgba(0,0,0,.18)}
.hero-link{border:0;background:none;color:#fff;font:700 18px var(--display);padding:10px 0;text-decoration:underline;text-underline-offset:4px}
.hero-note{font-weight:600}
.next{font-size:18px;color:var(--ink-soft);margin:4px 0}
.short{font-size:18px;color:var(--emerald);margin:10px 0}
.short.muted{font-size:15px;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:16px;padding:12px 14px;margin:12px 0}

/* Poster rows (ScrollingRow): snap, a trailing fade and a round › control */
.shelf{margin:36px 0 0}
.shelf h2{font-size:clamp(24px,5.4vw,30px)}
.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(--paper));pointer-events:none}
.row-next{position:absolute;right:10px;top:calc((min(236px,70vw)) * 9 / 32 - 4px);z-index:2;width:44px;height:44px;border-radius:50%;border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow);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:16px;overflow:hidden;background:#F4EFE6;box-shadow:var(--shadow)}
.tile .poster img{display:block;width:100%;height:100%;object-fit:cover}
.poster-blank{display:grid;place-items:center;height:100%;font:700 18px var(--serif);color:#5E6B64;padding:12px;text-align:center}
.tile strong{font:650 16px/1.25 var(--display)}
.tile small{color:var(--ink-soft);font-size:14px;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.film-tile{background:var(--surface);border-radius:20px;padding:0 0 14px;box-shadow:var(--shadow);border:1px solid color-mix(in srgb,var(--line) 70%,transparent)}
.film-tile .poster{border-radius:20px 20px 0 0;box-shadow:none}
.film-tile strong,.film-tile small{padding:0 14px}
.film-tile strong{margin-top:6px}
.badges{position:absolute;left:10px;bottom:10px;display:flex;gap:6px}
.badge{font:700 13px var(--display);border-radius:999px;padding:5px 11px;color:#fff;background:#0E7C5A}
.badge.time{background:rgba(23,33,28,.82)}
.badge.concept{background:#0E7C5A}

/* Topic page */
.banner{position:relative;border-radius:22px;overflow:hidden;aspect-ratio:16/8;background:#2b2f2c;margin-bottom:8px}
.banner img{width:100%;height:100%;object-fit:cover;display:block}
.banner-shade{position:absolute;inset:0;background:linear-gradient(90deg,rgba(14,19,17,.88),rgba(14,19,17,.35) 60%,transparent)}
.banner h2{position:absolute;left:22px;bottom:18px;right:40%;color:#fff;font-size:clamp(26px,6.4vw,44px);margin:0}
details.play{margin:12px 0}
details.play summary{cursor:pointer;color:var(--emerald);font-weight:650;padding:8px 0}
.unit{margin:30px 0 0}
.unit-head h2{margin-bottom:12px}
.unit-actions{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:14px}
.unit-actions .outline{flex-direction:column;padding:8px 6px;font-size:17px}

/* Search */
dialog{border:0;padding:0;background:transparent;color:var(--ink);max-width:none;max-height:none}
dialog:focus{outline:none}
dialog::backdrop{background:rgba(10,20,15,.42)}
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:26px 26px 0 0;
  padding:18px var(--gutter) calc(20px + env(safe-area-inset-bottom));box-shadow:0 -10px 40px rgba(0,0,0,.18)}
dialog.sheet.full{height:100dvh;max-height:100dvh;border-radius:0;width:100%;inset:0}
@media (min-width:760px){dialog.sheet{inset:0;margin:auto;border-radius:26px;max-height:88dvh} dialog.sheet.full{width:min(920px,96vw);height:fit-content;max-height:94dvh;border-radius:26px}}
.sheet-grab{width:40px;height:5px;border-radius:3px;background:var(--line);margin:-6px auto 12px}
.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(--sunk);border-radius:14px;padding:0 12px;margin:0}
.searchbox input{border:0;background:transparent;padding:12px 0}
.search-results h3{margin:16px 0 6px;font-size:14px;letter-spacing:.1em;text-transform:uppercase;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:13px 2px;font-size:17px}
.result small{color:var(--emerald);font-weight:650;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:38px;height:38px;border-radius:50%;display:grid;place-items:center;position:relative}
.day .dot::before{content:"";width:9px;height:9px;border-radius:50%;background:var(--line)}
.day .dot.planned::before{width:24px;height:24px;background:none;border:2.5px solid var(--emerald)}
.day .dot.kept{background:var(--emerald);color:var(--on-primary)} .day .dot.kept::before{display:none}
.day .letter{font:600 17px var(--display);color:var(--ink-soft)}
.day.today .letter{color:var(--ink);text-decoration:underline;text-underline-offset:4px;font-weight:800}
.day .academy{height:6px;width:3px;border-radius:2px}
.day .academy.on{background:var(--ink-soft)}
.legend{display:flex;gap:18px;flex-wrap:wrap;color:var(--ink-soft);font-size:15px}
.legend .dot{display:inline-block;width:14px;height:14px;border-radius:50%;margin-right:6px;vertical-align:-2px}
.legend .dot.planned{border:2.5px solid var(--emerald)} .legend .dot.kept{background:var(--emerald)}
.legend .academy{display:inline-block;width:3px;height:14px;background:var(--ink-soft);margin-right:6px;vertical-align:-2px}
.better{display:grid;grid-template-columns:auto 1fr;gap:4px 16px;margin:12px 0}
.better strong{font:700 18px var(--display)}
.test-card{background:var(--surface);border:1px solid var(--line);border-radius:18px;margin:12px 0;padding:0 16px}
.test-card summary{display:flex;align-items:center;gap:12px;padding:16px 0;cursor:pointer;list-style:none}
.test-card summary::-webkit-details-marker{display:none}
.test-card summary .muted{flex:1}
.test-card .school{font:800 22px var(--display);color:var(--emerald)}
.test-card[open] summary .ic{transform:rotate(180deg)}
details.more{margin:24px 0}
details.more>summary{cursor:pointer;font:700 20px var(--display);padding:12px 0}
.stats{display:flex;gap:14px} .stats>div{flex:1} .stats small{display:block;color:var(--ink-soft)} .stats strong{font:800 24px var(--display)}
.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:16px;padding:14px;margin:8px 0}
.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:800} .status.ok{color:var(--emerald)} .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:30px;height:30px;border-radius:50%;background:var(--emerald);color:var(--on-primary);display:grid;place-items:center;font:800 15px var(--display);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(--emerald)}
h2.big{font-size:30px}

/* Settings and onboarding */
.choices-list{display:grid;gap:10px;margin:14px 0}
.pick{display:flex;gap:12px;align-items:center;text-align:left;border:1.5px solid var(--line);border-radius:16px;background:var(--surface);padding:14px}
.pick small{display:block;color:var(--ink-soft)}
.pick .check{width:26px;height:26px;border-radius:50%;border:2px solid var(--line);display:grid;place-items:center;flex:none}
.pick.on{border-color:var(--emerald);background:color-mix(in srgb,var(--emerald) 7%,var(--surface))}
.pick.on .check{background:var(--emerald);border-color:var(--emerald);color:var(--on-primary)}
.chips{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0}
.chip{border:1.5px solid var(--line);background:var(--surface);border-radius:999px;padding:10px 16px;font-weight:650}
.chip.on{background:var(--emerald);border-color:var(--emerald);color:var(--on-primary)}
.chips.days .chip{min-width:58px}
.segmented{display:inline-flex;background:var(--sunk);border-radius:999px;padding:4px;gap:2px;flex-wrap:wrap}
.segmented button{border:0;background:none;border-radius:999px;padding:8px 14px;font-weight:650;color:var(--ink-soft)}
.segmented button.on{background:var(--surface);color:var(--ink);box-shadow:var(--shadow)}
.toggle-row{display:flex;gap:12px;align-items:flex-start;font-weight:400;margin:12px 0}
.toggle-row input{width:22px;height:22px;margin-top:2px;accent-color:var(--emerald);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:46px;height:28px;border-radius:999px;background:var(--line);position:relative;flex:none;margin-top:2px}
.switch::after{content:"";position:absolute;left:3px;top:3px;width:22px;height:22px;border-radius:50%;background:#fff;transition:transform .2s}
.switch.on{background:var(--emerald)} .switch.on::after{transform:translateX(18px)}
.dayrow .dayname{width:110px;font-weight:600} .dayrow input{width:auto}
.onboard{max-width:560px;margin:0 auto;padding:calc(36px + env(safe-area-inset-top)) var(--gutter) 40px}
.onboard form button{margin-top:18px}
.steps{display:flex;gap:6px;margin-bottom:28px} .steps i{height:5px;flex:1;border-radius:3px;background:var(--line)} .steps i.on{background:var(--emerald)}
.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 (SessionView: the iPhone's soft green header, the question card, 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(--head);padding:calc(10px + env(safe-area-inset-top)) var(--gutter) 10px;border-bottom:1px solid color-mix(in srgb,var(--emerald) 30%,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:800 22px var(--display);display:flex;align-items:center;gap:8px}
.fx{font-style:italic;font-family:var(--serif);font-weight:700}
.s-clock{font:800 30px/1.1 var(--display);font-variant-numeric:tabular-nums}
.s-clock span{font:600 16px var(--display);color:var(--ink-soft)}
.bar{height:5px;border-radius:3px;background:color-mix(in srgb,var(--ink) 10%,transparent);margin-top:6px;max-width:300px;overflow:hidden}
.bar i{display:block;height:100%;background:var(--emerald);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:999px;padding:8px 14px;font:800 18px var(--display);color:var(--ink)}
.qpill .ic{color:var(--indigo)} .qpill small{font-weight:600;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:24px;padding:18px;border:1px solid color-mix(in srgb,var(--line) 70%,transparent);box-shadow:var(--shadow);overscroll-behavior:contain}
.working-open .s-card{flex:0 0 auto;max-height:36%}
.stem{font:650 19px/1.5 var(--text);margin:4px 0 14px}
/* A maths question's setup above its stem (the bank's `passage` on a maths question) */
.setup{font:500 18px/1.55 var(--text);margin:4px 0 10px;color:var(--ink)}
.passage{font:400 19px/1.65 var(--serif);background:var(--sunk);border-left:4px solid var(--saffron);border-radius:6px 16px 16px 6px;padding:16px 18px;margin-bottom:18px}
.passage.small{font-size:16px}
.figure{margin:8px 0 14px;overflow-x:auto}
.figure svg{max-width:100%;height:auto}
.options{display:grid;gap:12px}
.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:1.5px solid var(--line);border-radius:18px;padding:13px 14px;min-height:58px;font-size:18px;color:var(--ink)}
.option .answer b{width:34px;height:34px;flex:none;border-radius:50%;display:grid;place-items:center;background:var(--sunk);font:700 16px var(--display);color:var(--ink-soft)}
.option.selected .answer{border:2.5px solid var(--ink);padding:12px 13px;background:color-mix(in srgb,var(--ink) 4%,var(--surface))}
.option.selected .answer b{background:var(--ink);color:var(--paper)}
.option.struck .answer{opacity:.45} .option.struck .answer span{text-decoration:line-through}
.option.correct .answer{border:2.5px solid var(--emerald);background:color-mix(in srgb,var(--emerald) 10%,var(--surface))} .option.correct .answer b{background:var(--emerald);color:var(--on-primary)}
.option.wrong .answer{border:2.5px solid var(--coral);background:color-mix(in srgb,var(--coral) 9%,var(--surface))} .option.wrong .answer b{background:var(--coral);color:#fff}
.options.static .option .answer{min-height:0}
.cross{width:46px;height:46px;flex:none;border-radius:50%;border:1.5px solid var(--line);background:var(--surface);display:grid;place-items:center}
.cross .abc{font:800 12px var(--display);color:var(--ink-soft);text-decoration:line-through}
.cross[aria-pressed="true"]{background:var(--sunk)}
.jump{position:sticky;bottom:6px;float:right;margin-top:-56px;border:0;border-radius:999px;background:var(--emerald);color:var(--on-primary);font:700 17px var(--display);padding:12px 18px;box-shadow:var(--shadow)}
.coach-note{display:flex;gap:10px;align-items:flex-start}
.coach-note img{border-radius:50%;flex:none} .coach-note .coach-text{flex:1;min-width:0;overflow-wrap:anywhere}
.thinking{position:relative;overflow:hidden;color:var(--emerald);font-weight:650}
.thinking::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--emerald) 18%,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:22px;border:1px solid color-mix(in srgb,var(--line) 70%,transparent);box-shadow:var(--shadow);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(--surface);padding:10px 14px;
  background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:32px 32px}
.working-bar strong{display:block;font:750 19px var(--display)} .working-bar small{color:var(--ink-soft);font-size:15px}
.wicon{width:48px;height:48px;border-radius:50%;background:color-mix(in srgb,var(--emerald) 12%,transparent);color:var(--emerald);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:5px;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 3px var(--surface),0 0 0 5px var(--emerald)}
.tool{border:0;background:none;width:36px;height:36px;border-radius:12px;display:grid;place-items:center;color:var(--ink);flex:none}
.tool.on{background:color-mix(in srgb,var(--emerald) 14%,transparent);color:var(--emerald)}
.tool.collapse{margin-left:auto}
.tool[hidden]{display:none}
.tool.hand[aria-pressed="true"]{background:color-mix(in srgb,var(--emerald) 14%,transparent);color:var(--emerald)}
.sep{width:1px;height:24px;background:var(--line);margin:0 2px;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(23,33,28,.8);color:#fff;border-radius:999px;padding:4px 10px;font:700 13px var(--display)}
.s-foot{padding:10px var(--gutter) calc(10px + env(safe-area-inset-bottom));background:var(--paper)}
.s-foot .row{margin:0 0 10px} .s-foot .row:last-child{margin:0}
.helps .help{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:10px;border:0;border-radius:999px;padding:12px;font:700 19px var(--display);min-height:54px}
.help.idea{background:color-mix(in srgb,var(--indigo) 14%,transparent);color:var(--indigo)}
.help.coach{background:color-mix(in srgb,var(--emerald) 13%,transparent);color:var(--emerald)}
.help.coach img{border-radius:50%}
.skipbtn{display:inline-flex;align-items:center;gap:8px;border:0;border-radius:999px;padding:14px 20px;background:color-mix(in srgb,var(--saffron) 18%,transparent);color:color-mix(in srgb,var(--saffron) 85%,var(--ink));font:700 19px var(--display);min-height:56px}
.lockin{min-height:56px;font-size:20px}
.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:56px;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-radius:14px;padding:12px}
dialog.help h2{display:flex;align-items:center;gap:8px;color:var(--indigo)}
.showme ol{padding-left:22px} .showme li{margin:6px 0;font-size:17px}
.sm-idea{font-weight:750;font-size:18px} .sm-watch{color:var(--coral);font-weight:600}
/* 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 dashed 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. */
.katex{font-size:1.1em} 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}

/* The class's parts */
.agenda-page{max-width:640px;margin:0 auto;padding:calc(28px + env(safe-area-inset-top)) var(--gutter) 40px}
.agenda{list-style:none;padding:6px 18px}
.agenda li{display:flex;align-items:center;gap:16px;padding:18px 0;border-bottom:1px solid var(--line)}
.agenda li:last-child{border:0}
.agenda strong{flex:1;font:700 19px/1.3 var(--display)}
.agenda .num{width:40px;height:40px;border-radius:50%;background:var(--emerald);color:var(--on-primary);display:grid;place-items:center;font:800 17px var(--display);flex:none}
.agenda .num.indigo{background:var(--indigo)}
.clockline{display:flex;gap:10px;align-items:flex-start;font-size:17px;margin:18px 0}
.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}
.part-header .eyebrow{margin:0;color:var(--emerald)}
.part-header .row{margin:0}
.part-body{max-width:760px;margin:0 auto;padding:8px var(--gutter) calc(40px + env(safe-area-inset-bottom))}
.part.dark{background:linear-gradient(160deg,var(--emerald-deep),var(--emerald-mid));color:#fff}
.part.dark .eyebrow,.part.dark .muted{color:color-mix(in srgb,#fff 70%,transparent)} .part.dark .iconbtn,.part.dark .quiet{color:#fff}
.part.dark .iconbtn.round{background:rgba(255,255,255,.14);border-color:transparent}
.center-col{min-height:70dvh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}
.clock.big{font:800 64px var(--display);font-variant-numeric:tabular-nums;margin:18px 0}
.option-card{display:block;width:100%;text-align:left;background:var(--surface);border:1.5px solid var(--line);border-radius:20px;padding:18px;margin:12px 0}
.option-card strong{display:block;font:750 20px var(--display);margin-bottom:4px} .option-card small{color:var(--ink-soft);font-size:16px}
.option-card.recommended{border:2.5px solid var(--saffron)}
.dots{display:flex;gap:6px;margin:10px 0 18px} .dots i{flex:1;height:5px;border-radius:3px;background:var(--line)} .dots i.done{background:var(--emerald)} .dots i.now{background:var(--saffron)}
h2.stem,h3.stem{font:700 22px/1.4 var(--display)}
.rung-options{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:16px 0}
.rung-options.single{grid-template-columns:1fr}
.rung{border:1.5px solid var(--line);background:var(--surface);border-radius:16px;padding:16px;font-size:18px;text-align:left;min-height:58px}
.rung.right{border:2.5px solid var(--emerald);background:color-mix(in srgb,var(--emerald) 10%,var(--surface))}
.rung.wrong{border:2.5px solid var(--coral);text-decoration:line-through}
.right-line{color:var(--emerald);font-weight:650;display:flex;gap:8px;align-items:flex-start}
.slip{background:color-mix(in srgb,var(--coral) 10%,var(--surface));border-radius:16px;padding:14px;margin:12px 0}
.slip strong{color:var(--coral)}
.mark-row{display:flex;gap:12px;align-items:center;padding:10px 0;border-bottom:1px solid var(--line)}
.mark-row .ok{color:var(--emerald)} .mark-row .no{color:var(--coral);font-weight:800}
.film-offer img{border-radius:14px;margin-bottom:10px}
/* Safari doesn't clip a playing video (a composited layer) to a rounded overflow box: its own control bars ran past
   the corners. The mask makes the clip hold; 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. */
.player{position:relative;background:#000;border-radius:18px 18px 0 0;overflow:hidden;aspect-ratio:16/9;margin:10px auto 0;
  isolation:isolate;-webkit-mask-image:-webkit-radial-gradient(white,black);max-width:calc(58dvh * 16 / 9)}
.player video{width:100%;height:100%;display:block;object-fit:contain}
.film-error{position:absolute;inset:0;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:#111;color:#fff;border-radius:0 0 18px 18px;padding:10px 16px;font-size:18px;line-height:1.4;text-align:center;margin:0 auto;max-width:calc(58dvh * 16 / 9)}
.captions-strip.off{background:#111;min-height:0;padding:0;height:18px}
.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:28px}
.trap{color:var(--coral);font-weight:600}
.done-hero{background:linear-gradient(135deg,var(--emerald-deep),var(--emerald-mid));color:#fff;border-radius:26px;padding:24px}
.done-hero h1{color:#fff;font-size:28px} .done-hero .eyebrow{color:#F5B53D}
.stat-row{display:flex;justify-content:space-between;gap:16px;padding:10px 0;border-bottom:1px solid var(--line)}
.stat-row:last-child{border:0} .stat-row span{text-align:right}
.lookback h3{margin-top:16px}
.lookback form button{margin-top:14px}
.review-image{width:100%;border-radius:14px;border:1px solid var(--line);background:#fff}

#toast{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(20px + env(safe-area-inset-bottom));z-index:100;background:var(--ink);color:var(--paper);border-radius:14px;padding:12px 18px;max-width:min(560px,92vw);box-shadow:var(--shadow)}
#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 - 4px)}
  .hero{display:grid;grid-template-columns:1.05fr 1fr;gap:24px;align-items:center;padding:22px}
  .hero.mock{grid-template-columns:1fr}
  .hero-copy{padding:8px}
  .unit-actions{display:flex;gap:12px} .unit-actions .outline{flex-direction:row;gap:6px;padding:10px 20px}
  .unit-actions .outline small::before{content:"· "}
  .banner{aspect-ratio:16/6}
}
@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}
  .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:10px}
  .helps .help,.skipbtn,.lockin{white-space:nowrap}
.page.done .row.wrap>button{white-space:nowrap}
  .s-foot .helps{min-width:0}
  .verbal .s-card.has-passage{display:grid;grid-template-columns:1fr 1fr;gap:24px;align-content:start}
  .verbal .s-card.has-passage .passage{grid-row:1 / span 8;margin:0}
  .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(24px,5.4vw,32px)}
.verbal .option .answer{font-size:16.5px;line-height:1.4}
.passage{font-size:20px}
.lockin{white-space:nowrap}
.page.done .row.wrap>button{white-space:nowrap}
@media (max-width:400px){.pad-tools .tool[data-action=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:11px;letter-spacing:.08em;white-space:normal;overflow:visible;text-overflow:clip;line-height:1.35}
  .s-title{font-size:17px;gap:6px}
  .s-clock{font-size:22px} .s-clock span{font-size:13px}
  .bar{margin-top:4px}
  .s-side{flex-direction:row;align-items:center;gap:6px}
  .s-side .quiet.small{padding:6px 8px;min-height:36px;font-size:14px}
  .s-side .iconbtn.round{width:36px;height:36px}
  .qpill{padding:5px 10px;font-size:15px;gap:4px}
  .s-body{gap:8px;padding-top:8px}
  .s-card{padding:14px;border-radius:20px}
  .stem{font-size:16.5px;line-height:1.45;margin:2px 0 10px}
  .setup{font-size:16px;line-height:1.45;margin:2px 0 8px}
  .options{gap:8px}
  .option{gap:8px}
  .option .answer{min-height:44px;padding:9px 12px;font-size:16px;gap:10px;border-radius:14px}
  .option.selected .answer,.option.correct .answer,.option.wrong .answer{padding:8px 11px}
  .option .answer b{width:28px;height:28px;font-size:14px}
  .cross{width:36px;height:36px} .cross .abc{font-size:10px}
  .working-bar{padding:7px 12px;gap:10px} .working-bar strong{font-size:16px} .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:16px;min-height:44px;padding:8px;gap:8px}
  .helps .help img{width:24px;height:24px}
  .skipbtn{font-size:16px;min-height:46px;padding:10px 16px;gap:6px}
  .lockin{min-height:46px;font-size:17px}
  .s-foot .extra .soft{padding:6px 12px;min-height:36px;font-size:14px}
  .part-header .eyebrow{font-size:11px;letter-spacing:.08em}
  .s-foot.compact .helps .help,.s-foot.compact .skipbtn{width:46px}
}

/* 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 pill, never red, never a countdown. */
.signin .logo,#role .logo{display:block;border-radius:16px;margin:0 0 18px}
.signin form button,#role .choices-list{margin-top:16px}
.role-pick{padding:18px}
.role-pick strong{font:700 19px var(--display)}
.role-icon{width:46px;height:46px;border-radius:14px;display:grid;place-items:center;flex:none;color:var(--emerald);background:color-mix(in srgb,var(--emerald) 12%,transparent)}
.card.invite{border-color:color-mix(in srgb,var(--saffron) 45%,var(--line))}
.tile.locked .poster img{filter:blur(7px) saturate(.6);transform:scale(1.08)}
.tile.locked strong{color:var(--ink-soft)}
.lock-pill,.unlock-pill{display:inline-flex;align-items:center;gap:6px;border-radius:999px;font:700 14px var(--display);white-space:nowrap}
.lock-pill{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);padding:8px 14px;background:color-mix(in srgb,var(--surface) 88%,transparent);color:var(--ink);box-shadow:var(--shadow)}
.row-wrap.blurred .row-scroll{filter:blur(4px);pointer-events:none;user-select:none;opacity:.8}
.row-wrap.blurred .lock-pill{display:none}
.unlock-pill{position:absolute;left:50%;top:42%;transform:translate(-50%,-50%);border:1px solid var(--line);padding:12px 20px;background:var(--surface);color:var(--emerald);box-shadow:var(--shadow);z-index:2;min-height:46px}
.outline.locked{border-color:var(--line);color:var(--ink-soft)}
.outline.locked .ic{margin-right:2px}
.pill.free{background:color-mix(in srgb,var(--emerald) 16%,transparent);color:var(--emerald)}
.free-intro{margin:26px 0 4px}
.free-intro .chips{display:flex;flex-wrap:wrap;gap:8px}
.chips.free-units .chip{display:inline-flex;align-items:center;gap:6px;color:var(--emerald)}
.price-card{display:flex;flex-direction:column;gap:2px;background:var(--sunk);border-radius:16px;padding:16px;margin:14px 0}
.price-card strong{font:800 26px var(--display);color:var(--ink)}
.price-card span{color:var(--ink-soft)}
.access-card.free{border-color:color-mix(in srgb,var(--saffron) 40%,var(--line))}
.free-done{border-color:color-mix(in srgb,var(--saffron) 40%,var(--line))}
.child-head{display:flex;align-items:center;gap:14px;margin-bottom:6px}
.child-head h2{margin:0}
.avatar.big{width:52px;height:52px;font-size:22px;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 color-mix(in srgb,var(--emerald) 55%,transparent);outline-offset:1px;border-radius:3px}
.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);border-radius:14px;box-shadow:0 10px 28px rgba(10,20,15,.18);font:15.5px/1.45 var(--text);text-align:left}
.term-pop p{margin:0}
.term-pop .term-plain strong{font-weight:700}
.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:20px 20px 0 0;padding:16px var(--gutter) max(18px,env(safe-area-inset-bottom));font-size:16.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)}

/* Readable warm colours (student simulation, 19 Oct 2026): on the light paper, saffron words ("Skip", the saffron
   eyebrows) read at 2.3-2.4:1 and coral ones (the wrong-answer notice, Watch out, the trap, Delete account) at 3-3.9:1;
   in the dark, white on the coral letter of a wrong choice read at 2.7:1. Text takes a deeper tone in light mode;
   fills and borders keep the brand colours.
   Codex audit F05 (19 Oct 2026): emerald words on their own tint (soft buttons 4.0:1, Ask coach 3.95:1, the practice
   eyebrow 4.23:1 at 11 px) and white on the coral letter of a wrong choice (3.9:1) were still under 4.5:1 in light
   mode, so emerald text takes a deeper tone too (5.0:1 or better on every tint it sits on) and the wrong letter's
   fill is a deeper coral (4.9:1). Skip on its own saffron tint on a phone (4.25:1) takes a deeper saffron (5.0:1), and coral words a deeper coral (Delete account on its tint was 4.36:1, now 4.9:1). */
:root{--saffron-text:color-mix(in srgb,var(--saffron) 48%,var(--ink));--coral-text:color-mix(in srgb,var(--coral) 68%,var(--ink));--on-coral:#fff;
  --emerald-text:color-mix(in srgb,var(--emerald) 80%,var(--ink));--coral-fill:color-mix(in srgb,var(--coral) 85%,var(--ink))}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){--saffron-text:var(--saffron);--coral-text:var(--coral);--on-coral:#2A0E07;--emerald-text:var(--emerald);--coral-fill:var(--coral)}}
:root[data-theme="dark"]{--saffron-text:var(--saffron);--coral-text:var(--coral);--on-coral:#2A0E07;--emerald-text:var(--emerald);--coral-fill:var(--coral)}
.eyebrow.saffron,.saffron,.skipbtn{color:var(--saffron-text)}
.done-hero .eyebrow{color:#F5B53D}
.error,.danger,.sm-watch,.trap,.slip strong,.status.no,.mark-row .no{color:var(--coral-text)}
.option.wrong .answer b{color:var(--on-coral);background:var(--coral-fill)}
a,.eyebrow.green,.why,.soft,.help.coach,.outline,.link,.link-inline,.pill.secure,.short,details.play summary,.result small,.test-card .school,
.status.ok,.thinking,.subscribe-pill,.subscribe-tile .poster,.tool.on,.tool.hand[aria-pressed="true"],.wicon{color:var(--emerald-text)}

/* 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.2} .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}
@media (max-width:600px){.lbl-subject{display:none}}

/* 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:48px;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.round{padding:0;background-clip:border-box}
  .swatch{width:44px;height:44px}
  .swatch::before{inset:9px}
  .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:4px;border-radius:50%;border:1.5px solid var(--line);background:var(--surface)}
  .cross[aria-pressed="true"]::before{background:var(--sunk)}
  .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:600;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 pill, a corner on locked topics and
   a last card in every row. */
.subscribe-pill{display:inline-flex;align-items:center;gap:6px;min-height:40px;padding:0 14px;border:1px solid color-mix(in srgb,var(--emerald) 45%,transparent);border-radius:999px;background:var(--surface);color:var(--emerald);font:700 15px var(--display);white-space:nowrap}
@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:1.5px dashed color-mix(in srgb,var(--emerald) 45%,transparent);background:color-mix(in srgb,var(--emerald) 7%,var(--surface));color:var(--emerald);text-align:center;padding:12px}
.subscribe-tile .poster b{font:700 17px var(--display)}
.subscribe-tile .poster small{color:var(--ink-soft);font-size:13px}
.sub-card{display:flex;align-items:center;justify-content:space-between;gap:14px;margin:18px 0 6px;padding:14px 16px;border:1px solid color-mix(in srgb,var(--emerald) 30%,var(--line));border-radius:18px;background:color-mix(in srgb,var(--emerald) 6%,var(--surface))}
.sub-card strong{display:block;font:700 17px var(--display)}
.sub-card small{color:var(--ink-soft)}
.sub-card .primary{flex:none}

/* 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}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.sk{display:block;background:var(--sunk);border-radius:10px}
.sk-line{height:14px;width:70%;margin:10px 0} .sk-line.short{width:38%}
.sk-title{height:34px;width:82%;margin:6px 0 14px;border-radius:12px}
.sk-card{height:120px;margin:16px 0;border-radius:20px}
.sk-button{height:56px;width:150px;margin-top:14px;border-radius:18px}
.sk-hero .sk{background:color-mix(in srgb,#fff 18%,transparent)}
.sk-hero{min-height:260px}
.sk-tile .poster{aspect-ratio:16/9;border-radius:16px;box-shadow:none;background:var(--sunk)}
.boot-sk .logo{display:block;margin-bottom:12px}
@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:600;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:4px;overflow:hidden;border-radius:4px;background:var(--line)}
.account-progress-track i{display:block;width:38%;height:100%;border-radius:inherit;background:var(--emerald);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(--emerald);background:color-mix(in srgb,var(--emerald) 6%,var(--surface))}
.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:12px}
.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 img{border-radius:14px}
.arriving p{margin:0;color:var(--ink-soft);font-weight:600}
.arriving .progress{width:min(240px,70vw);height:6px;border-radius:999px;background:var(--line);overflow:hidden}
.arriving .progress span{display:block;width:40%;height:100%;border-radius:999px;background:var(--emerald);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:14px;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:52px}
.pay .pay-way p{margin:0}
.pay .bank-details{margin:14px 0;padding:4px 16px;background:var(--sunk);border-radius:16px}
.pay .bank-details>div{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:4px 12px;padding:11px 0;border-bottom:1px solid var(--line)}
.pay .bank-details>div:last-child{border-bottom:0}
.pay .bank-details dt{color:var(--ink-soft);font-size:14px}
.pay .bank-details dd{margin:0;display:flex;align-items:center;gap:10px;font-weight:650;min-width:0;flex-wrap:wrap;justify-content:flex-end}
.pay .bank-details .soft.small{padding:6px 12px;font-size:14px;min-height:36px}
.pay .iban{font-variant-numeric:tabular-nums;letter-spacing:.02em;overflow-wrap:anywhere}
.pay .ref{font:800 19px var(--display);letter-spacing:.06em;color:var(--emerald-text,var(--emerald))}
.pay input[type=file]{padding:10px;margin:6px 0 4px}
.pay .price-card .sk{display:block;margin:4px 0}
.access-card.renew{border-color:color-mix(in srgb,var(--saffron) 45%,var(--line))}
.pay .bank-details>.iban-row{flex-direction:column;align-items:stretch}
.pay .bank-details>.iban-row dd{justify-content:space-between}

/* 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 color-mix(in srgb,var(--line) 60%,transparent)}
  .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:2px;border:0;background:none;border-radius:12px;
    padding:4px 2px;color:var(--ink-soft);font:650 12px/1.1 var(--display)}
  .qtool .qt-label{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .qtool img{width:22px;height:22px;border-radius:50%}
  .qtool.idea .ic{color:var(--indigo)}
  .qtool[aria-pressed="true"],.qtool.pt-flag.on{background:var(--sunk);color:var(--ink)}
  .qtool.pt-flag.on .ic{color:var(--saffron-text)}
  .qtool:disabled{opacity:.45}
  .phone-foot > .lockin{width:100%;min-height:50px}
  /* 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}
  .phone-foot.compact .qtool,.pt-tools.compact .qtool{min-height:36px}
  .phone-foot.compact .qt-label,.pt-tools.compact .qt-label{display:none}
  .pt-tools{padding:6px var(--gutter) 0;background:var(--paper);border-top:1px solid color-mix(in srgb,var(--line) 60%,transparent)}
  .pt-tools + .pt-foot{padding-top:6px}
  /* The cross-outs: a smaller circle, its tap area kept, inside the card */
  .option{gap:6px}
  .cross{width:32px;height:32px} .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:7px 5px}
}

/* 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(--ink);color:var(--surface);font:650 14px/1.3 var(--text);padding:8px 14px;border-radius:999px;box-shadow:0 6px 18px rgb(0 0 0 / .18);text-align:center}
.skipped-before{margin:0 0 6px;font:700 13px/1.3 var(--display);color:var(--saffron-text,var(--saffron))}
.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:800 15px/1.15 var(--display);color:var(--ink);overflow-wrap:anywhere;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
  .s-head .s-short .fx{font-size:16px}
  .s-head .s-clock{font-size:17px;line-height:1;flex:none} .s-head .s-clock span{display:none}
  .s-head .s-clock.muted{display:none}
  .s-head .bar{position:absolute;left:0;right:0;bottom:-1px;height:3px;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:4px 10px;font-size:14px;gap:3px}
  .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:6px 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:14px;
  background:var(--surface);color:var(--ink);font:650 15px/1.3 var(--display);text-align:left}
.update-note .ic{color:var(--emerald);flex:none}
