/* =====================================================================
   NARCISSOS × MHC · APP SHELL
   ---------------------------------------------------------------------
   Load order: fonts.css → tokens.css → components.css → shell.css → features/*.css
   Owns: base resets the old templates rely on, page background, the fixed
   header (.appbar) and bottom tab bar (.tabs.tabbar), page layout (.main,
   .view), splash, offline bar, legacy modal base (.mb/.md, paywall), the tab
   bar during onboarding, shared legacy classes used by more than one feature,
   the z-index ladder and the motion safety net. Overlays, toast, settings and
   onboarding layout: ui.css.

   LAYOUT CONTRACT FOR FEATURE VIEWS
   · .main pads for the real header (--hdr-h + --st) and tab bar (--tab-h + --sb).
     No spacer divs, ever.
   · Each .view carries the 20px gutter. Golden-mockup blocks (.mast, .sec, .pad)
     placed directly inside a .view drop their own gutter, so mockup markup can
     be pasted in as is and still lines up. Full-bleed blocks use
     margin-inline:calc(-1 * var(--gutter)).
   · Old templates stack .card blocks with a bottom margin (low-specificity
     :where() rule below). New layouts (.stack, .sec) override it for free.

   Z-INDEX LADDER (keep in sync with components.css, ui.css, learn.css and the JS overlays)
     .main 1 · dock 15 · appbar 20 · tabbar 30 · offline bar 35 · (scrim 40 ·
     sheet/modal 50 inside their layer) · Learn reader .edr 100 (covers the app bar
     and the tab bar) · .mb modals 200 (#sM settings sheet, #pwM paywall) ·
     confetti 300 · onboarding 600 (tabs 610, highlighted tab 650) · ui.js layers
     700 (sheet, modal, celebration: each new layer on top of the last) · toast
     host 900 · splash 99999

   TAB BAR RULES (init.js keyboard state machine, iOS WKWebView)
     .tabs stays position:fixed; bottom:0; a direct child of <body>, with NO
     transform, NO will-change and NO filter on it. JS writes style.display and
     style.bottom on it. Style the inner .tabbar__in or the tabs instead.
   ===================================================================== */

/* ===================== 0. Base (legacy-safe) ===================== */
/* Old templates assume zero UA margins/paddings. Specificity 0: every class wins. */
*,*::before,*::after{margin:0;padding:0}
html{overscroll-behavior:none;scroll-padding-top:calc(var(--hdr-h) + var(--st) + var(--s3))}
body{min-height:100vh;min-height:100dvh;overflow-x:hidden;touch-action:manipulation;
  /* plain near-black page with a static paper grain (rendered once, no animation) */
  background-image:var(--grain),var(--page-glow);background-repeat:repeat,no-repeat;background-size:180px 180px,100% 100%}
button{-webkit-user-select:none;user-select:none}
input,textarea{-webkit-user-select:text;user-select:text}
/* iOS zooms into any field under 16px. Never go below. */
input,textarea,select{font-size:16px}
/* the hidden attribute always wins over a component's own display (toggle rows, buttons, sections) */
[hidden]{display:none!important}
:root{
  --grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .032 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  --status-band:var(--page);
}
[data-theme="light"]{
  --grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .2 0 0 0 0 .16 0 0 0 0 .05 0 0 0 .05 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  /* iOS keeps a white status bar (UIStatusBarStyleLightContent), so cream themes
     keep an ink band under it. On the web the top inset is 0 and the band vanishes. */
  --status-band:var(--c-ink);
}
@media (prefers-color-scheme:light){[data-theme="auto"]{--status-band:var(--c-ink)}}

/* Visible focus everywhere (keyboard users), ink on paper, accent on Noir */
:focus-visible{outline:2px solid var(--focus);outline-offset:3px;border-radius:var(--r1)}
.tab:focus-visible{outline-offset:-2px}

