/* =========================================================================
   PRAXIS NOTEBOOK - the "Notebook" skin for layouts/praxis-app.blade.php.
   Loads AFTER praxis.css + praxis-components.css and only acts under
   body.px-notebook (the layout adds the class unless UI_SKIN=classic), so
   leaving this file out gives back plain Praxis. Behaviour: dist/js/praxis-notebook.js.

   The metaphor: the app is a spiral-bound exercise book on a desk. The stage
   is the PAGE (dotted paper); every portal page has a sticky flag on the edge;
   cards are white sheets; tables are ruled; KPI tiles are sticky notes; titles
   carry a highlighter swipe; Caveat (--font-hand) is for annotations only.
   Mascot: Jot the sticky note (partials/jot.blade.php).

   Contents
     1. KIT        - components any page can use (.px-*): hero, rings, count-ups,
                     up-next, mastery rows, badges, mascot slot, toast, ripple.
     2. JOT + INK  - the Notebook look of those components, marking effects.
     3. SKIN       - Praxis components re-skinned (cards, tables, forms, modals...).
     4. SHELL      - desk, page, coils, flags, page turn, phone bar.
     5. PAGES      - calendar, popups (SweetAlert), inline alerts, auth pages, chat
                     and other page-level pieces.

   Teacher "Quiet mode" = body.px-quiet (no mascot, motion, texture or sound).
   Maths: codecogs <img> glyphs and inline-styled .vle-frac spans are never
   resized or re-coloured here - keep it that way.
   ========================================================================= */

/* ######################################################################
   1. KIT
   ###################################################################### */
:root{
  /* motion tokens - themes override these */
  --px-ease:cubic-bezier(.2,.7,.2,1);
  --px-spring:cubic-bezier(.34,1.45,.64,1);
  --px-fast:160ms;
  --px-med:340ms;
  --px-slow:700ms;
  /* colour hooks */
  --px-ring:var(--accent);
  --px-hero-bg:var(--surface);
  --px-hero-border:var(--line);
  --px-bar:var(--accent);
}

/* ---- the pill group in the top bar: Quiet / Sound / compact flags ---- */
.px-switch{ display:inline-flex; align-items:center; gap:3px; padding:4px; border-radius:999px; background:var(--surface); border:1px solid var(--line); box-shadow:var(--shadow-sm); }
.px-switch a,.px-switch button{ display:inline-flex; align-items:center; gap:6px; height:34px; padding:0 13px; border-radius:999px; font-size:12.5px; font-weight:700; color:var(--ink-muted); text-decoration:none; white-space:nowrap; transition:background var(--px-fast),color var(--px-fast); }
.px-switch a:hover,.px-switch button:hover{ background:var(--surface-2); color:var(--ink); }
.px-switch .is-active{ background:var(--ink); color:var(--paper); }
.px-switch-home{ width:34px; padding:0 !important; justify-content:center; }
.px-switch-quiet{ border-left:1px solid var(--line); border-radius:0 999px 999px 0 !important; margin-left:2px; }
.px-switch-quiet.is-active{ background:var(--blue-tint); color:#2C6F8E; }
.px-switch .short{ display:none; }
@media(max-width:1180px){ .px-switch .full{ display:none; } .px-switch .short{ display:inline; } .px-switch a,.px-switch button{ padding:0 11px; } }

/* ---- staggered entrance ---- */
.px-reveal{ opacity:0; transform:translateY(14px); }
.px-reveal.in{ opacity:1; transform:none; transition:opacity var(--px-med) var(--px-ease),transform var(--px-med) var(--px-ease); }

/* ---- hover lift / press (only on things you can click) ---- */
.px-lift{ transition:transform var(--px-fast) var(--px-ease),box-shadow var(--px-fast) var(--px-ease),border-color var(--px-fast); }
.px-lift:hover{ transform:translateY(-2px); box-shadow:var(--shadow-md); }
.px-lift:active{ transform:translateY(0) scale(.99); }
body[class*="px-"] .btn:active{ transform:scale(.97); }
body[class*="px-"] .btn-primary:hover{ transform:translateY(-1px); box-shadow:0 10px 24px rgba(255,87,52,.36); }
.px-cta-meta{ opacity:.78; font-weight:500; font-size:12px; margin-left:2px; }

/* ---- small uppercase tag for "proposed / needs data" notes ---- */
.px-tag{ display:inline-flex; align-items:center; gap:6px; font-size:10.5px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--accent-strong); background:var(--accent-tint); border-radius:999px; padding:3px 9px; vertical-align:middle; }
.px-tag.muted{ color:var(--ink-muted); background:var(--surface-inset); }
.px-note{ font-size:12.5px; color:var(--ink-faint); text-align:center; padding:14px 20px 22px; line-height:1.6; }

/* =========================================================================
   HERO - "what do I do now" strip: mascot + greeting + 2 CTAs + streak/goal
   ========================================================================= */
.px-hero{ position:relative; overflow:hidden; display:grid; grid-template-columns:auto 1fr auto; gap:22px; align-items:center; padding:24px 28px; margin:6px 0 20px; border-radius:var(--r-xl); background:var(--px-hero-bg); border:1px solid var(--px-hero-border); min-height:172px; }
.px-hero > *{ position:relative; z-index:1; }
/* the art layer is a backdrop, never a grid cell - the selector must out-rank `.px-hero > *` above */
.px-hero > .px-hero-art{ position:absolute; inset:0; pointer-events:none; z-index:0; }
.px-hero-art svg{ width:100%; height:100%; }
.px-hero-mascot{ width:132px; flex:none; }
.px-hero-eyebrow{ margin-bottom:6px; }
.px-hero-title{ font-size:28px; letter-spacing:-.02em; }
.px-hero-sub{ color:var(--ink-2); font-size:15px; margin-top:6px; max-width:560px; line-height:1.55; }
.px-hero-sub b{ color:var(--ink); }
.px-hero-actions{ display:flex; gap:10px; flex-wrap:wrap; margin-top:16px; }
.px-hero-side{ display:flex; flex-direction:column; gap:12px; align-items:stretch; }

.px-streak{ display:flex; align-items:center; gap:12px; padding:12px 16px; border-radius:var(--r-lg); background:var(--surface); border:1px solid var(--line); min-width:150px; }
.px-streak .px-flame{ font-size:26px; color:var(--accent); line-height:1; }
.px-streak b{ display:block; font-size:26px; line-height:1; letter-spacing:-.02em; }
.px-streak span{ display:block; font-size:12px; color:var(--ink-muted); margin-top:3px; }
.px-goal{ display:flex; align-items:center; gap:12px; padding:10px 16px; border-radius:var(--r-lg); background:var(--surface); border:1px solid var(--line); }
.px-goal .px-goal-txt b{ display:block; font-size:14px; }
.px-goal .px-goal-txt span{ font-size:12px; color:var(--ink-muted); }

/* =========================================================================
   PROGRESS RING  <div class="px-ring" data-pct="68" data-size="84" data-w="9" data-label="68%">
   ========================================================================= */
.px-ring{ position:relative; width:var(--size,84px); height:var(--size,84px); flex:none; }
.px-ring svg{ width:100%; height:100%; transform:rotate(-90deg); overflow:visible; }
.px-ring circle{ fill:none; }
.px-ring .track{ stroke:var(--surface-inset); }
.px-ring .bar{ stroke:var(--px-ring); stroke-linecap:round; transition:stroke-dashoffset var(--px-slow) var(--px-ease); }
.px-ring .val{ position:absolute; inset:0; display:grid; place-items:center; font-weight:700; font-size:15px; letter-spacing:-.01em; }
.px-ring.lg .val{ font-size:30px; }
.px-ring.lg .val small{ font-size:14px; color:var(--ink-muted); font-weight:600; margin-left:1px; }
.px-ring-wrap{ display:flex; flex-direction:column; align-items:center; gap:10px; padding:14px 20px 20px; text-align:center; }
.px-ring-wrap p{ font-size:12.5px; color:var(--ink-muted); line-height:1.5; }

/* =========================================================================
   KPI tiles - reuse praxis .kpi, add a faded background glyph + count-up
   ========================================================================= */
.px-kpis .kpi{ position:relative; overflow:hidden; }
.px-kpis .kpi-bg{ position:absolute; right:-8px; bottom:-14px; font-size:88px; opacity:.11; transform:rotate(-12deg); pointer-events:none; }
.px-kpis .kpi-delta{ display:inline-flex; align-items:center; gap:4px; }

/* =========================================================================
   UP NEXT list
   ========================================================================= */
