/* ============================================================================
   Study-pack selection (new checkout, impl spec §7). Scoped to .pk-screen and its
   partials. Tokens: §7.5. Poppins (inherited). Grid 3->2 (<1000px) ->1 (<640px).
   ============================================================================ */
/* The pack screens' private names are aliases of static/css/tokens.css (spec section 6). The
   19 standard names come from the .qv-tokens container (templates/parent_wizard.html's
   #dashboard-mode and #wizard-mode), so --ink and --warn resolve to the standard here even
   though the parent shell's test_page.css:10/16 sets them to something else on :root. Values
   are what this block spelled out, except --green-tint (#e7f4ee, now the standard's #e7f5ed). */
.pk-screen{ --navy:var(--ink); --blue:var(--action); --blue-tint:var(--tint); --green:var(--go);
  --green-tint:var(--go-tint); --amber:var(--warn); --amber-tint:var(--warn-tint);
  --grey:var(--ink3); --grey-fill:#eef1f6; color:var(--navy); }

/* head */
.pk-head{ display:flex; align-items:flex-start; justify-content:space-between; gap:16px; margin-bottom:20px; }
.pk-title{ font-size:1.55rem; font-weight:700; color:var(--navy); margin:0 0 4px; letter-spacing:-.01em; }
.pk-substudent{ font-size:.95rem; color:var(--grey); margin:0; }

/* cart button */
.pk-cartbtn{ display:inline-flex; align-items:center; gap:8px; flex:0 0 auto; background:var(--grey-fill);
  border:1px solid transparent; color:var(--navy); font-weight:600; font-size:.92rem; border-radius:10px;
  padding:9px 15px; cursor:pointer; transition:background .15s, border-color .15s, box-shadow .15s; }
.pk-cartbtn:not(.empty){ background:var(--blue-tint); border-color:var(--blue); color:var(--blue); }
.pk-cartbtn:hover{ box-shadow:0 3px 10px rgba(31,52,80,.10); }
.pk-cartcount{ min-width:20px; height:20px; padding:0 6px; border-radius:999px; background:var(--blue); color:#fff;
  font-size:.75rem; font-weight:700; display:inline-flex; align-items:center; justify-content:center; }

/* grid */
.pk-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:20px; align-items:start; }
@media (max-width:1000px){ .pk-grid{ grid-template-columns:repeat(2,1fr); } }
@media (max-width:640px){ .pk-grid{ grid-template-columns:1fr; } }

/* card */
.pk-card{ display:flex; flex-direction:column; background:#fff; border:1px solid var(--rule); border-radius:14px;
  padding:18px; box-shadow:0 1px 2px rgba(11,23,48,.06), 0 1px 3px rgba(11,23,48,.10);
  transition:transform .15s ease, box-shadow .15s ease; }
.pk-card--featured{ border-color:var(--amber); box-shadow:0 8px 26px rgba(143,93,18,.12); }
.pk-card-top{ display:flex; align-items:flex-start; justify-content:space-between; gap:10px; margin-bottom:6px; }
.pk-name{ font-size:1.06rem; font-weight:700; line-height:1.3; color:var(--navy); margin:0; }
.pk-badge{ flex:0 0 auto; background:var(--amber-tint); color:var(--amber); font-size:.72rem; font-weight:700;
  letter-spacing:.02em; border-radius:999px; padding:.34em .7em; white-space:nowrap; }
.pk-audience{ font-size:.845rem; color:var(--grey); margin:0 0 12px; line-height:1.45; }