/* ===================== 1. Header ===================== */
.appbar{position:fixed;top:0;left:0;right:0;z-index:20;display:block;height:auto;gap:0;
  padding:var(--sat) env(safe-area-inset-right,0px) 0 env(safe-area-inset-left,0px);
  background:linear-gradient(var(--status-band) 0 var(--sat),transparent 0),var(--grain),var(--page);background-size:auto,180px 180px,auto;
  border-bottom:var(--hair) solid transparent;transition:border-color var(--d1)}
.appbar.is-scrolled{border-bottom-color:var(--rule)}
.appbar__in{display:flex;align-items:center;gap:2px;height:var(--appbar-h);max-width:var(--app-w);margin:0 auto;padding:0 6px 0 4px}
.appbar__logo{border-radius:var(--r1)}
.appbar__logo:active .pipsa{transform:rotate(-8deg) scale(.94)}
.appbar__logo .pipsa{transition:transform var(--d2) var(--ease-stick)}
.statpair{gap:0;padding:0;height:var(--tap)}
.statpair .stat{height:var(--tap);padding:0 9px;border-radius:var(--r1);color:var(--fg)}
.statpair .stat:active{transform:scale(.94)}
.stat__v{min-width:1ch}
.langbtn{color:var(--fg)}
.langbtn:active,.iconbtn:active{transform:scale(.92)}
/* narrow phones (320: iPhone SE / mini with Display Zoom; 360: small Android): a tighter row so the
   help and settings buttons stay on screen with 5-digit points. Every target keeps its 44px height. */
@media (max-width:374px){
  .appbar__in{gap:0;padding:0 2px 0 0}
  .appbar__logo{width:40px}
  .statpair .stat{padding:0 5px}
  .statpair__sep{display:none}
}
@media (max-width:359px){
  .statpair .stat{padding:0 4px;font-size:14px}
  .statpair .stat .ic{width:17px;height:17px}
  /* the help button needs the room: the theme stays one tap away in Settings */
  #tB{display:none}
}
/* points counter bump after earning points (aP adds .sf) */
.sf{animation:sB .4s var(--ease-stick)}
@keyframes sB{0%{transform:scale(1)}30%{transform:scale(1.18) rotate(-3deg)}100%{transform:none}}

/* ===================== 2. Page layout ===================== */
.main{position:relative;z-index:1;max-width:var(--app-w);margin:0 auto;
  padding:calc(var(--hdr-h) + var(--st) + var(--s4)) env(safe-area-inset-right,0px) calc(var(--tab-h) + var(--sb) + var(--s8)) env(safe-area-inset-left,0px);
  /* Nothing may stick out sideways, not even for a frame: a tilted card mid-animation (anim-stick scales it up)
     made mobile browsers widen the layout viewport (428 → 435 px), so the fixed splash grew wider than the screen
     and window.innerHeight grew with it, which pinned the tab bar above the bottom. body's overflow-x:hidden goes
     to the viewport and does not stop that; clip (not hidden) keeps .main from becoming a scroll container, so
     the sticky docks inside the views still work. */
  overflow-x:clip}
/* keyboard open: the tab bar is hidden (init.js), drop its reservation */
body.kbOpen .main{padding-bottom:calc(var(--sb) + var(--s5))!important}
.view{display:none;padding:0 var(--gutter)}
.view.active{display:block;animation:view-in var(--d2) var(--ease-out)}
@keyframes view-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
/* golden-mockup blocks inside a view: the view already carries the gutter */
.view>.mast,.view>.sec,.view>.pad{padding-left:0;padding-right:0}
.view>.mast{padding-top:var(--s4)}
/* old templates stack cards with a bottom margin; specificity 0 so new layouts win */
:where(.view) :where(.card){margin-bottom:var(--s4)}

/* ===================== 3. Tab bar ===================== */
/* The <nav> is the fixed bar (JS-owned: style.display/bottom). Never transform it. */
.tabs.tabbar{position:fixed;left:0;right:0;bottom:0;z-index:30;display:block;
  padding:0 env(safe-area-inset-right,0px) var(--sab) env(safe-area-inset-left,0px);
  background:var(--grain),var(--page);background-size:180px 180px,auto;border-top:var(--hair) solid var(--rule)}
