﻿/* ============================================================
   MATTHEW HOUSE - ADD NEW PROGRAM WIZARD
   Verbatim port of _handoff/Program Wizards (Add New Program, wz2 variant).
   Every rule is scoped under :is(#pgWiz,#schWiz,#latePts) so the mock's generic class names
   (.field, .icf, .modal, .ui-btn ...) never leak into the app. The demo
   canvas cream body is intentionally dropped - the wizard is a modal here,
   and the app-wide standing rule is ONE cool-gray background, no cream.
   Only the wz2 chrome the Add New Program screen actually uses is kept.
   ============================================================ */
/* =============================================================================
   #latePts JOINED THIS FILE'S SELECTOR GROUP ON PURPOSE (Aug 9 2026).

   The staff "how many points was this late visit worth" prompt had to look like
   the app's own wizards, not like a new dialog invented for it. Rather than
   copying the field kit, the buttons and the modal shell into a fourth place -
   which is how three of them drift apart - the overlay's id was added to EVERY
   selector in this file. It therefore gets the shell, .modal, .field, .icf,
   .ui-btn and the tokens for free, and can never drift from the wizards, because
   there is nothing separate to drift.

   Rules it does not use simply do not match. The handful of things unique to it
   (the child list) are at the END of this file, scoped #latePts alone.
   ============================================================================= */