/* description ticks */
.pk-desc{ list-style:none; margin:0 0 14px; padding:0; }
.pk-desc li{ position:relative; padding-left:24px; margin:0 0 8px; font-size:.875rem; line-height:1.5; color:#39465a; }
.pk-desc li:last-child{ margin-bottom:0; }
.pk-desc li::before{ content:""; position:absolute; left:2px; top:.28em; width:13px; height:8px;
  border-left:2px solid var(--green); border-bottom:2px solid var(--green); transform:rotate(-45deg); }

/* expiry sits on the pack name's line, right-aligned under any badge (owner 2026-09-21:
   it must not lead the description). The practice-tournament card keeps its own line. */
.pk-expiry{ font-size:.85rem; font-weight:700; color:var(--navy); margin:0 0 10px; padding:0; border:0; }
.pk-top-meta{ flex:0 1 auto; display:flex; flex-direction:column; align-items:flex-end; gap:4px; max-width:48%; text-align:right; }
.pk-top-meta .pk-expiry{ margin:0; font-size:.78rem; font-weight:600; line-height:1.35; color:var(--grey); }

/* owned chips */
.pk-owned{ display:flex; flex-wrap:wrap; gap:6px; margin:12px 0 0; }

/* choices */
.pk-choices{ margin-top:16px; }
.pk-choices-label{ font-size:.8rem; font-weight:600; color:var(--navy); margin-bottom:8px; }
.pk-chips{ display:flex; flex-wrap:wrap; gap:8px; }
.pk-choice, .pk-set{ display:inline-flex; align-items:center; gap:7px; background:#fff; border:1.5px solid var(--rule2);
  color:var(--navy); font-size:.875rem; font-weight:500; border-radius:9px; padding:7px 12px; cursor:pointer;
  transition:border-color .14s, background .14s, color .14s; }
.pk-choice:hover, .pk-set:hover{ border-color:var(--blue); }
.pk-choice[aria-pressed="true"], .pk-set[aria-pressed="true"]{ border:2px solid var(--blue); background:var(--blue-tint); color:var(--blue); padding:6.5px 11px; }
.pk-choice[disabled], .pk-set[disabled]{ background:var(--grey-fill); color:var(--grey); border-color:transparent; cursor:not-allowed; }
.pk-tick{ width:13px; height:13px; border-radius:3px; border:1.5px solid var(--rule2); flex:0 0 auto; position:relative; }
.pk-choice[aria-pressed="true"] .pk-tick{ border-color:var(--blue); background:var(--blue); }
.pk-choice[aria-pressed="true"] .pk-tick::after{ content:""; position:absolute; left:3px; top:0px; width:5px; height:9px;
  border-right:2px solid #fff; border-bottom:2px solid #fff; transform:rotate(40deg); }
.pk-swatch{ width:13px; height:13px; border-radius:3px; border:1px solid rgba(31,52,80,.25); flex:0 0 auto; }

/* regional set rows */
/* one aligned grid per set row (owner 2026-09-17): the subject name owns a
   fixed column and the chips wrap inside their own, so wrapped chips line up
   under each other at every card width -- no ragged edge, no mobile special
   case. A light rule separates the rows. */
/* Parent Onboarding V2 fix (2026-09-18): name column widened 64px -> 80px. At
   64px the longest subject ("Geography") overflowed its track by a few px and
   the trailing "y" was overpainted by the first set chip's white fill, reading
   as "Geograph". This clip is width-independent (fixed track), so it showed at
   every viewport -- most visible at 375px. 80px fits "Geography" (the longest of
   Geography/History/Science) while preserving the aligned-column intent; chips
   keep ample room and their 2-up wrap is unchanged. */
.pk-choices--sets .pk-setrow{ display:grid; grid-template-columns:80px minmax(0,1fr); gap:6px 10px;
  align-items:start; margin-bottom:10px; padding-bottom:10px; border-bottom:1px solid #eef1f6; }
.pk-choices--sets .pk-setrow:last-child{ margin-bottom:0; padding-bottom:0; border-bottom:0; }
.pk-setrow-name{ font-size:.875rem; font-weight:600; color:var(--navy); padding-top:7px; }

/* recommendation box (one style: the upgrade offer is always a saving) */
.pk-reco{ margin-top:14px; border:2px solid var(--amber); background:var(--amber-tint); color:var(--amber);
  border-radius:10px; padding:11px 13px; font-size:.85rem; line-height:1.45; }
.pk-reco b{ display:block; margin-bottom:3px; }

/* footer */
.pk-foot{ display:flex; align-items:flex-end; justify-content:space-between; gap:12px; margin-top:auto; padding-top:18px; }
.pk-action{ flex:0 1 auto; background:var(--blue); border:1px solid var(--blue); color:#fff; font-weight:600;
  font-size:.92rem; border-radius:10px; padding:10px 18px; cursor:pointer; transition:background .15s, transform .12s; }
.pk-action:hover:not([disabled]){ background:#274f8c; transform:translateY(-1px); }
.pk-action[disabled]{ background:var(--grey-fill); border-color:transparent; color:var(--grey); cursor:not-allowed; }
.pk-action.in-cart{ background:var(--green-tint); border-color:var(--green); color:var(--green); }
.pk-price{ text-align:right; font-variant-numeric:tabular-nums; }
.pk-price-amount{ display:block; font-size:1.38rem; font-weight:700; color:var(--navy); line-height:1.1; }
.pk-price-unit{ display:block; font-size:.78rem; color:var(--grey); }
.pk-price .pk-price-was{ display:block; font-size:.82rem; color:var(--grey); text-decoration:line-through; }

/* empty states */
.pk-empty{ text-align:center; color:var(--grey); background:#fff; border:1px dashed var(--rule2); border-radius:14px;
  padding:26px 20px; margin-top:8px; }
.pk-empty .btn{ margin-left:8px; }

/* bottom bar */
.pk-bar{ position:fixed; left:0; right:0; bottom:0; z-index:40; display:flex; align-items:center;
  justify-content:space-between; gap:16px; background:#fff; border-top:1px solid var(--rule);
  box-shadow:0 -6px 20px rgba(31,52,80,.08); padding:12px 24px; }
.pk-bar-sum{ font-size:.95rem; font-weight:600; color:var(--navy); font-variant-numeric:tabular-nums; }
.pk-bar-continue{ min-width:150px; }
/* Boards C-7/F-4.8: Back beside Continue on the configure bar. */
.pk-bar-actions{display:flex;gap:8px;align-items:center}

/* hidden attribute must win over the display rules above */
.pk-cartcount[hidden], .pk-owned[hidden], .pk-reco[hidden], .pk-price[hidden], .pk-empty[hidden], .pk-bar[hidden]{ display:none !important; }

/* ---- cart drawer (I-12) ---- */
.pk-drawer[hidden]{ display:none !important; }
.pk-drawer{ position:fixed; inset:0; z-index:60; }
.pk-drawer-scrim{ position:absolute; inset:0; background:rgba(20,32,48,.42); }
.pk-drawer-panel{ position:absolute; top:0; right:0; bottom:0; width:410px; max-width:100%; background:#fff;
  box-shadow:-8px 0 30px rgba(20,32,48,.18); display:flex; flex-direction:column; }
.pk-drawer-head{ display:flex; align-items:center; justify-content:space-between; padding:18px 20px; border-bottom:1px solid var(--rule); }
.pk-drawer-head h3{ margin:0; font-size:1.15rem; color:var(--navy); }
.pk-drawer-close{ border:none; background:none; font-size:1.6rem; line-height:1; color:var(--grey); cursor:pointer; }
.pk-drawer-body{ flex:1 1 auto; overflow-y:auto; overscroll-behavior:contain; padding:12px 20px; }
body.pk-drawer-open{ overflow:hidden; }   /* M-7: the page behind the drawer does not scroll (pack_cart.js sets the class; it had no rule) */
.pk-drawer-empty{ color:var(--grey); text-align:center; margin-top:32px; }
.pk-drawer-line{ display:flex; align-items:flex-start; justify-content:space-between; gap:12px; padding:12px 0; border-bottom:1px solid var(--rule); }
.pk-drawer-line b{ display:block; font-size:.9rem; color:var(--navy); font-weight:600; }
.pk-drawer-scope{ display:block; font-size:.8rem; color:var(--grey); margin-top:2px; }
.pk-drawer-right{ display:flex; align-items:center; gap:10px; white-space:nowrap; }
.pk-drawer-price{ font-weight:600; color:var(--navy); font-variant-numeric:tabular-nums; }
.pk-drawer-x{ border:none; background:none; font-size:1.2rem; color:var(--grey); cursor:pointer; line-height:1; }
.pk-drawer-foot{ border-top:1px solid var(--rule); padding:16px 20px; }
.pk-drawer-row{ display:flex; justify-content:space-between; font-size:.9rem; color:#39465a; margin-bottom:7px; font-variant-numeric:tabular-nums; }
.pk-drawer-total{ font-weight:700; color:var(--navy); font-size:1rem; border-top:1px dashed var(--rule2); padding-top:9px; margin-top:3px; }
.pk-drawer-continue{ width:100%; margin-top:12px; }

/* ---- owned items (I-5) ---- */
.pk-choice.owned, .pk-set.owned{ background:var(--grey-fill); color:var(--grey); border-color:transparent; cursor:not-allowed; }
.pk-choice.owned .pk-tick{ background:var(--grey); border-color:var(--grey); }
.pk-choice.owned .pk-tick::after{ content:""; position:absolute; left:3px; top:0; width:5px; height:9px; border-right:2px solid #fff; border-bottom:2px solid #fff; transform:rotate(40deg); }
.pk-action.owned-lbl{ color:var(--grey); font-weight:600; }

/* ---- review + pay (I-13) ---- */
.pk-review{ max-width:640px; margin:0 auto; }
.pk-review-card,.pk-money{ background:#fff; border:1px solid var(--rule); border-radius:14px; padding:4px 18px; margin-bottom:16px; }
.pk-money{ padding:16px 18px; }
/* W6: "Review your cart" under the step's title -- what to DO, where the title says where you are. */
.pk-review-lead{ margin:0 0 16px; font-size:.95rem; line-height:1.5; color:var(--grey); }

/* One group per kind inside a student's card. The pencil edits the STEP, not a line: the group can
   hold several practice tournaments and W5's ticks are the lines, so there is one way back to them
   and it is here. */
.pk-review-kind + .pk-review-kind{ border-top:1px solid var(--rule); }
/* The same 18px column every other row in the card uses. With no horizontal padding the label
   hung 18px left of every other label and the button 18px right of every other control -- the
   only row in the card that did not line up. */
.pk-review-kindhead{ display:flex; align-items:center; justify-content:space-between; gap:10px;
  padding:14px 18px 4px; }
.pk-review-kindname{ font-size:.78rem; font-weight:700; letter-spacing:.06em; text-transform:uppercase;
  color:var(--grey); }
/* Named for the glyph it used to hold; it is the group's "Edit" text button now. A 34px hit
   area, with the right padding pulled back so the LABEL lands on the 18px column rather than the
   padding box doing it. */
.pk-review-pencil{ -webkit-appearance:none; appearance:none; background:none; border:0;
  color:var(--blue); font:inherit; font-weight:600; font-size:.85rem; cursor:pointer;
  min-height:34px; padding:3px 7px; margin:0 -7px 0 0; border-radius:7px; line-height:1.2;
  transition:background .15s ease, color .15s ease; }
.pk-review-pencil:hover{ background:var(--blue-tint); }
.pk-review-pencil:focus{ outline:none; }
.pk-review-pencil:focus-visible{ outline:2px solid var(--blue); outline-offset:2px; }

.pk-review-line{ display:flex; align-items:flex-start; justify-content:space-between; gap:12px; padding:14px 0; border-bottom:1px solid var(--rule); }
.pk-review-line:last-child{ border-bottom:none; }
/* the name may wrap; the price never leaves the right-hand edge and never wraps mid-figure */
.pk-review-lineinfo{ min-width:0; }
.pk-review-lineinfo b{ display:block; overflow-wrap:anywhere; }
.pk-review-lineright{ display:flex; align-items:center; gap:8px; flex:0 0 auto; }
.pk-review-lineright .pk-drawer-price{ white-space:nowrap; }
.pk-fee-note{ font-size:.8rem; color:var(--grey); margin:8px 0 0; }
/* the server's refusal of one line (BadOrderLineError), in its words, where the total would be */
.pk-review-refused{ margin:0; font-size:.92rem; font-weight:600; color:var(--warn); background:var(--warn-tint); border:1.5px solid var(--warn); border-radius:10px; padding:10px 14px; }
.pk-terms{ margin-bottom:16px; font-size:.9rem; color:#39465a; }
.pk-terms label{ display:flex; gap:9px; align-items:flex-start; }
.pk-review-actions{ display:flex; justify-content:space-between; gap:12px; }
.pk-pay{ min-width:220px; }

/* ---- Pro coverage + upgrade reco (I-10/I-11) ---- */
.pk-choice.covered, .pk-set.covered{ background:var(--grey-fill); color:var(--grey); border-color:transparent; cursor:not-allowed; }
.pk-reco-btn{ display:block; width:100%; margin-top:10px; background:var(--navy); border:1px solid var(--navy); color:#fff; font-weight:600; font-size:.88rem; border-radius:9px; padding:9px 14px; cursor:pointer; }
.pk-reco-btn:hover{ background:#16263b; }
.pk-reco[hidden]{ display:none !important; }

/* ---- multi-student review (I-7/I-13) ---- */
.pk-review-studenthead{ font-weight:700; color:var(--navy); font-size:.95rem; padding:12px 0 4px; border-bottom:1px solid var(--rule); margin-bottom:4px; }
/* Other-students ask. W6 moved it BELOW the order and tinted it: above the order it was read as
   part of the chrome and skipped, and by the time a parent wants a sibling in the order they have
   just read what it costs. It is the last thing before Pay, so it is the last thing they see. */
.pk-ask{ display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:10px 18px;
  background:var(--blue-tint); border:1px solid var(--blue); border-radius:12px; padding:14px 16px; margin-bottom:16px; }
.pk-ask[hidden]{ display:none !important; }
.pk-ask-lead{ margin:0; font-size:.92rem; color:var(--navy); font-weight:600; flex:1 1 260px; }

/* ---- all-set / what happens next (I-14) ---- */
/* W7: a green top edge on the card, so the outcome is legible before a word is read. The receipt
   row sits under the message: what was paid, split into price and card fee, and where it went. */
.pk-allset-card{ border-top:4px solid var(--go); border-radius:16px; }
.pk-receipt{ display:flex; flex-wrap:wrap; justify-content:center; gap:4px 20px;
  max-width:560px; margin:0 auto 20px; padding:12px 16px;
  background:var(--go-tint); border-radius:12px; font-size:.92rem; line-height:1.5; color:var(--ink); }
.pk-receipt[hidden]{ display:none !important; }
.pk-receipt-part{ white-space:nowrap; }
.pk-receipt-k{ color:var(--grey); }
.pk-receipt-split{ color:var(--grey); font-weight:400; }
/* a phone takes the two parts on a line each, rather than shrinking a figure to fit beside a label */
@media (max-width:520px){
  .pk-receipt{ flex-direction:column; align-items:flex-start; text-align:left; }
  .pk-receipt-part{ white-space:normal; overflow-wrap:anywhere; }
}

.pk-allset-order{ max-width:560px; margin:0 auto 22px; text-align:left; }
.pk-allset-student{ background:#fff; border:1px solid var(--rule); border-radius:12px; padding:12px 16px; margin-bottom:10px; }
.pk-allset-student b{ color:var(--navy); }
.pk-allset-student ul{ margin:6px 0 0; padding-left:18px; color:#39465a; font-size:.9rem; }
.pk-allset-next{ max-width:560px; margin:0 auto; text-align:left; }
.pk-next-row{ display:flex; gap:14px; padding:12px 0; border-bottom:1px solid var(--rule); }
.pk-next-row:last-child{ border-bottom:none; }
.pk-next-when{ flex:0 0 150px; color:var(--blue); font-weight:600; font-size:.85rem; }
.pk-next-body b{ display:block; color:var(--navy); font-size:.92rem; }
.pk-next-body span{ color:#5b6676; font-size:.86rem; }
/* Parent Onboarding V2 mobile fix (2026-09-18): scope this mobile reset to
   .pk-allset-next (specificity 0,2,0) so it beats the later unscoped
   `.pk-next-when{ flex:0 0 128px }` in UI POLISH v11 (line ~657, specificity
   0,1,0, wins on source order otherwise). Without this the 128px flex-basis is
   read as a fixed HEIGHT under flex-direction:column, forcing a ~128px dead gap
   above every "what happens next" row on phones. Desktop (>560px) unchanged. */
@media (max-width:560px){ .pk-allset-next .pk-next-row{ flex-direction:column; gap:2px; } .pk-allset-next .pk-next-when{ flex:none; } }

/* ---- choose-student picker (mock Step 1 / F-2) ---- */
.pk-choose{ max-width:760px; margin:0 auto; }
.pk-choose-list{ display:grid; grid-template-columns:repeat(2,1fr); gap:14px; margin:18px 0 24px; }
@media (max-width:640px){ .pk-choose-list{ grid-template-columns:1fr; } }

/* ============================================================================
   UI POLISH v2 (2026-09-16) — pack wizard.
   • Pill stepper identical to the tests-page segmented filter (.td-filter):
     #eef1f6 track, sliding slate #2c3e50 indicator, coral focus.
   • Palette: slate-black #2c3e50 = forward CTA + stepper current; blue #2f5fa6 =
     in-context selection; coral #e86e6c/#df5a55 = accents/focus; green = in-cart.
   • Token scope fix (choose + review saw undefined vars → invisible card borders).
   • 3-up grid de-cramp (widen shell, 3→2→1 breakpoints, stretch, footer pinned).
   • Micro-interactions: card/chip/button hover + press, reduced-motion aware.
   ============================================================================ */

/* ---- token scope: choose + review must see the pack tokens (fixes invisible cards) ---- */
.pk-choose, .pk-review, .pk-screen{
  --navy:var(--ink); --blue:var(--action); --blue-deep:var(--action-deep); --blue-tint:var(--tint);
  --green:var(--go); --green-tint:var(--go-tint); --amber:var(--warn); --amber-tint:var(--warn-tint);
  --grey:var(--ink3); --grey-fill:#eef1f6;
  --slate:var(--nav); --slate-deep:#24333f; --coral:var(--vidya); --coral-ring:#df5a55;
}
.pk-choose, .pk-review{ color:var(--navy); }

/* ---- widen the shell so the 3-up grid breathes (mock parity) ---- */
.container{ max-width:1320px; }
.wizard-content{ padding:40px 44px; }
@media (max-width:1240px){ .wizard-content{ padding:34px 30px; } }
@media (max-width:767.98px){ .wizard-content{ padding:22px 16px; } }

/* ==========================================================================
   PILL STEPPER — look/feel/animation of the tournaments-list filter pill
   ========================================================================== */
.progress-bar{ background:#fff !important; border-bottom:1px solid var(--rule) !important;
  padding:20px 24px 18px !important; }
/* Full-width strip in the IAC registration wizard's format (owner 2026-09-17):
   white card pill spanning the content, hexagon number badges, navy current
   step with a gold badge, green done steps that KEEP their number. The words
   stay QuizVidya's own. */
.pk-stepper{ position:relative; display:flex; gap:0; align-items:center; align-content:center;
  flex-wrap:nowrap; justify-content:stretch;
  width:100%; background:#fff; border:1px solid #E3E7EF; border-radius:999px;
  padding:5px; box-shadow:0 1px 2px rgba(11,23,48,.06), 0 1px 3px rgba(11,23,48,.08); }
.pk-stepper .progress-line{ display:none !important; }
.pk-stepper::before{ content:none !important; }             /* old rail track */
.pk-stepper-pill{ position:absolute; top:0; left:0; z-index:0; width:0; height:0; margin:0; opacity:0;
  pointer-events:none; background:#14264A; border-radius:999px; box-shadow:0 1px 3px rgba(11,23,48,.24);
  transition:transform .38s cubic-bezier(.34,1.26,.44,1), width .3s cubic-bezier(.4,0,.2,1),
             height .3s ease, opacity .2s ease; }
/* flex-basis auto (owner 2026-10-21): with four steps on the narrower Student card, equal quarters cut
   "QuizVidya study packs" and "Practice Tournaments" short; each step now starts from its own label */
.pk-stepper .step{ position:relative; z-index:1; flex:1 1 auto; min-width:0; display:flex; flex-direction:row;
  align-items:center; justify-content:center; gap:8px; margin:0; padding:8px 10px; border-radius:999px;
  background:transparent; cursor:pointer; transition:color .26s cubic-bezier(.4,0,.2,1); }
.pk-stepper .step:hover{ transform:none; }
.pk-stepper .step-circle{ width:20px; height:22px; min-width:20px; border:0; margin:0; border-radius:0;
  clip-path:polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
  background:#E8EDF6; color:#1D3461; font-size:12px; font-weight:700; display:grid; place-items:center;
  transition:background .26s ease, color .26s ease; }
.pk-stepper .step-label{ margin:0; font-size:13.5px; font-weight:600; color:#4A5468; white-space:nowrap;
  overflow:hidden; text-overflow:ellipsis; transition:color .26s ease; }
.pk-stepper .step:not(.active):not(.completed):hover,
.pk-stepper .step:not(.active):not(.completed):hover .step-label{ color:#14264A; }
/* current — text rides above the sliding navy pill; badge goes gold */
.pk-stepper .step.active,
.pk-stepper .step.active .step-label{ color:#fff; }
.pk-stepper .step.active .step-circle{ background:#E9A820; color:#0B1730; }
/* done — green, the number stays visible */
.pk-stepper .step.completed .step-label{ color:#1F7A55; }
.pk-stepper .step.completed .step-circle{ background:#E2F3EB; color:#1F7A55; }
.pk-stepper .step:focus-visible{ outline:2px solid #E9A820; outline-offset:2px; }
/* a phone shows the CURRENT step's name and only the numbers of the others
   (IAC pattern): the labels stay in the markup for screen readers. Measured: all three names fit
   from about 500px up, so the fold ends at 520 rather than 640 -- above it the pill spreads its
   three labels instead of floating a small cluster in a wide bar. */
@media (max-width:520px){
  /* the pill takes its content's width and is centred in the parent's content box, so the space
     either side is equal AND belongs to the outer container -- a full-width pill around a 212px
     cluster reads as two uneven white areas, however exactly the cluster is centred inside it */
  .pk-stepper{ width:max-content; max-width:100%; margin-inline:auto; padding:5px; gap:6px; justify-content:center; }
  .pk-stepper .step{ flex:0 0 auto; }
  .pk-stepper .step:not(.active){ gap:0; padding:8px 9px; }
  .pk-stepper .step:not(.active) .step-label{ font-size:0; }
  /* the current step is the only one that may shrink, and its name stays on one line */
  .pk-stepper .step.active{ flex:0 1 auto; min-width:0; padding:8px 14px; }
  .pk-stepper .step.active .step-label{ white-space:nowrap; text-align:left; line-height:1.25; font-size:.82rem; }
}
/* Four steps (the Practice Tournaments step, owner 2026-10-21) do not fit their names below 900px:
   E2E at 768 cut every label ("Stude...", "Review and p..."). The phone treatment applies there too --
   the current step named, the others by number -- and the steps sit closer so the current name fits
   at 390 in Safari as well. :has() reads whether step 5 is on the strip (parent_wizard.js updateProgress). */
@media (max-width:900px){
  .pk-stepper:has(#step5:not([hidden])){ width:max-content; max-width:100%; margin-inline:auto; padding:5px; gap:4px; justify-content:center; }
  .pk-stepper:has(#step5:not([hidden])) .step{ flex:0 0 auto; }
  .pk-stepper:has(#step5:not([hidden])) .step:not(.active){ gap:0; padding:8px 7px; }
  .pk-stepper:has(#step5:not([hidden])) .step:not(.active) .step-label{ font-size:0; }
  .pk-stepper:has(#step5:not([hidden])) .step.active{ flex:0 1 auto; min-width:0; padding:8px 12px; }
  .pk-stepper:has(#step5:not([hidden])) .step.active .step-label{ white-space:nowrap; text-align:left; line-height:1.25; font-size:.82rem; }
  /* the bottom bar between phone and desktop: the buttons take their words' width, Continue on one
     line ("Continue: Practice Tournaments" broke over three at 768) */
  #wizardBar .pk-bar-sum{ flex:1 1 0; min-width:0; }
  #wizardBar .pk-bar-actions{ flex:0 0 auto; }
  /* width:auto beats parent_wizard.css's sitewide .btn{width:100%} at 768 and below, which split the
     bar in two equal halves and pushed Continue off a tablet's edge (E2E, WebKit 768) */
  #wizardBar .pk-bar-actions .btn{ min-width:0; width:auto; }
  #wizardBar .pk-bar-actions .pk-bar-continue{ white-space:nowrap; }
}
@media (prefers-reduced-motion:reduce){ .pk-stepper-pill{ transition:opacity .2s ease; } }

/* ==========================================================================
   BUTTON PALETTE — beat wizard_polish's forced #007bff (loads earlier)
   ========================================================================== */
/* forward CTA (Continue / Pay) = slate-black, matches the tournament Buy-now CTA */
#wizard-mode .btn-primary{ background:var(--nav) !important; border:1px solid var(--nav) !important; color:#fff !important;
  box-shadow:0 2px 6px rgba(20,32,48,.18) !important; }
#wizard-mode .btn-primary:hover:not(:disabled){ background:#24333f !important; border-color:#24333f !important;
  box-shadow:0 7px 18px rgba(20,32,48,.26) !important; transform:translateY(-1px); }
#wizard-mode .btn-primary:active:not(:disabled){ transform:translateY(0); box-shadow:0 2px 6px rgba(20,32,48,.22) !important; }
#wizard-mode .btn-primary:disabled,#wizard-mode .btn-primary[disabled]{ background:#aeb8ca !important;
  border-color:#aeb8ca !important; box-shadow:none !important; transform:none !important; }
/* secondary / back = quiet neutral outline (was forced loud blue) */
#wizard-mode .btn-secondary{ background:#fff !important; border:1.5px solid var(--rule2) !important; color:var(--nav) !important;
  box-shadow:none !important; min-width:auto; }
#wizard-mode .btn-secondary:hover{ background:#f4f7fb !important; border-color:var(--nav) !important; color:var(--nav) !important;
  box-shadow:0 3px 10px rgba(20,32,48,.10) !important; transform:translateY(-1px); }
#wizard-mode .btn-secondary:active{ transform:translateY(0); box-shadow:none !important; }
#wizard-mode .btn:focus-visible{ outline:2px solid #df5a55 !important; outline-offset:2px; }

/* ==========================================================================
   CHOOSE-STUDENT (Step 1)
   ========================================================================== */
.pk-choose{ max-width:720px; }
.pk-choose > .pk-title{ margin-bottom:22px; }
.pk-choose-list{ margin:0 0 22px; gap:16px; }
.pk-choose .buttons{ margin-top:4px; }

/* ==========================================================================
   PACKS GRID (Step 2) — de-cramp + even card bottoms
   ========================================================================== */
.pk-grid{ gap:22px; align-items:stretch; }
@media (max-width:1240px){ .pk-grid{ grid-template-columns:repeat(2,1fr); } }
@media (max-width:1000px){ .pk-grid{ grid-template-columns:repeat(2,1fr); } }
@media (max-width:700px){ .pk-grid{ grid-template-columns:1fr; } }
.pk-card{ padding:18px; transition:transform .15s ease, box-shadow .15s ease, border-color .15s ease; }
.pk-card:hover{ box-shadow:0 4px 10px rgba(11,23,48,.09), 0 10px 24px rgba(11,23,48,.14); transform:translateY(-2px); }
.pk-card--featured:hover{ box-shadow:0 12px 30px rgba(143,93,18,.16); }
.pk-card-top{ align-items:flex-start; gap:12px; margin-bottom:8px; }
.pk-name{ font-size:1.08rem; line-height:1.32; }
.pk-foot{ padding-top:16px; }
/* selection accent = blue; in-cart = green (keep). press feedback on chips */
.pk-choice:active, .pk-set:active{ transform:scale(.97); }
.pk-choice, .pk-set{ transition:border-color .14s, background .14s, color .14s, transform .1s ease; }
/* regional-set rows stay inline, name top-aligned to its chip row */
.pk-choices--sets .pk-setrow{ align-items:flex-start; }
.pk-setrow-name{ padding-top:7px; }
/* add-to-cart micro-lift */
.pk-action:active:not([disabled]){ transform:translateY(0); }

/* ==========================================================================
   CART BUTTON + BOTTOM BAR
   ========================================================================== */
.pk-cartbtn{ border-radius:999px; padding:8px 15px; }
.pk-cartbtn:hover{ transform:translateY(-1px); box-shadow:0 4px 12px rgba(31,52,80,.12); }
.pk-cartbtn:not(.empty){ background:var(--blue-tint); border-color:var(--blue); color:var(--blue); }
.pk-bar{ padding:12px 24px; }
.pk-bar-inner, .pk-bar > *{ }
.pk-bar-sum b{ color:var(--navy); }

/* ==========================================================================
   REVIEW & PAY (Step 3) — real card chrome (was invisible: undefined tokens)
   ========================================================================== */
.pk-review{ max-width:680px; margin:0 auto; }
.pk-review > .pk-title{ margin-bottom:4px; }
.pk-review-body{ background:#fff; border:1px solid var(--rule); border-radius:14px; padding:2px 18px;
  margin:14px 0 16px; box-shadow:0 2px 10px rgba(31,52,80,.05); }
.pk-review-studenthead{ padding:14px 0 8px; }
.pk-money{ box-shadow:0 2px 10px rgba(31,52,80,.05); }
/* (v2b ask re-tint retired 2026-09-17 -- the ask is now the white initial-chip
   strip defined above, leading the review page) */
.pk-terms{ background:#fff; border:1px solid var(--rule); border-radius:12px; padding:14px 16px;
  margin-bottom:16px; box-shadow:0 2px 10px rgba(31,52,80,.05); }
.pk-terms a{ color:var(--blue); font-weight:600; }
/* Pay pressed with the policy box unticked (E2E 2026-10-05): the box is pointed at, and says why */
.pk-terms.is-needed{ border-color:var(--coral); outline:2px solid var(--coral); outline-offset:2px; }
.pk-terms-msg{ margin:8px 0 0; color:var(--coral); font-weight:600; font-size:.92rem; }
.pk-review-actions .pk-pay{ min-width:220px; }

/* ============================================================================
   UI POLISH v2b (2026-09-16) — override wizard_polish.css's #wizard-mode rules
   (they use ID + !important, so we must match specificity + !important).
   ============================================================================ */

/* ---- packs step needs a wide canvas; the form/welcome/review steps stay narrow ---- */
@media (min-width:1000px){
  .container:has(#screen-packs.active){ max-width:1320px !important; }
  #wizard-mode:has(#screen-packs.active){ max-width:1240px !important; width:100% !important; }
  #wizard-mode:has(#screen-packs.active) .wizard-content{ padding:36px 40px 30px !important; }
}

/* ---- stepper: own the pill look over wizard_polish's dots+line ---- */
#wizard-mode .progress-bar{ background:#fff !important; padding:20px 24px 18px !important; }
#wizard-mode .progress-steps::before{ content:none !important; }
#wizard-mode .progress-line{ display:none !important; }
#wizard-mode .pk-stepper{ align-items:center !important; align-content:center !important; flex-wrap:nowrap !important; }
#wizard-mode .pk-stepper .step{ margin:0 !important; padding:8px 10px !important; }
#wizard-mode .pk-stepper .step-circle{ width:20px !important; height:22px !important; min-width:20px;
  position:relative; border:0 !important; margin:0 !important; border-radius:0 !important;
  clip-path:polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
  background:#E8EDF6 !important; color:#1D3461 !important;
  font-size:12px !important; font-weight:700 !important; box-shadow:none !important; }
#wizard-mode .pk-stepper .step-label{ font-size:13.5px !important; margin:0 !important; color:#4A5468 !important;
  font-weight:600 !important; letter-spacing:normal; }
#wizard-mode .pk-stepper .step:not(.active):not(.completed):hover,
#wizard-mode .pk-stepper .step:not(.active):not(.completed):hover .step-label{ color:#14264A !important; }
/* current — white text over the sliding navy pill; gold badge */
#wizard-mode .pk-stepper .step.active,
#wizard-mode .pk-stepper .step.active .step-label{ color:#fff !important; }
#wizard-mode .pk-stepper .step.active .step-circle{ background:#E9A820 !important; color:#0B1730 !important;
  transform:none !important; box-shadow:none !important; }
/* done — green, and the NUMBER stays (no check glyph). Weight 600 as the IAC registration app's
   .step.done (owner 2026-10-20: wizard_polish.css's 500 left done steps faint); this rule outranks it. */
#wizard-mode .pk-stepper .step.completed .step-label{ color:#1F7A55 !important; font-weight:600 !important; }
#wizard-mode .pk-stepper .step.completed .step-circle{ background:#E2F3EB !important; color:#1F7A55 !important;
  font-size:12px !important; }
#wizard-mode .pk-stepper .step.completed .step-circle::after{ content:none !important; }
/* the same fold as the unscoped block above, at the same 520px, restated with !important because
   wizard_polish.css sets the step type with !important too. Keep the two in step. */
@media (max-width:520px){
  #wizard-mode .pk-stepper{ width:max-content !important; max-width:100% !important; margin-inline:auto !important;
    gap:6px !important; justify-content:center !important; }
  #wizard-mode .pk-stepper .step{ flex:0 0 auto !important; }
  #wizard-mode .pk-stepper .step:not(.active){ gap:0 !important; padding:8px 9px !important; }
  #wizard-mode .pk-stepper .step:not(.active) .step-label{ font-size:0 !important; }
  #wizard-mode .pk-stepper .step.active{ flex:0 1 auto !important; min-width:0; padding:8px 14px !important; }
  #wizard-mode .pk-stepper .step.active .step-label{ font-size:.82rem !important; white-space:nowrap; text-align:left; line-height:1.25; }
}
/* the four-step fold (see the unscoped block above, max-width:900px), restated with !important for
   the same reason. Keep the two in step. */
@media (max-width:900px){
  #wizard-mode .pk-stepper:has(#step5:not([hidden])){ width:max-content !important; max-width:100% !important; margin-inline:auto !important;
    gap:4px !important; justify-content:center !important; }
  #wizard-mode .pk-stepper:has(#step5:not([hidden])) .step{ flex:0 0 auto !important; }
  #wizard-mode .pk-stepper:has(#step5:not([hidden])) .step:not(.active){ gap:0 !important; padding:8px 7px !important; }
  #wizard-mode .pk-stepper:has(#step5:not([hidden])) .step:not(.active) .step-label{ font-size:0 !important; }
  #wizard-mode .pk-stepper:has(#step5:not([hidden])) .step.active{ flex:0 1 auto !important; min-width:0; padding:8px 12px !important; }
  #wizard-mode .pk-stepper:has(#step5:not([hidden])) .step.active .step-label{ font-size:.82rem !important; white-space:nowrap; text-align:left; line-height:1.25; }
}

/* ---- chip compaction so subjects/sets sit inline in the 3-up grid ---- */
.pk-choice, .pk-set{ padding:6px 11px; }
.pk-choice[aria-pressed="true"], .pk-set[aria-pressed="true"]{ padding:5px 10px; }
.pk-setrow-name{ flex:0 0 80px; }  /* inert here (grid item); kept in sync with the 80px track above */

/* ---- UI POLISH v2c retired 2026-09-17: on phones the stepper now follows the
   IAC pattern (current step named, others number-only) — see the 640px block. ---- */

/* ---- UI POLISH v2d: cart drawer must overlay the fixed navbar (z-index:1000) ---- */
.pk-drawer{ z-index:2000 !important; }

/* ---- UI POLISH v2e: dual-flow — keep the OLD 6-step add-student stepper visually unchanged ---- */
#wizard-mode #progressStepsAdd::before{ content:'' !important; }              /* restore rail (v2b killed it globally) */
#wizard-mode #progressStepsAdd .progress-line{ display:block !important; }   /* restore progress fill */
#wizard-mode .progress-bar{ background:#fbfcfe !important; padding:24px 40px 18px !important; }  /* restore shared bar */
/* ...and keep it responsive. wizard_polish.css narrows the stepper at 820px and 600px, but this
   file loads after it, so the line above was silently cancelling both: at 375px the stepper kept
   40px of side padding against the content's 16px. These track .wizard-content's own gutters, so
   the stepper, the heading and the cards all start on one line down the page. */
@media (max-width:820px){ #wizard-mode .progress-bar{ padding:20px 28px 16px !important; } }
@media (max-width:600px){ #wizard-mode .progress-bar{ padding:16px 16px 16px !important; } }

/* ---- UI POLISH v2f: keep the OLD add-student wizard's buttons blue (unchanged); slate CTAs are buy-only ---- */
#wizard-mode:not(.flow-buy) .btn-primary{ background:var(--wz-blue) !important; border:1px solid var(--wz-blue) !important; color:#fff !important; box-shadow:0 1px 2px rgba(0,123,255,.18) !important; }
#wizard-mode:not(.flow-buy) .btn-primary:hover:not(:disabled){ background:var(--wz-blue-deep) !important; border-color:var(--wz-blue-deep) !important; }
#wizard-mode:not(.flow-buy) .btn-primary:disabled,#wizard-mode:not(.flow-buy) .btn-primary[disabled]{ background:#aeb8ca !important; border-color:#aeb8ca !important; }
#wizard-mode:not(.flow-buy) .btn-secondary{ background:var(--wz-blue) !important; border:1px solid var(--wz-blue) !important; color:#fff !important; box-shadow:0 1px 2px rgba(0,123,255,.18) !important; }
#wizard-mode:not(.flow-buy) .btn-secondary:hover{ background:var(--wz-blue-deep) !important; border-color:var(--wz-blue-deep) !important; color:#fff !important; }

/* ============================================================================
   UI POLISH v3 (2026-09-16) — Step 1 "Who are you buying for?" (choose student).
   Avatar anchor + status pills + chevron affordance; spacious, glanceable, palette-true.
   ============================================================================ */
.pk-choose{ max-width:760px; margin:0 auto; }
.pk-choose > .pk-title{ text-align:center; margin:0 0 7px; font-size:1.6rem; letter-spacing:-.015em; }
.pk-choose-sub{ text-align:center; color:var(--grey); font-size:.95rem; line-height:1.5; margin:0 auto 28px; max-width:44ch; }
.pk-choose-list{ display:grid; grid-template-columns:repeat(2,1fr); gap:14px; margin:0 0 22px; }
@media (max-width:640px){ .pk-choose-list{ grid-template-columns:1fr; } }

/* W15: the avatar student cards (.pk-scard*, .pk-av*) and their status pills (.pk-spill*) are
   gone with the markup, replaced by W2's radio cards (.pk-radio-card, further down). They were
   three separate blocks of rules for elements nothing renders any more. */
.pk-choose .buttons{ justify-content:center; margin-top:2px; }
@media (max-width:480px){
  .pk-choose > .pk-title{ font-size:1.4rem; }
}

/* ============================================================================
   UI POLISH v4 (2026-09-16) — Step 2 packs + cart drawer.
   Card state edges, owned/covered chip labels, "already has" summary, animated
   grouped drawer. Palette-true, consistent with Step 1.
   ============================================================================ */

/* ---- card state edges (glanceable: in cart = green, being picked = blue) ---- */
.pk-card.pk-card--incart{ border-color:var(--green); box-shadow:0 10px 24px rgba(30,138,90,.12); }
.pk-card:has(.pk-choice[aria-pressed="true"], .pk-set[aria-pressed="true"]):not(.pk-card--incart){ border-color:var(--blue); }
.pk-card.pk-card--incart:hover{ box-shadow:0 14px 30px rgba(30,138,90,.16); }

/* ---- owned / covered chip labels (mock M-3) ---- */
.pk-choice[data-owned]::after, .pk-set[data-owned]::after{ content:"Has it"; margin-left:3px; font-size:.66rem; font-weight:700; color:var(--green); letter-spacing:.01em; }
.pk-choice[data-covered]::after, .pk-set[data-covered]::after{ content:"In Pro"; margin-left:3px; font-size:.66rem; font-weight:700; color:var(--blue); letter-spacing:.01em; }

/* ---- "{Student} already has" summary (mock M-3 .has) ---- */
.pk-owned-summary{ background:#f4f7fb; border:1px solid var(--rule); border-radius:12px; padding:12px 16px;
  margin:0 0 18px; display:flex; flex-direction:column; gap:3px; }
.pk-owned-summary-head{ color:var(--navy); font-size:.9rem; font-weight:700; margin-bottom:2px; }
.pk-owned-summary-item{ color:#5b6676; font-size:.85rem; line-height:1.45; }
.pk-owned-summary[hidden]{ display:none !important; }

/* ---- upgrade reco / credit box refinement ---- */
.pk-reco{ line-height:1.5; }
.pk-reco-btn{ transition:background .16s ease, transform .1s ease; }
.pk-reco-btn:hover{ background:#16263b; transform:translateY(-1px); }
.pk-reco-btn:active{ transform:translateY(0); }

/* ============================================================================
   CART DRAWER — slide-in, student grouping, refined lines + empty state
   ============================================================================ */
.pk-drawer-scrim{ opacity:0; transition:opacity .3s ease; }
.pk-drawer.pk-open .pk-drawer-scrim{ opacity:1; }
.pk-drawer-panel{ transform:translateX(100%); transition:transform .34s cubic-bezier(.33,1,.68,1); will-change:transform; }
.pk-drawer.pk-open .pk-drawer-panel{ transform:translateX(0); }
@media (prefers-reduced-motion:reduce){ .pk-drawer-panel{ transition:none; } .pk-drawer-scrim{ transition:none; } }

.pk-drawer-head h3{ font-weight:700; }
.pk-drawer-close{ width:32px; height:32px; border-radius:9px; display:grid; place-items:center; font-size:1.5rem;
  transition:background .15s ease, color .15s ease; }
.pk-drawer-close:hover{ background:#eef1f6; color:var(--navy); }

/* student group header */
.pk-drawer-who{ display:flex; align-items:baseline; gap:9px; padding:15px 0 7px; margin-bottom:2px;
  border-bottom:2px solid var(--blue-tint); }
.pk-drawer-who:first-child{ padding-top:2px; }
.pk-drawer-who-name{ font-weight:700; color:var(--navy); font-size:.95rem; }
.pk-drawer-who-grade{ font-size:.8rem; color:var(--grey); font-weight:500; }

.pk-drawer-line{ align-items:flex-start; gap:14px; padding:13px 0; }
.pk-drawer-info{ min-width:0; }
.pk-drawer-line b{ font-size:.92rem; line-height:1.35; }
.pk-drawer-scope{ margin-top:3px; }
.pk-drawer-x{ width:24px; height:24px; border-radius:7px; display:grid; place-items:center; font-size:1.15rem;
  transition:background .15s ease, color .15s ease; }
.pk-drawer-x:hover{ background:#fdecec; color:#d4605c; }
.pk-drawer-price{ font-size:.92rem; }

/* empty state */
.pk-drawer-empty{ display:flex; flex-direction:column; align-items:center; text-align:center; gap:5px;
  color:var(--grey); margin-top:52px; }
.pk-drawer-empty b{ color:var(--navy); font-size:1.02rem; }
.pk-drawer-empty-ic{ width:52px; height:52px; border-radius:16px; background:#eef2f8; margin-bottom:10px;
  position:relative; }
.pk-drawer-empty-ic::after{ content:""; position:absolute; left:15px; top:16px; width:22px; height:16px;
  border:2px solid #b8c2d2; border-radius:0 0 5px 5px; border-top:0;
  box-shadow:0 -7px 0 -5px #b8c2d2; }

/* continue button in the drawer foot inherits the slate CTA (flow-buy) */
.pk-drawer-continue{ margin-top:14px; }

/* ---- UI POLISH v5: Free Trial Pack card (I-8, behind free_trial_enabled) ---- */
.pk-badge--free{ background:var(--green-tint); color:var(--green); }
.pk-price-free{ color:var(--green); }
.pk-trial-note{ margin:10px 0 0; font-size:.82rem; color:var(--amber); background:var(--amber-tint);
  border:1px solid #f0e0bd; border-radius:9px; padding:8px 11px; line-height:1.4; }
.pk-trial-note[hidden]{ display:none !important; }
/* .pk-quote-err (a failed price quote, said on the card): the trial note's own amber look; the
   class is pack_cart.js's hook, no rules of its own */
.pk-card--trial .pk-choices{ margin-top:14px; }

/* ============================================================================
   UI POLISH v6 (2026-09-16) — Step 3 Review & pay. Per-student group cards with
   header + subtotal + Edit, consistent chrome/palette with Steps 1-2.
   ============================================================================ */
.pk-review{ max-width:680px; margin:0 auto; }
.pk-review > .pk-title{ text-align:center; margin:0 0 6px; font-size:1.6rem; letter-spacing:-.015em; }
.pk-review-sub{ text-align:center; color:var(--grey); font-size:.95rem; margin:0 auto 24px; }

/* per-student group card */
.pk-review-card{ background:#fff; border:1px solid var(--rule); border-radius:14px; overflow:hidden;
  margin:0 0 16px; padding:0; box-shadow:0 2px 10px rgba(31,52,80,.05); }
.pk-review-grouphead{ display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding:12px 18px; background:#fafbfd; border-bottom:1px solid var(--rule); }
.pk-review-groupwho{ display:flex; align-items:baseline; gap:9px; min-width:0; }
.pk-review-groupwho b{ color:var(--navy); font-size:1rem; font-weight:700; }
.pk-review-groupwho span{ color:var(--grey); font-size:.82rem; font-weight:500; }

.pk-review-line{ display:flex; align-items:flex-start; justify-content:space-between; gap:14px;
  padding:13px 18px; border-top:1px solid var(--rule); }
.pk-review-grouphead + .pk-review-line{ border-top:0; }
.pk-review-lineinfo{ min-width:0; }
.pk-review-lineinfo b{ font-size:.92rem; color:var(--navy); font-weight:600; line-height:1.35; }
.pk-review-lineright{ display:flex; align-items:center; gap:10px; white-space:nowrap; }
.pk-review-lineright .pk-drawer-price{ font-size:.92rem; }
/* money + terms cards (refine) */
.pk-money{ box-shadow:0 2px 10px rgba(31,52,80,.05); }
.pk-money .pk-drawer-total{ font-size:1.05rem; }
/* The consent line is a SENTENCE, so its label is a paragraph -- not a flex row.
   As a flex container the label's three bare runs ("I agree to the" / the Purchase Policy link /
   ". All sales are final...") became three flex items with a gap between them, which wrapped at
   1440 where the sentence fits one line, and stacked into min-content columns on a phone. The
   2026-09-18 fix dropped flex below 560px only, on the assumption that desktop was one line;
   measured, it was two. One paragraph at every width, with the box in a 27px gutter so wrapped
   lines align under each other rather than under the checkbox. */
.pk-terms{ display:block; }
.pk-terms label{ display:block; position:relative; padding-left:27px; margin:0; line-height:1.55; }
.pk-terms label > input[type="checkbox"]{ position:absolute; left:0; top:.2em; float:none;
  margin:0; width:17px; height:17px; accent-color:var(--blue); }
.pk-review-actions{ margin-top:0; }
.pk-review-actions .pk-pay{ min-width:230px; }
@media (max-width:520px){
  .pk-review > .pk-title{ font-size:1.4rem; }
  .pk-review-actions{ flex-direction:column-reverse; gap:10px; }
  .pk-review-actions .btn{ width:100%; }
}

/* ---- UI POLISH v7: reserve space so the fixed bottom bar never covers the page footer ---- */
body.pk-has-bar { padding-bottom: 84px; }

/* ---- UI POLISH v8: bar docks above the footer (JS-driven bottom); drop the reserved gap ---- */
body.pk-has-bar { padding-bottom: 0; }

/* ---- UI POLISH v9: breathing room around the docked bar (card <-> bar <-> footer) ---- */
body.pk-has-bar #wizard-mode { margin-bottom: 112px; }

/* ---- UI POLISH v10: enough room below the pack card so the docked bar floats clear (beats wizard_polish's 44px !important) ---- */
/* the spacer that keeps the last card clear of the fixed bar grows with the home indicator */
body.pk-has-bar #wizard-mode.wizard-container { margin-bottom: calc(100px + env(safe-area-inset-bottom, 0px)) !important; }

/* ============================================================================
   UI POLISH v11 (2026-09-16) — "You're all set" (step 6). Green success medallion,
   card chrome on the order + what-happens-next, consistent with Steps 1-3.
   ============================================================================ */
#wizard-mode .pk-allset .success-screen{ max-width:620px; margin:0 auto; padding:8px 0!important; }
#wizard-mode .pk-allset .success-icon{ width:64px!important; height:64px!important; border-radius:50%!important;
  background:var(--green-tint)!important; color:var(--green)!important; display:flex!important; align-items:center;
  justify-content:center; box-shadow:none!important; margin:0 auto 16px!important; font-size:1.6rem!important; }
#wizard-mode .pk-allset .success-icon i{ color:var(--green)!important; }
#wizard-mode .pk-allset .success-title{ color:var(--navy)!important; font-size:1.6rem!important; letter-spacing:-.015em; }
#wizard-mode .pk-allset .success-message{ color:var(--grey)!important; font-size:.95rem!important; margin:0 auto 26px!important; }

/* order summary — bordered cards like the review groups */
.pk-allset-order{ max-width:620px; }
.pk-allset-student{ box-shadow:0 2px 10px rgba(31,52,80,.05); padding:14px 16px; border-radius:14px; }
.pk-allset-student b{ font-size:.98rem; }
.pk-allset-student ul{ margin:7px 0 0; padding-left:18px; }

/* what-happens-next — one bordered card, left-aligned heading, blue "when" labels */
.pk-allset-next{ max-width:620px; background:#fff; border:1px solid var(--rule); border-radius:14px;
  padding:4px 18px 8px; box-shadow:0 2px 10px rgba(31,52,80,.05); }
#wizard-mode .pk-allset .pk-allset-next .summary-title{ text-align:left!important; font-size:1rem!important;
  font-weight:700!important; color:var(--navy)!important; margin:15px 0 2px!important; }
.pk-next-row{ padding:13px 0; align-items:flex-start; }
.pk-next-when{ flex:0 0 128px; color:var(--blue); font-weight:600; font-size:.84rem; }
.pk-next-body b{ font-size:.93rem; }
.pk-next-body span{ line-height:1.5; }

/* buttons centered + consistent */
#wizard-mode .pk-allset .buttons{ max-width:620px; margin:24px auto 0!important; justify-content:center; gap:12px; }
@media (max-width:560px){ #wizard-mode .pk-allset .buttons{ flex-direction:column-reverse; } #wizard-mode .pk-allset .buttons .btn{ width:100%; } }

/* ---- token scope for the all-set screen (green medallion + real borders) ---- */
.pk-allset{ --navy:var(--ink); --blue:var(--action); --blue-tint:var(--tint); --green:var(--go);
  --green-tint:var(--go-tint); --amber:var(--warn); --amber-tint:var(--warn-tint);
  --grey:var(--ink3); --coral:var(--vidya); }

/* Parent Onboarding V2 — S-1 catalog */
.pk-home-welcome{display:flex;justify-content:space-between;align-items:center;gap:24px;background:#fff;border:1px solid var(--rule2);border-radius:14px;padding:18px 22px;margin-bottom:16px;flex-wrap:wrap}
.pk-home-title{font-size:24px;font-weight:700;letter-spacing:-.02em;margin:0}
.pk-home-sub{font-size:15px;color:var(--ink2);margin:4px 0 0;max-width:720px}
.pk-price-from .pk-price-amount::before{content:"From ";font-size:13px;font-weight:500;color:var(--ink3)}
.pk-card--practice{border-left:4px solid var(--vidya);flex-direction:row;align-items:center;gap:24px}
.pk-card--practice .pk-practice-body{flex:1;display:flex;flex-direction:column;gap:8px}
@media(max-width:640px){.pk-card--practice{flex-direction:column;align-items:stretch}}

/* Parent Onboarding V2 — B-1 pick line (Task 4, previously unstyled) */
.pk-pick-line{font-size:14px;color:var(--ink3);margin:0 0 12px;text-align:center}

/* Parent Onboarding V2 — B-2 focus bar (pre-filtered step 2 + "Show all packs") */
.pk-focusbar{display:flex;align-items:center;justify-content:space-between;gap:12px;background:var(--tint);border:1.5px solid var(--action);border-radius:12px;padding:10px 16px;margin-bottom:12px}
.pk-focusbar .pk-showall{background:#fff;color:var(--action);border:1.5px solid var(--rule2)}

/* ============================================================================
   PARENT ONBOARDING V2 -- UI POLISH PASS (2026-09-18)
   Catalog (S-1) + shared .pk-card/.pk-action/.video-link/.pk-showall micro-
   interactions. Additive + token-based (per owner: pack_select.css is shared
   with the regular add-student wizard, so this must read as one system there
   too, not a second look bolted on for onboarding only).
   ============================================================================ */

/* ---- 6. welcome bar: more air, real elevation (matches card system, not flat-pasted) ---- */
.pk-home-welcome{ padding:22px 26px; margin-bottom:22px;
  box-shadow:0 1px 2px rgba(11,23,48,.05), 0 1px 3px rgba(11,23,48,.08); }
.pk-home-title{ line-height:1.25; }
.pk-home-sub{ margin-top:6px; line-height:1.5; }
@media (max-width:640px){
  .pk-home-welcome{ flex-direction:column; align-items:flex-start; padding:18px; gap:14px; }
  .pk-home-welcome .video-link{ align-self:stretch; justify-content:center; }
}

/* ---- 4. practice-tests section: reads as a distinct section, not a continuation
   of the packs grid (was a bare 10px inline margin-top with no rule) ---- */
.pk-head--section{ margin-top:40px; padding-top:28px; border-top:1px solid var(--rule2); }

/* ---- 2. buttons: hover lift + press + real focus-visible ring, on top of what
   already exists (.pk-action already darkens+lifts on hover; this fills the
   gaps -- min tap target, focus ring, and killing Bootstrap's default blue
   .btn:focus glow, which is what actually made "Get this pack" / "Start free
   trial" look broken: a stray blue halo fighting the slate/coral palette on
   every click since these buttons carry the bare .btn class with no
   .btn-primary/.btn-secondary variant to source Bootstrap's focus-ring color from) ---- */
.pk-action{ min-height:44px; display:inline-flex; align-items:center; justify-content:center; }
.pk-action:focus{ box-shadow:none; }
.pk-action:focus-visible{ outline:2px solid var(--action); outline-offset:2px; box-shadow:none; }

.pk-showall{ min-height:36px; transition:background .15s ease, border-color .15s ease, color .15s ease, transform .15s ease; }
.pk-showall:hover{ background:var(--tint); border-color:var(--action); transform:translateY(-1px); }
.pk-showall:active{ transform:translateY(0); }
.pk-showall:focus{ box-shadow:none; }
.pk-showall:focus-visible{ outline:2px solid var(--action); outline-offset:2px; }

#wizard-mode .video-link{ min-height:44px !important; display:inline-flex !important; align-items:center !important; }
.video-link:focus{ box-shadow:none; }
#wizard-mode .video-link:focus-visible{ outline:2px solid var(--action) !important; box-shadow:none !important; }

/* ---- 7. responsive: practice card's price/CTA stay full-width and legible once it stacks ---- */
@media (max-width:640px){
  .pk-card--practice .pk-action{ width:100%; }
  .pk-card--practice .pk-price{ text-align:left; }
}

/* ---- respect prefers-reduced-motion: keep the state change (shadow/color), drop the motion ---- */
@media (prefers-reduced-motion:reduce){
  .pk-card, .pk-card:hover,
  .pk-action, .pk-action:hover, .pk-action:active,
  .pk-showall, .pk-showall:hover, .pk-showall:active,
  #wizard-mode .video-link, #wizard-mode .video-link:hover, #wizard-mode .video-link:active,
  #wizard-mode .btn-primary:hover, #wizard-mode .btn-primary:active,
  #wizard-mode .btn-secondary:hover, #wizard-mode .btn-secondary:active{
    transform:none !important;
  }
}

/* ============================================================================
   PARENT ONBOARDING V2 -- CATALOG (S-1) WIDTH + DENSITY REFINEMENT (2026-09-18b)
   The first-visit catalog was rendering inside the 860px wizard shell
   (wizard_polish.css:22, !important), so the 3-up grid collapsed to ~241px
   cards: long pack names wrapped to 4-5 lines, feature lists were cramped, and
   the row-2 third column sat empty. Widen ONLY the catalog (scoped via
   :has(#screen-home.active), the catalog's old wizard-screen id) to
   the reference's ~1200px product-catalog width. The single-column wizard steps
   (add-student / review / success) keep the 860px shell, so pack_select.css
   still reads as one system in the regular add-student wizard.
   pack_select.css loads AFTER wizard_polish.css, and this selector is more
   specific than #wizard-mode.wizard-container, so the scoped !important wins
   cleanly (no global !important spam).
   ============================================================================ */
/* D-3 (2026-09-20): the catalog is the Study packs TAB of the dashboard (#catalog-packs inside
   .container), not a wizard screen, so the wizard shell needs no override any more; the rules
   below are scoped to #catalog-packs, the tab panel's root, instead of the retired #screen-home. */

/* ---- welcome bar: demo action stays anchored right on desktop; drop the stray
   30px bottom margin the shared .video-link carries (dead space inside the bar);
   bring the button into the pack palette (was the brighter wizard blue with a
   gradient hover, which fought the restrained navy / coral system). ---- */
.pk-home-welcome{ align-items:center; }
.pk-home-welcome > div{ flex:1 1 auto; min-width:0; }
.pk-home-welcome .pk-home-sub{ max-width:760px; }
.pk-home-welcome .video-link{ margin:0 !important; flex:0 0 auto; white-space:nowrap;
  color:var(--action) !important; border:1.5px solid var(--rule2) !important; font-size:14.5px;
  background:#fff; }
.pk-home-welcome .video-link small{ color:var(--ink3); font-weight:600; margin-left:3px; }
.pk-home-welcome .video-link:hover{ background:var(--tint) !important; color:var(--action) !important;
  border-color:var(--action) !important; box-shadow:none !important; transform:translateY(-1px); }
@media (max-width:640px){
  .pk-home-welcome .video-link{ white-space:normal; }
}

/* ---- packs section header: strong title left, supporting copy secondary and
   set to its right on desktop, stacked beneath it on mobile (reference S-1). ---- */
.pk-head{ flex-wrap:wrap; align-items:baseline; }
.pk-head .pk-title{ flex:0 0 auto; }
.pk-head .pk-substudent{ flex:1 1 340px; max-width:640px; }
@media (max-width:640px){
  .pk-head{ gap:4px 16px; }
  .pk-head .pk-substudent{ flex-basis:100%; }
}

/* ---- free-trial card: one restrained, semantic green accent (free / go),
   mirroring the featured card's single amber accent -- deliberately NOT a
   coloured border on every card. Price reads "Free" in green, no "From". ---- */
.pk-card--trial{ border-color:#bcdccb; }
.pk-card--trial:hover{ box-shadow:0 4px 10px rgba(30,138,90,.10), 0 10px 24px rgba(30,138,90,.14); }
.pk-card--trial .pk-price-free .pk-price-amount{ color:var(--green); }
.pk-card--trial .pk-price-free .pk-price-amount::before{ content:none; }

/* ---- card interiors at the wider width: give names a touch more size/room now
   that they no longer wrap to 4-5 lines, and keep the audience/expiry meta
   comfortable. Typography carries the hierarchy; no fixed heights. ---- */
.pk-card .pk-name{ font-size:1.12rem; line-height:1.28; }
.pk-card .pk-audience{ margin-bottom:10px; }

/* ---- practice-tests card: horizontal action area (features left, price + CTA
   grouped right) reads as one purchase area, like the reference. ---- */
.pk-card--practice{ gap:28px; padding:20px 22px; }
.pk-card--practice .pk-price{ text-align:right; white-space:nowrap; }
.pk-card--practice .pk-action{ flex:0 0 auto; }
@media (max-width:640px){
  .pk-card--practice{ gap:14px; }
  .pk-card--practice .pk-price{ text-align:left; }
}

/* ---- CATALOG grid breakpoints (scoped to S-1): hold the reference's 3-up
   density down to 1000px (the shared packs-step grid drops to 2-up at 1240,
   which left the catalog only 2-up on common laptop widths), 2-up on tablet,
   1-up on phones. ---- */
#catalog-packs .pk-grid{ grid-template-columns:repeat(3,1fr); }
@media (max-width:1000px){
  #catalog-packs .pk-grid{ grid-template-columns:repeat(2,1fr); }
}
@media (max-width:700px){
  #catalog-packs .pk-grid{ grid-template-columns:1fr; }
}

/* ---- practice card: the horizontal (features left / price + CTA right) layout
   needs real width. Below ~860px it was squeezing the feature column to
   min-content and pushing "Choose a tournament" past the card's right edge
   (CTA overflow + clipping at 768). Stack it cleanly on tablet and phone:
   features, then a full-width price + CTA action row. ---- */
@media (max-width:860px){
  .pk-card--practice{ flex-direction:column; align-items:stretch; gap:16px; }
  .pk-card--practice .pk-practice-body{ flex:1 1 auto; }
  .pk-card--practice .pk-price{ text-align:left; }
  .pk-card--practice .pk-action{ width:100%; }
}

/* ---- keep pack CTAs on one line so buttons read consistently across cards at
   every grid density (safe: at 1-up the card is wide; practice CTA stacks full-
   width below 860). ---- */
.pk-card .pk-action{ white-space:nowrap; }

/* ============================================================================
   CATALOG CTA + HEADER + WELCOME polish (owner feedback 2026-09-18)
   - Buttons -> app slate-black (#2c3e50 == #wizard-mode .btn-primary); text
     stays white on EVERY state (fixes Bootstrap .btn:hover forcing ~black text
     -> unreadable); smoother hover lift + press + focus ring.
   - Section headers: heading, then metadata on its own row below (left-aligned).
   - Welcome: cleaner text hierarchy + comfortable measure.
   Scoped to #catalog-packs so the shared add-student/review wizard is untouched.
   ============================================================================ */
#catalog-packs .pk-action,
#catalog-packs .pk-action.btn{
  background:var(--nav); border:1px solid var(--nav); color:#fff !important; font-weight:600; letter-spacing:.01em;
  box-shadow:0 1px 2px rgba(20,32,48,.14);
  transition:background .18s ease, box-shadow .18s ease, transform .12s ease;
}
#catalog-packs .pk-action:hover:not([disabled]){
  background:#24333f; border-color:#24333f; color:#fff !important;
  transform:translateY(-1px); box-shadow:0 5px 14px rgba(20,32,48,.22);
}
#catalog-packs .pk-action:active:not([disabled]){ transform:translateY(0); box-shadow:0 2px 6px rgba(20,32,48,.20); }
#catalog-packs .pk-action:focus{ box-shadow:0 1px 2px rgba(20,32,48,.14); }
#catalog-packs .pk-action:focus-visible{ outline:2px solid var(--vidya); outline-offset:2px; }
#catalog-packs .pk-action[disabled]{ background:#aeb8ca; border-color:transparent; color:#fff !important; box-shadow:none; }

/* section headers: metadata drops to its own row under the heading */
#catalog-packs .pk-head{ display:block; margin:0 0 8px; }
#catalog-packs .pk-head .pk-title{ font-size:22px; font-weight:700; letter-spacing:-.02em; line-height:1.25; margin:0 0 5px; }
#catalog-packs .pk-head .pk-substudent{ display:block; font-size:14.5px; line-height:1.5; color:var(--ink2); margin:0; max-width:74ch; }

/* welcome: tidy hierarchy + readable measure, text vertically centred with the demo action */
#catalog-packs .pk-home-welcome{ align-items:center; }
#catalog-packs .pk-home-welcome > div{ flex:1 1 auto; }
#catalog-packs .pk-home-title{ font-size:24px; line-height:1.2; margin:0 0 6px; }
#catalog-packs .pk-home-sub{ font-size:15px; line-height:1.55; color:var(--ink2); margin:0; max-width:62ch; }

/* ---- catalog follow-up polish (owner feedback 2026-09-18 #2) ----
   a) study-packs / practice helper text on ONE line at desktop (was capped at 74ch → wrapped)
   b) equal-height cards per row so the section divider gets a clean straight edge above it
      (the "Best value" card was taller → uneven gap made the rule look broken/merged at one end)
   c) a touch more breathing room above the practice-tests divider */
#catalog-packs .pk-head .pk-substudent{ max-width:none; }
#catalog-packs #homeCatalogGrid{ align-items:stretch; }
#catalog-packs #homeCatalogGrid .pk-card{ height:100%; }
#catalog-packs .pk-head--section{ margin-top:44px; padding-top:30px; border-top:1px solid var(--rule2); }

/* ---- pack-card internal polish (owner feedback 2026-09-18 #3): relaxed, scannable
   hierarchy + a CTA separator line above the price/button (matches the reference
   mock's .foot border-top). Scoped to #homeCatalogGrid so the practice-test card
   (different layout) is untouched. Content unchanged. */
#homeCatalogGrid .pk-card{ padding:22px; gap:12px; }
#homeCatalogGrid .pk-card > *{ margin-top:0; margin-bottom:0; }
#homeCatalogGrid .pk-name{ font-size:1.12rem; line-height:1.32; }
#homeCatalogGrid .pk-audience{ line-height:1.5; }
#homeCatalogGrid .pk-expiry{ line-height:1.35; }
#homeCatalogGrid .pk-desc{ display:flex; flex-direction:column; gap:9px; }
#homeCatalogGrid .pk-desc li{ margin:0; line-height:1.55; padding-left:26px; font-size:.9rem; }
#homeCatalogGrid .pk-foot{ margin-top:auto; align-items:center; gap:12px; padding-top:15px;
  border-top:1px solid var(--rule); }

/* ---- catalog vertical rhythm (owner feedback 2026-09-18 #4): consistent, relaxed spacing.
   Was: head->content only 8px (cramped) vs 22-44px elsewhere, and the two section headers
   had different gaps to their content. Now one scale: section break ~32-36px, heading->content
   18px (both sections), card row-gap 24px. ---- */
#catalog-packs .pk-home-welcome{ margin-bottom:32px; }
#catalog-packs .pk-head{ margin-bottom:18px; }
#catalog-packs .pk-head--section{ margin-top:36px; margin-bottom:18px; padding-top:28px; }
#catalog-packs #homeCatalogGrid{ row-gap:24px; }

/* ---- readability (owner feedback 2026-09-18 #5): the audience line ("For students in
   grades K-8...") and the price unit ("per topic, per level") were on the faded --grey
   (#7a889c) -> hard to read. Move to the readable secondary slate --ink2 (#4a5d78) with
   a touch more size. Scoped to #catalog-packs. ---- */
#catalog-packs .pk-audience{ color:var(--ink2); font-size:.9rem; line-height:1.5; }
#catalog-packs .pk-price-unit{ color:var(--ink2); font-size:.82rem; line-height:1.35; margin-top:2px; }
#catalog-packs .pk-price-from .pk-price-amount::before{ color:var(--ink2); }

/* ---- card elevation (owner feedback 2026-09-18 #6): white cards on the white panel had
   only a flat 1px shadow -> no separation. Give the welcome card, the 6 pack cards and the
   PT card a soft-but-visible resting shadow so they lift off the background; keep a stronger
   hover. Scoped to #catalog-packs (and re-scoping hover so it still beats the resting shadow). ---- */
#catalog-packs .pk-card,
#catalog-packs .pk-home-welcome{
  box-shadow:0 2px 4px rgba(16,35,64,.05), 0 8px 22px rgba(16,35,64,.10);
}
#catalog-packs .pk-card:hover{
  box-shadow:0 4px 12px rgba(16,35,64,.10), 0 16px 34px rgba(16,35,64,.16);
}


/* ============================================================================
   PARENT ONBOARDING V2 -- ADD-STUDENT (S-2) UI POLISH PASS (2026-09-18)
   Bring the buy-flow add-student form (#chooseAddForm, inside the student card since W3)
   into the SAME visual system as
   the just-polished catalog (S-1): slate/coral palette with no stray blue, a
   real form CARD carrying the catalog resting elevation, readable secondary
   text on --ink2 (not the faded --grey), a clean "Change pack" text button (was
   an unstyled raw OS <button>: grey fill + 2px outset border), slate input +
   checkbox focus rings, and a relaxed, consistent vertical rhythm.
   Scoped to  #wizard-mode.flow-buy #chooseAddForm  so the regular (non-buy)
   add-student wizard and every other step stay visually untouched (mirrors the
   existing v2f "slate CTAs are buy-only" decision). pack_select.css loads AFTER
   wizard_polish.css; !important is used only where wizard_polish already forced
   the same property.
   ============================================================================ */

/* #chooseAddForm sits in a .screen (not a .pk-screen); its --ink/--ink2/--ink3/--rule/--rule2 come from
   the #wizard-mode.qv-tokens container. --rule was #e6ebf3 here and is the standard's #e1e7f0 now. */
#wizard-mode.flow-buy #chooseAddForm{
  --slate:var(--nav); --slate-deep:#24333f; --coral:var(--vidya); --coral-ring:#df5a55;
  --card-sh:0 2px 4px rgba(16,35,64,.05), 0 8px 22px rgba(16,35,64,.10);
}

/* ---- heading: catalog section-header hierarchy, left-aligned navy (was a
   centred inline 1.8rem). Beats the inline style="text-align:center;font-size". */
#wizard-mode.flow-buy #chooseAddForm > h2{
  text-align:left !important; font-size:26px !important; font-weight:700 !important;
  letter-spacing:-.02em; color:var(--ink) !important; line-height:1.2; margin:0 0 6px !important;
}

/* ---- "Your pick: <Pack> · Change pack": readable secondary text, left-aligned,
   with a clean text button for "Change pack" (kills the raw OS button). */
#wizard-mode.flow-buy #chooseAddForm .pk-pick-line{
  text-align:left; font-size:14.5px; color:var(--ink2); line-height:1.5; margin:0 0 20px;
}
#wizard-mode.flow-buy #chooseAddForm .pk-pick-line b{ color:var(--ink); font-weight:600; }
#wizard-mode.flow-buy #chooseAddForm .pk-changepack{
  -webkit-appearance:none; -moz-appearance:none; appearance:none;
  background:none; border:0; padding:2px 4px; margin-left:2px; font:inherit;
  font-size:14.5px; font-weight:600; color:var(--slate); cursor:pointer; border-radius:6px;
  text-decoration:underline; text-underline-offset:2px; text-decoration-color:rgba(44,62,80,.35);
  transition:color .15s ease, text-decoration-color .15s ease;
}
#wizard-mode.flow-buy #chooseAddForm .pk-changepack:hover{ color:var(--coral); text-decoration-color:var(--coral); }
#wizard-mode.flow-buy #chooseAddForm .pk-changepack:focus{ outline:none; box-shadow:none; }
#wizard-mode.flow-buy #chooseAddForm .pk-changepack:focus-visible{ outline:2px solid var(--coral-ring); outline-offset:2px; }

/* ---- FORM CARD: give the form the catalog card's border + resting elevation +
   padding so it reads as a raised card on the panel (was flat: no bg/border/
   shadow). The already-tinted "Student login" sub-panel nests inside it, exactly
   like the reference S-2 (white card > grey login block). */
#wizard-mode.flow-buy #chooseAddForm #studentForm{
  background:#fff; border:1px solid var(--rule2); border-radius:14px;
  padding:26px 26px 24px; box-shadow:var(--card-sh);
}
@media (max-width:600px){
  #wizard-mode.flow-buy #chooseAddForm #studentForm{ padding:18px 16px 16px; }
}

/* ---- labels: a touch larger + darker for comfortable readability. */
#wizard-mode.flow-buy #chooseAddForm .form-label{ font-size:13.75px !important; color:#2f3a4d !important; }

/* ---- field hints: move off the faded grey onto readable --ink2. */
#wizard-mode.flow-buy #chooseAddForm .wz-hint,
#wizard-mode.flow-buy #chooseAddForm .login-cred-sub{ color:var(--ink2) !important; }

/* ---- inputs / selects / custom dropdown: slate focus ring (was the wizard
   blue #007bff), so focus ties to the slate/coral system, not a stray blue. */
#wizard-mode.flow-buy #chooseAddForm .form-control:focus,
#wizard-mode.flow-buy #chooseAddForm .form-select:focus,
#wizard-mode.flow-buy #chooseAddForm .input-group:focus-within > .form-control,
#wizard-mode.flow-buy #chooseAddForm .wz-cselect.open .wz-cselect-btn,
#wizard-mode.flow-buy #chooseAddForm .wz-cselect-btn:focus-visible{
  border-color:var(--slate) !important; box-shadow:0 0 0 3px rgba(44,62,80,.15) !important;
}

/* ---- "Student login" sub-panel title -> slate (was a muted blue-grey). */
#wizard-mode.flow-buy #chooseAddForm .login-cred-title{ color:var(--slate); }

/* ---- consent row: readable label on --ink2, links slate (hover coral) so the
   only accent colour is the app's coral, and the checkbox accent is slate (was
   blue). Kept the tinted box + its error state. */
#wizard-mode.flow-buy #chooseAddForm .consent-checkbox .form-check-label{ color:var(--ink2) !important; font-size:14px !important; }
#wizard-mode.flow-buy #chooseAddForm .consent-checkbox .form-check-label a{ color:var(--slate) !important; font-weight:600; }
#wizard-mode.flow-buy #chooseAddForm .consent-checkbox .form-check-label a:hover{ color:var(--coral) !important; }
#wizard-mode.flow-buy #chooseAddForm .consent-checkbox .form-check-input:hover{ border-color:var(--slate) !important; }
#wizard-mode.flow-buy #chooseAddForm .consent-checkbox .form-check-input:focus{ border-color:var(--slate) !important; box-shadow:0 0 0 3px rgba(44,62,80,.16) !important; }
#wizard-mode.flow-buy #chooseAddForm .consent-checkbox .form-check-input:checked{ background-color:var(--slate) !important; border-color:var(--slate) !important; }

/* ---- action row divider tuned to the card rule colour. */
#wizard-mode.flow-buy #chooseAddForm .buttons{ border-top-color:var(--rule) !important; }

/* ---- reduced-motion already handled globally for the buttons; the text-button
   transition is colour-only, safe to leave. */

/* ---- 'Your pick' switcher as a polished preset bar above the form card
   (owner feedback 2026-09-18 #7; matches reference mock's .preset). Tinted box, slate border,
   text left + "Change pack" right; stacks on mobile. Scoped to the buy-flow add-student screen. ---- */
#wizard-mode.flow-buy #chooseAddForm .pk-preset{
  display:flex; align-items:center; justify-content:space-between; gap:12px 18px; flex-wrap:wrap;
  background:var(--tint); border:1.5px solid var(--action); border-radius:12px;
  padding:13px 18px; margin:0 0 20px; font-size:14.5px; line-height:1.45; color:var(--ink); text-align:left;
}
#wizard-mode.flow-buy #chooseAddForm .pk-preset .pk-preset-text{ flex:1 1 auto; }
#wizard-mode.flow-buy #chooseAddForm .pk-preset b{ color:var(--ink); font-weight:700; }
#wizard-mode.flow-buy #chooseAddForm .pk-preset .pk-changepack{
  flex:0 0 auto; background:none; border:0; font:inherit; font-weight:600; font-size:14.5px;
  color:var(--action); cursor:pointer; padding:5px 10px; border-radius:8px; white-space:nowrap;
  text-decoration:none; transition:color .15s ease, background .15s ease;
}
#wizard-mode.flow-buy #chooseAddForm .pk-preset .pk-changepack:hover{ color:var(--vidya); background:rgba(47,95,166,.10); text-decoration:none; }
#wizard-mode.flow-buy #chooseAddForm .pk-preset .pk-changepack:focus{ outline:none; }
#wizard-mode.flow-buy #chooseAddForm .pk-preset .pk-changepack:focus-visible{ outline:2px solid var(--vidya); outline-offset:2px; }
/* LIVE-ONLY (not in mock, which is always populated): #packPickLine is empty when
   add-student is reached without a catalog pick (new parent / 2nd student). Collapse the
   tinted preset bar when it has no content so no empty bar shows. JS toggles content only. */
#wizard-mode.flow-buy #chooseAddForm .pk-preset:empty{ display:none; }

/* ---- consistent button order (owner review 2026-09-18): the shared #wizard-mode .buttons flips to
   column-reverse at the mobile breakpoint (Continue-then-Back) while tablet is column (Back-then-Continue).
   Keep the add-student screen consistent = Back then Continue at ALL stacked widths. ---- */
@media (max-width:600px){
  #wizard-mode.flow-buy #chooseAddForm .buttons{ flex-direction:column !important; }
}

/* ---- Back / Continue buttons polish (owner feedback 2026-09-18 #8): richer colors, soft shadow,
   smooth hover lift + press, coral focus ring. Scoped to the add-student screen. ---- */
#wizard-mode.flow-buy #chooseAddForm .buttons .btn{
  border-radius:11px !important;
  transition:background .18s ease, border-color .18s ease, color .18s ease, box-shadow .2s ease, transform .12s ease !important;
}
/* Continue — primary slate-black */
#wizard-mode.flow-buy #chooseAddForm .btn-primary:not(:disabled){
  background:var(--nav) !important; border:1px solid var(--nav) !important; color:#fff !important;
  box-shadow:0 2px 5px rgba(20,32,48,.18) !important;
}
#wizard-mode.flow-buy #chooseAddForm .btn-primary:not(:disabled):hover{
  background:#22303f !important; border-color:#22303f !important;
  transform:translateY(-2px); box-shadow:0 9px 20px rgba(20,32,48,.28) !important;
}
#wizard-mode.flow-buy #chooseAddForm .btn-primary:not(:disabled):active{
  transform:translateY(0); box-shadow:0 2px 6px rgba(20,32,48,.22) !important;
}
#wizard-mode.flow-buy #chooseAddForm .btn-primary:disabled{
  background:#c3cbd7 !important; border-color:#c3cbd7 !important; color:#fff !important; box-shadow:none !important; transform:none !important;
}
/* Back — secondary white/outline */
#wizard-mode.flow-buy #chooseAddForm .btn-secondary{
  background:#fff !important; border:1.5px solid #d3dbe8 !important; color:var(--nav) !important;
  box-shadow:0 1px 3px rgba(20,32,48,.08) !important;
}
#wizard-mode.flow-buy #chooseAddForm .btn-secondary:hover{
  background:#f3f6fb !important; border-color:var(--nav) !important; color:var(--nav) !important;
  transform:translateY(-2px); box-shadow:0 7px 16px rgba(20,32,48,.15) !important;
}
#wizard-mode.flow-buy #chooseAddForm .btn-secondary:active{
  transform:translateY(0); box-shadow:0 1px 3px rgba(20,32,48,.10) !important;
}
#wizard-mode.flow-buy #chooseAddForm .buttons .btn:focus{ outline:none; }
#wizard-mode.flow-buy #chooseAddForm .buttons .btn:focus-visible{ outline:2px solid var(--vidya) !important; outline-offset:2px; }
@media (prefers-reduced-motion:reduce){
  #wizard-mode.flow-buy #chooseAddForm .buttons .btn{ transition:none !important; }
  #wizard-mode.flow-buy #chooseAddForm .buttons .btn:hover,#wizard-mode.flow-buy #chooseAddForm .buttons .btn:active{ transform:none !important; }
}


/* ============================================================================
   PARENT ONBOARDING V2 -- PACKS STEP (S-3 "Select sets & subjects") POLISH PASS
   (2026-09-18). Bring the packs/checkout step into the SAME slate/coral system as
   the polished catalog (S-1) and add-student (S-2): slate-black primary CTAs
   ("Add to cart" + cart-bar "Continue") with white text on every state, soft
   resting card elevation, readable secondary text on --ink2 (not the faded
   --grey), reference-.chip set/subject chips (pill, hover lift/tint, obvious
   selected state + check, coral focus ring), a clean CTA separator, and a relaxed
   vertical rhythm. Chip SELECTION keeps the --action accent + --tint (matches the
   reference S-3 .chip and the add-student preset bar); primary BUTTONS are
   slate-black (matches the catalog/add-student CTAs). Scoped to #screen-packs
   (+ #wizardBar for the fixed cart bar) so every other step is untouched.
   pack_select.css loads AFTER wizard_polish.css; !important is used only where a
   shared rule (bootstrap .btn / wizard_polish) already forced the same property.
   ============================================================================ */

/* tokens used below (values match the catalog / add-student passes) */
#screen-packs{
  --slate:var(--nav); --slate-deep:#22303f; --coral:var(--vidya); --coral-ring:#df5a55;
  --card-sh:0 2px 4px rgba(16,35,64,.05), 0 8px 22px rgba(16,35,64,.10);
  --card-sh-hover:0 4px 12px rgba(16,35,64,.10), 0 16px 34px rgba(16,35,64,.16);
}

/* ---- heading hierarchy: match the catalog section header. Secondary subline on
   the readable --ink2 (was faded --grey #7a889c). ---- */
#screen-packs .pk-head{ margin-bottom:18px; }
#screen-packs .pk-title{ font-size:22px; font-weight:700; letter-spacing:-.02em; line-height:1.25; margin:0 0 5px; }
#screen-packs .pk-substudent{ font-size:14.5px; line-height:1.5; color:var(--ink2); }

/* ---- focus bar: keep the add-student preset-bar family (tinted box + action
   border); make the label readable and support the toggle's two labelled states
   ("Showing your pick" <-> "Showing all packs"). ---- */
#screen-packs .pk-focusbar{ padding:12px 16px; margin-bottom:18px; }
#screen-packs .pk-focusbar-label{ font-size:14.5px; font-weight:600; color:var(--ink); }
#screen-packs .pk-focusbar .pk-showall{ font-size:14px; font-weight:600; }
#screen-packs .pk-focusbar.is-all{ background:#f4f7fb; border-color:var(--rule2); }

/* ---- cards: soft resting elevation like the catalog (were flat on the white
   panel); stronger single-system hover. Featured keeps its single amber accent. ---- */
#screen-packs .pk-card{ box-shadow:var(--card-sh); }
#screen-packs .pk-card:hover{ box-shadow:var(--card-sh-hover); }
#screen-packs .pk-card--featured{ box-shadow:0 8px 26px rgba(143,93,18,.12); }
#screen-packs .pk-card--featured:hover{ box-shadow:0 12px 30px rgba(143,93,18,.16); }
/* a chip selection tints the card border with the same --action accent as the chip */
#screen-packs .pk-card:has(.pk-choice[aria-pressed="true"], .pk-set[aria-pressed="true"]):not(.pk-card--incart){ border-color:var(--action); }

/* ---- readable card meta (audience + price unit + choices label) ---- */
#screen-packs .pk-audience{ color:var(--ink2); font-size:.9rem; line-height:1.5; }
#screen-packs .pk-price-unit{ color:var(--ink2); font-size:.8rem; line-height:1.35; margin-top:2px; }
#screen-packs .pk-choices-label{ font-size:.82rem; color:var(--ink); }

/* ---- SET / SUBJECT CHIPS: reference S-3 .chip look -- pill, 1.5px resting border,
   hover lift + faint tint, obvious selected state (2px --action border + --tint bg
   + 600 weight + check) and a coral focus-visible ring. ---- */
#screen-packs .pk-choice, #screen-packs .pk-set{
  border-radius:999px; padding:7px 13px; font-size:14px; font-weight:500; color:var(--ink);
  background:#fff; border:1.5px solid var(--rule2);
  transition:border-color .15s ease, background .15s ease, color .15s ease, box-shadow .15s ease, transform .12s ease;
}
#screen-packs .pk-choice:hover:not([disabled]):not([aria-pressed="true"]),
#screen-packs .pk-set:hover:not([disabled]):not([aria-pressed="true"]){
  border-color:var(--action); background:var(--tint); transform:translateY(-1px);
  box-shadow:0 2px 6px rgba(31,52,80,.08);
}
#screen-packs .pk-choice[aria-pressed="true"], #screen-packs .pk-set[aria-pressed="true"]{
  border:2px solid var(--action); background:var(--tint); color:var(--action); font-weight:600; padding:6px 12px;
}
#screen-packs .pk-choice:active:not([disabled]), #screen-packs .pk-set:active:not([disabled]){ transform:translateY(0) scale(.98); }
#screen-packs .pk-choice:focus, #screen-packs .pk-set:focus{ outline:none; }
#screen-packs .pk-choice:focus-visible, #screen-packs .pk-set:focus-visible{ outline:2px solid var(--coral-ring); outline-offset:2px; }
/* subject-chip tick recolours with the --action accent */
#screen-packs .pk-choice[aria-pressed="true"] .pk-tick{ border-color:var(--action); background:var(--action); }
/* colour-set chips gain a trailing check when selected so the state is obvious
   beyond the swatch colour + border */
#screen-packs .pk-set[aria-pressed="true"]{ position:relative; padding-right:27px; }
#screen-packs .pk-set[aria-pressed="true"]::after{
  content:""; position:absolute; right:12px; top:50%; width:5px; height:9px;
  border-right:2px solid var(--action); border-bottom:2px solid var(--action);
  transform:translateY(-62%) rotate(40deg);
}
/* swatch: a touch larger with a softer edge */
#screen-packs .pk-swatch{ width:14px; height:14px; border-radius:4px; }

/* ---- set rows: keep the aligned name-column grid; comfortable rhythm ---- */
#screen-packs .pk-choices--sets .pk-setrow{ gap:8px 12px; margin-bottom:12px; padding-bottom:12px; }
#screen-packs .pk-chips{ gap:8px; }
#screen-packs .pk-choices{ margin-top:16px; }

/* ---- CTA separator + alignment (matches the catalog card foot) ---- */
#screen-packs .pk-foot{ margin-top:auto; padding-top:16px; border-top:1px solid var(--rule); align-items:center; }
#screen-packs .pk-price-amount{ font-size:1.34rem; color:var(--ink); }

/* ---- "Add to cart" -- slate-black primary CTA (was --action blue). White text on
   every state incl. bootstrap .btn:hover, soft shadow, hover lift + press, coral
   focus ring, >=44px. ---- */
#screen-packs .pk-action,
#screen-packs .pk-action.btn{
  background:var(--slate); border:1px solid var(--slate); color:#fff !important; font-weight:600; letter-spacing:.01em;
  border-radius:10px; box-shadow:0 2px 5px rgba(20,32,48,.16); min-height:44px;
  transition:background .18s ease, border-color .18s ease, box-shadow .2s ease, transform .12s ease;
}
#screen-packs .pk-action:hover:not([disabled]){
  background:var(--slate-deep); border-color:var(--slate-deep); color:#fff !important;
  transform:translateY(-2px); box-shadow:0 9px 20px rgba(20,32,48,.26);
}
#screen-packs .pk-action:active:not([disabled]){ transform:translateY(0); box-shadow:0 2px 6px rgba(20,32,48,.20); }
#screen-packs .pk-action[disabled]{ background:#c3cbd7; border-color:transparent; color:#fff !important; box-shadow:none; transform:none; }
#screen-packs .pk-action:focus{ outline:none; box-shadow:0 2px 5px rgba(20,32,48,.16); }
#screen-packs .pk-action:focus-visible{ outline:2px solid var(--coral-ring); outline-offset:2px; }
/* semantic in-cart (green) state stays readable */
#screen-packs .pk-action.in-cart{ background:var(--green-tint); border-color:var(--green); color:var(--green) !important; box-shadow:none; }