.px-next{ display:flex; flex-direction:column; }
.px-next-row{ display:flex; align-items:center; gap:14px; padding:13px 0; border-bottom:1px solid var(--line); text-decoration:none; color:inherit; border-radius:10px; transition:background var(--px-fast); }
.px-next-row:last-child{ border-bottom:0; }
.px-next-row:hover{ background:var(--surface-2); }
.px-next-row:hover .px-next-go{ transform:translateX(3px); color:var(--accent); }
.px-next-ico{ width:42px; height:42px; border-radius:13px; flex:none; display:grid; place-items:center; font-size:17px; }
.px-next-main{ flex:1; min-width:0; }
.px-next-title{ display:block; font-weight:700; font-size:14.5px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.px-next-meta{ display:block; font-size:12px; color:var(--ink-muted); margin-top:2px; }
.px-mini{ display:block; height:6px; border-radius:999px; background:var(--surface-inset); overflow:hidden; margin-top:8px; max-width:260px; }
.px-mini i{ display:block; height:100%; width:0; border-radius:999px; background:var(--px-bar); transition:width var(--px-slow) var(--px-ease); }
.px-due{ flex:none; font-size:11.5px; font-weight:700; padding:5px 10px; border-radius:999px; white-space:nowrap; }
.px-due.soon{ background:var(--accent-tint); color:var(--accent-strong); }
.px-due.ok{ background:var(--blue-tint); color:#2C6F8E; }
.px-due.late{ background:var(--bad-tint); color:var(--bad-ink); }
.px-due.done{ background:var(--good-tint); color:var(--good-ink); }
.px-next-go{ color:var(--ink-faint); font-size:13px; transition:transform var(--px-fast) var(--px-ease),color var(--px-fast); }

/* =========================================================================
   TOPIC MASTERY  rows render their visual via the theme (PX.theme.renderMastery)
   ========================================================================= */
.px-mastery{ display:flex; flex-direction:column; }
.px-mastery-row{ display:grid; grid-template-columns:minmax(100px,170px) 1fr auto; gap:14px; align-items:center; padding:11px 0; border-bottom:1px solid var(--line); }
.px-mastery-row:last-child{ border-bottom:0; }
.px-mastery-name{ font-weight:600; font-size:13.5px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.px-mastery-name small{ display:block; font-weight:500; font-size:11.5px; color:var(--ink-faint); }
.px-mastery-vis{ display:flex; align-items:center; min-height:26px; min-width:0; }
.px-mastery-pct{ font-weight:700; font-size:13.5px; min-width:42px; text-align:right; }
.px-bar{ flex:1; height:10px; border-radius:999px; background:var(--surface-inset); overflow:hidden; }
.px-bar i{ display:block; height:100%; width:0; border-radius:999px; background:var(--px-bar); transition:width var(--px-slow) var(--px-ease); }

/* =========================================================================
   ACHIEVEMENTS / BADGES
   ========================================================================= */
.px-badges{ display:grid; grid-template-columns:repeat(auto-fill,minmax(96px,1fr)); gap:14px 10px; padding:4px 0 6px; }
.px-badge{ text-align:center; }
.px-badge-ico{ width:62px; height:62px; border-radius:20px; display:grid; place-items:center; margin:0 auto 8px; font-size:24px; position:relative; transition:transform var(--px-fast) var(--px-spring); }
.px-badge:hover .px-badge-ico{ transform:translateY(-3px) rotate(-4deg); }
.px-badge-name{ font-weight:700; font-size:12.5px; line-height:1.3; }
.px-badge-sub{ font-size:11px; color:var(--ink-faint); margin-top:2px; }
.px-badge.locked .px-badge-ico{ background:var(--surface-inset) !important; color:var(--ink-faint) !important; }
.px-badge.locked .px-badge-name{ color:var(--ink-muted); }
.px-badge.new .px-badge-ico::after{ content:"NEW"; position:absolute; top:-7px; right:-9px; font-size:9px; font-weight:800; letter-spacing:.04em; background:var(--accent); color:#fff; border-radius:999px; padding:2px 6px; box-shadow:0 0 0 2px var(--surface); }

/* =========================================================================
   ILLUSTRATED EMPTY STATE
   ========================================================================= */
.px-empty{ display:flex; flex-direction:column; align-items:center; text-align:center; gap:6px; padding:18px 16px 10px; }
.px-empty strong{ font-size:15px; margin-top:6px; }
.px-empty p{ font-size:13px; color:var(--ink-muted); line-height:1.55; max-width:300px; }
.px-empty .btn{ margin-top:8px; }

/* =========================================================================
   MASCOT - one inline SVG, four moods toggled by data-mood on the <svg>.
   Parts tagged data-for="happy celebrating" etc. only show in those moods.
   Themes supply the drawing (PX.theme.mascot) and idle animations.
   ========================================================================= */
.px-mascot-slot{ display:block; line-height:0; }
.px-mascot-slot svg{ width:100%; height:auto; overflow:visible; display:block; }
.px-mascot [data-for]{ display:none; }
.px-mascot[data-mood="happy"] [data-for~="happy"],
.px-mascot[data-mood="thinking"] [data-for~="thinking"],
.px-mascot[data-mood="celebrating"] [data-for~="celebrating"],
.px-mascot[data-mood="sleepy"] [data-for~="sleepy"]{ display:inline; }
.px-mascot *{ transform-box:fill-box; transform-origin:center; }
.px-mascot .m-blink{ animation:px-blink 5.2s infinite; }
.px-mascot .m-twinkle{ animation:px-twinkle 1.1s ease-in-out infinite alternate; }
.px-mascot .m-twinkle:nth-child(2n){ animation-delay:.35s; }
.px-mascot .m-twinkle:nth-child(3n){ animation-delay:.7s; }
.px-mascot .m-zz{ animation:px-zz 2.4s ease-in-out infinite; }
.px-mascot .m-zz:nth-child(2n){ animation-delay:.8s; }
.px-mascot .m-think{ animation:px-think 1.6s ease-in-out infinite; }
@keyframes px-blink{ 0%,93%,100%{ transform:scaleY(1); } 96%{ transform:scaleY(.08); } }
@keyframes px-twinkle{ from{ opacity:.25; transform:scale(.7) rotate(0deg); } to{ opacity:1; transform:scale(1.1) rotate(25deg); } }
@keyframes px-zz{ 0%{ opacity:0; transform:translate(0,0) scale(.8); } 30%{ opacity:1; } 100%{ opacity:0; transform:translate(10px,-18px) scale(1.15); } }
@keyframes px-think{ 0%,100%{ opacity:.35; } 50%{ opacity:1; } }

/* =========================================================================
   PRACTICE - session bar, question card bits, hint, companion, shake
   ========================================================================= */
.px-crumb{ font-size:12.5px; font-weight:600; color:var(--ink-muted); margin-bottom:2px; }
.px-crumb a{ color:var(--ink-muted); text-decoration:none; }
.px-crumb i{ font-size:10px; margin:0 4px; }
.px-session{ display:flex; align-items:center; gap:14px; margin-bottom:20px; }
.px-session .progress{ max-width:520px; position:relative; }
.px-session .progress i{ background:var(--px-bar); }
.px-session .session-count{ display:inline-flex; align-items:center; gap:7px; }
.px-timer-low{ color:var(--bad-ink) !important; border-color:var(--bad) !important; }

.px-stem{ font-size:20px; font-weight:600; line-height:1.5; margin-bottom:18px; color:var(--ink); }
.px-stem p{ margin:0; }
/* maths glyphs: natural size, aligned to the text baseline band - never floored (see praxis-components.css) */
.px-stem img[src*="latex.codecogs.com"], .ans .txt img[src*="latex.codecogs.com"]{ vertical-align:middle; max-width:100%; height:auto; }
.px-stem .vle-frac{ font-size:.86em; }
.ans .state i{ font-size:20px; }
.ans .txt .vle-frac{ font-size:.9em; }
.ans.is-picked{ transform:translateX(3px); }

.px-hint{ margin-top:18px; }
.px-hint-btn{ display:inline-flex; align-items:center; gap:8px; padding:9px 14px; border-radius:var(--r-md); border:1.5px solid var(--line-strong); background:var(--surface); font-weight:600; font-size:13.5px; color:var(--ink-2); transition:background var(--px-fast),border-color var(--px-fast); }
.px-hint-btn:hover{ background:var(--yellow-tint); border-color:var(--yellow); }
.px-hint-btn i{ color:var(--warn-ink); }
.px-hint-body{ display:none; margin-top:10px; font-size:14.5px; line-height:1.55; color:var(--ink-2); background:var(--yellow-tint); border-left:3px solid var(--yellow); border-radius:0 10px 10px 0; padding:12px 14px; }
.px-hint.open .px-hint-body{ display:flex; gap:12px; align-items:flex-start; animation:rise .3s var(--px-ease); }
.px-hint-body .px-mascot-slot{ width:44px; flex:none; }

.feedback .fb-head i{ font-size:22px; }
.feedback .fb-actions{ display:flex; gap:10px; margin-top:12px; flex-wrap:wrap; }
.q-foot .px-check[disabled]{ opacity:.5; cursor:not-allowed; box-shadow:none; }

@keyframes px-shake{ 10%,90%{ transform:translateX(-1px); } 20%,80%{ transform:translateX(2px); } 30%,50%,70%{ transform:translateX(-4px); } 40%,60%{ transform:translateX(4px); } }
.px-shaking{ animation:px-shake .45s cubic-bezier(.36,.07,.19,.97) both; }
@keyframes px-pop{ 0%{ transform:scale(1); } 40%{ transform:scale(1.06); } 100%{ transform:scale(1); } }
.px-popping{ animation:px-pop .38s var(--px-spring) both; }

/* companion = the mascot speaking */
.px-companion .px-comp-head{ display:flex; align-items:center; gap:10px; margin-bottom:12px; }
.px-comp-avatar{ width:46px; flex:none; }
.px-comp-sub{ font-size:11.5px; color:var(--ink-muted); }
.px-comp-msg{ position:relative; font-size:13.5px; line-height:1.5; color:var(--ink-2); background:var(--surface-2); border-radius:14px; padding:11px 13px; }
.px-comp-msg::before{ content:""; position:absolute; top:-7px; left:16px; width:12px; height:12px; background:var(--surface-2); transform:rotate(45deg); border-radius:2px; }
.px-ladder{ display:flex; gap:6px; margin-top:12px; }
.px-rung{ flex:1; padding:8px 6px; border-radius:10px; border:1.5px solid var(--line); background:var(--surface); font-size:11.5px; font-weight:700; color:var(--ink-muted); line-height:1.2; transition:all var(--px-fast); }
.px-rung:hover{ border-color:var(--line-strong); color:var(--ink); }
.px-rung.is-active{ border-color:var(--accent); background:var(--accent-tint); color:var(--accent-strong); }
.px-rung .n{ display:block; font-size:9.5px; opacity:.7; letter-spacing:.06em; text-transform:uppercase; }

/* written-answer card helpers (the real page has Text / Draw + a working box) */
.px-work{ border:1.5px dashed var(--line-strong); border-radius:var(--r-lg); background:var(--surface-2); padding:14px 16px; margin-bottom:16px; }
.px-work-head{ display:flex; align-items:center; gap:8px; font-weight:600; font-size:13px; color:var(--ink-muted); margin-bottom:10px; }
.px-work-head .req{ margin-left:auto; font-size:11px; font-weight:700; color:var(--accent-strong); background:var(--accent-tint); border-radius:999px; padding:3px 9px; }
.px-work-canvas{ height:132px; border-radius:var(--r-md); background:var(--surface) repeating-linear-gradient(0deg,transparent,transparent 27px,var(--line) 28px); border:1px solid var(--line); position:relative; overflow:hidden; }
.px-work-canvas svg{ position:absolute; inset:0; width:100%; height:100%; }
.px-modebar{ display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:12px; flex-wrap:wrap; }
.px-modebar label{ font-weight:600; font-size:15px; }
.px-modebar .seg{ width:200px; }
.px-modebar .seg button.is-active{ background:var(--surface); box-shadow:var(--shadow-sm); color:var(--ink); }

/* reward card on the practice page = each direction's "why keep going" surface */
.px-side{ min-width:0; }
.px-reward .px-reward-top{ display:flex; align-items:center; gap:12px; }
.px-reward .px-side-mascot{ width:84px; flex:none; cursor:pointer; }
.px-reward-copy strong{ display:block; font-size:16px; letter-spacing:-.01em; }
.px-reward-copy p{ font-size:12.5px; opacity:.82; margin-top:3px; line-height:1.45; }
.px-reward-stats{ margin-top:14px; }
.px-mastery-legend{ font-size:11.5px; color:var(--ink-faint); padding:10px 0 4px; line-height:1.5; }

/* =========================================================================
   INTERACTION LAYER - ink ripple, keyboard hints, sketch canvas, sparklines
   ========================================================================= */
.px-rippling{ overflow:hidden; }
.px-rippling-rel{ position:relative; }      /* only added to elements that are position:static (see praxis-notebook.js) */
.px-ripple{ position:absolute; border-radius:50%; background:currentColor; opacity:.16; transform:scale(0); pointer-events:none; animation:px-ripple .5s var(--px-ease) forwards; }
@keyframes px-ripple{ to{ transform:scale(1); opacity:0; } }
.px-keys{ display:flex; gap:12px; flex-wrap:wrap; font-size:12px; color:var(--ink-faint); margin-top:12px; align-items:center; }
.px-keys kbd{ font:inherit; font-weight:700; font-size:11.5px; color:var(--ink-2); border:1px solid var(--line-strong); border-bottom-width:2px; border-radius:5px; padding:1px 7px; background:var(--surface); }
.px-work-canvas[data-sketch]{ touch-action:none; cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='26' height='26' viewBox='0 0 24 24'%3E%3Cpath d='M3 21l3.5-1 11-11-2.5-2.5-11 11z' fill='%23FCCC42' stroke='%231E2433' stroke-width='1.4'/%3E%3Cpath d='M15 6.5l2.5 2.5' stroke='%231E2433' stroke-width='1.4'/%3E%3C/svg%3E") 2 24, crosshair; }
.px-work-canvas[data-tool="erase"]{ cursor:cell; }
.px-work-canvas canvas{ position:absolute; inset:0; width:100%; height:100%; display:block; z-index:1; }
.px-work-canvas.has-ink{ border-color:var(--line-strong); }
.px-sketch-tools{ display:flex; gap:8px; margin-top:10px; align-items:center; }
.px-sketch-tools .tbtn{ width:34px; height:34px; border-radius:9px; border:1.5px solid var(--line); background:var(--surface); color:var(--ink-muted); display:grid; place-items:center; cursor:pointer; transition:all var(--px-fast); }
.px-sketch-tools .tbtn:hover{ border-color:var(--line-strong); color:var(--ink); }
.px-sketch-tools .tbtn.is-active{ border-color:var(--accent); color:var(--accent-strong); background:var(--accent-tint); }
.px-sketch-tools .hint{ margin-left:auto; font-size:11.5px; color:var(--ink-faint); }
.px-spark{ display:inline-block; vertical-align:middle; line-height:0; }

/* =========================================================================
   TOAST + FX LAYER (celebrations draw here, above everything, never block clicks)
   ========================================================================= */
.px-toast{ position:fixed; left:50%; bottom:30px; z-index:2110; transform:translate(-50%,16px); opacity:0; background:var(--ink); color:var(--paper); padding:12px 18px 12px 14px; border-radius:16px; font-weight:600; font-size:14px; box-shadow:var(--shadow-lg); display:flex; align-items:center; gap:11px; pointer-events:none; transition:transform var(--px-med) var(--px-spring),opacity var(--px-med); max-width:calc(100vw - 32px); }
.px-toast.show{ transform:translate(-50%,0); opacity:1; }
.px-toast .px-mascot-slot{ width:34px; flex:none; }
.px-toast b{ color:var(--yellow); }
.px-fx{ position:fixed; inset:0; pointer-events:none; z-index:2100; overflow:hidden; }
.px-particle{ position:absolute; will-change:transform,opacity; }
.px-float{ position:fixed; z-index:2111; pointer-events:none; font-weight:800; font-size:20px; letter-spacing:-.01em; color:var(--accent-strong); text-shadow:0 2px 0 #fff; }

/* =========================================================================
   QUIET MODE (teachers; also useful for students who find it too much).
   Same skin, no idle motion, no celebrations, mascot only in empty states.
   ========================================================================= */
.px-quiet .px-hero-mascot, .px-quiet .px-hero-art{ display:none; }
.px-quiet .px-hero{ grid-template-columns:1fr auto; background:var(--surface); }
.px-quiet .px-mascot *{ animation:none !important; }
.px-quiet .px-idle{ animation:none !important; }
.px-quiet .px-reveal.in{ transition-duration:.18s; transition-delay:0ms !important; }
.px-quiet .px-badge:hover .px-badge-ico{ transform:none; }
.px-quiet .px-kpis .kpi-bg{ display:none; }

/* =========================================================================
   RESPONSIVE
   ========================================================================= */
/* once the tiles drop under the text, the doodles would sit behind the sentence: put them away */
@media(max-width:1120px){ .px-hero > .px-hero-art{ display:none; } }
/* phones centre the text, so the red margin line would run straight through it */
@media(max-width:900px){ body.px-notebook .px-hero::after{ display:none; } }
@media(max-width:1120px){ .px-hero{ grid-template-columns:auto 1fr; } .px-hero-side{ grid-column:1 / -1; flex-direction:row; flex-wrap:wrap; } .px-streak,.px-goal{ flex:1; } }
@media(max-width:900px){
  .px-hero{ grid-template-columns:1fr; text-align:center; padding:22px 18px; }
  .px-hero-mascot{ margin:0 auto; width:112px; }
  .px-hero-sub{ margin-left:auto; margin-right:auto; }
  .px-hero-actions{ justify-content:center; }
  .px-hero-actions .btn{ width:100%; }
  .px-hero-side{ justify-content:center; }
  .px-streak,.px-goal{ justify-content:center; }
  .px-mastery-row{ grid-template-columns:minmax(86px,110px) 1fr auto; gap:10px; }
  .px-toast{ bottom:auto; top:70px; }
}
@media(max-width:560px){
  .px-hero-side{ flex-direction:column; }
  .px-streak,.px-goal{ justify-content:flex-start; }
  .px-hero-title{ font-size:23px; }
  .px-hero-sub{ font-size:14px; }
  .px-stem{ font-size:18px; }
  .px-badges{ grid-template-columns:repeat(3,1fr); }
  .px-switch .is-active .short{ display:inline; }
  .px-ladder{ flex-direction:column; }
}

/* ######################################################################
   2. JOT + INK
   ###################################################################### */
body.px-notebook{
  --nb-ink:#1E2433; --nb-pen:#2C6F8E; --nb-pen-tint:#E6F1F7; --nb-red:#D63A2F; --nb-green:#2E8B57;
  --nb-hl:rgba(252,204,66,.72); --nb-paper:#FFFDF7; --nb-grid:rgba(44,111,142,.13);
  --font-hand:"Caveat","Segoe Print","Bradley Hand",cursive;
  --px-ease:cubic-bezier(.3,.7,.3,1); --px-spring:cubic-bezier(.3,1.25,.5,1); --px-med:380ms; --px-slow:800ms;
  --px-ring:var(--nb-pen); --px-bar:var(--nb-pen);
  --px-hero-bg:var(--nb-paper); --px-hero-border:#E3DFD3;
  --r-xl:18px; --r-lg:14px; --r-md:10px;
}
body.px-notebook .card{ box-shadow:0 1px 0 rgba(30,36,51,.04),0 10px 24px rgba(30,36,51,.05); border-color:#E6E2D8; }
.nb-hand{ font-family:var(--font-hand); }

/* ---- hero = a page of an exercise book: graph paper, red margin, doodles ---- */
body.px-notebook .px-hero{ background-color:var(--nb-paper); background-image:linear-gradient(var(--nb-grid) 1px,transparent 1px),linear-gradient(90deg,var(--nb-grid) 1px,transparent 1px); background-size:22px 22px; background-position:-1px -1px; min-height:192px; }
body.px-notebook .px-hero::after{ content:""; position:absolute; top:0; bottom:0; left:56px; width:2px; background:rgba(214,58,47,.32); z-index:0; }
body.px-notebook .px-hero-eyebrow{ font-family:var(--font-hand); font-size:19px; letter-spacing:0; text-transform:none; color:var(--nb-pen); font-weight:700; }
body.px-notebook .px-hero-title{ color:var(--nb-ink); }
body.px-notebook .px-hero-title em{ font-style:normal; background:linear-gradient(transparent 56%,var(--nb-hl) 56%,var(--nb-hl) 94%,transparent 94%); padding:0 4px; margin:0 -2px; }
body.px-notebook .px-hero-sub b{ border-bottom:3px solid var(--accent); }
body.px-notebook .px-streak,body.px-notebook .px-goal{ background:#fff; border-color:#E3DFD3; box-shadow:2px 3px 0 rgba(30,36,51,.06); }
body.px-notebook .px-streak b{ font-family:var(--font-hand); font-size:34px; color:var(--nb-pen); }
.nb-art{ position:absolute; inset:0; width:100%; height:100%; }
.nb-draw{ stroke-dasharray:1; stroke-dashoffset:1; animation:nb-draw 1.6s var(--px-ease) forwards; }
.nb-draw.d1{ animation-delay:.3s; } .nb-draw.d2{ animation-delay:.6s; } .nb-draw.d3{ animation-delay:.9s; } .nb-draw.d4{ animation-delay:1.2s; }
@keyframes nb-draw{ to{ stroke-dashoffset:0; } }
.nb-plane{ animation:nb-plane 9s ease-in-out infinite alternate; }
@keyframes nb-plane{ from{ transform:translate(0,0) rotate(0); } to{ transform:translate(26px,-10px) rotate(-4deg); } }

/* ---- KPI tiles become sticky notes (tape, slight rotation, straighten on hover) ---- */
body.px-notebook .px-kpis .kpi{ border-radius:3px; overflow:visible; box-shadow:0 12px 22px rgba(30,36,51,.1),0 2px 4px rgba(30,36,51,.06); transform:rotate(-.7deg); }
body.px-notebook .px-kpis .kpi:nth-child(2){ transform:rotate(.6deg); }
body.px-notebook .px-kpis .kpi:nth-child(3){ transform:rotate(-.4deg); }
body.px-notebook .px-kpis .kpi:nth-child(4){ transform:rotate(.8deg); }
body.px-notebook .px-kpis .kpi::before{ content:""; position:absolute; top:-9px; left:50%; width:74px; height:20px; margin-left:-37px; background:rgba(255,255,255,.55); border:1px solid rgba(30,36,51,.08); transform:rotate(-3deg); box-shadow:0 1px 2px rgba(0,0,0,.05); }
body.px-notebook .px-kpis .kpi.d::before{ background:rgba(255,255,255,.3); }
body.px-notebook .px-kpis .kpi.px-lift:hover{ transform:rotate(0) translateY(-3px); box-shadow:0 18px 30px rgba(30,36,51,.14); }
body.px-notebook .px-kpis .kpi-bg{ right:8px; bottom:6px; font-size:62px; opacity:.1; }
body.px-notebook .px-kpis .kpi-delta{ font-family:var(--font-hand); font-size:16px; background:none; color:var(--nb-pen); padding:0; }
body.px-notebook .px-kpis .kpi.d .kpi-delta{ color:var(--yellow); }
body.px-notebook .kpi.p{ background:#E9DDF9; }
body.px-notebook .kpi.b{ background:#DCEBF4; }

/* ---- rings look drawn: dashed track, pen-blue progress ---- */
body.px-notebook .px-ring .track{ stroke:#D8D4CD; stroke-dasharray:3 5; }
body.px-notebook .px-ring .val{ font-family:var(--font-hand); color:var(--nb-pen); font-size:19px; }
body.px-notebook .px-ring.lg .val{ font-size:38px; }
body.px-notebook .px-ring.lg .val small{ font-family:var(--font); }

/* ---- mastery = marker bars on a ruled line, ticked in green pen at 80%+ ---- */
.nb-bar{ flex:1; height:14px; position:relative; border-bottom:1.5px solid #D8D4CD; }
.nb-bar i{ position:absolute; left:0; top:1px; height:11px; width:0; border-radius:4px 7px 5px 8px / 7px 4px 8px 5px; opacity:.85; mix-blend-mode:multiply; transform:rotate(-.4deg); transition:width var(--px-slow) var(--px-ease); }
.nb-bar.hi i{ background:var(--nb-pen); } .nb-bar.mid i{ background:#F4A62A; } .nb-bar.lo i{ background:var(--nb-red); }   /* amber marker, so "getting there" never reads as red pen */
.nb-tick{ width:22px; height:18px; flex:none; margin-left:8px; overflow:visible; }
.nb-tick path{ stroke:var(--nb-green); stroke-width:3.2; fill:none; stroke-linecap:round; stroke-linejoin:round; stroke-dasharray:40; stroke-dashoffset:40; transition:stroke-dashoffset .6s var(--px-ease) .5s; }
.nb-tick.in path{ stroke-dashoffset:0; }
body.px-notebook .px-mastery-pct{ font-family:var(--font-hand); font-size:20px; color:var(--nb-pen); }
body.px-notebook .px-mastery-row[data-pct] .px-mastery-pct{ transition:color var(--px-fast); }
body.px-notebook .px-mastery-row:hover .px-mastery-pct{ color:var(--accent-strong); }
body.px-notebook .px-mastery-legend{ font-family:var(--font-hand); font-size:16px; color:var(--ink-muted); }
body.px-notebook .px-due{ font-family:var(--font-hand); font-size:15px; padding:3px 10px; border-radius:4px; }
body.px-notebook .px-due.soon{ background:var(--nb-hl); color:var(--nb-ink); }

/* ---- badges = stickers ---- */
body.px-notebook .px-badge-ico{ border-radius:50%; border:3px solid #fff; box-shadow:0 2px 6px rgba(30,36,51,.2); transform:rotate(-6deg); }
body.px-notebook .px-badge:nth-child(2n) .px-badge-ico{ transform:rotate(5deg); }
body.px-notebook .px-badge:hover .px-badge-ico{ transform:rotate(0) translateY(-3px) scale(1.04); }
body.px-notebook .px-badge.locked .px-badge-ico{ border:2px dashed var(--line-strong); box-shadow:none; background:transparent !important; transform:none; }
body.px-notebook .px-badge-name{ font-family:var(--font-hand); font-size:16px; font-weight:700; }
body.px-notebook .px-tag{ font-family:var(--font-hand); font-size:14px; letter-spacing:0; text-transform:none; border-radius:4px; }

/* ---- mascot: Jot ---- */
.px-mascot.nb .m-note{ transform-box:fill-box; transform-origin:50% 0; animation:nb-flutter 4.2s ease-in-out infinite; }
@keyframes nb-flutter{ 0%,100%{ transform:rotate(0); } 50%{ transform:rotate(1.6deg); } }
.px-mascot.nb .m-curl{ transform-box:fill-box; transform-origin:100% 100%; animation:nb-curl 4.2s ease-in-out infinite; }
@keyframes nb-curl{ 0%,100%{ transform:scale(1); } 50%{ transform:scale(1.18); } }
.px-mascot.nb[data-mood="celebrating"] .m-note{ animation:nb-hop .8s var(--px-spring) infinite; }
@keyframes nb-hop{ 0%,100%{ transform:translateY(0) rotate(0); } 40%{ transform:translateY(-7px) rotate(-3deg); } 70%{ transform:translateY(-1px) rotate(2deg); } }
.px-mascot.nb[data-mood="sleepy"] .m-note{ animation-duration:7s; }
.px-mascot.nb[data-mood="thinking"] .m-pencil{ transform-box:fill-box; transform-origin:0 100%; animation:nb-scribble .5s ease-in-out infinite alternate; }
@keyframes nb-scribble{ from{ transform:rotate(-6deg); } to{ transform:rotate(6deg); } }

/* ---- practice page: workbook marking ---- */
body.px-notebook .q-card{ position:relative; border-radius:14px; box-shadow:0 1px 0 rgba(30,36,51,.04),2px 4px 0 rgba(30,36,51,.05),0 16px 34px rgba(30,36,51,.07); }
body.px-notebook .pill-dark{ border-radius:5px; }
body.px-notebook .px-stem{ font-weight:600; }
body.px-notebook .ans{ border-radius:10px; position:relative; }
body.px-notebook .ans .key{ border-radius:50%; background:transparent; border:2px solid var(--ink-faint); color:var(--ink-2); width:30px; height:30px; }
body.px-notebook .ans:hover:not([disabled]){ border-color:var(--nb-pen); background:var(--nb-pen-tint); transform:translateX(2px); }
body.px-notebook .ans.is-picked{ border-color:var(--nb-pen); background:var(--nb-pen-tint); }
body.px-notebook .ans.is-picked .key{ background:var(--nb-pen); border-color:var(--nb-pen); color:#fff; }
body.px-notebook .ans.correct{ border-color:var(--nb-green); background:#F0F7F2; }
body.px-notebook .ans.correct .key{ background:var(--nb-green); border-color:var(--nb-green); color:#fff; }
body.px-notebook .ans.correct .state{ visibility:hidden; }          /* the drawn tick replaces the icon */
body.px-notebook .ans.wrong .key{ background:var(--nb-red); border-color:var(--nb-red); color:#fff; }
.nb-tick-big{ position:absolute; right:22px; top:50%; width:46px; height:38px; margin-top:-21px; pointer-events:none; overflow:visible; }
.nb-tick-big path{ stroke:var(--nb-green); stroke-width:6; fill:none; stroke-linecap:round; stroke-linejoin:round; }
@media(max-width:900px){ .nb-art{ opacity:.28; } }      /* phones: doodles sit behind the text, so fade them */
.nb-stamp{ position:absolute; top:14px; right:72px; z-index:2; font-family:var(--font-hand); font-weight:700; font-size:28px; letter-spacing:.06em; line-height:1; color:var(--nb-red); border:3px double var(--nb-red); border-radius:8px; padding:4px 12px 2px; transform:rotate(-10deg); opacity:0; pointer-events:none; mix-blend-mode:multiply; }
.nb-stamp.ok{ color:var(--nb-green); border-color:var(--nb-green); }
.nb-sticker{ position:absolute; top:-18px; right:-12px; z-index:3; width:96px; height:96px; pointer-events:none; filter:drop-shadow(0 4px 6px rgba(30,36,51,.25)); overflow:visible; }
body.px-notebook .feedback .fb-head{ font-family:var(--font-hand); font-size:26px; }
body.px-notebook .feedback.ok{ background:#F0F7F2; border-color:var(--nb-green); }
body.px-notebook .feedback.ok .fb-head{ color:var(--nb-green); }
body.px-notebook .feedback.no{ background:#FBF1EF; border-color:var(--nb-red); }
body.px-notebook .feedback.no .fb-head{ color:var(--nb-red); }
body.px-notebook .px-hint-body{ font-family:var(--font-hand); font-size:19px; line-height:1.3; background:#FFF7DC; border-left-color:var(--yellow); }
body.px-notebook .px-session .progress{ height:10px; border-radius:3px; background:repeating-linear-gradient(90deg,#ECEAE5 0 10px,#F4F3F0 10px 20px); }
body.px-notebook .px-session .progress i{ border-radius:3px; background:var(--nb-pen); opacity:.85; }
body.px-notebook .timer{ font-family:var(--font-hand); font-size:19px; border-radius:6px; }
body.px-notebook .nav-cell{ border-radius:6px; }
body.px-notebook .nav-cell.done{ background:var(--nb-pen-tint); color:var(--nb-pen); }
body.px-notebook .nav-cell.current{ border-color:var(--nb-pen); background:var(--nb-pen); color:#fff; }
body.px-notebook .side-card.dark{ background:var(--nb-ink); }
body.px-notebook .px-rung.is-active{ border-color:var(--nb-pen); background:var(--nb-pen-tint); color:var(--nb-pen); }
body.px-notebook .px-comp-msg{ font-family:var(--font-hand); font-size:18px; line-height:1.3; background:#FFF7DC; }
body.px-notebook .px-comp-msg::before{ background:#FFF7DC; }
body.px-notebook .px-work-canvas text{ font-family:var(--font-hand); }
.nb-doodle{ width:16px; height:16px; }
.nb-doodle svg{ width:100%; height:100%; overflow:visible; }

/* ######################################################################
   3. SKIN
   ###################################################################### */
body.px-notebook{
  /* surfaces */
  --paper:#FBF8F1; --surface:#FFFFFF; --surface-2:#F6F3EC; --surface-inset:#EEEAE1;
  --line:#E6E2D8; --line-strong:#D6D0C4;
  --rail:#1E2433; --frame:#1E2433; --rail-ico:#A9B0C2; --rail-ico-hover:#FFFFFF;
  /* ink */
  --ink:#1E2433; --ink-2:#4A5165; --ink-muted:#7D8498; --ink-faint:#A6ACBB;
  --shadow-sm:0 1px 0 rgba(30,36,51,.04),0 6px 16px rgba(30,36,51,.05);
  --shadow-md:0 2px 0 rgba(30,36,51,.04),0 14px 30px rgba(30,36,51,.08);
  --shadow-lg:0 18px 50px rgba(30,36,51,.16);
  --nb-rule:#DCE6EC;                 /* the pale blue rule of exercise-book paper */
}
/* :where() keeps this at the weight of a bare `a`, so .btn / .pill / .nav-ico anchors keep their own colour */
:where(body.px-notebook) a{ color:var(--nb-pen); }

/* ---- the page: dotted paper behind everything ---- */
body.px-notebook .app{ background-color:var(--paper); background-image:radial-gradient(rgba(30,36,51,.11) 1px,transparent 1.3px); background-size:22px 22px; background-position:11px 11px; }
@media(max-width:860px){ body.px-notebook .topbar{ background:var(--paper); background-image:radial-gradient(rgba(30,36,51,.11) 1px,transparent 1.3px); background-size:22px 22px; } }

body.px-notebook .nav-ico.is-active{ color:var(--nb-ink); font-weight:700; }
body.px-notebook .nav-badge{ background:var(--accent); box-shadow:0 0 0 2px var(--rail); }
body.px-notebook .rail-tip{ background:#fff; color:var(--ink); border:1px solid var(--line); box-shadow:2px 3px 0 rgba(30,36,51,.08); font-family:var(--font-hand); font-size:16px; padding:5px 11px; }

/* ---- topbar ---- */
body.px-notebook .topbar{ padding-top:18px; }
body.px-notebook .tb-mark{ background:var(--rail); color:var(--yellow); border-radius:10px; }
body.px-notebook .nb-date{ font-family:var(--font-hand); font-size:20px; font-weight:700; color:var(--nb-pen); margin-left:4px; white-space:nowrap; position:relative; padding:0 4px; }
body.px-notebook .nb-date::after{ content:""; position:absolute; left:2px; right:2px; bottom:1px; height:5px; background:var(--nb-hl); border-radius:3px; z-index:-1; transform:rotate(-1deg); }
body.px-notebook .bell,body.px-notebook .icon-btn,body.px-notebook .nb-roleswitch,body.px-notebook .px-switch{ border-color:#E3DFD3; box-shadow:2px 3px 0 rgba(30,36,51,.07); background:#fff; }
body.px-notebook .topbar .profile .avatar{ border:2px solid #fff; box-shadow:0 2px 6px rgba(30,36,51,.22); }
body.px-notebook .nb-roleswitch{ display:inline-flex; align-items:center; gap:7px; height:40px; padding:0 14px; border:1px solid var(--line); border-radius:999px; font-family:var(--font-hand); font-size:16px; font-weight:700; color:var(--nb-pen); text-decoration:none; white-space:nowrap; }
body.px-notebook .nb-roleswitch:hover{ background:var(--surface-2); }
@media(max-width:860px){ body.px-notebook .nb-date,body.px-notebook .nb-roleswitch .full{ display:none; } body.px-notebook .nb-roleswitch{ padding:0 11px; } }
body.px-notebook .px-switch-quiet{ border-left:0; border-radius:999px !important; margin:0; }

/* ---- page title: highlighter swipe. Painted as an inline background with
   box-decoration-break so a title that wraps gets the swipe on every line. ---- */
body.px-notebook .page-head h1{ display:inline; letter-spacing:-.02em; line-height:1.3; padding:0 6px; margin-left:-6px; background:linear-gradient(transparent 62%,var(--nb-hl) 62%,var(--nb-hl) 96%,transparent 96%); -webkit-box-decoration-break:clone; box-decoration-break:clone; }
body.px-notebook .page-head h1::after{ content:none; }
body.px-notebook .page-head > div > p[style],body.px-notebook .page-head .sub{ color:var(--ink-muted); }
body.px-notebook .sec-head h2{ font-family:var(--font-hand); font-size:26px; color:var(--nb-pen); }
body.px-notebook .eyebrow{ font-family:var(--font-hand); font-size:15px; letter-spacing:0; text-transform:none; color:var(--nb-pen); font-weight:700; }

/* ---- sheets: cards and friends ---- */
body.px-notebook .card,body.px-notebook .side-card,body.px-notebook .qcard,body.px-notebook .lvl-card,body.px-notebook .class-card,body.px-notebook .classroom-crd{ border-radius:14px; border-color:var(--line); box-shadow:var(--shadow-sm); }
body.px-notebook .card-head{ border-bottom-color:var(--line); }
body.px-notebook .card-head strong,body.px-notebook .card-head h3,body.px-notebook .card-title{ letter-spacing:-.01em; }
/* the small grey side-notes in card heads are written in pen */
body.px-notebook .card-head [style*="11.5px"],body.px-notebook .card-head [style*="font-size:12px"],body.px-notebook .sec-head [style*="11.5px"],body.px-notebook .nb-note{ font-family:var(--font-hand) !important; font-size:16px !important; color:var(--nb-pen) !important; letter-spacing:0 !important; text-transform:none !important; font-weight:600 !important; }
body.px-notebook .deck-note{ font-family:var(--font-hand); font-size:16px; letter-spacing:0; text-transform:none; background:#FFF7DC; color:var(--nb-ink); border-radius:4px; border:1px solid rgba(30,36,51,.08); }
body.px-notebook .deck-note i{ color:var(--nb-pen); }
body.px-notebook .lvl-card:hover,body.px-notebook .class-card:hover{ border-color:var(--nb-pen); }
body.px-notebook .lvl-ico{ border-radius:10px; }
body.px-notebook .class-card .cc-ico{ background:var(--rail); color:var(--yellow); border-radius:10px; }
/* .cc-meta is only laid out inside .class-card by praxis-components; the detail headers reuse it bare */
body.px-notebook .cc-meta{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; color:var(--ink-muted); font-size:13px; font-weight:600; }
body.px-notebook .cc-meta i{ margin-right:5px; color:var(--ink-faint); }

/* ---- sticky-note KPIs everywhere (theme.css only did the .px-kpis row) ---- */
body.px-notebook .kpi-row .kpi{ position:relative; border-radius:3px; overflow:visible; box-shadow:0 12px 22px rgba(30,36,51,.1),0 2px 4px rgba(30,36,51,.06); transform:rotate(-.7deg); transition:transform .16s ease,box-shadow .16s ease; }
body.px-notebook .kpi-row .kpi:nth-child(2){ transform:rotate(.6deg); }
body.px-notebook .kpi-row .kpi:nth-child(3){ transform:rotate(-.4deg); }
body.px-notebook .kpi-row .kpi:nth-child(4){ transform:rotate(.8deg); }
body.px-notebook .kpi-row .kpi::before{ content:""; position:absolute; top:-9px; left:50%; width:74px; height:20px; margin-left:-37px; background:rgba(255,255,255,.55); border:1px solid rgba(30,36,51,.08); transform:rotate(-3deg); box-shadow:0 1px 2px rgba(0,0,0,.05); }
body.px-notebook .kpi-row .kpi.d::before{ background:rgba(255,255,255,.3); }
body.px-notebook .kpi-row .kpi:hover{ transform:rotate(0) translateY(-3px); box-shadow:0 18px 30px rgba(30,36,51,.14); }
body.px-notebook .kpi-row .kpi-delta{ font-family:var(--font-hand); font-size:16px; background:none; color:var(--nb-pen); padding:0; }
body.px-notebook .kpi-row .kpi.d .kpi-delta{ color:var(--yellow); }
body.px-notebook .kpi.p{ background:#E9DDF9; } body.px-notebook .kpi.b{ background:#DCEBF4; }
body.px-notebook .kpi-ico{ border-radius:9px; }

/* ---- buttons, pills, tags ---- */
body.px-notebook .btn{ border-radius:10px; }
body.px-notebook .btn-primary{ box-shadow:2px 3px 0 rgba(30,36,51,.18),0 8px 18px rgba(255,87,52,.2); }
body.px-notebook .btn-primary:hover{ box-shadow:2px 3px 0 rgba(30,36,51,.18),0 10px 22px rgba(255,87,52,.26); }
body.px-notebook .btn-ghost,body.px-notebook .btn-cancel,body.px-notebook .view-btn{ border-color:var(--line-strong); box-shadow:2px 2px 0 rgba(30,36,51,.05); }
body.px-notebook .pill{ border-radius:7px; }
body.px-notebook .pill-dark{ background:var(--rail); }
body.px-notebook .sub-tag,body.px-notebook [class^="subject-"],body.px-notebook [class*=" subject-"]{ border-radius:5px; }
body.px-notebook .sub-tag{ box-shadow:1px 1px 0 rgba(30,36,51,.06); }
body.px-notebook .tag-item{ border-radius:6px; }
body.px-notebook .px-tag,body.px-notebook .badge{ border-radius:4px; }
body.px-notebook .icon-btn,body.px-notebook .btn-table-icon,body.px-notebook .row-actions button{ border-radius:8px; }

/* ---- ruled tables ---- */
body.px-notebook table.dtable thead th,body.px-notebook .roster th,body.px-notebook .table th,body.px-notebook .cp-table th{ font-family:var(--font-hand); font-size:17px; letter-spacing:0; text-transform:none; color:var(--nb-pen); font-weight:700; background:transparent; border-bottom:2px solid var(--nb-pen); }
body.px-notebook table.dtable thead th.sorting::after,body.px-notebook table.dtable thead th.sorting_asc::after,body.px-notebook table.dtable thead th.sorting_desc::after{ font-size:11px; }
body.px-notebook table.dtable tbody td,body.px-notebook .roster td,body.px-notebook .table td,body.px-notebook .cp-table td,body.px-notebook .def-row,body.px-notebook .mastery-row,body.px-notebook .tricky-row,body.px-notebook .ann-row{ border-color:var(--nb-rule); }
body.px-notebook table.dtable tbody td{ border-bottom:1px solid var(--nb-rule); }
body.px-notebook .roster td{ border-top-color:var(--nb-rule); }
body.px-notebook .dtable tbody tr:hover td,body.px-notebook .roster tr:hover td{ background:#FFFBEA; }
body.px-notebook table.dtable .num,body.px-notebook .roster td.num,body.px-notebook .tricky-score,body.px-notebook .mastery-pct,body.px-notebook .def-row .dd{ font-variant-numeric:tabular-nums; }
body.px-notebook table.dtable td.num:first-child{ font-family:var(--font-hand); font-size:17px; color:var(--nb-pen); }
body.px-notebook .dt-search input,body.px-notebook .search-mini{ border-radius:9px; background:#fff; }
body.px-notebook .dataTables_paginate .paginate_button,body.px-notebook .pager button{ border-radius:8px; }
body.px-notebook .dataTables_paginate .paginate_button.current,body.px-notebook .pager button.is-active{ background:var(--nb-pen); border-color:var(--nb-pen); color:#fff; }
body.px-notebook .dataTables_info{ font-family:var(--font-hand); font-size:15px; color:var(--ink-muted); }
body.px-notebook .acc-bar,body.px-notebook .mbar,body.px-notebook .topacc-track{ border-radius:3px; }
body.px-notebook .acc-bar i,body.px-notebook .mbar-fill,body.px-notebook .topacc-track i{ border-radius:3px; }
body.px-notebook .delta.up{ color:var(--nb-green); } body.px-notebook .delta.down{ color:var(--nb-red); }
body.px-notebook .tricky-rank{ border-radius:50%; font-family:var(--font-hand); font-size:16px; }
body.px-notebook .heat-cell,body.px-notebook .heat-scale span{ border-radius:2px; }

/* ---- forms ---- */
body.px-notebook .input,body.px-notebook .textarea,body.px-notebook .form-control,body.px-notebook .form-select,body.px-notebook .pselect-btn,body.px-notebook .field .pselect-btn,body.px-notebook .opt-row,body.px-notebook .stepper,body.px-notebook .seg,body.px-notebook .tabs{ border-radius:10px; border-color:var(--line-strong); background:#fff; }
body.px-notebook .input:focus,body.px-notebook .textarea:focus,body.px-notebook .form-control:focus,body.px-notebook .form-select:focus,body.px-notebook .pselect.open .pselect-btn,body.px-notebook .dt-search input:focus{ border-color:var(--nb-pen); box-shadow:0 0 0 3px var(--nb-pen-tint); }
body.px-notebook .field .hint{ font-family:var(--font-hand); font-size:15px; color:var(--nb-pen); }
body.px-notebook .seg button,body.px-notebook .tabs button{ border-radius:7px; }
body.px-notebook .seg button.is-active:not([data-d]),body.px-notebook .tabs button.is-active{ background:var(--nb-pen); color:#fff; box-shadow:none; }
body.px-notebook .seg button[data-d].is-active{ color:var(--nb-ink); }
body.px-notebook .opt-row.is-correct{ border-color:var(--nb-green); background:#F0F7F2; }
body.px-notebook .opt-row.is-correct .opt-mark{ background:var(--nb-green); border-color:var(--nb-green); }
body.px-notebook .opt-mark{ border-radius:50%; }
body.px-notebook .dropzone{ border-radius:10px; border-color:var(--line-strong); }
body.px-notebook .dropzone:hover{ border-color:var(--nb-pen); color:var(--nb-pen); background:var(--nb-pen-tint); }
body.px-notebook .switch input:checked + .track{ background:var(--nb-pen); }
/* `.field > label{display:block}` out-ranks `.switch`, which collapsed the toggle onto its text.
   Applied to every switch, wherever it sits, and given a pressed feel. */
body.px-notebook label.switch,body.px-notebook .field label.switch{ display:inline-flex; align-items:center; gap:10px; margin:0; cursor:pointer; user-select:none; }
body.px-notebook .switch .track{ display:inline-block; flex:none; transition:background .18s ease,box-shadow .18s ease; }
body.px-notebook .switch .track::after{ transition:transform .18s cubic-bezier(.3,1.3,.5,1); }
body.px-notebook .switch:active .track::after{ transform:scaleX(1.15); transform-origin:left center; }
body.px-notebook .switch input:checked:active + .track::after{ transform:translateX(17px) scaleX(1.15); transform-origin:right center; }
body.px-notebook .switch input:focus-visible + .track{ box-shadow:0 0 0 3px var(--nb-pen-tint); }

/* ---- quiet mode: visibly calmer, not just "fewer animations" ---- */
body.px-notebook.px-quiet .app{ background-image:none; }
body.px-notebook.px-quiet .kpi-row .kpi{ transform:none; }
body.px-notebook.px-quiet .kpi-row .kpi::before{ display:none; }

/* ---- analytics pieces added in the "more information" round ---- */
.nb-redpen{ font-family:var(--font-hand); color:var(--nb-red); font-size:18px; line-height:1.2; font-weight:700; }
.nb-redpen.ok{ color:var(--nb-green); }
.nb-redpen.pen{ color:var(--nb-pen); }
.nb-margin-note{ position:absolute; right:14px; top:-12px; transform:rotate(-3deg); background:#fff; padding:2px 8px; border-radius:4px; box-shadow:1px 2px 0 rgba(30,36,51,.08); }
.nb-report{ position:relative; background:#FFF1A8; border-radius:3px; padding:24px 24px 18px; box-shadow:0 12px 22px rgba(30,36,51,.12),0 2px 4px rgba(30,36,51,.06); transform:rotate(-.8deg); font-family:var(--font-hand); font-size:19px; line-height:1.35; color:var(--nb-ink); }
.nb-report::before{ content:""; position:absolute; top:-10px; left:50%; width:86px; height:22px; margin-left:-43px; background:rgba(255,255,255,.6); border:1px solid rgba(30,36,51,.08); transform:rotate(-2deg); }
.nb-report .ttl{ font-size:14px; font-family:var(--font); font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--ink-muted); margin-bottom:8px; }
.nb-report .sig{ display:block; text-align:right; margin-top:12px; color:var(--nb-pen); }
.nb-heat{ display:grid; gap:4px; align-items:center; font-size:12.5px; }
.nb-heat .hh{ font-family:var(--font-hand); font-size:14px; color:var(--nb-pen); text-align:center; font-weight:700; line-height:1.1; padding-bottom:4px; }
.nb-heat .hn{ font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding-right:8px; }
.nb-heat .hn small{ display:block; font-weight:500; color:var(--ink-faint); font-size:11px; }
.nb-heat .hc{ height:32px; border-radius:4px; display:grid; place-items:center; font-family:var(--font-hand); font-size:15px; font-weight:700; cursor:default; transition:transform .12s ease; }
.nb-heat .hc:hover{ transform:scale(1.08); box-shadow:0 2px 8px rgba(30,36,51,.15); }
.nb-heat .lo{ background:#F7C9C4; color:#8F2A22; } .nb-heat .mid{ background:#FBE2B8; color:#7A4E00; } .nb-heat .hi{ background:#CFE0EA; color:#1F4F66; } .nb-heat .top{ background:#CDE9D7; color:#1F5E3A; } .nb-heat .na{ background:var(--surface-inset); color:var(--ink-faint); }
.nb-legend{ display:flex; gap:12px; flex-wrap:wrap; font-size:11.5px; color:var(--ink-muted); margin-top:12px; align-items:center; }
.nb-legend i{ display:inline-block; width:14px; height:14px; border-radius:3px; vertical-align:-2px; margin-right:5px; }
.nb-q{ display:flex; gap:14px; align-items:center; padding:12px 0; border-bottom:1px solid var(--nb-rule); }
.nb-q:last-child{ border-bottom:0; }
.nb-q .cnt{ font-family:var(--font-hand); font-size:26px; color:var(--nb-pen); min-width:44px; text-align:center; line-height:1; }
.nb-q .cnt small{ display:block; font-size:12px; color:var(--ink-faint); }
.nb-q .t{ font-weight:700; font-size:14px; } .nb-q .m{ font-size:12.5px; color:var(--ink-muted); margin-top:2px; }
.nb-q .btn{ margin-left:auto; flex:none; }
.nb-arrow{ font-weight:800; font-size:16px; } .nb-arrow.up{ color:var(--nb-green); } .nb-arrow.down{ color:var(--nb-red); } .nb-arrow.flat{ color:var(--ink-faint); }
.nb-notepad{ width:100%; min-height:124px; border:1px solid var(--line); border-radius:10px; padding:8px 14px; font-family:var(--font-hand); font-size:19px; line-height:28px; color:var(--nb-ink); background:#fff repeating-linear-gradient(0deg,transparent,transparent 27px,var(--nb-rule) 28px); background-position:0 12px; resize:vertical; outline:none; }
.nb-notepad:focus{ border-color:var(--nb-pen); box-shadow:0 0 0 3px var(--nb-pen-tint); }
.nb-time{ display:inline-flex; align-items:center; gap:6px; font-family:var(--font-hand); font-size:15px; color:var(--ink-muted); }
.nb-time i{ display:inline-block; height:6px; border-radius:3px; background:var(--nb-pen); opacity:.6; }
.nb-stat-big{ font-family:var(--font-hand); font-size:30px; color:var(--nb-pen); line-height:1; }
.nb-week{ display:grid; grid-template-columns:repeat(7,1fr); gap:6px; }
.nb-week .d{ text-align:center; font-size:11px; color:var(--ink-faint); font-weight:600; }
.nb-week .d b{ display:block; height:44px; border-radius:6px; background:var(--surface-inset); margin-bottom:4px; position:relative; overflow:hidden; }
.nb-week .d b i{ position:absolute; left:0; right:0; bottom:0; background:var(--nb-pen); opacity:.8; border-radius:6px 6px 0 0; }
.nb-week .d.today b{ box-shadow:0 0 0 2px var(--yellow); }
.nb-week .d span{ font-family:var(--font-hand); font-size:14px; color:var(--nb-pen); display:block; }

/* ######################################################################
   4. SHELL
   ###################################################################### */
/* =========================================================================
   THE NOTEBOOK SHELL  (body.nb-tabs) - a spiral-bound notebook lying on a desk.
   The content is the open PAGE (.main); wire coils bind its left edge; the sheets
   beneath and the kraft back cover are .nb-under. Every page of the portal has
   its own sticky FLAG at a fixed slot on the right edge (slot = --i, written by
   layouts/praxis-app.blade.php): the open page's flag is glued to it (translucent
   glue on the paper + a solid tip past the edge) and pulled out; every other flag
   is a tip coming from under the page (.nb-under > .nb-stack). Log out is the
   back cover's grey tab. Flags never move: turning a page carries only ITS flag.

   STACKING - read before touching. Bootstrap modals live INSIDE .main, but their
   backdrop is appended to <body>. So .app and .main must never become stacking
   contexts (no z-index, transform, filter, perspective or will-change on them),
   or every modal sinks under its own backdrop. .nb-under sits below .main purely
   by DOM order. The one exception is the page turn at the end of this block,
   which names .main for the length of the animation only.

   Phones (<=860px) keep the Praxis bottom bar, re-skinned as post-it tiles.
   ========================================================================= */
body.px-notebook.nb-tabs{ --desk:#E2D5BF; --page:#FFFDF7; --tab:#FBE36B; --kraft:#C8B38B; --flag-h:38px; --flag-top:76px; --flag-gap:5px; --nb-page-max:1680px; }
/* Where the notebook sits on the desk. --nb-gap is the desk showing on EACH side of the whole
   notebook (coils on the left, flags on the right), so it always looks centred: at least 28px,
   growing with the screen, and once the page reaches --nb-page-max (content is capped at 1440px,
   so wider is only blank paper) the extra goes to the desk. --nb-flag-out = how far the open
   flag sticks out past the page (146px; 56px for compact flags); the coils overhang the page by
   28px. The coils and Jot are placed from --nb-gap too, so they move with the page. */
@media(min-width:861px){
  body.px-notebook.nb-tabs .app{ position:relative; grid-template-columns:minmax(0,1fr); --nb-flag-out:146px; --nb-gap:max(28px, 6vw - 40px, (100vw - var(--nb-page-max) - 28px - var(--nb-flag-out)) / 2); padding:14px calc(var(--nb-gap) + var(--nb-flag-out)) 14px calc(var(--nb-gap) + 28px); background-color:var(--desk); background-image:repeating-linear-gradient(90deg,rgba(255,255,255,.07) 0 2px,transparent 2px 9px),radial-gradient(rgba(90,70,40,.08) 1px,transparent 1.4px); background-size:auto,26px 26px; background-position:0 0; }
  body.px-notebook.nb-tabs.px-quiet .app{ background-image:none; }
  body.px-notebook.nb-tabs .app:not(.rail-open){ --nb-flag-out:56px; }     /* compact flags stick out less */
  body.px-notebook.nb-tabs .rail,body.px-notebook.nb-tabs .app.rail-open .rail{ display:none; }   /* the rail only feeds the phone bar */
  /* the binding: one coil per 24px tile (hole on the paper at x=40, page edge at x=28), laid out
     with `space` so whole coils are distributed and none is cut off at the ends */
  body.px-notebook.nb-tabs .nb-coils{ position:absolute; top:34px; bottom:34px; left:var(--nb-gap); width:52px; z-index:7; pointer-events:none; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='52' height='24' viewBox='0 0 52 24'%3E%3Cpath d='M28 8.5 C 15 8.5, 7.5 10.5, 7.5 13 C 7.5 15.5, 15 17.5, 28 18' fill='none' stroke='rgba(60,40,20,.3)' stroke-width='4.2' transform='translate(1.4 2.2)'/%3E%3Cpath d='M40 7 L28 8.5' stroke='rgba(30,36,51,.28)' stroke-width='3.6' stroke-linecap='round' transform='translate(.8 1.6)'/%3E%3Ccircle cx='40' cy='7' r='3.4' fill='%23242833'/%3E%3Ccircle cx='40' cy='7' r='3.4' fill='none' stroke='rgba(255,255,255,.22)' stroke-width='.8'/%3E%3Cpath d='M40 7 L28 8.5' stroke='%23303542' stroke-width='3.4' stroke-linecap='round'/%3E%3Cpath d='M28 8.5 C 15 8.5, 7.5 10.5, 7.5 13 C 7.5 15.5, 15 17.5, 28 18' fill='none' stroke='%23303542' stroke-width='3.4'/%3E%3Cpath d='M39 6.2 L29 7.5 C 16 7.4, 9.4 9.2, 8.9 11.4' fill='none' stroke='%23E4E7EE' stroke-width='.9' stroke-linecap='round' opacity='.85'/%3E%3Cpath d='M23.5 17.75 H28.3' stroke='rgba(0,0,0,.38)' stroke-width='3.6'/%3E%3C/svg%3E"); background-repeat:no-repeat space; background-position:0 0; background-size:52px 24px; }
  body.px-notebook.nb-tabs .nb-desk-jot{ position:absolute; left:max(5px, calc(var(--nb-gap) - 38px)); bottom:16px; width:44px; z-index:0; transform:rotate(-10deg); cursor:pointer; filter:drop-shadow(0 3px 4px rgba(60,40,20,.35)); }
  body.px-notebook.nb-tabs.px-quiet .nb-desk-jot{ display:none; }
  /* the block of sheets under the page (+ the kraft back cover), then the open page */
  body.px-notebook.nb-tabs .nb-under{ grid-column:1; grid-row:1; display:block; position:relative; z-index:0; border-radius:3px 12px 12px 3px; background:var(--page); box-shadow:3px 3px 0 #F1ECE0,6px 6px 0 #E6DFD0,9px 9px 0 #D9D1C0,0 26px 50px rgba(70,55,30,.28); }
  body.px-notebook.nb-tabs .nb-under::before{ content:""; position:absolute; left:-2px; right:-14px; top:-2px; bottom:-14px; z-index:-1; border-radius:4px 14px 14px 4px; background:var(--kraft) repeating-linear-gradient(0deg,rgba(255,255,255,.08) 0 1px,transparent 1px 3px); box-shadow:0 18px 40px rgba(70,55,30,.28); }
  body.px-notebook.nb-tabs .main{ grid-column:1; grid-row:1; position:relative; margin:0; border-radius:3px 12px 12px 3px; background-color:var(--page); background-image:radial-gradient(rgba(30,36,51,.11) 1px,transparent 1.3px); background-size:22px 22px; background-position:11px 11px; overflow:visible; box-shadow:0 0 0 1px rgba(30,36,51,.06); }
  body.px-notebook.nb-tabs.px-quiet .main{ background-image:none; }
  /* the page keeps its content clear of the glue strip (60px) and of the coils */
  body.px-notebook.nb-tabs .stage-inner{ padding-right:94px; padding-left:66px; }
  body.px-notebook.nb-tabs .topbar{ padding-right:34px; padding-left:66px; }
  body.px-notebook.nb-tabs .topbar .rail-toggle i{ transform:none; }        /* praxis.css spins the old collapse chevron */

  /* ---- flags ---- */
  body.px-notebook.nb-tabs .nb-flags,body.px-notebook.nb-tabs .nb-stack{ display:block; position:absolute; top:0; right:0; width:60px; height:100%; pointer-events:none; }
  body.px-notebook.nb-tabs .nb-flags{ z-index:5; }
  body.px-notebook.nb-tabs .nb-flag{ pointer-events:auto; position:absolute; left:0; top:calc(var(--flag-top) + var(--i,0) * (var(--flag-h) + var(--flag-gap))); display:flex; align-items:center; width:200px; height:var(--flag-h); padding:0 8px 0 21px; border-radius:0 10px 10px 0; color:var(--nb-ink); font-weight:700; font-size:12.5px; line-height:1.1; text-decoration:none; white-space:nowrap; background:linear-gradient(90deg,transparent 0 60px,var(--tab) 60px); transform:translateX(-4px); filter:saturate(.82); box-shadow:2px 2px 0 rgba(30,36,51,.1),inset 0 1px 0 rgba(255,255,255,.5); transition:transform .22s cubic-bezier(.3,1.3,.5,1),filter .22s ease,box-shadow .22s ease,width .28s cubic-bezier(.2,.7,.2,1); }
  body.px-notebook.nb-tabs .nb-flag i{ font-size:15px; opacity:.75; width:18px; text-align:center; flex:none; }
  body.px-notebook.nb-tabs .nb-flag .lbl{ margin-left:35px; flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; }
  body.px-notebook.nb-tabs .nb-flag .nav-badge{ position:static; margin-left:6px; flex:none; background:var(--nb-ink); color:#fff; box-shadow:0 0 0 2px var(--tab); }
  body.px-notebook.nb-tabs .nb-flag:hover{ transform:translateX(2px); filter:saturate(1); color:var(--nb-ink); }
  /* glued = this page's own flag: the glue shows on the paper, with a crease where it leaves the page */
  body.px-notebook.nb-tabs .nb-flag.is-glued{ background:linear-gradient(90deg,color-mix(in srgb,var(--tab) 78%,transparent) 0 60px,var(--tab) 60px); }
  body.px-notebook.nb-tabs .nb-flag.is-glued::before{ content:""; position:absolute; left:60px; top:2px; bottom:2px; width:1px; background:rgba(30,36,51,.12); }
  body.px-notebook.nb-tabs .nb-flag.is-active{ transform:translateX(6px); filter:none; box-shadow:4px 4px 0 rgba(30,36,51,.16),inset 0 1px 0 rgba(255,255,255,.6); }
  /* the back cover's tab: Log out (--n = how many pages the book has) */
  body.px-notebook.nb-tabs .nb-flag.cover{ --tab:#DDD7CB; top:calc(var(--flag-top) + var(--n,12) * (var(--flag-h) + var(--flag-gap)) + 10px); height:30px; font-weight:600; color:var(--nb-red); }
  /* compact flags (top-bar toggle, the old Collapse): icon tips */
  body.px-notebook.nb-tabs .app:not(.rail-open) .nb-flag{ width:102px; }
  body.px-notebook.nb-tabs .app:not(.rail-open) .nb-flag .lbl,body.px-notebook.nb-tabs .app:not(.rail-open) .nb-flag .nav-badge{ display:none; }
  body.px-notebook.nb-tabs .app:not(.rail-open) .nb-flag.is-active{ width:110px; }
  body.px-notebook.nb-tabs .app:not(.rail-open) .nb-flag:not(.is-glued) i{ position:absolute; left:74px; opacity:.9; }
  /* narrow desktops (laptops ~1000px): compact flags always, a tighter binding margin, and the
     page gives a little of its padding back so the content keeps a desktop width */
  @media(max-width:1120px){
    body.px-notebook.nb-tabs .app{ --nb-flag-out:56px; }                  /* flags are always compact here */
    body.px-notebook.nb-tabs .stage-inner{ padding-left:52px; padding-right:78px; }
    body.px-notebook.nb-tabs .topbar{ padding-left:52px; padding-right:24px; }
    body.px-notebook.nb-tabs .nb-flag{ width:102px; }
    body.px-notebook.nb-tabs .nb-flag .lbl,body.px-notebook.nb-tabs .nb-flag .nav-badge{ display:none; }
    body.px-notebook.nb-tabs .nb-flag.is-active{ width:110px; }
    body.px-notebook.nb-tabs .nb-flag:not(.is-glued) i{ position:absolute; left:74px; opacity:.9; }
    body.px-notebook.nb-tabs .px-switch #rail-toggle{ display:none; }
  }
  @media(max-width:1000px){ body.px-notebook.nb-tabs .topbar .profile .who{ display:none; } }
  /* tooltips sit to the left of a compact flag */
  body.px-notebook .rail-tip.left{ transform-origin:right center; transform:translate(-100%,-50%) scale(.9); }
  body.px-notebook .rail-tip.left.show{ transform:translate(-100%,-50%) scale(1); }
  /* shorter screens: smaller flags - every slot follows from these variables */
  @media(max-height:820px){ body.px-notebook.nb-tabs{ --flag-h:32px; --flag-top:70px; --flag-gap:4px; } body.px-notebook.nb-tabs .nb-flag{ font-size:12px; } }
  @media(max-height:700px){ body.px-notebook.nb-tabs{ --flag-h:28px; --flag-top:66px; --flag-gap:3px; } body.px-notebook.nb-tabs .nb-flag i{ font-size:13px; } body.px-notebook.nb-tabs .nb-flag.cover{ height:24px; } }
  @media(max-height:590px){ body.px-notebook.nb-tabs{ --flag-h:23px; --flag-top:62px; --flag-gap:2px; } body.px-notebook.nb-tabs .nb-flag{ font-size:11px; } body.px-notebook.nb-tabs .nb-flag.cover{ height:20px; } }
}

/* The two full-height pages (Messages, Companion) size their panes as 100vh minus the chrome
   above them. The desk margin makes the page 26px shorter than the plain Praxis shell, so the
   same 26px comes off here - only above each page's own stacking breakpoint, where it switches
   to height:auto itself. */
@media(min-width:901px){ body.px-notebook.nb-tabs .ch-wrap{ height:calc(100vh - 236px); } }
@media(min-width:981px){ body.px-notebook.nb-tabs .cp-wrap{ height:calc(100vh - 236px); } }
@media(min-width:861px) and (max-width:980px){ body.px-notebook.nb-tabs .cp-main{ height:calc(100vh - 286px); } }

/* ---- THE PAGE TURN. Going to another page of the portal is a real navigation; browsers with
   cross-document View Transitions (Chrome/Edge 126+, Safari 18.2+) animate it as a page of the
   notebook turning, everything else just loads the next page as before. Forward (a flag lower in
   the book, or any link inside a page): the old page lifts and turns over the binding, its flag
   going with it, and the next page is already lying beneath. Back (a flag higher up): the
   destination flips in from the binding on top of the page being left. The desk, the sheet stack
   and its tips do not move; the coils stay on top so the page swings through them.
   The layout's <head> script picks the direction (types nb-fwd / nb-back) and skips the turn in
   Quiet mode and when a page reloads itself; html.nb-vt is present only around a turn, so .main
   is a stacking context for those ~0.5s and never while a modal can be open. ---- */
@media(min-width:861px) and (prefers-reduced-motion:no-preference){
  @view-transition{ navigation:auto; }
  html.nb-vt body.px-notebook.nb-tabs .main{ view-transition-name:nb-page; }
  html.nb-vt body.px-notebook.nb-tabs .nb-coils{ view-transition-name:nb-coils; }
  ::view-transition-old(root),::view-transition-new(root){ animation:none; mix-blend-mode:normal; }
  ::view-transition-old(root){ display:none; }
  ::view-transition-group(nb-page){ z-index:1; animation:none; }
  ::view-transition-group(nb-coils){ z-index:2; animation:none; }
  ::view-transition-old(nb-coils){ display:none; }
  ::view-transition-new(nb-coils){ animation:none; mix-blend-mode:normal; }
  ::view-transition-old(nb-page),::view-transition-new(nb-page){ animation:none; mix-blend-mode:normal; transform-origin:0 50%; backface-visibility:hidden; }
  html:active-view-transition-type(nb-fwd)::view-transition-old(nb-page){ z-index:1; animation:nb-turn-out .5s cubic-bezier(.55,.06,.68,.19) both; }
  html:active-view-transition-type(nb-back)::view-transition-new(nb-page){ z-index:1; animation:nb-turn-in .5s cubic-bezier(.2,.7,.2,1) both; }
  @keyframes nb-turn-out{ from{ transform:perspective(2600px) rotateY(0deg); filter:brightness(1); } to{ transform:perspective(2600px) rotateY(-100deg); filter:brightness(.7); } }
  @keyframes nb-turn-in{ from{ transform:perspective(2600px) rotateY(-100deg); filter:brightness(.7); } to{ transform:perspective(2600px) rotateY(0deg); filter:brightness(1); } }
}

/* ---- phones: the bottom bar becomes a row of post-it tiles (the desk furniture is desktop-only) ---- */
@media(max-width:860px){
  body.px-notebook.nb-tabs .nb-coils,body.px-notebook.nb-tabs .nb-desk-jot,body.px-notebook.nb-tabs .nb-under,body.px-notebook.nb-tabs .nb-flags{ display:none; }
  body.px-notebook .px-switch #rail-toggle{ display:none; }
  body.px-notebook.nb-tabs .rail,body.px-notebook.nb-tabs .app.rail-open .rail{ background:var(--page); border:1px solid var(--line); box-shadow:0 14px 34px rgba(30,36,51,.18); padding:8px 10px; }
  body.px-notebook.nb-tabs .nav-ico,body.px-notebook.nb-tabs .app.rail-open .nav-ico{ background:color-mix(in srgb,var(--tab) 55%,var(--page)); color:var(--nb-ink); border-radius:10px 10px 4px 4px; box-shadow:inset 0 1px 0 rgba(255,255,255,.6); transition:transform .22s cubic-bezier(.3,1.3,.5,1),background .2s; }
  body.px-notebook.nb-tabs .nav-ico.is-active{ background:var(--tab); transform:translateY(-6px); box-shadow:0 6px 0 rgba(30,36,51,.1),inset 0 1px 0 rgba(255,255,255,.6); color:var(--nb-ink); }
  body.px-notebook.nb-tabs .nav-ico.nav-logout{ --tab:#E6DED2; color:var(--nb-red); }
  body.px-notebook.nb-tabs .rail-more > .nav-ico{ --tab:#E6DED2; }
  body.px-notebook.nb-tabs .more-menu{ background:var(--page); border:1px solid var(--line); }
  body.px-notebook.nb-tabs .more-menu .nav-ico,body.px-notebook.nb-tabs .app.rail-open .more-menu .nav-ico{ background:none; border-radius:10px; box-shadow:none; transform:none; }
  body.px-notebook.nb-tabs .more-menu .nav-ico.is-active{ background:color-mix(in srgb,var(--tab) 55%,var(--page)); }
  body.px-notebook.nb-tabs .more-menu .nav-ico i{ color:color-mix(in srgb,var(--tab) 45%,var(--nb-ink)); }
  body.px-notebook.nb-tabs .nav-badge{ background:var(--nb-ink); box-shadow:0 0 0 2px var(--page); }
}

/* ######################################################################
   5. PAGES
   ###################################################################### */
body.px-notebook .chk,body.px-notebook .form-check-input{ accent-color:var(--nb-pen); }
body.px-notebook .assist{ background:var(--rail); border-radius:12px; }
body.px-notebook .assist .lbl{ font-family:var(--font-hand); font-size:16px; letter-spacing:0; text-transform:none; }
body.px-notebook .qcard-top{ background:var(--yellow); }
body.px-notebook .pv-opt{ border-radius:9px; } body.px-notebook .pv-opt .l{ border-radius:50%; }
body.px-notebook .studio-sub{ font-family:var(--font-hand); font-size:18px; letter-spacing:0; text-transform:none; color:var(--nb-pen); }
body.px-notebook .autosave{ font-family:var(--font-hand); font-size:15px; }
body.px-notebook .pselect-menu,body.px-notebook .dropdown-menu,body.px-notebook .px-menu{ border-radius:10px; }

/* ---- modals: a sheet taped to the page ---- */
body.px-notebook .modal-content,body.px-notebook .dmodal{ position:relative; border-radius:14px; border-color:var(--line); overflow:visible; }
body.px-notebook .modal-content::before,body.px-notebook .dmodal::before{ content:""; position:absolute; top:-11px; left:50%; width:96px; height:24px; margin-left:-48px; background:rgba(255,255,255,.6); border:1px solid rgba(30,36,51,.1); transform:rotate(-2deg); box-shadow:0 1px 2px rgba(0,0,0,.06); backdrop-filter:blur(1px); }
body.px-notebook .modal-title,body.px-notebook .dmodal h3{ font-family:var(--font-hand); font-size:27px; color:var(--nb-pen); }
body.px-notebook .modal-backdrop{ background:#1E2433; }
body.px-notebook .dmodal .drow{ border-color:var(--nb-rule); }

/* ---- notifications ---- */
body.px-notebook .notif-panel{ border-radius:14px; }
body.px-notebook .notif-head strong{ font-family:var(--font-hand); font-size:21px; color:var(--nb-pen); }
body.px-notebook .notif-item{ border-color:var(--nb-rule); }
body.px-notebook .notif-item.unread{ background:#FFFBEA; }
body.px-notebook .notif-ico{ border-radius:9px; }
body.px-notebook .notif-time,body.px-notebook .ann-meta,body.px-notebook .agenda-day .m{ font-family:var(--font-hand); font-size:14px; letter-spacing:0; text-transform:none; }
body.px-notebook .ann-ico{ border-radius:10px; }

/* ---- calendar (FullCalendar) ---- */
body.px-notebook .cal-wrap .fc{ --fc-border-color:var(--nb-rule); --fc-today-bg-color:#FFF7DC; }
body.px-notebook .cal-wrap .fc-theme-standard td,body.px-notebook .cal-wrap .fc-theme-standard th,body.px-notebook .cal-wrap .fc-theme-standard .fc-scrollgrid{ border-color:var(--nb-rule); }
body.px-notebook .cal-wrap .fc .fc-toolbar-title{ font-family:var(--font-hand); font-size:30px; color:var(--nb-ink); }
body.px-notebook .cal-wrap .fc .fc-daygrid-day-number{ font-family:var(--font-hand); font-size:17px; color:var(--nb-pen); }
body.px-notebook .cal-wrap .fc .fc-col-header-cell-cushion{ font-family:var(--font-hand); font-size:16px; letter-spacing:0; text-transform:none; color:var(--nb-pen); }
body.px-notebook .cal-wrap .fc .fc-button-primary{ border-radius:8px; }
body.px-notebook .cal-wrap .fc .fc-button-primary:not(:disabled).fc-button-active{ background:var(--nb-pen); border-color:var(--nb-pen); }
body.px-notebook .cal-wrap .fc-daygrid-event{ border-radius:4px; }
body.px-notebook .agenda-day .d{ font-family:var(--font-hand); font-size:24px; color:var(--nb-pen); }
body.px-notebook .agenda-body{ border-left-width:3px; }
body.px-notebook .agenda-today{ font-family:var(--font-hand); font-size:13px; letter-spacing:0; text-transform:none; border-radius:4px; }

/* ---- practice bits used by deck pages (do-assignment, review) ---- */
body.px-notebook .nav-cell{ border-radius:6px; }
body.px-notebook .q-stem .frac{ background:var(--nb-hl); border-radius:4px; }
body.px-notebook .work-canvas{ background-image:repeating-linear-gradient(0deg,transparent,transparent 27px,var(--nb-rule) 28px); }
body.px-notebook .timer{ font-family:var(--font-hand); font-size:19px; border-radius:6px; }
body.px-notebook .progress{ border-radius:3px; } body.px-notebook .progress i{ border-radius:3px; background:var(--nb-pen); }
body.px-notebook .xp-bar i{ background:var(--yellow); }

/* ---- empty states get a sleeping Jot (the shell injects the slot) ---- */
body.px-notebook .empty-note,body.px-notebook .no_found,body.px-notebook .topacc-empty,body.px-notebook .agenda-empty{ font-family:var(--font-hand); font-size:18px; color:var(--ink-muted); border-radius:10px; }
body.px-notebook .empty-note{ border-color:var(--line-strong); background:repeating-linear-gradient(0deg,transparent,transparent 27px,var(--nb-rule) 28px); }
body.px-notebook .nb-empty-jot{ width:64px; margin:0 auto 6px; }

/* ---- POPUPS. Every SweetAlert2 dialog (Swal.fire - the app's success / error / confirm popups)
   becomes a note taped to the page: handwritten title in the colour of its kind, Praxis buttons,
   and Jot reacting above it (praxis-notebook.js adds .nb-swal-jot + .nb-has-jot and plays the
   sound; without that script the stock icon simply stays). Nothing at the call sites changes.
   Calls that pass their own confirmButtonColor (inline style) or buttonsStyling:false keep it. ---- */
/* not for toasts: their container is a transparent column in a corner of the screen */
body.px-notebook:not(.swal2-toast-shown) .swal2-container.swal2-backdrop-show{ background:rgba(30,36,51,.44); }
/* While a popup is open SweetAlert forces html/body to height:auto. The shell is built on a
   full-height body (.app is height:100%), so the whole notebook would resize behind the popup. */
@media(min-width:861px){ html:root.swal2-height-auto,body.px-notebook.swal2-height-auto{ height:100% !important; } }
body.px-notebook .swal2-popup{ font-family:var(--font); color:var(--ink); }
body.px-notebook .swal2-popup:not(.swal2-toast){ position:relative; width:min(430px,calc(100vw - 32px)); padding:30px 26px 22px; border-radius:14px; background:#fff; border:1px solid var(--line); box-shadow:var(--shadow-lg),4px 5px 0 rgba(30,36,51,.08); overflow:visible; }
body.px-notebook .swal2-popup:not(.swal2-toast)::before{ content:""; position:absolute; top:-12px; left:50%; width:96px; height:24px; margin-left:-48px; background:rgba(255,255,255,.62); border:1px solid rgba(30,36,51,.1); transform:rotate(-2deg); box-shadow:0 1px 2px rgba(0,0,0,.06); }
body.px-notebook .swal2-popup.swal2-show{ animation:nb-note-in .32s cubic-bezier(.3,1.3,.5,1) both; }
body.px-notebook .swal2-popup.swal2-hide{ animation:nb-note-out .14s ease-in both; }
@keyframes nb-note-in{ from{ opacity:0; transform:translateY(-14px) rotate(-3deg) scale(.94); } to{ opacity:1; transform:none; } }
@keyframes nb-note-out{ to{ opacity:0; transform:translateY(8px) scale(.97); } }
body.px-notebook .swal2-popup .nb-swal-jot{ width:92px; margin:0 auto 2px; justify-self:center; }
body.px-notebook .swal2-popup.nb-has-jot .swal2-icon{ display:none !important; }
body.px-notebook .swal2-popup:not(.swal2-toast) .swal2-icon{ margin:4px auto 8px; transform:scale(.82); }
body.px-notebook .swal2-icon.swal2-success{ border-color:var(--nb-green); color:var(--nb-green); }
body.px-notebook .swal2-icon.swal2-success [class^="swal2-success-line"]{ background-color:var(--nb-green); }
body.px-notebook .swal2-icon.swal2-success .swal2-success-ring{ border-color:rgba(46,139,87,.3); }
body.px-notebook .swal2-icon.swal2-error{ border-color:var(--nb-red); color:var(--nb-red); }
body.px-notebook .swal2-icon.swal2-error [class^="swal2-x-mark-line"]{ background-color:var(--nb-red); }
body.px-notebook .swal2-icon.swal2-warning{ border-color:#E9B949; color:#B7791F; }
body.px-notebook .swal2-icon.swal2-info,body.px-notebook .swal2-icon.swal2-question{ border-color:var(--nb-pen); color:var(--nb-pen); }
body.px-notebook .swal2-popup:not(.swal2-toast) .swal2-title{ font-family:var(--font-hand); font-size:31px; font-weight:700; line-height:1.12; letter-spacing:0; color:var(--nb-pen); padding:6px 0 0; margin:0; }
body.px-notebook .swal2-popup.swal2-icon-success:not(.swal2-toast) .swal2-title{ color:var(--nb-green); }
body.px-notebook .swal2-popup.swal2-icon-error:not(.swal2-toast) .swal2-title{ color:var(--nb-red); }
body.px-notebook .swal2-popup.swal2-icon-warning:not(.swal2-toast) .swal2-title{ color:#8A5A00; }
body.px-notebook .swal2-popup:not(.swal2-toast) .swal2-html-container{ font-size:15px; line-height:1.55; color:var(--ink-2); margin:10px 0 0; padding:0; }
body.px-notebook .swal2-popup:not(.swal2-toast) .swal2-actions{ margin:20px 0 0; gap:10px; }
body.px-notebook .swal2-actions .swal2-styled{ margin:0; padding:11px 22px; border-radius:10px; font-family:var(--font); font-size:14.5px; font-weight:700; transition:transform .12s ease,box-shadow .12s ease; }
body.px-notebook .swal2-actions .swal2-styled:active{ transform:scale(.97); }
body.px-notebook .swal2-actions .swal2-styled.swal2-confirm{ background-color:var(--accent); color:#fff; box-shadow:2px 3px 0 rgba(30,36,51,.18); }
body.px-notebook .swal2-actions .swal2-styled.swal2-cancel{ background-color:#fff; color:var(--ink-2); box-shadow:inset 0 0 0 1.5px var(--line-strong); }
body.px-notebook .swal2-actions .swal2-styled.swal2-deny{ background-color:#fff; color:var(--nb-red); box-shadow:inset 0 0 0 1.5px var(--nb-red); }
body.px-notebook .swal2-actions .swal2-styled:focus-visible{ outline:3px solid var(--nb-pen-tint); outline-offset:2px; }
body.px-notebook .swal2-popup .swal2-close{ color:var(--ink-faint); border-radius:8px; }
body.px-notebook .swal2-popup .swal2-close:hover{ color:var(--nb-red); }
body.px-notebook .swal2-popup .swal2-input,body.px-notebook .swal2-popup .swal2-textarea,body.px-notebook .swal2-popup .swal2-select{ border:1.5px solid var(--line-strong); border-radius:10px; box-shadow:none; font-family:var(--font); font-size:15px; color:var(--ink); margin:14px 0 0; width:100%; box-sizing:border-box; }
body.px-notebook .swal2-popup .swal2-input:focus,body.px-notebook .swal2-popup .swal2-textarea:focus{ border-color:var(--nb-pen); box-shadow:0 0 0 3px var(--nb-pen-tint); }
body.px-notebook .swal2-popup .swal2-validation-message{ background:#FBF1EF; color:var(--nb-red); font-family:var(--font-hand); font-size:17px; border-radius:8px; margin:12px 0 0; }
body.px-notebook .swal2-popup .swal2-footer{ border-top:1px solid var(--nb-rule); color:var(--ink-muted); font-size:13px; }
body.px-notebook .swal2-timer-progress-bar{ background:var(--nb-pen); opacity:.55; }
/* toasts = a small sticky note */
body.px-notebook .swal2-popup.swal2-toast{ background:#FFF1A8; border-radius:3px; box-shadow:0 10px 20px rgba(30,36,51,.16),0 2px 4px rgba(30,36,51,.08); padding:10px 16px; }
body.px-notebook .swal2-popup.swal2-toast .swal2-title{ font-family:var(--font-hand); font-size:19px; font-weight:700; color:var(--nb-ink); }
body.px-notebook .swal2-popup.swal2-toast .swal2-html-container{ color:var(--ink-2); }
body.px-quiet .swal2-popup.swal2-show{ animation-duration:.01s; }

/* ---- inline messages (.alert boxes: "Logout successfully.", session warnings, form errors) ---- */
body.px-notebook .alert{ position:relative; border-radius:10px; border:1px solid var(--line); border-left-width:5px; padding:11px 14px; font-size:14px; font-weight:600; line-height:1.5; box-shadow:2px 3px 0 rgba(30,36,51,.05); }
body.px-notebook .alert-success{ background:#F0F7F2; color:#1F5E3A; border-color:#BFDCCB; border-left-color:var(--nb-green); }
body.px-notebook .alert-danger{ background:#FBF1EF; color:#8F2A22; border-color:#EFC9C4; border-left-color:var(--nb-red); }
body.px-notebook .alert-warning{ background:#FFF7DC; color:#7A4E00; border-color:#F3E4A8; border-left-color:var(--yellow); }
body.px-notebook .alert-info{ background:var(--nb-pen-tint); color:#1F4F66; border-color:#CFE0EA; border-left-color:var(--nb-pen); }

/* ---- AUTH PAGES (log in / register / forgot password / verify email) - layouts/notebook-auth.
   The same notebook as the app, open at its first pages: the desk, the coils, and the auth pages
   themselves as the flags, so moving between them - and logging in - turns the page. On the page:
   a welcome note with the brand picture taped in (left) and the form on a taped sheet (right)
   with Jot sitting on its edge, saying something about whatever you are doing. ---- */
body.px-notebook.nb-auth .stage{ padding:0; }
body.px-notebook.nb-auth .stage-inner{ position:relative; min-height:100%; display:grid; grid-template-columns:minmax(0,1.1fr) minmax(330px,450px); gap:clamp(28px,4vw,64px); align-items:center; padding-top:30px; padding-bottom:30px; }
/* Quiet / Sound sit in the top-right corner of the note's cell, beside the date */
body.px-notebook.nb-auth .stage-inner > .nb-auth-tools{ grid-column:1; grid-row:1; align-self:start; justify-self:end; z-index:3; }
.nb-auth-art{ grid-column:1; grid-row:1; position:relative; min-width:0; }
.nb-auth-head{ display:flex; align-items:center; gap:14px; min-height:42px; padding-right:150px; }
/* margin scribbles between the date and the buttons: they draw themselves in (.nb-draw) */
.nb-auth-doodles{ flex:1 1 0; min-width:0; height:44px; opacity:.7; overflow:visible; }
.nb-auth-art .nb-date{ margin-left:0; flex:none; z-index:0; }
.nb-auth-title{ font-size:clamp(34px,3.9vw,52px); letter-spacing:-.03em; line-height:1.12; margin-top:8px; color:var(--nb-ink); }
.nb-auth-title em{ font-style:normal; padding:0 6px; margin:0 -3px; background:linear-gradient(transparent 58%,var(--nb-hl) 58%,var(--nb-hl) 94%,transparent 94%); -webkit-box-decoration-break:clone; box-decoration-break:clone; }
.nb-auth-sub{ color:var(--ink-2); font-size:16px; line-height:1.6; margin-top:12px; max-width:500px; }
/* the brand picture, taped into the notebook like a photo */
.nb-photo{ position:relative; margin:26px 0 0 6px; padding:12px 12px 6px; background:#fff; width:min(100%,540px); border-radius:3px; box-shadow:0 14px 28px rgba(30,36,51,.14),0 2px 4px rgba(30,36,51,.08); transform:rotate(-1.6deg); transition:transform .3s cubic-bezier(.3,1.3,.5,1),box-shadow .3s ease; }
.nb-photo:hover{ transform:rotate(0deg) translateY(-3px); box-shadow:0 20px 36px rgba(30,36,51,.18),0 2px 4px rgba(30,36,51,.08); }
.nb-photo::before,.nb-photo::after{ content:""; position:absolute; top:-10px; width:84px; height:22px; background:rgba(255,255,255,.62); border:1px solid rgba(30,36,51,.1); box-shadow:0 1px 2px rgba(0,0,0,.06); z-index:1; }
.nb-photo::before{ left:-22px; transform:rotate(-38deg); top:6px; }
.nb-photo::after{ right:-22px; transform:rotate(36deg); top:6px; }
.nb-photo img{ display:block; width:100%; height:auto; }
.nb-photo figcaption{ font-family:var(--font-hand); font-size:21px; font-weight:700; color:var(--nb-pen); text-align:center; padding:4px 0 4px; line-height:1.2; }
/* the form sheet, with room above it for Jot */
.nb-auth-sheet{ grid-column:2; grid-row:1; position:relative; min-width:0; margin-top:58px; background:#fff; border:1px solid var(--line); border-radius:14px; box-shadow:var(--shadow-md); padding:28px 32px 24px; }
.nb-auth-sheet::before{ content:""; position:absolute; top:-11px; left:38px; width:96px; height:24px; background:rgba(255,255,255,.62); border:1px solid rgba(30,36,51,.1); transform:rotate(-3deg); box-shadow:0 1px 2px rgba(0,0,0,.06); }
.nb-auth-jot{ position:absolute; bottom:calc(100% - 16px); right:22px; width:88px; z-index:2; cursor:pointer; filter:drop-shadow(0 6px 8px rgba(30,36,51,.18)); }
.nb-auth-jot.is-hiding .m-zz{ display:none !important; }            /* eyes shut, not asleep */
.nb-auth-say{ position:absolute; bottom:calc(100% + 10px); right:118px; max-width:calc(100% - 150px); background:#FFF7DC; border:1px solid #F3E4A8; border-radius:12px 12px 3px 12px; padding:7px 12px; font-family:var(--font-hand); font-size:20px; font-weight:600; line-height:1.15; color:var(--nb-ink); box-shadow:2px 3px 0 rgba(30,36,51,.07); }
.nb-auth-logo{ display:block; width:184px; max-width:58%; height:auto; margin:0 auto 12px; }
.nb-auth-h{ font-family:var(--font-hand); font-size:30px; font-weight:700; color:var(--nb-pen); text-align:center; line-height:1.1; margin:0 0 4px; letter-spacing:0; }
.nb-auth-lead{ text-align:center; font-size:14px; color:var(--ink-muted); line-height:1.55; margin:0 0 14px; }
.nb-auth-h + form,.nb-auth-h + .nb-auth-body{ margin-top:14px; }
.nb-auth-sheet .field{ margin-bottom:15px; }
.nb-auth-sheet .field > label{ display:block; font-size:13.5px; font-weight:700; color:var(--ink-2); margin-bottom:6px; }
.nb-auth-sheet .input,.nb-auth-sheet select.input{ width:100%; height:48px; font-size:16px; }
.nb-auth-sheet .btn-primary{ width:100%; height:50px; font-size:16px; justify-content:center; }
.nb-auth-sheet .text-danger{ display:block; font-family:var(--font-hand); font-size:17px; font-weight:600; color:var(--nb-red); margin-top:4px; }
.nb-auth-row{ display:flex; justify-content:space-between; align-items:center; gap:12px; flex-wrap:wrap; font-size:14px; margin:-2px 0 18px; }
.nb-auth-row a,.nb-auth-alt a{ font-weight:700; }
.nb-auth-check{ display:inline-flex; align-items:center; gap:8px; cursor:pointer; font-weight:600; color:var(--ink-2); }
.nb-auth-check input{ width:18px; height:18px; margin:0; accent-color:var(--nb-pen); }
.nb-auth-alt{ text-align:center; font-size:14px; color:var(--ink-muted); margin-top:16px; }
.nb-pass{ position:relative; }
.nb-pass .input{ padding-right:48px; }
.nb-pass-eye{ position:absolute; right:6px; top:6px; width:36px; height:36px; border-radius:8px; color:var(--ink-muted); display:grid; place-items:center; }
.nb-pass-eye:hover{ background:var(--surface-2); color:var(--nb-pen); }
.nb-role{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.nb-role input{ position:absolute; opacity:0; pointer-events:none; }
.nb-role label{ display:flex; align-items:center; gap:10px; margin:0; padding:11px 12px; border:1.5px solid var(--line-strong); border-radius:10px; background:#fff; font-weight:600; font-size:14px; color:var(--ink-2); cursor:pointer; transition:border-color .16s,background .16s,box-shadow .16s; }
.nb-role label i{ color:var(--nb-pen); font-size:17px; }
.nb-role input:checked + label{ border-color:var(--nb-pen); background:var(--nb-pen-tint); box-shadow:0 0 0 3px var(--nb-pen-tint); color:var(--nb-ink); }
.nb-role input:focus-visible + label{ outline:3px solid var(--accent); outline-offset:2px; }
.nb-auth-done{ text-align:center; }
.nb-auth-done .nb-auth-big{ font-size:44px; color:var(--nb-green); margin:4px 0 8px; }
.nb-auth-done .alert{ text-align:left; margin:14px 0; }
.nb-auth-done .btn{ margin-top:6px; }
body.px-quiet .nb-auth-jot,body.px-quiet .nb-auth-say{ display:none; }
body.px-quiet .nb-auth-doodles{ visibility:hidden; }
body.px-quiet .nb-photo{ transform:none; }
/* laptops: the picture gives way first, then the note sits above the form */
@media(min-width:861px) and (max-width:1060px){
  body.px-notebook.nb-auth .stage-inner{ grid-template-columns:minmax(0,1fr); justify-items:center; gap:8px; }
  .nb-auth-art{ text-align:center; width:100%; } .nb-auth-sub{ margin-left:auto; margin-right:auto; }
  .nb-photo{ display:none; }
  .nb-auth-sheet{ grid-column:1; grid-row:2; width:min(100%,450px); }
}
@media(min-width:861px) and (max-height:760px){ .nb-photo{ width:min(100%,430px); margin-top:18px; } .nb-auth-sheet .field{ margin-bottom:12px; } }
/* phones: the form first, the note and the picture after it */
@media(max-width:860px){
  body.px-notebook.nb-auth .stage{ padding:0 0 36px; }
  body.px-notebook.nb-auth .stage-inner{ display:flex; flex-direction:column; gap:22px; padding-top:14px; min-height:0; }
  body.px-notebook.nb-auth .stage-inner > .nb-auth-tools{ align-self:flex-end; }
  .nb-auth-head{ padding-right:0; justify-content:center; }
  .nb-auth-sheet{ order:1; width:100%; max-width:460px; align-self:center; padding:24px 20px 20px; margin-top:62px; }
  .nb-auth-art{ order:2; text-align:center; }
  .nb-auth-sub{ margin-left:auto; margin-right:auto; }
  .nb-photo{ margin:22px auto 0; width:min(100%,420px); }
  .nb-auth-doodles{ display:none; }
}

/* ---- chat (messages + companion) ---- */
.nb-chat{ display:grid; grid-template-columns:320px 1fr; gap:20px; align-items:start; }
.nb-chat .conv-list{ display:flex; flex-direction:column; padding:8px; }
.nb-chat .conv{ display:flex; gap:12px; align-items:flex-start; padding:12px; border-radius:10px; text-decoration:none; color:inherit; border-left:3px solid transparent; }
.nb-chat .conv:hover{ background:var(--surface-2); }
.nb-chat .conv.is-active{ background:#FFFBEA; border-left-color:var(--yellow); }
.nb-chat .conv .avatar{ width:40px; height:40px; border-radius:50%; font-size:13px; }
.nb-chat .conv-name{ font-weight:700; font-size:14px; display:flex; justify-content:space-between; gap:8px; }
.nb-chat .conv-name time{ font-family:var(--font-hand); font-size:14px; color:var(--ink-faint); font-weight:600; }
.nb-chat .conv-snip{ font-size:12.5px; color:var(--ink-muted); margin-top:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:220px; }
.nb-chat .conv-sub{ font-size:11.5px; color:var(--ink-faint); }
.nb-chat .conv .nav-badge{ position:static; box-shadow:none; margin-left:6px; }
.nb-chat .thread{ display:flex; flex-direction:column; min-height:620px; }
.nb-chat .thread-head{ display:flex; align-items:center; gap:12px; padding:14px 18px; border-bottom:1px solid var(--line); }
.nb-chat .thread-head .avatar{ width:40px; height:40px; border-radius:50%; font-size:13px; }
.nb-chat .thread-head .who{ line-height:1.2; } .nb-chat .thread-head .nm{ font-weight:700; } .nb-chat .thread-head .hd{ font-size:12px; color:var(--ink-muted); }
.nb-chat .thread-body{ flex:1; padding:18px; display:flex; flex-direction:column; gap:14px; background-image:repeating-linear-gradient(0deg,transparent,transparent 27px,var(--nb-rule) 28px); }
.nb-chat .day-sep{ align-self:center; font-family:var(--font-hand); font-size:15px; color:var(--ink-faint); background:#fff; padding:0 10px; }
.nb-chat .msg{ display:flex; gap:10px; max-width:78%; align-items:flex-end; }
.nb-chat .msg.me{ align-self:flex-end; flex-direction:row-reverse; }
.nb-chat .msg .avatar,.nb-chat .msg .px-mascot-slot{ width:30px; height:30px; border-radius:50%; font-size:11px; flex:none; }
.nb-chat .bubble{ background:#fff; border:1px solid var(--line); border-radius:12px 12px 12px 3px; padding:10px 13px; font-size:14px; line-height:1.5; box-shadow:1px 2px 0 rgba(30,36,51,.05); }
.nb-chat .msg.me .bubble{ background:var(--nb-pen-tint); border-color:#CFE0EA; border-radius:12px 12px 3px 12px; }
.nb-chat .msg.bot .bubble{ background:#FFF7DC; border-color:#F3E4A8; }
.nb-chat .bubble time{ display:block; font-family:var(--font-hand); font-size:13px; color:var(--ink-faint); margin-top:4px; }
.nb-chat .bubble .vle-frac{ font-size:.9em; }
.nb-chat .composer{ display:flex; gap:10px; align-items:center; padding:12px 14px; border-top:1px solid var(--line); }
.nb-chat .composer input{ flex:1; border:1.5px solid var(--line-strong); border-radius:10px; padding:11px 14px; font:inherit; font-size:14px; outline:none; background:#fff; }
.nb-chat .composer input:focus{ border-color:var(--nb-pen); box-shadow:0 0 0 3px var(--nb-pen-tint); }
.nb-chat .composer .send{ width:44px; height:44px; border-radius:10px; background:var(--accent); color:#fff; display:grid; place-items:center; box-shadow:2px 3px 0 rgba(30,36,51,.18); }
.nb-chat .chips{ display:flex; gap:8px; flex-wrap:wrap; padding:0 18px 14px; }
.nb-chat .masked{ background:var(--surface-inset); border-radius:4px; padding:0 5px; color:var(--ink-muted); font-weight:600; }
.nb-chat > *{ min-width:0; }                         /* a wide thread header must never widen the column */
.nb-chat .thread-head{ flex-wrap:wrap; row-gap:10px; }
.nb-chat .bubble{ min-width:0; overflow-wrap:anywhere; }
@media(max-width:1000px){ .nb-chat{ grid-template-columns:1fr; } .nb-chat .conv-list{ flex-direction:row; overflow-x:auto; } .nb-chat .conv{ min-width:220px; } .nb-chat .thread{ min-height:520px; } .nb-chat .thread-head .px-ladder{ margin-left:0 !important; width:100%; max-width:none !important; } .nb-chat .msg{ max-width:92%; } }

/* ---- misc new-page pieces ---- */
.nb-stat-row{ display:flex; gap:12px; flex-wrap:wrap; }
.nb-stat{ display:flex; align-items:center; gap:10px; padding:10px 14px; border:1px solid var(--line); border-radius:10px; background:#fff; font-size:13px; color:var(--ink-2); }
.nb-stat b{ font-family:var(--font-hand); font-size:22px; color:var(--nb-pen); line-height:1; }
.nb-status{ display:inline-flex; align-items:center; gap:6px; font-family:var(--font-hand); font-size:15px; font-weight:700; padding:3px 10px; border-radius:4px; }
.nb-status.open{ background:#FFF7DC; color:#8A5A00; } .nb-status.accepted{ background:#F0F7F2; color:var(--nb-green); } .nb-status.declined{ background:#FBF1EF; color:var(--nb-red); } .nb-status.review{ background:var(--nb-pen-tint); color:var(--nb-pen); }
.nb-steps{ display:flex; align-items:center; gap:0; margin-bottom:22px; flex-wrap:wrap; }
.nb-step{ display:flex; align-items:center; gap:10px; font-size:13.5px; font-weight:600; color:var(--ink-muted); }
.nb-step .n{ width:28px; height:28px; border-radius:50%; border:2px solid var(--line-strong); display:grid; place-items:center; font-family:var(--font-hand); font-size:16px; color:var(--ink-muted); background:#fff; }
.nb-step.done .n{ background:var(--nb-green); border-color:var(--nb-green); color:#fff; }
.nb-step.now{ color:var(--ink); } .nb-step.now .n{ border-color:var(--nb-pen); color:var(--nb-pen); }
.nb-step + .nb-step::before{ content:""; width:54px; height:2px; background:var(--line-strong); margin:0 12px; }
.nb-plan{ position:relative; border:1.5px solid var(--line); border-radius:14px; padding:22px; background:#fff; box-shadow:var(--shadow-sm); }
.nb-plan.is-picked{ border-color:var(--nb-pen); box-shadow:0 0 0 3px var(--nb-pen-tint),var(--shadow-sm); }
.nb-plan .pname{ font-family:var(--font-hand); font-size:24px; color:var(--nb-pen); font-weight:700; }
.nb-plan .pprice{ font-size:36px; font-weight:800; letter-spacing:-.02em; margin:4px 0 10px; }
.nb-plan .pprice small{ display:block; font-size:13.5px; color:var(--ink-muted); font-weight:600; letter-spacing:0; margin-top:2px; }
.nb-plan ul{ margin:0; padding:0; list-style:none; display:flex; flex-direction:column; gap:7px; font-size:13.5px; color:var(--ink-2); }
.nb-plan li i{ color:var(--nb-green); margin-right:7px; }
.nb-plan .ribbon{ position:absolute; top:-10px; right:16px; font-family:var(--font-hand); font-size:15px; font-weight:700; background:var(--yellow); color:var(--nb-ink); padding:2px 10px; border-radius:4px; transform:rotate(2deg); box-shadow:1px 2px 0 rgba(30,36,51,.15); }
.nb-check{ display:flex; align-items:center; gap:12px; padding:12px 14px; border:1.5px solid var(--line); border-radius:10px; background:#fff; cursor:pointer; }
.nb-check.is-on{ border-color:var(--nb-pen); background:var(--nb-pen-tint); }
.nb-check .box{ width:22px; height:22px; border-radius:6px; border:2px solid var(--line-strong); display:grid; place-items:center; color:transparent; font-size:12px; flex:none; }
.nb-check.is-on .box{ background:var(--nb-pen); border-color:var(--nb-pen); color:#fff; }
.nb-sched-day{ display:flex; flex-direction:column; align-items:center; gap:6px; padding:12px 6px; border:1.5px solid var(--line); border-radius:10px; background:#fff; cursor:pointer; min-width:0; }
.nb-sched-day.is-on{ border-color:var(--nb-pen); background:var(--nb-pen-tint); }
.nb-sched-day b{ font-family:var(--font-hand); font-size:18px; color:var(--nb-pen); }
.nb-sched-day span{ font-size:11.5px; color:var(--ink-muted); }
.nb-sched-grid{ display:grid; grid-template-columns:repeat(7,1fr); gap:8px; }
@media(max-width:560px){ .nb-sched-grid{ grid-template-columns:repeat(4,1fr); } }
/* in-page tab strip (my-classroom). NOT .nb-tabs - that is the sidebar MODE class on <body>. */
.nb-tabstrip{ display:flex; gap:4px; border-bottom:2px solid var(--nb-rule); margin-bottom:18px; overflow-x:auto; }
.nb-tabstrip > button{ padding:10px 16px; font-weight:600; font-size:14px; color:var(--ink-muted); border-bottom:3px solid transparent; margin-bottom:-2px; white-space:nowrap; }
.nb-tabstrip > button.is-active{ color:var(--ink); border-bottom-color:var(--yellow); }
.nb-tabstrip > button .cnt{ font-family:var(--font-hand); font-size:15px; color:var(--nb-pen); margin-left:6px; }
.nb-member{ display:flex; align-items:center; gap:11px; padding:10px 0; border-bottom:1px solid var(--nb-rule); }
.nb-member:last-child{ border-bottom:0; }
.nb-member .avatar{ width:36px; height:36px; border-radius:50%; font-size:12px; }
.nb-member .nm{ font-weight:600; font-size:13.5px; } .nb-member .sub{ font-size:11.5px; color:var(--ink-faint); }
.nb-post{ padding:16px 0; border-bottom:1px solid var(--nb-rule); }
.nb-post:last-child{ border-bottom:0; }
.nb-post .ph{ display:flex; align-items:center; gap:10px; margin-bottom:8px; }
.nb-post .ph .avatar{ width:34px; height:34px; border-radius:50%; font-size:12px; }
.nb-post .ph b{ font-size:14px; } .nb-post .ph time{ font-family:var(--font-hand); font-size:14px; color:var(--ink-faint); margin-left:auto; }
.nb-post p{ font-size:14px; line-height:1.6; color:var(--ink-2); }
.nb-pin{ font-family:var(--font-hand); font-size:14px; color:var(--nb-pen); font-weight:700; }
.nb-timeline{ position:relative; padding-left:26px; }
.nb-timeline::before{ content:""; position:absolute; left:8px; top:6px; bottom:6px; width:2px; background:var(--nb-rule); }
.nb-tl{ position:relative; padding:0 0 18px; }
.nb-tl::before{ content:""; position:absolute; left:-23px; top:5px; width:12px; height:12px; border-radius:50%; background:#fff; border:2.5px solid var(--nb-pen); }
.nb-tl.done::before{ background:var(--nb-green); border-color:var(--nb-green); }
.nb-tl .t{ font-weight:700; font-size:14px; } .nb-tl .m{ font-family:var(--font-hand); font-size:14px; color:var(--ink-faint); }
.nb-tl p{ font-size:13.5px; color:var(--ink-2); margin-top:4px; line-height:1.55; }
.nb-quote{ border-left:3px solid var(--yellow); background:#FFF7DC; border-radius:0 10px 10px 0; padding:12px 14px; font-size:14px; line-height:1.55; color:var(--ink-2); }