.tabbar__in{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));max-width:var(--app-w);margin:0 auto;padding:4px 2px 0}
.tabs .tab{position:relative;width:100%;font:inherit;-webkit-tap-highlight-color:transparent}
/* one line, never broken inside a word (the data carries soft hyphens in "Uppgifter", "Aufgaben"); a label
   that is a hair too wide stays centred under its icon */
.tabs .tab__l{max-width:none;font-size:var(--t-tab);white-space:nowrap;overflow-wrap:normal;-webkit-hyphens:none;hyphens:none}
/* narrow phones: each label gets a sixth of the width. The row drops its side padding, the tracking tightens and
   the size follows the width, so the widest label (fi "Tapaukset" in the active weight) fits down to 320 px. */
@media (max-width:389px){
  .tabbar__in{padding-left:0;padding-right:0}
  .tabs .tab{padding-left:0;padding-right:0}
  .tabs .tab__l{font-size:min(var(--t-tab),3.1vw);letter-spacing:-.03em}
}
/* active tab: icon on a tilted post-it (sw() sets .on + aria-selected) */
.tab.on,.tab[aria-selected="true"]{color:var(--fg)}
.tab.on .tab__l,.tab[aria-selected="true"] .tab__l{font-weight:var(--w-heavy)}
.tab.on .tab__ic,.tab[aria-selected="true"] .tab__ic{background:var(--accent-paper);color:var(--on-accent);transform:rotate(-4deg);box-shadow:0 3px 0 -1px var(--accent-lo)}
.tab.on:active .tab__ic{transform:rotate(-4deg) scale(.92)}

/* ===================== 4. Offline bar ===================== */
.offbar{position:fixed;top:calc(var(--st) + var(--hdr-h) + var(--s2));left:var(--s4);right:var(--s4);z-index:35;max-width:calc(var(--app-w) - 2 * var(--s4));margin:0 auto;
  padding:10px 14px;background:var(--inv-bg);color:var(--inv-fg);border-radius:var(--r1);box-shadow:var(--sh-toast);transform:rotate(-.6deg);
  font-family:var(--f-type);font-weight:700;font-size:var(--t-label);letter-spacing:.08em;text-transform:uppercase;text-align:center}

/* ===================== 5. Splash ===================== */
#splash{position:fixed;inset:0;z-index:99999;overflow:hidden;background:var(--c-ink);color:var(--c-white);cursor:pointer;
  transition:opacity .38s var(--ease-out),visibility 0s linear .38s;
  /* the splash is always Noir, whatever theme the user picked */
  --page:var(--c-ink);--bg:var(--c-ink);--fg:var(--c-white);--fg-2:rgba(255,255,255,.78);--fg-3:rgba(255,255,255,.62);--progress-track:rgba(255,255,255,.16);
  --accent:var(--c-yellow);--accent-paper:var(--c-yellow);--accent-lo:var(--c-yellow-lo);--paper:var(--c-cream);--tape-a:var(--c-tape-pink-a);--tape-b:var(--c-tape-pink-b)}