/* ---- head cart button: coral focus ring; keep it consistent ---- */
#wizHead .pk-cartbtn:focus, #screen-packs .pk-cartbtn:focus{ outline:none; }
#wizHead .pk-cartbtn:focus-visible,
#screen-packs .pk-cartbtn:focus-visible{ outline:2px solid var(--coral-ring); outline-offset:2px; }

/* ============================================================================
   Sticky CART BAR (#wizardBar / .pk-bar) -- sibling of #screen-packs, scoped by id.
   Soft top shadow, readable "N items - $X" summary, slate-black "Continue" CTA
   with the same micro-interactions as the other primary buttons.
   ============================================================================ */
#wizardBar.pk-bar{ padding:14px 24px; box-shadow:0 -6px 22px rgba(16,35,64,.10); }
/* the bar is the last thing above the home indicator, so it owns that inset */
#wizardBar.pk-bar{ padding-bottom:calc(14px + env(safe-area-inset-bottom, 0px)); }
#wizardBar .pk-bar-sum{ font-size:15px; font-weight:600; color:var(--ink); }
#wizardBar .pk-bar-sum b{ color:var(--ink); }
#wizardBar .pk-bar-continue.btn,
#wizardBar .pk-bar-continue.btn-primary{
  background:var(--nav) !important; border:1px solid var(--nav) !important; color:#fff !important; font-weight:600;
  border-radius:11px !important; min-width:170px; min-height:44px; box-shadow:0 2px 5px rgba(20,32,48,.18) !important;
  transition:background .18s ease, border-color .18s ease, box-shadow .2s ease, transform .12s ease !important;
}
#wizardBar .pk-bar-continue.btn-primary:not(:disabled):hover{
  background:#22303f !important; border-color:#22303f !important; color:#fff !important;
  transform:translateY(-2px); box-shadow:0 9px 20px rgba(20,32,48,.28) !important;
}
#wizardBar .pk-bar-continue.btn-primary:not(:disabled):active{ transform:translateY(0); box-shadow:0 2px 6px rgba(20,32,48,.22) !important; }
#wizardBar .pk-bar-continue.btn:focus{ outline:none; }
#wizardBar .pk-bar-continue.btn:focus-visible{ outline:2px solid #df5a55 !important; outline-offset:2px; }