:is(#pgWiz,#schWiz,#latePts){
  --font-sans:'Hanken Grotesk',ui-sans-serif,system-ui,-apple-system,sans-serif;
  --font-mono:'IBM Plex Mono',ui-monospace,Menlo,monospace;

  /* Brand accent = the LEFT-RAIL / sidebar teal (#2E4A43 -> #213A33), so EVERY accent
     inside the wizard - primary buttons, "Step x of 4" bar, the toggle switch, the
     day-of-week toggles, selected dropdown options, the review hero - is the same colour
     and matches the rail (was the brighter pine #3E6B57). */
  --brand:#2E4A43; --brand-600:#375A50; --brand-700:#213A33;
  --brand-tint:rgba(46,74,67,.12); --brand-tint-2:rgba(46,74,67,.18);
  --brand-glow:rgba(33,58,51,.35);

  --ink-1:#1C2733; --ink-2:#3B474B; --ink-3:#677579; --ink-4:#9AA7B3;
  --danger:#C0473F; --danger-bg:#F7E3E1; --danger-ink:#8C312B;

  --bg-canvas:#E8EBF0;
  /* inset cool field tokens (tuned against the #E8EBF0 cool canvas) */
  --f-rest-bg:#DFE4EA; --f-rest-bd:rgba(40,60,80,.10); --f-rest-sh:inset 0 1px 2px rgba(40,60,80,.10);
  --f-hover-bg:#E4E8ED;
  --f-focus-bg:#FFFFFF; --f-focus-bd:rgba(40,60,80,.16); --f-focus-sh:0 10px 28px rgba(40,60,80,.14);

  --line:rgba(40,60,80,.08);
  --r-sm:9px; --r-md:12px; --r-lg:16px; --r-pill:999px;
  --ease:cubic-bezier(.2,.7,.25,1); --t:.2s var(--ease);

  /* CTA accent = the LEFT-RAIL gradient colours (deep teal #2E4A43 -> #213A33), so the
     "Step x of 4" progress bar and the primary buttons match each other AND the sidebar
     (was the brighter pine --brand). ONE definition -> guaranteed identical. */
  --pg-cta:linear-gradient(135deg,#2E4A43,#213A33);
  --pg-cta-hover:linear-gradient(135deg,#375A50,#274A40);
  --pg-cta-glow:rgba(33,58,51,.42);
}
:is(#pgWiz,#schWiz,#latePts) *{box-sizing:border-box}

/* =========================================================
   MODAL OVERLAY (replaces the demo canvas frame)
   ========================================================= */
:is(#pgWiz,#schWiz,#latePts){position:fixed;inset:0;z-index:200;display:none;place-items:center;padding:24px;
  background:rgba(28,39,51,.5);backdrop-filter:blur(3px);overflow:auto;
  font-family:var(--font-sans);color:var(--ink-1);-webkit-font-smoothing:antialiased}
:is(#pgWiz,#schWiz,#latePts).show{display:grid;animation:pgFade .22s var(--ease)}
@keyframes pgFade{from{opacity:0}to{opacity:1}}

/* =========================================================
   MODAL SHELL
   ========================================================= */
:is(#pgWiz,#schWiz,#latePts) .modal{position:relative;display:flex;flex-direction:column;overflow:hidden;background:#fff;
  border-radius:24px;border:1px solid var(--line);
  box-shadow:0 40px 90px -20px rgba(28,39,51,.35),0 4px 14px rgba(28,39,51,.08)}
:is(#pgWiz,#schWiz,#latePts) .modal.wz2{width:min(1240px,100%);height:min(calc(92 * var(--mh-vh)),884px);animation:pgRise .42s var(--ease)}
@keyframes pgRise{from{opacity:0;transform:translateY(16px) scale(.99)}to{opacity:1;transform:none}}
:is(#pgWiz,#schWiz,#latePts) .m-body{flex:1;min-height:0;overflow:auto;padding:8px 26px 26px}
:is(#pgWiz,#schWiz,#latePts) .m-body::-webkit-scrollbar{width:10px}
:is(#pgWiz,#schWiz,#latePts) .m-body::-webkit-scrollbar-thumb{background:rgba(40,60,80,.16);border-radius:99px;border:3px solid #fff}
:is(#pgWiz,#schWiz,#latePts) .m-foot{flex:none;display:flex;align-items:center;gap:12px;padding:16px 22px;border-top:1px solid var(--line);
  background:linear-gradient(0deg,#F7F9FA,#FFFFFF)}
:is(#pgWiz,#schWiz,#latePts) .m-foot .spacer{flex:1}
:is(#pgWiz,#schWiz,#latePts) .m-foot .foot-hint{font-size:12.5px;color:var(--ink-3);font-weight:500}

/* =========================================================
   FIELDS
   ========================================================= */
:is(#pgWiz,#schWiz,#latePts) .step{display:none;animation:stepIn .32s var(--ease)}
:is(#pgWiz,#schWiz,#latePts) .step.active{display:block}
@keyframes stepIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
:is(#pgWiz,#schWiz,#latePts) .fgrid{display:grid;grid-template-columns:1fr 1fr;gap:18px 20px}
:is(#pgWiz,#schWiz,#latePts) .fgrid .full{grid-column:1/-1}
:is(#pgWiz,#schWiz,#latePts) .field{display:flex;flex-direction:column;gap:8px;min-width:0}
:is(#pgWiz,#schWiz,#latePts) .field>label{font-size:11.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-3);display:flex;align-items:center;gap:6px}
:is(#pgWiz,#schWiz,#latePts) .field .req{color:var(--danger)}
:is(#pgWiz,#schWiz,#latePts) .divider{height:1px;background:var(--line);margin:22px 0}

/* ---- GROUP HEADER inside a step (Jul 31 2026) ---------------------------------
   Step 3 carries two unrelated families: what the program IS (delivery, completion)
   and the points economy (earn rate, gift-card rule, threshold). A labelled rule
   between them is what makes "these three belong together" readable at a glance,
   without spending a whole wizard step on three fields. Grid child, full width. */
:is(#pgWiz,#schWiz,#latePts) .grp{display:flex;align-items:center;gap:12px;margin:6px 0 -2px}
:is(#pgWiz,#schWiz,#latePts) .grp-h{font-size:11.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-3);white-space:nowrap}
:is(#pgWiz,#schWiz,#latePts) .grp-line{flex:1;height:1px;background:var(--line)}

/* Helper text under a stepper. Sits OUTSIDE .icf so it never inherits the field
   fill, and is muted enough that it reads as guidance, not as a validation message
   (those are .msg.err and must stay the only red thing in the form). */
:is(#pgWiz,#schWiz,#latePts) .fhint{font-size:12px;font-weight:500;line-height:1.35;color:var(--ink-4);margin-top:-1px}

/* Advisory warning under a stepper. Amber, NOT the red of .msg.err - this never blocks
   Continue, and borrowing the error red would teach staff that red is sometimes ignorable.
   It replaces .fhint rather than stacking, so the field never grows a third line. */
:is(#pgWiz,#schWiz,#latePts) .fwarn{display:flex;align-items:flex-start;gap:6px;font-size:12px;font-weight:600;line-height:1.35;color:#8a5a12;margin-top:-1px}
:is(#pgWiz,#schWiz,#latePts) .fwarn svg{width:13px;height:13px;flex:none;margin-top:1px;stroke:currentColor;stroke-width:2.2;fill:none;stroke-linecap:round}

/* Step-level notice: states a consequence of a choice made on ANOTHER step, so it must read
   as information rather than as a field error. Amber like .fwarn, never the validation red -
   nothing here blocks Continue, and the user may genuinely want a program with no schedule. */
:is(#pgWiz,#schWiz,#latePts) .step-note{display:flex;align-items:flex-start;gap:10px;margin:0 0 18px;padding:12px 14px;
  border-radius:var(--r-md);background:#fdf5e6;border:1px solid #e8d5ab;color:#6b4a12;
  font-size:13px;line-height:1.45}
:is(#pgWiz,#schWiz,#latePts) .step-note b{display:block;color:#5a3d0e;margin-bottom:2px}
:is(#pgWiz,#schWiz,#latePts) .step-note svg{width:16px;height:16px;flex:none;margin-top:1px;stroke:currentColor;stroke-width:2.2;fill:none;stroke-linecap:round}

/* Default Points note (POINTS-MATH-05). Occupies the slot the threshold stepper vacates when
   rule 1 is chosen, so the step does not jump in height between the two rules. COOL, not the
   cream of .step-note: that amber means "careful", and choosing the app-wide default is the
   ordinary choice, not a risk. It is stating what the number will be, nothing more.

   Built on the INSET COOL FIELD tokens (--f-rest-*), not on literal colours: they are the
   recessed surface this note is standing in for, and they are the only pair already redefined
   under body.dark, so dark parity comes for free instead of needing a second rule. */
:is(#pgWiz,#schWiz,#latePts) .gc-default-note{padding:11px 13px;border-radius:var(--r-md);
  background:var(--f-rest-bg);border:1px solid var(--f-rest-bd);box-shadow:var(--f-rest-sh)}
:is(#pgWiz,#schWiz,#latePts) .gcd-h{display:block;font-size:12.5px;font-weight:700;color:var(--ink-2);margin-bottom:2px}
:is(#pgWiz,#schWiz,#latePts) .gcd-p{display:block;font-size:12px;font-weight:500;line-height:1.4;color:var(--ink-3)}

/* ---- REQUIRED / VALIDATION - the app's default warning design ------------------
   Ported verbatim from the Enroll Student wizard (#enrollWiz, enroll-wizard.css 161-170),
   which the CEO named as the standard: the field itself goes red (danger border + danger
   wash), its LABEL and asterisk go danger-ink, a red line with a warning glyph appears
   underneath, and the field shakes once so the eye is pulled to it. Same tokens, same
   sizes, same animation curve - this is one design in two places, not a lookalike. */
/* transition:none is LOAD-BEARING, not a tidy-up. :is(#pgWiz,#schWiz,#latePts) .icf transitions background and
   border-color; when Blazor re-renders the field with .err in the same frame, the
   transitioned longhands keep their OLD computed values and the red wash never lands -
   measured: the label and the message went red while the field stayed #DFE4EA, and even an
   inline !important background could not move it until the transition was removed. Same
   family as the flagged dark-mode transitioned-longhand issue. An error should snap into
   view anyway; fading one in is wrong. */
/* AN ERROR OUTRANKS HOVER AND FOCUS. It must hold its red from the moment it appears until
   the user actually fixes the value - pointing at it or typing in it is not a fix.
   Specificity is the whole story: `.field.err .icf` is (1,2,0) but `.icf:hover:not(:focus-within)`
   is (1,3,0) and `.icf:focus-within` is (1,2,0) declared later, so BOTH used to repaint the
   field back to its normal fill the moment the mouse arrived. The error selectors below carry
   the extra pseudo-classes so they win outright. */
:is(#pgWiz,#schWiz,#latePts) .field.err .icf,
:is(#pgWiz,#schWiz,#latePts) .field.err .icf:hover,
:is(#pgWiz,#schWiz,#latePts) .field.err .icf:hover:not(:focus-within),
:is(#pgWiz,#schWiz,#latePts) .field.err .icf:focus-within{border-color:var(--danger);background:var(--danger-bg);transition:none}
:is(#pgWiz,#schWiz,#latePts) .field.err .icf:focus-within{box-shadow:0 0 0 3px rgba(192,71,63,.24)}
:is(#pgWiz,#schWiz,#latePts) .field.err>label,:is(#pgWiz,#schWiz,#latePts) .field.err>label .req{color:var(--danger-ink)}
:is(#pgWiz,#schWiz,#latePts) .field.err .dp .dp-field{border-color:var(--danger) !important;background:var(--danger-bg) !important;box-shadow:none !important}
/* the day picker is a button row, not an .icf - give it the same wash so "at least one day"
   reads as the same kind of error as an empty text box */
:is(#pgWiz,#schWiz,#latePts) .field.err .dow{border-radius:var(--r-md);outline:1px solid var(--danger);outline-offset:4px;background:var(--danger-bg)}
:is(#pgWiz,#schWiz,#latePts) .msg{display:flex;align-items:center;gap:6px;margin:7px 0 0;font-size:12.5px;font-weight:650;line-height:1.35}
:is(#pgWiz,#schWiz,#latePts) .msg.err{color:var(--danger-ink)}
:is(#pgWiz,#schWiz,#latePts) .msg svg{width:14px;height:14px;flex:none;stroke:currentColor;stroke-width:2.2;fill:none;stroke-linecap:round}
:is(#pgWiz,#schWiz,#latePts) .field:not(.err) .msg.err{display:none}
/* NO `both` fill-mode. The shake starts and ends at translateX(0), so retaining its final
   state is visually identical - but a retained `transform` makes .field a STACKING CONTEXT
   for good, and the dropdown inside it (z-index:1000) then ranks only WITHIN that field. The
   next field's .icf, later in tree order, painted straight over the open list: measured with
   Delivery type open, "Cohort" and "Ongoing" were covered and unclickable. Same trap as the
   overflow menu vs .dv-scrim - a z-index only ever competes inside its own context. */
:is(#pgWiz,#schWiz,#latePts) .shake{animation:pgShk .34s cubic-bezier(.36,.07,.19,.97)}
@keyframes pgShk{10%,90%{transform:translateX(-1.5px)}20%,80%{transform:translateX(3px)}30%,50%,70%{transform:translateX(-5px)}40%,60%{transform:translateX(5px)}}

:is(#pgWiz,#schWiz,#latePts) .icf{position:relative;display:flex;align-items:center;gap:11px;min-height:50px;padding:0 15px;background:var(--f-rest-bg);
  border:1px solid var(--f-rest-bd);box-shadow:var(--f-rest-sh);border-radius:var(--r-md);
  transition:background var(--t),border-color var(--t),box-shadow var(--t)}
:is(#pgWiz,#schWiz,#latePts) .icf:hover:not(:focus-within){background:var(--f-hover-bg)}
:is(#pgWiz,#schWiz,#latePts) .icf:focus-within{background:var(--f-focus-bg);border-color:var(--f-focus-bd);box-shadow:var(--f-focus-sh)}
:is(#pgWiz,#schWiz,#latePts) .icf input,:is(#pgWiz,#schWiz,#latePts) .icf select,:is(#pgWiz,#schWiz,#latePts) .icf textarea{flex:1;min-width:0;border:none;background:none;outline:none;font-family:var(--font-sans);font-size:15px;font-weight:500;color:var(--ink-1)}
/* KILL the app-global .mh-app :is(input,textarea,select) look (fill + border + box-shadow +
   green focus ring) that otherwise renders a "field inside the field" ghost and a green
   outline. The visible field is the .icf shell ONLY; the raw control is fully transparent
   in every state. */
:is(#pgWiz,#schWiz,#latePts) .icf :is(input,select,textarea),
:is(#pgWiz,#schWiz,#latePts) .icf :is(input,select,textarea):hover,
:is(#pgWiz,#schWiz,#latePts) .icf :is(input,select,textarea):focus,
:is(#pgWiz,#schWiz,#latePts) .icf :is(input,select,textarea):focus-visible{
  background:transparent !important;border:0 !important;box-shadow:none !important;
  border-radius:0 !important;padding:0 !important;min-height:0 !important;height:auto !important;
  outline:none !important;color:var(--ink-1)}
:is(#pgWiz,#schWiz,#latePts) .icf input::placeholder,:is(#pgWiz,#schWiz,#latePts) .icf textarea::placeholder{color:var(--ink-4);font-weight:400}
:is(#pgWiz,#schWiz,#latePts) .icf select{appearance:none;-webkit-appearance:none;cursor:pointer}
:is(#pgWiz,#schWiz,#latePts) .icf.area{align-items:stretch;padding:13px 15px;min-height:104px}
:is(#pgWiz,#schWiz,#latePts) .icf.area textarea{resize:none;min-height:78px;line-height:1.55}
:is(#pgWiz,#schWiz,#latePts) .ic{width:19px;height:19px;flex:none;display:grid;place-items:center;color:var(--ink-3)}
:is(#pgWiz,#schWiz,#latePts) .ic svg{width:100%;height:100%;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;fill:none}
:is(#pgWiz,#schWiz,#latePts) .chev{transition:transform var(--t)}

/* custom dropdown popup (native <select> mirrored) - matches inset-field kit */
:is(#pgWiz,#schWiz,#latePts) .icf.has-sel{cursor:pointer}
/* THE FIELD WITH THE OPEN LIST MUST OUT-RANK THE FIELDS AFTER IT.
   .selpop carries z-index:1000, but a z-index only competes inside its own stacking context -
   and .field.err is one, because the shake animation keeps a transform on it (it re-triggers
   on Blazor re-renders, so it never settles back to `none`). The popup was therefore trapped
   inside its field and the NEXT field's .icf, later in tree order, painted over it: with
   Delivery type open, "Cohort" and "Ongoing" were covered and unclickable.
   Lifting the whole FIELD is what fixes it, not raising the popup again. */
:is(#pgWiz,#schWiz,#latePts) .field:has(> .icf.open){position:relative;z-index:5}
:is(#pgWiz,#schWiz,#latePts) .sel-face{flex:1;min-width:0;font-family:var(--font-sans);font-size:15px;font-weight:500;color:var(--ink-1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}
:is(#pgWiz,#schWiz,#latePts) .sel-face.ph{color:var(--ink-4);font-weight:400}
:is(#pgWiz,#schWiz,#latePts) .icf.open{background:var(--f-focus-bg);border-color:var(--f-focus-bd);box-shadow:var(--f-focus-sh)}
:is(#pgWiz,#schWiz,#latePts) .icf.open .chev{transform:rotate(180deg)}
:is(#pgWiz,#schWiz,#latePts) .selpop{position:absolute;left:0;right:0;top:calc(100% + 8px);z-index:1000;background:var(--f-focus-bg);border:1px solid var(--f-focus-bd);border-radius:var(--r-md);box-shadow:var(--f-focus-sh),0 22px 48px -18px rgba(28,39,51,.34);padding:7px;display:flex;flex-direction:column;gap:3px;max-height:288px;overflow:auto;animation:selpop .16s var(--ease)}
@keyframes selpop{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
:is(#pgWiz,#schWiz,#latePts) .selpop.up{top:auto;bottom:calc(100% + 8px);animation-name:selpopUp}
@keyframes selpopUp{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
:is(#pgWiz,#schWiz,#latePts) .selpop::-webkit-scrollbar{width:10px}
:is(#pgWiz,#schWiz,#latePts) .selpop::-webkit-scrollbar-thumb{background:rgba(40,60,80,.16);border-radius:99px;border:3px solid var(--f-focus-bg)}
:is(#pgWiz,#schWiz,#latePts) .sel-opt{text-align:left !important;border:none;background:none;font-family:var(--font-sans);font-size:14.5px;font-weight:600;color:var(--ink-1);padding:11px 14px;border-radius:var(--r-sm);cursor:pointer;display:flex !important;align-items:center;justify-content:flex-start !important;gap:10px;width:100%;transition:background var(--t),color var(--t)}
:is(#pgWiz,#schWiz,#latePts) .sel-face{text-align:left}
:is(#pgWiz,#schWiz,#latePts) .sel-opt:hover{background:var(--f-rest-bg)}
:is(#pgWiz,#schWiz,#latePts) .sel-opt.on{background:var(--brand-tint);color:var(--brand-600);font-weight:700}
:is(#pgWiz,#schWiz,#latePts) .sel-opt.on::after{content:"\2713";margin-left:auto;color:var(--brand);font-weight:800}
/* transparent click-away catcher rendered while any dropdown is open */
:is(#pgWiz,#schWiz,#latePts) .sel-scrim{position:fixed;inset:0;z-index:999;background:transparent}

:is(#pgWiz,#schWiz,#latePts) .stepper{width:32px;height:32px;flex:none;border-radius:8px;border:1px solid var(--f-rest-bd);background:rgba(255,255,255,.5);cursor:pointer;display:grid;place-items:center;color:var(--ink-2);font-family:var(--font-sans);font-size:18px;font-weight:500;line-height:1;transition:background var(--t),color var(--t)}
:is(#pgWiz,#schWiz,#latePts) .stepper:hover{background:#fff;color:var(--brand-600)}
:is(#pgWiz,#schWiz,#latePts) .icf .num{text-align:center}

/* toggle switch */
:is(#pgWiz,#schWiz,#latePts) .switch-row{display:flex;align-items:center;justify-content:space-between;gap:16px;cursor:pointer;user-select:none;padding:4px 0}
:is(#pgWiz,#schWiz,#latePts) .switch-row .txt{font-size:14.5px;font-weight:600;color:var(--ink-1)}
:is(#pgWiz,#schWiz,#latePts) .switch-row .txt small{display:block;font-size:12.5px;font-weight:400;color:var(--ink-3);margin-top:2px}
:is(#pgWiz,#schWiz,#latePts) .switch{position:relative;width:48px;height:28px;flex:none;border-radius:999px;background:var(--f-rest-bg);border:1px solid var(--f-rest-bd);box-shadow:var(--f-rest-sh);transition:background var(--t),border-color var(--t)}
:is(#pgWiz,#schWiz,#latePts) .switch input{position:absolute;opacity:0;width:0;height:0}
:is(#pgWiz,#schWiz,#latePts) .switch .knob{position:absolute;top:2px;left:2px;width:22px;height:22px;border-radius:999px;background:#fff;box-shadow:0 2px 5px rgba(40,60,80,.28);transition:transform var(--t)}
:is(#pgWiz,#schWiz,#latePts) .switch input:checked~.knob{transform:translateX(20px)}
:is(#pgWiz,#schWiz,#latePts) .switch:has(input:checked){background:var(--brand);border-color:var(--brand)}

/* day of week */
:is(#pgWiz,#schWiz,#latePts) .dow{display:grid;grid-template-columns:repeat(7,1fr);gap:8px}
:is(#pgWiz,#schWiz,#latePts) .dow button{height:46px;border-radius:12px;border:1px solid var(--f-rest-bd);background:var(--f-rest-bg);box-shadow:var(--f-rest-sh);font-family:var(--font-sans);font-weight:700;font-size:13px;color:var(--ink-3);cursor:pointer;transition:background var(--t),color var(--t),border-color var(--t),box-shadow var(--t)}
:is(#pgWiz,#schWiz,#latePts) .dow button:hover{background:var(--f-hover-bg);color:var(--ink-1)}
:is(#pgWiz,#schWiz,#latePts) .dow button.on{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:0 4px 10px var(--brand-glow)}

/* =========================================================
   BUTTONS
   ========================================================= */
:is(#pgWiz,#schWiz,#latePts) .ui-btn{height:48px;padding:0 22px;border-radius:var(--r-md);font-family:var(--font-sans);font-size:14.5px;font-weight:700;cursor:pointer;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;gap:9px;white-space:nowrap;transition:background var(--t),border-color var(--t),box-shadow var(--t),color var(--t),transform var(--t)}
:is(#pgWiz,#schWiz,#latePts) .ui-btn svg{width:18px;height:18px;stroke:currentColor;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
:is(#pgWiz,#schWiz,#latePts) .ui-btn.primary{background:var(--pg-cta);color:#fff;box-shadow:0 8px 18px -4px var(--pg-cta-glow)}
:is(#pgWiz,#schWiz,#latePts) .ui-btn.primary:hover{background:var(--pg-cta-hover);box-shadow:0 10px 22px -4px var(--pg-cta-glow)}
:is(#pgWiz,#schWiz,#latePts) .ui-btn.primary:active{transform:translateY(1px)}
:is(#pgWiz,#schWiz,#latePts) .ui-btn.secondary{background:var(--f-focus-bg);color:var(--brand-600);border-color:var(--f-focus-bd);box-shadow:0 1px 2px rgba(40,60,80,.06)}
:is(#pgWiz,#schWiz,#latePts) .ui-btn.secondary:hover{background:#EEF2F4}
:is(#pgWiz,#schWiz,#latePts) .ui-btn.is-cancel{background:transparent;color:var(--ink-2);border-color:transparent;box-shadow:none}
:is(#pgWiz,#schWiz,#latePts) .ui-btn.is-cancel:hover{background:rgba(40,60,80,.07);color:var(--ink-1)}
:is(#pgWiz,#schWiz,#latePts) .ui-btn.is-cancel .bk-ic{display:none}
:is(#pgWiz,#schWiz,#latePts) .ui-btn:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}

/* =========================================================
   WZ2 - SIDEBAR RAIL
   ========================================================= */
:is(#pgWiz,#schWiz,#latePts) .wz2{flex-direction:row}
/* Left rail gradient matched to the New Client Wizard's .dzaside (deep teal +
   top-right glow) so both wizards' side panels read as one system. */
:is(#pgWiz,#schWiz,#latePts) .wz2 .rail{width:340px;flex:none;position:relative;overflow:hidden;background:radial-gradient(420px 260px at 110% -6%,rgba(110,156,144,.30),transparent 60%),linear-gradient(165deg,#2E4A43,#213A33 55%,#16261F);border-right:1px solid var(--line);padding:0;display:flex;flex-direction:column;color:#fff}
:is(#pgWiz,#schWiz,#latePts) .rail-head{flex:none;position:relative;padding:26px 26px 22px;display:flex;align-items:center;gap:14px;border-bottom:1px solid rgba(255,255,255,.15)}
:is(#pgWiz,#schWiz,#latePts) .rail-ic{flex:none;width:48px;height:48px;border-radius:14px;background:rgba(255,255,255,.15);color:#fff;display:grid;place-items:center;box-shadow:inset 0 0 0 1px rgba(255,255,255,.14)}
:is(#pgWiz,#schWiz,#latePts) .rail-ic svg{width:26px;height:26px;fill:currentColor}
:is(#pgWiz,#schWiz,#latePts) .rail-title{font-size:23px;font-weight:800;letter-spacing:-.02em;line-height:1.1;text-align:left;text-transform:uppercase}
:is(#pgWiz,#schWiz,#latePts) .rail-scroll{flex:1;min-height:0;overflow:auto;padding:24px 26px 26px;display:flex;flex-direction:column}
:is(#pgWiz,#schWiz,#latePts) .rail-scroll::-webkit-scrollbar{width:10px}
:is(#pgWiz,#schWiz,#latePts) .rail-scroll::-webkit-scrollbar-thumb{background:rgba(255,255,255,.24);border-radius:99px;border:3px solid transparent;background-clip:padding-box}
:is(#pgWiz,#schWiz,#latePts) .sum{display:flex;flex-direction:column}
:is(#pgWiz,#schWiz,#latePts) .sum-name{font-size:22px;font-weight:800;letter-spacing:-.02em;color:#fff;line-height:1.14;margin-top:2px;text-align:center}
:is(#pgWiz,#schWiz,#latePts) .sum-name.empty{color:rgba(255,255,255,.55);font-weight:700}
:is(#pgWiz,#schWiz,#latePts) .sum-type{align-self:center;margin-top:12px;font-size:12px;font-weight:700;letter-spacing:.01em;color:#fff;background:rgba(255,255,255,.17);border-radius:999px;padding:5px 13px}
:is(#pgWiz,#schWiz,#latePts) .sum-list{margin-top:20px;padding-top:6px;border-top:1px solid rgba(255,255,255,.16);display:flex;flex-direction:column}
:is(#pgWiz,#schWiz,#latePts) .sum-row{display:flex;align-items:center;gap:13px;padding:11px 0}
:is(#pgWiz,#schWiz,#latePts) .sum-ic{flex:none;width:34px;height:34px;border-radius:10px;background:rgba(255,255,255,.1);box-shadow:inset 0 0 0 1px rgba(255,255,255,.15);display:grid;place-items:center;color:rgba(255,255,255,.85)}
:is(#pgWiz,#schWiz,#latePts) .sum-ic svg{width:17px;height:17px;stroke:currentColor;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
:is(#pgWiz,#schWiz,#latePts) .sum-rc{min-width:0;display:flex;flex-direction:column;gap:3px}
:is(#pgWiz,#schWiz,#latePts) .sum-k{font-size:10.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,255,255,.6)}
:is(#pgWiz,#schWiz,#latePts) .sum-v{font-size:15px;font-weight:600;color:#fff;line-height:1.35}
:is(#pgWiz,#schWiz,#latePts) .sum-v small{display:block;font-size:13.5px;font-weight:500;color:rgba(255,255,255,.72);margin-top:3px}
:is(#pgWiz,#schWiz,#latePts) .sum-empty{margin-top:20px;font-size:13.5px;color:rgba(255,255,255,.62);line-height:1.55}

/* EXISTING TERMS on the rail (#schWiz only, Aug 3 2026). Adding a term is the one wizard
   where the thing you are adding TO already has history, and choosing dates blind is how you
   end up with two live terms on one program. So the rail lists what is already there.
   Same translucent-lift language as .sum-qr - a tile on a dark rail is a lift of the rail,
   never an opaque light card. A clashing row goes amber, the app's advisory colour, never
   the validation red: an overlap is a warning the user may knowingly accept. */
:is(#pgWiz,#schWiz,#latePts) .sum-terms{margin-top:18px;padding-top:16px;border-top:1px solid rgba(255,255,255,.16)}
:is(#pgWiz,#schWiz,#latePts) .sum-terms-h{font-size:10.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,255,255,.6);margin-bottom:10px}
:is(#pgWiz,#schWiz,#latePts) .sum-terms-empty{font-size:12.5px;color:rgba(255,255,255,.55);line-height:1.5}
:is(#pgWiz,#schWiz,#latePts) .sum-term{display:flex;flex-direction:column;gap:2px;padding:9px 11px;margin-bottom:7px;
  border-radius:var(--r-sm);background:rgba(255,255,255,.09);box-shadow:inset 0 0 0 1px rgba(255,255,255,.13)}
:is(#pgWiz,#schWiz,#latePts) .sum-term .st-n{font-size:13px;font-weight:650;color:#fff}
:is(#pgWiz,#schWiz,#latePts) .sum-term .st-d{font-size:11.5px;color:rgba(255,255,255,.62);font-variant-numeric:tabular-nums}
:is(#pgWiz,#schWiz,#latePts) .sum-term.is-clash{background:rgba(216,155,61,.20);box-shadow:inset 0 0 0 1px rgba(216,155,61,.55)}
:is(#pgWiz,#schWiz,#latePts) .sum-term .st-x{margin-top:3px;font-size:11px;font-weight:700;letter-spacing:.02em;color:#F0C27B}

/* A derived, non-editable field. Reads as a field so the grid rhythm holds, but flat and
   dimmed so it never invites a click that would do nothing. */
:is(#pgWiz,#schWiz,#latePts) .icf.is-locked{background:transparent;box-shadow:inset 0 0 0 1px var(--f-rest-bd);color:var(--ink-2);cursor:default}
/* QR TILE ON THE RAIL - CLIENT DETAIL IS THE STANDARD (CEO, Aug 3 2026).
   This carried --f-rest-bg / --f-rest-bd / --f-rest-sh, the INSET COOL FIELD kit. That kit is
   correct for a field recessed into the light form on the right; here it put a pale cool slab on
   the dark pine rail, which is the white block the CEO flagged. The rail is a dark surface, so a
   tile on it is a translucent lift of the rail itself - never an opaque light card.
   Values are #mhDetail .sum-qr verbatim (detail-view.css) so the two rails cannot drift.
   The white QR FRAME inside stays white: that is scan contrast, not decoration. */
:is(#pgWiz,#schWiz,#latePts) .sum-qr{margin-top:18px;display:flex;align-items:center;gap:14px;padding:13px;border-radius:var(--r-md);
  background:rgba(255,255,255,.11);border:none;box-shadow:inset 0 0 0 1px rgba(255,255,255,.15);
  cursor:pointer;transition:background var(--t)}
:is(#pgWiz,#schWiz,#latePts) .sum-qr:hover{background:rgba(255,255,255,.17)}
:is(#pgWiz,#schWiz,#latePts) .sum-qr .qr-frame{width:78px;height:78px;flex:none;display:block;border-radius:8px;background:#fff;padding:5px;position:relative}
:is(#pgWiz,#schWiz,#latePts) .sum-qr .qr-frame svg{width:100%;height:100%;display:block}
:is(#pgWiz,#schWiz,#latePts) .sum-qr .qr-logo{position:absolute;inset:0;margin:auto;width:20px;height:20px;background:var(--brand-700);border-radius:6px;display:grid;place-items:center;box-shadow:0 0 0 3px #fff}
:is(#pgWiz,#schWiz,#latePts) .sum-qr .qr-logo img{width:13px;height:13px;display:block}
:is(#pgWiz,#schWiz,#latePts) .sum-qr-meta{display:flex;flex-direction:column;gap:4px;min-width:0}
/* Ink follows the tile. These were --ink-4 / --ink-1, which are DARK inks meant for the light
   form; on the translucent rail tile above they would be dark-on-dark. Client Detail values. */
:is(#pgWiz,#schWiz,#latePts) .sum-qr-k{font-size:10.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,255,255,.6)}
:is(#pgWiz,#schWiz,#latePts) .sum-qr-v{font-family:var(--font-mono);font-size:15px;font-weight:600;letter-spacing:.02em;color:#fff;overflow-wrap:anywhere}
/* `pointer`, not the zoom-out glass - no zoom icon anywhere in the app (CEO, Jul 29 2026). */
:is(#pgWiz,#schWiz,#latePts) .qr-zoom{position:absolute;inset:0;z-index:20;display:grid;place-items:center;padding:28px;background:rgba(24,36,30,.55);opacity:0;transition:opacity .2s var(--ease);cursor:pointer}
:is(#pgWiz,#schWiz,#latePts) .qr-zoom.in{opacity:1}
:is(#pgWiz,#schWiz,#latePts) .qr-zoom-card{background:#fff;border-radius:20px;padding:26px;display:flex;flex-direction:column;align-items:center;gap:13px;box-shadow:0 30px 70px -20px rgba(0,0,0,.5);transform:scale(.94);transition:transform .2s var(--ease)}
:is(#pgWiz,#schWiz,#latePts) .qr-zoom.in .qr-zoom-card{transform:none}
:is(#pgWiz,#schWiz,#latePts) .qr-zoom-card .qr-frame{width:min(300px,44vmin);height:min(300px,44vmin);display:block;position:relative;background:#fff;border-radius:10px;padding:10px}
:is(#pgWiz,#schWiz,#latePts) .qr-zoom-card .qr-frame svg{width:100%;height:100%;display:block}
:is(#pgWiz,#schWiz,#latePts) .qr-zoom-card .qr-logo{position:absolute;inset:0;margin:auto;width:46px;height:46px;background:var(--brand-700);border-radius:11px;display:grid;place-items:center;box-shadow:0 0 0 6px #fff}
:is(#pgWiz,#schWiz,#latePts) .qr-zoom-card .qr-logo img{width:30px;height:30px;display:block}
:is(#pgWiz,#schWiz,#latePts) .qr-zoom-code{font-family:var(--font-mono);font-size:20px;font-weight:600;letter-spacing:.04em;color:var(--ink-1)}
:is(#pgWiz,#schWiz,#latePts) .qr-zoom-hint{font-size:12px;color:var(--ink-4)}

:is(#pgWiz,#schWiz,#latePts) .wz2{background:var(--bg-canvas)}
:is(#pgWiz,#schWiz,#latePts) .wz2 .pane{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--bg-canvas)}
:is(#pgWiz,#schWiz,#latePts) .wz2 .m-body::-webkit-scrollbar-thumb{border-color:var(--bg-canvas)}
:is(#pgWiz,#schWiz,#latePts) .pane-top{flex:none;padding:28px 36px 0}
:is(#pgWiz,#schWiz,#latePts) .pane-top-row{display:flex;align-items:center;gap:16px}
:is(#pgWiz,#schWiz,#latePts) .prog-count{font-size:12.5px;font-weight:700;color:var(--brand-600);letter-spacing:.01em}
:is(#pgWiz,#schWiz,#latePts) .prog-bar{flex:1;min-width:0;height:7px;border-radius:99px;background:var(--f-rest-bg);overflow:hidden}
:is(#pgWiz,#schWiz,#latePts) .prog-bar i{display:block;height:100%;width:25%;border-radius:99px;background:var(--pg-cta);transition:width .35s var(--ease)}
:is(#pgWiz,#schWiz,#latePts) .pane-head{flex:none;padding:22px 36px 20px}
/* Wizard titles are uppercase app-wide - see the note in detail-view.css. This wizard's
   Titles array is already typed in capitals; the transform is what stops that being load
   bearing. Tracking matches #enrollWiz .pane-title, the shipped 27px wizard title. */
:is(#pgWiz,#schWiz,#latePts) .pane-title{font-size:27px;font-weight:800;letter-spacing:-.025em;color:var(--ink-1);margin:0;line-height:1.08;
  text-transform:uppercase}
:is(#pgWiz,#schWiz,#latePts) .pane-sub{font-size:15px;color:var(--ink-3);margin:9px 0 0;font-weight:500;line-height:1.45}
/* DRAFTS (Jul 28 2026) - the resume banner + Discard, same design as the Client intake's
   #clWiz bar, retuned to this wizard's own tokens and 36px pane gutter. Shared by the
   Enroll wizard below via the #enrollWiz rule. */
:is(#pgWiz,#schWiz,#latePts) .wz-draftbar{display:flex;align-items:center;gap:9px;margin:0 36px 4px;padding:9px 14px;border-radius:12px;border:1px solid rgba(78,124,114,.30);background:rgba(78,124,114,.08);font-size:12.5px;color:var(--brand-600)}
:is(#pgWiz,#schWiz,#latePts) .wz-draftbar .ico{flex:none;width:15px;height:15px;color:var(--brand-600);display:inline-flex}
:is(#pgWiz,#schWiz,#latePts) .wz-draftbar .ico svg{width:100%;height:100%}
:is(#pgWiz,#schWiz,#latePts) .wz-drafttx{flex:1;min-width:0;line-height:1.35}
:is(#pgWiz,#schWiz,#latePts) .wz-discard{flex:none;border:0;background:none;padding:4px 6px;font:inherit;font-weight:800;font-size:12px;color:var(--danger);cursor:pointer;border-radius:8px}
:is(#pgWiz,#schWiz,#latePts) .wz-discard:hover{background:rgba(176,70,60,.10);text-decoration:underline}
body.dark :is(#pgWiz,#schWiz,#latePts) .wz-draftbar{border-color:rgba(120,170,158,.30);background:rgba(78,124,114,.16);color:var(--mh-sage-300,#9fc3b8)}
body.dark :is(#pgWiz,#schWiz,#latePts) .wz-draftbar .ico{color:var(--mh-sage-300,#9fc3b8)}
body.dark :is(#pgWiz,#schWiz,#latePts) .wz-discard{color:#e0a892}
body.dark :is(#pgWiz,#schWiz,#latePts) .wz-discard:hover{background:rgba(201,123,90,.16)}

:is(#pgWiz,#schWiz,#latePts) .wz2 .m-body{padding:0 36px 22px}
:is(#pgWiz,#schWiz,#latePts) .wz2 .m-foot{padding:18px 36px;background:var(--bg-canvas);border-top-color:var(--line)}

/* =========================================================
   REVIEW STEP (from mock inline <style>)
   ========================================================= */
:is(#pgWiz,#schWiz,#latePts) .rvw{display:flex;flex-direction:column;gap:15px}
:is(#pgWiz,#schWiz,#latePts) .rvw-hero{display:flex;align-items:center;gap:14px;padding:16px 18px;border-radius:16px;background:linear-gradient(150deg,var(--brand),var(--brand-700));color:#fff}
:is(#pgWiz,#schWiz,#latePts) .rvw-hero .rvw-ic{width:46px;height:46px;flex:none;border-radius:12px;background:rgba(255,255,255,.18);display:grid;place-items:center}
:is(#pgWiz,#schWiz,#latePts) .rvw-hero .rvw-ic svg{width:22px;height:22px;stroke:#fff;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
:is(#pgWiz,#schWiz,#latePts) .rvw-hero b{font-size:18px;font-weight:800;letter-spacing:-.01em;display:block}
:is(#pgWiz,#schWiz,#latePts) .rvw-hero span{font-size:12.5px;color:rgba(255,255,255,.82);display:block;margin-top:2px}
:is(#pgWiz,#schWiz,#latePts) .rvw-g{border:1px solid var(--line);border-radius:14px;overflow:hidden}
:is(#pgWiz,#schWiz,#latePts) .rvw-g .h{font-size:11.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--brand);padding:11px 16px;background:var(--f-rest-bg);border-bottom:1px solid var(--line)}
:is(#pgWiz,#schWiz,#latePts) .rvw-g .r{display:flex;justify-content:space-between;gap:16px;padding:10px 16px;font-size:14px}
:is(#pgWiz,#schWiz,#latePts) .rvw-g .r+.r{border-top:1px solid var(--line)}
:is(#pgWiz,#schWiz,#latePts) .rvw-g .r .k{color:var(--ink-3);font-weight:600}
:is(#pgWiz,#schWiz,#latePts) .rvw-g .r .v{color:var(--ink-1);font-weight:700;text-align:right}

/* =========================================================
   SUCCESS OVERLAY (from mock inline <style>)
   ========================================================= */
:is(#pgWiz,#schWiz,#latePts) .m-ok{position:absolute;inset:0;z-index:6;background:#fff;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:8px;padding:44px;animation:stepIn .32s var(--ease)}
:is(#pgWiz,#schWiz,#latePts) .m-ok h3{font-size:22px;font-weight:800;letter-spacing:-.01em;margin:6px 0 0}
:is(#pgWiz,#schWiz,#latePts) .m-ok p{font-size:14.5px;color:var(--ink-3);margin:0 0 18px;max-width:300px;line-height:1.5}
:is(#pgWiz,#schWiz,#latePts) .m-ok p b{color:var(--ink-1)}
:is(#pgWiz,#schWiz,#latePts) .ok-ic{width:76px;height:76px;border-radius:999px;background:var(--brand);color:#fff;display:grid;place-items:center;box-shadow:0 14px 30px -8px var(--brand-glow)}
:is(#pgWiz,#schWiz,#latePts) .ok-ic svg{width:36px;height:36px;stroke:#fff;stroke-width:2.6;fill:none;stroke-linecap:round;stroke-linejoin:round}

:is(#pgWiz,#schWiz,#latePts) a,:is(#pgWiz,#schWiz,#latePts) a:hover{color:var(--brand-600)}

/* =========================================================
   NATIVE TIME INPUT (mock clock field) + MhDatePicker RESKIN
   The frozen MhDatePicker (.dp-field) is themed to match the mock's
   inset cool field so date pickers stay functional and on-brand.
   ========================================================= */
:is(#pgWiz,#schWiz,#latePts) .icf input[type="time"]{color:var(--ink-1);font-weight:500}
:is(#pgWiz,#schWiz,#latePts) .icf input[type="time"]::-webkit-calendar-picker-indicator{filter:grayscale(1) opacity(.5);cursor:pointer}

:is(#pgWiz,#schWiz,#latePts) .mh-dp{width:100%}
:is(#pgWiz,#schWiz,#latePts) .mh-dp .dp-field{display:flex;align-items:center;width:100%;min-height:50px;height:50px;padding:0 15px !important;gap:11px;background:var(--f-rest-bg) !important;
  border:1px solid var(--f-rest-bd) !important;box-shadow:var(--f-rest-sh) !important;border-radius:var(--r-md) !important;
  transition:background var(--t),border-color var(--t),box-shadow var(--t)}
:is(#pgWiz,#schWiz,#latePts) .mh-dp .dp-field:hover{background:var(--f-hover-bg) !important;border-color:var(--f-rest-bd) !important;box-shadow:var(--f-rest-sh) !important}
:is(#pgWiz,#schWiz,#latePts) .mh-dp.open .dp-field,:is(#pgWiz,#schWiz,#latePts) .mh-dp .dp-field:focus,:is(#pgWiz,#schWiz,#latePts) .mh-dp .dp-field:focus-within{background:var(--f-focus-bg) !important;border-color:var(--f-focus-bd) !important;box-shadow:var(--f-focus-sh) !important}
:is(#pgWiz,#schWiz,#latePts) .mh-dp .dpf-ico{width:19px;height:19px;color:var(--ink-3);flex:none}
:is(#pgWiz,#schWiz,#latePts) .mh-dp .dpf-val{flex:1;min-width:0;text-align:left;font-family:var(--font-sans);font-size:15px;font-weight:500;color:var(--ink-1)}
:is(#pgWiz,#schWiz,#latePts) .mh-dp .dpf-val.empty{color:var(--ink-4);font-weight:400}
:is(#pgWiz,#schWiz,#latePts) .mh-dp .dpf-chev{flex:none;color:var(--ink-3)}

/* =========================================================
   DARK MODE - driven by the app's OWN switch (body.dark), NOT a wizard toggle.
   The dark tokens are scoped to the RIGHT PANE (and the success overlay) only, so
   the LEFT rail keeps its light tokens: the pine gradient, white rail text and the
   light/white QR card are unaffected. Custom properties inherit, so redefining them
   on .pane recolours every field/heading/footer inside it while the sibling .rail
   still reads the light values from :is(#pgWiz,#schWiz,#latePts). The MhDatePicker popover brings its own
   body.dark styling (frozen component); the QR zoom card stays white by design.
   ========================================================= */
body.dark :is(#pgWiz,#schWiz,#latePts) .pane,
body.dark :is(#pgWiz,#schWiz,#latePts) .m-ok{
  --bg-canvas:#1A232B;
  --ink-1:#EAF0F4; --ink-2:#C2CDD5; --ink-3:#8C9AA5; --ink-4:#5E6E7A;
  --brand-600:#8FBBA5;
  --brand-tint:rgba(126,180,150,.18); --brand-tint-2:rgba(126,180,150,.26);
  --f-rest-bg:#121A20; --f-rest-bd:rgba(180,210,235,.10); --f-rest-sh:inset 0 1px 2px rgba(0,0,0,.4);
  --f-hover-bg:#16202A;
  --f-focus-bg:#222E38; --f-focus-bd:rgba(150,190,225,.28); --f-focus-sh:0 12px 30px rgba(0,0,0,.5);
  --line:rgba(180,210,235,.12);
}
body.dark :is(#pgWiz,#schWiz,#latePts) .m-ok{background:var(--bg-canvas)}
body.dark :is(#pgWiz,#schWiz,#latePts) .pane .stepper{background:rgba(255,255,255,.06)}
body.dark :is(#pgWiz,#schWiz,#latePts) .pane .stepper:hover{background:rgba(255,255,255,.12)}

/* THE ALWAYS-VISIBLE EXIT (CEO, Jul 29 2026). The backdrop stopped closing this wizard, so
   there has to be a real button - and it has to be reachable on EVERY step, not only step 1
   where Back doubles as Cancel. Sits at the end of the progress row, on the shared cool
   field shell so it reads as chrome rather than an action. */
:is(#pgWiz,#schWiz,#latePts) .pane-top-row .wz-x{margin-left:auto;flex:none;width:40px;height:40px;border-radius:12px;
  display:grid;place-items:center;cursor:pointer;padding:0;
  background:var(--f-rest-bg);border:1px solid var(--f-rest-bd);box-shadow:var(--f-rest-sh);
  color:var(--ink-3);transition:background .2s,color .2s,border-color .2s}
:is(#pgWiz,#schWiz,#latePts) .pane-top-row .wz-x:hover{background:var(--f-focus-bg);border-color:var(--f-focus-bd);color:var(--ink-1)}
:is(#pgWiz,#schWiz,#latePts) .pane-top-row .wz-x:focus-visible{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-tint)}
:is(#pgWiz,#schWiz,#latePts) .pane-top-row .wz-x svg{width:18px;height:18px;display:block}

/* =============================================================================
   #latePts  -  STAFF MANUAL POINTS AFTER A KIOSK REFUSAL (LATE-CHECKIN-01)
   -----------------------------------------------------------------------------
   Everything above already styles this overlay (shell, modal, .field, .icf,
   .ui-btn). Only what is unique to it lives here.
   ============================================================================= */
#latePts .modal.lp2{width:min(560px,100%);animation:pgRise .42s var(--ease)}
#latePts .lp-body{padding:26px 30px 22px;display:flex;flex-direction:column;gap:20px}
/* Who this is about. The name is the largest thing on the card because staff are
   recording a decision ABOUT A PERSON, and the grid behind them has many rows. */
#latePts .lp-who{display:flex;align-items:center;gap:14px}
#latePts .lp-av{width:46px;height:46px;border-radius:99px;flex:none;display:grid;place-items:center;overflow:hidden;
  color:#fff;background:linear-gradient(140deg,var(--brand),var(--brand-700));font-weight:800;font-size:15px}
#latePts .lp-av img{width:100%;height:100%;object-fit:cover}
#latePts .lp-nm{font-size:19px;font-weight:800;color:var(--ink-1);line-height:1.2}
#latePts .lp-sub{font-size:12.5px;color:var(--ink-3);margin-top:2px}
/* Quick picks. They are an ACCELERATOR, not the whole choice - the field stays
   free to type into, because the CEO's rule is any value from 0 to the full day. */
#latePts .lp-chips{display:flex;gap:8px;flex-wrap:wrap}
#latePts .lp-chip{border:1px solid var(--line);background:#fff;border-radius:99px;padding:6px 14px;
  font:inherit;font-size:12.5px;font-weight:700;color:var(--ink-2);cursor:pointer;transition:background .15s,border-color .15s,color .15s}
#latePts .lp-chip:hover{border-color:var(--brand);color:var(--brand)}
#latePts .lp-chip.on{background:var(--brand);border-color:var(--brand);color:#fff}
#latePts .lp-cap{font-size:12px;color:var(--ink-3)}
/* The children. Shown only when there are any - an empty "no children" block on
   every late check-in would be noise on the common case. */
#latePts .lp-kids{border-top:1px solid var(--line);padding-top:18px;display:flex;flex-direction:column;gap:10px}
#latePts .lp-kids-h{font-size:11.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-3)}
#latePts .lp-kid{display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--line);
  border-radius:12px;cursor:pointer;background:#fff;text-align:left;font:inherit;transition:border-color .15s,background .15s}
#latePts .lp-kid:hover{border-color:var(--brand)}
#latePts .lp-kid.on{border-color:var(--brand);background:var(--brand-tint)}
#latePts .lp-kid-box{width:20px;height:20px;flex:none;border-radius:6px;border:1.5px solid var(--line);
  display:grid;place-items:center;color:#fff;background:#fff}
#latePts .lp-kid.on .lp-kid-box{background:var(--brand);border-color:var(--brand)}
#latePts .lp-kid-box svg{width:13px;height:13px}
#latePts .lp-kid-nm{font-size:14px;font-weight:700;color:var(--ink-1)}
#latePts .lp-kid-sub{font-size:11.5px;color:var(--ink-3);margin-top:1px}
#latePts .lp-foot{display:flex;justify-content:flex-end;gap:10px;padding:16px 30px 24px;border-top:1px solid var(--line)}
/* Header - the wizard's own head bar is built for a 4-step flow, so this small
   single-question card carries a compact version in the same type and colour. */
#latePts .lp-head{padding:24px 30px 0}
#latePts .lp-kicker{font-size:11.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--brand)}
#latePts .lp-title{margin:6px 0 0;font-size:21px;font-weight:800;color:var(--ink-1);letter-spacing:-.01em}
/* The number field is the shared .icf shell; only the input inside it is local. */
#latePts .lp-body .icf input{width:100%;border:0;background:transparent;outline:none;font:inherit;
  font-size:16px;font-weight:700;color:var(--ink-1);padding:0}