#splash.hide{opacity:0;visibility:hidden;pointer-events:none}
#splash .splash{height:100%;min-height:0;max-width:480px;margin:0 auto;padding-top:calc(var(--sat) + var(--s4))}
#splash .splash__stage{min-height:0;padding:var(--s5) 0 var(--s6)}
#splash .splash__note{width:min(248px,31vh);height:min(248px,31vh)}
#splash .splash__pipsa{width:70%;height:62%}
#splash .splash__word{font-size:clamp(40px,min(14.6vw,7.4vh),60px)}
#splash .splash__slip{max-width:340px}
#splash .slip blockquote{font-size:clamp(14px,2vh,16px);display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden}
#splash .splash__foot{margin-top:var(--s6)}
#splash .splash__load>i{animation-duration:1.6s}
#splash .ticker__g .ic{width:14px;height:14px;stroke-width:2.6}
@media (max-height:700px){
  #splash .splash__ticker{margin-top:0}
  #splash .splash__stage{padding:var(--s3) 0 var(--s4)}
  #splash .splash__slip{margin-top:var(--s4)}
  #splash .splash__foot{margin-top:var(--s4);gap:var(--s3)}
}
@media (max-height:600px){#splash .splash__slip{display:none}}

/* ===================== 6. Legacy modal base (settings #sM, paywall #pwM) ===================== */
.mb{display:none;position:fixed;inset:0;z-index:200;align-items:center;justify-content:center;padding:var(--s5);background:var(--scrim)}
.mb.show{display:flex}
.md{position:relative;width:100%;max-width:420px;max-height:90vh;max-height:90dvh;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;
  padding:var(--s6) var(--s5) var(--s5);background:var(--bg-raise);color:var(--fg);border:var(--hair) solid var(--rule);border-radius:var(--r-sheet);box-shadow:var(--sh-sheet);
  animation:sheet-in var(--d3) var(--ease-out) both}
.mt{margin:0 var(--s8) var(--s4) 0;font-weight:var(--w-black);font-size:24px;line-height:1.05;letter-spacing:-.01em;text-transform:uppercase}
.md label{display:block;margin-bottom:var(--s2);font-family:var(--f-type);font-weight:700;font-size:var(--t-label);line-height:1.3;letter-spacing:var(--tr-label);text-transform:uppercase;color:var(--fg-2)}
.md input{display:block;width:100%;min-height:52px;margin-bottom:var(--s4);padding:12px 14px;background:var(--bg);border:var(--line) solid var(--rule-2);border-radius:var(--r1);color:var(--fg);font-size:17px}
.md input:focus{outline:none;border-color:var(--fg);box-shadow:0 0 0 3px var(--focus)}
.mc{position:absolute;top:6px;right:6px;width:var(--tap);height:var(--tap);display:grid;place-items:center;color:var(--fg);border-radius:var(--r1);z-index:2}
.mc:active{transform:scale(.92)}
/* settings sheet sections: one hairline between groups */
.setsec{margin-top:var(--s5);padding-top:var(--s5);border-top:var(--hair) solid var(--rule)}
.setsec__hint{margin-top:var(--s2);font-size:var(--t-small);line-height:1.45;color:var(--fg-3)}
.setsec .btn{margin-top:var(--s2)}

/* ===================== 7. Onboarding overlay ===================== */
/* The overlay and its .onb layout live in ui.css. The shell part: the tab bar during the tour. */
/* during onboarding the tab bar is opaque and only the explained tab lights up */
body.onbActive .tabs{z-index:610}
body.onbActive .main,body.onbActive .appbar{visibility:hidden}
body.onbActive .tab.on:not(.onbHi){color:var(--fg-3)}
body.onbActive .tab.on:not(.onbHi) .tab__l{font-weight:600}
body.onbActive .tab.on:not(.onbHi) .tab__ic{background:none;color:inherit;transform:none;box-shadow:none}
.tab.onbHi{z-index:650;color:var(--fg)}
.tab.onbHi .tab__l{font-weight:var(--w-heavy)}
.tab.onbHi .tab__ic{background:var(--accent-paper);color:var(--on-accent);transform:rotate(-4deg);box-shadow:0 3px 0 -1px var(--accent-lo)}
.tab.onbHi::before{content:"";position:absolute;top:-14px;left:50%;width:0;height:0;margin-left:-8px;border-left:8px solid transparent;border-right:8px solid transparent;border-top:10px solid var(--accent);animation:onb-bob 1.2s var(--ease-out) infinite alternate}
@keyframes onb-bob{to{transform:translateY(-4px)}}

/* ===================== 8. Legacy shared classes (used by several features) ===================== */
/* Delete each rule when no template uses the class any more. */
/* Re-resolve the legacy aliases inside re-scoped paper / inverted surfaces */
.postit,.sticker,.diecut,.paper,.sheet--paper,.modal,.inv,.slip{
  --text:var(--fg);--text-dim:var(--fg-2);--text-muted:var(--fg-3);--card-border:var(--rule);--glass-b:var(--rule);--glass:transparent;--emerald:var(--ok-bg);--amber:var(--signal);--rose:var(--signal)}
/* card title / card subtitle */
.ct{margin-bottom:var(--s3);font-weight:var(--w-heavy);font-size:var(--t-h3);line-height:1.2;letter-spacing:-.005em;overflow-wrap:break-word;hyphens:auto}
.cs{margin-bottom:var(--s4);font-size:var(--t-body);line-height:1.5;color:var(--fg-2)}
/* buttons: .btn.bg = primary (yellow, ink text), .btn.bgl = ghost outline. Full width like before. */
.btn.bg,.btn.bgl{display:flex;width:100%}
.btn.bg{background:var(--cta-bg);color:var(--cta-fg);border-color:var(--cta-edge)}
.btn.bgl{border:var(--line) solid var(--rule-2);font-weight:var(--w-strong)}
.btn:disabled{opacity:.5;pointer-events:none}
/* small typewriter badges: .ba accent, .bam/.br signal, .be ok */
.badge{text-transform:uppercase}
.ba{color:var(--accent-text)}
.bam,.br{color:var(--signal)}
.be{color:var(--fg)}
/* answer options (daily dose #dO, recognition game #gO) → .opt look */
.bo{display:block;width:100%;min-height:56px;margin-bottom:var(--s2);padding:12px 14px;background:transparent;color:var(--fg);border:var(--line) solid var(--rule-2);border-radius:var(--r1);
  font-weight:600;font-size:16px;line-height:1.35;text-align:left;cursor:pointer;overflow-wrap:break-word;hyphens:auto;transition:background-color var(--d1),border-color var(--d1)}
.bo:active{transform:scale(.99)}
.bo.correct{background:var(--ok-bg);color:var(--ok-fg);border:var(--bold) solid var(--ok-bg)}
.bo.correct,.bo.correct *{color:var(--ok-fg)!important}
.bo.wrong{border:var(--bold) solid var(--signal);background:var(--signal-soft)}
.bo.narc{border:var(--bold) solid var(--signal)}
.bo:disabled{cursor:default;pointer-events:none}
.bo:disabled:not(.correct):not(.wrong):not(.narc){color:var(--fg-3);border-color:var(--rule)}
/* explanation after an answer (#dE daily, #gE game) */
.exp{display:none;margin-top:var(--s4);padding:var(--s4);background:var(--bg-raise);border:var(--hair) solid var(--rule);border-left:4px solid var(--accent);border-radius:var(--r1);font-size:15.5px;line-height:1.55;color:var(--fg-2)}
.exp.show{display:block;animation:view-in var(--d2) var(--ease-out)}
.et{margin-bottom:var(--s1);font-weight:var(--w-heavy);font-size:16px;line-height:1.3;color:var(--fg)}
/* lesson / tip box (#dP daily, simulator footer) */
.pb{margin-top:var(--s3);padding:var(--s3) var(--s4);background:var(--signal-soft);border-left:3px solid var(--signal);border-radius:var(--r1);font-size:14.5px;line-height:1.55;color:var(--fg-2)}
.pb strong{color:var(--fg)}
/* thin progress (level bar #lB2) → .bar look */
.pb2{position:relative;width:100%;height:6px;margin:var(--s2) 0;background:var(--progress-track);overflow:hidden}
.pf{height:100%;background:var(--progress);transition:width .6s var(--ease-out)}
/* range sliders (simulator level, spectrum) → .range look on a calm scale */
.st{position:relative;width:100%;height:2px;margin:26px 0 16px;background:var(--fg)}
.ss{-webkit-appearance:none;appearance:none;position:absolute;top:-21px;left:0;width:100%;height:44px;margin:0;background:transparent;cursor:pointer}
.ss::-webkit-slider-runnable-track{height:44px;background:transparent}
.ss::-webkit-slider-thumb{-webkit-appearance:none;width:30px;height:30px;margin-top:7px;background:var(--accent-paper);border:var(--bold) solid var(--on-accent);border-radius:var(--r1);transform:rotate(-5deg);box-shadow:0 3px 0 -1px var(--accent-lo);cursor:pointer}
.ss::-moz-range-thumb{width:28px;height:28px;background:var(--accent);border:var(--bold) solid var(--on-accent);border-radius:var(--r1)}
.ss::-moz-range-track{background:transparent}
.sl{display:flex;justify-content:space-between;gap:var(--s2);font-weight:600;font-size:12px;letter-spacing:.02em;color:var(--fg-3)}
/* level description (simulator #sLD, spectrum #spC) */
.sv{margin:var(--s3) 0;padding:var(--s3) var(--s4);background:var(--bg-raise);border:var(--hair) solid var(--rule);border-radius:var(--r1);font-size:15px;line-height:1.5;color:var(--fg-2);text-align:left}
.sv strong{display:block;font-size:17px;font-weight:var(--w-heavy);color:var(--fg)}
/* disclaimer line */
.disc{margin-top:var(--s4);padding:var(--s3) 0 0;border-top:var(--hair) solid var(--rule);font-size:13.5px;line-height:1.5;color:var(--fg-3);text-align:left}
/* loading dots (simulator, cases) */
.ad{display:flex;align-items:center;gap:6px;padding:var(--s5) 0}
.dot{width:8px;height:8px;background:var(--fg);border-radius:1px;animation:db 1.4s infinite ease-in-out}
.dot:nth-child(2){animation-delay:.16s}.dot:nth-child(3){animation-delay:.32s}
@keyframes db{0%,80%,100%{transform:scale(.3)}40%{transform:scale(1)}}

/* ===================== 9. Feedback layers (confetti, shake) ===================== */
.cfb{position:fixed;inset:0;z-index:300;pointer-events:none;overflow:hidden}
.cfp{position:absolute;top:-16px;border-radius:1px;box-shadow:var(--sh-sticker);animation:cfF 1.5s var(--ease-out) forwards}
@keyframes cfF{to{top:110vh;transform:rotate(540deg)}}
.shake{animation:shake .4s ease}
@keyframes shake{0%,100%{transform:translateX(0)}20%{transform:translateX(-6px)}40%{transform:translateX(6px)}60%{transform:translateX(-4px)}80%{transform:translateX(4px)}}

/* ===================== 10. Legacy JS overlays (inline-styled in old templates) ===================== */
/* Old celebration cards (milestone, batch, daily minute, all tasks) reuse the class name
   .celebrate, which components.css defines as a full-screen layout. They always carry an
   inline style; new markup never does. Keep the old cards cards until they are rebuilt. */
.celebrate[style]{min-height:0;display:block;isolation:auto;overflow:visible}
/* keyframes the old inline templates still reference by name (transform/opacity only) */
@keyframes celebrateIn{0%{opacity:0;transform:scale(.92) translateY(12px)}100%{opacity:1;transform:none}}
@keyframes celebrateFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
@keyframes achIn{from{opacity:0;transform:translateX(-50%) translateY(-24px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}
@keyframes toastIn{from{opacity:0;transform:translateX(-50%) translateY(-16px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}
@keyframes staggerIn{0%{opacity:0;transform:translateX(-12px)}100%{opacity:1;transform:none}}
@keyframes slideUp{0%{opacity:0;transform:translateY(16px)}100%{opacity:1;transform:none}}
@keyframes countUp{0%{opacity:0;transform:translateY(12px)}100%{opacity:1;transform:none}}
@keyframes scanLine{0%{top:0}100%{top:100%}}
@keyframes mirrorReflect{0%,100%{opacity:.12}50%{opacity:.06}}
@keyframes urgentPulse{0%,100%{opacity:1}}
@keyframes blurReveal{from{opacity:0}to{opacity:1}}

/* ===================== 11. Wide screens ===================== */
@media (min-width:700px){
  .mb{padding:var(--s7)}
}

/* ===================== 12. Motion safety (OS setting + in-app data-motion) ===================== */
@media (prefers-reduced-motion:reduce){
  .view.active,.exp.show,.md{animation:none!important}
  .tab.onbHi::before,.cfp{animation:none!important}
  .cfb{display:none}
  #splash{transition:none}
}
html[data-motion="reduce"] .cfb{display:none}