/* ---- iPhone SE / small phones: chips wrap cleanly, set rows stack the subject
   name above its chips when the fixed name column gets tight, cart bar readable. ---- */
@media (max-width:430px){
  #screen-packs .pk-choices--sets .pk-setrow{ grid-template-columns:minmax(0,1fr); gap:6px; }
  #screen-packs .pk-setrow-name{ padding-top:0; }
  #wizardBar.pk-bar{ padding:12px 16px; gap:12px; }
  #wizardBar .pk-bar-continue{ min-width:0; }
  #wizardBar .pk-bar-sum{ font-size:14.5px; }
}

/* ---- reduced motion ---- */
@media (prefers-reduced-motion:reduce){
  #screen-packs .pk-card, #screen-packs .pk-card:hover,
  #screen-packs .pk-choice, #screen-packs .pk-set,
  #screen-packs .pk-action, #screen-packs .pk-action:hover, #screen-packs .pk-action:active,
  #wizardBar .pk-bar-continue, #wizardBar .pk-bar-continue:hover{
    transition:none !important; transform:none !important;
  }
}

/* ============================================================================
   PACKS STEP -- refinement ROUND 2 (2026-09-18). Builds on the round-1 block
   above. Three additions, all scoped to #screen-packs (+ #wizardBar):
     1. Regional-Set "Sets" -> subject NAME on its own row, then the 4 set pills
        as a symmetrical 2x2 grid (Red|White / Blue|Gold), equal-width cells.
     2. A radio/checkbox-style LEADING indicator on every set/subject pill
        (hollow ring -> filled slate/action + white check when selected), plus
        smoother hover lift/tint/shadow. Keeps the colour swatch on set pills.
     3. Room under the grid so the sticky cart bar never covers the last card.
   ============================================================================ */

/* ---- (3) clear the fixed bottom bar: give the packs screen bottom padding so
   the last card's CTA is never hidden behind the sticky #wizardBar. ---- */
#screen-packs{ padding-bottom:96px; }

/* ---- (1) 2x2 SET GRID: drop the round-1 name-column grid; stack the subject
   name over a 2-column equal-width pill grid. Clean divider between subjects. ---- */
#screen-packs .pk-choices--sets .pk-setrow{
  display:block; grid-template-columns:none;
  margin-bottom:14px; padding-bottom:14px; border-bottom:1px solid var(--rule);
}
#screen-packs .pk-choices--sets .pk-setrow:last-child{ margin-bottom:0; padding-bottom:0; border-bottom:0; }
#screen-packs .pk-choices--sets .pk-setrow-name{
  display:block; padding-top:0; margin-bottom:9px; font-size:14px; font-weight:600; color:var(--ink);
}
#screen-packs .pk-choices--sets .pk-chips{
  display:grid; grid-template-columns:repeat(2,1fr); gap:8px;
}
/* fill the cell -> equal-width pills, aligned across Geography/History/Science */
#screen-packs .pk-choices--sets .pk-set{ width:100%; justify-content:flex-start; }

/* ---- (2) RADIO/CHECKBOX-STYLE INDICATOR: a leading circular control on every
   pill. Unselected = hollow ring; selected = filled slate/action + white check.
   Multi-select semantics (each toggles independently), styled as a crisp radio.
   Implemented as ::before so it works for set pills (which have a swatch, not a
   .pk-tick) and subject pills alike. ---- */
#screen-packs .pk-choice::before,
#screen-packs .pk-set::before{
  content:""; flex:0 0 auto; width:16px; height:16px; border-radius:50%;
  border:2px solid var(--rule2); background:#fff; box-sizing:border-box;
  transition:border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
}
/* hover (unselected): the ring picks up the action accent, matching the pill */
#screen-packs .pk-choice:hover:not([disabled]):not([aria-pressed="true"])::before,
#screen-packs .pk-set:hover:not([disabled]):not([aria-pressed="true"])::before{
  border-color:var(--action);
}
/* selected: filled action circle + white check (SVG) */
#screen-packs .pk-choice[aria-pressed="true"]::before,
#screen-packs .pk-set[aria-pressed="true"]::before{
  border-color:var(--action); background-color:var(--action);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:center; background-size:11px 11px;
  box-shadow:0 1px 2px rgba(31,52,80,.20);
}
/* disabled: muted ring */
#screen-packs .pk-choice[disabled]::before,
#screen-packs .pk-set[disabled]::before{ border-color:var(--rule2); background-color:#eef1f6; }

/* the leading ring replaces the old indicators: hide the subject .pk-tick and
   the round-1 trailing set check, and reset the padding that made room for it */
#screen-packs .pk-choice .pk-tick{ display:none; }
#screen-packs .pk-set[aria-pressed="true"]{ padding-right:12px; }
#screen-packs .pk-set[aria-pressed="true"]::after{ content:none; }

/* smoother, more tactile pill hover (soft lift + shadow + faint tint); the
   round-1 rule already lifts -> add a slightly softer shadow for round 2 */
#screen-packs .pk-choice:hover:not([disabled]):not([aria-pressed="true"]),
#screen-packs .pk-set:hover:not([disabled]):not([aria-pressed="true"]){
  box-shadow:0 3px 10px rgba(31,52,80,.10);
}

/* in-cart card: keep the green semantic accent on the border so the card reads
   as "added" (pairs with the .pk-action.in-cart button) */
#screen-packs .pk-card--incart{ border-color:var(--green); }

/* ---- iPhone SE / small phones: the 2x2 pill grid MUST stay 2 columns and fit
   without overflow; keep the divider + name-over-grid layout. ---- */
@media (max-width:430px){
  #screen-packs .pk-choices--sets .pk-chips{ grid-template-columns:repeat(2,1fr); gap:7px; }
  #screen-packs .pk-choices--sets .pk-set{ padding-left:9px; padding-right:9px; font-size:13.5px; }
  #screen-packs .pk-choice::before, #screen-packs .pk-set::before{ width:15px; height:15px; }
}

/* ---- reduced motion: drop the ring transition too ---- */
@media (prefers-reduced-motion:reduce){
  #screen-packs .pk-choice::before, #screen-packs .pk-set::before{ transition:none !important; }
}


/* ============================================================================
   PACKS STEP -- refinement ROUND 3 (2026-09-18). Six fixes, scoped to
   #screen-packs (+ body:has for footer clearance). Builds on rounds 1-2.
     1. Free Trial card added to the grid (styled via .pk-card--trial + below).
     2. Subject chips -> symmetric 3-across grid (2-col on tablet/mobile).
     3. Regional last set row (Science) clears the CTA separator.
     4. Footer scrolls above the fixed cart bar (body padding-bottom).
     5. Focus bar re-skinned blue -> slate/neutral.
     6. Price + unit block polish.
   ============================================================================ */

/* ---- (4) FOOTER CLEARANCE: the fixed #wizardBar (position:fixed;bottom:0) sat
   over the page footer (.qv-fatfoot, a sibling of #wizard-mode). Give the
   scrolling container (body) bottom padding >= the bar height so the footer
   scrolls fully ABOVE the bar at max scroll. Scoped with :has to the packs step
   so catalog.html / add-student.html (same shared css) are unaffected. ---- */
body:has(#screen-packs.active){ padding-bottom:88px; }

/* ---- (5) FOCUS BAR: slate / neutral, no blue (owner: "blue looks AI-generated,
   use slate-black"). Neutral light bg, subtle slate border, slate label;
   "Show all packs" = white bg + slate-black border/text, hover fills slate-black
   with white text, coral focus ring. ---- */
#screen-packs .pk-focusbar{ background:#f4f7fb; border:1.5px solid #d3dbe8; }
#screen-packs .pk-focusbar.is-all{ background:#f4f7fb; border-color:#d3dbe8; }
#screen-packs .pk-focusbar-label{ color:var(--slate); }
#screen-packs .pk-focusbar .pk-showall{
  background:#fff; color:var(--slate); border:1.5px solid var(--slate);
  transition:background .18s ease, border-color .18s ease, color .18s ease, transform .12s ease;
}
#screen-packs .pk-focusbar .pk-showall:hover{
  background:var(--slate); border-color:var(--slate); color:#fff; transform:translateY(-1px);
}
#screen-packs .pk-focusbar .pk-showall:active{ transform:translateY(0); }
#screen-packs .pk-focusbar .pk-showall:focus{ outline:none; box-shadow:none; }
#screen-packs .pk-focusbar .pk-showall:focus-visible{ outline:2px solid var(--coral-ring); outline-offset:2px; }

/* ---- (2) SUBJECT CHIPS: symmetric 3-across equal-width grid on desktop so the
   three subjects (Geography/History/Science) line up evenly instead of a ragged
   2+1 wrap. Same radio ring + hover as the set pills (inherited from round 2).
   Falls back to 2-col on tablet/mobile so nothing overflows or wraps (SE-safe).
   Targets only the plain subject choices, never the set-pill 2x2 grid. ---- */
/* R4 FIX 1 (2026-09-19): subject pills forced to a SINGLE COLUMN -- one pill per
   row, three stacked rows -- at ALL viewports. Was repeat(3,minmax(0,1fr)) on
   desktop / repeat(2) <=860px, which wrapped 3 pills into a ragged 2 rows at
   375-768 and clipped the longest label "Geography" (scrollW 117 > clientW 104)
   at 1280. Full-width rows never clip or wrap; the radio ring + swatch + label
   stay left-aligned. Regional SET chips (.pk-choices--sets) are NOT touched --
   they keep their 2x2 grid. */
#screen-packs .pk-choices:not(.pk-choices--sets) .pk-chips{
  display:grid; grid-template-columns:1fr; gap:8px;
}
#screen-packs .pk-choices:not(.pk-choices--sets) .pk-choice{
  width:100%; justify-content:flex-start; padding-left:12px; padding-right:12px; min-height:40px;
}

/* ---- (3) REGIONAL SET LIST: breathing room under the last set row (Science) so
   its 2x2 pills clear the .pk-foot CTA separator (border-top) instead of
   colliding with it (last-child row has 0 padding/margin bottom by design). ---- */
#screen-packs .pk-choices--sets{ margin-bottom:12px; }

/* ---- (6) PRICE BLOCK: crisp hierarchy -- amount prominent (slate/navy,
   tabular-nums), unit smaller + muted (--ink2), right-aligned, tight rhythm,
   baseline-aligned with the CTA. Applies to $40 / 1 set, $200 / one price, and
   the trial's Free. ---- */
#screen-packs .pk-foot{ align-items:flex-end; }
#screen-packs .pk-price{ text-align:right; font-variant-numeric:tabular-nums; line-height:1.05; flex:0 0 auto; }
#screen-packs .pk-price-amount{ display:block; font-size:1.5rem; font-weight:700; color:var(--ink); line-height:1.04; letter-spacing:-.01em; }
#screen-packs .pk-price-unit{ display:block; font-size:.76rem; font-weight:500; color:var(--ink2); line-height:1.3; margin-top:1px; }
#screen-packs .pk-price-from .pk-price-amount::before{ font-size:12.5px; font-weight:500; color:var(--ink3); }

/* ---- (1) FREE TRIAL price stays green inside #screen-packs (the id-scoped
   amount colour above would otherwise repaint it slate); no "From" prefix. ---- */
#screen-packs .pk-card--trial .pk-price-free .pk-price-amount{ color:var(--green); }
#screen-packs .pk-card--trial .pk-price-free .pk-price-amount::before{ content:none; }


/* ============================================================================
   PACKS STEP -- refinement ROUND 4 (2026-09-19).
   FIX 2: #wizardBar docks above the footer. A small rAF-throttled scroll/resize
   handler in packs.html sets the bar's inline bottom so it rises exactly by the
   visible footer height and rests on the footer's top edge (never overlapping).
   Here: a crisp 1px slate top separator (#d3dbe8) + soft upward shadow so the
   boundary reads clean whether the bar is pinned to the viewport or resting on
   the footer. The old body:has padding-bottom:88px only added dead space BELOW
   the footer (it never pushed the footer above the fixed bar), so drop it to 0
   -- clearance for the last card is handled by #screen-packs padding-bottom:96px
   (the pinned-bar phase) and the JS docking (the max-scroll phase).
   ============================================================================ */
#wizardBar.pk-bar{
  border-top:1px solid #d3dbe8;
  box-shadow:0 -8px 22px rgba(16,35,64,.12);
  transition:box-shadow .18s ease;
}
body:has(#screen-packs.active){ padding-bottom:0; }


/* ============================================================================
   PACKS STEP -- refinement ROUND 5 (2026-09-19). Two scoped fixes:
     FIX 1: more breathing space above the docked/pinned cart bar.
     FIX 2: chip SELECTION affordance blue -> slate-black (swatches untouched).
   All scoped to #screen-packs (+ #wizardBar unchanged). Builds on rounds 1-4.
   ============================================================================ */

/* ---- FIX 1: bottom clearance. Bar is ~71-77px tall and pins to the viewport
   bottom (docks above the footer at max scroll). padding-bottom:96 left only a
   ~2-16px gap between the lowest card row and the pinned bar at the tightest
   reachable scroll. Bump the reserve so the last card row keeps a comfortable
   breathing gap above the bar in both the pinned and docked states. ---- */
#screen-packs{ padding-bottom:140px; }

/* ---- FIX 2: chip SELECTION affordance blue -> slate-black. The round-1/2 rules
   paint selected + hover chips with --action/--blue (#2f5fa6) + --tint/--blue-tint
   (#eaf1fb). Owner: use slate-black, no blue. Override selected + hover states to
   the slate system; keep the coral focus ring. CRITICAL: the set colour SWATCHES
   (.pk-swatch, inline red/white/blue/gold) are NOT touched -- only the selection
   affordance (border / tint / radio ::before / tick / card border) goes slate. ---- */
/* selected pill: 2px slate border + light NEUTRAL slate tint bg + slate text */
#screen-packs .pk-choice[aria-pressed="true"],
#screen-packs .pk-set[aria-pressed="true"]{
  border-color:var(--nav); background-color:#eef1f5; color:var(--nav);
}
/* selected radio ::before indicator: slate fill (keeps the inherited white check svg) */
#screen-packs .pk-choice[aria-pressed="true"]::before,
#screen-packs .pk-set[aria-pressed="true"]::before{
  border-color:var(--nav); background-color:var(--nav);
}
/* subject .pk-tick (hidden by round 2, kept slate for safety) */
#screen-packs .pk-choice[aria-pressed="true"] .pk-tick{ border-color:var(--nav); background-color:var(--nav); }
/* round-1 trailing set check ::after (content:none in round 2, recoloured anyway) */
#screen-packs .pk-set[aria-pressed="true"]::after{ border-right-color:var(--nav); border-bottom-color:var(--nav); }
/* card border tint when any chip on the card is selected -> slate (was --action) */
#screen-packs .pk-card:has(.pk-choice[aria-pressed="true"], .pk-set[aria-pressed="true"]):not(.pk-card--incart){ border-color:var(--nav); }
/* hover (unselected): neutral slate tint + slate border + slate ring (was --action + --tint) */
#screen-packs .pk-choice:hover:not([disabled]):not([aria-pressed="true"]),
#screen-packs .pk-set:hover:not([disabled]):not([aria-pressed="true"]){
  border-color:var(--nav); background-color:#f0f2f6;
}
#screen-packs .pk-choice:hover:not([disabled]):not([aria-pressed="true"])::before,
#screen-packs .pk-set:hover:not([disabled]):not([aria-pressed="true"])::before{
  border-color:var(--nav);
}
/* keep the coral focus-visible ring */
#screen-packs .pk-choice:focus-visible,
#screen-packs .pk-set:focus-visible{ outline:2px solid #df5a55; outline-offset:2px; }

/* ============================================================================
   UI POLISH v12 / ROUND 6 (2026-09-19) — consistent breathing gap.
   The resting gap between the last card row and the docked bottom bar was
   overshooting (~117px mobile, ~160-166px desktop) because the structural
   space below #screen-packs stacked DIFFERENTLY per viewport: .wizard-content
   bottom padding (22px mobile vs 30px desktop), #wizard-mode margin-bottom
   (0 mobile vs 44px desktop), plus a stray <br> (removed in packs.html). Here
   we NEUTRALIZE those variable pieces (scoped to the packs page only, so
   catalog.html + add-student.html are untouched) so the gap is driven from ONE
   controlled place: #screen-packs padding-bottom. Docking JS is unchanged.
   ============================================================================ */
body:has(#screen-packs.active) #wizard-mode.wizard-container{ margin-bottom:0 !important; }
body:has(#screen-packs.active) #wizard-mode .wizard-content{ padding-bottom:0 !important; }
body:has(#screen-packs.active) #feedbackMessage{ margin:0 !important; }
/* single controlling value = bar height (~71-77px) + desired resting gap.
   ROUND 7 (2026-09-19) FIX for ISSUE 2: 108px only left a cramped ~34px gap
   between the final card and the docked bar at max scroll, so the card read as
   colliding with the dock+footer mass. Bump to a comfortable ~55px resting gap
   (130 - bar height) and add env(safe-area-inset-bottom) so notched devices get
   real clearance below the final card. Scoped to the active packs screen so the
   hidden #screen-packs markup in catalog.html / add-student.html is untouched. */
body:has(#screen-packs.active) #screen-packs{ padding-bottom:calc(130px + env(safe-area-inset-bottom)); }

/* ============================================================================
   PACKS STEP -- refinement ROUND 7 (2026-09-19). Two scoped fixes.
   ISSUE 1: the selectable content (subject pills / regional set rows) sat flush
   against the .pk-foot border-top divider -- gap measured 0px on subject cards
   (.pk-choices had no margin-bottom) and only 12px on the set card. The foot's
   own padding-top (16px) lives BELOW the border, so it never separated the
   CONTENT from the separator. Give both .pk-choices variants a single, equal
   bottom margin so the rhythm is: pills -> comfortable gap -> separator -> CTA.
   Structural (one spacing token), not a per-card nudge; the last pill/row can
   never touch the divider at any viewport. Stretched cards (flex margin-top:auto
   on .pk-foot) already have slack, so this only affects the tight (non-stretched)
   cards. NOTE: does NOT change pill height, selection behaviour, or the 2x2 set
   grid / 1-per-row subject grid.
   ISSUE 2 (companion): the fixed dock respects the device safe-area so its
   content clears the home indicator when pinned to bottom:0 (pairs with the
   padding-bottom safe-area clearance above). Desktop is unchanged (inset = 0).
   ============================================================================ */
#screen-packs .pk-choices{ margin-bottom:20px; }
#screen-packs .pk-choices--sets{ margin-bottom:20px; }
#wizardBar.pk-bar{ padding-bottom:calc(14px + env(safe-area-inset-bottom)); }
@media (max-width:640px){ #wizardBar.pk-bar{ padding-bottom:calc(12px + env(safe-area-inset-bottom)); } }

/* ============================================================================
   PACKS STEP -- refinement ROUND 9 (2026-09-19). REVERT ROUND 8 + resting gap.

   ROUND 8 made #wizardBar an in-flow (position:static) element that only showed
   at the page bottom. Owner wants the dock ALWAYS VISIBLE. Reverted to the
   working fixed-dock model: the base rule .pk-bar{position:fixed;bottom:0} (top
   of file) pins the dock to the viewport bottom at every scroll position, and
   the footer-docking JS in packs.html lifts it to rest on the footer top at max
   scroll. The slate top separator + soft upward shadow (ROUND 4) are retained.

   Resting card->dock gap: driven by ONE controlled value -- the packs screen's
   bottom padding (the space between the final card and the footer). The dock
   docks on the footer top, so at max scroll:
       gap = (screen padding-bottom) - (dock height ~72px).
   ROUND 7 used 130px which measured ~73-79px (above the wanted 40-56px band).
   Set to 126px so the resting gap lands ~40-56px (clean breathing room, not
   flush, not a void). Scoped to the active packs screen so the hidden
   #screen-packs markup in catalog.html / add-student.html is untouched.
   ============================================================================ */
body:has(#screen-packs.active) #screen-packs{ padding-bottom:calc(126px + env(safe-area-inset-bottom)); }

/* ================= ROUND 10 — OUTER WHITE CARD must finish BEFORE the dock =================
   Root cause (measured on-screen): the breathing space lived INSIDE #screen-packs, i.e. inside
   the white .wizard-container, so it only made the white card TALLER — its bottom edge ran down
   to the footer top and the fixed dock sat on top of the white card's bottom ~79px.
   Fix: keep only a small pad INSIDE the card (inner card -> card bottom rhythm), and put the real
   breathing space BELOW the white card (page background) as margin-bottom on .wizard-container, so
   the dock (docked on the footer) sits over the page bg, never over the white card.
   Result at max scroll: inner card -> 24px -> white card bottom+radius -> ~41px page gap -> dock -> footer. */
body:has(#screen-packs.active) #screen-packs{ padding-bottom:24px; }
body:has(#screen-packs.active) #wizard-mode.wizard-container{
  margin-bottom:calc(120px + env(safe-area-inset-bottom)) !important;
}


/* ================= ROUND 10 — OUTER WHITE CARD must finish BEFORE the dock =================
   Root cause (measured on-screen): the breathing space lived INSIDE #screen-packs, i.e. inside
   the white .wizard-container, so it only made the white card TALLER -- its bottom edge ran down
   to the footer top and the fixed dock sat on top of the white card's bottom ~79px.
   Fix: keep only a small pad INSIDE the card (inner card -> card bottom rhythm), and put the real
   breathing space BELOW the white card (page background) as margin-bottom on .wizard-container, so
   the dock (docked on the footer) sits over the page bg, never over the white card.
   Result at max scroll: inner card -> 24px -> white card bottom+radius -> ~41px page gap -> dock -> footer. */
/* (this block also stands above; the byte-identical copy was removed 2026-09-23, review section 4) */

/* ================= ROUND 10b -- no bar, no reservation =================
   ROUND 10 above reserves 120px under the white card so the docked bar never sits over it. The
   bar only exists while the cart has lines: pack_cart.js:326 sets `bar.hidden = (n === 0)` and
   :327 keeps `body.pk-has-bar` in step with it. Without that gate the reservation also applied
   when no bar was coming -- most visibly on a student whose Region is missing, where every card
   is filtered out and #packsEmptyRegion shows: the page then ran ~13px past the viewport and
   raised a scrollbar with nothing to scroll. The v9/v10 rules were already gated this way; this
   restores the gate for ROUND 10. */
body:has(#screen-packs.active):not(.pk-has-bar) #wizard-mode.wizard-container{
  margin-bottom:0 !important;
}



/* ================= ROUND 11 — cart pill: blue -> slate-black (match packs slate system) ================= */
/* the count badge */
body:has(#screen-packs.active) .pk-cartcount{ background:var(--nav); color:#fff; }
/* the active (non-empty) cart pill: slate tint + slate border/text instead of blue */
body:has(#screen-packs.active) .pk-cartbtn:not(.empty){
  background:#eef1f5; border-color:var(--nav); color:var(--nav);
}


/* ============================================================================
   UI POLISH v7 (2026-09-19) — Step 3 "Review & pay" (#screen-review) brought to
   the same slate/coral design system as catalog / add-student / packs. Scoped
   with body:has(#screen-review.active) so the shared review markup on the other
   mock pages (where a different .screen is active) is byte-for-byte unaffected.
   De-blues every accent (owner prefers slate — "blue looks AI-generated"), adds
   soft card elevation + consistent rhythm to the 3 blocks, and makes the money /
   terms typography readable. Back / Pay already inherit the slate CTA system from
   "#wizard-mode .btn-primary/.btn-secondary"; nothing changed there.
   ============================================================================ */
body:has(#screen-review.active) #screen-review{
  --slate:var(--nav); --slate-deep:#22303f; --coral:var(--vidya); --coral-ring:#df5a55; --grey-fill:#eef1f6;
  --card-sh:0 2px 4px rgba(16,35,64,.05), 0 8px 22px rgba(16,35,64,.10);
  --card-sh-hover:0 4px 12px rgba(16,35,64,.10), 0 16px 34px rgba(16,35,64,.16);
}

/* ---- heading + sub: readable sub on --ink2 (was faded --grey) ---- */
body:has(#screen-review.active) #screen-review .pk-title{ color:var(--ink); }
body:has(#screen-review.active) #screen-review .pk-review-sub{
  color:var(--ink2); font-size:14.5px; line-height:1.5; }

/* ---- rhythm: even 18px gaps between the 3 blocks + terms ---- */
body:has(#screen-review.active) #screen-review #reviewAsk,
body:has(#screen-review.active) #screen-review #reviewBody,
body:has(#screen-review.active) #screen-review #reviewMoney{ margin-bottom:18px; }

/* ---- (1) "Do you want to buy for another student?" card: soft elevation ---- */
body:has(#screen-review.active) #screen-review #reviewAsk{
  border:1px solid var(--rule); border-radius:14px; padding:14px 18px;
  box-shadow:var(--card-sh); }
body:has(#screen-review.active) #screen-review .pk-ask-lead{
  color:var(--ink); font-size:14.5px; }


/* ---- (3) student summary: #reviewBody is a transparent wrapper; the per-student
   .pk-review-card carries the elevation so multiple students read as stacked
   grouped cards. ---- */
body:has(#screen-review.active) #screen-review #reviewBody{
  background:transparent; border:0; border-radius:0; padding:0; box-shadow:none; }
body:has(#screen-review.active) #screen-review .pk-review-card{
  border:1px solid var(--rule); border-radius:14px; box-shadow:var(--card-sh);
  margin:0 0 14px; }
body:has(#screen-review.active) #screen-review .pk-review-card:last-child{ margin-bottom:0; }
/* readable meta ("5th Grade · USA" / "Red · Geography") on --ink2, not faded grey */
body:has(#screen-review.active) #screen-review .pk-review-groupwho b{ color:var(--ink); }
body:has(#screen-review.active) #screen-review .pk-review-groupwho span{ color:var(--ink2); font-size:.82rem; }
body:has(#screen-review.active) #screen-review .pk-review-lineinfo b{ color:var(--ink); }
body:has(#screen-review.active) #screen-review .pk-drawer-scope{ color:var(--ink2); }
body:has(#screen-review.active) #screen-review .pk-review-lineright{ gap:12px; }
body:has(#screen-review.active) #screen-review .pk-review-lineright .pk-drawer-price{ color:var(--ink); }

/* per-line "Edit": blue text link -> small slate outline control (matches the
   Remove × as a clear action) */
body:has(#screen-review.active) #screen-review .pk-review-edit{
  color:var(--slate); background:#fff; border:1px solid var(--rule2);
  font-weight:600; font-size:.82rem; padding:4px 11px; border-radius:8px; line-height:1.2;
  transition:background .15s ease, border-color .15s ease, color .15s ease; }
body:has(#screen-review.active) #screen-review .pk-review-edit:hover{
  background:var(--slate); border-color:var(--slate); color:#fff; }
body:has(#screen-review.active) #screen-review .pk-review-edit:focus-visible{
  outline:2px solid var(--coral-ring); outline-offset:2px; }
/* keep Remove × clear + give it a matching tap target */
body:has(#screen-review.active) #screen-review .pk-review-lineright .pk-drawer-x{
  width:28px; height:28px; }

/* ---- (4) money card: elevated; --ink2 subtotal/fee rows; emphasized slate TOTAL
   after a clean solid divider; readable fee note; tabular right-aligned amounts. */
body:has(#screen-review.active) #screen-review #reviewMoney{
  border:1px solid var(--rule); border-radius:14px; padding:16px 20px;
  box-shadow:var(--card-sh); }
body:has(#screen-review.active) #screen-review #reviewMoney .pk-drawer-row{
  font-size:14.5px; color:var(--ink2); font-variant-numeric:tabular-nums; }
body:has(#screen-review.active) #screen-review #reviewMoney .pk-drawer-row span:last-child{
  text-align:right; font-variant-numeric:tabular-nums; }
body:has(#screen-review.active) #screen-review #reviewMoney .pk-drawer-total{
  color:var(--slate); font-weight:700; font-size:1.18rem;
  border-top:1px solid var(--rule); padding-top:12px; margin-top:6px; }
/* the note explains the money box directly above it, so it stays close to it (12px) and is set
   at a size meant to be read rather than skipped */
body:has(#screen-review.active) #screen-review .pk-fee-note{
  color:var(--ink2); font-size:14px; line-height:1.55; margin-top:12px; }
/* owner 2026-10-20: when a practice tournament is played and that a reminder comes, under the order */
#screen-review .pk-review-ptnote{ margin:12px 2px 0; color:var(--ink2); font-size:15px; line-height:1.55; }

/* ---- (2) terms: readable label (>=14.5px, --ink2), Purchase Policy link slate
   (hover coral) not blue, slate checkbox accent; matching card chrome. ---- */
/* a block of its own: measured, the note above it sat 0px away, so the fee explanation read as
   part of the consent box */
body:has(#screen-review.active) #screen-review .pk-terms{
  border:1px solid var(--rule); border-radius:12px; padding:15px 16px; margin:18px 0;
  color:var(--ink2); font-size:14.5px; }
body:has(#screen-review.active) #screen-review .pk-terms label{ color:var(--ink2); line-height:1.5; }
body:has(#screen-review.active) #screen-review .pk-terms a{
  color:var(--slate); font-weight:600; text-decoration:underline; text-underline-offset:2px; }
body:has(#screen-review.active) #screen-review .pk-terms a:hover{ color:var(--coral); }
body:has(#screen-review.active) #screen-review .pk-terms input[type="checkbox"]{
  accent-color:var(--slate); }

/* ---- (5) actions: Back / Pay already slate via #wizard-mode .btn-*; keep the Pay
   min-width and ensure the primary is reachable first on narrow (stack reverses so
   Pay sits on top). ---- */
body:has(#screen-review.active) #screen-review .pk-review-actions .pk-pay{ min-width:230px; }

/* ---- (6) the page's vertical scale (2026-09-27), the configure step's: 12px from a box to the
   note that explains it, 18px between blocks, 24px before the order itself. ---- */
body:has(#screen-review.active) #screen-review #reviewAsk{ margin-bottom:24px; }
body:has(#screen-review.active) #screen-review #reviewBody{ margin:0 0 18px; }
body:has(#screen-review.active) #screen-review #reviewMoney{ margin-bottom:0; }


/* ============================================================================
   SUCCESS-POLISH (2026-09-19) — "You're all set" (#screen6 / .pk-allset) ONLY.
   Scoped to .pk-allset so all other mock screens are byte-for-byte unaffected.
   Goals: ZERO blue on the screen (de-blue the timeline "when" labels), soft
   card elevation on the order + what-happens-next cards (like packs/review),
   readable slate/ink2 typography, aligned time-label column, slate CTAs (the
   #wizard-mode .btn-* rules already deliver slate primary + slate outline +
   coral focus + hover lift, so we leave the buttons to those rules).
   ============================================================================ */

/* ---- DE-BLUE: the timeline "when" labels ("Now" / "Any time" / date) were
   color:var(--blue). Recolor to a muted slate eyebrow; keep the aligned column. */
#wizard-mode .pk-allset .pk-next-when{
  color:var(--ink2) !important;            /* --ink2 muted slate eyebrow, no blue */
  font-weight:600 !important;
  font-size:12.5px !important;
  letter-spacing:.04em;
  text-transform:uppercase;
  padding-top:1px;
}

/* ---- CARD ELEVATION + rhythm: match the packs/review soft two-layer shadow. */
#wizard-mode .pk-allset .pk-allset-order{ margin:0 auto 18px !important; }
#wizard-mode .pk-allset .pk-allset-student{
  border:1px solid var(--rule) !important;
  border-radius:14px !important;
  box-shadow:0 2px 4px rgba(16,35,64,.05), 0 8px 22px rgba(16,35,64,.10) !important;
  padding:16px 18px !important;
  margin-bottom:14px !important;
}
#wizard-mode .pk-allset .pk-allset-student:last-child{ margin-bottom:0 !important; }
#wizard-mode .pk-allset .pk-allset-next{
  border:1px solid var(--rule) !important;
  border-radius:14px !important;
  box-shadow:0 2px 4px rgba(16,35,64,.05), 0 8px 22px rgba(16,35,64,.10) !important;
  padding:6px 20px 12px !important;
}

/* ---- READABLE TYPOGRAPHY ---- */
/* success message: was faded --grey; make it readable --ink2 */
#wizard-mode .pk-allset .success-message{
  color:var(--ink2) !important;
  font-size:15px !important;
  line-height:1.5 !important;
  margin:0 auto 28px !important;
  max-width:520px;
}
/* order card: student name bold navy, pack lines readable ink2 rows */
#wizard-mode .pk-allset .pk-allset-student b{ color:var(--ink) !important; font-size:15px !important; }
#wizard-mode .pk-allset .pk-allset-student ul{
  margin:8px 0 0 !important; padding-left:18px !important;
  color:var(--ink2) !important; font-size:14.5px !important; line-height:1.6 !important;
}
/* what-happens-next heading */
#wizard-mode .pk-allset .pk-allset-next .summary-title{
  color:var(--ink) !important; font-size:1rem !important; font-weight:700 !important;
  margin:16px 0 4px !important;
}
/* timeline rows: clean rhythm, aligned time column, readable title + description */
#wizard-mode .pk-allset .pk-next-row{
  padding:14px 0 !important; gap:16px !important; align-items:flex-start !important;
  border-bottom:1px solid var(--rule) !important;
}
#wizard-mode .pk-allset .pk-next-row:last-child{ border-bottom:none !important; }
#wizard-mode .pk-allset .pk-next-when{ flex:0 0 96px !important; }
#wizard-mode .pk-allset .pk-next-body b{
  display:block !important; color:var(--nav) !important; font-size:15px !important;
  font-weight:700 !important; margin-bottom:2px;
}
#wizard-mode .pk-allset .pk-next-body span{
  color:var(--ink2) !important; font-size:14.5px !important; line-height:1.55 !important;
}

/* ---- MOBILE: stack the "when" eyebrow above its row body, no dead gap ---- */
@media (max-width:560px){
  #wizard-mode .pk-allset .pk-next-row{ flex-direction:column !important; gap:3px !important; }
  #wizard-mode .pk-allset .pk-next-when{ flex:none !important; }
}



/* ---- FIRST-STUDENT buy flow: Back is hidden by design, leaving Continue the lone
   child of `.buttons` (display:flex; justify-content:space-between), which collapses it
   to the LEFT. Push Continue to the RIGHT via auto left-margin. Harmless when Back IS
   present (add-another-from-review): space-between already right-aligns Continue and the
   auto margin is absorbed with no visible change. Scoped to buy-flow add-student only,
   so pk-choose / pk-allset action rows are untouched. (owner review 2026-09-19) ---- */
#wizard-mode.flow-buy #chooseAddForm .buttons #addStudentBtn{ margin-left:auto; }
/* At <=600px the shared rule forces `.buttons .btn{ width:100%!important }` (wizard_polish.css),
   so the button fills the column and margin-left:auto is inert. Neutralize it explicitly as a
   guard so a lone Continue never shoves off the cross-axis if that width rule ever changes. */
@media (max-width:600px){
  #wizard-mode.flow-buy #chooseAddForm .buttons #addStudentBtn{ margin-left:0; }
}

/* ============================================================================
   CART DRAWER — slate/coral design-system polish (2026-09-19, cart.html).
   Scoped to .pk-drawer with local tokens (the drawer sits OUTSIDE .pk-screen),
   so it is self-contained AND lifts the shared drawer on packs/review at port
   time. NO blue; readable meta on --ink2; slate-black Continue CTA + coral focus.
   ============================================================================ */
.pk-drawer{
  --slate:var(--nav); --slate-deep:#22303f; --coral:var(--vidya); --coral-ring:#df5a55; --grey-fill:#eef1f6;
}
/* panel: soft left-edge elevation + comfortable padding (slide/scrim kept above) */
.pk-drawer .pk-drawer-panel{ box-shadow:-14px 0 40px rgba(20,32,48,.20); }
.pk-drawer .pk-drawer-head{ padding:18px 22px; border-bottom:1px solid var(--rule); }
.pk-drawer .pk-drawer-head h3{ font-family:'Poppins', system-ui, -apple-system, "Segoe UI", sans-serif;
  color:var(--ink); font-weight:700; font-size:1.16rem; letter-spacing:-.015em; line-height:1.2; margin:0; }
.pk-drawer .pk-drawer-close{ color:var(--ink2); }
.pk-drawer .pk-drawer-close:hover{ background:var(--grey-fill); color:var(--ink); }
.pk-drawer .pk-drawer-body{ padding:14px 22px; }

/* student group header: bold slate name + readable --ink2 meta; subtle neutral divider */
.pk-drawer .pk-drawer-who{ border-bottom:1px solid var(--rule2); padding:18px 0 9px; margin-bottom:2px; }
.pk-drawer .pk-drawer-who:first-child{ padding-top:2px; }
.pk-drawer .pk-drawer-who-name{ color:var(--ink); font-weight:700; font-size:15px; }
.pk-drawer .pk-drawer-who-grade{ color:var(--ink2); font-weight:500; font-size:13px; }

/* line rows: pack name bold slate, scope readable --ink2 (not faded grey), price slate tabular right */
.pk-drawer .pk-drawer-line{ align-items:flex-start; gap:14px; padding:14px 0; border-bottom:1px solid var(--rule); }
.pk-drawer .pk-drawer-line b{ color:var(--ink); font-weight:600; font-size:14.5px; line-height:1.35; }
.pk-drawer .pk-drawer-scope{ color:var(--ink2); font-size:13.5px; margin-top:3px; }
.pk-drawer .pk-drawer-price{ color:var(--ink); font-weight:600; font-size:14.5px; text-align:right; font-variant-numeric:tabular-nums; }
/* remove control: clean neutral icon button, coral on hover (not a faint ×) */
.pk-drawer .pk-drawer-x{ width:28px; height:28px; border-radius:8px; display:grid; place-items:center;
  border:1px solid transparent; background:transparent; color:var(--ink2); font-size:1.2rem; line-height:1; cursor:pointer;
  transition:background .15s ease, color .15s ease, border-color .15s ease, transform .15s ease; }
.pk-drawer .pk-drawer-x:hover{ background:#fdecec; color:var(--coral); border-color:#f6d4d3; transform:scale(1.08); }
.pk-drawer .pk-drawer-x:active{ transform:scale(.94); }
.pk-drawer .pk-drawer-x:focus-visible{ outline:2px solid var(--coral-ring); outline-offset:2px; }

/* foot: --ink2 subtotal/fee rows, emphasized slate TOTAL after a clean solid divider */
.pk-drawer .pk-drawer-foot{ padding:16px 22px 18px; border-top:1px solid var(--rule); }
.pk-drawer .pk-drawer-row{ display:flex; justify-content:space-between; align-items:baseline;
  color:var(--ink2); font-size:14.5px; font-weight:500; margin-bottom:9px; }
.pk-drawer .pk-drawer-row span:last-child{ color:var(--slate); font-weight:600; font-variant-numeric:tabular-nums; letter-spacing:0; }
.pk-drawer .pk-drawer-total{ color:var(--slate); font-weight:700; font-size:1.12rem;
  border-top:1px solid var(--rule); border-bottom:0; padding-top:12px; margin-top:6px; }
.pk-drawer .pk-drawer-total span:last-child{ color:var(--slate); font-weight:700; }

/* Continue = slate-black CTA (enabled bg #2c3e50 + hover lift inherit from
   "#wizard-mode .btn-primary"); here we guarantee full-width/radius, coral focus
   ring (kills the Bootstrap blue focus glow) and a clean neutral disabled state. */
.pk-drawer .pk-drawer-continue{ width:100%; margin-top:14px; border-radius:10px; font-weight:600; padding:12px 16px; }
/* higher specificity than wizard_polish '#wizard-mode .btn' so the smoother .2s (incl transform) wins */
#wizard-mode .pk-drawer .pk-drawer-continue{ transition:background .2s ease, border-color .2s ease, box-shadow .2s ease, transform .2s ease; }
#wizard-mode .pk-drawer .pk-drawer-continue:hover:not(:disabled){ background:#22303f !important; border-color:#22303f !important;
  transform:translateY(-1px); box-shadow:0 8px 20px rgba(20,32,48,.26) !important; }
#wizard-mode .pk-drawer .pk-drawer-continue:active:not(:disabled){ transform:translateY(0) scale(.99);
  box-shadow:0 2px 6px rgba(20,32,48,.22) !important; }
.pk-drawer .pk-drawer-continue:focus-visible{ outline:2px solid var(--coral-ring) !important; outline-offset:2px;
  box-shadow:0 2px 6px rgba(20,32,48,.18) !important; }
#wizard-mode .pk-drawer .pk-drawer-continue:disabled,
#wizard-mode .pk-drawer .pk-drawer-continue[disabled]{ background:#e6ebf3 !important; border-color:#e6ebf3 !important;
  color:#98a3b4 !important; box-shadow:none !important; transform:none !important; cursor:not-allowed; }

/* reduced-motion: keep color/shadow feedback, drop transforms (items 3+4) */
@media (prefers-reduced-motion:reduce){
  #wizard-mode .pk-drawer .pk-drawer-continue{ transition:background .2s ease, border-color .2s ease, box-shadow .2s ease; }
  #wizard-mode .pk-drawer .pk-drawer-continue:hover:not(:disabled),
  #wizard-mode .pk-drawer .pk-drawer-continue:active:not(:disabled){ transform:none; }
  .pk-drawer .pk-drawer-x{ transition:background .15s ease, color .15s ease, border-color .15s ease; }
  .pk-drawer .pk-drawer-x:hover, .pk-drawer .pk-drawer-x:active{ transform:none; }
}

/* empty state: neutral + readable */
.pk-drawer .pk-drawer-empty{ color:var(--ink2); }
.pk-drawer .pk-drawer-empty b{ color:var(--ink); font-size:1.02rem; }

/* mobile: full-width panel, no horizontal overflow, body scrolls, foot reachable */
@media (max-width:480px){
  .pk-drawer .pk-drawer-panel{ width:100%; max-width:100%; }
  .pk-drawer .pk-drawer-head{ padding:16px 18px; }
  .pk-drawer .pk-drawer-body{ padding:12px 18px; }
  .pk-drawer .pk-drawer-foot{ padding:14px 18px 16px; }
}


/* ============================================================================
   CART DRAWER — PT-style classified STUDENT CARDS (2026-09-19, cart.html).
   Mirrors the Practice-Tournament review cart (.cartv2-student / .cartp-ava /
   .cartp-tag.grade) adapted to the slate/coral palette — NO blue. Each student
   is a subtle card: slate avatar + bold name + green grade chip + slate region
   chip + per-student subtotal (>1 line) over a divider; lines keep the shared
   .pk-drawer-line hierarchy (pack name > scope > slate price > coral-hover x).
   .pk-drawer is shared, so this also lifts the cart on packs/review at port.
   ============================================================================ */
.pk-drawer .pk-cart-student{ background:#fafbfd; border:1px solid var(--rule); border-radius:13px;
  padding:13px 14px 10px; margin-bottom:12px; }
.pk-drawer .pk-cart-student:last-child{ margin-bottom:2px; }

/* head: avatar + name + chips + right-aligned per-student subtotal, over a divider */
.pk-drawer .pk-cart-shead{ display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding-bottom:10px; margin-bottom:2px; border-bottom:1px solid var(--rule); }
.pk-drawer .pk-cart-ava{ width:36px; height:36px; flex:none; border-radius:50%;
  background:linear-gradient(135deg,#455468,var(--nav)); color:#fff; letter-spacing:.01em;
  display:flex; align-items:center; justify-content:center; font-weight:700; font-size:15px; line-height:1; }
.pk-drawer .pk-cart-sname{ font-weight:700; color:var(--ink); font-size:15.5px; letter-spacing:-.01em;
  min-width:0; overflow-wrap:anywhere; }
.pk-drawer .pk-cart-chip{ font-size:12px; font-weight:600; padding:3px 9px; border-radius:999px;
  line-height:1.5; white-space:nowrap; }
.pk-drawer .pk-cart-chip.grade{ background:#e7f4ee; color:var(--go); }      /* semantic green grade pill */
.pk-drawer .pk-cart-chip.region{ background:var(--grey-fill); color:var(--ink2); }  /* neutral slate pill */
.pk-drawer .pk-cart-ssub{ margin-left:auto; font-weight:700; color:var(--slate); font-size:15px;
  font-variant-numeric:tabular-nums; white-space:nowrap; }

/* lines inside a card: row dividers (top), first-child none, tidy last-child */
.pk-drawer .pk-cart-lines{ display:flex; flex-direction:column; }
.pk-drawer .pk-cart-lines .pk-drawer-line{ border-bottom:0; border-top:1px solid var(--rule); padding:11px 0; }
.pk-drawer .pk-cart-lines .pk-drawer-line:first-child{ border-top:0; padding-top:9px; }
.pk-drawer .pk-cart-lines .pk-drawer-line:last-child{ padding-bottom:2px; }

@media (max-width:480px){
  .pk-drawer .pk-cart-student{ padding:12px 12px 9px; }
  .pk-drawer .pk-cart-sname{ font-size:15px; }
}


/* The fragment target a tournament-funnel parent lands on (SHARED_WELCOME_URL): clear the fixed
   navbar so the section heading is not scrolled underneath it. */
#practice-tournaments{ scroll-margin-top:92px; }

/* C-5: the All practice tournaments schedule. */
.pk-tourtable{width:100%;border-collapse:collapse}
.pk-tourtable th,.pk-tourtable td{text-align:left;padding:12px 10px;border-bottom:1px solid #e6e8f0;
                                  vertical-align:top;font-weight:400}
.pk-tourtable thead th{font-size:.82rem;text-transform:uppercase;letter-spacing:.04em;color:#868ca6}
.pk-tourname{display:block;font-weight:600;color:#1c2033}
.pk-tourscope{display:block;font-size:.85rem;color:#5b6478;margin-top:2px}
.pk-tourlevel{display:inline-block;border:1px solid #e6e8f0;border-radius:6px;padding:1px 6px;
              margin-right:4px;font-size:.8rem;color:#5b6478}

/* D-3: the parent dashboard's three panels. The tabs themselves are in the chrome
   (templates/navbar_v5.html, styled in nav-shared.css); qvTabs.show() toggles hidden here. */
.pd-panel[hidden]{display:none}

/* Board C-9: every cart line says which kind it is. */
.pk-drawer-kind{display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:#868ca6}
.pk-drawer-note{margin:16px 0 0;font-size:.85rem;color:#5b6478}

/* Board C-8: level chips read like the subject chips, so both configure screens look the same. */
.pk-level{display:inline-flex;align-items:center;gap:6px;border:1px solid #e6e8f0;border-radius:8px;
          background:#fff;padding:6px 10px;margin:0 6px 6px 0;cursor:pointer;color:#1c2033}
.pk-level[aria-pressed="true"]{border-color:#5b53e0;box-shadow:inset 0 0 0 1px #5b53e0}
/* a level the student already holds reads like an owned subject chip (I-5): grey, ticked, not interactive */
.pk-level.owned{background:var(--grey-fill);color:var(--grey);border-color:transparent;cursor:not-allowed}
.pk-level.owned .pk-tick{background:var(--grey);border-color:var(--grey)}
.pk-level.owned .pk-tick::after{content:"";position:absolute;left:3px;top:0;width:5px;height:9px;border-right:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(40deg)}
.pk-held-note{margin:6px 0 0;font-size:.85rem;color:#5b6478}
.pk-picklinerow{margin:0 0 16px;color:#5b6478}

/* ---- M-9 (strict review 2026-09-21): touch targets on the paths that spend money ----
   On a touch screen (pointer: coarse) every control a parent taps to add, remove or pay reaches
   44px (Apple HIG 44pt; WCAG 2.5.5). The remove x and the per-line Edit keep their glyph box: a
   transparent ::after extends the HIT AREA to 44px around them, so nothing moves and the 12-14px
   gaps beside them stay clear of the extension. Chips and the Cart button grow their own box,
   because their neighbours sit too close for an invisible extension not to overlap them. A mouse
   or trackpad keeps the desktop density. */
@media (pointer: coarse) {
  .pk-drawer-x, .pk-drawer-close, .pk-review-edit{ position:relative; }
  .pk-drawer-x::after, .pk-drawer-close::after, .pk-review-edit::after{
    content:""; position:absolute; top:50%; left:50%; width:44px; height:44px; min-width:100%; min-height:100%;
    transform:translate(-50%,-50%); }
  .pk-cartbtn{ min-height:44px; }
  /* E2E 2026-10-05: the policy and consent rows (22px) and the card's Results link (32px) */
  .pk-terms label, #studentForm .consent-checkbox{ min-height:44px; align-items:center; }
  #screen-packs .pk-card .pk-choices .pk-choice, #screen-packs .pk-card .pk-choices .pk-set,
  #screen-packs .pk-card .pk-choices:not(.pk-choices--sets) .pk-choice{ min-height:44px; }
}


/* ============================================================================
   W4 — THE WIZARD HEAD ROW (#wizHead, templates/parent_wizard.html)

   One title, one lead line and ONE Cart pill for the whole wizard, above the step strip. The
   words are set by setWizardHead() (parent_wizard.js) from wizardLine.kind, so both purchases
   share this markup and only the copy differs.

   The pill was scoped to #screen-packs when each screen carried its own copy; there is one now,
   and it says two things: grey outline while the cart is empty, gold with a navy count once it
   holds something, so a parent can see at a glance that a tick landed.
   ============================================================================ */
#wizard-mode .pk-wizhead{ padding:26px 40px 0; }
#wizard-mode .pk-wizhead[hidden]{ display:none; }
.pk-wizhead-row{ display:flex; align-items:flex-start; justify-content:space-between; gap:14px 18px; }
.pk-wizhead-title{ margin:0; font-size:1.45rem; font-weight:700; line-height:1.28; letter-spacing:-.015em;
  color:var(--ink); overflow-wrap:anywhere; }
.pk-wizhead-lead{ margin:8px 0 0; font-size:14.5px; line-height:1.55; color:var(--ink2); max-width:70ch; }
.pk-wizhead-lead[hidden]{ display:none; }
#wizHead .pk-cartbtn{ flex:0 0 auto; margin-top:2px; }
#wizHead .pk-cartbtn[hidden]{ display:none; }
/* holding something: the system's caution amber, with the count in navy. W4 names two new gold
   tokens; --warn-tint / --warn are that colour and already exist, and this sheet's hex budget is a
   one-way ratchet, so the pill uses the palette rather than growing it. */
#wizHead .pk-cartbtn:not(.empty){ background:var(--warn-tint); border-color:var(--warn); color:var(--ink); }
#wizHead .pk-cartbtn:not(.empty) .pk-cartcount{ background:var(--nav); color:var(--paper); }

@media (max-width:820px){
  #wizard-mode .pk-wizhead{ padding:22px 28px 0; }
}
@media (max-width:600px){
  /* the gutter the rest of the wizard uses, and the pill stays on the title's row */
  #wizard-mode .pk-wizhead{ padding:20px 16px 0; }
  .pk-wizhead-title{ font-size:1.25rem; }
  .pk-wizhead-row{ gap:10px 12px; }
  #wizHead .pk-cartbtn{ padding:7px 12px; }
}

/* ---- the heading card (owner 2026-09-30, Parent Dashboard Rework) ------------------------------
   On the configure step, once a parent's line names its student, the head row is a card:
   "Register Bob for Zoology" with the name in the action colour, the facts under
   it, and Change student beside the Cart. The same card heads the practice tournaments list when a
   student card opened it (#tourPinHead). Unnamed, the row is the plain title and Cart it always was. */
.pk-wizhead-tx{ flex:1 1 0; min-width:0; }   /* 0, not auto: on a phone the heading keeps its row instead of wrapping under the actions */
.pk-wizhead-acts{ flex:0 0 auto; display:flex; align-items:center; gap:14px; }
.pk-wizhead-who{ color:var(--action-deep); }
#wizHead.is-named .pk-wizhead-row, .pk-tourpin .pk-wizhead-row{ align-items:center; padding:16px 20px; background:var(--paper);
  border:1px solid var(--rule); border-radius:16px; }
#wizHead.is-named .pk-wizhead-title, .pk-tourpin .pk-wizhead-title{ margin:0; font-size:1.45rem; font-weight:700; line-height:1.28; letter-spacing:-.015em; color:var(--ink); overflow-wrap:anywhere; }
#wizHead.is-named .pk-wizhead-lead, .pk-tourpin .pk-wizhead-lead{ margin:3px 0 0; font-size:14px; }
#wizHead.is-named .pk-cartbtn{ margin-top:0; }
/* the quiet ways out of the card: back to where the line came from, and a different student */
.pk-wizback, .pk-wizchange{ -webkit-appearance:none; appearance:none; display:inline-flex; align-items:center; gap:4px; min-height:40px;
  margin:0; padding:0 2px; border:0; background:none; font:600 14px/1.3 var(--sans); color:var(--action-deep); cursor:pointer; white-space:nowrap; }
.pk-wizback{ margin:0 0 6px; }
.pk-wizback[hidden], .pk-wizchange[hidden]{ display:none; }
.pk-wizback:focus, .pk-wizchange:focus{ outline:none; }
.pk-wizback:focus-visible, .pk-wizchange:focus-visible{ outline:2px solid var(--action-deep); outline-offset:2px; border-radius:6px; }
@media (hover:hover) and (pointer:fine){
  .pk-wizback:hover, .pk-wizchange:hover{ color:var(--nav); text-decoration:underline; text-underline-offset:3px; }
}
/* the per-student practice tournaments list: the card replaces the tab's own title row */
.pk-tourpin{ margin:0 0 20px; }
.pk-tourpin[hidden]{ display:none; }
#tourPlainHead.is-pinned .pt-hero-title{ display:none; }
/* a line with no Student step: the strip is two steps (updateProgress hides and renumbers) */
.pk-stepper .step[hidden]{ display:none; }
@media (max-width:600px){
  #wizHead.is-named .pk-wizhead-row, .pk-tourpin .pk-wizhead-row{ flex-wrap:wrap; padding:14px 16px; gap:10px 12px; }
  #wizHead.is-named .pk-wizhead-title, .pk-tourpin .pk-wizhead-title{ font-size:1.2rem; }
  /* Change student (and, in the wizard, the Cart) take their own line under the heading card's
     title; a plain head keeps its Cart beside the title, as it always has */
  #wizHead.is-named .pk-wizhead-acts, .pk-tourpin .pk-wizhead-acts{ flex:1 1 100%; justify-content:space-between; }
}


/* ============================================================================
   W2 — THE STUDENT STEP (#screen-choose): one card, one question, radio cards

   The step used to be a grid of button-cards carrying avatars, status pills and a chevron, and a
   click committed the purchase to that child. It is a radio group now: native radios inside a
   fieldset whose legend is the question, so arrow keys work, the browser owns the selection, and
   the only way forward is Continue. Nothing here forks on what is being bought -- only the
   question's words differ, and those come from renderChooseStudent.
   ============================================================================ */
#screen-choose{ max-width:640px; margin:0 auto; }
.pk-choosecard{
  background:var(--paper); border:1px solid var(--rule); border-radius:16px; padding:22px 24px;
}
.pk-choose-group{ border:0; margin:0; padding:0; min-width:0; }   /* a fieldset's UA box, removed */
.pk-choose-q{ display:block; float:none; width:auto; margin:0 0 14px; padding:0;
  font-size:1.05rem; font-weight:700; line-height:1.35; color:var(--ink); }
.pk-choose-list{ display:grid; grid-template-columns:minmax(0,1fr); gap:10px; margin:0; }

.pk-radio-card{
  display:flex; align-items:center; gap:12px; width:100%; margin:0; padding:12px 14px;
  background:var(--paper); border:1px solid var(--rule); border-radius:10px; cursor:pointer;
  transition:border-color .15s ease, box-shadow .15s ease, background .15s ease;
}
.pk-radio-card input[type="radio"]{ flex:0 0 auto; width:18px; height:18px; margin:0; accent-color:var(--nav); }
.pk-radio-body{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.pk-radio-name{ font-size:14.5px; font-weight:600; color:var(--ink); line-height:1.35; overflow-wrap:anywhere; }
.pk-radio-meta{ font-size:13.5px; color:var(--ink2); line-height:1.4; }
/* owner 2026-10-20: what a student already holds of the practice tournament being registered for */
.pk-radio-held{ font-size:13px; font-weight:600; color:var(--ink2); line-height:1.4; }
.pk-radio-held.is-some::before{ content:"\2713"; margin-right:5px; color:var(--go); }
.pk-radio-card.is-full{ cursor:not-allowed; background:var(--page); }
.pk-radio-card.is-full .pk-radio-name, .pk-radio-card.is-full .pk-radio-meta{ color:var(--ink3); }
/* selected: the border carries it, with a ring so it reads at a glance without tinting the text */
.pk-radio-card.selected{ border-color:var(--nav); box-shadow:inset 0 0 0 1px var(--nav); background:var(--page); }
/* The ring is for KEYBOARD focus. :focus-within also matches a mouse click -- clicking the label
   focuses the radio inside it -- so every pick drew a coral ring around the tile, on top of
   .selected's navy border. :has(:focus-visible) puts it back to keyboard only; the ring must sit
   on the card, not the radio, which is why :has carries it. */
.pk-radio-card:has(:focus-visible){ outline:2px solid var(--coral-ring); outline-offset:2px; }

/* + Add a student / Pick an existing student instead: IAC's quiet ghost button, on the title row */
.pk-ghost{
  -webkit-appearance:none; appearance:none; margin:0; min-height:44px; padding:9px 16px;
  background:var(--tint); border:1px solid var(--rule2); border-radius:10px;
  font:inherit; font-size:14.5px; font-weight:600; color:var(--nav); cursor:pointer;
  transition:background .15s ease, border-color .15s ease, transform .12s ease;
}
.pk-ghost:focus{ outline:none; }
.pk-ghost:focus-visible{ outline:2px solid var(--coral-ring); outline-offset:2px; }
.pk-ghost:active{ transform:scale(.99); }

@media (hover:hover) and (pointer:fine){
  .pk-radio-card:not(.selected):not(.is-full):hover{ border-color:var(--rule2); background:var(--page); }
  .pk-ghost:hover{ background:var(--paper); border-color:var(--nav); }
}
@media (max-width:600px){
  /* the wizard's gutter, and the card takes the width it is given */
  #screen-choose{ max-width:none; }
  .pk-choosecard{ padding:18px 16px; border-radius:14px; }
}
@media (prefers-reduced-motion:reduce){
  .pk-radio-card, .pk-ghost{ transition:none !important; }
  .pk-ghost:active{ transform:none !important; }
}

/* ---- W3: the add-student form, in the same card -----------------------------------------------
   The form is the card's other half, not another screen, so the parent never loses the line, the
   cart or their place by adding a student. As IAC's register wizard: the title and "Pick an existing
   student instead" share one row (the button is the same quiet .pk-ghost as "+ Add a student"),
   then one line saying what comes next. A parent with no students gets neither way back. */
.pk-addform{ min-width:0; }
.pk-add-head{ display:flex; flex-wrap:wrap; align-items:center; gap:10px 12px; margin:0 0 6px; }
.pk-add-head .pk-add-title, .pk-add-head .pk-choose-q{ margin:0 auto 0 0; }
.pk-add-head .pk-add-title[hidden] + .pk-ghost{ margin-left:auto; }   /* the head says "Add a student": the link keeps its side */
#choosePicker .pk-add-head{ margin-bottom:14px; }
.pk-add-lead{ margin:0 0 16px; font-size:.9rem; line-height:1.5; color:var(--ink2); }

/* ---- while the add form is open, it is ONE card (owner 2026-10-01, as IAC's inline student form:
   the title row, the lead, the fields and Cancel / Add student all inside the same .card). So the
   student card keeps its surface and the form inside it is flat -- the raised #studentForm above is
   for the form standing alone. The 640px cap that suits a radio list must not squeeze a two-column
   form (that cap is why the consent line used to wrap), so it lifts while the form is open. */
#screen-choose:has(#chooseAddForm:not([hidden])){ max-width:none; }
#wizard-mode.flow-buy .pk-choosecard #chooseAddForm #studentForm{
  background:none; border:0; border-radius:0; padding:0; box-shadow:none;
}

.pk-add-title{ margin:0 0 16px; font-size:1.15rem; font-weight:700; line-height:1.3; color:var(--ink); }

/* The foot: Cancel is the quiet one and sits first, so the eye lands on Add student. Under 480px
   they stack and Add student goes on top -- column-reverse keeps the DOM order (Cancel first) that
   a screen reader and the tab ring follow. */
.pk-add-foot{ display:flex; flex-wrap:wrap; align-items:center; justify-content:flex-end; gap:12px; margin-top:22px; }
.pk-add-foot .btn{ min-height:44px; }
@media (max-width:479.98px){
  .pk-add-foot{ flex-direction:column-reverse; align-items:stretch; gap:10px; }
  .pk-add-foot .btn{ width:100%; }
}


/* ---- W6: Review on a phone ----------------------------------------------------------------
   The price stays at the right of every line and the name wraps beneath itself; Back and Pay stop
   sharing a row, because "Pay $70 with Stripe" cannot fit beside anything at 320px. */
@media (max-width:520px){
  .pk-review-actions{ flex-direction:column-reverse; align-items:stretch; gap:10px; }
  .pk-review-actions .btn{ width:100%; min-height:46px; }
  .pk-pay{ min-width:0; }
  .pk-ask{ flex-direction:column; align-items:stretch; }
  /* the lead's 260px flex-basis is a WIDTH beside the buttons; stacked, it would be a height */
  .pk-ask-lead{ flex:0 0 auto; }
  /* 18px: the same column .pk-review-line keeps at this width (it has no phone override) */
  .pk-review-kindhead{ padding:12px 18px 4px; }
}


/* ============================================================================
   Review and pay, one order (owner 2026-10-20): the students, the line to add one and the total in
   ONE card, each price said once; under it the dates note; then "Before you pay" with the school
   details still needed, the policy tick and Pay. Scoped like the polish block above, so it wins.
   ============================================================================ */
body:has(#screen-review.active) #screen-review .pk-order{
  background:#fff; border:1px solid var(--rule); border-radius:14px; box-shadow:var(--card-sh); overflow:hidden; }
body:has(#screen-review.active) #screen-review .pk-order #reviewBody,
body:has(#screen-review.active) #screen-review .pk-order #reviewAsk,
body:has(#screen-review.active) #screen-review .pk-order #reviewMoney{ margin:0; border-radius:0; box-shadow:none; }
body:has(#screen-review.active) #screen-review .pk-order .pk-review-card{ margin:0; border:0; border-radius:0; box-shadow:none; }
body:has(#screen-review.active) #screen-review .pk-order .pk-review-card + .pk-review-card{ border-top:1px solid var(--rule); }
/* the line to add a student: a row of the order, not a card of its own */
body:has(#screen-review.active) #screen-review .pk-order #reviewAsk{
  border:0; border-top:1px solid var(--rule); background:#fff; padding:12px 18px; gap:8px 12px; justify-content:space-between; }
body:has(#screen-review.active) #screen-review .pk-ask-lead{ flex:0 1 auto; font-weight:500; color:var(--ink2); }
/* owner 2026-10-21: a standard secondary button (the wizard's Back), not a text link */
#screen-review .pk-ask-add{ margin-left:auto; min-height:40px; padding:0 18px; font-size:14.5px; }
/* the total: the order's last rows */
body:has(#screen-review.active) #screen-review .pk-order #reviewMoney{
  border:0; border-top:1px solid var(--rule); background:#f8fafd; padding:14px 20px; }
body:has(#screen-review.active) #screen-review .pk-review-grouphead .pk-review-pencil{ margin-left:auto; }
/* Before you pay */
/* owner 2026-10-21: one tinted panel, so the ask reads as one thing to do, set apart from the order;
   each student's fields are a white box inside it */
#screen-review .pk-before{ margin:20px 0 0; padding:18px 20px 8px; background:var(--tint); border:1px solid var(--rule2);
  border-radius:14px; }   /* the padding also beats index.css's 80px on every <section> */
#screen-review .pk-before[hidden]{ display:none; }
#screen-review .pk-before-h{ display:flex; align-items:center; gap:10px; margin:0 0 4px; font-size:17px; font-weight:700; color:var(--ink); }
#screen-review .pk-before-ico{ flex:none; display:inline-flex; align-items:center; justify-content:center; width:30px; height:30px;
  border-radius:9px; background:var(--paper); border:1px solid var(--rule2); }
#screen-review .pk-before-ico svg{ width:17px; height:17px; fill:none; stroke:var(--ink); stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
#screen-review .pk-before-p{ margin:0 0 14px; font-size:14.5px; line-height:1.5; color:var(--ink2); }
#screen-review .pk-before .pk-school{ margin-bottom:12px; border-color:var(--rule2); padding:14px 16px 16px; }
#screen-review .pk-before .pk-school h4{ margin-bottom:10px; font-size:15.5px; }
/* Save is the field grid's last cell (pack_cart.js mountSchoolBoxes): beside School on a wide screen,
   under the fields on a narrow one. Its empty label lines the button up with the inputs. */
#screen-review .pk-before .pk-school-act{ display:flex; flex-direction:column; gap:0; margin:0; grid-column:1 / -1; }   /* gap 0: school_field.css's 12px pushed Save below the inputs */
#screen-review .pk-before .pk-school-act-k{ display:none; }
#screen-review .pk-before .pk-school-btns{ display:flex; flex-wrap:wrap; gap:8px; }
#screen-review .pk-before .pk-school-err{ margin:8px 0 0; }
#screen-review .pk-before .pk-school-err:empty{ display:none; }
/* wide enough: Country, State, School and Save on one row (school_field.css stacks them on a phone) */
@media (min-width:700px){
  #screen-review .pk-before .qsf-grid{ grid-template-columns:minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.6fr) auto; gap:12px 12px; }
  #screen-review .pk-before .qsf-wide{ grid-column:auto; }
  #screen-review .pk-before .pk-school-act{ grid-column:auto; }
  #screen-review .pk-before .pk-school-act-k{ display:block; visibility:hidden; }
}
#screen-review .pk-fee-note[hidden], #screen-review .pk-review-ptnote[hidden]{ display:none; }
@media (max-width:520px){
  body:has(#screen-review.active) #screen-review .pk-order #reviewAsk{ flex-direction:row; flex-wrap:wrap; align-items:center; }
}
